From 43dc86d3ba361cd5e55737022335e1ff04f316c3 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Fri, 17 Feb 2023 14:08:01 +1300 Subject: [PATCH 01/29] API Standardise deprecations --- _config.php | 5 ----- src/Extension/FluentExtension.php | 14 +++++++++----- 2 files changed, 9 insertions(+), 10 deletions(-) delete mode 100644 _config.php diff --git a/_config.php b/_config.php deleted file mode 100644 index e1f5792a..00000000 --- a/_config.php +++ /dev/null @@ -1,5 +0,0 @@ -LocaleInformation($locale)->getLinkingMode(); } @@ -949,11 +949,11 @@ public function BaseURLForLocale($locale) /** * @param string $locale * @return string - * @deprecated Use LocaleInformation instead + * @deprecated 5.0.0 Use LocaleInformation() instead */ public function LocaleLink($locale) { - Deprecation::notice('5.0', 'Use LocaleInformation instead'); + Deprecation::notice('5.0.0', 'Use LocaleInformation() instead'); return $this->LocaleInformation($locale)->getLink(); } @@ -1021,7 +1021,11 @@ protected function requireSavedInLocale() } if ($this->owner->config()->get('cms_publish_required') !== null) { - Deprecation::notice('5.0', 'Use cms_localisation_required instead'); + Deprecation::notice( + '5.0.0', + 'The "' . self::class . '.cms_publish_required" configuration option is deprecated. Use "' + . self::class . '.cms_localisation_required instead' + ); return $this->owner->config()->get('cms_publish_required'); } From f07b03663d3acdbfd55bb9f8f2934ab8680757a9 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Wed, 24 May 2023 09:02:59 +1200 Subject: [PATCH 02/29] FIX Don't try to preview unlocalised objects (#781) --- src/Extension/FluentExtension.php | 16 ++++++++++++++++ src/Middleware/InitStateMiddleware.php | 5 ----- tests/php/Middleware/InitStateMiddlewareTest.php | 3 ++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 69b2cc57..91bb9a1e 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -1136,6 +1136,22 @@ public function updateFluentCMSField(FormField $field) $field->setTitle($tooltip); } + /** + * Update preview link to null if the object isn't in the current locale + * and we can't fallback cleanly. + * + * @param ?string $link + */ + public function updatePreviewLink(&$link): void + { + $owner = $this->owner; + $info = $owner->LocaleInformation(FluentState::singleton()->getLocale()); + + if (!$info->getSourceLocale()) { + $link = null; + } + } + /** * Require that this record is saved in the given locale for it to be visible * diff --git a/src/Middleware/InitStateMiddleware.php b/src/Middleware/InitStateMiddleware.php index e30ac8c5..49319396 100644 --- a/src/Middleware/InitStateMiddleware.php +++ b/src/Middleware/InitStateMiddleware.php @@ -70,11 +70,6 @@ public function getIsFrontend(HTTPRequest $request) } } - // If using the CMS preview, do not treat the site as frontend - if ($request->getVar('CMSPreview')) { - return false; - } - return true; } diff --git a/tests/php/Middleware/InitStateMiddlewareTest.php b/tests/php/Middleware/InitStateMiddlewareTest.php index c2decf57..3989c35b 100644 --- a/tests/php/Middleware/InitStateMiddlewareTest.php +++ b/tests/php/Middleware/InitStateMiddlewareTest.php @@ -35,7 +35,8 @@ public function isFrontendProvider() ['/', [], true], ['foo', [], true], ['my-blog/my-post', [], true], - ['my-blog/my-post', ['CMSPreview' => 1], false], + // CMS preview is front-end, and if there's no localised copy the PreviewLink will be null + ['my-blog/my-post', ['CMSPreview' => 1], true], ]; } } From 034dd15197ada07594436d4d337246eeda734a36 Mon Sep 17 00:00:00 2001 From: mikey-harveycameron <117692712+mikey-harveycameron@users.noreply.github.com> Date: Wed, 31 May 2023 13:50:29 +1000 Subject: [PATCH 03/29] Update FluentExtension.php skip empty 'where' clauses --- src/Extension/FluentExtension.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 69b2cc57..ae2e3a15 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -583,6 +583,10 @@ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) // Apply substitutions $localisedPredicate = str_replace($conditionSearch, $conditionReplace, $predicate); + if (empty($localisedPredicate)) { + continue; + } + $where[$index] = [ $localisedPredicate => $parameters ]; From 336dca26d2cf0bb040cc028b005ba0c369fc21ce Mon Sep 17 00:00:00 2001 From: Remy Vaartjes Date: Fri, 16 Jun 2023 15:01:04 +0200 Subject: [PATCH 04/29] Implement onAfterDuplicate Also copy translations on duplicate --- src/Extension/FluentExtension.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 45793451..d1ec6853 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -629,6 +629,32 @@ public function onAfterWrite(): void { $this->handleClassChanged(); } + + /** + * If an object is duplicated also duplicate existing localised values from original to new object. + */ + public function onAfterDuplicate($original, $doWrite, $relations): void + { + $localisedTables = $this->owner->getLocalisedTables(); + foreach ($localisedTables as $tableName => $fields) { + // Target IDs + $fromID = $original->ID; + $toID = $this->owner->ID; + + // Get localised table + $localisedTable = $this->getLocalisedTable($tableName); + + // Remove existing translations from duplicated object + DB::prepared_query("DELETE FROM \"$localisedTable\" WHERE \"RecordID\" = ?", [$toID]); + + // Copy translations to duplicated object + $fields_str = '"' . implode('","', $fields) . '"'; + DB::prepared_query("INSERT INTO \"$localisedTable\" ( \"RecordID\", \"Locale\", $fields_str) + SELECT ? AS \"RecordID\", \"Locale\", $fields_str + FROM \"$localisedTable\" + WHERE \"RecordID\" = ?", [$toID, $fromID]); + } + } /** * If an object is changed to another class, we should trigger localised copy From 43b4214b1c1b16faf4c5d1a89155af27649654e3 Mon Sep 17 00:00:00 2001 From: Remy Vaartjes Date: Fri, 16 Jun 2023 15:22:13 +0200 Subject: [PATCH 05/29] Add onAfterDuplicate to FluentVersionedExtension --- src/Extension/FluentVersionedExtension.php | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/Extension/FluentVersionedExtension.php b/src/Extension/FluentVersionedExtension.php index c5c1789a..4d766384 100644 --- a/src/Extension/FluentVersionedExtension.php +++ b/src/Extension/FluentVersionedExtension.php @@ -1012,4 +1012,51 @@ protected function setVersionCacheItem(string $class, string $stage, string $loc // Internally store nulls as 0 $this->versionsCache[$class][$stage][$locale][$key] = $value ?: 0; } + + /** + * If an object is duplicated also duplicate existing localised values from original to new object. + */ + public function onAfterDuplicate($original, $doWrite, $relations): void + { + parent::onAfterDuplicate($original, $doWrite, $relations); + + $localisedTables = $this->owner->getLocalisedTables(); + foreach ($localisedTables as $tableName => $fields) { + // Target IDs + $fromID = $original->ID; + $toID = $this->owner->ID; + + // Get localised table + $localisedTable = $this->getLocalisedTable($tableName) . self::SUFFIX_VERSIONS; + + // Remove existing translation versions from duplicated object + DB::prepared_query("DELETE FROM \"$localisedTable\" WHERE \"RecordID\" = ?", [$toID]); + + // Copy translations to duplicated object + $localisedFields = array_merge(['Locale', 'Version'], $fields); + $fields_str = '"' . implode('","', $localisedFields) . '"'; + + // Copy all versions of localised object + DB::prepared_query("INSERT INTO \"$localisedTable\" ( \"RecordID\", $fields_str) + SELECT ? AS \"RecordID\", $fields_str + FROM \"$localisedTable\" + WHERE \"RecordID\" = ?", [$toID, $fromID]); + + // Also copy versions of base record + $versionsTableName = $tableName . self::SUFFIX_VERSIONS; + + // Remove existing versions from duplicated object, created by onBeforeWrite + DB::prepared_query("DELETE FROM \"$versionsTableName\" WHERE \"RecordID\" = ?", [$toID]); + + // Copy all versions of base record, todo: optimize to only copy needed versions + $fields = DB::query("SELECT \"COLUMN_NAME\" FROM \"INFORMATION_SCHEMA\".\"COLUMNS\" WHERE \"TABLE_NAME\" = '$versionsTableName' AND \"COLUMN_NAME\" NOT IN('ID','RecordID')"); + $fields_str = '"' . implode('","', $fields->column()) . '"'; + DB::prepared_query("INSERT INTO \"$versionsTableName\" ( \"RecordID\", $fields_str) + SELECT ? AS \"RecordID\", $fields_str + FROM \"$versionsTableName\" + WHERE \"RecordID\" = ?", [$toID, $fromID]); + + } + } + } From 9d04d7a2fbbb087d1f36fe955d15abf062fe9b42 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Fri, 1 Sep 2023 09:38:13 +1200 Subject: [PATCH 06/29] feat: add absolute base url for locale --- src/Model/Locale.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Model/Locale.php b/src/Model/Locale.php index 40b0eff3..72103eec 100644 --- a/src/Model/Locale.php +++ b/src/Model/Locale.php @@ -586,6 +586,16 @@ public function getBaseURL() return $base; } + /** + * Absolute base url + * + * @return false|string + */ + public function getAbsoluteBaseURL() + { + return Director::absoluteURL($this->getBaseURL()); + } + /** * Get other locales that appear alongside this (including self) * From 904e3f450d4b21e5a8b9bf5ce652290556027985 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Fri, 1 Sep 2023 12:06:03 +1200 Subject: [PATCH 07/29] chore: fix linting --- src/Extension/FluentVersionedExtension.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Extension/FluentVersionedExtension.php b/src/Extension/FluentVersionedExtension.php index 4d766384..4eaf1805 100644 --- a/src/Extension/FluentVersionedExtension.php +++ b/src/Extension/FluentVersionedExtension.php @@ -1012,8 +1012,8 @@ protected function setVersionCacheItem(string $class, string $stage, string $loc // Internally store nulls as 0 $this->versionsCache[$class][$stage][$locale][$key] = $value ?: 0; } - - /** + + /** * If an object is duplicated also duplicate existing localised values from original to new object. */ public function onAfterDuplicate($original, $doWrite, $relations): void @@ -1055,8 +1055,6 @@ public function onAfterDuplicate($original, $doWrite, $relations): void SELECT ? AS \"RecordID\", $fields_str FROM \"$versionsTableName\" WHERE \"RecordID\" = ?", [$toID, $fromID]); - } } - } From 9ab08d10516aa0d5350ff9727992ddccd8d90922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cmlindenhofer=E2=80=9D?= Date: Tue, 14 Nov 2023 10:42:21 +0100 Subject: [PATCH 08/29] copy Bugfix from here https://github.com/tractorcow-farm/silverstripe-fluent/pull/793 to Version 6.0 --- src/Extension/FluentExtension.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 69b2cc57..7aa7f354 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -583,6 +583,10 @@ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) // Apply substitutions $localisedPredicate = str_replace($conditionSearch, $conditionReplace, $predicate); + if (empty($localisedPredicate)) { + continue; + } + $where[$index] = [ $localisedPredicate => $parameters ]; From f18bc716ff94f1f7b55eb4bd7b5ac7d9a388fb76 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Wed, 15 Nov 2023 12:13:18 +1300 Subject: [PATCH 09/29] fix: allow plugins --- composer.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f0bd5a00..30aa48ff 100644 --- a/composer.json +++ b/composer.json @@ -64,5 +64,10 @@ "lint-clean": "phpcbf src/ tests/php/" }, "prefer-stable": true, - "minimum-stability": "dev" + "minimum-stability": "dev", + "config": { + "allow-plugins": { + "composer/installers": true + } + } } From 14ecdb1f6b03328f76c7c8adfe2eb6e222725e56 Mon Sep 17 00:00:00 2001 From: David Toews Date: Thu, 8 Feb 2024 09:41:16 -0700 Subject: [PATCH 10/29] FIX allows i18nTextCollector to concatenate keys fixes #823 - The magic constant __TRAIT__ was inserting namespaces into localization keys, containing slashes that could not be parsed by the TextCollector task. These have been replaced w/ the Trait name as a string --- src/Extension/Traits/FluentAdminTrait.php | 36 +++++++++++----------- src/Extension/Traits/FluentBadgeTrait.php | 6 ++-- src/Extension/Traits/FluentObjectTrait.php | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Extension/Traits/FluentAdminTrait.php b/src/Extension/Traits/FluentAdminTrait.php index 269cf5e7..f9d642d1 100644 --- a/src/Extension/Traits/FluentAdminTrait.php +++ b/src/Extension/Traits/FluentAdminTrait.php @@ -107,7 +107,7 @@ protected function updateFluentActions( // Add menu button $moreOptions = Tab::create( 'FluentMenuOptions', - _t(__TRAIT__ . '.Localisation', 'Localisation') + _t('FluentAdminTrait.Localisation', 'Localisation') ); $moreOptions->addExtraClass('popover-actions-simulate'); $rootTabSet->push($moreOptions); @@ -117,7 +117,7 @@ protected function updateFluentActions( FormAction::create( 'clearFluent', _t( - __TRAIT__ . '.Label_clearFluent', + 'FluentAdminTrait.Label_clearFluent', "Clear from all except '{title}'", [ 'title' => $locale->getTitle() @@ -129,7 +129,7 @@ protected function updateFluentActions( FormAction::create( 'copyFluent', _t( - __TRAIT__ . '.Label_copyFluent', + 'FluentAdminTrait.Label_copyFluent', "Copy '{title}' to other locales", [ 'title' => $locale->getTitle() @@ -144,7 +144,7 @@ protected function updateFluentActions( FormAction::create( 'unpublishFluent', _t( - __TRAIT__ . '.Label_unpublishFluent', + 'FluentAdminTrait.Label_unpublishFluent', 'Unpublish (all locales)' ) )->addExtraClass('btn-secondary') @@ -153,7 +153,7 @@ protected function updateFluentActions( FormAction::create( 'archiveFluent', _t( - __TRAIT__ . '.Label_archiveFluent', + 'FluentAdminTrait.Label_archiveFluent', 'Unpublish and Archive (all locales)' ) )->addExtraClass('btn-outline-danger') @@ -162,7 +162,7 @@ protected function updateFluentActions( FormAction::create( 'publishFluent', _t( - __TRAIT__ . '.Label_publishFluent', + 'FluentAdminTrait.Label_publishFluent', 'Save & Publish (all locales)' ) )->addExtraClass('btn-primary') @@ -172,7 +172,7 @@ protected function updateFluentActions( FormAction::create( 'deleteFluent', _t( - __TRAIT__ . '.Label_deleteFluent', + 'FluentAdminTrait.Label_deleteFluent', 'Delete (all locales)' ) )->addExtraClass('btn-outline-danger') @@ -187,7 +187,7 @@ protected function updateFluentActions( FormAction::create( 'hideFluent', _t( - __TRAIT__ . '.Label_hideFluent', + 'FluentAdminTrait.Label_hideFluent', "Hide from '{title}'", [ 'title' => $locale->getTitle() @@ -200,7 +200,7 @@ protected function updateFluentActions( FormAction::create( 'showFluent', _t( - __TRAIT__ . '.Label_showFluent', + 'FluentAdminTrait.Label_showFluent', "Show in '{title}'", [ 'title' => $locale->getTitle() @@ -256,7 +256,7 @@ public function clearFluent($data, $form) }); $message = _t( - __TRAIT__ . '.ClearAllNotice', + 'FluentAdminTrait.ClearAllNotice', "All localisations have been cleared for '{title}'.", ['title' => $record->Title] ); @@ -292,7 +292,7 @@ public function copyFluent($data, $form) if ($locale->ID == $originalLocale->ID) { return; } - + if ($record->hasExtension(Versioned::class)) { $record->writeToStage(Versioned::DRAFT); } else { @@ -302,7 +302,7 @@ public function copyFluent($data, $form) }); $message = _t( - __TRAIT__ . '.CopyNotice', + 'FluentAdminTrait.CopyNotice', "Copied '{title}' to all other locales.", ['title' => $record->Title] ); @@ -336,7 +336,7 @@ public function unpublishFluent($data, $form) }); $message = _t( - __TRAIT__ . '.UnpublishNotice', + 'FluentAdminTrait.UnpublishNotice', "Unpublished '{title}' from all locales.", ['title' => $record->Title] ); @@ -386,7 +386,7 @@ public function archiveFluent($data, $form) $policy->delete($record); $message = _t( - __TRAIT__ . '.ArchiveNotice', + 'FluentAdminTrait.ArchiveNotice', "Archived '{title}' and all of its localisations.", ['title' => $record->Title] ); @@ -434,7 +434,7 @@ public function deleteFluent($data, $form) $policy->delete($record); $message = _t( - __TRAIT__ . '.DeleteNotice', + 'FluentAdminTrait.DeleteNotice', "Deleted '{title}' and all of its localisations.", ['title' => $record->Title] ); @@ -478,7 +478,7 @@ public function publishFluent($data, $form) }); $message = _t( - __TRAIT__ . '.PublishNotice', + 'FluentAdminTrait.PublishNotice', "Published '{title}' across all locales.", ['title' => $record->Title] ); @@ -508,7 +508,7 @@ public function showFluent($data, $form) $record->FilteredLocales()->add($locale); $message = _t( - __TRAIT__ . '.ShowNotice', + 'FluentAdminTrait.ShowNotice', "Record '{title}' is now visible in {locale}", [ 'title' => $record->Title, @@ -541,7 +541,7 @@ public function hideFluent($data, $form) $record->FilteredLocales()->remove($locale); $message = _t( - __TRAIT__ . '.HideNotice', + 'FluentAdminTrait.HideNotice', "Record '{title}' is now hidden in {locale}", [ 'title' => $record->Title, diff --git a/src/Extension/Traits/FluentBadgeTrait.php b/src/Extension/Traits/FluentBadgeTrait.php index 8666725b..0845f0ab 100644 --- a/src/Extension/Traits/FluentBadgeTrait.php +++ b/src/Extension/Traits/FluentBadgeTrait.php @@ -76,7 +76,7 @@ protected function generateBadgeHTML( // If the object has been localised in the current locale, show a "localised" state $badgeClasses[] = 'fluent-badge--default'; $tooltip = _t( - __TRAIT__ . '.BadgeLocalised', + 'FluentBadgeTrait.BadgeLocalised', 'Localised in {locale}', [ 'locale' => $locale->getTitle() @@ -86,7 +86,7 @@ protected function generateBadgeHTML( // If object is inheriting content from another locale show the source $badgeClasses[] = 'fluent-badge--localised'; $tooltip = _t( - __TRAIT__ . '.BadgeInherited', + 'FluentBadgeTrait.BadgeInherited', 'Inherited from {locale}', [ 'locale' => $info->getSourceLocale()->getTitle() @@ -97,7 +97,7 @@ protected function generateBadgeHTML( // by either localising or seting up a locale fallback $badgeClasses[] = 'fluent-badge--invisible'; $tooltip = _t( - __TRAIT__ . '.BaggeInvisible', + 'FluentBadgeTrait.BaggeInvisible', '{type} has no available content in {locale}, localise the {type} or provide a locale fallback', [ 'type' => $record->i18n_singular_name(), diff --git a/src/Extension/Traits/FluentObjectTrait.php b/src/Extension/Traits/FluentObjectTrait.php index 3ba8139d..248afa03 100644 --- a/src/Extension/Traits/FluentObjectTrait.php +++ b/src/Extension/Traits/FluentObjectTrait.php @@ -128,7 +128,7 @@ protected function updateFluentCMSFields(FieldList $fields) $fields ->fieldByName('Root.Locales') - ->setTitle(_t(__TRAIT__ . '.TAB_LOCALISATION', 'Localisation')); + ->setTitle(_t('FluentObjectTrait.TAB_LOCALISATION', 'Localisation')); } else { $fields->push($gridField); } From 2a8e81ef37f33d3e04c5fa35ac0020ecdfbb6a62 Mon Sep 17 00:00:00 2001 From: David Toews Date: Thu, 8 Feb 2024 17:09:57 -0700 Subject: [PATCH 11/29] Adds full namespace to string literal --- src/Extension/Traits/FluentAdminTrait.php | 34 +++++++++++----------- src/Extension/Traits/FluentBadgeTrait.php | 6 ++-- src/Extension/Traits/FluentObjectTrait.php | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/Extension/Traits/FluentAdminTrait.php b/src/Extension/Traits/FluentAdminTrait.php index f9d642d1..63da66a3 100644 --- a/src/Extension/Traits/FluentAdminTrait.php +++ b/src/Extension/Traits/FluentAdminTrait.php @@ -107,7 +107,7 @@ protected function updateFluentActions( // Add menu button $moreOptions = Tab::create( 'FluentMenuOptions', - _t('FluentAdminTrait.Localisation', 'Localisation') + _t('TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Localisation', 'Localisation') ); $moreOptions->addExtraClass('popover-actions-simulate'); $rootTabSet->push($moreOptions); @@ -117,7 +117,7 @@ protected function updateFluentActions( FormAction::create( 'clearFluent', _t( - 'FluentAdminTrait.Label_clearFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_clearFluent', "Clear from all except '{title}'", [ 'title' => $locale->getTitle() @@ -129,7 +129,7 @@ protected function updateFluentActions( FormAction::create( 'copyFluent', _t( - 'FluentAdminTrait.Label_copyFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_copyFluent', "Copy '{title}' to other locales", [ 'title' => $locale->getTitle() @@ -144,7 +144,7 @@ protected function updateFluentActions( FormAction::create( 'unpublishFluent', _t( - 'FluentAdminTrait.Label_unpublishFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_unpublishFluent', 'Unpublish (all locales)' ) )->addExtraClass('btn-secondary') @@ -153,7 +153,7 @@ protected function updateFluentActions( FormAction::create( 'archiveFluent', _t( - 'FluentAdminTrait.Label_archiveFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_archiveFluent', 'Unpublish and Archive (all locales)' ) )->addExtraClass('btn-outline-danger') @@ -162,7 +162,7 @@ protected function updateFluentActions( FormAction::create( 'publishFluent', _t( - 'FluentAdminTrait.Label_publishFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_publishFluent', 'Save & Publish (all locales)' ) )->addExtraClass('btn-primary') @@ -172,7 +172,7 @@ protected function updateFluentActions( FormAction::create( 'deleteFluent', _t( - 'FluentAdminTrait.Label_deleteFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_deleteFluent', 'Delete (all locales)' ) )->addExtraClass('btn-outline-danger') @@ -187,7 +187,7 @@ protected function updateFluentActions( FormAction::create( 'hideFluent', _t( - 'FluentAdminTrait.Label_hideFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_hideFluent', "Hide from '{title}'", [ 'title' => $locale->getTitle() @@ -200,7 +200,7 @@ protected function updateFluentActions( FormAction::create( 'showFluent', _t( - 'FluentAdminTrait.Label_showFluent', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.Label_showFluent', "Show in '{title}'", [ 'title' => $locale->getTitle() @@ -256,7 +256,7 @@ public function clearFluent($data, $form) }); $message = _t( - 'FluentAdminTrait.ClearAllNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.ClearAllNotice', "All localisations have been cleared for '{title}'.", ['title' => $record->Title] ); @@ -302,7 +302,7 @@ public function copyFluent($data, $form) }); $message = _t( - 'FluentAdminTrait.CopyNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.CopyNotice', "Copied '{title}' to all other locales.", ['title' => $record->Title] ); @@ -336,7 +336,7 @@ public function unpublishFluent($data, $form) }); $message = _t( - 'FluentAdminTrait.UnpublishNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.UnpublishNotice', "Unpublished '{title}' from all locales.", ['title' => $record->Title] ); @@ -386,7 +386,7 @@ public function archiveFluent($data, $form) $policy->delete($record); $message = _t( - 'FluentAdminTrait.ArchiveNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.ArchiveNotice', "Archived '{title}' and all of its localisations.", ['title' => $record->Title] ); @@ -434,7 +434,7 @@ public function deleteFluent($data, $form) $policy->delete($record); $message = _t( - 'FluentAdminTrait.DeleteNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.DeleteNotice', "Deleted '{title}' and all of its localisations.", ['title' => $record->Title] ); @@ -478,7 +478,7 @@ public function publishFluent($data, $form) }); $message = _t( - 'FluentAdminTrait.PublishNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.PublishNotice', "Published '{title}' across all locales.", ['title' => $record->Title] ); @@ -508,7 +508,7 @@ public function showFluent($data, $form) $record->FilteredLocales()->add($locale); $message = _t( - 'FluentAdminTrait.ShowNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.ShowNotice', "Record '{title}' is now visible in {locale}", [ 'title' => $record->Title, @@ -541,7 +541,7 @@ public function hideFluent($data, $form) $record->FilteredLocales()->remove($locale); $message = _t( - 'FluentAdminTrait.HideNotice', + 'TractorCow\Fluent\Extension\Traits\FluentAdminTrait.HideNotice', "Record '{title}' is now hidden in {locale}", [ 'title' => $record->Title, diff --git a/src/Extension/Traits/FluentBadgeTrait.php b/src/Extension/Traits/FluentBadgeTrait.php index 0845f0ab..c6146d8f 100644 --- a/src/Extension/Traits/FluentBadgeTrait.php +++ b/src/Extension/Traits/FluentBadgeTrait.php @@ -76,7 +76,7 @@ protected function generateBadgeHTML( // If the object has been localised in the current locale, show a "localised" state $badgeClasses[] = 'fluent-badge--default'; $tooltip = _t( - 'FluentBadgeTrait.BadgeLocalised', + 'TractorCow\Fluent\Extension\Traits\FluentBadgeTrait.BadgeLocalised', 'Localised in {locale}', [ 'locale' => $locale->getTitle() @@ -86,7 +86,7 @@ protected function generateBadgeHTML( // If object is inheriting content from another locale show the source $badgeClasses[] = 'fluent-badge--localised'; $tooltip = _t( - 'FluentBadgeTrait.BadgeInherited', + 'TractorCow\Fluent\Extension\Traits\FluentBadgeTrait.BadgeInherited', 'Inherited from {locale}', [ 'locale' => $info->getSourceLocale()->getTitle() @@ -97,7 +97,7 @@ protected function generateBadgeHTML( // by either localising or seting up a locale fallback $badgeClasses[] = 'fluent-badge--invisible'; $tooltip = _t( - 'FluentBadgeTrait.BaggeInvisible', + 'TractorCow\Fluent\Extension\Traits\FluentBadgeTrait.BaggeInvisible', '{type} has no available content in {locale}, localise the {type} or provide a locale fallback', [ 'type' => $record->i18n_singular_name(), diff --git a/src/Extension/Traits/FluentObjectTrait.php b/src/Extension/Traits/FluentObjectTrait.php index 248afa03..aae4cd7a 100644 --- a/src/Extension/Traits/FluentObjectTrait.php +++ b/src/Extension/Traits/FluentObjectTrait.php @@ -128,7 +128,7 @@ protected function updateFluentCMSFields(FieldList $fields) $fields ->fieldByName('Root.Locales') - ->setTitle(_t('FluentObjectTrait.TAB_LOCALISATION', 'Localisation')); + ->setTitle(_t('TractorCow\Fluent\Extension\Traits\FluentObjectTrait.TAB_LOCALISATION', 'Localisation')); } else { $fields->push($gridField); } From f79f0f90174f1b1ae49bd4656dc2accd7a2add62 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Thu, 21 Mar 2024 09:25:03 +1300 Subject: [PATCH 12/29] fix: don't invoke db for ready check outside of dev urls fixes #828 --- src/Model/CachableModel.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Model/CachableModel.php b/src/Model/CachableModel.php index 1c709b9d..b24dc8ae 100644 --- a/src/Model/CachableModel.php +++ b/src/Model/CachableModel.php @@ -2,6 +2,8 @@ namespace TractorCow\Fluent\Model; +use SilverStripe\Control\Director; +use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Injector\Injector; @@ -69,6 +71,13 @@ public static function clearCached() */ protected static function databaseIsReady() { + // Outside of dev/ don't actually do any checks, assume ready + /** @var HTTPRequest $request */ + $request = Injector::inst()->get(HTTPRequest::class); + if (stripos($request->getURL(false), 'dev/') !== 0) { + return true; + } + $object = DataObject::singleton(static::class); // if any of the tables aren't created in the database From 05ef5774130a5102d7e2fd089516536745850900 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Thu, 21 Mar 2024 09:32:33 +1300 Subject: [PATCH 13/29] fix: redundant import --- src/Model/CachableModel.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Model/CachableModel.php b/src/Model/CachableModel.php index b24dc8ae..c005deec 100644 --- a/src/Model/CachableModel.php +++ b/src/Model/CachableModel.php @@ -2,7 +2,6 @@ namespace TractorCow\Fluent\Model; -use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Config\Config; From 8985d8c8db9f69ae7d1c9e44bb3e1b122c94f074 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Mon, 25 Mar 2024 11:08:46 +1300 Subject: [PATCH 14/29] fix: check for request prior to access --- src/Model/CachableModel.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Model/CachableModel.php b/src/Model/CachableModel.php index c005deec..394c1637 100644 --- a/src/Model/CachableModel.php +++ b/src/Model/CachableModel.php @@ -71,10 +71,12 @@ public static function clearCached() protected static function databaseIsReady() { // Outside of dev/ don't actually do any checks, assume ready - /** @var HTTPRequest $request */ - $request = Injector::inst()->get(HTTPRequest::class); - if (stripos($request->getURL(false), 'dev/') !== 0) { - return true; + if (Injector::inst()->has(HTTPRequest::class)) { + /** @var HTTPRequest $request */ + $request = Injector::inst()->get(HTTPRequest::class); + if (stripos($request->getURL(false), 'dev/') !== 0) { + return true; + } } $object = DataObject::singleton(static::class); From 9aea31d68c63b7b834afb4140678aec95db1bdfd Mon Sep 17 00:00:00 2001 From: "Nathan J. Brauer" Date: Tue, 26 Mar 2024 21:22:15 -0700 Subject: [PATCH 15/29] NEW Added dev/task to initialise DataObjects for existing datasets New task is based on the original task built for SiteTree but is now extendable for any DataObject enabled with Fluent. To prevent duplicate code, the original task now extends the new task. --- .../InitialDataObjectLocalisationTask.php | 287 ++++++++++++++++++ src/Task/InitialPageLocalisationTask.php | 108 ++----- 2 files changed, 308 insertions(+), 87 deletions(-) create mode 100644 src/Task/InitialDataObjectLocalisationTask.php diff --git a/src/Task/InitialDataObjectLocalisationTask.php b/src/Task/InitialDataObjectLocalisationTask.php new file mode 100644 index 00000000..a8897e73 --- /dev/null +++ b/src/Task/InitialDataObjectLocalisationTask.php @@ -0,0 +1,287 @@ +exclude_classes`. + * @var string[] + */ + protected $include_only_classes = []; + + /** + * When extending this class, you may choose to exclude these specific classes. + * This is IGNORED if `$this->include_only_classes` is not empty. + * @var string[] + */ + protected $exclude_classes = [ + SiteTree::class + ]; + + /** + * @param HTTPRequest $request + * @return void + * @throws \ReflectionException + * @throws \SilverStripe\ORM\ValidationException + */ + public function run($request) + { + if (!Director::is_cli()) { + echo '
' . PHP_EOL;
+        }
+
+        $publish = (bool)$request->getVar('publish');
+        $limit = (int)$request->getVar('limit');
+
+        $total_results = [
+            'localisable' => 0,
+            'localised' => 0,
+            'publishable' => 0,
+            'published' => 0,
+        ];
+
+        /** @var Locale $globalLocale */
+        $globalLocale = Locale::get()
+            ->filter(['IsGlobalDefault' => 1])
+            ->sort('ID', 'ASC')
+            ->first();
+
+        if (!$globalLocale) {
+            echo 'Please set global locale first!' . PHP_EOL;
+
+            return;
+        }
+
+        if ($this->include_only_classes && is_array($this->include_only_classes)) {
+            $classesWithFluent = $this->include_only_classes;
+            foreach ($this->include_only_classes as $key => $dataClass) {
+                if (!$this->isClassNamePermitted($dataClass)) {
+                    echo sprintf('ERROR: `%s` does not have FluentExtension installed. Continuing without it...', $dataClass) . PHP_EOL;
+                    unset($classesWithFluent[$key]);
+                }
+            }
+        } else {
+            $dataClasses = static::getDirectSubclassesRecursivelyFor(DataObject::class);
+            $classesWithFluent = $this->filterPermittedClassesRecursively($dataClasses);
+        }
+
+        foreach ($classesWithFluent as $classWithFluent) {
+            if (!$this->isClassNamePermitted($classWithFluent)) {
+                continue;
+            }
+
+            $results = $this->doLocaliseClass($classWithFluent, $globalLocale, $limit, $publish);
+            foreach ($results as $key => $value) {
+                $total_results[$key] += $value;
+            }
+
+            echo sprintf('Processing %s objects...', $classWithFluent) . PHP_EOL;
+            echo sprintf('└─ Localised %d of %d objects.', $results['localised'], $results['localisable']) . PHP_EOL;
+            if ($results['publishable']) {
+                echo sprintf('└─ Published %d of %d objects.', $results['published'], $results['publishable']) . PHP_EOL;
+            }
+        }
+
+        echo PHP_EOL;
+        echo sprintf('Completed %d classes.', count($classesWithFluent)) . PHP_EOL;
+        echo sprintf('└─ Localised %d of %d objects in total.', $total_results['localised'], $total_results['localisable']) . PHP_EOL;
+        echo PHP_EOL;
+
+        if ($total_results['publishable']) {
+            echo sprintf('└─ Published %d of %d objects in total.', $total_results['published'], $total_results['publishable']) . PHP_EOL;
+            echo PHP_EOL;
+        }
+
+        if (!Director::is_cli()) {
+            echo '
'; + } + } + + /** + * @param $className + * @param $globalLocale + * @param $limit + * @param $publish + * @return array{localisable: int, localised: int, publishable: int, published: int} + * @throws \SilverStripe\ORM\ValidationException + */ + protected function doLocaliseClass($className, $globalLocale, $limit, $publish): array + { + $dataObjectIDs = FluentState::singleton()->withState(static function (FluentState $state) use ($className, $limit): array { + $state->setLocale(null); + $dataObjects = $className::get()->sort('ID', 'ASC'); + + if ($limit > 0) { + $dataObjects = $dataObjects->limit($limit); + } + + return $dataObjects->column('ID'); + }); + + return FluentState::singleton()->withState( + static function (FluentState $state) use ($className, $globalLocale, $publish, $dataObjectIDs): array { + $state->setLocale($globalLocale->Locale); + $return = [ + 'localisable' => 0, + 'localised' => 0, + 'publishable' => 0, + 'published' => 0, + ]; + + foreach ($dataObjectIDs as $dataObjectID) { + /** @var DataObject|FluentExtension $dataObject */ + $dataObject = $className::get()->byID($dataObjectID); + $return['localisable'] += 1; + + if (!$dataObject->hasExtension(FluentVersionedExtension::class)) { + if ($dataObject->existsInLocale()) { + continue; + } + $dataObject->write(); + $return['localised'] += 1; + continue; + } + + // We have versioned data, so start tracking how many have been published + $return['publishable'] += 1; + + /** @var DataObject|Versioned|FluentVersionedExtension $dataObject */ + if ($dataObject->isDraftedInLocale()) { + continue; + } + $dataObject->writeToStage(Versioned::DRAFT); + + $return['localised'] += 1; + + if (!$publish) { + continue; + } + + // Check if the base record was published - if not then we don't need to publish + // as this would leak draft content, we only want to publish pages which were published + // before Fluent module was added + $dataObjectID = $dataObject->ID; + $isBaseRecordPublished = FluentState::singleton()->withState( + static function (FluentState $state) use ($className, $dataObjectID): bool { + $state->setLocale(null); + $page = $className::get_by_id($dataObjectID); + + if ($page === null) { + return false; + } + + return $page->isPublished(); + } + ); + + if (!$isBaseRecordPublished) { + continue; + } + + $dataObject->publishRecursive(); + $return['published'] += 1; + } + + return $return; + } + ); + } + + /** + * @param string $className + * @return array[] + * @throws \ReflectionException + */ + protected static function getDirectSubclassesRecursivelyFor(string $className): array + { + $directSubclasses = []; + foreach (ClassInfo::subclassesFor($className, false) as $subclassName) { + $actualParentClass = get_parent_class($subclassName); + if ($className === $actualParentClass) { + $directSubclasses[$subclassName] = static::getDirectSubclassesRecursivelyFor($subclassName); + } + } + + return $directSubclasses; + } + + /** + * @param array $classes + * @return array + */ + protected function filterPermittedClassesRecursively(array $classes): array + { + $permittedClasses = []; + foreach ($classes as $parentClassName => $subclassNames) { + if ($this->isClassNamePermitted($parentClassName)) { + $permittedClasses[] = $parentClassName; + // We will skip all subclasses since the ORM will automatically + // pull them in when this parent is referenced + continue; + } + + $permittedClasses = array_merge($permittedClasses, $this->filterPermittedClassesRecursively($subclassNames)); + } + + return $permittedClasses; + } + + /** + * @param string $className + * @return bool + */ + protected function isClassNamePermitted(string $className): bool + { + // Do a simple (inexpensive) text comparison against the exclusion list before we create an object + if (!$this->include_only_classes && is_array($this->exclude_classes) && in_array($className, $this->exclude_classes)) { + return false; + } + + /** @var DataObject $dataObject */ + $dataObject = singleton($className); + + // Now we'll do a full comparison against the exclusion list + // This important step will, for example, match (refuse) a BlogPost if Page is listed as excluded + if (is_array($this->exclude_classes)) { + foreach ($this->exclude_classes as $excluded_class) { + if ($dataObject instanceof $excluded_class) { + return false; + } + } + } + + return $dataObject->hasExtension(FluentExtension::class); + } +} diff --git a/src/Task/InitialPageLocalisationTask.php b/src/Task/InitialPageLocalisationTask.php index 07724630..d39bd7bc 100644 --- a/src/Task/InitialPageLocalisationTask.php +++ b/src/Task/InitialPageLocalisationTask.php @@ -3,14 +3,8 @@ namespace TractorCow\Fluent\Task; use SilverStripe\CMS\Model\SiteTree; -use SilverStripe\Control\HTTPRequest; -use SilverStripe\Dev\BuildTask; -use SilverStripe\Versioned\Versioned; -use TractorCow\Fluent\Extension\FluentSiteTreeExtension; -use TractorCow\Fluent\Model\Locale; -use TractorCow\Fluent\State\FluentState; -class InitialPageLocalisationTask extends BuildTask +class InitialPageLocalisationTask extends InitialDataObjectLocalisationTask { /** * @var string @@ -20,94 +14,34 @@ class InitialPageLocalisationTask extends BuildTask /** * @var string */ - protected $title = 'Initial page localisation'; + protected $title = 'Initial SiteTree localisation'; /** * @var string */ - protected $description = 'Intended for projects which already have some pages when Fluent module is added.' . - ' This dev task will localise / publish all pages in the default locale. Locale setup has to be done before running this task.' . - ' Pages which are not published will not be published, only localised. Pages which are already localised will be skipped.'; + protected $description = 'Intended for projects which already have some Pages when Fluent module is added.' . + ' This dev task will localise / publish all Pages in the default locale. Locale setup has to be done before running this task.' . + ' Pass limit=N to limit number of records to localise. Pass publish=1 to force publishing of localised Pages.' . + ' Regardless, Pages which were not already published will not be published, only localised. Pages which were already localised will always be skipped.'; /** - * @param HTTPRequest $request + * @var string[] */ - public function run($request) - { - $publish = (bool) $request->getVar('publish'); - $limit = (int) $request->getVar('limit'); - - /** @var Locale $globalLocale */ - $globalLocale = Locale::get() - ->filter(['IsGlobalDefault' => 1]) - ->sort('ID', 'ASC') - ->first(); - - if (!$globalLocale) { - echo 'Please set global locale first!' . PHP_EOL; - - return; - } - - $pageIds = FluentState::singleton()->withState(static function (FluentState $state) use ($limit): array { - $state->setLocale(null); - $pages = SiteTree::get()->sort('ID', 'ASC'); - - if ($limit > 0) { - $pages = $pages->limit($limit); - } - - return $pages->column('ID'); - }); - - $localised = FluentState::singleton()->withState( - static function (FluentState $state) use ($globalLocale, $pageIds, $publish): int { - $state->setLocale($globalLocale->Locale); - $localised = 0; - - foreach ($pageIds as $pageId) { - /** @var SiteTree|FluentSiteTreeExtension $page */ - $page = SiteTree::get()->byID($pageId); - - if ($page->isDraftedInLocale()) { - continue; - } - - $page->writeToStage(Versioned::DRAFT); - $localised += 1; + protected $include_only_classes = [ + SiteTree::class + ]; - if (!$publish) { - continue; - } - - // Check if the base record was published - if not then we don't need to publish - // as this would leak draft content, we only want to publish pages which were published - // before Fluent module was added - $pageId = $page->ID; - $isBaseRecordPublished = FluentState::singleton()->withState( - static function (FluentState $state) use ($pageId): bool { - $state->setLocale(null); - $page = SiteTree::get_by_id($pageId); - - if ($page === null) { - return false; - } - - return $page->isPublished(); - } - ); - - if (!$isBaseRecordPublished) { - continue; - } - - $page->publishRecursive(); - } - - return $localised; - } - ); + /** + * @var string[] + */ + protected $exclude_classes = []; - echo sprintf('Localised %d pages.', $localised) . PHP_EOL; + /** + * Soft dependency on CMS module + * @return bool + */ + function isEnabled(): bool + { + return class_exists(SiteTree::class) && parent::isEnabled(); } } From 07328cf9f0dde51107916a4b4a3b5b922c4b48c5 Mon Sep 17 00:00:00 2001 From: "Nathan J. Brauer" Date: Tue, 2 Apr 2024 13:21:37 -0700 Subject: [PATCH 16/29] DOC Updated documentation for new DataObject initialisation task --- docs/en/migrating-from-single-language.md | 147 +++++++++++++++++----- 1 file changed, 119 insertions(+), 28 deletions(-) diff --git a/docs/en/migrating-from-single-language.md b/docs/en/migrating-from-single-language.md index 6fce063c..5137e43d 100644 --- a/docs/en/migrating-from-single-language.md +++ b/docs/en/migrating-from-single-language.md @@ -4,12 +4,14 @@ In case you want to add fluent to an existing site to add multi language functio ## Install fluent -use composer to install fluent, see [installation](installation.md) +Use composer to install fluent, see [installation](installation.md) ## Configure fluent -* add locales -You can either do this in the backend, or for the first setup you can utitlise `default_records` to add the locales to the db. +* Add locales + +You can either do this in the backend, or for the first setup you can utitlise `default_records` to add the locales to +the db. A fluent.yml might look like: ``` @@ -33,32 +35,121 @@ TractorCow\Fluent\Model\Locale: When you run `dev/build?flush` again, this adds the records to the database if the locales table is still empty. -## Publish available pages in your default locale +## Populating initial localised content for existing Pages and DataObjects in your default locale -Now your site is broken, cause no pages have been published and added as translated page in your default locale. -You can either publish all pages manually or use [publishall](https://docs.silverstripe.org/en/4/developer_guides/debugging/url_variable_tools/#building-and-publishing-urls) to publish all pages in bulk. -If you run `/admin/pages/publishall` in your browser your site will be fixed again and you can start adding translated content. +Now your site is broken because nothing has been published and added as translated data in your default locale. You can +either manually localise all DataObjects & Pages manually or use one of the automation options below. ### Automated tools for localisation -`InitialPageLocalisation` dev task can be used to either only localise or localise & publish your pages. -This dev task can be run either via CLI or queued as a job if Queued jobs module is installed. - -Localise only example - -``` -dev/tasks/initial-page-localisation-task -``` - -Localise & publish example - -``` -dev/tasks/initial-page-localisation-task publish=1 -``` - -Localisation in batches can be done by using the `limit` option. -Example below will localise & publish five pages on each run. - -``` -dev/tasks/initial-page-localisation-task publish=1&limit=5 -``` +#### From the CMS (SiteTree only) + +Use Silverstripe's +built-in [publishall](https://docs.silverstripe.org/en/4/developer_guides/debugging/url_variable_tools/#building-and-publishing-urls) +tool to publish all Pages in bulk. +Run `/admin/pages/publishall` in your browser and your site will be fixed again and you can start adding translated +content. + +_This method will work with Pages only (not localised DataObjects)._ + +#### Commandline or Queued Jobs (SiteTree and DataObjects) + +The `InitialPageLocalisation` and `InitialDataObjectLocalisationTask` dev tasks may be used to localise and, optionally, +publish your `Versioned` data (including Pages) from the commandline or queued as a job (if the Queued Jobs module is installed). + +`InitialPageLocalisation` - localise all `SiteTree` objects (Pages) + +`InitialDataObjectLocalisationTask` - localise all Fluent-enabled DataObjects (excluding `SiteTree`) + +1. Example: Localise all Pages (default, without publishing) + + ``` + dev/tasks/initial-page-localisation-task + ``` + +2. Example: Localise & publish all Pages + + ``` + dev/tasks/initial-page-localisation-task publish=1 + ``` + +3. Example: Localising Pages in batches can be done by using the `limit` option. + This will localise & publish five pages on each run. + + ``` + dev/tasks/initial-page-localisation-task publish=1&limit=5 + ``` + +4. Example: All the same functionality is available for localising all DataObjects, including `Versioned` and non-Versioned classes + + ``` + dev/tasks/initial-dataobject-localisation-task + ``` + or + + ``` + dev/tasks/initial-dataobject-localisation-task publish=1&limit=5 + ``` + +#### Customize your own initialisation dev task + +Perhaps you want to be more selective in how you initialise your localised content. +The `InitialDataObjectLocalisationTask` class can be easily extended to either list exactly which classes you want to +initially localise, or you can exclude specific classes from initialisation. + +1. **Initialise specific classes:** The following example will create a task which localises **_ONLY_** `BlogPost` +pages, `Testimonial` objects, _and their subclasses (if any)_. + + ```php + class CustomLocalisationTask extends InitialDataObjectLocalisationTask + { + /** + * @var string + */ + private static $segment = 'custom-localisation-initialisation-task'; + + /** + * @var string + */ + protected $title = 'Custom localisation initialisation'; + + /** + * @var string[] + */ + protected array $include_only_classes = [ + \SilverStripe\Blog\Model\BlogPost::class, + \AcmeCo\Model\Testimonial::class + ]; + + } + ``` + +2. **Initialise all DataObjects but exclude some:** The following example will create a task which localises **_ALL_** +DataObjects **_except_** `BlogPost` pages, `Testimonial` objects, _and their subclasses (if any)_. + + ```php + class CustomLocalisationTask extends InitialDataObjectLocalisationTask + { + /** + * @var string + */ + private static $segment = 'custom-localisation-initialisation-task'; + + /** + * @var string + */ + protected $title = 'Custom localisation initialisation'; + + /** + * @var string[] + */ + protected array $exclude_classes = [ + \SilverStripe\Blog\Model\BlogPost::class, + \AcmeCo\Model\Testimonial::class + ]; + + } + ``` + +3. **One or the other:** You may specify `$include_only_classes` OR `$exclude_classes` - not both. +If `$include_only_classes` is not an empty array, `$exclude_classes` will be ignored. From 5d667539b7a85ce38c1712e59fbf2daede6e5029 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Tue, 7 May 2024 13:45:11 +1200 Subject: [PATCH 17/29] TLN Update translations --- lang/da.yml | 19 ++++--- lang/de.yml | 108 ++++++++++++++++++++++++---------------- lang/es.yml | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lang/fi.yml | 6 +-- lang/it.yml | 125 +++++++++++++++++++++++++++++++++------------- lang/nl.yml | 113 ++++++++++++++++++++++++++++++++++++++++++ lang/pl.yml | 119 ++++++++++++++++++++++++++++++++++++++++++++ lang/ru.yml | 33 +++++++++---- lang/sl.yml | 109 +++++++++++++++++++++++++++++++++++----- 9 files changed, 664 insertions(+), 108 deletions(-) create mode 100644 lang/es.yml create mode 100644 lang/nl.yml create mode 100644 lang/pl.yml diff --git a/lang/da.yml b/lang/da.yml index 43a9f7f4..8743b9b2 100644 --- a/lang/da.yml +++ b/lang/da.yml @@ -2,9 +2,7 @@ da: TractorCow\Fluent\Control\LocaleAdmin: MENUTITLE: Sprog TractorCow\Fluent\Extension\FluentBadgeExtension: - BadgeDefault: '' - BadgeInvisible: '' - BadgeLocalised: '' + BadgeDefault: 'Standard sprog' TractorCow\Fluent\Extension\FluentExtension: FLUENT_ICON_TOOLTIP: 'Dette felt kan oversættes' TractorCow\Fluent\Extension\FluentFilteredExtension: @@ -12,12 +10,14 @@ da: LOCALEFILTEREDHELP: 'Denne side er ikke synlig på dette sprog' LOCALEFILTEREDSHORT: Filteret TAB_LOCALES: Sprog + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Sprog TractorCow\Fluent\Extension\FluentSiteTreeExtension: LOCALECOPYANDPUBLISH: 'Kopier & udgiv' LOCALECOPYTODRAFT: 'Kopier til kladde' LOCALESTATUSFLUENTINVISIBLE: 'Denne side er ikke synlig på dette sprog indtil den er tilføjet og udgivet.' - LOCALESTATUSFLUENTDRAFT: '' - LOCALESTATUSFLUENTINHERITED: '' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Sprog TractorCow\Fluent\Model\Domain: DEFAULT: 'Standard sprog' DEFAULT_NONE: (ingen) @@ -29,6 +29,9 @@ da: other: '{count} domæner' SINGULARNAME: Domæne UnsavedNotice: 'Du kan tilføje sprog efter du har gemt domænet.' + db_Domain: Domæne + has_many_Locales: Sprog + has_one_DefaultLocale: 'Standard sprog' TractorCow\Fluent\Model\FallbackLocale: LOCALE: Sprog PLURALNAME: 'Fald-tilbage sprog' @@ -36,18 +39,20 @@ da: one: 'Et fald-tilbage sprog' other: '{count} fald-tilbage sprog' SINGULARNAME: 'Fald-tilbage sprog' + has_one_Locale: Sprog TractorCow\Fluent\Model\Locale: - DEFAULT_NONE: (none) DOMAIN: Domæne FALLBACKS: 'Sprog at falde tilbage til' IS_DEFAULT: 'Dette er det globale standard sprog' IS_DEFAULT_DESCRIPTION: 'Bemærk: Per-domæne specifikke sprog can gives på Sprog fanen, og vil overskrive denne værdi for specifikke domæner.' LOCALE: Sprog LOCALE_TITLE: Titel - LOCALE_URL: 'URL Segment' PLURALNAME: Sprog PLURALS: one: 'Et sprog' other: '{count} sprog' SINGULARNAME: Sprog UnsavedNotice: 'Du kan tilføje fald-tilbage sprog når du har gemt dette sprog.' + db_Locale: Sprog + db_Title: Titel + has_one_Domain: Domæne diff --git a/lang/de.yml b/lang/de.yml index 70001530..477f08ee 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -1,79 +1,101 @@ de: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Archiv + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Veröffentlicht + BUTTONSAVEPUBLISH: Öffentlich TractorCow\Fluent\Control\LocaleAdmin: MENUTITLE: Gebietsschemata TractorCow\Fluent\Extension\FluentBadgeExtension: - BadgeDefault: 'Standardgebietsschema' + BadgeDefault: Standardgebietsschema BadgeInvisible: 'Übersetzt nach {locale}' BadgeLocalised: '{type} ist nicht sichtbar in diesem Gebietsschema' TractorCow\Fluent\Extension\FluentExtension: - FLUENT_ICON_TOOLTIP: 'Übersetzbares Feld' COPY_FROM: 'In {locale} von kopieren:' COPY_TO: 'Von {locale} in kopieren:' + FLUENT_ICON_TOOLTIP: 'Übersetzbares Feld' + LOCALISED: Lokalisiert + NOTLOCALISED: 'Nicht lokalisiert' + UnlocaliseTooltip: '{Name} aus dem aktuellen Gebietsschema entfernen' TractorCow\Fluent\Extension\FluentFilteredExtension: FILTERED_LOCALES: 'Wird in folgenden Gebietsschemata angezeigt' LOCALEFILTEREDHELP: 'Diese Seite ist nicht sichbar in diesem Gebietsschema' TAB_LOCALES: Gebietsschemata + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Standardgebietsschema TractorCow\Fluent\Extension\FluentSiteTreeExtension: LOCALECOPYANDPUBLISH: 'Kopieren & veröffentlichen' LOCALECOPYTODRAFT: 'Als Entwurf kopieren' LOCALESTATUSFLUENTDRAFT: 'Für dieses Gebietsschema wurde ein Entwurf erstellt. Veröffentlichte Inhalte können jedoch weiterhin von einem anderen geerbt werden. Verwenden Sie die bereitgestellte Aktion "Speichern und veröffentlichen", um diesen Inhalt für dieses Gebietsschema zu veröffentlichen.' LOCALESTATUSFLUENTINHERITED: 'Der Inhalt dieser Seite wird möglicherweise von einem anderen Gebietsschema geerbt. Wenn Sie eine unabhängige Kopie dieser Seite erstellen möchten, verwenden Sie bitte eine der bereitgestellten Aktionen "Kopieren".' - LOCALESTATUSFLUENTINVISIBLE: 'This page will not be visible in this locale until it has been published.' + LOCALESTATUSFLUENTUNKNOWN: 'Für diese Seite ist kein Inhalt verfügbar. Bitte lokalisieren Sie diese Seite oder stellen Sie ein Gebietsschema als Ersatz bereit.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Entwurf + LIVENO: Nein + LIVEYES: Ja + MODIFIED: Geändert + NOTLOCALISED: 'Nicht lokalisiert' + PUBLISHED: Veröffentlicht + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: "'{title}' und alle seine Lokalisierungen wurden gelöscht." + ClearAllNotice: 'Alle Übersetzungen sind entfern worden.' + CopyNotice: "'{title}' wurde in alle anderen Gebietsschemas kopiert." + DeleteNotice: '"{title}" und alle seine Lokalisierungen wurden gelöscht.' + HideNotice: "'{title}' wird in {locale} nicht mehr angezeigt." + Label_archiveFluent: 'Veröffentlichungen zurücknehmen und archivieren (alle Sprachen)' + Label_clearFluent: "Alle ausser '{title}' löschen" + Label_copyFluent: "'{title}' in alle anderen Sprachen kopieren" + Label_deleteFluent: 'Löschen (alle Sprachen)' + Label_hideFluent: "In '{title}' verstecken" + Label_publishFluent: 'Speichern & veröffentlichen (alle Sprachen)' + Label_showFluent: "In '{title}' anzeigen" + Label_unpublishFluent: 'Veröffentlichung zurücknehmen (alle Sprachen)' + Localisation: Übersetzungen + PublishNotice: "'{title}' ist in allen Gebietsschemata veröffentlicht worden." + ShowNotice: "'{title}' ist nun in {locale} sichtbar" + UnpublishNotice: "Veröffentlichung '{title}' in allen Gebietsschemas enfernt." + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeDraft: 'Als Entwurf in {locale} gespeichert' + BadgeLocalised: 'Übersetzt nach {locale}' + BadgePublished: 'In {locale} veröffentlicht' + BaggeInvisible: '{type} ist in dieser Sprache nicht sichtbar' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: Übersetzungen + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: 'Sichtbar?' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Gebietsschemata TractorCow\Fluent\Model\Domain: - DEFAULT: 'Standardgebietsschema' - DEFAULT_NONE: '(keine)' - DOMAIN_HOSTNAME: 'Domain Hostname' + DEFAULT: Standardgebietsschema + DEFAULT_NONE: (keine) DOMAIN_LOCALES: Standardgebietsschema - PLURALNAME: Domains PLURALS: - one: 'Domain' + one: Domain other: '{count} Domains' - SINGULARNAME: Domain UnsavedNotice: 'Sie können Gebietsschemas hinzufügen, sobald Sie die Domain gespeichert haben.' + has_many_Locales: Gebietsschemata + has_one_DefaultLocale: Standardgebietsschema TractorCow\Fluent\Model\FallbackLocale: LOCALE: Standardgebietsschema - PLURALNAME: 'Fallback-Gebietsschemata' + PLURALNAME: Fallback-Gebietsschemata PLURALS: - one: 'Fallback-Gebietsschema' + one: Fallback-Gebietsschema other: '{count} Fallback-Gebietsschemata' - SINGULARNAME: 'Fallback-Gebietsschema' + SINGULARNAME: Fallback-Gebietsschema + has_one_Locale: Standardgebietsschema TractorCow\Fluent\Model\Locale: - DEFAULT_NONE: '(keine)' - DOMAIN: Domain - FALLBACKS: 'Fallback-Gebietsschemata' - IS_DEFAULT: 'This is the global default locale' + DEFAULT_NONE: (keine) + EDIT_LOCALE: 'Zugriff "{title}" ({locale})' + FALLBACKS: Fallback-Gebietsschemata IS_DEFAULT_DESCRIPTION: 'Hinweis: Das domänenspezifische Gebietsschema kann auf der Registerkarte "Gebietsschemas" zugewiesen werden und überschreibt diesen Wert für bestimmte Domänen.' LOCALE: Gebietsschema LOCALE_TITLE: Titel - LOCALE_URL: 'URL-Segment' + LOCALE_URL: URL-Segment PLURALNAME: Gebietsschemata PLURALS: - one: 'Gebietsschema' + one: Gebietsschema other: '{count} Gebietsschemata' SINGULARNAME: Gebietsschema UnsavedNotice: 'Sie können Fallbacks hinzufügen, sobald Sie das Gebietsschema gespeichert haben.' - TractorCow\Fluent\Extension\Traits\FluentAdminTrait: - ClearAllNotice: 'Alle Übersetzungen sind entfern worden.' - CopyNotice: "'{title}' wurde in alle anderen Gebietsschemas kopiert." - UnpublishNotice: "Veröffentlichung '{title}' in allen Gebietsschemas enfernt." - ArchiveNotice: "'{title}' und alle seine Lokalisierungen wurden gelöscht." - ShowNotice: "'{title}' ist nun in {locale} sichtbar" - HideNotice: "'{title}' wird in {locale} nicht mehr angezeigt." - PublishNotice: "'{title}' ist in allen Gebietsschemata veröffentlicht worden." - Localisation: 'Übersetzungen' - Label_clearFluent: "Alle ausser '{title}' löschen" - Label_copyFluent: "'{title}' in alle anderen Sprachen kopieren" - Label_unpublishFluent: 'Veröffentlichung zurücknehmen (alle Sprachen)' - Label_archiveFluent: 'Veröffentlichungen zurücknehmen und archivieren (alle Sprachen)' - Label_publishFluent: 'Speichern & veröffentlichen (alle Sprachen)' - Label_deleteFluent: 'Löschen (alle Sprachen)' - Label_hideFluent: "In '{title}' verstecken" - Label_showFluent: "In '{title}' anzeigen" - - TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: - BadgePublished: 'In {locale} veröffentlicht' - BadgeDraft: 'Als Entwurf in {locale} gespeichert' - BaggeInvisible: '{type} ist in dieser Sprache nicht sichtbar' - - TractorCow\Fluent\Extension\Traits\FluentObjectTrait: - TAB_LOCALISATION: 'Übersetzungen' + db_Locale: Standardgebietsschema + db_Title: Titel diff --git a/lang/es.yml b/lang/es.yml new file mode 100644 index 00000000..b365ceaa --- /dev/null +++ b/lang/es.yml @@ -0,0 +1,140 @@ +es: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Archivar + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Publicado + BUTTONSAVEPUBLISH: Publicar + TractorCow\Fluent\Control\LocaleAdmin: + MENUTITLE: 'Configuraciones regionales' + TractorCow\Fluent\Extension\FluentBadgeExtension: + BadgeDefault: 'Configuración regional por defecto' + BadgeInvisible: 'Localizado en {locale}' + BadgeLocalised: '{type} no es visible en esta configuración regional' + TractorCow\Fluent\Extension\FluentExtension: + COPY_FROM: 'Copiar a {locale} desde:' + COPY_TO: 'Copiar desde {locale} a:' + FLUENT_ICON_TOOLTIP: 'Campo traducible' + LOCALISED: Localizado + Localise: Localizar + NOSOURCE: 'Sin fuentes' + NOTLOCALISED: 'No localizado' + Unlocalise: Deslocalizar + UnlocaliseTooltip: 'Remover {name} de la configuración regional actual' + TractorCow\Fluent\Extension\FluentFilteredExtension: + FILTERED_LOCALES: 'Mostrar en las siguientes configuraciones regionales' + LOCALEFILTEREDHELP: 'Esta página no es visible en esta configuración regional' + TAB_LOCALES: 'Configuraciones regionales' + many_many_FilteredLocales: 'Configuraciones regionales filtradas' + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: 'Configuración regional' + TractorCow\Fluent\Extension\FluentSiteTreeExtension: + LOCALECOPYANDPUBLISH: 'Copiar y publicar' + LOCALECOPYTODRAFT: 'Copiar a borrador' + LOCALESTATUSFLUENTDRAFT: 'Un borrador ha sido creado para esta configuración local, sin embargo, el contenido publicado puede seguir siendo heredado de otra configuración regional. Para publicar este contenido para esta configuración regional, usa la acción "Guardar y publicar".' + LOCALESTATUSFLUENTINHERITED: 'El contenido de esta página puede estar heredando desde otra configuración regional. Si desea hacer una copia independiente de esta página, por favor use un de las acciones "Copiar" que se dan.' + LOCALESTATUSFLUENTINVISIBLE: 'Esta página no será visible en esta configuración local hasta que sea publicada.' + LOCALESTATUSFLUENTUNKNOWN: 'No hay contenido disponible para esta página. Por favor localize esta página o provea una configuración regional de respaldo.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Borrador + LIVENO: 'No' + LIVEYES: Sí + MODIFIED: Modificado + NOSOURCE: 'Sin fuentes' + NOTLOCALISED: 'No localizado' + PUBLISHED: Publicado + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: '"{title}" y todas sus configuraciones regionales fueron archivadas.' + ClearAllNotice: "Todas las configuraciones regionales se han limpiado para '{title}'." + CopyNotice: "Copiar '{title}' a todas las demás configuraciones regionales." + DeleteNotice: "'{title}' y todas sus configuraciones regionales se borraron." + HideNotice: "El registro '{title}' ahora está oculto en {locale}" + Label_archiveFluent: 'Despublicar y Archivar (todas las configuraciones regionales)' + Label_clearFluent: "Limpiar de todos exceptos '{title}'" + Label_copyFluent: "Copiar '{title}' a otras configuraciones locales" + Label_deleteFluent: 'Borrar (todas las configuraciones locales)' + Label_hideFluent: "Esconder de '{title}'" + Label_publishFluent: 'Guardar y Publicar (todas las configuraciones locales)' + Label_showFluent: "Mostrar en '{title}'" + Label_unpublishFluent: 'Despublicar (todas las configuraciones locales)' + Localisation: Localización + PublishNotice: "Publicado '{title}' para todas las configuraciones regionales." + ShowNotice: "El registro '{title}' es ahora visible en {locale}" + UnpublishNotice: "Se despublicó '{title}' de todas las configuraciones regionales" + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeInherited: 'Heredado de {locale}' + BadgeLocalised: 'Localizado en {locale}' + BaggeInvisible: '{type} no tiene contenido disponible en {locale}, localizar el {type} o proveer una configuración regional de respaldo' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: Localización + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Borrar registro de todas las configuraciones locales' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'Borrar en esta configuración local' + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: '¿Es visible?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'Publicar en esta configuración regional' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'Guardar en esta configuración regional' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'Despublicar de esta configuración regional' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: 'Configuraciones regionales' + TractorCow\Fluent\Model\Domain: + DEFAULT: 'Configuración regional por defecto' + DEFAULT_NONE: (ninguno) + DOMAIN_HOSTNAME: 'Nombre del host de dominio' + DOMAIN_LOCALES: 'Configuraciones regionales' + PLURALNAME: Dominios + PLURALS: + many: '{count} dominios' + one: 'Un dominio' + other: '{count} dominios' + SINGULARNAME: Dominio + UnsavedNotice: 'Puede agregar configuraciones regionales una vez que guarde el dominio.' + db_Domain: Dominio + has_many_Locales: 'Configuraciones regionales' + has_one_DefaultLocale: 'Configuración regional por defecto' + TractorCow\Fluent\Model\FallbackLocale: + LOCALE: 'Configuración regional' + PLURALNAME: 'Configuraciones regionales de respaldo' + PLURALS: + many: '{} configuraciones regionales de respaldo' + one: 'Una configuración regional de respaldo' + other: '{} configuraciones regionales de respaldo' + SINGULARNAME: 'Configuración regional de respaldo' + db_Sort: Ordenar + has_one_Locale: 'Configuración regional' + has_one_Parent: Padre + TractorCow\Fluent\Model\Locale: + DEFAULT_NONE: (ninguno) + DOMAIN: Dominio + EDIT_LOCALE: 'Acceder "{title}" ({locale})' + FALLBACKS: 'Configuraciones regionales de respaldo' + IS_DEFAULT: 'Esta es la configuración regional por defecto global' + IS_DEFAULT_DESCRIPTION: 'Nota: la configuración regional específica por dominio puede ser asignada en la pestaña Configuraciones regionales y sobreescribirá este valor para dominios específicos.' + LOCALE: 'Configuración regional' + LOCALE_TITLE: Título + LOCALE_URL: 'Segmento de URL' + MULTI_LOCALE: 'Acceso a acciones en múltiples configuraciones regionales (Ejemplo: guardar en todas las configuraciones regionales)' + PERMISSION: Localización + PLURALNAME: 'Configuraciones regionales' + PLURALS: + many: '{count} configuraciones regionales' + one: 'Una configuración regional' + other: '{count} configuraciones regionales' + SINGULARNAME: 'Configuración regional' + TIMEZONE: 'Huso horario' + USE_X_DEFAULT: 'Usar {code} como código de lenguaje SEO (tratar como global)' + USE_X_DEFAULT_DESCRIPTION: 'El uso de este código indica a los motores de búsqueda que esta es una página de destino global sin localizar' + UnsavedNotice: 'Puede agregar respaldos una vez que guarde la configuración regional.' + db_IsGlobalDefault: 'Es por defecto global' + db_Locale: 'Configuración regional' + db_Sort: Ordenar + db_Timezone: 'Huso horario' + db_Title: Título + db_URLSegment: 'Segmento de URL' + db_UseDefaultCode: 'Usar código por defecto' + has_many_FallbackLocales: 'Configuraciones regionales de respaldo' + has_one_Domain: Dominio + many_many_Fallbacks: Respaldos diff --git a/lang/fi.yml b/lang/fi.yml index 2ed9bde4..dcca1498 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -3,10 +3,10 @@ fi: BadgeHiddenHelp: 'Sivu on piilotettu tämän kielen osalta' BadgeHiddenShort: Piilotettu ChangeLocale: 'Vaihda kieltä' + DefaultLocale: 'Tämä on oletuskieli' + DefaultLocaleIs: 'Oletuskieli on' + EditingIn: 'Huomautus! Olet muokkaamassa kielellä' LocaleFilter: Kielisuodatin LocaleFilterDescription: 'Valitse kieli näyttääksesi tämän sivun/tietueen kyseisellä kielellä' LocaleMenuFilterDescription: 'Valitse kielet joilla tämä sivu/tietue näytetään valikoissa' TABLOCALES: Kielet - DefaultLocale: 'Tämä on oletuskieli' - DefaultLocaleIs: 'Oletuskieli on' - EditingIn: 'Huomautus! Olet muokkaamassa kielellä' diff --git a/lang/it.yml b/lang/it.yml index dc5d8766..fc510ae0 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -1,59 +1,116 @@ it: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Archivia + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Pubblicato + BUTTONSAVEPUBLISH: Pubblica TractorCow\Fluent\Control\LocaleAdmin: - MENUTITLE: Lingue + MENUTITLE: Localizzazione TractorCow\Fluent\Extension\FluentBadgeExtension: - BadgeDefault: 'Lingua di default' - BadgeInvisible: 'Localizzato in {locale}' - BadgeLocalised: '{type} non è visibile per questa lingua' + BadgeDefault: 'Lingua predefinita' + BadgeInvisible: 'Tradotto in {locale}' + BadgeLocalised: '{type} non è visibile in questa lingua' TractorCow\Fluent\Extension\FluentExtension: + COPY_FROM: 'Copia in {locale} da:' + COPY_TO: 'Copia da {locale} a:' FLUENT_ICON_TOOLTIP: 'Campo traducibile' + LOCALISED: Tradotto + Localise: Tradurre + NOSOURCE: 'Nessun originale' + NOTLOCALISED: 'Non tradotto' + Unlocalise: 'Elimina traduzione' + UnlocaliseTooltip: 'Togli {name} dalla lingua attiva' TractorCow\Fluent\Extension\FluentFilteredExtension: - FILTERED_LOCALES: 'Mostra nelle seguenti lingue' + FILTERED_LOCALES: 'Mostrare nelle seguenti lingue' LOCALEFILTEREDHELP: 'Questa pagina non è visibile in questa lingua' - TAB_LOCALES: Lingue + TAB_LOCALES: Localizzazione + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Lingua TractorCow\Fluent\Extension\FluentSiteTreeExtension: - LOCALECOPYANDPUBLISH: 'Copia & pubblica' - LOCALECOPYTODRAFT: 'Copia in bozza' - LOCALESTATUSFLUENTDRAFT: 'È stata creata una bozza per questa lingua, tuttavia, il contenuto pubblicato potrebbe ancora essere ereditato da un altro. Per pubblicare questo contenuto per questa lingua, utilizza l''azione fornita "Salva e pubblica".' + LOCALECOPYANDPUBLISH: 'Salva e pubblica' + LOCALECOPYTODRAFT: 'Copia nella bozza' + LOCALESTATUSFLUENTDRAFT: 'Una bozza è stata creata per questa lingua ma il contenuto pubblicato può essere ancora quello di un''altra. Per pubblicare nuovo contenuto in questa lingua usare il pulsante "Salva e pubblica".' LOCALESTATUSFLUENTINHERITED: 'Il contenuto di questa pagina potrebbe essere ereditato da un''altra lingua. Se desideri creare una copia indipendente di questa pagina, utilizza una delle azioni "Copia" fornite.' - LOCALESTATUSFLUENTINVISIBLE: 'Questa pagina non sarà visibile in questa lingua fino a quando non sarà stata pubblicata.' + LOCALESTATUSFLUENTINVISIBLE: 'Questa pagina non sarà visibile in questa lingua fino a quando verrà pubblicata.' + LOCALESTATUSFLUENTUNKNOWN: 'Contenuto non disponibile per questa pagina. Localizzare la pagina o fornire una lingua alternativa.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Bozza + LIVEYES: Sì + MODIFIED: Modificato + NOSOURCE: 'Nessun originale' + NOTLOCALISED: 'Non tradotto' + PUBLISHED: Pubblicato + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: "Archiviato '{title}' e tutte le sue traduzioni." + ClearAllNotice: "Tutte le traduzioni sono state eliminate per '{title}'." + CopyNotice: "'{title}' copiato in tutte le altre lingue." + DeleteNotice: "Eliminato '{title}' e tutte le sue traduzioni." + Localisation: Localizzazione + PublishNotice: "'{title}' pubblicato in tutte le lingue." + UnpublishNotice: "'{title}' nascosto in tutte le lingue." + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeLocalised: 'Tradotto in {locale}' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: Localizzazione + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Elimina i dati da tutte le lingue' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'Elimina da questa lingua' + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: 'Visibile?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'Pubblica in questa lingua' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'Salva in questa lingua' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'Nascondi in questa lingua' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Localizzazione TractorCow\Fluent\Model\Domain: - DEFAULT: 'Lingua di default' - DEFAULT_NONE: (nessuna) - DOMAIN_HOSTNAME: 'Nome host del dominio' + DEFAULT: 'Lingua predefinita' + DEFAULT_NONE: (nessuno) + DOMAIN_HOSTNAME: 'Host del Dominio' DOMAIN_LOCALES: Lingue PLURALNAME: Domini PLURALS: - one: 'Un dominio' - other: '{count} domini' + many: '{count} Domini' + one: 'Un Dominio' + other: '{count} Domini' SINGULARNAME: Dominio UnsavedNotice: 'Puoi aggiungere lingue una volta salvato il dominio.' + db_Domain: Dominio + has_many_Locales: Lingue + has_one_DefaultLocale: 'Lingua predefinita' TractorCow\Fluent\Model\FallbackLocale: - LOCALE: Lingue - PLURALNAME: 'Lingue di riserva' + LOCALE: Lingua + PLURALNAME: 'Lingue Alternative' PLURALS: - one: 'Una lingua di riserva' - other: '{count} lingue di riserva' - SINGULARNAME: 'Lingua di riserva' + many: '{count} Lingue Alternative' + one: 'Una Lingua Alternativa' + other: '{count} Lingue Alternative' + SINGULARNAME: 'Lingua Alternativa' + has_one_Locale: Lingua TractorCow\Fluent\Model\Locale: DEFAULT_NONE: (nessuna) DOMAIN: Dominio - FALLBACKS: 'Lingue di riserva' - IS_DEFAULT: 'Questa è la lingua predefinita globale' - IS_DEFAULT_DESCRIPTION: 'Nota: le impostazioni internazionali specifiche per dominio possono essere assegnate nella tab Lingue e sovrascriveranno questo valore per domini specifici.' + EDIT_LOCALE: 'Accesso a "{title}" ({locale})' + FALLBACKS: 'Lingue Alternative' + IS_DEFAULT: 'Questa è la lingua principale di default' + IS_DEFAULT_DESCRIPTION: 'Attenzione: nella scheda Lingue possono essere impostate lingue diverse per dominio e avranno la precedenza su questo valore nei domini specificati.' LOCALE: Lingua LOCALE_TITLE: Titolo LOCALE_URL: 'Segmento URL' + MULTI_LOCALE: 'Accesso ad azioni multilingua (per esempio Salva in tutte le lingue)' + PERMISSION: Localizzazione PLURALNAME: Lingue PLURALS: - one: 'Una lingua' - other: '{count} lingue' - SINGULARNAME: Lingue - UnsavedNotice: 'Puoi aggiungere lingue di riserva dopo aver salvato la lingua.' - TractorCow\Fluent\Extension\Traits\FluentAdminTrait: - ClearAllNotice: 'Tutte le localizzazioni sono state cancellate per ''{title}''.' - CopyNotice: 'Copiato ''{title}'' nelle altre lingue.' - DeleteNotice: 'Cancellato ''{title}'' e tutte le sue lingue.' - UnpublishNotice: 'Depubblicato ''{title}'' in tutte le lingue.' - ArchiveNotice: 'Archiviato ''{title}'' e tutte le sue lingue.' - PublishNotice: 'Pubblicato ''{title}'' in tutte le lingue.' + many: '{count} Lingue' + one: 'Una Lingua' + other: '{count} Lingue' + SINGULARNAME: Lingua + USE_X_DEFAULT: 'Usare {code} come codice lingua SEO (da considerare globale)' + USE_X_DEFAULT_DESCRIPTION: "L'uso di questo codice suggerisce ai motori di ricerca che questa è una pagina di destinazione globale non localizzata" + UnsavedNotice: 'Puoi aggiungere alternative una volta salvata la lingua.' + db_Locale: Lingua + db_Title: Titolo + has_one_Domain: Dominio diff --git a/lang/nl.yml b/lang/nl.yml new file mode 100644 index 00000000..0acb8e00 --- /dev/null +++ b/lang/nl.yml @@ -0,0 +1,113 @@ +nl: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Archiveer + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Gepubliceerd + BUTTONSAVEPUBLISH: Publiceer + TractorCow\Fluent\Control\LocaleAdmin: + MENUTITLE: Talen + TractorCow\Fluent\Extension\FluentBadgeExtension: + BadgeDefault: 'Standaard taal' + BadgeInvisible: 'Vertaald in {locale}' + BadgeLocalised: '{type} is niet zichtbaar in deze taal' + TractorCow\Fluent\Extension\FluentExtension: + COPY_FROM: 'Kopieer naar {locale} vanuit:' + COPY_TO: 'Kopieer vanuit {locale} naar:' + FLUENT_ICON_TOOLTIP: 'Vertaalbaar veld' + LOCALISED: Vertaald + Localise: Vertaal + NOSOURCE: 'Geen bron' + NOTLOCALISED: 'Niet vertaald' + Unlocalise: Niet-vertaalbaar + UnlocaliseTooltip: 'Verwijder {name} van huidige taal' + TractorCow\Fluent\Extension\FluentFilteredExtension: + FILTERED_LOCALES: 'Toon in de volgende talen' + LOCALEFILTEREDHELP: 'Deze pagina is niet zichtbaar in deze taal' + TAB_LOCALES: Vertalingen + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Talen + TractorCow\Fluent\Extension\FluentSiteTreeExtension: + LOCALECOPYANDPUBLISH: 'Kopieer en publiceer' + LOCALECOPYTODRAFT: 'Kopieer naar concept' + LOCALESTATUSFLUENTDRAFT: 'Er is een concept klaargezet voor deze taal, maar de live inhoud kan nog steeds worden overgenomen van een andere. Gebruik de actie "Opslaan en publiceren" om deze vertaling te publiceren.' + LOCALESTATUSFLUENTINVISIBLE: 'Deze pagina is pas zichtbaar in deze taal, als deze gepubliceerd is.' + LOCALESTATUSFLUENTUNKNOWN: 'Er is geen inhoud beschikbaar voor deze pagina. Vertaal deze pagina of stel een taal in waarop teruggevallen kan worden.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Concept + LIVENO: Nee + LIVEYES: Ja + MODIFIED: Aangepast + NOSOURCE: 'Geen bron' + NOTLOCALISED: 'Niet vertaald' + PUBLISHED: Gepubliceerd + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: "'{title}' is gearchiveerd bij alle talen" + ClearAllNotice: "Alle vertalingen zijn verwijderd voor '{title}'." + CopyNotice: "'{title}' is gekopieerd naar alle talen." + DeleteNotice: "'{title}' is verwijderd van alle talen" + Localisation: Vertalingen + PublishNotice: "'{title}' is gepubliceerd in alle talen." + UnpublishNotice: "'{title}' is ge-depubliceerd bij alle talen." + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeLocalised: 'Vertaald in {locale}' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: Vertalingen + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Verwijder item in alle talen' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'Verwijder in deze taal' + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: 'Zichtbaar?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'Publiceer in deze taal' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'Opslaan in deze taal' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'Publicatie intrekken voor deze taal' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Vertalingen + TractorCow\Fluent\Model\Domain: + DEFAULT: 'Standaard taal' + DEFAULT_NONE: (geen) + DOMAIN_HOSTNAME: Domeinnaam + DOMAIN_LOCALES: Vertalingen + PLURALNAME: Domeinnamen + PLURALS: + one: 'Een domeinnaam' + other: '{count} domeinnamen' + SINGULARNAME: Domeinnaam + UnsavedNotice: 'Na het opslaan van de taal kunnen er domeinnamen toegevoegd worden' + db_Domain: Domeinnaam + has_many_Locales: Talen + has_one_DefaultLocale: 'Standaard taal' + TractorCow\Fluent\Model\FallbackLocale: + LOCALE: Talen + PLURALNAME: Terugval-taal + PLURALS: + one: Terugval-taal + other: '{count} terugval-talen' + SINGULARNAME: Terugval-taal + has_one_Locale: Talen + TractorCow\Fluent\Model\Locale: + DEFAULT_NONE: (geen) + DOMAIN: Domeinnaam + EDIT_LOCALE: 'Toegang "{title}" ({locale})' + FALLBACKS: Terugval-taal + IS_DEFAULT: 'Dit is de standaard taal' + IS_DEFAULT_DESCRIPTION: 'Let op: Per domein kan een taal worden gekozen (op het tabblad Talen) en overschrijft deze waarde voor dat specifieke domein.' + LOCALE: Talen + LOCALE_TITLE: Titel + LOCALE_URL: 'URL segment' + MULTI_LOCALE: 'Toegang tot multi-taal-mogelijkheden (zoals opslaan in alle talen)' + PERMISSION: Vertalingen + PLURALNAME: Talen + PLURALS: + one: Taal + other: '{count} Talen' + SINGULARNAME: Talen + USE_X_DEFAULT: 'Gebruik {code} als SEO taalcode (als site-standaard)' + USE_X_DEFAULT_DESCRIPTION: 'Het gebruik van deze code geeft aan zoekmachines aan dat dit een niet-vertaalde landingspagina is' + UnsavedNotice: 'Een terugval-taal kan ingesteld worden na het opslaan' + db_Locale: Talen + db_Title: Titel + has_one_Domain: Domeinnaam diff --git a/lang/pl.yml b/lang/pl.yml new file mode 100644 index 00000000..65dc3db5 --- /dev/null +++ b/lang/pl.yml @@ -0,0 +1,119 @@ +pl: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Archiwum + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Opublikowano + BUTTONSAVEPUBLISH: Publikuj + TractorCow\Fluent\Control\LocaleAdmin: + MENUTITLE: Języki + TractorCow\Fluent\Extension\FluentBadgeExtension: + BadgeDefault: 'Domyślny język' + BadgeInvisible: 'Przetłumaczono w {locale}' + BadgeLocalised: '{type} nie jest widoczny w tym języku' + TractorCow\Fluent\Extension\FluentExtension: + COPY_FROM: 'Skopiuj do {locale} z:' + COPY_TO: 'Skopiuj z {locale} do:' + FLUENT_ICON_TOOLTIP: 'Pole do przetłumaczenia' + LOCALISED: Przetłumaczone + Localise: Lokalizacja + NOSOURCE: 'Brak źródła' + NOTLOCALISED: 'Brak lokalizacji' + Unlocalise: Niezlokalizuj + UnlocaliseTooltip: 'Usuń {name} z bieżącego języka' + TractorCow\Fluent\Extension\FluentFilteredExtension: + FILTERED_LOCALES: 'Wyświetlaj w następujących lokalizacjach' + LOCALEFILTEREDHELP: 'Ta strona nie jest widoczna w tym języku' + TAB_LOCALES: Lokalizacje + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Język + TractorCow\Fluent\Extension\FluentSiteTreeExtension: + LOCALECOPYANDPUBLISH: 'Kopiuj i publikuj' + LOCALECOPYTODRAFT: Kopiuj + LOCALESTATUSFLUENTDRAFT: 'Utworzono wersję roboczą dla tego języka, jednak opublikowana treść może nadal być dziedziczona z innej. Aby opublikować tę treść dla tej lokalizacji, użyj udostępnionej akcji „Zapisz i opublikuj”.' + LOCALESTATUSFLUENTINVISIBLE: 'Ta strona nie będzie widoczna w tej lokalizacji, dopóki nie zostanie opublikowana.' + LOCALESTATUSFLUENTUNKNOWN: 'Brak treści dla tej strony. Zlokalizuj tę stronę lub podaj zastępczą wersję regionalną.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Szkic + LIVENO: Nie + LIVEYES: Tak + MODIFIED: Zmodyfikowano + NOSOURCE: 'Brak źródła' + NOTLOCALISED: 'Nie określono' + PUBLISHED: Opublikowano + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: 'Zarchiwizowany „{title}” i wszystkie jego lokalizacje.' + ClearAllNotice: 'Wszystkie lokalizacje zostały wyczyszczone dla „{title}”.' + CopyNotice: 'Skopiowano „{title}” do wszystkich innych lokalizacji.' + DeleteNotice: 'Usunięto „{title}” i wszystkie jego lokalizacje.' + Localisation: 'Lokalizacja, język' + PublishNotice: 'Opublikowano „{title}” we wszystkich lokalizacjach.' + UnpublishNotice: 'Nieopublikowany „{title}” we wszystkich językach.' + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeLocalised: 'Przetłumaczono w {locale}' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: 'Lokalizacja, język' + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Usuń wszędzie' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'Usuń ten język' + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: 'Widoczny?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'Opublikuj w tym języku' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'Zapisz w tym języku' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'Cofnij publikację w tym języku' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Języki + TractorCow\Fluent\Model\Domain: + DEFAULT: 'Domyślny język' + DEFAULT_NONE: (brak) + DOMAIN_HOSTNAME: 'Nazwa hosta domeny' + DOMAIN_LOCALES: Języki + PLURALNAME: Domeny + PLURALS: + few: 'Domen {count}' + many: 'Domen {count}' + one: Domena + other: 'Domeny {count}' + SINGULARNAME: Domena + UnsavedNotice: 'Po zapisaniu domeny możesz dodać języki.' + db_Domain: Domena + has_many_Locales: Języki + has_one_DefaultLocale: 'Domyślny język' + TractorCow\Fluent\Model\FallbackLocale: + LOCALE: Język + PLURALNAME: 'Język zastępczy' + PLURALS: + few: 'Języków zastępczych {count}' + many: 'Języków zastępczych {count}' + one: 'Język zastępczy' + other: 'Język zastępczy {count}' + SINGULARNAME: 'Język zastępczy' + has_one_Locale: Język + TractorCow\Fluent\Model\Locale: + DEFAULT_NONE: (brak) + DOMAIN: Domena + EDIT_LOCALE: 'Uzyskaj dostęp do „{title}” ({locale})' + FALLBACKS: 'Języki zastępcze' + IS_DEFAULT: 'To jest globalne domyślne ustawienie regionalne' + IS_DEFAULT_DESCRIPTION: 'Uwaga: ustawienia regionalne dla poszczególnych domen można przypisać na karcie Ustawienia regionalne i zastąpią one tę wartość dla określonych domen.' + LOCALE: Język + LOCALE_TITLE: Tytuł + LOCALE_URL: URL + MULTI_LOCALE: 'Dostęp do działań w wielu lokalizacjach (np. zapisywanie we wszystkich lokalizacjach)' + PERMISSION: 'Lokalizacja, język' + PLURALNAME: Języki + PLURALS: + few: 'Lokalizacje, języki {count}' + many: 'Lokalizacji, języków {count}' + one: 'Lokalizacja, język' + other: 'Lokalizacje, języki {count}' + SINGULARNAME: Język + USE_X_DEFAULT: 'Użyj {code} jako kodu języka SEO (traktuj jako globalny)' + USE_X_DEFAULT_DESCRIPTION: 'Użycie tego kodu wskazuje wyszukiwarkom, że jest to nie-określona globalna strona docelowa' + UnsavedNotice: 'Po zapisaniu domeny możesz dodać języki.' + db_Locale: Język + db_Title: Tytuł + has_one_Domain: Domena diff --git a/lang/ru.yml b/lang/ru.yml index f2a07996..e5e013ac 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -1,6 +1,23 @@ ru: TractorCow\Fluent\Control\LocaleAdmin: MENUTITLE: Языки + TractorCow\Fluent\Extension\FluentBadgeExtension: + BadgeDefault: 'Стандартный язык' + TractorCow\Fluent\Extension\FluentFilteredExtension: + TAB_LOCALES: Языки + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Язык + TractorCow\Fluent\Extension\FluentSiteTreeExtension: + LOCALECOPYANDPUBLISH: 'Скопировать и опубликовать' + LOCALECOPYTODRAFT: 'Скопировать в Черновик' + LOCALEDRAFTEDHELP: 'Черновая редакция перевода не опубликована' + LOCALEDRAFTEDSHORT: 'Язык в черновиках' + LOCALEINHERITEDHELP: 'Данные страницы унаследованы от резевного языка' + LOCALEINHERITEDSHORT: Унаследовано + LOCALESTATUSDRAFT: 'Черновая версия перевода была создана для этого языка, однако, опубликованное содержимое всё ещё на другом языке. Для публикации этого языка воспользуйтесь кнопкой "Сохранить и Опубликовать".' + LOCALESTATUSINHERITED: 'Данные страницы унаследованы от резевного языка. Если вы хотите сделать независимую копию страницы. Пожалуйста воскользуйтесь одной из кнопок "Скопировать".' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Языки TractorCow\Fluent\Model\Domain: DEFAULT: 'Стандартный язык' DEFAULT_NONE: '(не выбран)' @@ -12,6 +29,9 @@ ru: other: '{count} Доменов' SINGULARNAME: Домен UnsavedNotice: 'Вы можете добавить языки для домена как только его сохраните.' + db_Domain: Домен + has_many_Locales: Языки + has_one_DefaultLocale: 'Стандартный язык' TractorCow\Fluent\Model\FallbackLocale: LOCALE: Язык PLURALNAME: 'Резервные Языки' @@ -19,6 +39,7 @@ ru: one: 'Резервный Язык' other: '{count} Резервных Языков' SINGULARNAME: 'Резервный Язык' + has_one_Locale: Язык TractorCow\Fluent\Model\Locale: DEFAULT_NONE: '(не выбран)' DOMAIN: Домен @@ -33,12 +54,6 @@ ru: one: Язык other: '{count} Языков' SINGULARNAME: Язык - TractorCow\Fluent\Extension\FluentSiteTreeExtension: - LOCALECOPYTODRAFT: 'Скопировать в Черновик' - LOCALECOPYANDPUBLISH: 'Скопировать и опубликовать' - LOCALEDRAFTEDSHORT: 'Язык в черновиках' - LOCALEDRAFTEDHELP: 'Черновая редакция перевода не опубликована' - LOCALEINHERITEDSHORT: Унаследовано - LOCALEINHERITEDHELP: 'Данные страницы унаследованы от резевного языка' - LOCALESTATUSINHERITED: 'Данные страницы унаследованы от резевного языка. Если вы хотите сделать независимую копию страницы. Пожалуйста воскользуйтесь одной из кнопок "Скопировать".' - LOCALESTATUSDRAFT: 'Черновая версия перевода была создана для этого языка, однако, опубликованное содержимое всё ещё на другом языке. Для публикации этого языка воспользуйтесь кнопкой "Сохранить и Опубликовать".' + db_Locale: Язык + db_Title: Название + has_one_Domain: Домен diff --git a/lang/sl.yml b/lang/sl.yml index 19a05939..9bbb7c81 100644 --- a/lang/sl.yml +++ b/lang/sl.yml @@ -1,22 +1,85 @@ sl: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Arhiv + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Objavljeno + BUTTONSAVEPUBLISH: Objavi TractorCow\Fluent\Control\LocaleAdmin: MENUTITLE: Lokalizacije TractorCow\Fluent\Extension\FluentBadgeExtension: - BadgeDefault: 'Privzeto' + BadgeDefault: Privzeto BadgeInvisible: 'Lokalizirano v {locale}' BadgeLocalised: 'Tip {type} je skrit za to lokalizacijo' TractorCow\Fluent\Extension\FluentExtension: + COPY_FROM: 'Kopiraj v {locale} iz: ' + COPY_TO: 'Kopiraj iz {locale} v:' FLUENT_ICON_TOOLTIP: 'Lokalizirano polje' + LOCALISED: Lokalizirano + Localise: Lokaliziraj + NOSOURCE: (brez) + NOTLOCALISED: 'Ni lokalizirano' + Unlocalise: 'Odstrani lokalizacijo' + UnlocaliseTooltip: "Odstrani element '{name}' iz trenutne lokalizacije" TractorCow\Fluent\Extension\FluentFilteredExtension: FILTERED_LOCALES: 'Prikaži te lokalizacije' LOCALEFILTEREDHELP: 'Stran za to lokalizacijo ni vidna' TAB_LOCALES: Lokalizacije + many_many_FilteredLocales: 'Pofiltrirane lokalizacije' + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Lokalizacija TractorCow\Fluent\Extension\FluentSiteTreeExtension: LOCALECOPYANDPUBLISH: 'Kopiraj in objavi' LOCALECOPYTODRAFT: 'Kopiraj v osnutek' LOCALESTATUSFLUENTDRAFT: 'Ustvarili smo osnutek strani za izbrano lokalizacijo, a je na strani lahko še vedno objavljena vsebina iz izvorne lokalizacije. Za objavo vsebine iz te lokalizacije kliknite "Kopiraj in objavi".' - LOCALESTATUSFLUENTINHERITED: 'Stran lahko prevzema vsebino iz druge lokalizacije. Če želite ustvariti nepovezano kopijo strani, uporabite eno od akcij kopiranja, ki so na voljo.' + LOCALESTATUSFLUENTINHERITED: 'Lahko, da je stran prevzela vsebino iz druge lokalizacije. Če želite ustvariti nepovezano kopijo strani, uporabite eno od akcij kopiranja, ki so na voljo.' LOCALESTATUSFLUENTINVISIBLE: 'Stran ne bo vidna dokler ne bo objavljena za to lokalizacijo.' + LOCALESTATUSFLUENTUNKNOWN: 'Vsebina za to stran ne obstaja. Lokalizirajte vsebino ali definirajte nadomestno lokalizacijo.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Osnutek + LIVENO: Ne + LIVEYES: Da + MODIFIED: Spremenjeno + NOSOURCE: (brez) + NOTLOCALISED: 'Ni lokalizirano' + PUBLISHED: Objavljeno + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: "Stran '{title}' in njene lokalizacije so arhivirane." + ClearAllNotice: "Vse lokalizacije strani '{title}' so odstranjene." + CopyNotice: "Stran '{title}' je skopirana v vse ostale lokalizacije." + DeleteNotice: "Stran '{title}' je izbrisana in vse lokalizacije odstranjene." + HideNotice: "Zapis '{title}' je sedaj skrit v {locale}" + Label_archiveFluent: 'Umakni iz objave in arhiviraj (vse lokalizacije)' + Label_clearFluent: "Počisti iz vseh, razen iz '{title}'" + Label_copyFluent: "Skopiraj '{title}' v ostale lokalizacije" + Label_deleteFluent: 'Izbriši (vse lokalizacije)' + Label_hideFluent: "Skrij iz '{title}'" + Label_publishFluent: 'Shrani in objavi (vse lokalizacije)' + Label_showFluent: "Prikazano v '{title}'" + Label_unpublishFluent: 'Umakni iz objave (vse lokalizacije)' + Localisation: Lokalizacija + PublishNotice: "Vse lokalizacije strani '{title}' so objavljene." + ShowNotice: "Zapis '{title}' je sedaj viden v {locale}" + UnpublishNotice: "Vse lokalizacije strani '{title}' so umaknjene iz objave." + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeInherited: 'Preneseno iz {locale}' + BadgeLocalised: 'Lokalizirano v {locale}' + BaggeInvisible: '{type} je brez vsebine v {locale}. Lokalizirajte {type} ali zagotovite nadomestno lokalizacijo.' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: Lokalizacija + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Izbriši zapise v vseh lokalizacijah' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'Izbriši to lokalizacijo' + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: 'Vidno?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'Objavi to lokalizacijo' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'Shrani to lokalizacijo' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'Umakni iz objave' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Lokalizacije TractorCow\Fluent\Model\Domain: DEFAULT: 'Privzeta lokalizacija' DEFAULT_NONE: (brez) @@ -24,35 +87,57 @@ sl: DOMAIN_LOCALES: Lokalizacije PLURALNAME: Domene PLURALS: - one: 'Domena' - two: '{count} domeni' few: '{count} domen' + one: Domena other: '{count} domen' + two: '{count} domeni' SINGULARNAME: Domena UnsavedNotice: 'Lokalizacije boste lahko dodajali, ko boste shranili domeno.' + db_Domain: Domena + has_many_Locales: Lokalizacije + has_one_DefaultLocale: 'Privzeta lokalizacija' TractorCow\Fluent\Model\FallbackLocale: LOCALE: Lokalizacija PLURALNAME: 'Nadomestne lokalizacije' PLURALS: - one: 'Nadomestna lokalizacija' - two: '{count} nadomestni lokalizaciji' few: '{count} nadomestnih lokalizacij' + one: 'Nadomestna lokalizacija' other: '{count} nadomestnih lokalizacij' + two: '{count} nadomestni lokalizaciji' SINGULARNAME: 'Nadomestna lokalizacija' + db_Sort: Razvrsti + has_one_Locale: Lokalizacija + has_one_Parent: Nadrejena TractorCow\Fluent\Model\Locale: DEFAULT_NONE: (brez) DOMAIN: Domena + EDIT_LOCALE: 'Dostop do "{title}" ({locale})' FALLBACKS: 'Nadomestne lokalizacije' - IS_DEFAULT: 'Splošno privzeta lokalizacija' - IS_DEFAULT_DESCRIPTION: 'Opomba: Lokalizacije, vezane na posamezno domeno, je mogoče nastaviti v zavihku Lokalizacije. V tem primeru bo specifična lokalizacija prevladala nad splošno privzeto.' + IS_DEFAULT: 'Privzeta (osnovna) lokalizacija' + IS_DEFAULT_DESCRIPTION: "Nastavitev, ki je z izbirnikom 'Domena' vezana na posamezno domeno, bo za tisto domeno prevladala nad splošno." LOCALE: Lokalizacija - LOCALE_TITLE: Naslov - LOCALE_URL: 'URL segment' + LOCALE_TITLE: Naziv + LOCALE_URL: 'Predpona URL' + MULTI_LOCALE: 'Dostop do paketnega urejanja lokalizacij, npr. shrani vse lokalizacije.' + PERMISSION: Lokalizacija PLURALNAME: Lokalizacije PLURALS: - one: 'Lokalizacija' - two: '{count} lokalizaciji' few: '{count} lokalizacij/e' + one: Lokalizacija other: '{count} lokalizacij/e' + two: '{count} lokalizaciji' SINGULARNAME: Lokalizacija + TIMEZONE: 'Časovni pas' + USE_X_DEFAULT: 'Uporabi kot privzeto ({code}) jezikovno kodo za SEO' + USE_X_DEFAULT_DESCRIPTION: 'S to izbiro boste iskalnikom nakazali, da je izbrana lokalizacija privzeta za vse situacije, ko specifična lokalizacija ni na voljo' UnsavedNotice: 'Nadomestne lokalizacije boste lahko dodali, ko boste shranili trenutno lokalizacijo.' + db_IsGlobalDefault: 'Privzeta (globalna)' + db_Locale: Lokalizacija + db_Sort: Razvrsti + db_Timezone: 'Časovni pas' + db_Title: Naziv + db_URLSegment: 'Predpona URL' + db_UseDefaultCode: 'Uporabi privzeto kodo' + has_many_FallbackLocales: 'Nadomestne lokalizacije' + has_one_Domain: Domena + many_many_Fallbacks: Nadomestne From 17c5cd213efab43680f20afe040912f76f171405 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Fri, 31 May 2024 09:47:15 +1200 Subject: [PATCH 18/29] MNT Run module-standardiser (#858) --- .github/workflows/update-js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-js.yml b/.github/workflows/update-js.yml index 0c323f3b..64e101c0 100644 --- a/.github/workflows/update-js.yml +++ b/.github/workflows/update-js.yml @@ -2,9 +2,9 @@ name: Update JS on: workflow_dispatch: - # Run on a schedule of once per quarter + # At 4:20 AM UTC, on day 1 of the month, only in March and September schedule: - - cron: '20 4 1 */3 *' + - cron: '20 4 1 3,9 *' permissions: {} From 092638a56fbde6778a27b2cf46d383b8bb0bd143 Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Wed, 5 Jun 2024 17:06:10 +1200 Subject: [PATCH 19/29] ENH Use class name instead of self --- src/Extension/FluentExtension.php | 32 ++++++------- src/Extension/FluentFilteredExtension.php | 2 +- src/Extension/FluentVersionedExtension.php | 52 +++++++++++----------- src/Extension/Traits/FluentObjectTrait.php | 2 +- src/Forms/CopyLocaleAction.php | 2 +- src/Forms/LocaleToggleColumn.php | 16 +++---- src/Model/LocalDateTime.php | 4 +- src/Model/Locale.php | 8 ++-- 8 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index ff4f6820..1d16f522 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -247,7 +247,7 @@ public function getLocalisedFields($class = null) // List of DB fields $fields = DataObject::getSchema()->databaseFields($class, false); $filter = Config::inst()->get($class, 'translate', Config::UNINHERITED); - if ($filter === self::TRANSLATE_NONE || empty($fields)) { + if ($filter === FluentExtension::TRANSLATE_NONE || empty($fields)) { return $this->localisedFields[$class] = []; } @@ -273,7 +273,7 @@ protected function isFieldLocalised($field, $type, $class) { // Explicit per-table filter $filter = Config::inst()->get($class, 'translate', Config::UNINHERITED); - if ($filter === self::TRANSLATE_NONE) { + if ($filter === FluentExtension::TRANSLATE_NONE) { return false; } if ($filter && is_array($filter)) { @@ -405,7 +405,7 @@ protected function validateBaseConfig() $fluents = 0; $extensions = $this->owner->get_extensions(); foreach ($extensions as $extension) { - if (is_a($extension, self::class, true)) { + if (is_a($extension, FluentExtension::class, true)) { $fluents++; } } @@ -433,7 +433,7 @@ protected function validateChildConfig() $extensions = array_filter(array_values($extensions)); foreach ($extensions as $extension) { $extensionClass = Extension::get_classname_without_arguments($extension); - if (is_a($extensionClass, self::class, true)) { + if (is_a($extensionClass, FluentExtension::class, true)) { $name = get_class($this->owner); DB::alteration_message( "Invalid config: {$name} has FluentExtension, but this should be applied only on the base class", @@ -491,11 +491,11 @@ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) // Resolve content inheritance (this drives what content is shown) $inheritanceMode = $this->getInheritanceMode(); - if ($inheritanceMode === self::INHERITANCE_MODE_EXACT) { + if ($inheritanceMode === FluentExtension::INHERITANCE_MODE_EXACT) { $joinAlias = $this->getLocalisedTable($this->owner->baseTable(), $locale->Locale); $where = sprintf('"%s"."ID" IS NOT NULL', $joinAlias); $query->addWhereAny($where); - } elseif ($inheritanceMode === self::INHERITANCE_MODE_FALLBACK) { + } elseif ($inheritanceMode === FluentExtension::INHERITANCE_MODE_FALLBACK) { $conditions = []; foreach ($locale->getChain() as $joinLocale) { @@ -809,7 +809,7 @@ protected function localiseManipulationTable(&$manipulation, $table, $localeTabl */ public function getLocalisedTable($tableName, $locale = '') { - $localisedTable = $tableName . '_' . self::SUFFIX; + $localisedTable = $tableName . '_' . FluentExtension::SUFFIX; if ($locale) { $localisedTable .= '_' . $locale; } @@ -1130,17 +1130,17 @@ protected function getInheritanceMode(): string // Detect legacy type if (is_bool($inheritanceMode)) { $inheritanceMode = $inheritanceMode - ? self::INHERITANCE_MODE_EXACT - : self::INHERITANCE_MODE_ANY; + ? FluentExtension::INHERITANCE_MODE_EXACT + : FluentExtension::INHERITANCE_MODE_ANY; } if (!in_array($inheritanceMode, [ - self::INHERITANCE_MODE_EXACT, - self::INHERITANCE_MODE_FALLBACK, - self::INHERITANCE_MODE_ANY, + FluentExtension::INHERITANCE_MODE_EXACT, + FluentExtension::INHERITANCE_MODE_FALLBACK, + FluentExtension::INHERITANCE_MODE_ANY, ])) { // Default mode - $inheritanceMode = self::INHERITANCE_MODE_ANY; + $inheritanceMode = FluentExtension::INHERITANCE_MODE_ANY; } return $inheritanceMode; @@ -1255,10 +1255,10 @@ public function updateLocalisationTabColumns(&$summaryColumns) } if ($object->RecordLocale()->IsDraft()) { - return _t(self::class . '.LOCALISED', 'Localised'); + return _t(FluentExtension::class . '.LOCALISED', 'Localised'); } - return _t(self::class . '.NOTLOCALISED', 'Not localised'); + return _t(FluentExtension::class . '.NOTLOCALISED', 'Not localised'); } ]; @@ -1275,7 +1275,7 @@ public function updateLocalisationTabColumns(&$summaryColumns) return $sourceLocale->getLongTitle(); } - return _t(self::class . '.NOSOURCE', 'No source'); + return _t(FluentExtension::class . '.NOSOURCE', 'No source'); } ]; } diff --git a/src/Extension/FluentFilteredExtension.php b/src/Extension/FluentFilteredExtension.php index b7dac66c..eaa8cf45 100644 --- a/src/Extension/FluentFilteredExtension.php +++ b/src/Extension/FluentFilteredExtension.php @@ -119,7 +119,7 @@ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) } $table = $this->owner->baseTable(); - $filteredLocalesTable = $table . '_' . self::SUFFIX; + $filteredLocalesTable = $table . '_' . FluentFilteredExtension::SUFFIX; $query->addInnerJoin( $filteredLocalesTable, diff --git a/src/Extension/FluentVersionedExtension.php b/src/Extension/FluentVersionedExtension.php index 83ddc7df..96b1cf42 100644 --- a/src/Extension/FluentVersionedExtension.php +++ b/src/Extension/FluentVersionedExtension.php @@ -93,7 +93,7 @@ class FluentVersionedExtension extends FluentExtension implements Resettable * This is different from the above cache which caches the result per object - each array (keyed by locale & table) * will have ALL object IDs for that locale & table. * - * static::$idsInLocaleCache[ $locale ][ $table(.self::SUFFIX_LIVE) ][ $objectId ] = $objectId + * static::$idsInLocaleCache[ $locale ][ $table(.FluentVersionedExtension::SUFFIX_LIVE) ][ $objectId ] = $objectId * * @var int[][][] */ @@ -116,7 +116,7 @@ public function augmentDatabase() // Must see versioned if ($extension instanceof Versioned) { $seenVersioned = true; - } elseif ($extension instanceof self) { + } elseif ($extension instanceof FluentVersionedExtension) { if (!$seenVersioned) { throw new LogicException( "FluentVersionedExtension must be added AFTER Versioned extension. Check " @@ -132,8 +132,8 @@ public function augmentDatabase() protected function augmentDatabaseDontRequire($localisedTable) { DB::dont_require_table($localisedTable); - DB::dont_require_table($localisedTable . self::SUFFIX_LIVE); - DB::dont_require_table($localisedTable . self::SUFFIX_VERSIONS); + DB::dont_require_table($localisedTable . FluentVersionedExtension::SUFFIX_LIVE); + DB::dont_require_table($localisedTable . FluentVersionedExtension::SUFFIX_VERSIONS); } protected function augmentDatabaseRequireTable($localisedTable, $fields, $indexes) @@ -141,13 +141,13 @@ protected function augmentDatabaseRequireTable($localisedTable, $fields, $indexe DB::require_table($localisedTable, $fields, $indexes, false); // _Live record - DB::require_table($localisedTable . self::SUFFIX_LIVE, $fields, $indexes, false); + DB::require_table($localisedTable . FluentVersionedExtension::SUFFIX_LIVE, $fields, $indexes, false); // Merge fields and indexes with Fluent defaults $versionsFields = array_merge($this->defaultVersionsFields, $fields); $versionsIndexes = array_merge($indexes, $this->defaultVersionsIndexes); - DB::require_table($localisedTable . self::SUFFIX_VERSIONS, $versionsFields, $versionsIndexes, false); + DB::require_table($localisedTable . FluentVersionedExtension::SUFFIX_VERSIONS, $versionsFields, $versionsIndexes, false); } /** @@ -209,7 +209,7 @@ protected function rewriteVersionedTables(SQLSelect $query, array $tables, Local foreach ($tables as $tableName => $fields) { // Rename to _Versions suffixed versions $localisedTable = $this->getLocalisedTable($tableName); - $query->renameTable($localisedTable, $localisedTable . self::SUFFIX_VERSIONS); + $query->renameTable($localisedTable, $localisedTable . FluentVersionedExtension::SUFFIX_VERSIONS); // Add the chain of locale fallbacks $this->addLocaleFallbackChain($query, $tableName, $locale); @@ -229,7 +229,7 @@ protected function addLocaleFallbackChain(SQLSelect $query, $tableName, Locale $ foreach ($locale->getChain() as $joinLocale) { $joinAlias = $this->getLocalisedTable($tableName, $joinLocale->Locale); - $versionTable = $baseTable . self::SUFFIX_VERSIONS; + $versionTable = $baseTable . FluentVersionedExtension::SUFFIX_VERSIONS; $query->setJoinFilter( $joinAlias, @@ -250,7 +250,7 @@ protected function renameLocalisedTables(SQLSelect $query, array $tables) { foreach ($tables as $table => $fields) { $localisedTable = $this->getLocalisedTable($table); - $query->renameTable($localisedTable, $localisedTable . self::SUFFIX_LIVE); + $query->renameTable($localisedTable, $localisedTable . FluentVersionedExtension::SUFFIX_LIVE); } } @@ -295,13 +295,13 @@ public function augmentWrite(&$manipulation) $includedTables = $this->getLocalisedTables(); foreach ($includedTables as $table => $localisedFields) { // Localise both _Versions and _Live writes - foreach ([self::SUFFIX_LIVE, self::SUFFIX_VERSIONS] as $suffix) { + foreach ([FluentVersionedExtension::SUFFIX_LIVE, FluentVersionedExtension::SUFFIX_VERSIONS] as $suffix) { $versionedTable = $table . $suffix; $localisedTable = $this->getLocalisedTable($table) . $suffix; // Add extra case for "Version" column when localising Versions $localisedVersionFields = $localisedFields; - if ($suffix === self::SUFFIX_VERSIONS) { + if ($suffix === FluentVersionedExtension::SUFFIX_VERSIONS) { $localisedVersionFields = array_merge( $localisedVersionFields, array_keys($this->defaultVersionsFields) @@ -332,7 +332,7 @@ protected function getDeleteTableTarget($tableName, $locale = '') // Rewrite to _Live when deleting from live / unpublishing $table = parent::getDeleteTableTarget($tableName, $locale); if (Versioned::get_stage() === Versioned::LIVE) { - $table .= self::SUFFIX_LIVE; + $table .= FluentVersionedExtension::SUFFIX_LIVE; } return $table; } @@ -482,7 +482,7 @@ protected function isLocalisedInStage($stage, $locale = null) $baseTable = $this->owner->baseTable(); $table = $this->getLocalisedTable($baseTable); if ($stage === Versioned::LIVE) { - $table .= self::SUFFIX_LIVE; + $table .= FluentVersionedExtension::SUFFIX_LIVE; } // Check for a cached item in the full list of all objects. These are populated optimistically. @@ -529,7 +529,7 @@ public static function reset() */ public function onPrepopulateTreeDataCache($recordList = null, array $options = []) { - if (!Config::inst()->get(self::class, 'prepopulate_localecontent_cache')) { + if (!Config::inst()->get(FluentVersionedExtension::class, 'prepopulate_localecontent_cache')) { return; } @@ -539,7 +539,7 @@ public function onPrepopulateTreeDataCache($recordList = null, array $options = return; } - self::prepoulateIdsInLocale(FluentState::singleton()->getLocale(), $this->owner->baseClass()); + FluentVersionedExtension::prepoulateIdsInLocale(FluentState::singleton()->getLocale(), $this->owner->baseClass()); } /** @@ -558,7 +558,7 @@ public static function prepoulateIdsInLocale($locale, $dataObjectClass, $populat $table = $dataObject->getLocalisedTable($dataObject->baseTable()); // If we already have items then we've been here before... - if (isset(self::$idsInLocaleCache[$locale][$table])) { + if (isset(FluentVersionedExtension::$idsInLocaleCache[$locale][$table])) { return; } @@ -567,7 +567,7 @@ public static function prepoulateIdsInLocale($locale, $dataObjectClass, $populat $tables[] = $table; } if ($populateLive) { - $tables[] = $table . self::SUFFIX_LIVE; + $tables[] = $table . FluentVersionedExtension::SUFFIX_LIVE; } // Populate both the draft and live stages @@ -581,8 +581,8 @@ public static function prepoulateIdsInLocale($locale, $dataObjectClass, $populat $ids = $result->column('RecordID'); // We need to execute ourselves as the param is lost from the subSelect - self::$idsInLocaleCache[$locale][$table] = array_combine($ids, $ids); - self::$idsInLocaleCache[$locale][$table][static::CACHE_COMPLETE] = true; + FluentVersionedExtension::$idsInLocaleCache[$locale][$table] = array_combine($ids, $ids); + FluentVersionedExtension::$idsInLocaleCache[$locale][$table][static::CACHE_COMPLETE] = true; } } @@ -598,18 +598,18 @@ public function updateLocalisationTabColumns(&$summaryColumns) $recordLocale = $object->RecordLocale(); if ($recordLocale->getStagesDiffer()) { - return _t(self::class . '.MODIFIED', 'Modified'); + return _t(FluentVersionedExtension::class . '.MODIFIED', 'Modified'); } if ($recordLocale->IsPublished(true)) { - return _t(self::class . '.PUBLISHED', 'Published'); + return _t(FluentVersionedExtension::class . '.PUBLISHED', 'Published'); } if ($recordLocale->IsDraft()) { - return _t(self::class . '.DRAFT', 'Draft'); + return _t(FluentVersionedExtension::class . '.DRAFT', 'Draft'); } - return _t(self::class . '.NOTLOCALISED', 'Not localised'); + return _t(FluentVersionedExtension::class . '.NOTLOCALISED', 'Not localised'); } ]; @@ -626,7 +626,7 @@ public function updateLocalisationTabColumns(&$summaryColumns) return $sourceLocale->getLongTitle(); } - return _t(self::class . '.NOSOURCE', 'No source'); + return _t(FluentVersionedExtension::class . '.NOSOURCE', 'No source'); } ]; @@ -638,8 +638,8 @@ public function updateLocalisationTabColumns(&$summaryColumns) } return $object->RecordLocale()->IsPublished() - ? _t(self::class . '.LIVEYES', 'Yes') - : _t(self::class . '.LIVENO', 'No'); + ? _t(FluentVersionedExtension::class . '.LIVEYES', 'Yes') + : _t(FluentVersionedExtension::class . '.LIVENO', 'No'); } ]; } diff --git a/src/Extension/Traits/FluentObjectTrait.php b/src/Extension/Traits/FluentObjectTrait.php index 54076df5..b9428f3c 100644 --- a/src/Extension/Traits/FluentObjectTrait.php +++ b/src/Extension/Traits/FluentObjectTrait.php @@ -23,7 +23,7 @@ trait FluentObjectTrait * Add additional columns to localisation table * * @param $summaryColumns - * @see FluentObjectTrait::updateFluentCMSFields() + * @see self::updateFluentCMSFields() */ abstract public function updateLocalisationTabColumns(&$summaryColumns); diff --git a/src/Forms/CopyLocaleAction.php b/src/Forms/CopyLocaleAction.php index 69103ea0..4a9bd727 100644 --- a/src/Forms/CopyLocaleAction.php +++ b/src/Forms/CopyLocaleAction.php @@ -166,7 +166,7 @@ public function getGroup($gridField, $record, $columnName) { $hasGroup = parent::getGroup($gridField, $record, $columnName); if ($hasGroup) { - return $this->isTo ? self::COPY_TO : self::COPY_FROM; + return $this->isTo ? CopyLocaleAction::COPY_TO : CopyLocaleAction::COPY_FROM; } return null; } diff --git a/src/Forms/LocaleToggleColumn.php b/src/Forms/LocaleToggleColumn.php index 6c4a88ef..4d950ed2 100644 --- a/src/Forms/LocaleToggleColumn.php +++ b/src/Forms/LocaleToggleColumn.php @@ -26,7 +26,7 @@ class LocaleToggleColumn implements GridField_SaveHandler, GridField_ColumnProvi public function augmentColumns($gridField, &$columns) { // Add "enabled in" column - if (in_array(self::COLUMN_NAME, $columns)) { + if (in_array(LocaleToggleColumn::COLUMN_NAME, $columns)) { return; } @@ -37,10 +37,10 @@ public function augmentColumns($gridField, &$columns) $columns, $localeIndex + 1, 0, - [self::COLUMN_NAME] + [LocaleToggleColumn::COLUMN_NAME] ); } else { - $columns[] = self::COLUMN_NAME; + $columns[] = LocaleToggleColumn::COLUMN_NAME; } } @@ -49,7 +49,7 @@ public function augmentColumns($gridField, &$columns) */ public function getColumnsHandled($gridField) { - return [self::COLUMN_NAME]; + return [LocaleToggleColumn::COLUMN_NAME]; } /** @@ -60,7 +60,7 @@ public function getColumnsHandled($gridField) */ public function getColumnContent($gridField, $locale, $columnName) { - if ($columnName !== self::COLUMN_NAME) { + if ($columnName !== LocaleToggleColumn::COLUMN_NAME) { return null; } @@ -96,8 +96,8 @@ public function handleSave(GridField $gridField, DataObjectInterface $record) $value = $gridField->Value(); // Keys for this value will be list of locales to enable - $enabledLocales = isset($value[self::COLUMN_NAME]) - ? array_keys($value[self::COLUMN_NAME]) + $enabledLocales = isset($value[LocaleToggleColumn::COLUMN_NAME]) + ? array_keys($value[LocaleToggleColumn::COLUMN_NAME]) : []; /** @var DataObject|FluentFilteredExtension $record */ @@ -112,7 +112,7 @@ protected function getFieldName(GridField $grid, Locale $locale) return sprintf( '%s[%s][%s]', $grid->getName(), - self::COLUMN_NAME, + LocaleToggleColumn::COLUMN_NAME, $locale->ID ); } diff --git a/src/Model/LocalDateTime.php b/src/Model/LocalDateTime.php index 932ae1c2..746900af 100644 --- a/src/Model/LocalDateTime.php +++ b/src/Model/LocalDateTime.php @@ -40,7 +40,7 @@ public function getTimezone(): ?string * @param string|null $timezone * @return $this */ - public function setTimezone(?string $timezone): self + public function setTimezone(?string $timezone): LocalDateTime { if ($timezone && !in_array($timezone, timezone_identifiers_list())) { throw new InvalidArgumentException("Invalid timezone {$timezone}"); @@ -90,7 +90,7 @@ public function setValue($value, $record = null, $markChanged = true) */ public function getLocalValue(): string { - return $this->Format(self::ISO_DATETIME); + return $this->Format(LocalDateTime::ISO_DATETIME); } /** Assign a value that's already in the current locale diff --git a/src/Model/Locale.php b/src/Model/Locale.php index e97715db..b7b5f1ef 100644 --- a/src/Model/Locale.php +++ b/src/Model/Locale.php @@ -253,7 +253,7 @@ public function getBadgeLabel() public function getHrefLang() { if ($this->UseDefaultCode) { - return self::X_DEFAULT; + return Locale::X_DEFAULT; } return strtolower(i18n::convert_rfc1766($this->Locale)); } @@ -307,7 +307,7 @@ public function getCMSFields() )), CheckboxField::create( 'UseDefaultCode', - _t(__CLASS__ . '.USE_X_DEFAULT', 'Use {code} as SEO language code (treat as global)', ['code' => self::X_DEFAULT]) + _t(__CLASS__ . '.USE_X_DEFAULT', 'Use {code} as SEO language code (treat as global)', ['code' => Locale::X_DEFAULT]) ) ->setDescription(_t( __CLASS__ . '.USE_X_DEFAULT_DESCRIPTION', @@ -630,7 +630,7 @@ public function RecordLocale() */ public function getLocaleEditPermission() { - $prefix = self::CMS_ACCESS_FLUENT_LOCALE; + $prefix = Locale::CMS_ACCESS_FLUENT_LOCALE; return "{$prefix}{$this->Locale}"; } @@ -640,7 +640,7 @@ public function providePermissions() $category = _t(__CLASS__ . '.PERMISSION', 'Localisation'); $permissions = [ // @todo - Actually implement this check on those actions - self::CMS_ACCESS_MULTI_LOCALE => [ + Locale::CMS_ACCESS_MULTI_LOCALE => [ 'name' => _t( __CLASS__ . '.MULTI_LOCALE', 'Access to multi-locale actions (E.g. save in all locales)' From eaece0a7e1c8e3a4492d3d290c84993b52c82b4c Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Thu, 6 Jun 2024 18:08:34 +1200 Subject: [PATCH 20/29] FIX Only select columns from the current database --- src/Extension/FluentVersionedExtension.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Extension/FluentVersionedExtension.php b/src/Extension/FluentVersionedExtension.php index 65ca59fa..a8306aba 100644 --- a/src/Extension/FluentVersionedExtension.php +++ b/src/Extension/FluentVersionedExtension.php @@ -1044,8 +1044,11 @@ public function onAfterDuplicate($original, $doWrite, $relations): void // Remove existing versions from duplicated object, created by onBeforeWrite DB::prepared_query("DELETE FROM \"$versionsTableName\" WHERE \"RecordID\" = ?", [$toID]); + // Dynamicaly select the current database, which will be a temporary database in case of unit tests + $currentDB = DB::query('SELECT DATABASE() as DB')->column('DB')[0]; + // Copy all versions of base record, todo: optimize to only copy needed versions - $fields = DB::query("SELECT \"COLUMN_NAME\" FROM \"INFORMATION_SCHEMA\".\"COLUMNS\" WHERE \"TABLE_NAME\" = '$versionsTableName' AND \"COLUMN_NAME\" NOT IN('ID','RecordID')"); + $fields = DB::query("SELECT \"COLUMN_NAME\" FROM \"INFORMATION_SCHEMA\".\"COLUMNS\" WHERE \"TABLE_SCHEMA\" = '$currentDB' AND \"TABLE_NAME\" = '$versionsTableName' AND \"COLUMN_NAME\" NOT IN('ID','RecordID')"); $fields_str = '"' . implode('","', $fields->column()) . '"'; DB::prepared_query("INSERT INTO \"$versionsTableName\" ( \"RecordID\", $fields_str) SELECT ? AS \"RecordID\", $fields_str From 2714bff77c5baebcabf63e5aa281be57f9b05dbf Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Thu, 6 Jun 2024 18:15:46 +1200 Subject: [PATCH 21/29] FIX Create a temp locale if there is not a default --- src/Extension/FluentExtension.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 06ab9507..b829c0ef 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -1055,6 +1055,14 @@ public function LocaleInformation($locale = null) $localeObj = Locale::getDefault(); } + if (!$locale && !$localeObj) { + // There is no default locale, this can happen when if fluent is installed though locales have been setup + // This will happen when doing integration unit testing, though can also happen during + // regular website operation + // This temporary Locale is created to prevent a invalid argument exception in RecordLocale::__construct() + $localeObj = Locale::create(['Title' => 'Temp locale']); + } + return RecordLocale::create($this->owner, $localeObj); } From b14687a9d09eb8ad8ef54c722e87895e4d256939 Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Fri, 7 Jun 2024 09:54:50 +1200 Subject: [PATCH 22/29] . --- src/Extension/FluentExtension.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index b829c0ef..6980ee57 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -3,6 +3,7 @@ namespace TractorCow\Fluent\Extension; use LogicException; +use SilverStripe\i18n\i18n; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Convert; @@ -1055,12 +1056,13 @@ public function LocaleInformation($locale = null) $localeObj = Locale::getDefault(); } - if (!$locale && !$localeObj) { - // There is no default locale, this can happen when if fluent is installed though locales have been setup - // This will happen when doing integration unit testing, though can also happen during - // regular website operation - // This temporary Locale is created to prevent a invalid argument exception in RecordLocale::__construct() - $localeObj = Locale::create(['Title' => 'Temp locale']); + if (!$localeObj) { + // There is no default locale, this can happen if no locales have been setup + // This will happen when doing integration unit testing, though can also happen during regular + // website operation + // This temporary Locale is created to prevent a invalid argument exception in + // RecordLocale::__construct() + $localeObj = Locale::create(['Locale' => i18n::get_locale()]); } return RecordLocale::create($this->owner, $localeObj); From 713786bdb89b973926c273c7a2e68bb346d02c7e Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Tue, 11 Jun 2024 09:41:45 +1200 Subject: [PATCH 23/29] FIX Preview link when no locale set --- src/Extension/FluentExtension.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 6980ee57..3edd2ced 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -1160,8 +1160,11 @@ public function updateFluentCMSField(FormField $field) public function updatePreviewLink(&$link): void { $owner = $this->owner; - $info = $owner->LocaleInformation(FluentState::singleton()->getLocale()); - + $locale = FluentState::singleton()->getLocale(); + if ($locale === null || $locale === '') { + return; + } + $info = $owner->LocaleInformation($locale); if (!$info->getSourceLocale()) { $link = null; } From 201826ed8225873fc11e57efc0004b65b1df3ec7 Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Tue, 11 Jun 2024 11:32:25 +1200 Subject: [PATCH 24/29] ENH Revert temporary locale fix --- src/Extension/FluentExtension.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Extension/FluentExtension.php b/src/Extension/FluentExtension.php index 3edd2ced..c0f0fe3f 100644 --- a/src/Extension/FluentExtension.php +++ b/src/Extension/FluentExtension.php @@ -1056,15 +1056,6 @@ public function LocaleInformation($locale = null) $localeObj = Locale::getDefault(); } - if (!$localeObj) { - // There is no default locale, this can happen if no locales have been setup - // This will happen when doing integration unit testing, though can also happen during regular - // website operation - // This temporary Locale is created to prevent a invalid argument exception in - // RecordLocale::__construct() - $localeObj = Locale::create(['Locale' => i18n::get_locale()]); - } - return RecordLocale::create($this->owner, $localeObj); } From 18622bf10bd0a8ce881d0f0b6120a2a474337e0d Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:45:25 +1200 Subject: [PATCH 25/29] MNT Replace sass-lint with stylelint (#862) sass-lint went EOL ages ago --- .sass-lint.yml | 179 ----- .stylelintrc.js | 1 + client/dist/styles/fluent.css | 2 +- client/src/styles/fluent.scss | 8 +- package.json | 6 +- yarn.lock | 1248 +++++++++++++-------------------- 6 files changed, 481 insertions(+), 963 deletions(-) delete mode 100644 .sass-lint.yml create mode 100644 .stylelintrc.js diff --git a/.sass-lint.yml b/.sass-lint.yml deleted file mode 100644 index 261030ac..00000000 --- a/.sass-lint.yml +++ /dev/null @@ -1,179 +0,0 @@ -# sass-lint config to match the AirBNB style guide -files: - include: - # This covers linting when running locally - - 'client/src/**/*.scss' - # This covers linting when running via Github actions - - '**/silverstripe-fluent/client/src/**/*.scss' -options: - formatter: stylish - merge-default-rules: false -rules: - # Warnings - # Things that require actual refactoring are marked as warnings - class-name-format: - - 1 - - convention: hyphenatedbem - placeholder-name-format: - - 1 - - convention: hyphenatedlowercase - nesting-depth: - - 1 - - max-depth: 3 - no-ids: 1 - no-important: 1 - no-misspelled-properties: - - 1 - - extra-properties: - - "-moz-border-radius-topleft" - - "-moz-border-radius-topright" - - "-moz-border-radius-bottomleft" - - "-moz-border-radius-bottomright" - variable-name-format: - - 1 - - allow-leading-underscore: true - convention: hyphenatedlowercase - no-extends: 1 - - # Warnings: these things are preferential rather than mandatory - no-css-comments: 1 - - # Errors - # Things that can be easily fixed are marked as errors - indentation: - - 2 - - size: 2 - final-newline: - - 2 - - include: true - no-trailing-whitespace: 2 - border-zero: - - 2 - - convention: '0' - brace-style: - - 2 - - allow-single-line: true - clean-import-paths: - - 2 - - filename-extension: false - leading-underscore: false - no-debug: 2 - no-empty-rulesets: 2 - no-invalid-hex: 2 - no-mergeable-selectors: 2 - # no-qualifying-elements: - # - 1 - # - allow-element-with-attribute: false - # allow-element-with-class: false - # allow-element-with-id: false - no-trailing-zero: 2 - no-url-protocols: 2 - quotes: - - 2 - - style: double - space-after-bang: - - 2 - - include: false - space-after-colon: - - 2 - - include: true - space-after-comma: - - 2 - - include: true - space-before-bang: - - 2 - - include: true - space-before-brace: - - 2 - - include: true - space-before-colon: 2 - space-between-parens: - - 2 - - include: false - trailing-semicolon: 2 - url-quotes: 2 - zero-unit: 2 - single-line-per-selector: 2 - one-declaration-per-line: 2 - empty-line-between-blocks: - - 2 - - ignore-single-line-rulesets: true - - - # Missing rules - # There are no sass-lint rules for the following AirBNB style items, but thess - # - Put comments on their own line - # - Put property delcarations before mixins - - # Disabled rules - - # These are other rules that we may wish to consider using in the future - # They are not part of the AirBNB CSS standard but they would introduce some strictness - # bem-depth: 0 - # variable-for-property: 0 - # no-transition-all: 0 - # hex-length: - # - 1 - # - style: short - # hex-notation: - # - 1 - # - style: lowercase - # property-units: - # - 1 - # - global: - # - ch - # - em - # - ex - # - rem - # - cm - # - in - # - mm - # - pc - # - pt - # - px - # - q - # - vh - # - vw - # - vmin - # - vmax - # - deg - # - grad - # - rad - # - turn - # - ms - # - s - # - Hz - # - kHz - # - dpi - # - dpcm - # - dppx - # - '%' - # per-property: {} - # force-attribute-nesting: 1 - # force-element-nesting: 1 - # force-pseudo-nesting: 1 - # function-name-format: - # - 1 - # - allow-leading-underscore: true - # convention: hyphenatedlowercase - # no-color-literals: 1 - # no-duplicate-properties: 1 - # mixin-name-format: - # - 1 - # - allow-leading-underscore: true - # convention: hyphenatedlowercase - # shorthand-values: - # - 1 - # - allowed-shorthands: - # - 1 - # - 2 - # - 3 - # leading-zero: - # - 1 - # - include: false - # no-vendor-prefixes: - # - 1 - # - additional-identifiers: [] - # excluded-identifiers: [] - # placeholder-in-extend: 1 - # no-color-keywords: 2 diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 00000000..ef7353b7 --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1 @@ +module.exports = require('@silverstripe/eslint-config/.stylelintrc'); diff --git a/client/dist/styles/fluent.css b/client/dist/styles/fluent.css index ec04e554..5c8bffad 100644 --- a/client/dist/styles/fluent.css +++ b/client/dist/styles/fluent.css @@ -1 +1 @@ -.cms-menu.collapsed .cms-menu-list{float:left}.cms-menu.collapsed .cms-fluent-selector .text{display:none}.cms-menu.collapsed .cms-fluent-selector-locales{width:100%}.cms-menu.collapsed .cms-fluent-selector-locales .full-title{display:none}.cms-menu.collapsed .cms-fluent-selector-locales .short-title{display:block}.cms-tree.jstree .status-fluentinvisible>a{color:#566b8d}.cms-fluent-selector{display:block;height:auto;line-height:1.5;overflow:visible;padding:5px;position:relative}.cms-fluent-selector:before{color:#fff;position:absolute;top:50%;line-height:0;right:24px;width:0;pointer-events:none}.cms-panel-layout.collapsed .cms-fluent-selector:before{right:36px}.cms-fluent-selector .cms-fluent-selector-locales{background-color:#368b39;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzgyOEE0NzQ3NjQ4MTFFN0IyMEZBRTZGODdBRkExOUUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzgyOEE0NzM3NjQ4MTFFN0IyMEZBRTZGODdBRkExOUUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDg0Q0M3NjFERDUxMTFFMjlERTBCQjc0MjE1M0Y0OTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDg0Q0M3NjJERDUxMTFFMjlERTBCQjc0MjE1M0Y0OTgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7EmuTKAAACLElEQVR42qyVz0tVQRTH5/1SC6QUCpIwKILACCsSgyBcuHJVCNKmH4uCIDctokXUQrJtBO1yEQhSgUFFtPIPqE1BaCJIES3UXr9MSyxvnxPfS5dh7n33hV/4cN+9c+adc2bOnClEUXTCOXcDmmHN/VMBNsDPwPcVuK15kcsSDuaidL2C1ZSxFdgGLosyPkryZVEtKULTW+iCR9AdxwNNsBF+QaOrJbzMK6IRaIQmUVEUJWiBVmiAy7Jfgh15Moh1GG5Cg9Z+WdlY1HdgUuP7XT1KZBDL9uSh960TTnrfvufJIORgWoNX9P5E75Pr5cA0pD0Yh3Y4FrAxB9vzOFhIKcO9MmqGdykOdmvjQ1TiTS562/IVRmAWNun9NbR7dlYIz2A1UdpJ/YZRi7CqiD6qVOO0z8N7uK4D9z9aTDqYUq33wUS0PvpUTqS3B2bgBfTkrHKzfQz7oD90CiyDLwmPw1qegRzRrcEh2VvmiwGbqg1ehc8qzWSJndW+/NCf+XouuzN6jqc5cOqK1m9OeU7aoCOlTAfVu75BN/RmOTA2K9rhwIGZ8Saa3RZVmumB7F76Dope3X6Ai3Ap0cZN17xL5yksQCuMaZ7pfqjZxRRgq5bFekzRy6JfLdp0RKe1Cw7qaSd+ly6i4BLl4RbM6vfpQP9yao7BJaqlAzAAU9AHF7zxc3AcptOWKIujNe7uNFULf1tqtirwBna6+rVczmFk3fKulqRUz2UJ9/4IMAAbOzRApe01NQAAAABJRU5ErkJggg==);background-position:6px center;background-repeat:none;background-size:12px;border-radius:5px;border:0 none;color:#fff;padding:5px 21px 5px 24px;width:100%}.cms-panel-layout.collapsed .cms-fluent-selector .cms-fluent-selector-locales{color:rgba(0,0,0,0);padding:2px}.cms-panel-layout.collapsed .cms-fluent-selector .cms-fluent-selector-locales>option{color:#fff}.fluent-badge{color:#fff;margin-left:5px}.fluent-badge--default{background-color:#008a00}.fluent-badge--invisible{background-color:#9b2828}.fluent-badge--localised{background-color:#660ff2}.fluent__localised-field .font-icon-translatable{color:#660ff2;top:2px;position:relative;margin-right:3px}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu{margin-left:5px}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor{font-size:1em;color:#303b4d}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:before{margin-right:6px;font-size:1.5rem}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:after,.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:hover:after,.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:active:after{display:none !important}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .tab-pane{padding-top:0;max-width:500px}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .tab-pane .action-description{font-size:.9em;line-height:1em;display:block !important;margin:0;padding:0 11px 8px 11px;border-bottom:1px solid #ccc;color:#999}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .tab-pane .action-description:last-child{border-bottom:0 none}.action-group-COPY_FROM .action-menu__toggle:before,.action-group-COPY_TO .action-menu__toggle:before{font-family:inherit !important;line-height:1em;font-size:1em}.action-group-COPY_FROM .action-menu__toggle:before{content:"Copy from" !important}.action-group-COPY_TO .action-menu__toggle:before{content:"Copy to" !important}.fluent-visible-column .badge{font-size:.8em;padding:3px 5px} +.cms-menu.collapsed .cms-menu-list{float:left}.cms-menu.collapsed .cms-fluent-selector .text{display:none}.cms-menu.collapsed .cms-fluent-selector-locales{width:100%}.cms-menu.collapsed .cms-fluent-selector-locales .full-title{display:none}.cms-menu.collapsed .cms-fluent-selector-locales .short-title{display:block}.cms-tree.jstree .status-fluentinvisible>a{color:#566b8d}.cms-fluent-selector{display:block;height:auto;line-height:1.5;overflow:visible;padding:5px;position:relative}.cms-fluent-selector:before{color:#fff;position:absolute;top:50%;line-height:0;right:24px;width:0;pointer-events:none}.cms-panel-layout.collapsed .cms-fluent-selector:before{right:36px}.cms-fluent-selector .cms-fluent-selector-locales{background-color:#368b39;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzgyOEE0NzQ3NjQ4MTFFN0IyMEZBRTZGODdBRkExOUUiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzgyOEE0NzM3NjQ4MTFFN0IyMEZBRTZGODdBRkExOUUiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDg0Q0M3NjFERDUxMTFFMjlERTBCQjc0MjE1M0Y0OTgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDg0Q0M3NjJERDUxMTFFMjlERTBCQjc0MjE1M0Y0OTgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7EmuTKAAACLElEQVR42qyVz0tVQRTH5/1SC6QUCpIwKILACCsSgyBcuHJVCNKmH4uCIDctokXUQrJtBO1yEQhSgUFFtPIPqE1BaCJIES3UXr9MSyxvnxPfS5dh7n33hV/4cN+9c+adc2bOnClEUXTCOXcDmmHN/VMBNsDPwPcVuK15kcsSDuaidL2C1ZSxFdgGLosyPkryZVEtKULTW+iCR9AdxwNNsBF+QaOrJbzMK6IRaIQmUVEUJWiBVmiAy7Jfgh15Moh1GG5Cg9Z+WdlY1HdgUuP7XT1KZBDL9uSh960TTnrfvufJIORgWoNX9P5E75Pr5cA0pD0Yh3Y4FrAxB9vzOFhIKcO9MmqGdykOdmvjQ1TiTS562/IVRmAWNun9NbR7dlYIz2A1UdpJ/YZRi7CqiD6qVOO0z8N7uK4D9z9aTDqYUq33wUS0PvpUTqS3B2bgBfTkrHKzfQz7oD90CiyDLwmPw1qegRzRrcEh2VvmiwGbqg1ehc8qzWSJndW+/NCf+XouuzN6jqc5cOqK1m9OeU7aoCOlTAfVu75BN/RmOTA2K9rhwIGZ8Saa3RZVmumB7F76Dope3X6Ai3Ap0cZN17xL5yksQCuMaZ7pfqjZxRRgq5bFekzRy6JfLdp0RKe1Cw7qaSd+ly6i4BLl4RbM6vfpQP9yao7BJaqlAzAAU9AHF7zxc3AcptOWKIujNe7uNFULf1tqtirwBna6+rVczmFk3fKulqRUz2UJ9/4IMAAbOzRApe01NQAAAABJRU5ErkJggg==);background-position:6px center;background-repeat:none;background-size:12px;border-radius:5px;border:0 none;color:#fff;padding:5px 21px 5px 24px;width:100%}.cms-panel-layout.collapsed .cms-fluent-selector .cms-fluent-selector-locales{color:rgba(0,0,0,0);padding:2px}.cms-panel-layout.collapsed .cms-fluent-selector .cms-fluent-selector-locales>option{color:#fff}.fluent-badge{color:#fff;margin-left:5px}.fluent-badge--default{background-color:#008a00}.fluent-badge--invisible{background-color:#9b2828}.fluent-badge--localised{background-color:#660ff2}.fluent__localised-field .font-icon-translatable{color:#660ff2;top:2px;position:relative;margin-right:3px}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu{margin-left:5px}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor{font-size:1em;color:#303b4d}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:before{margin-right:6px;font-size:1.5rem}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:after,.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:hover:after,.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .popover-actions-simulate .ui-tabs-anchor:active:after{display:none !important}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .tab-pane{padding-top:0;max-width:500px}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .tab-pane .action-description{font-size:.9em;line-height:1em;display:block !important;margin:0;padding:0 11px 8px;border-bottom:1px solid #ccc;color:#999}.cms .ss-ui-action-tabset.ss-tabset.fluent-actions-menu .tab-pane .action-description:last-child{border-bottom:0 none}.action-group-COPY_FROM .action-menu__toggle:before,.action-group-COPY_TO .action-menu__toggle:before{font-family:inherit !important;line-height:1em;font-size:1em}.action-group-COPY_FROM .action-menu__toggle:before{content:"Copy from" !important}.action-group-COPY_TO .action-menu__toggle:before{content:"Copy to" !important}.fluent-visible-column .badge{font-size:.8em;padding:3px 5px} diff --git a/client/src/styles/fluent.scss b/client/src/styles/fluent.scss index 5cd2065b..5ae9267c 100644 --- a/client/src/styles/fluent.scss +++ b/client/src/styles/fluent.scss @@ -51,7 +51,7 @@ $fluent-color-localised: rgb(102, 15, 242); position: relative; &:before { - color: white; + color: #fff; position: absolute; top: 50%; line-height: 0; @@ -72,7 +72,7 @@ $fluent-color-localised: rgb(102, 15, 242); background-size: 12px; border-radius: 5px; border: 0 none; - color: white; + color: #fff; padding: 5px 21px 5px 24px; width: 100%; @@ -82,7 +82,7 @@ $fluent-color-localised: rgb(102, 15, 242); padding: 2px; > option { - color: white; + color: #fff; } } } @@ -146,7 +146,7 @@ $fluent-color-localised: rgb(102, 15, 242); line-height: 1em; display: block !important;// sass-lint:disable-line no-important margin: 0; - padding: 0 11px 8px 11px; + padding: 0 11px 8px; border-bottom: 1px solid #ccc; color: #999; diff --git a/package.json b/package.json index bfb7b2ed..7f339f01 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dev": "NODE_ENV=development webpack --progress", "watch": "NODE_ENV=development webpack --watch --progress", "css": "WEBPACK_CHILD=css npm run build", - "lint": "eslint client/src && sass-lint -v" + "lint": "eslint client/src && stylelint client/src" }, "repository": { "type": "git", @@ -27,8 +27,8 @@ }, "homepage": "https://github.com/tractorcow-farm/silverstripe-fluent", "devDependencies": { - "@silverstripe/eslint-config": "^1.0.0-alpha6", - "@silverstripe/webpack-config": "^2.0.0-alpha6", + "@silverstripe/eslint-config": "^1.3.0", + "@silverstripe/webpack-config": "^2.0.0", "webpack": "^5.74.0", "webpack-cli": "^5.0.0" }, diff --git a/yarn.lock b/yarn.lock index 29540b74..f6055367 100644 --- a/yarn.lock +++ b/yarn.lock @@ -961,11 +961,36 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@csstools/css-parser-algorithms@^2.6.3": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz#b5e7eb2bd2a42e968ef61484f1490a8a4148a8eb" + integrity sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA== + +"@csstools/css-tokenizer@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz#3d47e101ad48d815a4bdce8159fb5764f087f17a" + integrity sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g== + +"@csstools/media-query-list-parser@^2.1.11": + version "2.1.11" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz#465aa42f268599729350e305e1ae14a30c1daf51" + integrity sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA== + +"@csstools/selector-specificity@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz#63085d2995ca0f0e55aa8b8a07d69bfd48b844fe" + integrity sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA== + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@dual-bundle/import-meta-resolve@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" + integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== + "@eslint/eslintrc@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" @@ -1066,12 +1091,12 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1261,10 +1286,10 @@ resolved "https://registry.yarnpkg.com/@sect/modernizr-loader/-/modernizr-loader-1.0.3.tgz#7fd8cec372426c53f113f3cfd9344cb29e959825" integrity sha512-47zKwv4/1I0CYptZz8s4aSYSe0awmuyqa+HFKxN89/75h2q8hr6V752TZ9VjhGDhQ4gU0EU7Plew7b+7bf2crg== -"@silverstripe/eslint-config@^1.0.0-alpha6": - version "1.0.0-alpha6" - resolved "https://registry.yarnpkg.com/@silverstripe/eslint-config/-/eslint-config-1.0.0-alpha6.tgz#1f243b003fddf3503a4abea37f35a8a5968cc96e" - integrity sha512-+P7UzhMRSmc7UlRYCiSXwjauLFYU11oBPwHl/bpacJ7xUcFY3Jt3CgcDt6d+XLvAJO8zMRsG9RcOm5MnxsyCsg== +"@silverstripe/eslint-config@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@silverstripe/eslint-config/-/eslint-config-1.3.0.tgz#fa88f47cacd6103f6b759d81e1d86f9e93799413" + integrity sha512-Q3+sQKO1ysyMLhJ91kOl2LqJhQICfHFeqMx09EH0xx3dRHgjsQvqHIzVWEzPkM/l7D79m+Ma/WBnon30S7TVlA== dependencies: eslint "^8.26.0" eslint-config-airbnb "^19.0.4" @@ -1273,11 +1298,17 @@ eslint-plugin-jsx-a11y "^6.6.1" eslint-plugin-react "^7.31.10" eslint-webpack-plugin "^3.2.0" - -"@silverstripe/webpack-config@^2.0.0-alpha6": - version "2.0.0-alpha8" - resolved "https://registry.yarnpkg.com/@silverstripe/webpack-config/-/webpack-config-2.0.0-alpha8.tgz#df97d047ceb0f1726cea7c18864ce15eba1361ce" - integrity sha512-aIwflLBdC2neS7zAq4qN+P2lhkb1vrxTVZSUILI7Gpthp/8tQ7k91W2UdXWWXOUytQYLo+5gBfkh4P60Mys/nQ== + stylelint "^16.3.1" + stylelint-config-recommended "^14.0.0" + stylelint-config-recommended-scss "^14.0.0" + stylelint-config-sass-guidelines "^11.1.0" + stylelint-config-standard "^36.0.0" + stylelint-scss "^6.2.1" + +"@silverstripe/webpack-config@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@silverstripe/webpack-config/-/webpack-config-2.1.0.tgz#9d6409498126db766299fa40f209f618515932a4" + integrity sha512-8rE2K3AXkIP6crDTBXdHz/3hiNVp2XpINkWGDBKzvMS6sGRcVTluPs12BdOXYo1aUZEeqDk9QYOLLGGgZxnOdw== dependencies: "@babel/core" "^7.19.6" "@babel/preset-env" "^7.19.4" @@ -1301,7 +1332,6 @@ postcss-loader "^7.0.1" resolve-url-loader "^5.0.0" sass "^1.55.0" - sass-lint "^1.13.1" sass-loader "^13.1.0" webpack "^5.74.0" webpack-bundle-analyzer "^4.7.0" @@ -1513,12 +1543,6 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1529,14 +1553,6 @@ acorn-walk@^8.0.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" - acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" @@ -1581,10 +1597,6 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -1597,13 +1609,6 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^4.7.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1624,26 +1629,25 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +ajv@^8.0.1: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.1.0: version "3.2.0" @@ -1684,12 +1688,6 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -1713,15 +1711,10 @@ array-includes@^3.1.5, array-includes@^3.1.6: get-intrinsic "^1.1.3" is-string "^1.0.7" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.3.1: version "1.3.1" @@ -1754,10 +1747,6 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1768,6 +1757,11 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + autoprefixer@^10.4.13: version "10.4.13" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" @@ -1833,6 +1827,11 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -1876,6 +1875,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" @@ -1930,16 +1936,6 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1954,16 +1950,6 @@ caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001448.tgz#ca7550b1587c92a392a2b377cd9c508b3b4395bf" integrity sha512-tq2YI+MJnooG96XpbTRYkBxLxklZPOdLmNIOdIhvf7SNJan6u5vCKum8iT7ZfCt70m1GPkuC7P3TtX6UuhupuA== -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" @@ -2012,10 +1998,6 @@ cidr-regex@^3.1.1: dependencies: ip-regex "^4.1.0" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2029,12 +2011,6 @@ cli-columns@^4.0.0: string-width "^4.2.3" strip-ansi "^6.0.1" -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - cli-table3@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" @@ -2044,10 +2020,6 @@ cli-table3@^0.6.2: optionalDependencies: "@colors/colors" "1.5.0" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -2077,14 +2049,6 @@ cmd-shim@^5.0.0: dependencies: mkdirp-infer-owner "^2.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2112,6 +2076,11 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + colorette@^2.0.14: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" @@ -2135,10 +2104,6 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^2.8.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -2162,14 +2127,6 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - confusing-browser-globals@^1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" @@ -2197,10 +2154,6 @@ core-js@^3.26.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -2212,6 +2165,16 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2221,6 +2184,11 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-functions-list@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.2.tgz#9a54c6dd8416ed25c1079cd88234e927526c1922" + integrity sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ== + css-loader@^6.7.1: version "6.7.3" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" @@ -2235,17 +2203,19 @@ css-loader@^6.7.1: postcss-value-parser "^4.2.0" semver "^7.3.8" +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -2258,12 +2228,6 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3: dependencies: ms "2.1.2" -debug@^2.1.1: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2271,6 +2235,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -2313,10 +2284,6 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -2332,18 +2299,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -2366,12 +2321,12 @@ diff@^5.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== -doctrine@^1.2.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" @@ -2432,7 +2387,7 @@ entities@~2.1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== -env-paths@^2.2.0: +env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== @@ -2538,64 +2493,12 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.35" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f" - dependencies: - es6-iterator "~2.0.1" - es6-symbol "~3.1.1" - -es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - 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" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -2604,15 +2507,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-config-airbnb-base@^15.0.0: version "15.0.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" @@ -2756,44 +2650,6 @@ eslint-webpack-plugin@^3.2.0: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^2.7.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11" - dependencies: - chalk "^1.1.3" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^1.2.2" - es6-map "^0.1.3" - escope "^3.6.0" - espree "^3.1.6" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^1.1.1" - glob "^7.0.3" - globals "^9.2.0" - ignore "^3.1.2" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - optionator "^0.8.1" - path-is-absolute "^1.0.0" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.6.0" - strip-json-comments "~1.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - eslint@^8.26.0: version "8.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" @@ -2839,13 +2695,6 @@ eslint@^8.26.0: strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^3.1.6: - version "3.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" - dependencies: - acorn "^5.1.1" - acorn-jsx "^3.0.0" - espree@^9.4.0: version "9.4.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" @@ -2855,10 +2704,6 @@ espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" @@ -2866,13 +2711,6 @@ esquery@^1.4.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" - esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -2880,7 +2718,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2893,22 +2731,11 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - expose-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-4.0.0.tgz#aa6f06f57cbc904175de4fe4eaff6211337e0231" @@ -2918,16 +2745,27 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fastest-levenshtein@^1.0.12: +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== @@ -2939,20 +2777,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -file-entry-cache@^1.1.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2960,6 +2784,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.0.0.tgz#4478e7ceaa5191fa9676a2daa7030211c31b1e7e" + integrity sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw== + dependencies: + flat-cache "^5.0.0" + file@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" @@ -2972,6 +2803,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + filter-obj@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" @@ -3002,15 +2840,6 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -3019,11 +2848,24 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat-cache@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-5.0.0.tgz#26c4da7b0f288b408bb2b506b2cb66c240ddf062" + integrity sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ== + dependencies: + flatted "^3.3.1" + keyv "^4.5.4" + flatted@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -3036,20 +2878,6 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -front-matter@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb" - dependencies: - js-yaml "^3.4.6" - -fs-extra@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -3099,18 +2927,6 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" -generate-function@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - dependencies: - is-property "^1.0.2" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3137,6 +2953,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -3144,19 +2967,12 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.3, glob@~7.1.1: +glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" dependencies: @@ -3190,6 +3006,22 @@ glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3202,10 +3034,6 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globals@^9.2.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -3213,30 +3041,22 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" + 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" -gonzales-pe-sl@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6" - dependencies: - minimist "1.1.x" +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== gopd@^1.0.1: version "1.0.1" @@ -3249,10 +3069,6 @@ graceful-fs@^4.1.2: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" -graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -3270,12 +3086,6 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -3333,6 +3143,11 @@ hosted-git-info@^5.0.0, hosted-git-info@^5.2.1: dependencies: lru-cache "^7.5.1" +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -3386,21 +3201,22 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" -ignore@^3.1.2: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +ignore@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + immutable@^4.0.0: version "4.2.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16" integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3445,13 +3261,14 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ini@^3.0.0, ini@^3.0.1: version "3.0.1" @@ -3471,24 +3288,6 @@ init-package-json@^3.0.2: validate-npm-package-license "^3.0.4" validate-npm-package-name "^4.0.0" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - internal-slot@^1.0.3, internal-slot@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" @@ -3595,16 +3394,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3627,20 +3416,6 @@ is-map@^2.0.1, is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-my-ip-valid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" - -is-my-json-valid@^2.10.0: - version "2.20.5" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz#5eca6a8232a687f68869b7361be1612e7512e5df" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -3658,22 +3433,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -3686,9 +3445,10 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-property@^1.0.0, is-property@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-regex@^1.1.4: version "1.1.4" @@ -3698,12 +3458,6 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" @@ -3761,10 +3515,6 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -3806,13 +3556,6 @@ js-sdsl@^4.1.4: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -3829,6 +3572,11 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-loader@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" @@ -3853,12 +3601,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -3876,25 +3618,11 @@ json5@^2.1.2, json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonpointer@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" - "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -3913,6 +3641,13 @@ just-diff@^5.0.1: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -3923,9 +3658,10 @@ klona@^2.0.4, klona@^2.0.5: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== -known-css-properties@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" +known-css-properties@^0.31.0: + version "0.31.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.31.0.tgz#5c8d9d8777b3ca09482b2397f6a241e5d69a1023" + integrity sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ== language-subtag-registry@~0.3.2: version "0.3.22" @@ -3939,13 +3675,6 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4112,27 +3841,20 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.capitalize@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.kebabcase@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.0.0, lodash@^4.3.0, lodash@~4.17.10: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" @@ -4205,19 +3927,43 @@ markdown-it@^12.3.2: mdurl "^1.0.1" uc.micro "^1.0.5" +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +meow@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" micromatch@^4.0.5: version "4.0.5" @@ -4246,7 +3992,7 @@ mini-css-extract-plugin@^2.6.1: dependencies: schema-utils "^4.0.0" -minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -4266,10 +4012,6 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimist@1.1.x: - version "1.1.3" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" - minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4361,7 +4103,7 @@ mkdirp-infer-owner@^2.0.0: infer-owner "^1.0.4" mkdirp "^1.0.3" -mkdirp@0.5.5, mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" dependencies: @@ -4390,10 +4132,6 @@ mrmime@^1.0.0: resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -4404,10 +4142,6 @@ ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -4418,6 +4152,11 @@ nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4662,11 +4401,7 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -4739,26 +4474,11 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -4771,10 +4491,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4857,7 +4573,7 @@ parse-conflict-json@^2.0.1, parse-conflict-json@^2.0.2: just-diff "^5.0.1" just-diff-apply "^5.2.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -4876,10 +4592,6 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -4900,25 +4612,16 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -4926,10 +4629,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - postcss-custom-properties@^12.1.10: version "12.1.11" resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" @@ -4954,6 +4653,11 @@ postcss-loader@^7.0.1: klona "^2.0.5" semver "^7.3.8" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -4982,6 +4686,21 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== + +postcss-safe-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz#6273d4e5149e286db5a45bc6cf6eafcad464014a" + integrity sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg== + +postcss-scss@^4.0.9: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== + postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.11" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" @@ -4990,6 +4709,14 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selecto cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" @@ -5004,28 +4731,25 @@ postcss@^8.2.14, postcss@^8.4.18, postcss@^8.4.19: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - proc-log@^2.0.0, proc-log@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" @@ -5138,18 +4862,6 @@ read@1, read@^1.0.7, read@~1.0.7: dependencies: mute-stream "~0.0.4" -readable-stream@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -5176,14 +4888,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - rechoir@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" @@ -5271,13 +4975,6 @@ require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" -require-uncached@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - requirejs@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" @@ -5290,10 +4987,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -5333,13 +5026,6 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -5350,12 +5036,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.2.8: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -5363,12 +5043,6 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -5376,18 +5050,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - safe-buffer@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -5407,26 +5073,6 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-lint@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f" - integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q== - dependencies: - commander "^2.8.1" - eslint "^2.7.0" - front-matter "2.1.2" - fs-extra "^3.0.1" - glob "^7.0.0" - globule "^1.0.0" - gonzales-pe-sl "^4.2.3" - js-yaml "^3.5.4" - known-css-properties "^0.3.0" - lodash.capitalize "^4.1.0" - lodash.kebabcase "^4.0.0" - merge "^1.2.0" - path-is-absolute "^1.0.0" - util "^0.10.3" - sass-loader@^13.1.0: version "13.2.0" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.0.tgz#80195050f58c9aac63b792fa52acb6f5e0f6bdc3" @@ -5505,10 +5151,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -5523,6 +5165,11 @@ signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sirv@^1.0.7: version "1.0.19" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" @@ -5532,9 +5179,19 @@ sirv@^1.0.7: mrmime "^1.0.0" totalist "^1.0.0" -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" smart-buffer@^4.2.0: version "4.2.0" @@ -5563,6 +5220,11 @@ socks@^2.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -5602,10 +5264,6 @@ split-on-first@^3.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - ssri@^9.0.0, ssri@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" @@ -5620,14 +5278,6 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -5637,13 +5287,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -5683,24 +5326,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -5708,6 +5333,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5722,13 +5354,90 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +stylelint-config-recommended-scss@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz#d3482c9817dada80b5ec01685b38fc8af8f7263f" + integrity sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw== + dependencies: + postcss-scss "^4.0.9" + stylelint-config-recommended "^14.0.0" + stylelint-scss "^6.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +stylelint-config-recommended@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz#b395c7014838d2aaca1755eebd914d0bb5274994" + integrity sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ== + +stylelint-config-sass-guidelines@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-11.1.0.tgz#0106f3ec4991a598823b55841bf45fce63268c8c" + integrity sha512-mVE3UmN8MlshK4Gb3eYk6f8tw9DkQ9yjMF4W9krlmpaNZpSXOdh13AL0sU7l/9l4Pnpt4KMobNNIRI0tJl56Cw== + dependencies: + postcss-scss "^4.0.9" + stylelint-scss "^6.2.1" + +stylelint-config-standard@^36.0.0: + version "36.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz#6704c044d611edc12692d4a5e37b039a441604d4" + integrity sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug== + dependencies: + stylelint-config-recommended "^14.0.0" + +stylelint-scss@^6.0.0, stylelint-scss@^6.2.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.3.1.tgz#eb56f23f4d3e0896647365ab1681653a00bdbc2b" + integrity sha512-w/czBoWUZxJNk5fBRPODcXSN4qcPv3WHjTSSpFovVY+TE3MZTMR0yRlbmaDYrm8tTWHvpwQAuEBZ0lk2wwkboQ== + dependencies: + known-css-properties "^0.31.0" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.1.0" + postcss-value-parser "^4.2.0" + +stylelint@^16.3.1: + version "16.6.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.6.1.tgz#84735aca2bb5cde535572b7a9b878d2ec983a570" + integrity sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q== + dependencies: + "@csstools/css-parser-algorithms" "^2.6.3" + "@csstools/css-tokenizer" "^2.3.1" + "@csstools/media-query-list-parser" "^2.1.11" + "@csstools/selector-specificity" "^3.1.1" + "@dual-bundle/import-meta-resolve" "^4.1.0" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^9.0.0" + css-functions-list "^3.2.2" + css-tree "^2.3.1" + debug "^4.3.4" + fast-glob "^3.3.2" + fastest-levenshtein "^1.0.16" + file-entry-cache "^9.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.3.1" + ignore "^5.3.1" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.31.0" + mathml-tag-names "^2.1.3" + meow "^13.2.0" + micromatch "^4.0.7" + normalize-path "^3.0.0" + picocolors "^1.0.1" + postcss "^8.4.38" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^7.0.0" + postcss-selector-parser "^6.1.0" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^7.1.0" + supports-hyperlinks "^3.0.0" + svg-tags "^1.0.0" + table "^6.8.2" + write-file-atomic "^5.0.1" supports-color@^4.0.0: version "4.5.0" @@ -5736,7 +5445,7 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -5750,21 +5459,34 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" +supports-hyperlinks@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz#c711352a5c89070779b4dad54c05a2f14b15c94b" + integrity sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +table@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" @@ -5809,10 +5531,6 @@ text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - tiny-relative-date@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" @@ -5840,10 +5558,6 @@ treeverse@^2.0.0: resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -5861,12 +5575,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -5881,10 +5589,6 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -5937,10 +5641,6 @@ unique-slug@^3.0.0: dependencies: imurmurhash "^0.1.4" -universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -5955,6 +5655,13 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +uri-js@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -5962,22 +5669,10 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -6127,6 +5822,13 @@ which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -6151,10 +5853,6 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6176,21 +5874,19 @@ write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== dependencies: - mkdirp "^0.5.1" + imurmurhash "^0.1.4" + signal-exit "^4.0.1" ws@^7.3.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" From 8c9745e0e273e7c11dfd2b92ca73598931f35747 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Mon, 29 Jul 2024 12:07:23 +1200 Subject: [PATCH 26/29] ENH Don't use keyword self --- src/Extension/FluentVersionedExtension.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Extension/FluentVersionedExtension.php b/src/Extension/FluentVersionedExtension.php index d985ba2c..f6474642 100644 --- a/src/Extension/FluentVersionedExtension.php +++ b/src/Extension/FluentVersionedExtension.php @@ -1023,7 +1023,7 @@ public function onAfterDuplicate($original, $doWrite, $relations): void $toID = $this->owner->ID; // Get localised table - $localisedTable = $this->getLocalisedTable($tableName) . self::SUFFIX_VERSIONS; + $localisedTable = $this->getLocalisedTable($tableName) . FluentVersionedExtension::SUFFIX_VERSIONS; // Remove existing translation versions from duplicated object DB::prepared_query("DELETE FROM \"$localisedTable\" WHERE \"RecordID\" = ?", [$toID]); @@ -1039,7 +1039,7 @@ public function onAfterDuplicate($original, $doWrite, $relations): void WHERE \"RecordID\" = ?", [$toID, $fromID]); // Also copy versions of base record - $versionsTableName = $tableName . self::SUFFIX_VERSIONS; + $versionsTableName = $tableName . FluentVersionedExtension::SUFFIX_VERSIONS; // Remove existing versions from duplicated object, created by onBeforeWrite DB::prepared_query("DELETE FROM \"$versionsTableName\" WHERE \"RecordID\" = ?", [$toID]); From 3935c63430992b23ada8ead8c30ecfc07a49fb81 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Thu, 1 Aug 2024 18:38:04 +1200 Subject: [PATCH 27/29] MNT Run module-standardiser (#868) --- .github/workflows/tag-patch-release.yml | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/tag-patch-release.yml diff --git a/.github/workflows/tag-patch-release.yml b/.github/workflows/tag-patch-release.yml new file mode 100644 index 00000000..c90c2a58 --- /dev/null +++ b/.github/workflows/tag-patch-release.yml @@ -0,0 +1,26 @@ +name: Tag patch release + +on: + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch + workflow_dispatch: + inputs: + latest_local_sha: + description: The latest local sha + required: true + type: string + +permissions: {} + +jobs: + tagpatchrelease: + name: Tag patch release + # Only run cron on the tractorcow-farm account + if: (github.event_name == 'schedule' && github.repository_owner == 'tractorcow-farm') || (github.event_name != 'schedule') + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Tag release + uses: silverstripe/gha-tag-release@v2 + with: + latest_local_sha: ${{ inputs.latest_local_sha }} From 41015aac1e318378c8074ae5ec01494cb839d89f Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:46:47 +1200 Subject: [PATCH 28/29] TLN Update translations (#870) --- lang/de.yml | 24 ++++++++- lang/es.yml | 1 - lang/sv.yml | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 lang/sv.yml diff --git a/lang/de.yml b/lang/de.yml index 477f08ee..431eb696 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -15,12 +15,15 @@ de: COPY_TO: 'Von {locale} in kopieren:' FLUENT_ICON_TOOLTIP: 'Übersetzbares Feld' LOCALISED: Lokalisiert + Localise: Lokalisieren + NOSOURCE: 'Keine Quelle' NOTLOCALISED: 'Nicht lokalisiert' UnlocaliseTooltip: '{Name} aus dem aktuellen Gebietsschema entfernen' TractorCow\Fluent\Extension\FluentFilteredExtension: FILTERED_LOCALES: 'Wird in folgenden Gebietsschemata angezeigt' LOCALEFILTEREDHELP: 'Diese Seite ist nicht sichbar in diesem Gebietsschema' TAB_LOCALES: Gebietsschemata + many_many_FilteredLocales: 'Gefilterte Sprachen' TractorCow\Fluent\Extension\FluentIsolatedExtension: has_one_Locale: Standardgebietsschema TractorCow\Fluent\Extension\FluentSiteTreeExtension: @@ -34,6 +37,7 @@ de: LIVENO: Nein LIVEYES: Ja MODIFIED: Geändert + NOSOURCE: 'Keine Quelle' NOTLOCALISED: 'Nicht lokalisiert' PUBLISHED: Veröffentlicht TractorCow\Fluent\Extension\Traits\FluentAdminTrait: @@ -42,12 +46,12 @@ de: CopyNotice: "'{title}' wurde in alle anderen Gebietsschemas kopiert." DeleteNotice: '"{title}" und alle seine Lokalisierungen wurden gelöscht.' HideNotice: "'{title}' wird in {locale} nicht mehr angezeigt." - Label_archiveFluent: 'Veröffentlichungen zurücknehmen und archivieren (alle Sprachen)' + Label_archiveFluent: 'Veröffentlichung zurücknehmen und archivieren (alle Sprachen)' Label_clearFluent: "Alle ausser '{title}' löschen" Label_copyFluent: "'{title}' in alle anderen Sprachen kopieren" Label_deleteFluent: 'Löschen (alle Sprachen)' Label_hideFluent: "In '{title}' verstecken" - Label_publishFluent: 'Speichern & veröffentlichen (alle Sprachen)' + Label_publishFluent: 'Speichern & Veröffentlichen (alle Sprachen)' Label_showFluent: "In '{title}' anzeigen" Label_unpublishFluent: 'Veröffentlichung zurücknehmen (alle Sprachen)' Localisation: Übersetzungen @@ -61,8 +65,18 @@ de: BaggeInvisible: '{type} ist in dieser Sprache nicht sichtbar' TractorCow\Fluent\Extension\Traits\FluentObjectTrait: TAB_LOCALISATION: Übersetzungen + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Eintrag in allen Sprachen löschen' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'In dieser Sprache löschen' TractorCow\Fluent\Forms\LocaleToggleColumn: DISPLAY_IN: 'Sichtbar?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'In dieser Sprache veröffentlichen' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'In dieser Sprache speichern' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'In dieser Sprache die Veröffentlichung zurücknehmen' TractorCow\Fluent\Forms\VisibleLocalesColumn: LocalesTitle: Gebietsschemata TractorCow\Fluent\Model\Domain: @@ -82,6 +96,7 @@ de: one: Fallback-Gebietsschema other: '{count} Fallback-Gebietsschemata' SINGULARNAME: Fallback-Gebietsschema + db_Sort: Sortierung has_one_Locale: Standardgebietsschema TractorCow\Fluent\Model\Locale: DEFAULT_NONE: (keine) @@ -91,11 +106,16 @@ de: LOCALE: Gebietsschema LOCALE_TITLE: Titel LOCALE_URL: URL-Segment + MULTI_LOCALE: 'Zugriff auf Mehr-Sprachen Aktionen (z.B. in allen Sprachen speichern)' PLURALNAME: Gebietsschemata PLURALS: one: Gebietsschema other: '{count} Gebietsschemata' SINGULARNAME: Gebietsschema + TIMEZONE: Zeitzone UnsavedNotice: 'Sie können Fallbacks hinzufügen, sobald Sie das Gebietsschema gespeichert haben.' db_Locale: Standardgebietsschema + db_Sort: Sortierung + db_Timezone: Zeitzone db_Title: Titel + db_URLSegment: URL-Segment diff --git a/lang/es.yml b/lang/es.yml index b365ceaa..e6428012 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -36,7 +36,6 @@ es: LOCALESTATUSFLUENTUNKNOWN: 'No hay contenido disponible para esta página. Por favor localize esta página o provea una configuración regional de respaldo.' TractorCow\Fluent\Extension\FluentVersionedExtension: DRAFT: Borrador - LIVENO: 'No' LIVEYES: Sí MODIFIED: Modificado NOSOURCE: 'Sin fuentes' diff --git a/lang/sv.yml b/lang/sv.yml new file mode 100644 index 00000000..6ee2b818 --- /dev/null +++ b/lang/sv.yml @@ -0,0 +1,137 @@ +sv: + SilverStripe\CMS\Controllers\CMSMain: + ARCHIVE: Arkiv + SilverStripe\CMS\Model\SiteTree: + BUTTONPUBLISHED: Publicerad + BUTTONSAVEPUBLISH: Publicera + TractorCow\Fluent\Control\LocaleAdmin: + MENUTITLE: Språk + TractorCow\Fluent\Extension\FluentBadgeExtension: + BadgeDefault: 'Standard språk' + BadgeInvisible: 'Översatt till {locale}' + BadgeLocalised: '{type} är inte synligt på detta språk' + TractorCow\Fluent\Extension\FluentExtension: + COPY_FROM: 'Kopiera till {locale} från:' + COPY_TO: 'Kopiera från {locale} till:' + FLUENT_ICON_TOOLTIP: 'Översättningsbart fält' + LOCALISED: Översatt + Localise: Översätt + NOSOURCE: 'Ingen källa' + NOTLOCALISED: 'Inte översatt' + Unlocalise: 'Ta bort översättning' + UnlocaliseTooltip: 'Ta bort {name} från detta språk' + TractorCow\Fluent\Extension\FluentFilteredExtension: + FILTERED_LOCALES: 'Visa i följande språk' + LOCALEFILTEREDHELP: 'Denna sida är inte synlig på detta språk' + TAB_LOCALES: Språk + many_many_FilteredLocales: 'Filtrerade språk' + TractorCow\Fluent\Extension\FluentIsolatedExtension: + has_one_Locale: Språk + TractorCow\Fluent\Extension\FluentSiteTreeExtension: + LOCALECOPYANDPUBLISH: 'Kopiera & publicera' + LOCALECOPYTODRAFT: 'Kopiera till utkast' + LOCALESTATUSFLUENTDRAFT: 'Ett utkast hat skapats för detta språk, publicerat innehåll kan ändå vara ärvd från annat innehåll. Använd knappen "Spara & publicera" för att publicera innehållet för detta språk.' + LOCALESTATUSFLUENTINHERITED: 'Innehåll för denna sida kan vara ärvd från ett annat språk. Var god använd knappen "Kopiera" om du vill kopiera denna sida.' + LOCALESTATUSFLUENTINVISIBLE: 'Denna sida kommer inte att vara synlig på detta språk förrän den har publicerats.' + LOCALESTATUSFLUENTUNKNOWN: 'Inget innehåll tillgängligt för denna sida. Var god översätt denna sida eller ange ett språk som reserv.' + TractorCow\Fluent\Extension\FluentVersionedExtension: + DRAFT: Utkast + LIVENO: Nej + LIVEYES: Ja + MODIFIED: Ändrad + NOSOURCE: 'Ingen källa' + NOTLOCALISED: 'Inte översatt' + PUBLISHED: Publicerad + TractorCow\Fluent\Extension\Traits\FluentAdminTrait: + ArchiveNotice: "Arkiverade '{title}' och alla dess översättningar." + ClearAllNotice: "Alla översättningar har tömts för '{title}'." + CopyNotice: "Kopierade '{title}' till alla andra språk." + DeleteNotice: "Raderade '{title}' och alla dess översättningar." + HideNotice: "Raden '{title}' är nu gömd för språk {locale}" + Label_archiveFluent: 'Avpublicera och arkivera (alla språk)' + Label_clearFluent: "Töm från alla förutom '{title}'" + Label_copyFluent: "Kopiera '{title}' till andra språk" + Label_deleteFluent: 'Radera (alla språk)' + Label_hideFluent: "Göm från '{title}'" + Label_publishFluent: 'Spara och publicera (alla språk)' + Label_showFluent: "Visa i '{title}'" + Label_unpublishFluent: 'Avpublicera (alla språk)' + Localisation: Översättning + PublishNotice: "Publicerade '{title}' för alla språk." + ShowNotice: "Rad '{title}' är nu synlig i {locale}" + UnpublishNotice: "Avpublicerade '{title}' från alla språk." + TractorCow\Fluent\Extension\Traits\FluentBadgeTrait: + BadgeInherited: 'Ärvd från {locale}' + BadgeLocalised: 'Översatt till {locale}' + BaggeInvisible: '{type} har inget innehåll i {locale}, översätt {type} eller ange ett språk som reserv' + TractorCow\Fluent\Extension\Traits\FluentObjectTrait: + TAB_LOCALISATION: Översättning + TractorCow\Fluent\Forms\DeleteAllLocalesAction: + Delete: 'Radera rad i alla språk' + TractorCow\Fluent\Forms\DeleteLocaleAction: + DELETE: 'Radera i detta språk' + TractorCow\Fluent\Forms\LocaleToggleColumn: + DISPLAY_IN: 'Synlig?' + TractorCow\Fluent\Forms\PublishAction: + PUBLISH: 'Publicera i detta språk' + TractorCow\Fluent\Forms\SaveLocaleAction: + SAVE: 'Spara i detta språk' + TractorCow\Fluent\Forms\UnpublishAction: + UNPUBLISH: 'Avpublicera i detta språk' + TractorCow\Fluent\Forms\VisibleLocalesColumn: + LocalesTitle: Språk + TractorCow\Fluent\Model\Domain: + DEFAULT: 'Standard språk' + DEFAULT_NONE: (ingen) + DOMAIN_HOSTNAME: 'Domän Hostnamn' + DOMAIN_LOCALES: Språk + PLURALNAME: Domäner + PLURALS: + one: 'En Domän' + other: '{count} Domäner' + SINGULARNAME: Domän + UnsavedNotice: 'Du kan lägga till språk efter att du sparat domänen.' + db_Domain: Domän + has_many_Locales: Språk + has_one_DefaultLocale: 'Standard språk' + TractorCow\Fluent\Model\FallbackLocale: + LOCALE: Språk + PLURALNAME: 'Reserv språk' + PLURALS: + one: 'Standard språk' + other: '{count} Reserv språk' + SINGULARNAME: 'Reserv språk' + db_Sort: Sortera + has_one_Locale: Språk + has_one_Parent: Förälder + TractorCow\Fluent\Model\Locale: + DEFAULT_NONE: (ingen) + DOMAIN: Domän + EDIT_LOCALE: 'Öppna "{title}" ({locale})' + FALLBACKS: 'Reserv språk' + IS_DEFAULT: 'Detta är det globala standard språket' + IS_DEFAULT_DESCRIPTION: 'Notera: Domän specifika språl kan tilldelas via Språk tabben och ersätter detta värde för specifika domäner.' + LOCALE: Språk + LOCALE_TITLE: Titel + LOCALE_URL: 'URL Värde' + MULTI_LOCALE: 'Åtkomst till multi-språk åtgärder (t.ex. spara i alla språk)' + PERMISSION: Översättning + PLURALNAME: Språk + PLURALS: + one: 'Ett språk' + other: '{count} Språk' + SINGULARNAME: Språk + TIMEZONE: Tidszon + USE_X_DEFAULT: 'Använd {code} som SEO språkkod (använd som global)' + USE_X_DEFAULT_DESCRIPTION: 'Användning av denna kod berättar för sökmotorer att detta är en språkneutral global startsida' + UnsavedNotice: 'Du kan lägga till reserv språk efter att du sparat språket.' + db_IsGlobalDefault: 'Är global standard' + db_Locale: Språk + db_Sort: Sortera + db_Timezone: Tidszon + db_Title: Titel + db_URLSegment: 'URL värde' + db_UseDefaultCode: 'Använd standardkod' + has_many_FallbackLocales: 'Reserv språk' + has_one_Domain: Domän + many_many_Fallbacks: Reserv From 8f7d8032690da59e9c8aca9ff8ad4140da2a97c0 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Tue, 13 Aug 2024 17:03:40 +1200 Subject: [PATCH 29/29] FIX Correct trailing slash for locale in another domain (#872) --- src/Extension/FluentSiteTreeExtension.php | 5 ++++- src/Model/Locale.php | 7 ++++++- .../Extension/FluentSiteTreeExtensionTest.php | 19 ++++++++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Extension/FluentSiteTreeExtension.php b/src/Extension/FluentSiteTreeExtension.php index 0eedf5dc..3f09f2f0 100644 --- a/src/Extension/FluentSiteTreeExtension.php +++ b/src/Extension/FluentSiteTreeExtension.php @@ -153,7 +153,10 @@ public function updateLink(&$link, &$action, &$relativeLink) return; } - // Prefix with domain + // Prefix with domain, making sure trailing slash is normalised correctly. + if ($link === '/' || $link === '') { + $link = Controller::config()->get('add_trailing_slash') ? '/' : ''; + } $link = Controller::join_links($domain->Link(), $link); } diff --git a/src/Model/Locale.php b/src/Model/Locale.php index b7b5f1ef..d555f974 100644 --- a/src/Model/Locale.php +++ b/src/Model/Locale.php @@ -580,9 +580,14 @@ public function getBaseURL() if ($append) { // Append locale url segment - $base = Controller::join_links($base, $this->getURLSegment(), '/'); + $base = Controller::join_links($base, $this->getURLSegment()); } + // Normalise trailing slash + // Can't use Controller::normaliseTrailingSlash() because that doesn't + // take locale domains into account + $base = rtrim($base, '/') . (Controller::config()->get('add_trailing_slash') ? '/' : ''); + return $base; } diff --git a/tests/php/Extension/FluentSiteTreeExtensionTest.php b/tests/php/Extension/FluentSiteTreeExtensionTest.php index aa0e1d97..b166f31f 100644 --- a/tests/php/Extension/FluentSiteTreeExtensionTest.php +++ b/tests/php/Extension/FluentSiteTreeExtensionTest.php @@ -75,8 +75,8 @@ public function testGetLocaleInformation() $this->assertEquals('English (New Zealand)', $result->getTitle()); $this->assertEquals('English', $result->getLanguageNative()); $this->assertEquals('en', $result->getLanguage()); - $this->assertEquals(Controller::normaliseTrailingSlash('/newzealand/a-page/'), $result->getLink()); - $this->assertEquals(Controller::normaliseTrailingSlash('http://mocked/newzealand/a-page/'), $result->getAbsoluteLink()); + $this->assertEquals($this->normaliseTrailingSlash('/newzealand/a-page/'), $result->getLink()); + $this->assertEquals($this->normaliseTrailingSlash('http://mocked/newzealand/a-page/'), $result->getAbsoluteLink()); $this->assertEquals('link', $result->getLinkingMode()); $this->assertEquals('newzealand', $result->getURLSegment()); }); @@ -180,7 +180,7 @@ function (FluentState $newState) use ($domain, $locale, $prefixDisabled, $pageNa /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, $pageName); - $this->assertEquals(Controller::normaliseTrailingSlash($url), $page->Link()); + $this->assertEquals($this->normaliseTrailingSlash($url), $page->Link()); } ); } @@ -562,4 +562,17 @@ public function localeFallbackProvider(): array ], ]; } + + /** + * Normalises a test URL's trailing slash, but ignores complexities + * such as whether the domain host in the UR matches Director::host() + */ + private function normaliseTrailingSlash(string $testURL): string + { + if ($testURL === '/' || $testURL === '') { + return '/'; + } + $slash = Controller::config()->get('add_trailing_slash') ? '/' : ''; + return (rtrim($testURL, '/')) . $slash; + } }