From b539c1a996d4a4ed981a0055e862d6695adc40e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Fri, 16 Aug 2024 21:05:52 +0200 Subject: [PATCH 01/64] Rename `render_map` Twig function `ux_map` --- src/Map/CHANGELOG.md | 5 +++++ src/Map/doc/index.rst | 8 ++++---- src/Map/src/Bridge/Google/README.md | 2 +- src/Map/src/Bridge/Leaflet/README.md | 2 +- src/Map/src/Twig/MapExtension.php | 8 +++++++- src/Map/tests/TwigTest.php | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/Map/CHANGELOG.md b/src/Map/CHANGELOG.md index 9603bd3c5f1..ab2bdd9e3b2 100644 --- a/src/Map/CHANGELOG.md +++ b/src/Map/CHANGELOG.md @@ -2,4 +2,9 @@ ## Unreleased +- Rename `render_map` Twig function `ux_map` +- Deprecate `render_map` Twig function + +## 2.19 + - Component added diff --git a/src/Map/doc/index.rst b/src/Map/doc/index.rst index 70dc9d386a9..e3788243291 100644 --- a/src/Map/doc/index.rst +++ b/src/Map/doc/index.rst @@ -120,14 +120,14 @@ A map is created by calling ``new Map()``. You can configure the center, zoom, a } } -To render a map in your Twig template, use the ``render_map`` Twig function, e.g.: +To render a map in your Twig template, use the ``ux_map`` Twig function, e.g.: .. code-block:: twig - {{ render_map(my_map) }} + {{ ux_map(my_map) }} {# or with custom attributes #} - {{ render_map(my_map, { style: 'height: 300px' }) }} + {{ ux_map(my_map, { style: 'height: 300px' }) }} Extend the default behavior ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -207,7 +207,7 @@ Then, you can use this controller in your template: .. code-block:: twig - {{ render_map(my_map, { 'data-controller': 'mymap', style: 'height: 300px' }) }} + {{ ux_map(my_map, { 'data-controller': 'mymap', style: 'height: 300px' }) }} Backward Compatibility promise ------------------------------ diff --git a/src/Map/src/Bridge/Google/README.md b/src/Map/src/Bridge/Google/README.md index 0d6bd01e0b3..d46bd700833 100644 --- a/src/Map/src/Bridge/Google/README.md +++ b/src/Map/src/Bridge/Google/README.md @@ -90,7 +90,7 @@ A common use case is to customize the marker. You can listen to the `ux:map:mark Assuming you have a map with a custom controller: ```twig -{{ render_map(map, {'data-controller': 'my-map' }) }} +{{ ux_map(map, {'data-controller': 'my-map' }) }} ``` You can create a Stimulus controller to customize the markers before they are created: diff --git a/src/Map/src/Bridge/Leaflet/README.md b/src/Map/src/Bridge/Leaflet/README.md index 219cf511592..9618f9ba71b 100644 --- a/src/Map/src/Bridge/Leaflet/README.md +++ b/src/Map/src/Bridge/Leaflet/README.md @@ -47,7 +47,7 @@ A common use case is to customize the marker. You can listen to the `ux:map:mark Assuming you have a map with a custom controller: ```twig -{{ render_map(map, {'data-controller': 'my-map' }) }} +{{ ux_map(map, {'data-controller': 'my-map' }) }} ``` You can create a Stimulus controller to customize the markers before they are created: diff --git a/src/Map/src/Twig/MapExtension.php b/src/Map/src/Twig/MapExtension.php index b55e5de562d..b78e8ccbabf 100644 --- a/src/Map/src/Twig/MapExtension.php +++ b/src/Map/src/Twig/MapExtension.php @@ -24,6 +24,12 @@ final class MapExtension extends AbstractExtension { public function getFunctions(): iterable { - yield new TwigFunction('render_map', [Renderers::class, 'renderMap'], ['is_safe' => ['html']]); + yield new TwigFunction('render_map', [Renderers::class, 'renderMap'], [ + 'is_safe' => ['html'], + 'deprecated' => '2.20', + 'deprecating_package' => 'symfony/ux-map', + 'alternative' => 'ux_map', + ]); + yield new TwigFunction('ux_map', [Renderers::class, 'renderMap'], ['is_safe' => ['html']]); } } diff --git a/src/Map/tests/TwigTest.php b/src/Map/tests/TwigTest.php index 39a94fd42d4..b69da03401b 100644 --- a/src/Map/tests/TwigTest.php +++ b/src/Map/tests/TwigTest.php @@ -44,7 +44,7 @@ public function testRenderMap(): void $twig = self::getContainer()->get('twig'); $twig->setLoader(new ChainLoader([ new ArrayLoader([ - 'test' => '{{ render_map(map, attributes) }}', + 'test' => '{{ ux_map(map, attributes) }}', ]), $twig->getLoader(), ])); From 1420976bea0e0ea3ded765c33917c80b6e35ba81 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Sat, 17 Aug 2024 21:26:56 +0200 Subject: [PATCH 02/64] chore: run PHP-CS-Fixer --- src/Icons/src/Twig/UXIconRuntime.php | 1 + .../tests/Unit/Twig/LiveComponentRuntimeTest.php | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Icons/src/Twig/UXIconRuntime.php b/src/Icons/src/Twig/UXIconRuntime.php index cac051aea84..7276ac08644 100644 --- a/src/Icons/src/Twig/UXIconRuntime.php +++ b/src/Icons/src/Twig/UXIconRuntime.php @@ -40,6 +40,7 @@ public function renderIcon(string $name, array $attributes = []): string } catch (IconNotFoundException $e) { if ($this->ignoreNotFound) { $this->logger?->warning($e->getMessage()); + return ''; } diff --git a/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php b/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php index 654ee92e785..30c3ba8cbbf 100644 --- a/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php +++ b/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php @@ -28,17 +28,17 @@ public function testGetLiveAction(): void $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-some-prop-param="val2" data-live-action-param="action-name"', $props); $props = $runtime->liveAction('action-name', ['prop1' => 'val1', 'prop2' => 'val2'], ['debounce' => 300]); - $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name:prevent', ['pro1' => 'val1', 'prop2' => 'val2'], ['debounce' => 300]); - $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name:prevent', [], ['debounce' => 300]); - $this->assertSame('data-action="live#action:prevent" data-live-action-param="debounce(300)|action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="live#action:prevent" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); $props = $runtime->liveAction('action-name', [], [], 'keydown.esc'); - $this->assertSame('data-action="keydown.esc->live#action" data-live-action-param="action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="keydown.esc->live#action" data-live-action-param="action-name"', html_entity_decode($props)); } } From 56d4a4fb63999370bd71075b482d9345efd8245b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 18 Aug 2024 23:35:33 +0200 Subject: [PATCH 03/64] Configure ISSUE_TEMPLATE Add a issue template type selector. Live demo: https://github.com/smnandre/ux-issues/issues/new/choose This is a start that allow to: * differenciate bug & features * add tags automatically * expose the symfony support page I'd like to release this first step asap.. and then iterate on the different forms. --- .github/ISSUE_TEMPLATE/1-bug_report.md | 8 ++++++++ .github/ISSUE_TEMPLATE/2-feature_request.md | 8 ++++++++ .github/ISSUE_TEMPLATE/3-documentation.md | 9 +++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 +++++ 4 files changed, 30 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/1-bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/2-feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/3-documentation.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/1-bug_report.md b/.github/ISSUE_TEMPLATE/1-bug_report.md new file mode 100644 index 00000000000..03391625afb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug_report.md @@ -0,0 +1,8 @@ +--- +name: '🐞 Bug Report' +about: Report a bug in existing features +title: '' +labels: 'bug' +assignees: '' + +--- diff --git a/.github/ISSUE_TEMPLATE/2-feature_request.md b/.github/ISSUE_TEMPLATE/2-feature_request.md new file mode 100644 index 00000000000..a6e92dc1a1a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-feature_request.md @@ -0,0 +1,8 @@ +--- +name: '🚀 Feature Request' +about: Suggest ideas for new features or enhancements +title: '' +labels: 'RFC' +assignees: '' + +--- diff --git a/.github/ISSUE_TEMPLATE/3-documentation.md b/.github/ISSUE_TEMPLATE/3-documentation.md new file mode 100644 index 00000000000..712f63603a5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-documentation.md @@ -0,0 +1,9 @@ +--- +name: '📖 Documentation' +about: Help us improve the documentation! +title: '' +labels: 'docs' +assignees: '' + +--- + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000000..42a08775563 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: 🛟 Support / help + url: https://symfony.com/support + about: Ask your questions about Symfony UX From 89552aac479722247e03abae86a7030c6f20911f Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 7 Aug 2024 15:39:56 +0200 Subject: [PATCH 04/64] Fix: Original Throwable get lost during component render --- src/TwigComponent/src/Twig/ComponentExtension.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/TwigComponent/src/Twig/ComponentExtension.php b/src/TwigComponent/src/Twig/ComponentExtension.php index 82fa37a972a..14f30c382da 100644 --- a/src/TwigComponent/src/Twig/ComponentExtension.php +++ b/src/TwigComponent/src/Twig/ComponentExtension.php @@ -120,10 +120,6 @@ private function throwRuntimeError(string $name, \Throwable $e): void throw $e; } - if (!($e instanceof \Exception)) { - $e = new \Exception($e->getMessage(), $e->getCode(), $e->getPrevious()); - } - - throw new RuntimeError(\sprintf('Error rendering "%s" component: %s', $name, $e->getMessage()), previous: $e); + throw new RuntimeError(\sprintf('Error rendering "%s" component: "%s"', $name, $e->getMessage()), previous: $e); } } From 09597b3020c8ffd6a5c3818664c25823c42d78af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 17 Aug 2024 23:51:14 +0200 Subject: [PATCH 05/64] [CI] Update php-cs-fixer config --- .php-cs-fixer.dist.php | 2 - composer.json | 2 +- src/Icons/src/Twig/UXIconRuntime.php | 1 + .../Integration/LiveComponentHydratorTest.php | 118 +++++++++--------- .../Unit/Attribute/AsLiveComponentTest.php | 6 +- .../tests/Unit/Attribute/LivePropTest.php | 6 +- .../Unit/Twig/LiveComponentRuntimeTest.php | 8 +- src/Map/tests/MapTest.php | 2 +- src/Turbo/src/TurboBundle.php | 2 +- .../src/Attribute/AsTwigComponent.php | 2 - .../Integration/ComponentFactoryTest.php | 2 +- .../Unit/Attribute/AsTwigComponentTest.php | 4 +- .../tests/Unit/ComponentAttributesTest.php | 4 +- .../Unit/ComputedPropertiesProxyTest.php | 16 +-- .../TwigComponentExtensionTest.php | 2 +- ux.symfony.com/.php-cs-fixer.dist.php | 3 - 16 files changed, 87 insertions(+), 93 deletions(-) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 9e576f2108a..a8c7da94b14 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -29,8 +29,6 @@ '@Symfony' => true, '@Symfony:risky' => true, 'header_comment' => ['header' => $fileHeaderComment], - // TODO: Remove once the "compiler_optimized" set includes "sprintf" - 'native_function_invocation' => ['include' => ['@compiler_optimized', 'sprintf'], 'scope' => 'namespaced', 'strict' => true], 'trailing_comma_in_multiline' => ['elements' => ['arrays', 'match', 'parameters']], ]) ->setRiskyAllowed(true) diff --git a/composer.json b/composer.json index 0674798974e..271f27ec4b1 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,6 @@ "require-dev": { "symfony/filesystem": "^5.2|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", - "php-cs-fixer/shim": "^3.13" + "php-cs-fixer/shim": "^3.62" } } diff --git a/src/Icons/src/Twig/UXIconRuntime.php b/src/Icons/src/Twig/UXIconRuntime.php index cac051aea84..7276ac08644 100644 --- a/src/Icons/src/Twig/UXIconRuntime.php +++ b/src/Icons/src/Twig/UXIconRuntime.php @@ -40,6 +40,7 @@ public function renderIcon(string $name, array $attributes = []): string } catch (IconNotFoundException $e) { if ($this->ignoreNotFound) { $this->logger?->warning($e->getMessage()); + return ''; } diff --git a/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php b/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php index 2441146fccd..d29a1ab4d6c 100644 --- a/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php +++ b/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php @@ -151,7 +151,7 @@ public function testCanDehydrateAndHydrateComponentWithTestCases(callable $testF public static function provideDehydrationHydrationTests(): iterable { yield 'onUpdated: exception if method not exists' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true, onUpdated: 'onFirstNameUpdated')] public string $firstName; }) @@ -161,7 +161,7 @@ public static function provideDehydrationHydrationTests(): iterable }]; yield 'onUpdated: with scalar value' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true, onUpdated: 'onFirstNameUpdated')] public string $firstName; @@ -184,7 +184,7 @@ public function onFirstNameUpdated($oldValue) 'name' => 'Chicken', ])->object(); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name'], onUpdated: ['name' => 'onNameUpdated'])] public ProductFixtureEntity $product; @@ -208,7 +208,7 @@ public function onNameUpdated($oldValue) \assert($entityOriginal instanceof Entity1); \assert($entityNext instanceof Entity1); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: [LiveProp::IDENTITY], onUpdated: [LiveProp::IDENTITY => 'onEntireEntityUpdated'])] public Entity1 $entity1; @@ -235,7 +235,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'string: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public string $firstName; }) @@ -247,7 +247,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'string: changing non-writable causes checksum fail' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public string $firstName; }) @@ -258,7 +258,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'string: changing writable field works' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public string $firstName; }) @@ -272,7 +272,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'float: precision change to the frontend works ok' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public float $price; }) @@ -293,7 +293,7 @@ public function onEntireEntityUpdated($oldValue) yield 'DateTime: (de)hydrates correctly' => [function () { $date = new \DateTime('2023-03-05 9:23', new \DateTimeZone('America/New_York')); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public \DateTime $createdAt; }) @@ -312,7 +312,7 @@ public function onEntireEntityUpdated($oldValue) $entity1 = create(Entity1::class)->object(); \assert($entity1 instanceof Entity1); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public Entity1 $entity1; }) @@ -333,7 +333,7 @@ public function onEntireEntityUpdated($oldValue) \assert($entityOriginal instanceof Entity1); \assert($entityNext instanceof Entity1); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public Entity1 $entity1; }) @@ -354,7 +354,7 @@ public function onEntireEntityUpdated($oldValue) \assert($entityOriginal instanceof Entity1); \assert($entityNext instanceof Entity1); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: [LiveProp::IDENTITY])] public Entity1 $entity1; }) @@ -374,7 +374,7 @@ public function onEntireEntityUpdated($oldValue) 'name' => 'Rubber Chicken', ])->object(); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name'])] public ProductFixtureEntity $product; }) @@ -402,7 +402,7 @@ public function onEntireEntityUpdated($oldValue) yield 'Persisted entity: deleting entity between dehydration and hydration sets it to null' => [function () { $product = create(ProductFixtureEntity::class); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { // test that event the writable path doesn't cause problems #[LiveProp(writable: ['name'])] public ?ProductFixtureEntity $product; @@ -422,7 +422,7 @@ public function onEntireEntityUpdated($oldValue) yield 'Persisted entity: with custom_normalizer and embeddable (de)hydrates correctly' => [function () { $entity2 = create(Entity2::class, ['embedded1' => new Embeddable1('bar'), 'embedded2' => new Embeddable2('baz')])->object(); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(useSerializerForHydration: true)] public Entity2 $entity2; }) @@ -445,7 +445,7 @@ public function onEntireEntityUpdated($oldValue) $product->name = 'original name'; $product->price = 333; - return HydrationTest::create(new class() { + return HydrationTest::create(new class { // make a path writable, just to be tricky #[LiveProp(writable: ['price'])] public ProductFixtureEntity $product; @@ -469,7 +469,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Index array: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public array $foods = []; }) @@ -485,7 +485,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Index array: writable allows all keys to change' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public array $foods = []; }) @@ -503,7 +503,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: (de)hyrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public array $options = []; }) @@ -530,7 +530,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: fully writable allows anything to change' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public array $options = []; }) @@ -558,7 +558,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: fully writable allows partial changes' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public array $options = []; }) @@ -583,7 +583,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: fully writable allows deep partial changes' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true, fieldName: 'invoice')] public array $formData = []; }) @@ -625,7 +625,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: writable paths allow those to change' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['character'])] public array $options = []; }) @@ -655,7 +655,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: writable paths do not allow OTHER keys to change' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['character'])] public array $options = []; }) @@ -678,7 +678,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: support for multiple levels of writable path' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['details.key1'])] public array $stuff = []; }) @@ -704,7 +704,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: a writable path can itself be an array' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['details'])] public array $stuff = []; }) @@ -732,7 +732,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Empty array: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public array $foods = []; }) @@ -777,7 +777,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Enum: null remains null' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public ?IntEnum $int = null; @@ -794,7 +794,7 @@ public function onEntireEntityUpdated($oldValue) }, 80100]; yield 'Enum: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public ?IntEnum $int = null; @@ -813,7 +813,7 @@ public function onEntireEntityUpdated($oldValue) }, 80100]; yield 'Enum: writable enums can be changed' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?IntEnum $int = null; }) @@ -826,7 +826,7 @@ public function onEntireEntityUpdated($oldValue) }, 80100]; yield 'Enum: null-like enum values are handled correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?ZeroIntEnum $zeroInt = null; @@ -856,7 +856,7 @@ public function onEntireEntityUpdated($oldValue) }, 80100]; yield 'Enum: nullable enum with invalid value sets to null' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?IntEnum $int = null; }) @@ -870,7 +870,7 @@ public function onEntireEntityUpdated($oldValue) }, 80100]; yield 'Object: (de)hydrates DTO correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?Address $address = null; @@ -897,7 +897,7 @@ public function mount() }]; yield 'Object: (de)hydrates correctly multidementional DTO' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?CustomerDetails $customerDetails = null; @@ -930,7 +930,7 @@ public function mount() }]; yield 'Object: (de)hydrates correctly array of DTO' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { /** * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\CustomerDetails[] $customerDetailsCollection */ @@ -975,7 +975,7 @@ public function mount() $address3 = create(Address::class, ['address' => '124 Conch St.', 'city' => 'Bikini Bottom'])->object(); $address4 = create(Address::class, ['address' => '32 Windsor Gardens', 'city' => 'London'])->object(); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { /** * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address[] */ @@ -1006,7 +1006,7 @@ public function mount() $address1 = create(Address::class, ['address' => '1600 Pennsylvania Avenue', 'city' => 'Washington DC'])->object(); $address2 = create(Address::class, ['address' => '221 B Baker St', 'city' => 'Birmingham'])->object(); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { /** * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address[] */ @@ -1034,7 +1034,7 @@ public function mount() }]; yield 'Array with DTOs: fully writable allows deep partial changes' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { /** * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\HoldsArrayOfDtos[] */ @@ -1091,7 +1091,7 @@ public function mount() }]; yield 'Object: (de)hydrates nested objects with phpdoc typehints' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?ParentDTO $parent = null; @@ -1120,7 +1120,7 @@ public function mount() }]; yield 'Object: using custom normalizer (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(useSerializerForHydration: true)] public Money $money; }) @@ -1136,7 +1136,7 @@ public function mount() }]; yield 'Object: dehydrates to array works correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(useSerializerForHydration: true)] public Temperature $temperature; }) @@ -1155,7 +1155,7 @@ public function mount() }]; yield 'Collection: using serializer (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { /** @var \Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Temperature[] */ #[LiveProp(useSerializerForHydration: true)] public array $temperatures = []; @@ -1195,7 +1195,7 @@ public function mount() $product->name = 'original name'; $product->price = 333; - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['price'])] public ProductFixtureEntity $product; }) @@ -1208,7 +1208,7 @@ public function mount() }]; yield 'Updating non-writable property is rejected' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp()] public string $name; }) @@ -1221,7 +1221,7 @@ public function mount() }]; yield 'Context: Pass (de)normalization context' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(serializationContext: ['groups' => 'foo'])] public string $name; @@ -1257,7 +1257,7 @@ public function mount() }]; yield 'It is valid to dehydrate to a fully-writable array' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true, dehydrateWith: 'dehydrateDate', hydrateWith: 'hydrateDate')] public \DateTime $createdAt; @@ -1300,7 +1300,7 @@ public function hydrateDate($data) yield 'Use the format option to control the date format' => [function () { return HydrationTest::create( - new class() { + new class { #[LiveProp(writable: true, format: 'Y. m. d.')] public \DateTime $createdAt; @@ -1326,7 +1326,7 @@ public function __construct() yield 'Uses LiveProp modifiers on component dehydration' => [function () { return HydrationTest::create( - new class() { + new class { #[LiveProp(writable: true, modifier: 'modifySearchProp')] public ?string $search = null; @@ -1379,7 +1379,7 @@ public function testHydrationWithInvalidDate(): void $this->expectExceptionMessage('The model path "createdAt" was sent invalid date data "0" or in an invalid format. Make sure it\'s a valid date and it matches the expected format "Y. m. d.".'); $this->executeHydrationTestCase(function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true, format: 'Y. m. d.')] public \DateTime $createdAt; @@ -1403,7 +1403,7 @@ public function __construct() public function testPassingArrayToWritablePropForHydrationIsNotAllowed(): void { - $component = new class() { + $component = new class { #[LiveProp(writable: true)] public \DateTime $createdAt; @@ -1434,7 +1434,7 @@ public function __construct() public function testInterfaceTypedLivePropCannotBeHydrated(): void { - $componentClass = new class() { + $componentClass = new class { #[LiveProp(writable: true)] public ?SimpleDtoInterface $prop = null; }; @@ -1453,7 +1453,7 @@ public function testInterfaceTypedLivePropCannotBeHydrated(): void public function testInterfaceTypedLivePropCannotBeDehydrated(): void { - $componentClass = new class() { + $componentClass = new class { #[LiveProp(writable: true)] public ?SimpleDtoInterface $prop = null; }; @@ -1478,7 +1478,7 @@ public function testInvalidTypeHydration(callable $testFactory, ?int $minPhpVers public static function provideInvalidHydrationTests(): iterable { yield 'invalid_types_string_to_number_uses_coerced' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public int $count; }) @@ -1491,7 +1491,7 @@ public static function provideInvalidHydrationTests(): iterable }]; yield 'invalid_types_array_to_string_is_rejected' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public string $name; }) @@ -1508,7 +1508,7 @@ public static function provideInvalidHydrationTests(): iterable 'price' => 199, ])->object(); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name', 'price'])] public ProductFixtureEntity $product; }) @@ -1525,7 +1525,7 @@ public static function provideInvalidHydrationTests(): iterable }]; yield 'invalid_types_enum_with_an_invalid_value' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public ?IntEnum $nullableInt = null; @@ -1554,7 +1554,7 @@ public static function provideInvalidHydrationTests(): iterable }, 80100]; yield 'writable_path_with_type_problem_ignored' => [function () { - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name'])] public CategoryFixtureEntity $category; }) @@ -1587,7 +1587,7 @@ public function testHydrationFailsOnChecksumMismatch(): void public function testHydrationTakeUpdatedParentPropsIntoAccount(): void { - $component = new class() { + $component = new class { #[LiveProp(writable: true)] public string $name = 'Ryan'; @@ -1621,7 +1621,7 @@ public function testHydrationTakeUpdatedParentPropsIntoAccount(): void public function testHydrationWithUpdatesParentPropsAndBadChecksumFails(): void { - $component = new class() { + $component = new class { #[LiveProp(updateFromParent: true)] public string $name = 'Ryan'; }; diff --git a/src/LiveComponent/tests/Unit/Attribute/AsLiveComponentTest.php b/src/LiveComponent/tests/Unit/Attribute/AsLiveComponentTest.php index 9e443c7179a..6dcf8029e59 100644 --- a/src/LiveComponent/tests/Unit/Attribute/AsLiveComponentTest.php +++ b/src/LiveComponent/tests/Unit/Attribute/AsLiveComponentTest.php @@ -29,7 +29,7 @@ final class AsLiveComponentTest extends TestCase public function testPreDehydrateMethodsAreOrderedByPriority(): void { $hooks = AsLiveComponent::preDehydrateMethods( - new class() { + new class { #[PreDehydrate(priority: -10)] public function hook1() { @@ -56,7 +56,7 @@ public function hook3() public function testPostHydrateMethodsAreOrderedByPriority(): void { $hooks = AsLiveComponent::postHydrateMethods( - new class() { + new class { #[PostHydrate(priority: -10)] public function hook1() { @@ -83,7 +83,7 @@ public function hook3() public function testPreMountHooksAreOrderedByPriority(): void { $hooks = AsLiveComponent::preReRenderMethods( - new class() { + new class { #[PreReRender(priority: -10)] public function hook1() { diff --git a/src/LiveComponent/tests/Unit/Attribute/LivePropTest.php b/src/LiveComponent/tests/Unit/Attribute/LivePropTest.php index 5ffd4d928a1..be867516f4e 100644 --- a/src/LiveComponent/tests/Unit/Attribute/LivePropTest.php +++ b/src/LiveComponent/tests/Unit/Attribute/LivePropTest.php @@ -33,14 +33,14 @@ public function testDehydrateWithMethod(): void public function testCanCallCalculateFieldNameAsString(): void { - $component = new class() {}; + $component = new class {}; $this->assertSame('field', (new LiveProp(false, null, null, false, [], 'field'))->calculateFieldName($component, 'fallback')); } public function testCanCallCalculateFieldNameAsMethod(): void { - $component = new class() { + $component = new class { public function fieldName(): string { return 'foo'; @@ -52,7 +52,7 @@ public function fieldName(): string public function testCanCallCalculateFieldNameWhenNotSet(): void { - $component = new class() {}; + $component = new class {}; $this->assertSame('fallback', (new LiveProp())->calculateFieldName($component, 'fallback')); } diff --git a/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php b/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php index 654ee92e785..30c3ba8cbbf 100644 --- a/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php +++ b/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php @@ -28,17 +28,17 @@ public function testGetLiveAction(): void $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-some-prop-param="val2" data-live-action-param="action-name"', $props); $props = $runtime->liveAction('action-name', ['prop1' => 'val1', 'prop2' => 'val2'], ['debounce' => 300]); - $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name:prevent', ['pro1' => 'val1', 'prop2' => 'val2'], ['debounce' => 300]); - $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name:prevent', [], ['debounce' => 300]); - $this->assertSame('data-action="live#action:prevent" data-live-action-param="debounce(300)|action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="live#action:prevent" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); $props = $runtime->liveAction('action-name', [], [], 'keydown.esc'); - $this->assertSame('data-action="keydown.esc->live#action" data-live-action-param="action-name"', \html_entity_decode($props)); + $this->assertSame('data-action="keydown.esc->live#action" data-live-action-param="action-name"', html_entity_decode($props)); } } diff --git a/src/Map/tests/MapTest.php b/src/Map/tests/MapTest.php index c108e8f67c0..99a4f1ebc37 100644 --- a/src/Map/tests/MapTest.php +++ b/src/Map/tests/MapTest.php @@ -83,7 +83,7 @@ public function testWithMaximumConfiguration(): void ->center(new Point(48.8566, 2.3522)) ->zoom(6) ->fitBoundsToMarkers() - ->options(new class() implements MapOptionsInterface { + ->options(new class implements MapOptionsInterface { public function toArray(): array { return [ diff --git a/src/Turbo/src/TurboBundle.php b/src/Turbo/src/TurboBundle.php index 61542a4bab9..4c97d52584d 100644 --- a/src/Turbo/src/TurboBundle.php +++ b/src/Turbo/src/TurboBundle.php @@ -34,7 +34,7 @@ public function build(ContainerBuilder $container): void { parent::build($container); - $container->addCompilerPass(new class() implements CompilerPassInterface { + $container->addCompilerPass(new class implements CompilerPassInterface { public function process(ContainerBuilder $container): void { if (!$container->hasDefinition('turbo.broadcaster.imux')) { diff --git a/src/TwigComponent/src/Attribute/AsTwigComponent.php b/src/TwigComponent/src/Attribute/AsTwigComponent.php index 3d31240b686..d58e5647ae8 100644 --- a/src/TwigComponent/src/Attribute/AsTwigComponent.php +++ b/src/TwigComponent/src/Attribute/AsTwigComponent.php @@ -78,8 +78,6 @@ public function serviceConfig(): array /** * @param object|class-string $component * - * @return ?\ReflectionMethod - * * @internal */ public static function mountMethod(object|string $component): ?\ReflectionMethod diff --git a/src/TwigComponent/tests/Integration/ComponentFactoryTest.php b/src/TwigComponent/tests/Integration/ComponentFactoryTest.php index f36f9489e3f..72064f47669 100644 --- a/src/TwigComponent/tests/Integration/ComponentFactoryTest.php +++ b/src/TwigComponent/tests/Integration/ComponentFactoryTest.php @@ -94,7 +94,7 @@ public function testExceptionThrownIfRequiredMountParameterIsMissingFromPassedDa public function testStringableObjectCanBePassedToComponent(): void { - $attributes = $this->factory()->create('component_a', ['propB' => 'B', 'data-item-id-param' => new class() { + $attributes = $this->factory()->create('component_a', ['propB' => 'B', 'data-item-id-param' => new class { public function __toString(): string { return 'test'; diff --git a/src/TwigComponent/tests/Unit/Attribute/AsTwigComponentTest.php b/src/TwigComponent/tests/Unit/Attribute/AsTwigComponentTest.php index 3c577280865..1606792ca99 100644 --- a/src/TwigComponent/tests/Unit/Attribute/AsTwigComponentTest.php +++ b/src/TwigComponent/tests/Unit/Attribute/AsTwigComponentTest.php @@ -24,7 +24,7 @@ final class AsTwigComponentTest extends TestCase public function testPreMountHooksAreOrderedByPriority(): void { $hooks = AsTwigComponent::preMountMethods( - new class() { + new class { #[PreMount(priority: -10)] public function hook1() { @@ -51,7 +51,7 @@ public function hook3() public function testPostMountHooksAreOrderedByPriority(): void { $hooks = AsTwigComponent::postMountMethods( - new class() { + new class { #[PostMount(priority: -10)] public function hook1() { diff --git a/src/TwigComponent/tests/Unit/ComponentAttributesTest.php b/src/TwigComponent/tests/Unit/ComponentAttributesTest.php index 824a148f7d3..5e22ac737c8 100644 --- a/src/TwigComponent/tests/Unit/ComponentAttributesTest.php +++ b/src/TwigComponent/tests/Unit/ComponentAttributesTest.php @@ -27,7 +27,7 @@ public function testCanConvertToString(): void { $attributes = new ComponentAttributes([ 'class' => 'foo', - 'style' => new class() { + 'style' => new class { public function __toString(): string { return 'color:black;'; @@ -216,7 +216,7 @@ public function testRenderSingleAttribute(): void public function testRenderingSingleAttributeExcludesFromString(): void { $attributes = new ComponentAttributes([ - 'attr1' => new class() { + 'attr1' => new class { public function __toString(): string { return 'value1'; diff --git a/src/TwigComponent/tests/Unit/ComputedPropertiesProxyTest.php b/src/TwigComponent/tests/Unit/ComputedPropertiesProxyTest.php index d7f6bd3370f..adb954ba224 100644 --- a/src/TwigComponent/tests/Unit/ComputedPropertiesProxyTest.php +++ b/src/TwigComponent/tests/Unit/ComputedPropertiesProxyTest.php @@ -21,7 +21,7 @@ final class ComputedPropertiesProxyTest extends TestCase { public function testProxyCachesGetMethodReturns(): void { - $proxy = new ComputedPropertiesProxy(new class() { + $proxy = new ComputedPropertiesProxy(new class { private int $count = 0; public function getCount(): int @@ -37,7 +37,7 @@ public function getCount(): int public function testProxyCachesIsMethodReturns(): void { - $proxy = new ComputedPropertiesProxy(new class() { + $proxy = new ComputedPropertiesProxy(new class { private int $count = 0; public function isCount(): int @@ -53,7 +53,7 @@ public function isCount(): int public function testProxyCachesHasMethodReturns(): void { - $proxy = new ComputedPropertiesProxy(new class() { + $proxy = new ComputedPropertiesProxy(new class { private int $count = 0; public function hasCount(): int @@ -69,7 +69,7 @@ public function hasCount(): int public function testCanProxyPublicProperties(): void { - $proxy = new ComputedPropertiesProxy(new class() { + $proxy = new ComputedPropertiesProxy(new class { public $foo = 'bar'; }); @@ -78,7 +78,7 @@ public function testCanProxyPublicProperties(): void public function testCanProxyArrayAccess(): void { - $proxy = new ComputedPropertiesProxy(new class() implements \ArrayAccess { + $proxy = new ComputedPropertiesProxy(new class implements \ArrayAccess { private $array = ['foo' => 'bar']; public function offsetExists(mixed $offset): bool @@ -105,7 +105,7 @@ public function offsetUnset(mixed $offset): void public function testCannotProxyMethodsThatDoNotExist(): void { - $proxy = new ComputedPropertiesProxy(new class() {}); + $proxy = new ComputedPropertiesProxy(new class {}); $this->expectException(\InvalidArgumentException::class); @@ -114,7 +114,7 @@ public function testCannotProxyMethodsThatDoNotExist(): void public function testCannotPassArgumentsToProxiedMethods(): void { - $proxy = new ComputedPropertiesProxy(new class() {}); + $proxy = new ComputedPropertiesProxy(new class {}); $this->expectException(\InvalidArgumentException::class); @@ -123,7 +123,7 @@ public function testCannotPassArgumentsToProxiedMethods(): void public function testCannotProxyMethodsWithRequiredArguments(): void { - $proxy = new ComputedPropertiesProxy(new class() { + $proxy = new ComputedPropertiesProxy(new class { public function getValue(int $value): int { return $value; diff --git a/src/TwigComponent/tests/Unit/DependencyInjection/TwigComponentExtensionTest.php b/src/TwigComponent/tests/Unit/DependencyInjection/TwigComponentExtensionTest.php index cf983f1fb42..6695e064caf 100644 --- a/src/TwigComponent/tests/Unit/DependencyInjection/TwigComponentExtensionTest.php +++ b/src/TwigComponent/tests/Unit/DependencyInjection/TwigComponentExtensionTest.php @@ -98,7 +98,7 @@ private function createContainer() 'kernel.debug' => true, 'kernel.project_dir' => __DIR__, 'kernel.bundles' => [ - 'TwigBundle' => new class() {}, + 'TwigBundle' => new class {}, 'TwigComponentBundle' => TwigComponentBundle::class, ], ])); diff --git a/ux.symfony.com/.php-cs-fixer.dist.php b/ux.symfony.com/.php-cs-fixer.dist.php index 840416cebf3..b52ba19c910 100644 --- a/ux.symfony.com/.php-cs-fixer.dist.php +++ b/ux.symfony.com/.php-cs-fixer.dist.php @@ -30,9 +30,6 @@ '@Symfony' => true, '@Symfony:risky' => true, 'header_comment' => ['header' => $fileHeaderComment], - 'nullable_type_declaration' => true, - // TODO: Remove once the "compiler_optimized" set includes "sprintf" - 'native_function_invocation' => ['include' => ['@compiler_optimized', 'sprintf'], 'scope' => 'namespaced', 'strict' => true], 'trailing_comma_in_multiline' => ['elements' => ['arrays', 'match', 'parameters']], ]) ->setRiskyAllowed(true) From 5f545794218ffa5b4c0845b4d8fab91efaa34f8b Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Sat, 17 Aug 2024 22:15:53 +0200 Subject: [PATCH 06/64] [root] Upgrade JS build dependencies --- package.json | 20 +- rollup.config.js | 11 +- src/Autocomplete/assets/dist/controller.js | 9 +- .../Google/assets/dist/map_controller.d.ts | 1 - .../assets/dist/register_controller.d.ts | 1 - .../assets/dist/register_controller.d.ts | 1 - src/Vue/assets/dist/register_controller.d.ts | 1 - yarn.lock | 2907 +++++++---------- 8 files changed, 1176 insertions(+), 1775 deletions(-) diff --git a/package.json b/package.json index 60340d501f0..6eebe333850 100644 --- a/package.json +++ b/package.json @@ -10,19 +10,19 @@ "check-format": "biome format" }, "devDependencies": { - "@babel/core": "^7.15.8", - "@babel/preset-env": "^7.15.8", - "@babel/preset-react": "^7.15.8", - "@babel/preset-typescript": "^7.15.8", + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.3", + "@babel/preset-react": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", "@biomejs/biome": "^1.8.3", - "@rollup/plugin-commonjs": "^23.0.0", - "@rollup/plugin-node-resolve": "^15.0.0", - "@rollup/plugin-typescript": "^10.0.0", + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^11.1.6", "@symfony/stimulus-testing": "^2.0.1", "clean-css-cli": "^5.6.2", - "rollup": "^3.7.0", - "tslib": "^2.3.1", - "typescript": "^4.4.4", + "rollup": "^4.21.0", + "tslib": "^2.6.3", + "typescript": "^5.5.4", "vitest": "^0.34.6" } } diff --git a/rollup.config.js b/rollup.config.js index 4f8bff7298e..7ab3b404f8b 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -94,9 +94,16 @@ module.exports = { resolve(), typescript({ filterRoot: packageRoot, - include: ['src/**/*.ts'], + include: [ + 'src/**/*.ts', + // TODO: Remove for the next major release + // "@rollup/plugin-typescript" v11.0.0 fixed an issue (https://github.com/rollup/plugins/pull/1310) that + // cause a breaking change for UX React users, the dist file requires "react-dom/client" instead of "react-dom" + // and it will break for users using the Symfony AssetMapper without Symfony Flex (for automatic "importmap.php" upgrade). + '**/node_modules/react-dom/client.js' + ], compilerOptions: { - outDir: 'dist', + outDir: '.', declaration: true, emitDeclarationOnly: true, } diff --git a/src/Autocomplete/assets/dist/controller.js b/src/Autocomplete/assets/dist/controller.js index d54467ef57d..2f7ab51075d 100644 --- a/src/Autocomplete/assets/dist/controller.js +++ b/src/Autocomplete/assets/dist/controller.js @@ -15,12 +15,19 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + function __classPrivateFieldGet(receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; var _default_1_instances, _default_1_getCommonConfig, _default_1_createAutocomplete, _default_1_createAutocompleteWithHtmlContents, _default_1_createAutocompleteWithRemoteData, _default_1_stripTags, _default_1_mergeObjects, _default_1_createTomSelect; class default_1 extends Controller { diff --git a/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts index 9a8da864f15..aef508dc189 100644 --- a/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts +++ b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts @@ -1,4 +1,3 @@ -/// import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; import type { LoaderOptions } from '@googlemaps/js-api-loader'; diff --git a/src/React/assets/dist/register_controller.d.ts b/src/React/assets/dist/register_controller.d.ts index ebede17a971..7743864c682 100644 --- a/src/React/assets/dist/register_controller.d.ts +++ b/src/React/assets/dist/register_controller.d.ts @@ -1,4 +1,3 @@ -/// import type { ComponentClass, FunctionComponent } from 'react'; type Component = string | FunctionComponent | ComponentClass; declare global { diff --git a/src/Svelte/assets/dist/register_controller.d.ts b/src/Svelte/assets/dist/register_controller.d.ts index 36c2dc17d28..6adf6b186d6 100644 --- a/src/Svelte/assets/dist/register_controller.d.ts +++ b/src/Svelte/assets/dist/register_controller.d.ts @@ -1,4 +1,3 @@ -/// import type { SvelteComponent } from 'svelte'; declare global { function resolveSvelteComponent(name: string): typeof SvelteComponent; diff --git a/src/Vue/assets/dist/register_controller.d.ts b/src/Vue/assets/dist/register_controller.d.ts index a6ccbbfe823..87348f24cd1 100644 --- a/src/Vue/assets/dist/register_controller.d.ts +++ b/src/Vue/assets/dist/register_controller.d.ts @@ -1,4 +1,3 @@ -/// import type { Component } from 'vue'; declare global { function resolveVueComponent(name: string): Component; diff --git a/yarn.lock b/yarn.lock index a0030d02357..1c811fe3bf1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,206 +23,102 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" + integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.15.8", "@babel/core@^7.7.5": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== +"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.22.20", "@babel/core@^7.25.2", "@babel/core@^7.7.5": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/core@^7.12.10", "@babel/core@^7.22.20": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz" - integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== - dependencies: - "@babel/types" "^7.21.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" + integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.25.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz" - integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" +"@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz#a109bf9c3d58dfed83aaf42e85633c89f43a6253" + integrity sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.0" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz" - integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz" - integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-define-polyfill-provider@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz" - integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== +"@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -230,1406 +126,815 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-member-expression-to-functions@^7.22.15": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== - dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz" - integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" + integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-wrap-function" "^7.25.0" + "@babel/traverse" "^7.25.0" + +"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helper-wrap-function@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" + integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== + dependencies: + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/helpers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.3.3": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3", "@babel/parser@^7.3.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" + integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== + dependencies: + "@babel/types" "^7.25.2" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" + integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.3" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz" - integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" + integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" + integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz" - integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" + integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.0" "@babel/plugin-proposal-class-properties@7.12.1": version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== dependencies: "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" - integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== +"@babel/plugin-syntax-flow@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7" + integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.1", "@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== +"@babel/plugin-syntax-jsx@^7.12.1", "@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-async-generator-functions@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz" - integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-block-scoping@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz" - integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-static-block@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz" - integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.20.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz" - integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-destructuring@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz" - integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dynamic-import@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz" - integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-export-namespace-from@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz" - integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.12.10", "@babel/plugin-transform-flow-strip-types@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz" - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.22.5" - -"@babel/plugin-transform-for-of@^7.18.8": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-for-of@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz" - integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-json-strings@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz" - integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz" - integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-amd@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz" - integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== - dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== - dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz" - integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== - dependencies: - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-systemjs@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz" - integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz" - integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== +"@babel/plugin-transform-async-generator-functions@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" + integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-remap-async-to-generator" "^7.25.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/traverse" "^7.25.0" -"@babel/plugin-transform-numeric-separator@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz" - integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-object-rest-spread@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz" - integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-block-scoping@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" + integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-optional-catch-binding@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz" - integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz" - integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== +"@babel/plugin-transform-classes@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e" + integrity sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.0" + globals "^11.1.0" -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-parameters@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz" - integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== +"@babel/plugin-transform-destructuring@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" + integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-property-in-object@^7.22.11": - version "7.22.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz" - integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.11" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" + integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-flow-strip-types@^7.12.10", "@babel/plugin-transform-flow-strip-types@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz#b3aa251db44959b7a7c82abcd6b4225dec7d2258" + integrity sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-flow" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-react-jsx-self@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz" - integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== +"@babel/plugin-transform-function-name@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" + integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/traverse" "^7.25.1" -"@babel/plugin-transform-react-jsx-source@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz" - integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.12.11", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz" - integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== +"@babel/plugin-transform-literals@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz" - integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.21.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz" - integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== +"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" + integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.2" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-modules-systemjs@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" + integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-module-transforms" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.0" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" + integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-typescript@^7.21.0": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" - integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.22.10": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" - integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.24.7" -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== +"@babel/plugin-transform-react-jsx-self@^7.22.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-react-jsx-source@^7.22.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== +"@babel/plugin-transform-react-jsx@^7.12.11", "@babel/plugin-transform-react-jsx@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" + integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.25.2" -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/preset-env@^7.12.11": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz" - integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: - "@babel/compat-data" "^7.23.2" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-typeof-symbol@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" + integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-transform-typescript@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" + integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-typescript" "^7.24.7" + +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c" + integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1641,291 +946,152 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.23.2" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.23.0" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.11" - "@babel/plugin-transform-classes" "^7.22.15" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.23.0" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.11" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-for-of" "^7.22.15" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.11" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.23.0" - "@babel/plugin-transform-modules-commonjs" "^7.23.0" - "@babel/plugin-transform-modules-systemjs" "^7.23.0" - "@babel/plugin-transform-modules-umd" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" - "@babel/plugin-transform-numeric-separator" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.22.15" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.23.0" - "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.10" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.10" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.25.0" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.25.0" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.25.0" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.8" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.25.1" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.25.2" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.8" + "@babel/plugin-transform-modules-systemjs" "^7.25.0" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.8" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.8" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.23.0" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" - core-js-compat "^3.31.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.37.1" semver "^6.3.1" -"@babel/preset-env@^7.15.8": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - "@babel/preset-flow@^7.12.1": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz" - integrity sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.7.tgz#eef5cb8e05e97a448fc50c16826f5612fe512c06" + integrity sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-flow-strip-types" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-flow-strip-types" "^7.24.7" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.12.10": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz" - integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.15" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.15" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" - -"@babel/preset-react@^7.15.8": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.15.8": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz" - integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-typescript" "^7.21.0" +"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" + +"@babel/preset-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-typescript" "^7.24.7" "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.10.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz" - integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz#0a318b66dfc765ad10562d829fea372ed7e1eb7d" + integrity sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg== dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz" - integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.3" - "@babel/types" "^7.21.3" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" + integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/parser" "^7.25.3" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.2" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz" - integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" + integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -2161,6 +1327,18 @@ resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.4.tgz#5c5361c06a37cdf10dcba4223f1afd0ca1c75091" integrity sha512-mlZEFUZrJnpfj+g/XeCWWuokvQyN68WvM78JM+0jfSFc98wegm259vCbC1zSllcspRwbgXK31ibehCy5PA78/Q== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -2391,15 +1569,6 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -2437,7 +1606,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -2447,15 +1616,7 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24": +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -2463,6 +1624,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@kurkle/color@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" @@ -2480,6 +1649,11 @@ resolved "https://registry.npmjs.org/@orchidjs/unicode-variants/-/unicode-variants-1.0.4.tgz" integrity sha512-NvVBRnZNE+dugiXERFsET1JlKZfM5lJDEpSMilKW4bToYJ7pxf0Zne78xyXB2ny2c2aHfJ6WLnz1AaTNHAmQeQ== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@rollup/plugin-alias@^3.1.1": version "3.1.9" resolved "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.1.9.tgz" @@ -2508,17 +1682,17 @@ magic-string "^0.25.7" resolve "^1.17.0" -"@rollup/plugin-commonjs@^23.0.0": - version "23.0.7" - resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-23.0.7.tgz" - integrity sha512-hsSD5Qzyuat/swzrExGG5l7EuIlPhwTsT7KwKbSCQzIcJWjRxiimi/0tyMYY2bByitNb3i1p+6JWEDGa0NvT0Q== +"@rollup/plugin-commonjs@^26.0.1": + version "26.0.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz#16d4d6e54fa63021249a292b50f27c0b0f1a30d8" + integrity sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" estree-walker "^2.0.2" - glob "^8.0.3" + glob "^10.4.1" is-reference "1.2.1" - magic-string "^0.27.0" + magic-string "^0.30.3" "@rollup/plugin-json@^4.1.0": version "4.1.0" @@ -2539,24 +1713,24 @@ is-module "^1.0.0" resolve "^1.19.0" -"@rollup/plugin-node-resolve@^15.0.0": - version "15.0.1" - resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz" - integrity sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg== +"@rollup/plugin-node-resolve@^15.2.3": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== dependencies: "@rollup/pluginutils" "^5.0.1" "@types/resolve" "1.20.2" deepmerge "^4.2.2" - is-builtin-module "^3.2.0" + is-builtin-module "^3.2.1" is-module "^1.0.0" resolve "^1.22.1" -"@rollup/plugin-typescript@^10.0.0": - version "10.0.1" - resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz" - integrity sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A== +"@rollup/plugin-typescript@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b" + integrity sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA== dependencies: - "@rollup/pluginutils" "^5.0.1" + "@rollup/pluginutils" "^5.1.0" resolve "^1.22.1" "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": @@ -2585,6 +1759,95 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/pluginutils@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e" + integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA== + +"@rollup/rollup-android-arm64@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0" + integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA== + +"@rollup/rollup-darwin-arm64@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947" + integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA== + +"@rollup/rollup-darwin-x64@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0" + integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg== + +"@rollup/rollup-linux-arm-gnueabihf@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b" + integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA== + +"@rollup/rollup-linux-arm-musleabihf@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee" + integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w== + +"@rollup/rollup-linux-arm64-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085" + integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w== + +"@rollup/rollup-linux-arm64-musl@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5" + integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4" + integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg== + +"@rollup/rollup-linux-riscv64-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444" + integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg== + +"@rollup/rollup-linux-s390x-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3" + integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw== + +"@rollup/rollup-linux-x64-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9" + integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg== + +"@rollup/rollup-linux-x64-musl@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200" + integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ== + +"@rollup/rollup-win32-arm64-msvc@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc" + integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ== + +"@rollup/rollup-win32-ia32-msvc@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1" + integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg== + +"@rollup/rollup-win32-x64-msvc@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375" + integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ== + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" @@ -2828,7 +2091,7 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@^1.0.1": +"@types/estree@1.0.5", "@types/estree@^1.0.1": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -3197,6 +2460,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +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@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" @@ -3221,6 +2489,11 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" @@ -3405,53 +2678,29 @@ babel-plugin-macros@^3.0.1: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs2@^0.4.6: - version "0.4.6" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz" - integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-corejs3@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz" - integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" - core-js-compat "^3.32.2" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" -babel-plugin-polyfill-regenerator@^0.5.3: - version "0.5.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz" - integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-plugin-transform-async-to-promises@^0.8.18: version "0.8.18" @@ -3569,7 +2818,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4: version "4.22.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz" integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== @@ -3579,15 +2828,15 @@ browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^ node-releases "^2.0.13" update-browserslist-db "^1.0.13" -browserslist@^4.21.3, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" bser@2.1.1: version "2.1.1" @@ -3673,16 +2922,16 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz" integrity sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg== -caniuse-lite@^1.0.30001449: - version "1.0.30001469" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz" - integrity sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g== - caniuse-lite@^1.0.30001541: version "1.0.30001550" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz" integrity sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ== +caniuse-lite@^1.0.30001646: + version "1.0.30001651" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" + integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" @@ -3714,7 +2963,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3935,7 +3184,7 @@ concat-with-sourcemaps@^1.1.0: dependencies: source-map "^0.6.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0: version "1.9.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -3950,24 +3199,17 @@ copy-descriptor@^0.1.0: resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.25.1: - version "3.29.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz" - integrity sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA== - dependencies: - browserslist "^4.21.5" - -core-js-compat@^3.31.0, core-js-compat@^3.32.2: - version "3.33.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz" - integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ== +core-js-compat@^3.37.1, core-js-compat@^3.38.0: + version "3.38.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.0.tgz#d93393b1aa346b6ee683377b0c31172ccfe607aa" + integrity sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A== dependencies: - browserslist "^4.22.1" + browserslist "^4.23.3" -core-js-pure@^3.25.1: - version "3.29.1" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.1.tgz" - integrity sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg== +core-js-pure@^3.30.2: + version "3.38.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.38.0.tgz#bc802cd152e33d5b0ec733b656c71cb847cac701" + integrity sha512-8balb/HAXo06aHP58mZMtXgD8vcnXz9tUDePgqBgJgKdmTlMt+jw3ujqniuBDQXMvTzxnMpxHFeuSM3g1jWQuQ== cosmiconfig@^7.0.0: version "7.1.0" @@ -4170,6 +3412,13 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" +debug@^4.3.1: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" @@ -4362,6 +3611,11 @@ duplexer@^0.1.1, duplexer@^0.1.2: resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ejs@^3.1.6: version "3.1.9" resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" @@ -4369,16 +3623,16 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.284: - version "1.4.335" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.335.tgz" - integrity sha512-l/eowQqTnrq3gu+WSrdfkhfNHnPgYqlKAwxz7MTOj6mom19vpEDHNXl6dxDxyTiYuhemydprKr/HCrHfgk+OfQ== - electron-to-chromium@^1.4.535: version "1.4.558" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.558.tgz" integrity sha512-j9IcGmfkyN5MBH/0Xzg45GDHasXsnwEJDM6Xnr9H7GlGUni+JH4q6xp6Nk7NV5LjTmoEFBqhILIqg1McJrv6uA== +electron-to-chromium@^1.5.4: + version "1.5.10" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.10.tgz#2791f966880389f96078d5e784b0d500f71abd14" + integrity sha512-C3RDERDjrNW262GCRvpoer3a0Ksd66CtgDLxMHhzShQ8fhL4kwnpVXsJPAKg9xJjIROXUbLBrvtOzVAjALMIWA== + emittery@^0.7.1: version "0.7.2" resolved "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz" @@ -4389,6 +3643,11 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" @@ -4524,6 +3783,11 @@ escalade@^3.1.1: resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -4784,6 +4048,14 @@ for-in@^1.0.2: resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" @@ -4929,6 +4201,18 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob@^10.4.1: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -4941,17 +4225,6 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -5315,9 +4588,9 @@ is-buffer@^1.1.5: resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^3.2.0: +is-builtin-module@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== dependencies: builtin-modules "^3.3.0" @@ -5664,6 +4937,15 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: version "10.8.7" resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" @@ -6168,7 +5450,7 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: +json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -6315,6 +5597,11 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -6341,13 +5628,6 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.27.0: - version "0.27.0" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - magic-string@^0.30.1, magic-string@^0.30.3: version "0.30.5" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz" @@ -6524,11 +5804,23 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.1.1, minimist@^1.2.0: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" @@ -6647,10 +5939,10 @@ node-releases@^2.0.13: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-package-data@^2.5.0: version "2.5.0" @@ -6867,6 +6159,11 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -6919,6 +6216,14 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -6948,6 +6253,11 @@ picocolors@^1.0.0: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 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.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" @@ -7429,17 +6739,15 @@ regenerate@^1.4.2: resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: +regenerator-runtime@^0.13.7: version "0.13.11" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" @@ -7654,16 +6962,34 @@ rollup@^2.35.1: rollup@^3.27.1: version "3.29.4" - resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" -rollup@^3.7.0: - version "3.20.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-3.20.0.tgz" - integrity sha512-YsIfrk80NqUDrxrjWPXUa7PWvAfegZEXHuPsEZg58fGCdjL1I9C1i/NaG+L+27kxxwkrG/QEDEQc8s/ynXWWGQ== +rollup@^4.21.0: + version "4.21.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.0.tgz#28db5f5c556a5180361d35009979ccc749560b9d" + integrity sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ== + dependencies: + "@types/estree" "1.0.5" optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.21.0" + "@rollup/rollup-android-arm64" "4.21.0" + "@rollup/rollup-darwin-arm64" "4.21.0" + "@rollup/rollup-darwin-x64" "4.21.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.21.0" + "@rollup/rollup-linux-arm-musleabihf" "4.21.0" + "@rollup/rollup-linux-arm64-gnu" "4.21.0" + "@rollup/rollup-linux-arm64-musl" "4.21.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.21.0" + "@rollup/rollup-linux-riscv64-gnu" "4.21.0" + "@rollup/rollup-linux-s390x-gnu" "4.21.0" + "@rollup/rollup-linux-x64-gnu" "4.21.0" + "@rollup/rollup-linux-x64-musl" "4.21.0" + "@rollup/rollup-win32-arm64-msvc" "4.21.0" + "@rollup/rollup-win32-ia32-msvc" "4.21.0" + "@rollup/rollup-win32-x64-msvc" "4.21.0" fsevents "~2.3.2" rsvp@^4.8.4: @@ -7753,7 +7079,7 @@ scheduler@^0.23.0: resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -7875,6 +7201,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" 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== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -8057,6 +7388,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -8066,6 +7406,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.6: version "4.0.10" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz" @@ -8108,6 +7457,13 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" @@ -8122,6 +7478,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + 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@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" @@ -8379,11 +7742,16 @@ tslib@^2.0.3: resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslib@^2.3.1, tslib@^2.4.0: +tslib@^2.4.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + type-check@~0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" @@ -8467,11 +7835,16 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.1.3, typescript@^4.4.4: +typescript@^4.1.3: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + ufo@^1.3.0: version "1.3.1" resolved "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz" @@ -8538,14 +7911,6 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" @@ -8554,6 +7919,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + urix@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" @@ -8833,6 +8206,15 @@ word-wrap@~1.2.3: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" @@ -8851,6 +8233,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" From bf971581efb72fe252a3bf1a25fe5de2a92a2df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 18 Aug 2024 02:53:38 +0200 Subject: [PATCH 07/64] [Map] Fix bridges .gitattributes --- src/Map/src/Bridge/Google/.gitattributes | 7 +++++-- src/Map/src/Bridge/Leaflet/.gitattributes | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Map/src/Bridge/Google/.gitattributes b/src/Map/src/Bridge/Google/.gitattributes index 84c7add058f..e56a1c904f6 100644 --- a/src/Map/src/Bridge/Google/.gitattributes +++ b/src/Map/src/Bridge/Google/.gitattributes @@ -1,4 +1,7 @@ -/Tests export-ignore -/phpunit.xml.dist export-ignore +/assets/src export-ignore +/assets/test export-ignore +/assets/vitest.config.js export-ignore +/tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore +/phpunit.xml.dist export-ignore diff --git a/src/Map/src/Bridge/Leaflet/.gitattributes b/src/Map/src/Bridge/Leaflet/.gitattributes index 84c7add058f..e56a1c904f6 100644 --- a/src/Map/src/Bridge/Leaflet/.gitattributes +++ b/src/Map/src/Bridge/Leaflet/.gitattributes @@ -1,4 +1,7 @@ -/Tests export-ignore -/phpunit.xml.dist export-ignore +/assets/src export-ignore +/assets/test export-ignore +/assets/vitest.config.js export-ignore +/tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore +/phpunit.xml.dist export-ignore From 250863f452888b96ead5fbcab28abd9fac9e2ac4 Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Tue, 20 Aug 2024 11:53:30 -0400 Subject: [PATCH 08/64] Fix debug command --- src/TwigComponent/doc/index.rst | 2 +- .../src/Command/TwigComponentDebugCommand.php | 9 +++++++-- .../templates/components/Table/Header.html.twig | 0 .../Command/TwigComponentDebugCommandTest.php | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/TwigComponent/tests/Fixtures/Bundle/AcmeBundle/templates/components/Table/Header.html.twig diff --git a/src/TwigComponent/doc/index.rst b/src/TwigComponent/doc/index.rst index d1fa5ee12fc..eba5bdf3d66 100644 --- a/src/TwigComponent/doc/index.rst +++ b/src/TwigComponent/doc/index.rst @@ -1634,7 +1634,7 @@ Anonymous Components .. versionadded:: 2.20 - The bundle convention for Anonymous components was added in TwigComponents 2.18. + The bundle convention for Anonymous components was added in TwigComponents 2.20. Using a component from a third-party bundle is just as straightforward as using one from your own application. Once the bundle is installed and configured, you diff --git a/src/TwigComponent/src/Command/TwigComponentDebugCommand.php b/src/TwigComponent/src/Command/TwigComponentDebugCommand.php index 2ceae41719b..4b43216acdf 100644 --- a/src/TwigComponent/src/Command/TwigComponentDebugCommand.php +++ b/src/TwigComponent/src/Command/TwigComponentDebugCommand.php @@ -184,9 +184,14 @@ private function findAnonymousComponents(): array foreach ($finderTemplates as $template) { $component = str_replace('/', ':', $template->getRelativePathname()); $component = substr($component, 0, -10); // remove file extension ".html.twig" + $path = $template->getPath(); - if (isset($dirs[$template->getPath()]) && FilesystemLoader::MAIN_NAMESPACE !== $dirs[$template->getPath()]) { - $component = $dirs[$template->getPath()].':'.$component; + if ($template->getRelativePath()) { + $path = \rtrim(\substr($template->getPath(), 0, -1 * \strlen($template->getRelativePath())), '/'); + } + + if (isset($dirs[$path]) && FilesystemLoader::MAIN_NAMESPACE !== $dirs[$path]) { + $component = $dirs[$path].':'.$component; } $components[$component] = $component; diff --git a/src/TwigComponent/tests/Fixtures/Bundle/AcmeBundle/templates/components/Table/Header.html.twig b/src/TwigComponent/tests/Fixtures/Bundle/AcmeBundle/templates/components/Table/Header.html.twig new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/TwigComponent/tests/Integration/Command/TwigComponentDebugCommandTest.php b/src/TwigComponent/tests/Integration/Command/TwigComponentDebugCommandTest.php index f94b25d182b..0e6ffa8d895 100644 --- a/src/TwigComponent/tests/Integration/Command/TwigComponentDebugCommandTest.php +++ b/src/TwigComponent/tests/Integration/Command/TwigComponentDebugCommandTest.php @@ -165,6 +165,21 @@ public function testWithBundleAnonymousComponent(): void $this->assertStringContainsString('Anonymous', $display); } + public function testWithBundleAnonymousComponentSubDir(): void + { + $commandTester = $this->createCommandTester(); + $commandTester->execute(['name' => 'Acme:Table:Header']); + + $commandTester->assertCommandIsSuccessful(); + + $display = $commandTester->getDisplay(); + + $this->tableDisplayCheck($display); + $this->assertStringContainsString('Acme:Table:Header', $display); + $this->assertStringContainsString('@Acme/components/Table/Header.html.twig', $display); + $this->assertStringContainsString('Anonymous', $display); + } + public function testWithoutPublicProps(): void { $commandTester = $this->createCommandTester(); From 34d1b75929f24d261b9e8c275047afa1dd82cdaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 17 Aug 2024 23:42:29 +0200 Subject: [PATCH 09/64] Fix Twig extension return types Prepare Twig 4.0 compatibility --- src/LazyImage/src/Twig/BlurHashExtension.php | 8 +++++--- src/Map/src/Twig/MapExtension.php | 18 ++++++++++-------- src/Notify/src/Twig/NotifyExtension.php | 6 ++++-- src/Turbo/src/Twig/TwigExtension.php | 6 ++++-- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/LazyImage/src/Twig/BlurHashExtension.php b/src/LazyImage/src/Twig/BlurHashExtension.php index cd872ecbc66..5ac2f3b520f 100644 --- a/src/LazyImage/src/Twig/BlurHashExtension.php +++ b/src/LazyImage/src/Twig/BlurHashExtension.php @@ -21,9 +21,11 @@ */ class BlurHashExtension extends AbstractExtension { - public function getFunctions(): iterable + public function getFunctions(): array { - yield new TwigFunction('data_uri_thumbnail', [BlurHashRuntime::class, 'createDataUriThumbnail']); - yield new TwigFunction('blur_hash', [BlurHashRuntime::class, 'blurHash']); + return [ + new TwigFunction('data_uri_thumbnail', [BlurHashRuntime::class, 'createDataUriThumbnail']), + new TwigFunction('blur_hash', [BlurHashRuntime::class, 'blurHash']), + ]; } } diff --git a/src/Map/src/Twig/MapExtension.php b/src/Map/src/Twig/MapExtension.php index b78e8ccbabf..86788e32e04 100644 --- a/src/Map/src/Twig/MapExtension.php +++ b/src/Map/src/Twig/MapExtension.php @@ -22,14 +22,16 @@ */ final class MapExtension extends AbstractExtension { - public function getFunctions(): iterable + public function getFunctions(): array { - yield new TwigFunction('render_map', [Renderers::class, 'renderMap'], [ - 'is_safe' => ['html'], - 'deprecated' => '2.20', - 'deprecating_package' => 'symfony/ux-map', - 'alternative' => 'ux_map', - ]); - yield new TwigFunction('ux_map', [Renderers::class, 'renderMap'], ['is_safe' => ['html']]); + return [ + new TwigFunction('render_map', [Renderers::class, 'renderMap'], [ + 'is_safe' => ['html'], + 'deprecated' => '2.21', + 'deprecating_package' => 'symfony/ux-map', + 'alternative' => 'ux_map', + ]), + new TwigFunction('ux_map', [Renderers::class, 'renderMap'], ['is_safe' => ['html']]), + ]; } } diff --git a/src/Notify/src/Twig/NotifyExtension.php b/src/Notify/src/Twig/NotifyExtension.php index bd2204aef31..0ddb44bf27e 100644 --- a/src/Notify/src/Twig/NotifyExtension.php +++ b/src/Notify/src/Twig/NotifyExtension.php @@ -22,8 +22,10 @@ final class NotifyExtension extends AbstractExtension /** * @return iterable */ - public function getFunctions(): iterable + public function getFunctions(): array { - yield new TwigFunction('stream_notifications', [NotifyRuntime::class, 'renderStreamNotifications'], ['is_safe' => ['html']]); + return [ + new TwigFunction('stream_notifications', [NotifyRuntime::class, 'renderStreamNotifications'], ['is_safe' => ['html']]), + ]; } } diff --git a/src/Turbo/src/Twig/TwigExtension.php b/src/Turbo/src/Twig/TwigExtension.php index 601e1586524..87dc3fe58fc 100644 --- a/src/Turbo/src/Twig/TwigExtension.php +++ b/src/Turbo/src/Twig/TwigExtension.php @@ -27,9 +27,11 @@ public function __construct( ) { } - public function getFunctions(): iterable + public function getFunctions(): array { - yield new TwigFunction('turbo_stream_listen', $this->turboStreamListen(...), ['needs_environment' => true, 'is_safe' => ['html']]); + return [ + new TwigFunction('turbo_stream_listen', $this->turboStreamListen(...), ['needs_environment' => true, 'is_safe' => ['html']]), + ]; } /** From 8fbcd212ac3c69bd7f9e5842fb18f76d40b275af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 18 Aug 2024 17:52:33 +0200 Subject: [PATCH 10/64] [TwigComponent][Doc] Twig code style & "boolean props" part --- src/TwigComponent/doc/index.rst | 111 +++++++++++++++++--------------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/src/TwigComponent/doc/index.rst b/src/TwigComponent/doc/index.rst index d1fa5ee12fc..a99d955b96f 100644 --- a/src/TwigComponent/doc/index.rst +++ b/src/TwigComponent/doc/index.rst @@ -32,7 +32,7 @@ Done! Now render it wherever you want: .. code-block:: html+twig - {{ component('Alert', { message: 'Hello Twig Components!' }) }} + {{ component('Alert', {message: 'Hello Twig Components!'}) }} @@ -193,7 +193,7 @@ them as "props" via the a 2nd argument to ``component()``: .. code-block:: twig - {{ component('Alert', { message: 'Successfully created!' }) }} + {{ component('Alert', {message: 'Successfully created!'}) }} {{ component('Alert', { type: 'danger', @@ -235,7 +235,7 @@ available in every component template: .. code-block:: html+twig -
+
{{ message }}
@@ -295,17 +295,22 @@ prefix the attribute with ``:`` or use the normal ``{{ }}`` syntax: // pass object, array, or anything you imagine -Boolean props require using the dynamic syntax: +Boolean props are converted using PHP's type juggling rules. The +string ``"false"`` is converted to the boolean ``true``. + +To pass the boolean ``false``, you can pass a Twig expression +``{{ false }}`` or use the dynamic syntax (with the ``:`` prefix): .. code-block:: html+twig - {# in this example, the 'false' value is passed as a string - (so it's converted automatically to the true boolean value) #} + {# ❌ the string 'false' is converted to the boolean 'true' #} - {# in the following examples, the 'false' value is passed as a boolean property #} - + {# ✅ use the 'false' boolean value #} + + {# ✅ use the dynamic syntax #} + Don't forget that you can mix and match props with attributes that you want to render on the root element: @@ -319,7 +324,7 @@ This requires Twig 3.7.0 or higher: .. code-block:: html+twig - + We'll use the HTML syntax for the rest of the guide. @@ -341,7 +346,7 @@ close tag, it's passed to your component template as the block called .. code-block:: html+twig -
+
{% block content %}{% endblock %}
@@ -450,7 +455,7 @@ passed to ``mount()``. .. code-block:: html+twig @@ -592,7 +597,7 @@ name is determined by the location of the template: .. code-block:: html+twig {# templates/components/Button/Primary.html.twig #} - @@ -641,7 +646,7 @@ To tell the system that ``icon`` and ``type`` are props and not attributes, use {# templates/components/Button.html.twig #} {% props icon = null, type = 'primary' %} - + {# render component #} - {{ component('MyComponent', { style: 'color:red' }) }} + {{ component('MyComponent', {style: 'color:red'}) }} {# renders as: #} {# render component #} - {{ component('MyComponent', { class: 'foo', type: 'submit' }) }} + {{ component('MyComponent', {class: 'foo', type: 'submit'}) }} {# renders as: #} @@ -993,7 +1000,7 @@ You can take full control over the attributes that are rendered by using the
{# render component #} - {{ component('MyComponent', { style: 'color:red;' }) }} + {{ component('MyComponent', {style: 'color:red;'}) }} {# renders as: #}
@@ -1018,7 +1025,7 @@ You can take full control over the attributes that are rendered by using the
{# render component #} - {{ component('MyComponent', { style: 'color:red;' }) }} + {{ component('MyComponent', {style: 'color:red;'}) }} {# renders as: #}
{# style is rendered twice! #} @@ -1038,7 +1045,7 @@ You can take full control over the attributes that are rendered by using the
{# render component #} - {{ component('MyComponent', { style: 'color:red;' }) }} + {{ component('MyComponent', {style: 'color:red;'}) }} {# renders as: #}
{# style is rendered twice! #} @@ -1053,10 +1060,10 @@ Extract specific attributes and discard the rest: .. code-block:: html+twig {# render component #} - {{ component('MyComponent', { class: 'foo', style: 'color:red' }) }} + {{ component('MyComponent', {class: 'foo', style: 'color:red'}) }} {# templates/components/MyComponent.html.twig #} - +
My Component!
@@ -1073,10 +1080,10 @@ Exclude specific attributes: .. code-block:: html+twig {# render component #} - {{ component('MyComponent', { class: 'foo', style: 'color:red' }) }} + {{ component('MyComponent', {class: 'foo', style: 'color:red'}) }} {# templates/components/MyComponent.html.twig #} - +
My Component!
@@ -1100,14 +1107,14 @@ and footer. Here's an example of this: .. code-block:: html+twig {# templates/components/Dialog.html.twig #} - - +
+
{% block title %}Default Title{% endblock %}
- +
{% block content %}{% endblock %}
- +
{% block footer %}Default Footer{% endblock %}
@@ -1162,7 +1169,7 @@ function where you define ``base`` classes that should always be present and the {% props color = 'blue', size = 'md' %} {% set alert = cva({ - base: 'alert ', + base: 'alert', variants: { color: { blue: 'bg-blue', @@ -1222,7 +1229,7 @@ with the ``cva()`` function: // ... }) %} -
+
{% block content %}{% endblock %}
@@ -1238,7 +1245,7 @@ when multiple other variant conditions are met. {% props color = 'blue', size = 'md' %} {% set alert = cva({ - base: 'alert ', + base: 'alert', variants: { color: { blue: 'bg-blue', @@ -1291,7 +1298,7 @@ If no variants match, you can define a default set of classes to apply: {% props color = 'blue', size = 'md' %} {% set alert = cva({ - base: 'alert ', + base: 'alert', variants: { color: { blue: 'bg-blue', From 56b4c8f6f06ec50e34b5e9232d792d987bc22a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Thu, 22 Aug 2024 06:59:19 +0200 Subject: [PATCH 11/64] [Site] Refresh banner * Refreshed banner * Fix menu icons (mobile) * Fix homepage spacing (mobile) --- ux.symfony.com/assets/styles/app/_root.scss | 2 +- .../assets/styles/components/_Banner.scss | 52 ++++++------------- ux.symfony.com/templates/_banner.html.twig | 7 --- ux.symfony.com/templates/_header.html.twig | 4 +- .../templates/main/homepage.html.twig | 2 +- 5 files changed, 21 insertions(+), 46 deletions(-) diff --git a/ux.symfony.com/assets/styles/app/_root.scss b/ux.symfony.com/assets/styles/app/_root.scss index bf3d0c92db5..ba8fcd7af2b 100644 --- a/ux.symfony.com/assets/styles/app/_root.scss +++ b/ux.symfony.com/assets/styles/app/_root.scss @@ -14,7 +14,7 @@ --space-larger: 2rem; // Fonts - --font-family-title: "Ubuntu"; + --font-family-title: "Ubuntu", "Helvetica Neue", sans-serif; --font-family-text: system-ui, sans-serif; --font-family-code: ui-monospace, "SF Mono", SFMono-Regular, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; diff --git a/ux.symfony.com/assets/styles/components/_Banner.scss b/ux.symfony.com/assets/styles/components/_Banner.scss index 8a65a98e9f0..5d4606d41af 100644 --- a/ux.symfony.com/assets/styles/components/_Banner.scss +++ b/ux.symfony.com/assets/styles/components/_Banner.scss @@ -16,21 +16,11 @@ .BannerInner { display: flex; - flex-direction: column; - padding: 1rem 0; + flex-direction: row; + flex-wrap: nowrap; + padding-block: .5rem; gap: 1rem; position: relative; - margin: 0 auto; -} - -.BannerMedia { - align-self: center; - justify-self: center; -} -.BannerImage { - width: max(10vw, 40px); - height: auto; - filter: drop-shadow(1px 1px .5rem #000) drop-shadow(2px 2px 2rem #970404); } .BannerContent { @@ -42,25 +32,19 @@ text-wrap: balance; } -.BannerTitle { - text-align: center; - font-size: 1.2em; - font-family: var(--font-family-title); - margin: 0; - color: #fff; -} - .BannerText { text-align: center; margin: 0; - font-size: 0.85rem; - line-height: 1.2; - font-weight: 300; - color: #fff; + font-size: 0.8rem; + line-height: 1.3; + font-weight: 400; + color: #fffd; } .BannerText em { text-decoration: underline; text-underline-offset: .25rem; + font-weight: 600; + font-style: normal; } .BannerAction { @@ -72,17 +56,17 @@ .BannerButton { display: flex; align-items: center; - padding: .35em .75em; + padding: .15em .5em; align-self: center; color: #fffc; - font-size: 1.1em; + font-size: .9em; font-family: var(--font-family-title); - gap: .5em; + gap: .35em; justify-content: center; background: linear-gradient(#000e, #000d) padding-box, linear-gradient(90deg, #D65831 0%, #D2D631 36.52%, #31D673 71.83%, #3aa3ff 100%) border-box; border-radius: 2em; - border: 3px solid transparent; + border: 2px solid transparent; transition: all 250ms linear; } .BannerButton:hover { @@ -103,13 +87,11 @@ .BannerButton:hover svg { transform: scale(1.1); } - @media screen and (min-width: 768px) { - .BannerImage { - width: 64px; - } .BannerInner { - flex-direction: row; - padding: 1rem 2rem; + padding: .5rem 2rem; + } + .BannerText { + font-size: .9rem; } } diff --git a/ux.symfony.com/templates/_banner.html.twig b/ux.symfony.com/templates/_banner.html.twig index 403904abeca..15cdcd38787 100644 --- a/ux.symfony.com/templates/_banner.html.twig +++ b/ux.symfony.com/templates/_banner.html.twig @@ -1,14 +1,7 @@ From 85426fa356896e7eb76e7eaba4b88ca66a6ef46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Thu, 15 Aug 2024 22:55:01 +0200 Subject: [PATCH 16/64] [Cookbook] English / doc / code corrections --- .../cookbook/component_architecture.md | 103 +++++++++--------- 1 file changed, 50 insertions(+), 53 deletions(-) diff --git a/ux.symfony.com/cookbook/component_architecture.md b/ux.symfony.com/cookbook/component_architecture.md index 57d2eb908b6..5314d8cdc7c 100644 --- a/ux.symfony.com/cookbook/component_architecture.md +++ b/ux.symfony.com/cookbook/component_architecture.md @@ -1,6 +1,6 @@ --- -title: Component architecture -description: Rules and pattern to work with components +title: Component Architecture +description: Rules and patterns for working with components image: images/cookbook/component-architecture.png tags: - JavaScript @@ -11,25 +11,25 @@ published_at: '2024-08-02' ## Introduction -In Symfony UX exist two packages: [TwigComponents](https://symfony.com/bundles/ux-twig-component/current/index.html) and [LiveComponent](https://symfony.com/bundles/ux-live-component/current/index.html). -Those two packages allow you to create reusable components in your Symfony application. -But the component architecture is not exclusive to Symfony, it's a design pattern that can be applied to any programming language or framework. -And the Javascript world already implements this architecture for long time, on many different frameworks like React, Vue, or Svelte. -So, a set of rules and patterns has already be defined to work with components. This is why Symfony UX tries to be as close as possible to those rules. -So, let's see what those rules are! +In Symfony UX, there are two packages: [TwigComponents](https://symfony.com/bundles/ux-twig-component/current/index.html) and [LiveComponent](https://symfony.com/bundles/ux-live-component/current/index.html). +These packages allow you to create reusable components in your Symfony application. +However, component architecture is not exclusive to Symfony; it's a design pattern that can be applied to any programming language or framework. +The JavaScript world has implemented this architecture for a long time, across many frameworks like React, Vue, or Svelte. +A set of rules and patterns has already been defined for working with components. This is why Symfony UX tries to adhere closely to these rules. +Let's explore what these rules are! ## 4 Rules ### Composition -A page is no longer just a page, but rather a collection of small, reusable components. -These components can be assembled to form a page. For example, there could be a component for the title and another for the training list. -The training list component could even be composed of smaller components, such as a training card component. -The goal is to create the most atomic, and reusable components possible. +A page is no longer just a page but rather a collection of small, reusable components. +These components can be assembled to form a page. For example, there could be a component for the title and another for the training list. +The training list component could even be composed of smaller components, such as a training card component. +The goal is to create the most atomic and reusable components possible. -#### How does it work into Symfony? +***How does it work in Symfony?*** -In Symfony you can have a component Alert for example with the following template: +In Symfony, you can have an `Alert` component, for example, with the following template: ```twig
@@ -38,8 +38,8 @@ In Symfony you can have a component Alert for example with the following templat
``` -So here you can see we have an alert component that his himself use an Icon component. -Or you can make composition with the following syntax: +So here you can see we have an `Alert` component that itself uses an Icon component. +Or you can compose with the following syntax: ```twig @@ -50,30 +50,29 @@ Or you can make composition with the following syntax: ``` -So here we have a Card component, and we give to the content of this component two other components. +So here we have a `Card` component, and we provide the content of this component with two other components. ### Independence -This is a really important rule, and not obvious. But your component should live on his own context, -it should not be aware of the rest of the page. You should be able to take a component into a page, from another and it should work exactly the same. +This is a really important rule and not an obvious one. Your component should live in its own context; it +should not be aware of the rest of the page. You should be able to take a component from one page to another, and it should work exactly the same. This rule makes your component truly reusable. -***How does it work into Symfony?*** +***How does it work in Symfony?*** -Symfony keeps the context of the page into the context of your component. So this your own responsibility to follow those rules. -But notice that if there are conflicts between a variable from the context page and your component, your component context overrides the page context. +Symfony keeps the context of the page within the context of your component. So it is your own responsibility to follow these rules. +Note that if there are conflicts between a variable from the context page and your component, your component context overrides the page context. ### Props -Our component must remain independent, but we can customize it props. -Let's take the example of a button component. You have your component that look on every page the same, -the only change is the label. What you can do is to declare a prop `label` into your button component. -And so now when you want to use your button component, you can pass the label you want as props. The component gonna take -this props at his initialization and keep it all his life long. +Our component must remain independent, but we can customize its props. +For example, consider a button component. You want your component to look the same on every page, with the only change being the label. +To do this, you can declare a `label` prop in your button component. +When you use your button component, you can pass the label you want as a prop. The component will take this prop at initialization and keep it throughout its lifecycle. -***How does it work into Symfony?*** +***How does it work in Symfony?*** -Let's take the example of the Alert component an [anonymous component](https://symfony.com/bundles/ux-twig-component/current/index.html#anonymous-components). +Let's take the example of the `Alert` component as an [anonymous component](https://symfony.com/bundles/ux-twig-component/current/index.html#anonymous-components). We have the following template: ```twig @@ -85,16 +84,16 @@ We have the following template:
``` -Just like that we define three props for our Alert component. And know we can use like this: +Just like that, we define three props for our `Alert` component. We can now use it like this: ```twig ``` -If your component anonymous but a class component, you can simply define props -by adding property to your class. +If your component is not anonymous but a class component, you can define props by adding properties to your class. ```php +#[AsTwigComponent] class Alert { public string $type; @@ -103,35 +102,32 @@ class Alert } ``` -There are something really important to notice with props. It's your props -should only go into one direction from the parent to child. But your props should never -go up. **If your child need to change something in the parent, you should use events**. +There is something important to note with props: They should only flow in one direction, from parent to child. Props should never go up. **If your child needs to change something in the parent, you should use events.** ### State -A state is pretty much like a prop but the main difference is a state can +A state is pretty much like a prop, but the main difference is that a state can change during the life of the component. Let's take the example of a button component. -You can have a state `loading` that can be `true` or `false`. When the button is clicked -the state `loading` can be set to `true` and the button can display a loader instead of the label. -And when the loading is done, the state `loading` can be set to `false` and the button can display the label again. +You can have a `loading` state that can be `true` or `false`. When the button is clicked +the `loading` state can be set to `true`, and the button can display a loader instead of the label. +When the loading is done, the `loading` state can be set to `false`, and the button can display the label again. -***How does it work into Symfony?*** +***How does it work in Symfony?*** -In Symfony you have two different approaches to handle state. The first one is to use stimulus directly -in to your component. What we recommend to do is to set a controller stimulus at the root of your component. +In Symfony, you have two different approaches to handle state. The first is to use Stimulus directly in your component. We recommend setting a Stimulus controller at the root of your component. ```twig {% props label %} - ``` -And then you can define your controller like this: +Then, you can define your controller like this: ```js -import { Controller } from 'stimulus'; +import { Controller } from '@hotwired/stimulus'; export default class extends Controller { static values = { label: String }; @@ -147,11 +143,11 @@ export default class extends Controller { ``` The second approach is to use the [LiveComponent](https://symfony.com/bundles/ux-live-component/current/index.html) package. -How to choose between the two? If your component don't need any backend logic -for his state keep it simple and use stimulus approach. But if you need to handle +How to choose between the two? If your component doesn't need any backend logic +for its state, keep it simple and use the Stimulus approach. But if you need to handle backend logic for your state, use LiveComponent. -With live component a live prop is a state. So if you want store the number of click on a button you can do -the following component: +With LiveComponent, a live prop is a state. So if you want to store the number of clicks on a button you can do +so with the following component: ```php clicks++; @@ -175,6 +172,6 @@ class Button ## Conclusion -Even in Symfony, you can use the component architecture. -Follow those rules help your front developers working on codebase -they are familiar with since those rules are already used in the JS world. +Even in Symfony, you can use component architecture. +Following these rules helps your front-end developers work on a codebase they are familiar with since these rules are +already widely used in the JavaScript world. From 0a862d7fa78534c81d790220d92499a9ebc919d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 18 Aug 2024 00:33:48 +0200 Subject: [PATCH 17/64] [LiveComponent] Fix PHP8.4 errors + deprecations --- .../Command/SearchIconCommandTest.php | 13 +- src/LiveComponent/composer.json | 2 +- src/LiveComponent/phpunit.xml.dist | 2 +- .../tests/Fixtures/Dto/HoldsArrayOfDtos.php | 11 +- .../Fixtures/Entity/TodoItemFixtureEntity.php | 7 +- .../Factory/CompositeIdEntityFactory.php | 28 +--- .../Factory/ForeignKeyIdEntityFactory.php | 28 +--- src/LiveComponent/tests/Fixtures/Kernel.php | 12 +- .../Fixtures/Serializer/Entity2Normalizer.php | 2 +- .../Fixtures/Serializer/MoneyNormalizer.php | 2 +- .../LiveComponentSubscriberTest.php | 4 +- .../tests/Functional/LiveResponderTest.php | 2 +- .../ValidatableComponentTraitTest.php | 2 +- .../DataModelPropsSubscriberTest.php | 2 +- .../DoctrineEntityHydrationExtensionTest.php | 6 +- .../Integration/LiveComponentHydratorTest.php | 141 +++++++++--------- .../Twig/LiveComponentExtensionTest.php | 2 +- .../Twig/LiveComponentRuntimeTest.php | 2 +- .../Util/FingerprintCalculatorTest.php | 8 +- 19 files changed, 125 insertions(+), 151 deletions(-) diff --git a/src/Icons/tests/Integration/Command/SearchIconCommandTest.php b/src/Icons/tests/Integration/Command/SearchIconCommandTest.php index d0584250628..1e2de70476b 100644 --- a/src/Icons/tests/Integration/Command/SearchIconCommandTest.php +++ b/src/Icons/tests/Integration/Command/SearchIconCommandTest.php @@ -23,19 +23,20 @@ final class SearchIconCommandTest extends KernelTestCase public function testSearchWithPrefix(): void { - $this->consoleCommand('ux:icons:search lucide') + $this->consoleCommand('ux:icons:search iconoir') ->execute() ->assertSuccessful() ->assertOutputContains('Icon set') - ->assertOutputContains('Lucide') + ->assertOutputContains('Iconoir') ->assertOutputContains('Icons') ->assertOutputContains('License') - ->assertOutputContains('ISC') + ->assertOutputContains('MIT') ->assertOutputContains('Prefix') - ->assertOutputContains('lucide') + ->assertOutputContains('iconoir') ->assertOutputContains('Example') - ->assertOutputContains('lucide:') - ->assertOutputContains('php bin/console ux:icons:search lucide'); + ->assertOutputContains('iconoir:') + ->assertOutputContains('php bin/console ux:icons:search iconoir') + ->assertStatusCode(0); } public function testSearchWithPrefixMatchingMultipleSet(): void diff --git a/src/LiveComponent/composer.json b/src/LiveComponent/composer.json index c9b2898c93f..4647b49437a 100644 --- a/src/LiveComponent/composer.json +++ b/src/LiveComponent/composer.json @@ -51,7 +51,7 @@ "symfony/twig-bundle": "^5.4|^6.0|^7.0", "symfony/validator": "^5.4|^6.0|^7.0", "zenstruck/browser": "^1.2.0", - "zenstruck/foundry": "1.37.*" + "zenstruck/foundry": "^2.0" }, "conflict": { "symfony/config": "<5.4.0" diff --git a/src/LiveComponent/phpunit.xml.dist b/src/LiveComponent/phpunit.xml.dist index 87b89d583e8..ca2df4fe442 100644 --- a/src/LiveComponent/phpunit.xml.dist +++ b/src/LiveComponent/phpunit.xml.dist @@ -18,7 +18,7 @@ - + diff --git a/src/LiveComponent/tests/Fixtures/Dto/HoldsArrayOfDtos.php b/src/LiveComponent/tests/Fixtures/Dto/HoldsArrayOfDtos.php index 13eaec51f94..10d026bf5a2 100644 --- a/src/LiveComponent/tests/Fixtures/Dto/HoldsArrayOfDtos.php +++ b/src/LiveComponent/tests/Fixtures/Dto/HoldsArrayOfDtos.php @@ -2,12 +2,21 @@ declare(strict_types=1); +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Symfony\UX\LiveComponent\Tests\Fixtures\Dto; final class HoldsArrayOfDtos { /** - * @var Address[] $addresses + * @var Address[] */ public array $addresses; } diff --git a/src/LiveComponent/tests/Fixtures/Entity/TodoItemFixtureEntity.php b/src/LiveComponent/tests/Fixtures/Entity/TodoItemFixtureEntity.php index 33abeb3461d..0598d7fb801 100644 --- a/src/LiveComponent/tests/Fixtures/Entity/TodoItemFixtureEntity.php +++ b/src/LiveComponent/tests/Fixtures/Entity/TodoItemFixtureEntity.php @@ -24,15 +24,12 @@ class TodoItemFixtureEntity public $id; #[ORM\Column(type: 'string')] - private ?string $name = null; + private ?string $name; #[ORM\ManyToOne(targetEntity: TodoListFixtureEntity::class, inversedBy: 'todoItems')] private TodoListFixtureEntity $todoList; - /** - * @param string $name - */ - public function __construct(string $name = null) + public function __construct(?string $name = null) { $this->name = $name; } diff --git a/src/LiveComponent/tests/Fixtures/Factory/CompositeIdEntityFactory.php b/src/LiveComponent/tests/Fixtures/Factory/CompositeIdEntityFactory.php index 7cdf882da60..dcb3cdc532e 100644 --- a/src/LiveComponent/tests/Fixtures/Factory/CompositeIdEntityFactory.php +++ b/src/LiveComponent/tests/Fixtures/Factory/CompositeIdEntityFactory.php @@ -11,38 +11,20 @@ namespace Symfony\UX\LiveComponent\Tests\Fixtures\Factory; -use Doctrine\ORM\EntityRepository; use Symfony\UX\LiveComponent\Tests\Fixtures\Entity\CompositeIdEntity; -use Zenstruck\Foundry\ModelFactory; -use Zenstruck\Foundry\Proxy; -use Zenstruck\Foundry\RepositoryProxy; +use Zenstruck\Foundry\Persistence\PersistentProxyObjectFactory; /** - * @extends ModelFactory - * - * @method static CompositeIdEntity|Proxy createOne(array $attributes = []) - * @method static CompositeIdEntity[]|Proxy[] createMany(int $number, array|callable $attributes = []) - * @method static CompositeIdEntity|Proxy find(object|array|mixed $criteria) - * @method static CompositeIdEntity|Proxy findOrCreate(array $attributes) - * @method static CompositeIdEntity|Proxy first(string $sortedField = 'id') - * @method static CompositeIdEntity|Proxy last(string $sortedField = 'id') - * @method static CompositeIdEntity|Proxy random(array $attributes = []) - * @method static CompositeIdEntity|Proxy randomOrCreate(array $attributes = [])) - * @method static CompositeIdEntity[]|Proxy[] all() - * @method static CompositeIdEntity[]|Proxy[] findBy(array $attributes) - * @method static CompositeIdEntity[]|Proxy[] randomSet(int $number, array $attributes = [])) - * @method static CompositeIdEntity[]|Proxy[] randomRange(int $min, int $max, array $attributes = [])) - * @method static EntityRepository|RepositoryProxy repository() - * @method CompositeIdEntity|Proxy create(array|callable $attributes = []) + * @extends PersistentProxyObjectFactory */ -class CompositeIdEntityFactory extends ModelFactory +class CompositeIdEntityFactory extends PersistentProxyObjectFactory { - protected static function getClass(): string + public static function class(): string { return CompositeIdEntity::class; } - protected function getDefaults(): array + protected function defaults(): array { return [ 'firstIdPart' => rand(1, \PHP_INT_MAX), diff --git a/src/LiveComponent/tests/Fixtures/Factory/ForeignKeyIdEntityFactory.php b/src/LiveComponent/tests/Fixtures/Factory/ForeignKeyIdEntityFactory.php index ba5f9ac537d..241eec7eb81 100644 --- a/src/LiveComponent/tests/Fixtures/Factory/ForeignKeyIdEntityFactory.php +++ b/src/LiveComponent/tests/Fixtures/Factory/ForeignKeyIdEntityFactory.php @@ -11,41 +11,23 @@ namespace Symfony\UX\LiveComponent\Tests\Fixtures\Factory; -use Doctrine\ORM\EntityRepository; use Symfony\UX\LiveComponent\Tests\Fixtures\Entity\Entity1; use Symfony\UX\LiveComponent\Tests\Fixtures\Entity\ForeignKeyIdEntity; -use Zenstruck\Foundry\ModelFactory; -use Zenstruck\Foundry\Proxy; -use Zenstruck\Foundry\RepositoryProxy; +use Zenstruck\Foundry\Persistence\PersistentProxyObjectFactory; use function Zenstruck\Foundry\lazy; /** - * @extends ModelFactory - * - * @method static ForeignKeyIdEntity|Proxy createOne(array $attributes = []) - * @method static ForeignKeyIdEntity[]|Proxy[] createMany(int $number, array|callable $attributes = []) - * @method static ForeignKeyIdEntity|Proxy find(object|array|mixed $criteria) - * @method static ForeignKeyIdEntity|Proxy findOrCreate(array $attributes) - * @method static ForeignKeyIdEntity|Proxy first(string $sortedField = 'id') - * @method static ForeignKeyIdEntity|Proxy last(string $sortedField = 'id') - * @method static ForeignKeyIdEntity|Proxy random(array $attributes = []) - * @method static ForeignKeyIdEntity|Proxy randomOrCreate(array $attributes = [])) - * @method static ForeignKeyIdEntity[]|Proxy[] all() - * @method static ForeignKeyIdEntity[]|Proxy[] findBy(array $attributes) - * @method static ForeignKeyIdEntity[]|Proxy[] randomSet(int $number, array $attributes = [])) - * @method static ForeignKeyIdEntity[]|Proxy[] randomRange(int $min, int $max, array $attributes = [])) - * @method static EntityRepository|RepositoryProxy repository() - * @method ForeignKeyIdEntity|Proxy create(array|callable $attributes = []) + * @extends PersistentProxyObjectFactory */ -class ForeignKeyIdEntityFactory extends ModelFactory +class ForeignKeyIdEntityFactory extends PersistentProxyObjectFactory { - protected static function getClass(): string + public static function class(): string { return ForeignKeyIdEntity::class; } - protected function getDefaults(): array + protected function defaults(): array { return ['id' => lazy(static fn () => new Entity1())]; } diff --git a/src/LiveComponent/tests/Fixtures/Kernel.php b/src/LiveComponent/tests/Fixtures/Kernel.php index b8b4df0bb95..b7d901877e6 100644 --- a/src/LiveComponent/tests/Fixtures/Kernel.php +++ b/src/LiveComponent/tests/Fixtures/Kernel.php @@ -51,14 +51,14 @@ public function index(): Response return new Response('index'); } - public function renderTemplate(string $template, Environment $twig = null): Response + public function renderTemplate(string $template, ?Environment $twig = null): Response { $twig ??= $this->container->get('twig'); return new Response($twig->render("{$template}.html.twig")); } - public function renderNamespacedTemplate(string $template, Environment $twig = null): Response + public function renderNamespacedTemplate(string $template, ?Environment $twig = null): Response { $twig ??= $this->container->get('twig'); @@ -171,6 +171,7 @@ protected function configureContainer(ContainerConfigurator $c): void ], ], ]; + if (null !== $doctrineBundleVersion = InstalledVersions::getVersion('doctrine/doctrine-bundle')) { if (version_compare($doctrineBundleVersion, '2.8.0', '>=')) { $doctrineConfig['orm']['enable_lazy_ghost_objects'] = true; @@ -181,14 +182,13 @@ protected function configureContainer(ContainerConfigurator $c): void $doctrineConfig['orm']['validate_xml_mapping'] = true; $doctrineConfig['dbal']['schema_manager_factory'] = 'doctrine.dbal.default_schema_manager_factory'; } + if (version_compare($doctrineBundleVersion, '2.12.0', '>=')) { + $doctrineConfig['orm']['controller_resolver']['auto_mapping'] = false; + } } $c->extension('doctrine', $doctrineConfig); - $c->extension('zenstruck_foundry', [ - 'auto_refresh_proxies' => false, - ]); - $c->services() ->defaults() ->autowire() diff --git a/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php b/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php index c1b449e46b7..b63331a3dce 100644 --- a/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php +++ b/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php @@ -47,7 +47,7 @@ public function supportsNormalization(mixed $data, string $format = null, array return $data instanceof Entity2; } - public function getSupportedTypes(?string $format): array + public function getSupportedTypes(?string $format = null): array { return [Entity2::class => true]; } diff --git a/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php b/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php index a666230f548..90889a47327 100644 --- a/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php +++ b/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php @@ -37,7 +37,7 @@ public function supportsNormalization(mixed $data, string $format = null, array return $data instanceof Money; } - public function getSupportedTypes(?string $format): array + public function getSupportedTypes(string $format = null): array { return [Money::class => true]; } diff --git a/src/LiveComponent/tests/Functional/EventListener/LiveComponentSubscriberTest.php b/src/LiveComponent/tests/Functional/EventListener/LiveComponentSubscriberTest.php index dce6db3c76a..e4a877341c4 100644 --- a/src/LiveComponent/tests/Functional/EventListener/LiveComponentSubscriberTest.php +++ b/src/LiveComponent/tests/Functional/EventListener/LiveComponentSubscriberTest.php @@ -22,7 +22,7 @@ use Zenstruck\Foundry\Test\Factories; use Zenstruck\Foundry\Test\ResetDatabase; -use function Zenstruck\Foundry\create; +use function Zenstruck\Foundry\Persistence\persist; /** * @author Kevin Bond @@ -48,7 +48,7 @@ final class LiveComponentSubscriberTest extends KernelTestCase public function testCanRenderComponentAsHtml(): void { $component = $this->mountComponent('component1', [ - 'prop1' => $entity = create(Entity1::class)->object(), + 'prop1' => $entity = persist(Entity1::class), 'prop2' => $date = new \DateTime('2021-03-05 9:23'), 'prop3' => 'value3', 'prop4' => 'value4', diff --git a/src/LiveComponent/tests/Functional/LiveResponderTest.php b/src/LiveComponent/tests/Functional/LiveResponderTest.php index f47b60d20dd..8d533164eb9 100644 --- a/src/LiveComponent/tests/Functional/LiveResponderTest.php +++ b/src/LiveComponent/tests/Functional/LiveResponderTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\UX\LiveComponent\Tests\Functional\EventListener; +namespace Symfony\UX\LiveComponent\Tests\Functional; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\UX\LiveComponent\Tests\LiveComponentTestHelper; diff --git a/src/LiveComponent/tests/Functional/ValidatableComponentTraitTest.php b/src/LiveComponent/tests/Functional/ValidatableComponentTraitTest.php index 1d59eadd18e..ce8d02fc88f 100644 --- a/src/LiveComponent/tests/Functional/ValidatableComponentTraitTest.php +++ b/src/LiveComponent/tests/Functional/ValidatableComponentTraitTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\UX\LiveComponent\Tests\Functional\Form; +namespace Symfony\UX\LiveComponent\Tests\Functional; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\UX\LiveComponent\Tests\LiveComponentTestHelper; diff --git a/src/LiveComponent/tests/Integration/EventListener/DataModelPropsSubscriberTest.php b/src/LiveComponent/tests/Integration/EventListener/DataModelPropsSubscriberTest.php index 2b5ea2371e4..34b1326a0bb 100644 --- a/src/LiveComponent/tests/Integration/EventListener/DataModelPropsSubscriberTest.php +++ b/src/LiveComponent/tests/Integration/EventListener/DataModelPropsSubscriberTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\UX\LiveComponent\Tests\Integration; +namespace Symfony\UX\LiveComponent\Tests\Integration\EventListener; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\HttpFoundation\Request; diff --git a/src/LiveComponent/tests/Integration/Hydration/DoctrineEntityHydrationExtensionTest.php b/src/LiveComponent/tests/Integration/Hydration/DoctrineEntityHydrationExtensionTest.php index ff7b60ca04e..1b9de696f8b 100644 --- a/src/LiveComponent/tests/Integration/Hydration/DoctrineEntityHydrationExtensionTest.php +++ b/src/LiveComponent/tests/Integration/Hydration/DoctrineEntityHydrationExtensionTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\UX\LiveComponent\Tests\Unit\Hydration; +namespace Symfony\UX\LiveComponent\Tests\Integration\Hydration; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\UX\LiveComponent\Hydration\DoctrineEntityHydrationExtension; @@ -27,7 +27,7 @@ class DoctrineEntityHydrationExtensionTest extends KernelTestCase public function testCompositeId(): void { - $compositeIdEntity = CompositeIdEntityFactory::createOne()->save()->object(); + $compositeIdEntity = CompositeIdEntityFactory::createOne()->_real(); /** @var DoctrineEntityHydrationExtension $extension */ $extension = self::getContainer()->get('ux.live_component.doctrine_entity_hydration_extension'); @@ -40,7 +40,7 @@ public function testCompositeId(): void public function testForeignKeyId(): void { - $foreignKeyIdEntity = ForeignKeyIdEntityFactory::createOne()->save()->object(); + $foreignKeyIdEntity = ForeignKeyIdEntityFactory::createOne()->_real(); /** @var DoctrineEntityHydrationExtension $extension */ $extension = self::getContainer()->get('ux.live_component.doctrine_entity_hydration_extension'); diff --git a/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php b/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php index d29a1ab4d6c..511a5580f72 100644 --- a/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php +++ b/src/LiveComponent/tests/Integration/LiveComponentHydratorTest.php @@ -44,7 +44,9 @@ use Zenstruck\Foundry\Test\Factories; use Zenstruck\Foundry\Test\ResetDatabase; -use function Zenstruck\Foundry\create; +use function Zenstruck\Foundry\object; +use function Zenstruck\Foundry\Persistence\persist; +use function Zenstruck\Foundry\Persistence\proxy; /** * @author Kevin Bond @@ -61,7 +63,7 @@ private function executeHydrationTestCase(callable $testFactory, ?int $minPhpVer $this->markTestSkipped(\sprintf('Test requires PHP version %s or higher.', $minPhpVersion)); } - // lazily create the test case so each case can prep its data with an isolated container + // lazily persist the test case so each case can prep its data with an isolated container $testBuilder = $testFactory(); if (!$testBuilder instanceof HydrationTest) { throw new \InvalidArgumentException('Test case callable must return a HydrationTest instance.'); @@ -77,7 +79,6 @@ private function executeHydrationTestCase(callable $testFactory, ?int $minPhpVer $hydratedComponent2 = clone $testCase->component; $liveMetadata = $testCase->liveMetadata; - $this->factory()->mountFromObject( $originalComponentWithData, $testCase->inputProps, @@ -180,9 +181,9 @@ public function onFirstNameUpdated($oldValue) }]; yield 'onUpdated: set to an array' => [function () { - $product = create(ProductFixtureEntity::class, [ + $product = persist(ProductFixtureEntity::class, [ 'name' => 'Chicken', - ])->object(); + ]); return HydrationTest::create(new class { #[LiveProp(writable: ['name'], onUpdated: ['name' => 'onNameUpdated'])] @@ -203,8 +204,8 @@ public function onNameUpdated($oldValue) }]; yield 'onUpdated: with IDENTITY' => [function () { - $entityOriginal = create(Entity1::class)->object(); - $entityNext = create(Entity1::class)->object(); + $entityOriginal = persist(Entity1::class); + $entityNext = persist(Entity1::class); \assert($entityOriginal instanceof Entity1); \assert($entityNext instanceof Entity1); @@ -236,7 +237,7 @@ public function onEntireEntityUpdated($oldValue) yield 'string: (de)hydrates correctly' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public string $firstName; }) ->mountWith(['firstName' => 'Ryan']) @@ -248,7 +249,7 @@ public function onEntireEntityUpdated($oldValue) yield 'string: changing non-writable causes checksum fail' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public string $firstName; }) ->mountWith(['firstName' => 'Ryan']) @@ -294,7 +295,7 @@ public function onEntireEntityUpdated($oldValue) $date = new \DateTime('2023-03-05 9:23', new \DateTimeZone('America/New_York')); return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public \DateTime $createdAt; }) ->mountWith(['createdAt' => $date]) @@ -309,11 +310,11 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Persisted entity: (de)hydration works correctly to/from id' => [function () { - $entity1 = create(Entity1::class)->object(); + $entity1 = persist(Entity1::class); \assert($entity1 instanceof Entity1); return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public Entity1 $entity1; }) ->mountWith(['entity1' => $entity1]) @@ -328,8 +329,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Persisted entity: writable CAN be changed via id' => [function () { - $entityOriginal = create(Entity1::class)->object(); - $entityNext = create(Entity1::class)->object(); + $entityOriginal = persist(Entity1::class); + $entityNext = persist(Entity1::class); \assert($entityOriginal instanceof Entity1); \assert($entityNext instanceof Entity1); @@ -349,8 +350,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Persisted entity: writable (via IDENTITY constant) CAN be changed via id' => [function () { - $entityOriginal = create(Entity1::class)->object(); - $entityNext = create(Entity1::class)->object(); + $entityOriginal = persist(Entity1::class); + $entityNext = persist(Entity1::class); \assert($entityOriginal instanceof Entity1); \assert($entityNext instanceof Entity1); @@ -370,9 +371,9 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Persisted entity: non-writable identity but with writable paths updates correctly' => [function () { - $product = create(ProductFixtureEntity::class, [ + $product = persist(ProductFixtureEntity::class, [ 'name' => 'Rubber Chicken', - ])->object(); + ]); return HydrationTest::create(new class { #[LiveProp(writable: ['name'])] @@ -400,16 +401,16 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Persisted entity: deleting entity between dehydration and hydration sets it to null' => [function () { - $product = create(ProductFixtureEntity::class); + $product = proxy(persist(ProductFixtureEntity::class)); return HydrationTest::create(new class { // test that event the writable path doesn't cause problems #[LiveProp(writable: ['name'])] public ?ProductFixtureEntity $product; }) - ->mountWith(['product' => $product->object()]) + ->mountWith(['product' => $product->_real()]) ->beforeHydration(function () use ($product) { - $product->remove(); + $product->_delete(); }) ->assertObjectAfterHydration(function (object $object) { self::assertNull( @@ -420,7 +421,7 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Persisted entity: with custom_normalizer and embeddable (de)hydrates correctly' => [function () { - $entity2 = create(Entity2::class, ['embedded1' => new Embeddable1('bar'), 'embedded2' => new Embeddable2('baz')])->object(); + $entity2 = persist(Entity2::class, ['embedded1' => new Embeddable1('bar'), 'embedded2' => new Embeddable2('baz')]); return HydrationTest::create(new class { #[LiveProp(useSerializerForHydration: true)] @@ -470,7 +471,7 @@ public function onEntireEntityUpdated($oldValue) yield 'Index array: (de)hydrates correctly' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public array $foods = []; }) ->mountWith(['foods' => ['banana', 'popcorn']]) @@ -504,7 +505,7 @@ public function onEntireEntityUpdated($oldValue) yield 'Associative array: (de)hyrates correctly' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public array $options = []; }) ->mountWith(['options' => [ @@ -733,7 +734,7 @@ public function onEntireEntityUpdated($oldValue) yield 'Empty array: (de)hydrates correctly' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public array $foods = []; }) ->mountWith([]) @@ -748,9 +749,9 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Array with objects: (de)hydrates correctly' => [function () { - $prod1 = create(ProductFixtureEntity::class, ['name' => 'item1'])->object(); + $prod1 = persist(ProductFixtureEntity::class, ['name' => 'item1']); $prod2 = new ProductFixtureEntity(); - $prod3 = create(ProductFixtureEntity::class, ['name' => 'item3'])->object(); + $prod3 = persist(ProductFixtureEntity::class, ['name' => 'item3']); return HydrationTest::create(new DummyObjectWithObjects()) ->mountWith(['products' => [$prod1, $prod2, $prod3]]) @@ -778,10 +779,10 @@ public function onEntireEntityUpdated($oldValue) yield 'Enum: null remains null' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public ?IntEnum $int = null; - #[LiveProp()] + #[LiveProp] public ?StringEnum $string = null; }) ->mountWith([]) @@ -795,10 +796,10 @@ public function onEntireEntityUpdated($oldValue) yield 'Enum: (de)hydrates correctly' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public ?IntEnum $int = null; - #[LiveProp()] + #[LiveProp] public ?StringEnum $string = null; }) ->mountWith(['int' => IntEnum::HIGH, 'string' => StringEnum::ACTIVE]) @@ -970,14 +971,14 @@ public function mount() }]; yield 'Array with DTOs: fully writable allows anything to change' => [function () { - $address1 = create(Address::class, ['address' => '17 Arcadia Road', 'city' => 'London'])->object(); - $address2 = create(Address::class, ['address' => '4 Privet Drive', 'city' => 'Little Whinging'])->object(); - $address3 = create(Address::class, ['address' => '124 Conch St.', 'city' => 'Bikini Bottom'])->object(); - $address4 = create(Address::class, ['address' => '32 Windsor Gardens', 'city' => 'London'])->object(); + $address1 = object(Address::class, ['address' => '17 Arcadia Road', 'city' => 'London']); + $address2 = object(Address::class, ['address' => '4 Privet Drive', 'city' => 'Little Whinging']); + $address3 = object(Address::class, ['address' => '124 Conch St.', 'city' => 'Bikini Bottom']); + $address4 = object(Address::class, ['address' => '32 Windsor Gardens', 'city' => 'London']); return HydrationTest::create(new class { /** - * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address[] + * @var \Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address[] */ #[LiveProp(writable: true, useSerializerForHydration: true)] public array $addresses = []; @@ -996,19 +997,19 @@ public function mount() ->userUpdatesProps(['addresses' => [$address3, $address4]]) ->assertObjectAfterHydration(function (object $object) { self::assertEquals([ - create(Address::class, ['address' => '124 Conch St.', 'city' => 'Bikini Bottom'])->object(), - create(Address::class, ['address' => '32 Windsor Gardens', 'city' => 'London'])->object(), + object(Address::class, ['address' => '124 Conch St.', 'city' => 'Bikini Bottom']), + object(Address::class, ['address' => '32 Windsor Gardens', 'city' => 'London']), ], $object->addresses); }); }]; yield 'Array with DTOs: fully writable allows partial changes' => [function () { - $address1 = create(Address::class, ['address' => '1600 Pennsylvania Avenue', 'city' => 'Washington DC'])->object(); - $address2 = create(Address::class, ['address' => '221 B Baker St', 'city' => 'Birmingham'])->object(); + $address1 = object(Address::class, ['address' => '1600 Pennsylvania Avenue', 'city' => 'Washington DC']); + $address2 = object(Address::class, ['address' => '221 B Baker St', 'city' => 'Birmingham']); return HydrationTest::create(new class { /** - * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address[] + * @var \Symfony\UX\LiveComponent\Tests\Fixtures\Dto\Address[] */ #[LiveProp(writable: true, useSerializerForHydration: true)] public array $addresses = []; @@ -1027,8 +1028,8 @@ public function mount() ->userUpdatesProps(['addresses.1.city' => 'London']) ->assertObjectAfterHydration(function (object $object) { self::assertEquals([ - create(Address::class, ['address' => '1600 Pennsylvania Avenue', 'city' => 'Washington DC'])->object(), - create(Address::class, ['address' => '221 B Baker St', 'city' => 'London'])->object(), + object(Address::class, ['address' => '1600 Pennsylvania Avenue', 'city' => 'Washington DC']), + object(Address::class, ['address' => '221 B Baker St', 'city' => 'London']), ], $object->addresses); }); }]; @@ -1036,21 +1037,21 @@ public function mount() yield 'Array with DTOs: fully writable allows deep partial changes' => [function () { return HydrationTest::create(new class { /** - * @var Symfony\UX\LiveComponent\Tests\Fixtures\Dto\HoldsArrayOfDtos[] + * @var \Symfony\UX\LiveComponent\Tests\Fixtures\Dto\HoldsArrayOfDtos[] $dtos */ #[LiveProp(writable: true, useSerializerForHydration: true)] public array $dtos = []; }) ->mountWith(['dtos' => [ - create(HoldsArrayOfDtos::class, ['addresses' => [ - create(Address::class, ['address' => '742 Evergreen Terrace', 'city' => 'Boston'])->object(), - create(Address::class, ['address' => 'Apartment 5A, 129 West 81st Street', 'city' => 'New York'])->object(), - create(Address::class, ['address' => '52 Festive Road', 'city' => 'London'])->object(), - ]])->object(), - create(HoldsArrayOfDtos::class, ['addresses' => [ - create(Address::class, ['address' => '698 Sycamore Road', 'city' => 'San Pueblo'])->object(), - create(Address::class, ['address' => 'Madison Square Garden', 'city' => 'Chicago'])->object(), - ]])->object(), + object(HoldsArrayOfDtos::class, ['addresses' => [ + object(Address::class, ['address' => '742 Evergreen Terrace', 'city' => 'Boston']), + object(Address::class, ['address' => 'Apartment 5A, 129 West 81st Street', 'city' => 'New York']), + object(Address::class, ['address' => '52 Festive Road', 'city' => 'London']), + ]]), + object(HoldsArrayOfDtos::class, ['addresses' => [ + object(Address::class, ['address' => '698 Sycamore Road', 'city' => 'San Pueblo']), + object(Address::class, ['address' => 'Madison Square Garden', 'city' => 'Chicago']), + ]]), ]]) ->assertDehydratesTo(['dtos' => [ [ @@ -1070,20 +1071,20 @@ public function mount() ->userUpdatesProps([ 'dtos.0.addresses.0.city' => 'Springfield', 'dtos.1.addresses.1.address' => '1060 West Addison Street', - 'dtos.1.addresses.1' => create(Address::class, ['address' => '10 Downing Street', 'city' => 'London'])->object(), + 'dtos.1.addresses.1' => object(Address::class, ['address' => '10 Downing Street', 'city' => 'London']), ]) ->assertObjectAfterHydration(function (object $object) { self::assertEquals( [ - create(HoldsArrayOfDtos::class, ['addresses' => [ - create(Address::class, ['address' => '742 Evergreen Terrace', 'city' => 'Springfield'])->object(), - create(Address::class, ['address' => 'Apartment 5A, 129 West 81st Street', 'city' => 'New York'])->object(), - create(Address::class, ['address' => '52 Festive Road', 'city' => 'London'])->object(), - ]])->object(), - create(HoldsArrayOfDtos::class, ['addresses' => [ - create(Address::class, ['address' => '698 Sycamore Road', 'city' => 'San Pueblo'])->object(), - create(Address::class, ['address' => '10 Downing Street', 'city' => 'London'])->object(), - ]])->object(), + object(HoldsArrayOfDtos::class, ['addresses' => [ + object(Address::class, ['address' => '742 Evergreen Terrace', 'city' => 'Springfield']), + object(Address::class, ['address' => 'Apartment 5A, 129 West 81st Street', 'city' => 'New York']), + object(Address::class, ['address' => '52 Festive Road', 'city' => 'London']), + ]]), + object(HoldsArrayOfDtos::class, ['addresses' => [ + object(Address::class, ['address' => '698 Sycamore Road', 'city' => 'San Pueblo']), + object(Address::class, ['address' => '10 Downing Street', 'city' => 'London']), + ]]), ], $object->dtos ); @@ -1209,7 +1210,7 @@ public function mount() yield 'Updating non-writable property is rejected' => [function () { return HydrationTest::create(new class { - #[LiveProp()] + #[LiveProp] public string $name; }) ->mountWith(['name' => 'Ryan']) @@ -1258,7 +1259,7 @@ public function mount() yield 'It is valid to dehydrate to a fully-writable array' => [function () { return HydrationTest::create(new class { - #[LiveProp(writable: true, dehydrateWith: 'dehydrateDate', hydrateWith: 'hydrateDate')] + #[LiveProp(writable: true, hydrateWith: 'hydrateDate', dehydrateWith: 'dehydrateDate')] public \DateTime $createdAt; public function __construct() @@ -1503,10 +1504,10 @@ public static function provideInvalidHydrationTests(): iterable }]; yield 'invalid_types_writable_path_values_not_accepted' => [function () { - $product = create(ProductFixtureEntity::class, [ + $product = persist(ProductFixtureEntity::class, [ 'name' => 'oranges', 'price' => 199, - ])->object(); + ]); return HydrationTest::create(new class { #[LiveProp(writable: ['name', 'price'])] @@ -1913,7 +1914,9 @@ public function __construct( class DummyObjectWithObjects { - #[LiveProp()] - /** @var ProductFixtureEntity[] */ + /** + * @var ProductFixtureEntity[] + */ + #[LiveProp] public array $products = []; } diff --git a/src/LiveComponent/tests/Integration/Twig/LiveComponentExtensionTest.php b/src/LiveComponent/tests/Integration/Twig/LiveComponentExtensionTest.php index 57d253e60a4..abfd0a1c6cb 100644 --- a/src/LiveComponent/tests/Integration/Twig/LiveComponentExtensionTest.php +++ b/src/LiveComponent/tests/Integration/Twig/LiveComponentExtensionTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\UX\LiveComponent\Tests\Integration; +namespace Symfony\UX\LiveComponent\Tests\Integration\Twig; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; diff --git a/src/LiveComponent/tests/Integration/Twig/LiveComponentRuntimeTest.php b/src/LiveComponent/tests/Integration/Twig/LiveComponentRuntimeTest.php index 350ce2bfde0..1b6884ea40e 100644 --- a/src/LiveComponent/tests/Integration/Twig/LiveComponentRuntimeTest.php +++ b/src/LiveComponent/tests/Integration/Twig/LiveComponentRuntimeTest.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Symfony\UX\LiveComponent\Tests\Integration; +namespace Symfony\UX\LiveComponent\Tests\Integration\Twig; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\UX\LiveComponent\Twig\LiveComponentRuntime; diff --git a/src/LiveComponent/tests/Integration/Util/FingerprintCalculatorTest.php b/src/LiveComponent/tests/Integration/Util/FingerprintCalculatorTest.php index 0371ed7c4fe..8a5edd9b653 100644 --- a/src/LiveComponent/tests/Integration/Util/FingerprintCalculatorTest.php +++ b/src/LiveComponent/tests/Integration/Util/FingerprintCalculatorTest.php @@ -18,7 +18,7 @@ use Zenstruck\Foundry\Test\Factories; use Zenstruck\Foundry\Test\ResetDatabase; -use function Zenstruck\Foundry\create; +use function Zenstruck\Foundry\Persistence\persist; final class FingerprintCalculatorTest extends KernelTestCase { @@ -28,7 +28,7 @@ final class FingerprintCalculatorTest extends KernelTestCase public function testFingerprintEqual() { $fingerprintCalculator = $this->getFingerprintCalculator(); - $entityOne = create(Entity1::class)->object(); + $entityOne = persist(Entity1::class); $entityTwo = clone $entityOne; @@ -61,9 +61,9 @@ public function testFingerprintNotEqual() { $fingerprintCalculator = $this->getFingerprintCalculator(); - $entityOne = create(Entity1::class)->object(); + $entityOne = persist(Entity1::class); - $entityTwo = create(Entity1::class)->object(); + $entityTwo = persist(Entity1::class); $metadata1 = $this->createMock(LiveComponentMetadata::class); $metadata1 From 80ee61d1ceda73b1f41b3d61dd44232b2e9204be Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 29 Aug 2024 17:58:59 +0200 Subject: [PATCH 18/64] [Doc] Fix a Twig function name in UX Map docs --- src/Map/doc/index.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Map/doc/index.rst b/src/Map/doc/index.rst index e3788243291..a90b9400a57 100644 --- a/src/Map/doc/index.rst +++ b/src/Map/doc/index.rst @@ -124,11 +124,12 @@ To render a map in your Twig template, use the ``ux_map`` Twig function, e.g.: .. code-block:: twig - {{ ux_map(my_map) }} - - {# or with custom attributes #} + {# to be visible, the map must have a defined height #} {{ ux_map(my_map, { style: 'height: 300px' }) }} + {# you can add custom HTML attributes too #} + {{ ux_map(my_map, { style: 'height: 300px', id: 'events-map', class: 'mb-3' }) }} + Extend the default behavior ~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 2cb3cfed58193440bd5366f64b709e1a8037ca4c Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 30 Aug 2024 16:58:11 +0200 Subject: [PATCH 19/64] [UX Map] Misc updates in the docs --- src/Map/doc/index.rst | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/Map/doc/index.rst b/src/Map/doc/index.rst index a90b9400a57..8231ea46149 100644 --- a/src/Map/doc/index.rst +++ b/src/Map/doc/index.rst @@ -44,14 +44,14 @@ The ``UX_MAP_DSN`` environment variable configure which renderer to use. Available renderers ~~~~~~~~~~~~~~~~~~~ -========== =============================================================== +============== =============================================================== Renderer -========== =============================================================== -`Google`_ **Install**: ``composer require symfony/ux-google-map`` \ - **DSN**: ``UX_MAP_DSN=google://GOOGLE_MAPS_API_KEY@default`` \ -`Leaflet`_ **Install**: ``composer require symfony/ux-leaflet-map`` \ - **DSN**: ``UX_MAP_DSN=leaflet://default`` \ -========== =============================================================== +============== =============================================================== +`Google Maps`_ **Install**: ``composer require symfony/ux-google-map`` \ + **DSN**: ``UX_MAP_DSN=google://GOOGLE_MAPS_API_KEY@default`` \ +`Leaflet`_ **Install**: ``composer require symfony/ux-leaflet-map`` \ + **DSN**: ``UX_MAP_DSN=leaflet://default`` \ +============== =============================================================== Usage ----- @@ -102,14 +102,20 @@ A map is created by calling ``new Map()``. You can configure the center, zoom, a ) )) - // You can also pass extra data, that you can later use in your custom Stimulus controller - // when listening to "ux:map:marker:before-create" event: + // You can also pass arbitrary data via the `extra` option in both the marker + // and the infoWindow; you can later use this data in your custom Stimulus controllers ->addMarker(new Marker( - position: new Point(46.5074666, 6.633729), - title: 'Olympic Parc', + // ... extra: [ 'icon_mask_url' => 'https://maps.gstatic.com/mapfiles/place_api/icons/v2/tree_pinlet.svg', - ] + ], + infoWindow: new InfoWindow( + // ... + extra: [ + 'num_items' => 3, + 'includes_link' => true, + ], + ), ) ; @@ -204,6 +210,12 @@ Symfony UX Map allows you to extend its default behavior using a custom Stimulus } } +.. tip:: + + Read the `Symfony UX Map Leaflet bridge docs`_ and the + `Symfony UX Map Google Maps brige docs`_ to learn about the exact code + needed to customize the markers. + Then, you can use this controller in your template: .. code-block:: twig @@ -219,5 +231,7 @@ https://symfony.com/doc/current/contributing/code/bc.html .. _`the Symfony UX initiative`: https://ux.symfony.com/ .. _StimulusBundle configured in your app: https://symfony.com/bundles/StimulusBundle/current/index.html -.. _`Google`: https://github.com/symfony/symfony-ux/blob/{version}/src/Map/src/Bridge/Google/README.md -.. _`Leaflet`: https://github.com/symfony/symfony-ux/blob/{version}/src/Map/src/Bridge/Leaflet/README.md +.. _`Google Maps`: https://github.com/symfony/ux-google-map +.. _`Leaflet`: https://github.com/symfony/ux-leaflet-map +.. _`Symfony UX Map Google Maps brige docs`: https://github.com/symfony/symfony-ux/blob/{version}/src/Map/src/Bridge/Google/README.md +.. _`Symfony UX Map Leaflet bridge docs`: https://github.com/symfony/symfony-ux/blob/{version}/src/Map/src/Bridge/Leaflet/README.md From ffce80449f962d875fccc8b90a2721c088c10a5b Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Sat, 31 Aug 2024 11:00:56 +0200 Subject: [PATCH 20/64] [Map][Leaflet] Rename `leaflet` to `L` in event's payloads --- src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js | 2 +- src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js index be7f8e4cbaa..466d40c5dce 100644 --- a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js +++ b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js @@ -18,7 +18,7 @@ class map_controller extends AbstractMapController { prefix: 'ux:map', detail: { ...payload, - leaflet: L, + L, }, }); } diff --git a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts index 7cccc56928c..ec6a78dd8db 100644 --- a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts +++ b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts @@ -33,7 +33,7 @@ export default class extends AbstractMapController< prefix: 'ux:map', detail: { ...payload, - leaflet: L, + L, }, }); } From 4057b11a30b577b3a2f78d2f5638b2213e01b71c Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Sat, 31 Aug 2024 12:13:38 +0200 Subject: [PATCH 21/64] [TwigComponent] Remove `$tag` parameter from `*Node`, as it is now deprecated by twig/twig 3.12 --- src/TwigComponent/src/Twig/ComponentNode.php | 4 ++-- src/TwigComponent/src/Twig/ComponentTokenParser.php | 2 +- src/TwigComponent/src/Twig/PropsNode.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/TwigComponent/src/Twig/ComponentNode.php b/src/TwigComponent/src/Twig/ComponentNode.php index 5fd9b2f5f82..2c0561c64a6 100644 --- a/src/TwigComponent/src/Twig/ComponentNode.php +++ b/src/TwigComponent/src/Twig/ComponentNode.php @@ -29,14 +29,14 @@ #[YieldReady] final class ComponentNode extends Node implements NodeOutputInterface { - public function __construct(string $component, string $embeddedTemplateName, int $embeddedTemplateIndex, ?AbstractExpression $props, bool $only, int $lineno, string $tag) + public function __construct(string $component, string $embeddedTemplateName, int $embeddedTemplateIndex, ?AbstractExpression $props, bool $only, int $lineno) { $nodes = []; if (null !== $props) { $nodes['props'] = $props; } - parent::__construct($nodes, [], $lineno, $tag); + parent::__construct($nodes, [], $lineno); $this->setAttribute('only', $only); $this->setAttribute('embedded_template', $embeddedTemplateName); diff --git a/src/TwigComponent/src/Twig/ComponentTokenParser.php b/src/TwigComponent/src/Twig/ComponentTokenParser.php index dbb1cf74250..3f94c09d627 100644 --- a/src/TwigComponent/src/Twig/ComponentTokenParser.php +++ b/src/TwigComponent/src/Twig/ComponentTokenParser.php @@ -67,7 +67,7 @@ public function parse(Token $token): Node $stream->expect(Token::BLOCK_END_TYPE); - return new ComponentNode($componentName, $module->getTemplateName(), $module->getAttribute('index'), $propsExpression, $only, $token->getLine(), $this->getTag()); + return new ComponentNode($componentName, $module->getTemplateName(), $module->getAttribute('index'), $propsExpression, $only, $token->getLine()); } public function getTag(): string diff --git a/src/TwigComponent/src/Twig/PropsNode.php b/src/TwigComponent/src/Twig/PropsNode.php index 97f98d51df1..36374fa630f 100644 --- a/src/TwigComponent/src/Twig/PropsNode.php +++ b/src/TwigComponent/src/Twig/PropsNode.php @@ -23,9 +23,9 @@ #[YieldReady] class PropsNode extends Node { - public function __construct(array $propsNames, array $values, $lineno = 0, ?string $tag = null) + public function __construct(array $propsNames, array $values, $lineno = 0) { - parent::__construct($values, ['names' => $propsNames], $lineno, $tag); + parent::__construct($values, ['names' => $propsNames], $lineno); } public function compile(Compiler $compiler): void From e5e9b9073cdea34b9383c76ac8c853edfc389dc7 Mon Sep 17 00:00:00 2001 From: Iv Po Date: Fri, 23 Aug 2024 09:36:21 +0300 Subject: [PATCH 22/64] [Autocomplete] Reset form state on each request for applications that reuse the Symfony application between requests --- .../src/DependencyInjection/AutocompleteFormTypePass.php | 3 ++- .../src/Form/WrappedEntityTypeAutocompleter.php | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Autocomplete/src/DependencyInjection/AutocompleteFormTypePass.php b/src/Autocomplete/src/DependencyInjection/AutocompleteFormTypePass.php index 7ef489a65dc..b07c23fce7c 100644 --- a/src/Autocomplete/src/DependencyInjection/AutocompleteFormTypePass.php +++ b/src/Autocomplete/src/DependencyInjection/AutocompleteFormTypePass.php @@ -47,7 +47,8 @@ private function processEntityAutocompleteFieldTag(ContainerBuilder $container) $wrappedDefinition = (new ChildDefinition('ux.autocomplete.wrapped_entity_type_autocompleter')) // the "formType" string ->replaceArgument(0, $serviceDefinition->getClass()) - ->addTag(self::ENTITY_AUTOCOMPLETER_TAG, ['alias' => $alias]); + ->addTag(self::ENTITY_AUTOCOMPLETER_TAG, ['alias' => $alias]) + ->addTag('kernel.reset', ['method' => 'reset']); $container->setDefinition('ux.autocomplete.wrapped_entity_type_autocompleter.'.$alias, $wrappedDefinition); } } diff --git a/src/Autocomplete/src/Form/WrappedEntityTypeAutocompleter.php b/src/Autocomplete/src/Form/WrappedEntityTypeAutocompleter.php index 67ddbac0f72..b83c7407ad7 100644 --- a/src/Autocomplete/src/Form/WrappedEntityTypeAutocompleter.php +++ b/src/Autocomplete/src/Form/WrappedEntityTypeAutocompleter.php @@ -19,6 +19,7 @@ use Symfony\Component\Form\FormInterface; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; use Symfony\Component\PropertyAccess\PropertyPathInterface; +use Symfony\Contracts\Service\ResetInterface; use Symfony\UX\Autocomplete\Doctrine\EntityMetadata; use Symfony\UX\Autocomplete\Doctrine\EntityMetadataFactory; use Symfony\UX\Autocomplete\Doctrine\EntitySearchUtil; @@ -29,7 +30,7 @@ * * @internal */ -final class WrappedEntityTypeAutocompleter implements OptionsAwareEntityAutocompleterInterface +final class WrappedEntityTypeAutocompleter implements OptionsAwareEntityAutocompleterInterface, ResetInterface { private ?FormInterface $form = null; private ?EntityMetadata $entityMetadata = null; @@ -188,4 +189,10 @@ public function setOptions(array $options): void $this->options = $options; } + + public function reset(): void + { + unset($this->form); + $this->form = null; + } } From 8367a29c56a1cb4f6e33e4211ce5fb8a62bc9bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 31 Aug 2024 22:39:35 +0200 Subject: [PATCH 23/64] [Site] Fix icon on Twig Component * missing icon class * invert code block and result * now use symfony/ux-icons --- ux.symfony.com/src/Twig/Alert.php | 14 ++-------- .../templates/components/Alert.html.twig | 2 +- .../ux_packages/twig_component.html.twig | 28 +++++++++---------- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/ux.symfony.com/src/Twig/Alert.php b/ux.symfony.com/src/Twig/Alert.php index 081c92a12ef..f24dfcd4b00 100644 --- a/ux.symfony.com/src/Twig/Alert.php +++ b/ux.symfony.com/src/Twig/Alert.php @@ -11,7 +11,6 @@ namespace App\Twig; -use App\Service\UxPackageRepository; use Symfony\UX\TwigComponent\Attribute\AsTwigComponent; #[AsTwigComponent] @@ -20,20 +19,11 @@ class Alert public string $type = 'success'; public string $message; - public function __construct(private UxPackageRepository $packageRepository) - { - } - public function getIcon(): string { return match ($this->type) { - 'success' => 'circle-check', - 'danger' => 'circle-exclamation', + 'success' => 'bi:check-circle', + 'danger' => 'bi:exclamation-circle', }; } - - public function getPackageCount(): int - { - return $this->packageRepository->count(); - } } diff --git a/ux.symfony.com/templates/components/Alert.html.twig b/ux.symfony.com/templates/components/Alert.html.twig index 3c0a7a2dcc3..66bb8e1c7ef 100644 --- a/ux.symfony.com/templates/components/Alert.html.twig +++ b/ux.symfony.com/templates/components/Alert.html.twig @@ -1,4 +1,4 @@ diff --git a/ux.symfony.com/templates/ux_packages/twig_component.html.twig b/ux.symfony.com/templates/ux_packages/twig_component.html.twig index 017757ed88e..843a33dde1c 100644 --- a/ux.symfony.com/templates/ux_packages/twig_component.html.twig +++ b/ux.symfony.com/templates/ux_packages/twig_component.html.twig @@ -26,12 +26,7 @@ {% block demo_title %}UX Twig Components{% endblock %} {% block demo_content %} -
-
- {% block alert_success_example %} - - {% endblock %} -
+
-
- -
- {% block alert_danger_example %} - + {% block alert_success_example %} + {% endblock %}
+
+ +
+
+ {% block alert_danger_example %} + + {% endblock %} +
{% endblock %} From 746025a638f19f4196c4ed85f81cfbbd34bbf214 Mon Sep 17 00:00:00 2001 From: Johan de Jager Date: Wed, 28 Aug 2024 16:13:12 +0200 Subject: [PATCH 24/64] [TwigComponent] Add notice about needing `phpdocumentor/reflection-docblock` --- src/LiveComponent/doc/index.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/LiveComponent/doc/index.rst b/src/LiveComponent/doc/index.rst index d858a42dc3b..741b45a0e58 100644 --- a/src/LiveComponent/doc/index.rst +++ b/src/LiveComponent/doc/index.rst @@ -474,6 +474,13 @@ can read:: /** @var Product[] */ public $products = []; +Collection type extraction from the docblock requires the ``phpdocumentor/reflection-docblock`` +library. Make sure it is installed in you application: + +.. code-block:: terminal + + $ composer require phpdocumentor/reflection-docblock + Writable Object Properties or Array Keys ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 6d674e2a204cfa979f9f0ad0faa86fe7c2df6ee9 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Tue, 3 Sep 2024 09:54:10 +0200 Subject: [PATCH 25/64] [Doc] Add some explanation about mixing Twig and HTML syntax in nested components --- src/TwigComponent/doc/index.rst | 45 +++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/TwigComponent/doc/index.rst b/src/TwigComponent/doc/index.rst index 842e4f21e40..ce98de2f895 100644 --- a/src/TwigComponent/doc/index.rst +++ b/src/TwigComponent/doc/index.rst @@ -271,6 +271,8 @@ You can control the template used via the ``AsTwigComponent`` attribute: You can also configure the default template directory for an entire namespace. See :ref:`Configuration `. +.. _component_html_syntax: + Component HTML Syntax ~~~~~~~~~~~~~~~~~~~~~ @@ -1585,11 +1587,44 @@ listen to ``PreMountEvent`` or ``PostMountEvent``. Nested Components ----------------- -It's totally possible to nest one component into another. When you do -this, there's nothing special to know: both components render -independently. If you're using `Live Components`_, then there -*are* some guidelines related to how the re-rendering of parent and -child components works. Read `Live Nested Components`_. +It's totally possible to include components as part of the contents of another +component. When you do this, all components render independently. The only +caveat is that you cannot mix the Twig syntax and the :ref:`HTML syntax ` +when using nested components: + +.. code-block:: html+twig + + {# ❌ this won't work because it mixes different syntaxes #} + + {# ... #} + + {% block footer %} + Edit + {% endblock %} + + + {# ✅ this works because it only uses the HTML syntax #} + + {# ... #} + + + Edit + + + + {# ✅ this also works because it only uses the Twig syntax #} + + {# ... #} + + + {% component 'Button:Primary' with {isBlock: true} %} + {% block content %}Edit{% endblock %} + {% endcomponent %} + + + +If you're using `Live Components`_, then there *are* some guidelines related to +how the re-rendering of parent and child components works. Read `Live Nested Components`_. Configuration ------------- From 779960955efbf7fd04256b036387f2b9ff513923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Thu, 5 Sep 2024 23:11:53 +0200 Subject: [PATCH 26/64] [Site] Fix icon modal * clipboard icons placement * some links were not properly clickable --- ux.symfony.com/assets/controllers/icon-modal-controller.js | 4 ++-- ux.symfony.com/assets/styles/components/_IconModal.scss | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ux.symfony.com/assets/controllers/icon-modal-controller.js b/ux.symfony.com/assets/controllers/icon-modal-controller.js index 50d15865d54..c77da9f0379 100644 --- a/ux.symfony.com/assets/controllers/icon-modal-controller.js +++ b/ux.symfony.com/assets/controllers/icon-modal-controller.js @@ -51,8 +51,6 @@ export default class extends Controller { } onClick(event) { - event.preventDefault(); - event.stopImmediatePropagation(); const dialogDimensions = this.element.getBoundingClientRect() if ( event.clientX < dialogDimensions.left || @@ -60,6 +58,8 @@ export default class extends Controller { event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom ) { + event.preventDefault(); + event.stopImmediatePropagation(); this.close() } } diff --git a/ux.symfony.com/assets/styles/components/_IconModal.scss b/ux.symfony.com/assets/styles/components/_IconModal.scss index 63bd5bb7119..381d446f1d9 100644 --- a/ux.symfony.com/assets/styles/components/_IconModal.scss +++ b/ux.symfony.com/assets/styles/components/_IconModal.scss @@ -187,6 +187,9 @@ .IconModal__code button { opacity: .25; + position: absolute; + right: 0; + top: .5rem; } .IconModal__code:hover { From 2f00e3f3bc252420109b4061c880984a38f9ce6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Mon, 2 Sep 2024 22:15:53 +0200 Subject: [PATCH 27/64] [LiveComponent] Add `setRouteLocale` in `TestLiveComponent` --- src/LiveComponent/doc/index.rst | 3 +++ .../src/Test/TestLiveComponent.php | 26 +++++++++++++++---- .../Fixtures/Component/LocalizedRoute.php | 15 +++++++++++ src/LiveComponent/tests/Fixtures/Kernel.php | 1 + .../components/localized_route.html.twig | 3 +++ .../Test/InteractsWithLiveComponentsTest.php | 17 ++++++++++++ 6 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 src/LiveComponent/tests/Fixtures/Component/LocalizedRoute.php create mode 100644 src/LiveComponent/tests/Fixtures/templates/components/localized_route.html.twig diff --git a/src/LiveComponent/doc/index.rst b/src/LiveComponent/doc/index.rst index d858a42dc3b..29e39579f95 100644 --- a/src/LiveComponent/doc/index.rst +++ b/src/LiveComponent/doc/index.rst @@ -3711,6 +3711,9 @@ uses Symfony's test client to render and make requests to your components:: // authenticate a user ($user is instance of UserInterface) $testComponent->actingAs($user); + // set the '_locale' route parameter (if the component route is localized) + $testComponent->setRouteLocale('fr'); + // customize the test client $client = self::getContainer()->get('test.client'); diff --git a/src/LiveComponent/src/Test/TestLiveComponent.php b/src/LiveComponent/src/Test/TestLiveComponent.php index d1f6d537580..98def7aa7de 100644 --- a/src/LiveComponent/src/Test/TestLiveComponent.php +++ b/src/LiveComponent/src/Test/TestLiveComponent.php @@ -31,6 +31,8 @@ final class TestLiveComponent { private bool $performedInitialRequest = false; + private ?string $locale = null; + /** * @internal */ @@ -132,6 +134,17 @@ public function submitForm(array $formValues, ?string $action = null): self return $this->request(['updated' => $flattenValues, 'validatedFields' => array_keys($flattenValues)], $action); } + /** + * @experimental + */ + public function setRouteLocale(string $locale): self + { + $this->performedInitialRequest = false; + $this->locale = $locale; + + return $this; + } + private function request(array $content = [], ?string $action = null, array $files = []): self { $csrfToken = $this->csrfToken(); @@ -143,7 +156,8 @@ private function request(array $content = [], ?string $action = null, array $fil array_filter([ '_live_component' => $this->metadata->getName(), '_live_action' => $action, - ]) + '_locale' => $this->locale, + ], static fn (mixed $v): bool => null !== $v), ), parameters: ['data' => json_encode(array_merge($content, ['props' => $this->props()]))], files: $files, @@ -191,9 +205,10 @@ private function client(): KernelBrowser if ('POST' === strtoupper($this->metadata->get('method'))) { $this->client->request( 'POST', - $this->router->generate($this->metadata->get('route'), [ + $this->router->generate($this->metadata->get('route'), array_filter([ '_live_component' => $this->metadata->getName(), - ]), + '_locale' => $this->locale, + ], static fn (mixed $v): bool => null !== $v)), [ 'data' => json_encode(['props' => $props->getProps()], flags: \JSON_THROW_ON_ERROR), ], @@ -201,10 +216,11 @@ private function client(): KernelBrowser } else { $this->client->request('GET', $this->router->generate( $this->metadata->get('route'), - [ + array_filter([ '_live_component' => $this->metadata->getName(), + '_locale' => $this->locale, 'props' => json_encode($props->getProps(), flags: \JSON_THROW_ON_ERROR), - ] + ], static fn (mixed $v): bool => null !== $v), )); } diff --git a/src/LiveComponent/tests/Fixtures/Component/LocalizedRoute.php b/src/LiveComponent/tests/Fixtures/Component/LocalizedRoute.php new file mode 100644 index 00000000000..2398d7e3080 --- /dev/null +++ b/src/LiveComponent/tests/Fixtures/Component/LocalizedRoute.php @@ -0,0 +1,15 @@ +add('render_namespaced_template', '/render-namespaced-template/{template}')->controller('kernel::renderNamespacedTemplate'); $routes->add('homepage', '/')->controller('kernel::index'); $routes->add('alternate_live_route', '/alt/{_live_component}/{_live_action}')->defaults(['_live_action' => 'get']); + $routes->add('localized_route', '/locale/{_locale}/{_live_component}/{_live_action}')->defaults(['_live_action' => 'get']); } } diff --git a/src/LiveComponent/tests/Fixtures/templates/components/localized_route.html.twig b/src/LiveComponent/tests/Fixtures/templates/components/localized_route.html.twig new file mode 100644 index 00000000000..47d4f260267 --- /dev/null +++ b/src/LiveComponent/tests/Fixtures/templates/components/localized_route.html.twig @@ -0,0 +1,3 @@ + + Localized route Locale: {{ app.request.locale }} +
diff --git a/src/LiveComponent/tests/Functional/Test/InteractsWithLiveComponentsTest.php b/src/LiveComponent/tests/Functional/Test/InteractsWithLiveComponentsTest.php index 52ed1bd6c3a..b6c6ef6ce8b 100644 --- a/src/LiveComponent/tests/Functional/Test/InteractsWithLiveComponentsTest.php +++ b/src/LiveComponent/tests/Functional/Test/InteractsWithLiveComponentsTest.php @@ -194,4 +194,21 @@ public function testAccessAllLivePropsInsideOnUpdatedHook(): void $this->assertStringContainsString('Total: 9', $testComponent->render()); } + + public function testSetLocaleRenderLocalizedComponent(): void + { + $testComponent = $this->createLiveComponent('localized_route'); + $testComponent->setRouteLocale('fr'); + $this->assertStringContainsString('Locale: fr', $testComponent->render()); + + $testComponent->refresh(); + $this->assertStringContainsString('Locale: fr', $testComponent->render()); + + $testComponent->setRouteLocale('es'); + $this->assertStringContainsString('Locale: es', $testComponent->render()); + + $testComponent = $this->createLiveComponent('localized_route'); + $testComponent->setRouteLocale('de'); + $this->assertStringContainsString('Locale: de', $testComponent->render()); + } } From f4c647f207046490635c3acba2d2db97f3c4ba7a Mon Sep 17 00:00:00 2001 From: jmsche Date: Fri, 30 Aug 2024 08:56:09 +0200 Subject: [PATCH 28/64] [Autocomplete] Translate "Add ..." text --- src/Autocomplete/CHANGELOG.md | 4 ++++ src/Autocomplete/assets/dist/controller.d.ts | 2 ++ src/Autocomplete/assets/dist/controller.js | 7 +++++++ src/Autocomplete/assets/src/controller.ts | 17 ++++++++++++++++- .../Form/AutocompleteChoiceTypeExtension.php | 2 ++ .../translations/AutocompleteBundle.ar.php | 1 + .../translations/AutocompleteBundle.bg.php | 1 + .../translations/AutocompleteBundle.ca.php | 1 + .../translations/AutocompleteBundle.cs.php | 1 + .../translations/AutocompleteBundle.da.php | 1 + .../translations/AutocompleteBundle.de.php | 1 + .../translations/AutocompleteBundle.el.php | 1 + .../translations/AutocompleteBundle.en.php | 1 + .../translations/AutocompleteBundle.es.php | 1 + .../translations/AutocompleteBundle.eu.php | 1 + .../translations/AutocompleteBundle.fa.php | 1 + .../translations/AutocompleteBundle.fi.php | 1 + .../translations/AutocompleteBundle.fr.php | 1 + .../translations/AutocompleteBundle.gl.php | 1 + .../translations/AutocompleteBundle.hr.php | 1 + .../translations/AutocompleteBundle.hu.php | 1 + .../translations/AutocompleteBundle.id.php | 1 + .../translations/AutocompleteBundle.it.php | 1 + .../translations/AutocompleteBundle.lb.php | 1 + .../translations/AutocompleteBundle.lt.php | 1 + .../translations/AutocompleteBundle.nl.php | 1 + .../translations/AutocompleteBundle.pl.php | 1 + .../translations/AutocompleteBundle.pt.php | 1 + .../translations/AutocompleteBundle.pt_BR.php | 1 + .../translations/AutocompleteBundle.ro.php | 1 + .../translations/AutocompleteBundle.ru.php | 1 + .../translations/AutocompleteBundle.sk.php | 1 + .../translations/AutocompleteBundle.sl.php | 1 + .../translations/AutocompleteBundle.sr_RS.php | 1 + .../translations/AutocompleteBundle.sv.php | 1 + .../translations/AutocompleteBundle.tr.php | 1 + .../translations/AutocompleteBundle.uk.php | 1 + .../translations/AutocompleteBundle.zh_CN.php | 1 + 38 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/Autocomplete/CHANGELOG.md b/src/Autocomplete/CHANGELOG.md index 645ea18dd40..b869da8e420 100644 --- a/src/Autocomplete/CHANGELOG.md +++ b/src/Autocomplete/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 2.20.0 + +- Translate the `option_create` option from TomSelect #2108 + ## 2.17.0 - Allow `choice_value` option in entity autocomplete fields #1723 diff --git a/src/Autocomplete/assets/dist/controller.d.ts b/src/Autocomplete/assets/dist/controller.d.ts index 091fcd4c25a..59938a721c6 100644 --- a/src/Autocomplete/assets/dist/controller.d.ts +++ b/src/Autocomplete/assets/dist/controller.d.ts @@ -15,6 +15,7 @@ export default class extends Controller { loadingMoreText: StringConstructor; noResultsFoundText: StringConstructor; noMoreResultsText: StringConstructor; + createOptionText: StringConstructor; minCharacters: NumberConstructor; tomSelectOptions: ObjectConstructor; preload: StringConstructor; @@ -24,6 +25,7 @@ export default class extends Controller { readonly loadingMoreTextValue: string; readonly noMoreResultsTextValue: string; readonly noResultsFoundTextValue: string; + readonly createOptionTextValue: string; readonly minCharactersValue: number; readonly hasMinCharactersValue: boolean; readonly tomSelectOptionsValue: object; diff --git a/src/Autocomplete/assets/dist/controller.js b/src/Autocomplete/assets/dist/controller.js index 2f7ab51075d..c6e9660b1d6 100644 --- a/src/Autocomplete/assets/dist/controller.js +++ b/src/Autocomplete/assets/dist/controller.js @@ -239,6 +239,9 @@ _default_1_instances = new WeakSet(), _default_1_getCommonConfig = function _def no_results: () => { return `
${this.noResultsFoundTextValue}
`; }, + option_create: (data, escapeData) => { + return `
${this.createOptionTextValue.replace('%placeholder%', `${escapeData(data.input)}`)}
`; + }, }; const config = { render, @@ -314,6 +317,9 @@ _default_1_instances = new WeakSet(), _default_1_getCommonConfig = function _def no_results: () => { return `
${this.noResultsFoundTextValue}
`; }, + option_create: (data, escapeData) => { + return `
${this.createOptionTextValue} ${escapeData(data.input)}
`; + }, }, preload: this.preload, }); @@ -336,6 +342,7 @@ default_1.values = { loadingMoreText: String, noResultsFoundText: String, noMoreResultsText: String, + createOptionText: String, minCharacters: Number, tomSelectOptions: Object, preload: String, diff --git a/src/Autocomplete/assets/src/controller.ts b/src/Autocomplete/assets/src/controller.ts index a7006cf47d2..af7f096a387 100644 --- a/src/Autocomplete/assets/src/controller.ts +++ b/src/Autocomplete/assets/src/controller.ts @@ -1,7 +1,14 @@ import { Controller } from '@hotwired/stimulus'; import TomSelect from 'tom-select'; import type { TPluginHash } from 'tom-select/dist/types/contrib/microplugin'; -import type { RecursivePartial, TomSettings, TomTemplates, TomLoadCallback } from 'tom-select/dist/types/types'; +import type { + RecursivePartial, + TomSettings, + TomTemplates, + TomLoadCallback, + TomOption, +} from 'tom-select/dist/types/types'; +import type { escape_html } from 'tom-select/dist/types/utils'; export interface AutocompletePreConnectOptions { options: any; @@ -18,6 +25,7 @@ export default class extends Controller { loadingMoreText: String, noResultsFoundText: String, noMoreResultsText: String, + createOptionText: String, minCharacters: Number, tomSelectOptions: Object, preload: String, @@ -28,6 +36,7 @@ export default class extends Controller { declare readonly loadingMoreTextValue: string; declare readonly noMoreResultsTextValue: string; declare readonly noResultsFoundTextValue: string; + declare readonly createOptionTextValue: string; declare readonly minCharactersValue: number; declare readonly hasMinCharactersValue: boolean; declare readonly tomSelectOptionsValue: object; @@ -136,6 +145,9 @@ export default class extends Controller { no_results: () => { return `
${this.noResultsFoundTextValue}
`; }, + option_create: (data: TomOption, escapeData: typeof escape_html): string => { + return `
${this.createOptionTextValue.replace('%placeholder%', `${escapeData(data.input)}`)}
`; + }, }; const config: RecursivePartial = { @@ -240,6 +252,9 @@ export default class extends Controller { no_results: (): string => { return `
${this.noResultsFoundTextValue}
`; }, + option_create: (data: TomOption, escapeData: typeof escape_html): string => { + return `
${this.createOptionTextValue} ${escapeData(data.input)}
`; + }, }, preload: this.preload, }); diff --git a/src/Autocomplete/src/Form/AutocompleteChoiceTypeExtension.php b/src/Autocomplete/src/Form/AutocompleteChoiceTypeExtension.php index 3942018d76e..149805e99e6 100644 --- a/src/Autocomplete/src/Form/AutocompleteChoiceTypeExtension.php +++ b/src/Autocomplete/src/Form/AutocompleteChoiceTypeExtension.php @@ -91,6 +91,7 @@ public function finishView(FormView $view, FormInterface $form, array $options): $values['loading-more-text'] = $this->trans($options['loading_more_text']); $values['no-results-found-text'] = $this->trans($options['no_results_found_text']); $values['no-more-results-text'] = $this->trans($options['no_more_results_text']); + $values['create-option-text'] = $this->trans($options['create_option_text']); $values['preload'] = $options['preload']; foreach ($values as $name => $value) { @@ -147,6 +148,7 @@ public function configureOptions(OptionsResolver $resolver): void 'loading_more_text' => 'Loading more results...', 'no_results_found_text' => 'No results found', 'no_more_results_text' => 'No more results', + 'create_option_text' => 'Add %placeholder%...', 'min_characters' => null, 'max_results' => 10, 'preload' => 'focus', diff --git a/src/Autocomplete/translations/AutocompleteBundle.ar.php b/src/Autocomplete/translations/AutocompleteBundle.ar.php index b8ced4cb620..7c76d412b57 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.ar.php +++ b/src/Autocomplete/translations/AutocompleteBundle.ar.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'تحميل المزيد من النتائج...', 'No results found' => 'لم يتم العثور على أي نتائج', 'No more results' => 'لا توجد نتائج أٌخرى', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.bg.php b/src/Autocomplete/translations/AutocompleteBundle.bg.php index e16b6aea717..a585ef797b1 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.bg.php +++ b/src/Autocomplete/translations/AutocompleteBundle.bg.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Зареждане на още резултати...', 'No results found' => 'Няма намерени съвпадения', 'No more results' => 'Няма повече резултати', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.ca.php b/src/Autocomplete/translations/AutocompleteBundle.ca.php index 4b0ddaaaf71..ce06d8fb987 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.ca.php +++ b/src/Autocomplete/translations/AutocompleteBundle.ca.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'S\'estan carregant més resultats...', 'No results found' => 'No s\'han trobat resultats', 'No more results' => 'No hi ha més resultats', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.cs.php b/src/Autocomplete/translations/AutocompleteBundle.cs.php index c90cbcf4274..32c80c00609 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.cs.php +++ b/src/Autocomplete/translations/AutocompleteBundle.cs.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Načítání dalších výsledků...', 'No results found' => 'Nenalezeny žádné položky', 'No more results' => 'Žádné další výsledky', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.da.php b/src/Autocomplete/translations/AutocompleteBundle.da.php index d77714f91f9..af51c8f9c9c 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.da.php +++ b/src/Autocomplete/translations/AutocompleteBundle.da.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Indlæser flere resultater...', 'No results found' => 'Ingen resultater fundet', 'No more results' => 'Ingen flere resultater', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.de.php b/src/Autocomplete/translations/AutocompleteBundle.de.php index d26583b48cf..fb5729ba0a0 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.de.php +++ b/src/Autocomplete/translations/AutocompleteBundle.de.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Lade weitere Ergebnisse...', 'No results found' => 'Keine Übereinstimmungen gefunden', 'No more results' => 'Keine weiteren Ergebnisse', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.el.php b/src/Autocomplete/translations/AutocompleteBundle.el.php index 6ded7859242..7af4394674e 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.el.php +++ b/src/Autocomplete/translations/AutocompleteBundle.el.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Φόρτωση περισσότερων αποτελεσμάτων...', 'No results found' => 'Δεν βρέθηκαν αποτελέσματα', 'No more results' => 'Δεν υπάρχουν άλλα αποτελέσματα', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.en.php b/src/Autocomplete/translations/AutocompleteBundle.en.php index 21e99d3a83d..74321f9492a 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.en.php +++ b/src/Autocomplete/translations/AutocompleteBundle.en.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Loading more results...', 'No results found' => 'No results found', 'No more results' => 'No more results', + 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.es.php b/src/Autocomplete/translations/AutocompleteBundle.es.php index 6d7345abb4b..083ac8b2b64 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.es.php +++ b/src/Autocomplete/translations/AutocompleteBundle.es.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Cargando más resultados...', 'No results found' => 'No se han encontrado resultados', 'No more results' => 'No hay más resultados', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.eu.php b/src/Autocomplete/translations/AutocompleteBundle.eu.php index 98cb18d73a9..1da49763b0b 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.eu.php +++ b/src/Autocomplete/translations/AutocompleteBundle.eu.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Emaitza gehiago kargatzen...', 'No results found' => 'Ez da bat datorrenik aurkitu', 'No more results' => 'Ez dago emaitza gehiagorik', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.fa.php b/src/Autocomplete/translations/AutocompleteBundle.fa.php index 06db64f42e2..0ef1ba0cc0d 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.fa.php +++ b/src/Autocomplete/translations/AutocompleteBundle.fa.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'در حال بارگذاری نتایج بیشتر...', 'No results found' => 'هیچ نتیجه‌ای یافت نشد', 'No more results' => 'نتیجه دیگری وجود ندارد', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.fi.php b/src/Autocomplete/translations/AutocompleteBundle.fi.php index de081b9fbc4..c91ccc0f2bd 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.fi.php +++ b/src/Autocomplete/translations/AutocompleteBundle.fi.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Ladataan lisää tuloksia...', 'No results found' => 'Ei tuloksia', 'No more results' => 'Ei enempää tuloksia', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.fr.php b/src/Autocomplete/translations/AutocompleteBundle.fr.php index abb3c600f33..397d5658524 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.fr.php +++ b/src/Autocomplete/translations/AutocompleteBundle.fr.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Chargement d\'autres résultats...', 'No results found' => 'Aucun résultat trouvé', 'No more results' => 'Aucun autre résultat trouvé', + 'Add %placeholder%...' => 'Ajouter %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.gl.php b/src/Autocomplete/translations/AutocompleteBundle.gl.php index 76975202acd..f696f2e0eec 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.gl.php +++ b/src/Autocomplete/translations/AutocompleteBundle.gl.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Cargando máis resultados...', 'No results found' => 'Non se atoparon resultados', 'No more results' => 'Non hai máis resultados', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.hr.php b/src/Autocomplete/translations/AutocompleteBundle.hr.php index 57f7aecaf32..7b82612062e 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.hr.php +++ b/src/Autocomplete/translations/AutocompleteBundle.hr.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Učitavanje više rezultata...', 'No results found' => 'Nema rezultata', 'No more results' => 'Nema više rezultata', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.hu.php b/src/Autocomplete/translations/AutocompleteBundle.hu.php index 565a25c3f0a..d224f62c232 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.hu.php +++ b/src/Autocomplete/translations/AutocompleteBundle.hu.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'További találatok betöltése...', 'No results found' => 'Nincs találat', 'No more results' => 'Nincs több találat', + 'Add %placeholder%...' => '"%placeholder%" hozzáadása', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.id.php b/src/Autocomplete/translations/AutocompleteBundle.id.php index 8ca5f81f50c..5816520a25b 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.id.php +++ b/src/Autocomplete/translations/AutocompleteBundle.id.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Memuat hasil lebih banyak...', 'No results found' => 'Tidak ada hasil yang ditemukan', 'No more results' => 'Tidak ada hasil lagi', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.it.php b/src/Autocomplete/translations/AutocompleteBundle.it.php index 815238b1508..463d01bcff3 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.it.php +++ b/src/Autocomplete/translations/AutocompleteBundle.it.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Caricamento di altri risultati...', 'No results found' => 'Nessun risultato trovato', 'No more results' => 'Non ci sono altri risultati', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.lb.php b/src/Autocomplete/translations/AutocompleteBundle.lb.php index 79be23c3e39..b613d6427e3 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.lb.php +++ b/src/Autocomplete/translations/AutocompleteBundle.lb.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Lueden méi Resultater...', 'No results found' => 'Keng Resultater fonnt', 'No more results' => 'Keng weider Resultater', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.lt.php b/src/Autocomplete/translations/AutocompleteBundle.lt.php index ed464e45d69..4fe965611d2 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.lt.php +++ b/src/Autocomplete/translations/AutocompleteBundle.lt.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Kraunama daugiau rezultatų...', 'No results found' => 'Atitikmenų nerasta', 'No more results' => 'Daugiau rezultatų nėra', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.nl.php b/src/Autocomplete/translations/AutocompleteBundle.nl.php index 78b82dd9912..d9a2a90c092 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.nl.php +++ b/src/Autocomplete/translations/AutocompleteBundle.nl.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Meer resultaten aan het laden...', 'No results found' => 'Geen resultaten gevonden…', 'No more results' => 'Niet meer resultaten gevonden…', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.pl.php b/src/Autocomplete/translations/AutocompleteBundle.pl.php index a5f8b2c2dc8..7a206574b43 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.pl.php +++ b/src/Autocomplete/translations/AutocompleteBundle.pl.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Wczytywanie więcej wyników...', 'No results found' => 'Brak wyników', 'No more results' => 'Brak więcej wyników', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.pt.php b/src/Autocomplete/translations/AutocompleteBundle.pt.php index bd8d827fe48..a7f348b9c3f 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.pt.php +++ b/src/Autocomplete/translations/AutocompleteBundle.pt.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Carregando mais resultados...', 'No results found' => 'Sem resultados', 'No more results' => 'Não há mais resultados', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.pt_BR.php b/src/Autocomplete/translations/AutocompleteBundle.pt_BR.php index 4e136e00238..84da3fe0ed2 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.pt_BR.php +++ b/src/Autocomplete/translations/AutocompleteBundle.pt_BR.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Carregando mais resultados...', 'No results found' => 'Nenhum resultado encontrado', 'No more results' => 'Não há mais resultados', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.ro.php b/src/Autocomplete/translations/AutocompleteBundle.ro.php index 7eabfd85845..dd1756d93d8 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.ro.php +++ b/src/Autocomplete/translations/AutocompleteBundle.ro.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Se încarcă mai multe rezultate...', 'No results found' => 'Nu au fost găsite rezultate', 'No more results' => 'Nu mai sunt alte rezultate', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.ru.php b/src/Autocomplete/translations/AutocompleteBundle.ru.php index 1277f42f1f3..5f4ea89780b 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.ru.php +++ b/src/Autocomplete/translations/AutocompleteBundle.ru.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Загрузка дополнительных результатов...', 'No results found' => 'Совпадений не найдено', 'No more results' => 'Больше результатов нет', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.sk.php b/src/Autocomplete/translations/AutocompleteBundle.sk.php index 87f71bde3c3..612dfbe946a 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.sk.php +++ b/src/Autocomplete/translations/AutocompleteBundle.sk.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Načítavajú sa ďalšie výsledky...', 'No results found' => 'Neboli nájdené žiadne výsledky', 'No more results' => 'Žiadne ďalšie výsledky', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.sl.php b/src/Autocomplete/translations/AutocompleteBundle.sl.php index 39437a01c8d..486fd13cef2 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.sl.php +++ b/src/Autocomplete/translations/AutocompleteBundle.sl.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Nalaganje več rezultatov...', 'No results found' => 'Ni zadetkov', 'No more results' => 'Ni več rezultatov', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.sr_RS.php b/src/Autocomplete/translations/AutocompleteBundle.sr_RS.php index efeafae2d0e..9463fd676fc 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.sr_RS.php +++ b/src/Autocomplete/translations/AutocompleteBundle.sr_RS.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Учитавање још резултата...', 'No results found' => 'Nema rezultata', 'No more results' => 'Nema više rezultata', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.sv.php b/src/Autocomplete/translations/AutocompleteBundle.sv.php index 918db3d8846..44eef2bc802 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.sv.php +++ b/src/Autocomplete/translations/AutocompleteBundle.sv.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Laddar fler resultat...', 'No results found' => 'Inga träffar', 'No more results' => 'Inga fler resultat', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.tr.php b/src/Autocomplete/translations/AutocompleteBundle.tr.php index f8d1776f6d3..326d80b400f 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.tr.php +++ b/src/Autocomplete/translations/AutocompleteBundle.tr.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Daha fazla sonuç yükleniyor...', 'No results found' => 'Sonuç bulunamadı', 'No more results' => 'Başka sonuç yok', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.uk.php b/src/Autocomplete/translations/AutocompleteBundle.uk.php index 365114c15f1..10e6b75a11f 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.uk.php +++ b/src/Autocomplete/translations/AutocompleteBundle.uk.php @@ -13,4 +13,5 @@ 'Loading more results...' => 'Завантаження додаткових результатів...', 'No results found' => 'Нічого не знайдено', 'No more results' => 'Більше результатів немає', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; diff --git a/src/Autocomplete/translations/AutocompleteBundle.zh_CN.php b/src/Autocomplete/translations/AutocompleteBundle.zh_CN.php index 7a969be6539..bf64aa7fd7d 100644 --- a/src/Autocomplete/translations/AutocompleteBundle.zh_CN.php +++ b/src/Autocomplete/translations/AutocompleteBundle.zh_CN.php @@ -13,4 +13,5 @@ 'Loading more results...' => '加载更多结果...', 'No results found' => '未找到结果', 'No more results' => '没有更多结果', + // 'Add %placeholder%...' => 'Add %placeholder%...', ]; From 38e007cba2b559f528c42d92349ba72138e0aa69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Fri, 6 Sep 2024 20:26:05 +0200 Subject: [PATCH 29/64] [Site] composer update --- ux.symfony.com/composer.lock | 644 +++++++++++++++++------------------ 1 file changed, 322 insertions(+), 322 deletions(-) diff --git a/ux.symfony.com/composer.lock b/ux.symfony.com/composer.lock index 472010b4920..f8ec76cf97c 100644 --- a/ux.symfony.com/composer.lock +++ b/ux.symfony.com/composer.lock @@ -434,16 +434,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.7", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "2093d670ca17f634f3c095ec10a20687eccebd99" + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/2093d670ca17f634f3c095ec10a20687eccebd99", - "reference": "2093d670ca17f634f3c095ec10a20687eccebd99", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", + "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7", "shasum": "" }, "require": { @@ -459,7 +459,7 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.11.7", + "phpstan/phpstan": "1.12.0", "phpstan/phpstan-strict-rules": "^1.6", "phpunit/phpunit": "9.6.20", "psalm/plugin-phpunit": "0.18.4", @@ -527,7 +527,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.7" + "source": "https://github.com/doctrine/dbal/tree/3.9.1" }, "funding": [ { @@ -543,7 +543,7 @@ "type": "tidelift" } ], - "time": "2024-08-07T11:57:25+00:00" + "time": "2024-09-01T13:49:23+00:00" }, { "name": "doctrine/deprecations", @@ -594,16 +594,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.12.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "5418e811a14724068e95e0ba43353b903ada530f" + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5418e811a14724068e95e0ba43353b903ada530f", - "reference": "5418e811a14724068e95e0ba43353b903ada530f", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/ca59d84b8e63143ce1aed90cdb333ba329d71563", + "reference": "ca59d84b8e63143ce1aed90cdb333ba329d71563", "shasum": "" }, "require": { @@ -694,7 +694,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.12.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.13.0" }, "funding": [ { @@ -710,7 +710,7 @@ "type": "tidelift" } ], - "time": "2024-03-19T07:20:37+00:00" + "time": "2024-09-01T09:46:40+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1135,16 +1135,16 @@ }, { "name": "doctrine/migrations", - "version": "3.8.0", + "version": "3.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "535a70dcbd88b8c6ba945be050977457f4f4c06c" + "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/535a70dcbd88b8c6ba945be050977457f4f4c06c", - "reference": "535a70dcbd88b8c6ba945be050977457f4f4c06c", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/7760fbd0b7cb58bfb50415505a7bab821adf0877", + "reference": "7760fbd0b7cb58bfb50415505a7bab821adf0877", "shasum": "" }, "require": { @@ -1167,6 +1167,7 @@ "doctrine/persistence": "^2 || ^3", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", + "fig/log-test": "^1", "phpstan/phpstan": "^1.10", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", @@ -1217,7 +1218,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.8.0" + "source": "https://github.com/doctrine/migrations/tree/3.8.1" }, "funding": [ { @@ -1233,20 +1234,20 @@ "type": "tidelift" } ], - "time": "2024-06-26T14:12:46+00:00" + "time": "2024-08-28T13:17:28+00:00" }, { "name": "doctrine/orm", - "version": "2.19.6", + "version": "2.19.7", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "c1bb2ccf4b19c845f91ff7c4c01dc7cbba7f4073" + "reference": "168ac31084226f94d42e7461a40ff5607a56bd35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/c1bb2ccf4b19c845f91ff7c4c01dc7cbba7f4073", - "reference": "c1bb2ccf4b19c845f91ff7c4c01dc7cbba7f4073", + "url": "https://api.github.com/repos/doctrine/orm/zipball/168ac31084226f94d42e7461a40ff5607a56bd35", + "reference": "168ac31084226f94d42e7461a40ff5607a56bd35", "shasum": "" }, "require": { @@ -1332,9 +1333,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.19.6" + "source": "https://github.com/doctrine/orm/tree/2.19.7" }, - "time": "2024-06-26T17:24:40+00:00" + "time": "2024-08-23T06:54:57+00:00" }, { "name": "doctrine/persistence", @@ -1811,16 +1812,16 @@ }, { "name": "league/commonmark", - "version": "2.5.2", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "df09d5b6a4188f8f3c3ab2e43a109076a5eeb767" + "reference": "b650144166dfa7703e62a22e493b853b58d874b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/df09d5b6a4188f8f3c3ab2e43a109076a5eeb767", - "reference": "df09d5b6a4188f8f3c3ab2e43a109076a5eeb767", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", + "reference": "b650144166dfa7703e62a22e493b853b58d874b0", "shasum": "" }, "require": { @@ -1833,8 +1834,8 @@ }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.31.0", - "commonmark/commonmark.js": "0.31.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", "composer/package-versions-deprecated": "^1.8", "embed/embed": "^4.4", "erusev/parsedown": "^1.0", @@ -1913,7 +1914,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T10:56:57+00:00" + "time": "2024-08-16T11:46:16+00:00" }, { "name": "league/config", @@ -2612,16 +2613,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "79dff0b268932c640297f5208d6298f71855c03e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", + "reference": "79dff0b268932c640297f5208d6298f71855c03e", "shasum": "" }, "require": { @@ -2656,9 +2657,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.1" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-08-21T13:31:24+00:00" }, { "name": "ralouphie/getallheaders", @@ -2775,16 +2776,16 @@ }, { "name": "symfony/asset-mapper", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/asset-mapper.git", - "reference": "b496ba0c1ca69abbbc2413b853decad2eed9a74b" + "reference": "a6070274d8ccc1272a24b7851e96368a9f9c5755" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/b496ba0c1ca69abbbc2413b853decad2eed9a74b", - "reference": "b496ba0c1ca69abbbc2413b853decad2eed9a74b", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/a6070274d8ccc1272a24b7851e96368a9f9c5755", + "reference": "a6070274d8ccc1272a24b7851e96368a9f9c5755", "shasum": "" }, "require": { @@ -2834,7 +2835,7 @@ "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset-mapper/tree/v7.1.3" + "source": "https://github.com/symfony/asset-mapper/tree/v7.1.4" }, "funding": [ { @@ -2850,20 +2851,20 @@ "type": "tidelift" } ], - "time": "2024-07-09T19:36:07+00:00" + "time": "2024-08-26T06:32:37+00:00" }, { "name": "symfony/cache", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "8ac37acee794372f9732fe8a61a8221f6762148e" + "reference": "b61e464d7687bb7e8f677d5031c632bf3820df18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/8ac37acee794372f9732fe8a61a8221f6762148e", - "reference": "8ac37acee794372f9732fe8a61a8221f6762148e", + "url": "https://api.github.com/repos/symfony/cache/zipball/b61e464d7687bb7e8f677d5031c632bf3820df18", + "reference": "b61e464d7687bb7e8f677d5031c632bf3820df18", "shasum": "" }, "require": { @@ -2931,7 +2932,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.3" + "source": "https://github.com/symfony/cache/tree/v7.1.4" }, "funding": [ { @@ -2947,7 +2948,7 @@ "type": "tidelift" } ], - "time": "2024-07-17T06:10:24+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/cache-contracts", @@ -3102,16 +3103,16 @@ }, { "name": "symfony/console", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9" + "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", - "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", + "url": "https://api.github.com/repos/symfony/console/zipball/1eed7af6961d763e7832e874d7f9b21c3ea9c111", + "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111", "shasum": "" }, "require": { @@ -3175,7 +3176,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.3" + "source": "https://github.com/symfony/console/tree/v7.1.4" }, "funding": [ { @@ -3191,20 +3192,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-15T22:48:53+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "8126f0be4ff984e4db0140e60917900a53facb49" + "reference": "5320e0bc2c9e2d7450bb4091e497a305a68b28ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8126f0be4ff984e4db0140e60917900a53facb49", - "reference": "8126f0be4ff984e4db0140e60917900a53facb49", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5320e0bc2c9e2d7450bb4091e497a305a68b28ed", + "reference": "5320e0bc2c9e2d7450bb4091e497a305a68b28ed", "shasum": "" }, "require": { @@ -3255,7 +3256,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.1.3" + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.4" }, "funding": [ { @@ -3271,7 +3272,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T07:35:39+00:00" + "time": "2024-08-29T08:16:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3342,16 +3343,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b526822483124b62ff3cda14237418408f444e4d" + "reference": "5c31b278a52023970f4ef398e42ab9048483abfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b526822483124b62ff3cda14237418408f444e4d", - "reference": "b526822483124b62ff3cda14237418408f444e4d", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/5c31b278a52023970f4ef398e42ab9048483abfa", + "reference": "5c31b278a52023970f4ef398e42ab9048483abfa", "shasum": "" }, "require": { @@ -3430,7 +3431,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.3" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.4" }, "funding": [ { @@ -3446,7 +3447,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-13T10:29:23+00:00" }, { "name": "symfony/dotenv", @@ -3755,16 +3756,16 @@ }, { "name": "symfony/expression-language", - "version": "v7.1.1", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "463cb95f80c14136175f4e03f7f6199b01c6b8b4" + "reference": "b9e4bc6685d513c10235145ed1042a6081635806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/463cb95f80c14136175f4e03f7f6199b01c6b8b4", - "reference": "463cb95f80c14136175f4e03f7f6199b01c6b8b4", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/b9e4bc6685d513c10235145ed1042a6081635806", + "reference": "b9e4bc6685d513c10235145ed1042a6081635806", "shasum": "" }, "require": { @@ -3799,7 +3800,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.1.1" + "source": "https://github.com/symfony/expression-language/tree/v7.1.4" }, "funding": [ { @@ -3815,7 +3816,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/filesystem", @@ -3885,16 +3886,16 @@ }, { "name": "symfony/finder", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "717c6329886f32dc65e27461f80f2a465412fdca" + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/717c6329886f32dc65e27461f80f2a465412fdca", - "reference": "717c6329886f32dc65e27461f80f2a465412fdca", + "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", "shasum": "" }, "require": { @@ -3929,7 +3930,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.3" + "source": "https://github.com/symfony/finder/tree/v7.1.4" }, "funding": [ { @@ -3945,7 +3946,7 @@ "type": "tidelift" } ], - "time": "2024-07-24T07:08:44+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { "name": "symfony/flex", @@ -4014,16 +4015,16 @@ }, { "name": "symfony/form", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "11df2e2e142161824eb341e96cbb3c56c3bb57dc" + "reference": "3018ad169ea7532eec19e001f2c9f049ff051bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/11df2e2e142161824eb341e96cbb3c56c3bb57dc", - "reference": "11df2e2e142161824eb341e96cbb3c56c3bb57dc", + "url": "https://api.github.com/repos/symfony/form/zipball/3018ad169ea7532eec19e001f2c9f049ff051bd6", + "reference": "3018ad169ea7532eec19e001f2c9f049ff051bd6", "shasum": "" }, "require": { @@ -4091,7 +4092,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.1.3" + "source": "https://github.com/symfony/form/tree/v7.1.4" }, "funding": [ { @@ -4107,20 +4108,20 @@ "type": "tidelift" } ], - "time": "2024-07-19T08:30:01+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "a32ec544bd501eb4619eb977860ad3076ee55061" + "reference": "711af4eefcb4054a9c93e44b403626e1826bcddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/a32ec544bd501eb4619eb977860ad3076ee55061", - "reference": "a32ec544bd501eb4619eb977860ad3076ee55061", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/711af4eefcb4054a9c93e44b403626e1826bcddd", + "reference": "711af4eefcb4054a9c93e44b403626e1826bcddd", "shasum": "" }, "require": { @@ -4238,7 +4239,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.1.3" + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.4" }, "funding": [ { @@ -4254,20 +4255,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T13:24:34+00:00" + "time": "2024-08-11T16:10:02+00:00" }, { "name": "symfony/http-client", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "b79858aa7a051ea791b0d50269a234a0b50cb231" + "reference": "a8f8d60b30b331cf4b743b3632e5acdba3f8285c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/b79858aa7a051ea791b0d50269a234a0b50cb231", - "reference": "b79858aa7a051ea791b0d50269a234a0b50cb231", + "url": "https://api.github.com/repos/symfony/http-client/zipball/a8f8d60b30b331cf4b743b3632e5acdba3f8285c", + "reference": "a8f8d60b30b331cf4b743b3632e5acdba3f8285c", "shasum": "" }, "require": { @@ -4332,7 +4333,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.1.3" + "source": "https://github.com/symfony/http-client/tree/v7.1.4" }, "funding": [ { @@ -4348,7 +4349,7 @@ "type": "tidelift" } ], - "time": "2024-07-17T06:10:24+00:00" + "time": "2024-08-26T06:32:37+00:00" }, { "name": "symfony/http-client-contracts", @@ -4507,16 +4508,16 @@ }, { "name": "symfony/http-kernel", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186" + "reference": "6efcbd1b3f444f631c386504fc83eeca25963747" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/db9702f3a04cc471ec8c70e881825db26ac5f186", - "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6efcbd1b3f444f631c386504fc83eeca25963747", + "reference": "6efcbd1b3f444f631c386504fc83eeca25963747", "shasum": "" }, "require": { @@ -4601,7 +4602,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.3" + "source": "https://github.com/symfony/http-kernel/tree/v7.1.4" }, "funding": [ { @@ -4617,7 +4618,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T14:58:15+00:00" + "time": "2024-08-30T17:02:28+00:00" }, { "name": "symfony/intl", @@ -4942,16 +4943,16 @@ }, { "name": "symfony/mime", - "version": "v7.1.2", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc" + "reference": "ccaa6c2503db867f472a587291e764d6a1e58758" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/26a00b85477e69a4bab63b66c5dce64f18b0cbfc", - "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc", + "url": "https://api.github.com/repos/symfony/mime/zipball/ccaa6c2503db867f472a587291e764d6a1e58758", + "reference": "ccaa6c2503db867f472a587291e764d6a1e58758", "shasum": "" }, "require": { @@ -5006,7 +5007,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.2" + "source": "https://github.com/symfony/mime/tree/v7.1.4" }, "funding": [ { @@ -5022,7 +5023,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T10:03:55+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { "name": "symfony/monolog-bridge", @@ -5186,16 +5187,16 @@ }, { "name": "symfony/notifier", - "version": "v7.1.2", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "17079e564159b77f5314b7130a7516677afc075e" + "reference": "9f40de736910e5191607d2546e5543cbbb3a77dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/17079e564159b77f5314b7130a7516677afc075e", - "reference": "17079e564159b77f5314b7130a7516677afc075e", + "url": "https://api.github.com/repos/symfony/notifier/zipball/9f40de736910e5191607d2546e5543cbbb3a77dc", + "reference": "9f40de736910e5191607d2546e5543cbbb3a77dc", "shasum": "" }, "require": { @@ -5244,7 +5245,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v7.1.2" + "source": "https://github.com/symfony/notifier/tree/v7.1.4" }, "funding": [ { @@ -5260,7 +5261,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T08:00:31+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/options-resolver", @@ -5878,16 +5879,16 @@ }, { "name": "symfony/property-access", - "version": "v7.1.1", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a" + "reference": "6c709f97103355016e5782d0622437ae381012ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/74e39e6a6276b8e384f34c6ddbc10a6c9a60193a", - "reference": "74e39e6a6276b8e384f34c6ddbc10a6c9a60193a", + "url": "https://api.github.com/repos/symfony/property-access/zipball/6c709f97103355016e5782d0622437ae381012ad", + "reference": "6c709f97103355016e5782d0622437ae381012ad", "shasum": "" }, "require": { @@ -5934,7 +5935,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.1.1" + "source": "https://github.com/symfony/property-access/tree/v7.1.4" }, "funding": [ { @@ -5950,7 +5951,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-08-30T16:12:47+00:00" }, { "name": "symfony/property-info", @@ -6038,16 +6039,16 @@ }, { "name": "symfony/routing", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0" + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", - "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", + "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", "shasum": "" }, "require": { @@ -6099,7 +6100,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.3" + "source": "https://github.com/symfony/routing/tree/v7.1.4" }, "funding": [ { @@ -6115,7 +6116,7 @@ "type": "tidelift" } ], - "time": "2024-07-17T06:10:24+00:00" + "time": "2024-08-29T08:16:25+00:00" }, { "name": "symfony/runtime", @@ -6198,16 +6199,16 @@ }, { "name": "symfony/serializer", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "0d5ddac365fbfffc30ca9bc944ad3eb9b3763c09" + "reference": "0158b0e91b7cf7e744a6fb9acaeb613d1ca40dbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/0d5ddac365fbfffc30ca9bc944ad3eb9b3763c09", - "reference": "0d5ddac365fbfffc30ca9bc944ad3eb9b3763c09", + "url": "https://api.github.com/repos/symfony/serializer/zipball/0158b0e91b7cf7e744a6fb9acaeb613d1ca40dbb", + "reference": "0158b0e91b7cf7e744a6fb9acaeb613d1ca40dbb", "shasum": "" }, "require": { @@ -6275,7 +6276,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.1.3" + "source": "https://github.com/symfony/serializer/tree/v7.1.4" }, "funding": [ { @@ -6291,7 +6292,7 @@ "type": "tidelift" } ], - "time": "2024-07-17T06:10:24+00:00" + "time": "2024-08-22T09:39:57+00:00" }, { "name": "symfony/service-contracts", @@ -6510,16 +6511,16 @@ }, { "name": "symfony/string", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ea272a882be7f20cad58d5d78c215001617b7f07" + "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ea272a882be7f20cad58d5d78c215001617b7f07", - "reference": "ea272a882be7f20cad58d5d78c215001617b7f07", + "url": "https://api.github.com/repos/symfony/string/zipball/6cd670a6d968eaeb1c77c2e76091c45c56bc367b", + "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b", "shasum": "" }, "require": { @@ -6577,7 +6578,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.3" + "source": "https://github.com/symfony/string/tree/v7.1.4" }, "funding": [ { @@ -6593,7 +6594,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:25:37+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/translation", @@ -6769,16 +6770,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.1.1", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "96e6e12a63db80bcedefc012042d2cb2d1a015f8" + "reference": "2db32cfe8fc57797908ef0bee232b90dbe42af66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/96e6e12a63db80bcedefc012042d2cb2d1a015f8", - "reference": "96e6e12a63db80bcedefc012042d2cb2d1a015f8", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/2db32cfe8fc57797908ef0bee232b90dbe42af66", + "reference": "2db32cfe8fc57797908ef0bee232b90dbe42af66", "shasum": "" }, "require": { @@ -6858,7 +6859,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.1.1" + "source": "https://github.com/symfony/twig-bridge/tree/v7.1.4" }, "funding": [ { @@ -6874,7 +6875,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-08-29T08:16:25+00:00" }, { "name": "symfony/twig-bundle", @@ -7044,16 +7045,16 @@ }, { "name": "symfony/uid", - "version": "v7.1.1", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" + "reference": "82177535395109075cdb45a70533aa3d7a521cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", - "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", + "url": "https://api.github.com/repos/symfony/uid/zipball/82177535395109075cdb45a70533aa3d7a521cdf", + "reference": "82177535395109075cdb45a70533aa3d7a521cdf", "shasum": "" }, "require": { @@ -7098,7 +7099,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.1" + "source": "https://github.com/symfony/uid/tree/v7.1.4" }, "funding": [ { @@ -7114,7 +7115,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/ux-autocomplete", @@ -7122,12 +7123,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-autocomplete.git", - "reference": "ef15862c55e15a2225587e8b226df21561d36c7c" + "reference": "0bb3e7e3299fc8437f957eb5162303317043a7a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/ef15862c55e15a2225587e8b226df21561d36c7c", - "reference": "ef15862c55e15a2225587e8b226df21561d36c7c", + "url": "https://api.github.com/repos/symfony/ux-autocomplete/zipball/0bb3e7e3299fc8437f957eb5162303317043a7a8", + "reference": "0bb3e7e3299fc8437f957eb5162303317043a7a8", "shasum": "" }, "require": { @@ -7191,7 +7192,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-autocomplete/tree/v2.19.2" + "source": "https://github.com/symfony/ux-autocomplete/tree/2.x" }, "funding": [ { @@ -7207,7 +7208,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:54:57+00:00" + "time": "2024-09-06T17:27:37+00:00" }, { "name": "symfony/ux-chartjs", @@ -7272,7 +7273,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-chartjs/tree/2.x" + "source": "https://github.com/symfony/ux-chartjs/tree/v2.19.3" }, "funding": [ { @@ -7358,7 +7359,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-cropperjs/tree/2.x" + "source": "https://github.com/symfony/ux-cropperjs/tree/v2.19.3" }, "funding": [ { @@ -7438,7 +7439,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-dropzone/tree/2.x" + "source": "https://github.com/symfony/ux-dropzone/tree/v2.19.3" }, "funding": [ { @@ -7462,12 +7463,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-icons.git", - "reference": "c4826439f464c23cc0c2e2a997252100d6049daa" + "reference": "4db197771a3ca65850e008310b047fa2f1cd32f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-icons/zipball/c4826439f464c23cc0c2e2a997252100d6049daa", - "reference": "c4826439f464c23cc0c2e2a997252100d6049daa", + "url": "https://api.github.com/repos/symfony/ux-icons/zipball/4db197771a3ca65850e008310b047fa2f1cd32f3", + "reference": "4db197771a3ca65850e008310b047fa2f1cd32f3", "shasum": "" }, "require": { @@ -7527,7 +7528,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-icons/tree/v2.19.0" + "source": "https://github.com/symfony/ux-icons/tree/2.x" }, "funding": [ { @@ -7543,7 +7544,7 @@ "type": "tidelift" } ], - "time": "2024-08-07T13:07:19+00:00" + "time": "2024-08-25T00:58:18+00:00" }, { "name": "symfony/ux-lazy-image", @@ -7551,12 +7552,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-lazy-image.git", - "reference": "bc8b7eb24a85d624f1012d034f6710dd4dbd1689" + "reference": "f643dadc0a67949bc840d9f2ab03df23ffd6050b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-lazy-image/zipball/bc8b7eb24a85d624f1012d034f6710dd4dbd1689", - "reference": "bc8b7eb24a85d624f1012d034f6710dd4dbd1689", + "url": "https://api.github.com/repos/symfony/ux-lazy-image/zipball/f643dadc0a67949bc840d9f2ab03df23ffd6050b", + "reference": "f643dadc0a67949bc840d9f2ab03df23ffd6050b", "shasum": "" }, "require": { @@ -7623,7 +7624,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-08-20T19:19:54+00:00" }, { "name": "symfony/ux-leaflet-map", @@ -7631,12 +7632,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-leaflet-map.git", - "reference": "b5f6a7d053646c0d7272cde50822e1d1240139f0" + "reference": "a28fe4315084c7dee8e632eea8866f34b50e62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/b5f6a7d053646c0d7272cde50822e1d1240139f0", - "reference": "b5f6a7d053646c0d7272cde50822e1d1240139f0", + "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/a28fe4315084c7dee8e632eea8866f34b50e62c9", + "reference": "a28fe4315084c7dee8e632eea8866f34b50e62c9", "shasum": "" }, "require": { @@ -7676,7 +7677,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-leaflet-map/tree/v2.19.2" + "source": "https://github.com/symfony/ux-leaflet-map/tree/2.x" }, "funding": [ { @@ -7692,7 +7693,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:54:07+00:00" + "time": "2024-08-31T10:10:16+00:00" }, { "name": "symfony/ux-live-component", @@ -7700,12 +7701,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-live-component.git", - "reference": "9b292543eed8ae0d760d7f5e5397e91e632f2cf5" + "reference": "e439f05e1513af9a163c7dad6869fc33117b7394" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/9b292543eed8ae0d760d7f5e5397e91e632f2cf5", - "reference": "9b292543eed8ae0d760d7f5e5397e91e632f2cf5", + "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/e439f05e1513af9a163c7dad6869fc33117b7394", + "reference": "e439f05e1513af9a163c7dad6869fc33117b7394", "shasum": "" }, "require": { @@ -7737,7 +7738,7 @@ "symfony/twig-bundle": "^5.4|^6.0|^7.0", "symfony/validator": "^5.4|^6.0|^7.0", "zenstruck/browser": "^1.2.0", - "zenstruck/foundry": "1.37.*" + "zenstruck/foundry": "^2.0" }, "default-branch": true, "type": "symfony-bundle", @@ -7770,7 +7771,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-live-component/tree/v2.19.2" + "source": "https://github.com/symfony/ux-live-component/tree/2.x" }, "funding": [ { @@ -7786,7 +7787,7 @@ "type": "tidelift" } ], - "time": "2024-08-11T12:24:16+00:00" + "time": "2024-09-06T08:18:29+00:00" }, { "name": "symfony/ux-map", @@ -7794,12 +7795,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-map.git", - "reference": "216594c4bed747b9a580d5f92cdd331152d94c00" + "reference": "8d0279685f4ebf08cb63e21e0146a8ac7d911e1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-map/zipball/216594c4bed747b9a580d5f92cdd331152d94c00", - "reference": "216594c4bed747b9a580d5f92cdd331152d94c00", + "url": "https://api.github.com/repos/symfony/ux-map/zipball/8d0279685f4ebf08cb63e21e0146a8ac7d911e1a", + "reference": "8d0279685f4ebf08cb63e21e0146a8ac7d911e1a", "shasum": "" }, "require": { @@ -7865,7 +7866,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T11:50:02+00:00" + "time": "2024-08-31T08:56:27+00:00" }, { "name": "symfony/ux-notify", @@ -7873,12 +7874,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-notify.git", - "reference": "001e7867e46a3f090c5523741aa576b3404c1bea" + "reference": "37b82284a67872ed8fe8827726b09e2d0f1fca23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-notify/zipball/001e7867e46a3f090c5523741aa576b3404c1bea", - "reference": "001e7867e46a3f090c5523741aa576b3404c1bea", + "url": "https://api.github.com/repos/symfony/ux-notify/zipball/37b82284a67872ed8fe8827726b09e2d0f1fca23", + "reference": "37b82284a67872ed8fe8827726b09e2d0f1fca23", "shasum": "" }, "require": { @@ -7948,7 +7949,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-08-20T19:19:54+00:00" }, { "name": "symfony/ux-react", @@ -7956,12 +7957,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-react.git", - "reference": "6518cecc62c800b1ece02b70d1dec0067d012495" + "reference": "14a35bff619eaff8f25ebeeaa2adad92534d100a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-react/zipball/6518cecc62c800b1ece02b70d1dec0067d012495", - "reference": "6518cecc62c800b1ece02b70d1dec0067d012495", + "url": "https://api.github.com/repos/symfony/ux-react/zipball/14a35bff619eaff8f25ebeeaa2adad92534d100a", + "reference": "14a35bff619eaff8f25ebeeaa2adad92534d100a", "shasum": "" }, "require": { @@ -8025,7 +8026,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-08-20T15:47:42+00:00" }, { "name": "symfony/ux-svelte", @@ -8033,12 +8034,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-svelte.git", - "reference": "cbd401041a605e14010a82066b378a0be01734e8" + "reference": "473f01392b10f92f01269e9b4d5a541fe766df59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/cbd401041a605e14010a82066b378a0be01734e8", - "reference": "cbd401041a605e14010a82066b378a0be01734e8", + "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/473f01392b10f92f01269e9b4d5a541fe766df59", + "reference": "473f01392b10f92f01269e9b4d5a541fe766df59", "shasum": "" }, "require": { @@ -8106,7 +8107,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-08-20T15:47:42+00:00" }, { "name": "symfony/ux-swup", @@ -8158,7 +8159,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-swup/tree/2.x" + "source": "https://github.com/symfony/ux-swup/tree/v2.19.3" }, "funding": [ { @@ -8239,7 +8240,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-toggle-password/tree/2.x" + "source": "https://github.com/symfony/ux-toggle-password/tree/v2.19.3" }, "funding": [ { @@ -8316,7 +8317,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-translator/tree/2.x" + "source": "https://github.com/symfony/ux-translator/tree/v2.19.3" }, "funding": [ { @@ -8340,12 +8341,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "4a38f267193017958d487171c0a86e64f36164a3" + "reference": "53fb47391767ac12b9c7a093a0bcc7ba01fea905" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/4a38f267193017958d487171c0a86e64f36164a3", - "reference": "4a38f267193017958d487171c0a86e64f36164a3", + "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/53fb47391767ac12b9c7a093a0bcc7ba01fea905", + "reference": "53fb47391767ac12b9c7a093a0bcc7ba01fea905", "shasum": "" }, "require": { @@ -8430,7 +8431,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-08-20T19:19:54+00:00" }, { "name": "symfony/ux-twig-component", @@ -8438,12 +8439,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "7f8d4891e8e3a3303de11bfc7224b176a23a2c1c" + "reference": "77a68152d083f4c493e05c5503e188c229de8275" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/7f8d4891e8e3a3303de11bfc7224b176a23a2c1c", - "reference": "7f8d4891e8e3a3303de11bfc7224b176a23a2c1c", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/77a68152d083f4c493e05c5503e188c229de8275", + "reference": "77a68152d083f4c493e05c5503e188c229de8275", "shasum": "" }, "require": { @@ -8499,7 +8500,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.19.2" + "source": "https://github.com/symfony/ux-twig-component/tree/2.x" }, "funding": [ { @@ -8515,7 +8516,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T03:00:01+00:00" + "time": "2024-09-03T20:35:17+00:00" }, { "name": "symfony/ux-typed", @@ -8567,7 +8568,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-typed/tree/2.x" + "source": "https://github.com/symfony/ux-typed/tree/v2.19.3" }, "funding": [ { @@ -8591,12 +8592,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-vue.git", - "reference": "3f2966b0677f2b025bf3966fc50ee8e43f8f1caf" + "reference": "48360b79af2c68e6cdecd549eada9e9084bd2353" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-vue/zipball/3f2966b0677f2b025bf3966fc50ee8e43f8f1caf", - "reference": "3f2966b0677f2b025bf3966fc50ee8e43f8f1caf", + "url": "https://api.github.com/repos/symfony/ux-vue/zipball/48360b79af2c68e6cdecd549eada9e9084bd2353", + "reference": "48360b79af2c68e6cdecd549eada9e9084bd2353", "shasum": "" }, "require": { @@ -8664,20 +8665,20 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-08-20T15:47:42+00:00" }, { "name": "symfony/validator", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "ba711a6cfc008544dad059abb3c1d997f1472237" + "reference": "0d7e0dfd41702d6b9356214b76110421c1e74368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/ba711a6cfc008544dad059abb3c1d997f1472237", - "reference": "ba711a6cfc008544dad059abb3c1d997f1472237", + "url": "https://api.github.com/repos/symfony/validator/zipball/0d7e0dfd41702d6b9356214b76110421c1e74368", + "reference": "0d7e0dfd41702d6b9356214b76110421c1e74368", "shasum": "" }, "require": { @@ -8745,7 +8746,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.1.3" + "source": "https://github.com/symfony/validator/tree/v7.1.4" }, "funding": [ { @@ -8761,20 +8762,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-30T15:58:06+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" + "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", - "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a5fa7481b199090964d6fd5dab6294d5a870c7aa", + "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa", "shasum": "" }, "require": { @@ -8828,7 +8829,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.4" }, "funding": [ { @@ -8844,7 +8845,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-30T16:12:47+00:00" }, { "name": "symfony/var-exporter", @@ -9007,16 +9008,16 @@ }, { "name": "symfony/yaml", - "version": "v7.1.1", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2" + "reference": "92e080b851c1c655c786a2da77f188f2dccd0f4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/92e080b851c1c655c786a2da77f188f2dccd0f4b", + "reference": "92e080b851c1c655c786a2da77f188f2dccd0f4b", "shasum": "" }, "require": { @@ -9058,7 +9059,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.1" + "source": "https://github.com/symfony/yaml/tree/v7.1.4" }, "funding": [ { @@ -9074,7 +9075,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfonycasts/dynamic-forms", @@ -9187,16 +9188,16 @@ }, { "name": "tempest/highlight", - "version": "2.8.2", + "version": "2.10.2", "source": { "type": "git", "url": "https://github.com/tempestphp/highlight.git", - "reference": "7901d5f3d632fdcd3a0c1c360af7bfdcf8785f65" + "reference": "fb3309cb2fb6a2353d58b4da49040ad532c21a76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tempestphp/highlight/zipball/7901d5f3d632fdcd3a0c1c360af7bfdcf8785f65", - "reference": "7901d5f3d632fdcd3a0c1c360af7bfdcf8785f65", + "url": "https://api.github.com/repos/tempestphp/highlight/zipball/fb3309cb2fb6a2353d58b4da49040ad532c21a76", + "reference": "fb3309cb2fb6a2353d58b4da49040ad532c21a76", "shasum": "" }, "require": { @@ -9233,7 +9234,7 @@ "description": "Fast, extensible, server-side code highlighting", "support": { "issues": "https://github.com/tempestphp/highlight/issues", - "source": "https://github.com/tempestphp/highlight/tree/2.8.2" + "source": "https://github.com/tempestphp/highlight/tree/2.10.2" }, "funding": [ { @@ -9241,7 +9242,7 @@ "type": "github" } ], - "time": "2024-08-14T12:31:48+00:00" + "time": "2024-08-30T07:52:11+00:00" }, { "name": "twbs/bootstrap", @@ -9295,20 +9296,20 @@ }, { "name": "twig/extra-bundle", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "bf8a304eac15838d7724fdf64c345bdefbb75f03" + "reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/bf8a304eac15838d7724fdf64c345bdefbb75f03", - "reference": "bf8a304eac15838d7724fdf64c345bdefbb75f03", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a5427976a23c50b98d034d2f4c215ffaaaf5875f", + "reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/framework-bundle": "^5.4|^6.4|^7.0", "symfony/twig-bundle": "^5.4|^6.4|^7.0", "twig/twig": "^3.0" @@ -9353,7 +9354,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.11.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.12.0" }, "funding": [ { @@ -9365,24 +9366,24 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/html-extra", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", - "reference": "e5de60eb0afb24a60f371de428864b5df9414aa6" + "reference": "4cdfc6f419910ad6ef9c4c9fafbcd1d5793b4f4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/html-extra/zipball/e5de60eb0afb24a60f371de428864b5df9414aa6", - "reference": "e5de60eb0afb24a60f371de428864b5df9414aa6", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/4cdfc6f419910ad6ef9c4c9fafbcd1d5793b4f4c", + "reference": "4cdfc6f419910ad6ef9c4c9fafbcd1d5793b4f4c", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/mime": "^5.4|^6.4|^7.0", "twig/twig": "^3.0" @@ -9421,7 +9422,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/html-extra/tree/v3.12.0" }, "funding": [ { @@ -9433,24 +9434,24 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-08-18T17:25:19+00:00" }, { "name": "twig/intl-extra", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566" + "reference": "61e1189333120a475d2b67b93664b8002668fc27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/e9cadd61342e71e45b2f4f0558122433fd7e4566", - "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/61e1189333120a475d2b67b93664b8002668fc27", + "reference": "61e1189333120a475d2b67b93664b8002668fc27", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/intl": "^5.4|^6.4|^7.0", "twig/twig": "^3.10" }, @@ -9485,7 +9486,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.12.0" }, "funding": [ { @@ -9497,24 +9498,24 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "504557d60d80478260ebd2221a2b3332a480865d" + "reference": "2a94d7902a58147474840c89cbfcd16e68c70499" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/504557d60d80478260ebd2221a2b3332a480865d", - "reference": "504557d60d80478260ebd2221a2b3332a480865d", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/2a94d7902a58147474840c89cbfcd16e68c70499", + "reference": "2a94d7902a58147474840c89cbfcd16e68c70499", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "twig/twig": "^3.0" }, @@ -9557,7 +9558,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.12.0" }, "funding": [ { @@ -9569,24 +9570,24 @@ "type": "tidelift" } ], - "time": "2024-08-07T17:34:09+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/string-extra", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", - "reference": "d25c61baf38705a72ebb5a92d2e9ecb7c473b8ac" + "reference": "0abea0e39f24db0bd847165533d77c93fcbb5025" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/string-extra/zipball/d25c61baf38705a72ebb5a92d2e9ecb7c473b8ac", - "reference": "d25c61baf38705a72ebb5a92d2e9ecb7c473b8ac", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/0abea0e39f24db0bd847165533d77c93fcbb5025", + "reference": "0abea0e39f24db0bd847165533d77c93fcbb5025", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/string": "^5.4|^6.4|^7.0", "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^3.0" @@ -9624,7 +9625,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.12.0" }, "funding": [ { @@ -9636,28 +9637,27 @@ "type": "tidelift" } ], - "time": "2024-08-07T17:34:09+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/twig", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d" + "reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", - "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea", + "reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22", "symfony/polyfill-php81": "^1.29" }, "require-dev": { @@ -9704,7 +9704,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.11.0" + "source": "https://github.com/twigphp/Twig/tree/v3.12.0" }, "funding": [ { @@ -9716,7 +9716,7 @@ "type": "tidelift" } ], - "time": "2024-08-08T16:15:16+00:00" + "time": "2024-08-29T09:51:12+00:00" } ], "packages-dev": [ @@ -10154,35 +10154,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -10191,7 +10191,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -10220,7 +10220,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -10228,7 +10228,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -11813,16 +11813,16 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.60.0", + "version": "v1.61.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c305a02a22974670f359d4274c9431e1a191f559" + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c305a02a22974670f359d4274c9431e1a191f559", - "reference": "c305a02a22974670f359d4274c9431e1a191f559", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/a3b7f14d349f8f44ed752d4dde2263f77510cc18", + "reference": "a3b7f14d349f8f44ed752d4dde2263f77510cc18", "shasum": "" }, "require": { @@ -11885,7 +11885,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.60.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.61.0" }, "funding": [ { @@ -11901,20 +11901,20 @@ "type": "tidelift" } ], - "time": "2024-06-10T06:03:18+00:00" + "time": "2024-08-29T22:50:23+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "e823122d31935eb711e2767c31f3d71cb0b87fb1" + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e823122d31935eb711e2767c31f3d71cb0b87fb1", - "reference": "e823122d31935eb711e2767c31f3d71cb0b87fb1", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", "shasum": "" }, "require": { @@ -11967,7 +11967,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.4" }, "funding": [ { @@ -11983,20 +11983,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "b9357f73d2c14dcd36783a67386f510654828668" + "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/b9357f73d2c14dcd36783a67386f510654828668", - "reference": "b9357f73d2c14dcd36783a67386f510654828668", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3cfc775277a8f2dacdd0f72d196bc87b272a763f", + "reference": "3cfc775277a8f2dacdd0f72d196bc87b272a763f", "shasum": "" }, "require": { @@ -12048,7 +12048,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.3" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.4" }, "funding": [ { @@ -12064,7 +12064,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "theseer/tokenizer", @@ -12118,16 +12118,16 @@ }, { "name": "vincentlanglet/twig-cs-fixer", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "ac11c63f17322e31dc6d8c5e8dada54423d66fe0" + "reference": "1730c3610470446146abdee50417b4094788ef3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/ac11c63f17322e31dc6d8c5e8dada54423d66fe0", - "reference": "ac11c63f17322e31dc6d8c5e8dada54423d66fe0", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/1730c3610470446146abdee50417b4094788ef3c", + "reference": "1730c3610470446146abdee50417b4094788ef3c", "shasum": "" }, "require": { @@ -12139,7 +12139,7 @@ "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", "symfony/finder": "^5.4 || ^6.4 || ^7.0", "symfony/string": "^5.4.42 || ^6.4.10 || ~7.0.10 || ^7.1.3", - "twig/twig": "^3.10", + "twig/twig": "^3.4", "webmozart/assert": "^1.10" }, "require-dev": { @@ -12186,7 +12186,7 @@ "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", "support": { "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", - "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.0.1" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.0.2" }, "funding": [ { @@ -12194,7 +12194,7 @@ "type": "github" } ], - "time": "2024-08-13T16:27:40+00:00" + "time": "2024-08-22T16:39:23+00:00" }, { "name": "webmozart/assert", From 1de4f6fc66da1bd078a495c8dc5c2f9472805edb Mon Sep 17 00:00:00 2001 From: seb-jean Date: Sat, 7 Sep 2024 11:27:12 +0200 Subject: [PATCH 30/64] Update _meta.html.twig --- ux.symfony.com/templates/_meta.html.twig | 1 - 1 file changed, 1 deletion(-) diff --git a/ux.symfony.com/templates/_meta.html.twig b/ux.symfony.com/templates/_meta.html.twig index 5cc72954de6..d66f02c8d23 100644 --- a/ux.symfony.com/templates/_meta.html.twig +++ b/ux.symfony.com/templates/_meta.html.twig @@ -1,4 +1,3 @@ - {% if meta.canonical|default %} {% endif %} From 1463b5fbf37f8819f76d0fc19c8f38cc55c0f7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Tue, 3 Sep 2024 21:53:17 +0200 Subject: [PATCH 31/64] [Icons] Icon aliases --- src/Icons/CHANGELOG.md | 4 +++ src/Icons/config/services.php | 2 ++ src/Icons/doc/index.rst | 29 +++++++++++++++++++ .../DependencyInjection/UXIconsExtension.php | 9 ++++++ src/Icons/src/IconRenderer.php | 3 ++ src/Icons/tests/Unit/IconRendererTest.php | 19 ++++++++++++ 6 files changed, 66 insertions(+) diff --git a/src/Icons/CHANGELOG.md b/src/Icons/CHANGELOG.md index 3b1eb8f7fe0..71eb76d0f22 100644 --- a/src/Icons/CHANGELOG.md +++ b/src/Icons/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 2.20.0 + +- Add `aliases` configuration option to define icon alternative names. + ## 2.19.0 - Add `ignore_not_found` option to silence error during rendering if the diff --git a/src/Icons/config/services.php b/src/Icons/config/services.php index 91a3484a602..a0b8ca576bb 100644 --- a/src/Icons/config/services.php +++ b/src/Icons/config/services.php @@ -56,6 +56,8 @@ ->set('.ux_icons.icon_renderer', IconRenderer::class) ->args([ service('.ux_icons.icon_registry'), + abstract_arg('default_icon_attributes'), + abstract_arg('icon_aliases'), ]) ->alias('Symfony\UX\Icons\IconRendererInterface', '.ux_icons.icon_renderer') diff --git a/src/Icons/doc/index.rst b/src/Icons/doc/index.rst index b66346f155b..e232685df4c 100644 --- a/src/Icons/doc/index.rst +++ b/src/Icons/doc/index.rst @@ -336,6 +336,30 @@ Now, all icons will have the ``fill`` attribute set to ``currentColor`` by defau # renders "user-profile.svg" with fill="red" {{ ux_icon('user-profile', {fill: 'red'}) }} +Icon Aliases +~~~~~~~~~~~~ + +You can define aliases for icons in your configuration, which is helpful if +you want to use a different or shorter name for an icon in your templates: + +.. code-block:: yaml + + # config/packages/ux_icons.yaml + ux_icons: + + aliases: + dots: 'clarity:ellipsis-horizontal-line' + +Now, you can use the ``dots`` alias in your templates: + +.. code-block:: twig + + {{ ux_icon('dots') }} + + {# same as #} + + {{ ux_icon('clarity:ellipsis-horizontal-line') }} + Errors ------ @@ -517,6 +541,11 @@ Full Configuration default_icon_attributes: # Default: fill: currentColor + + # Icon aliases (alias => icon name). + aliases: + # Exemple: + dots: 'clarity:ellipsis-horizontal-line' # Configuration for the "on demand" icons powered by Iconify.design. iconify: diff --git a/src/Icons/src/DependencyInjection/UXIconsExtension.php b/src/Icons/src/DependencyInjection/UXIconsExtension.php index 81e705b7926..d363de8afa0 100644 --- a/src/Icons/src/DependencyInjection/UXIconsExtension.php +++ b/src/Icons/src/DependencyInjection/UXIconsExtension.php @@ -43,6 +43,14 @@ public function getConfigTreeBuilder(): TreeBuilder ->info('Default attributes to add to all icons.') ->defaultValue(['fill' => 'currentColor']) ->end() + ->arrayNode('aliases') + ->info('Icon aliases (alias => icon name).') + ->example(['dots' => 'clarity:ellipsis-horizontal-line']) + ->normalizeKeys(false) + ->scalarPrototype() + ->cannotBeEmpty() + ->end() + ->end() ->arrayNode('iconify') ->info('Configuration for the "on demand" icons powered by Iconify.design.') ->{interface_exists(HttpClientInterface::class) ? 'canBeDisabled' : 'canBeEnabled'}() @@ -98,6 +106,7 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $container->getDefinition('.ux_icons.icon_renderer') ->setArgument(1, $mergedConfig['default_icon_attributes']) + ->setArgument(2, $mergedConfig['aliases']) ; $container->getDefinition('.ux_icons.twig_icon_runtime') diff --git a/src/Icons/src/IconRenderer.php b/src/Icons/src/IconRenderer.php index 95edf56d0ca..f58614ba9f6 100644 --- a/src/Icons/src/IconRenderer.php +++ b/src/Icons/src/IconRenderer.php @@ -21,6 +21,7 @@ final class IconRenderer implements IconRendererInterface public function __construct( private readonly IconRegistryInterface $registry, private readonly array $defaultIconAttributes = [], + private readonly ?array $iconAliases = [], ) { } @@ -35,6 +36,8 @@ public function __construct( */ public function renderIcon(string $name, array $attributes = []): string { + $name = $this->iconAliases[$name] ?? $name; + $icon = $this->registry->get($name) ->withAttributes($this->defaultIconAttributes) ->withAttributes($attributes); diff --git a/src/Icons/tests/Unit/IconRendererTest.php b/src/Icons/tests/Unit/IconRendererTest.php index 4dc3eeb4a03..75fd856688a 100644 --- a/src/Icons/tests/Unit/IconRendererTest.php +++ b/src/Icons/tests/Unit/IconRendererTest.php @@ -230,6 +230,25 @@ public static function provideAriaHiddenCases(): iterable ]; } + public function testRenderIconWithAliases(): void + { + $registry = $this->createRegistry([ + 'foo' => '', + 'bar' => '', + 'baz' => '', + ]); + $iconRenderer = new IconRenderer($registry, [], ['foo' => 'bar']); + + $svg = $iconRenderer->renderIcon('bar'); + $this->assertSame('', $svg); + + $svg = $iconRenderer->renderIcon('foo'); + $this->assertSame('', $svg); + + $svg = $iconRenderer->renderIcon('baz'); + $this->assertSame('', $svg); + } + private function createRegistry(array $icons): IconRegistryInterface { $registryIcons = []; From 5c17b26876e1ac544903d0a99837b6aa1cda0934 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 9 Sep 2024 09:33:50 +0200 Subject: [PATCH 32/64] Minor tweaks in the docs --- src/Icons/doc/index.rst | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Icons/doc/index.rst b/src/Icons/doc/index.rst index e232685df4c..979ec2a7c9a 100644 --- a/src/Icons/doc/index.rst +++ b/src/Icons/doc/index.rst @@ -339,14 +339,14 @@ Now, all icons will have the ``fill`` attribute set to ``currentColor`` by defau Icon Aliases ~~~~~~~~~~~~ -You can define aliases for icons in your configuration, which is helpful if -you want to use a different or shorter name for an icon in your templates: +Aliases are custom names you can define to refer to any icon. They are useful for +creating shortcuts to icons you frequently use in your templates: .. code-block:: yaml # config/packages/ux_icons.yaml ux_icons: - + # ... aliases: dots: 'clarity:ellipsis-horizontal-line' @@ -355,11 +355,14 @@ Now, you can use the ``dots`` alias in your templates: .. code-block:: twig {{ ux_icon('dots') }} - - {# same as #} - + {# with the previous configuration, this is the same as: #} {{ ux_icon('clarity:ellipsis-horizontal-line') }} + {# using the HTML syntax #} + + {# same as: #} + + Errors ------ From 06b248a50e2ff4a2d4d3f44cdf57e15a03f09208 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Mon, 9 Sep 2024 13:10:21 +0200 Subject: [PATCH 33/64] [Map] Adjust changelogs and fix `render_map` deprecated version --- src/Map/CHANGELOG.md | 2 +- src/Map/src/Bridge/Google/CHANGELOG.md | 2 +- src/Map/src/Bridge/Leaflet/CHANGELOG.md | 2 +- src/Map/src/Twig/MapExtension.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Map/CHANGELOG.md b/src/Map/CHANGELOG.md index ab2bdd9e3b2..33431733d59 100644 --- a/src/Map/CHANGELOG.md +++ b/src/Map/CHANGELOG.md @@ -1,6 +1,6 @@ # CHANGELOG -## Unreleased +## 2.20 - Rename `render_map` Twig function `ux_map` - Deprecate `render_map` Twig function diff --git a/src/Map/src/Bridge/Google/CHANGELOG.md b/src/Map/src/Bridge/Google/CHANGELOG.md index 2b5de26f0c4..1d4c12f8f6a 100644 --- a/src/Map/src/Bridge/Google/CHANGELOG.md +++ b/src/Map/src/Bridge/Google/CHANGELOG.md @@ -1,5 +1,5 @@ # CHANGELOG -## Unreleased +## 2.19 - Bridge added diff --git a/src/Map/src/Bridge/Leaflet/CHANGELOG.md b/src/Map/src/Bridge/Leaflet/CHANGELOG.md index 2b5de26f0c4..1d4c12f8f6a 100644 --- a/src/Map/src/Bridge/Leaflet/CHANGELOG.md +++ b/src/Map/src/Bridge/Leaflet/CHANGELOG.md @@ -1,5 +1,5 @@ # CHANGELOG -## Unreleased +## 2.19 - Bridge added diff --git a/src/Map/src/Twig/MapExtension.php b/src/Map/src/Twig/MapExtension.php index 86788e32e04..04afecf3975 100644 --- a/src/Map/src/Twig/MapExtension.php +++ b/src/Map/src/Twig/MapExtension.php @@ -27,7 +27,7 @@ public function getFunctions(): array return [ new TwigFunction('render_map', [Renderers::class, 'renderMap'], [ 'is_safe' => ['html'], - 'deprecated' => '2.21', + 'deprecated' => '2.20', 'deprecating_package' => 'symfony/ux-map', 'alternative' => 'ux_map', ]), From 80db4b2528915d2c5cc986191a42f513a20cd340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Tue, 10 Sep 2024 06:29:21 +0200 Subject: [PATCH 34/64] [Site] Update Twig 3.14 See: https://github.com/twigphp/Twig/security/advisories/GHSA-6j75-5wfj-gh66 --- ux.symfony.com/composer.lock | 191 +++++++++++++++++------------------ 1 file changed, 95 insertions(+), 96 deletions(-) diff --git a/ux.symfony.com/composer.lock b/ux.symfony.com/composer.lock index f8ec76cf97c..7bde0776f41 100644 --- a/ux.symfony.com/composer.lock +++ b/ux.symfony.com/composer.lock @@ -5332,20 +5332,20 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -5390,7 +5390,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -5406,24 +5406,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "e76343c631b453088e2260ac41dfebe21954de81" + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e76343c631b453088e2260ac41dfebe21954de81", - "reference": "e76343c631b453088e2260ac41dfebe21954de81", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance and support of other locales than \"en\"" @@ -5474,7 +5474,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0" }, "funding": [ { @@ -5490,26 +5490,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -5558,7 +5557,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -5574,24 +5573,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -5639,7 +5638,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -5655,24 +5654,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -5719,7 +5718,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -5735,24 +5734,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -5798,7 +5797,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -5814,7 +5813,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", @@ -7463,12 +7462,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-icons.git", - "reference": "4db197771a3ca65850e008310b047fa2f1cd32f3" + "reference": "2a667537d5b30fdf8989ae4b713055c019565299" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-icons/zipball/4db197771a3ca65850e008310b047fa2f1cd32f3", - "reference": "4db197771a3ca65850e008310b047fa2f1cd32f3", + "url": "https://api.github.com/repos/symfony/ux-icons/zipball/2a667537d5b30fdf8989ae4b713055c019565299", + "reference": "2a667537d5b30fdf8989ae4b713055c019565299", "shasum": "" }, "require": { @@ -7544,7 +7543,7 @@ "type": "tidelift" } ], - "time": "2024-08-25T00:58:18+00:00" + "time": "2024-09-09T07:33:50+00:00" }, { "name": "symfony/ux-lazy-image", @@ -9296,23 +9295,23 @@ }, { "name": "twig/extra-bundle", - "version": "v3.12.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f" + "reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a5427976a23c50b98d034d2f4c215ffaaaf5875f", - "reference": "a5427976a23c50b98d034d2f4c215ffaaaf5875f", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/21a9a7aa9f79d4493bb6fed4eb2794339f9551f5", + "reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5", "shasum": "" }, "require": { "php": ">=8.0.2", "symfony/framework-bundle": "^5.4|^6.4|^7.0", "symfony/twig-bundle": "^5.4|^6.4|^7.0", - "twig/twig": "^3.0" + "twig/twig": "^3.0|^4.0" }, "require-dev": { "league/commonmark": "^1.0|^2.0", @@ -9354,7 +9353,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.12.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.13.0" }, "funding": [ { @@ -9366,27 +9365,27 @@ "type": "tidelift" } ], - "time": "2024-08-10T10:32:24+00:00" + "time": "2024-09-01T20:39:12+00:00" }, { "name": "twig/html-extra", - "version": "v3.12.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", - "reference": "4cdfc6f419910ad6ef9c4c9fafbcd1d5793b4f4c" + "reference": "8229e750091171c1f11801a525927811c7ac5a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/html-extra/zipball/4cdfc6f419910ad6ef9c4c9fafbcd1d5793b4f4c", - "reference": "4cdfc6f419910ad6ef9c4c9fafbcd1d5793b4f4c", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/8229e750091171c1f11801a525927811c7ac5a7e", + "reference": "8229e750091171c1f11801a525927811c7ac5a7e", "shasum": "" }, "require": { "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/mime": "^5.4|^6.4|^7.0", - "twig/twig": "^3.0" + "twig/twig": "^3.13|^4.0" }, "require-dev": { "symfony/phpunit-bridge": "^6.4|^7.0" @@ -9422,7 +9421,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.12.0" + "source": "https://github.com/twigphp/html-extra/tree/v3.13.0" }, "funding": [ { @@ -9434,26 +9433,26 @@ "type": "tidelift" } ], - "time": "2024-08-18T17:25:19+00:00" + "time": "2024-09-03T13:08:40+00:00" }, { "name": "twig/intl-extra", - "version": "v3.12.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "61e1189333120a475d2b67b93664b8002668fc27" + "reference": "1b8d78c5db08bdc61015fd55009d2e84b3aa7e38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/61e1189333120a475d2b67b93664b8002668fc27", - "reference": "61e1189333120a475d2b67b93664b8002668fc27", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/1b8d78c5db08bdc61015fd55009d2e84b3aa7e38", + "reference": "1b8d78c5db08bdc61015fd55009d2e84b3aa7e38", "shasum": "" }, "require": { "php": ">=8.0.2", "symfony/intl": "^5.4|^6.4|^7.0", - "twig/twig": "^3.10" + "twig/twig": "^3.13|^4.0" }, "require-dev": { "symfony/phpunit-bridge": "^6.4|^7.0" @@ -9486,7 +9485,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.12.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.13.0" }, "funding": [ { @@ -9498,26 +9497,26 @@ "type": "tidelift" } ], - "time": "2024-08-10T10:32:24+00:00" + "time": "2024-09-03T13:08:40+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.12.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "2a94d7902a58147474840c89cbfcd16e68c70499" + "reference": "25f23c02936f8c7157a8413154c06a462c9c20d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/2a94d7902a58147474840c89cbfcd16e68c70499", - "reference": "2a94d7902a58147474840c89cbfcd16e68c70499", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/25f23c02936f8c7157a8413154c06a462c9c20d3", + "reference": "25f23c02936f8c7157a8413154c06a462c9c20d3", "shasum": "" }, "require": { "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", - "twig/twig": "^3.0" + "twig/twig": "^3.13|^4.0" }, "require-dev": { "erusev/parsedown": "^1.7", @@ -9558,7 +9557,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.12.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.13.0" }, "funding": [ { @@ -9570,27 +9569,27 @@ "type": "tidelift" } ], - "time": "2024-08-10T10:32:24+00:00" + "time": "2024-09-03T20:17:35+00:00" }, { "name": "twig/string-extra", - "version": "v3.12.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", - "reference": "0abea0e39f24db0bd847165533d77c93fcbb5025" + "reference": "148e869d87cf4bea9d97896ab49e048e4add3310" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/string-extra/zipball/0abea0e39f24db0bd847165533d77c93fcbb5025", - "reference": "0abea0e39f24db0bd847165533d77c93fcbb5025", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/148e869d87cf4bea9d97896ab49e048e4add3310", + "reference": "148e869d87cf4bea9d97896ab49e048e4add3310", "shasum": "" }, "require": { "php": ">=8.0.2", "symfony/string": "^5.4|^6.4|^7.0", "symfony/translation-contracts": "^1.1|^2|^3", - "twig/twig": "^3.0" + "twig/twig": "^3.13|^4.0" }, "require-dev": { "symfony/phpunit-bridge": "^6.4|^7.0" @@ -9625,7 +9624,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.12.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.13.0" }, "funding": [ { @@ -9637,20 +9636,20 @@ "type": "tidelift" } ], - "time": "2024-08-10T10:32:24+00:00" + "time": "2024-09-03T13:08:40+00:00" }, { "name": "twig/twig", - "version": "v3.12.0", + "version": "v3.14.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea" + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea", - "reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "shasum": "" }, "require": { @@ -9704,7 +9703,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.12.0" + "source": "https://github.com/twigphp/Twig/tree/v3.14.0" }, "funding": [ { @@ -9716,7 +9715,7 @@ "type": "tidelift" } ], - "time": "2024-08-29T09:51:12+00:00" + "time": "2024-09-09T17:55:12+00:00" } ], "packages-dev": [ @@ -12118,16 +12117,16 @@ }, { "name": "vincentlanglet/twig-cs-fixer", - "version": "3.0.2", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "1730c3610470446146abdee50417b4094788ef3c" + "reference": "a0e552fbd6fe264f09f6389a950347a7bf70cfb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/1730c3610470446146abdee50417b4094788ef3c", - "reference": "1730c3610470446146abdee50417b4094788ef3c", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/a0e552fbd6fe264f09f6389a950347a7bf70cfb9", + "reference": "a0e552fbd6fe264f09f6389a950347a7bf70cfb9", "shasum": "" }, "require": { @@ -12143,7 +12142,7 @@ "webmozart/assert": "^1.10" }, "require-dev": { - "composer/semver": "^3.4.2", + "composer/semver": "^3.2.0", "dereuromark/composer-prefer-lowest": "^0.1.10", "ergebnis/composer-normalize": "^2.29", "friendsofphp/php-cs-fixer": "^3.13.0", @@ -12186,7 +12185,7 @@ "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", "support": { "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", - "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.0.2" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.1.0" }, "funding": [ { @@ -12194,7 +12193,7 @@ "type": "github" } ], - "time": "2024-08-22T16:39:23+00:00" + "time": "2024-08-30T11:23:49+00:00" }, { "name": "webmozart/assert", From ba00d69957a901ce6e0c860ec3a16408230bd580 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Tue, 10 Sep 2024 08:47:35 +0200 Subject: [PATCH 35/64] [Icons] Fix issues found by DOCtor-RST --- src/Icons/doc/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Icons/doc/index.rst b/src/Icons/doc/index.rst index 979ec2a7c9a..9ac93419834 100644 --- a/src/Icons/doc/index.rst +++ b/src/Icons/doc/index.rst @@ -352,7 +352,7 @@ creating shortcuts to icons you frequently use in your templates: Now, you can use the ``dots`` alias in your templates: -.. code-block:: twig +.. code-block:: html+twig {{ ux_icon('dots') }} {# with the previous configuration, this is the same as: #} From cebd8e27e77df358b09f8d54cdb2fbb2769667d4 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Tue, 10 Sep 2024 14:25:07 +0200 Subject: [PATCH 36/64] Upgrade Vitest, use a real browser for Map Bridges tests --- .github/workflows/test.yaml | 1 + package.json | 4 +- src/Map/src/Bridge/Google/assets/package.json | 3 +- .../src/Bridge/Google/assets/vitest.config.js | 16 +- .../src/Bridge/Leaflet/assets/package.json | 1 - .../Bridge/Leaflet/assets/vitest.config.js | 16 +- yarn.lock | 1211 +++++++++++------ 7 files changed, 856 insertions(+), 396 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index cb42ed10aa2..15f70a23aff 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -141,4 +141,5 @@ jobs: restore-keys: | ${{ runner.os }}-yarn- - run: yarn --immutable + - run: yarn playwright install - run: yarn test diff --git a/package.json b/package.json index 6eebe333850..b33d28bf9a0 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,12 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", "@symfony/stimulus-testing": "^2.0.1", + "@vitest/browser": "^2.0.5", "clean-css-cli": "^5.6.2", + "playwright": "^1.47.0", "rollup": "^4.21.0", "tslib": "^2.6.3", "typescript": "^5.5.4", - "vitest": "^0.34.6" + "vitest": "^2.0.5" } } diff --git a/src/Map/src/Bridge/Google/assets/package.json b/src/Map/src/Bridge/Google/assets/package.json index 28004e0ef73..e5f5ea74011 100644 --- a/src/Map/src/Bridge/Google/assets/package.json +++ b/src/Map/src/Bridge/Google/assets/package.json @@ -33,7 +33,6 @@ "devDependencies": { "@googlemaps/js-api-loader": "^1.16.6", "@hotwired/stimulus": "^3.0.0", - "@types/google.maps": "^3.55.9", - "happy-dom": "^14.12.3" + "@types/google.maps": "^3.55.9" } } diff --git a/src/Map/src/Bridge/Google/assets/vitest.config.js b/src/Map/src/Bridge/Google/assets/vitest.config.js index 3892eefac50..ae1a9ad4296 100644 --- a/src/Map/src/Bridge/Google/assets/vitest.config.js +++ b/src/Map/src/Bridge/Google/assets/vitest.config.js @@ -9,9 +9,21 @@ export default mergeConfig( '@symfony/ux-map/abstract-map-controller': __dirname + '/../../../../assets/src/abstract_map_controller.ts', }, }, + define: { + // Prevent the following error: + // ReferenceError: global is not defined + // ❯ ../../../../../../node_modules/pretty-format/build/plugins/AsymmetricMatcher.js ../../../../../../../../../../node_modules/.vite/deps/@testing-library_dom.js:139:19 + // ❯ ../../../../../../node_modules/pretty-format/build/index.js ../../../../../../../../../../node_modules/.vite/deps/@testing-library_dom.js:805:7 + // ❯ ../../../../../../../../../../node_modules/.vite/deps/@testing-library_dom.js:13445:36 + global: {} + }, test: { - // We need a browser(-like) environment to run the tests - environment: 'happy-dom', + browser: { + enabled: true, + provider: 'playwright', // or 'webdriverio' + name: 'chromium', // browser name is required + headless: true, + }, }, }) ); diff --git a/src/Map/src/Bridge/Leaflet/assets/package.json b/src/Map/src/Bridge/Leaflet/assets/package.json index 97d1014e125..dc95b75a7b9 100644 --- a/src/Map/src/Bridge/Leaflet/assets/package.json +++ b/src/Map/src/Bridge/Leaflet/assets/package.json @@ -33,7 +33,6 @@ "devDependencies": { "@hotwired/stimulus": "^3.0.0", "@types/leaflet": "^1.9.12", - "happy-dom": "^14.12.3", "leaflet": "^1.9.4" } } diff --git a/src/Map/src/Bridge/Leaflet/assets/vitest.config.js b/src/Map/src/Bridge/Leaflet/assets/vitest.config.js index 276e4b0d1be..c033d519d7c 100644 --- a/src/Map/src/Bridge/Leaflet/assets/vitest.config.js +++ b/src/Map/src/Bridge/Leaflet/assets/vitest.config.js @@ -10,9 +10,21 @@ export default mergeConfig( 'leaflet/dist/leaflet.min.css': 'leaflet/dist/leaflet.css', }, }, + define: { + // Prevent the following error: + // ReferenceError: global is not defined + // ❯ ../../../../../../node_modules/pretty-format/build/plugins/AsymmetricMatcher.js ../../../../../../../../../../node_modules/.vite/deps/@testing-library_dom.js:139:19 + // ❯ ../../../../../../node_modules/pretty-format/build/index.js ../../../../../../../../../../node_modules/.vite/deps/@testing-library_dom.js:805:7 + // ❯ ../../../../../../../../../../node_modules/.vite/deps/@testing-library_dom.js:13445:36 + global: {} + }, test: { - // We need a browser(-like) environment to run the tests - environment: 'happy-dom', + browser: { + enabled: true, + provider: 'playwright', // or 'webdriverio' + name: 'chromium', // browser name is required + headless: true, + }, }, }) ); diff --git a/yarn.lock b/yarn.lock index 1c811fe3bf1..eedf0cea88c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,7 +15,7 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@ampproject/remapping@^2.2.1": +"@ampproject/remapping@^2.2.1", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== @@ -1153,6 +1153,28 @@ resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz#6a9dc5a4e13357277da43c015cd5cdc374035448" integrity sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg== +"@bundled-es-modules/cookie@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz#c3b82703969a61cf6a46e959a012b2c257f6b164" + integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw== + dependencies: + cookie "^0.5.0" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + +"@bundled-es-modules/tough-cookie@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz#fa9cd3cedfeecd6783e8b0d378b4a99e52bde5d3" + integrity sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw== + dependencies: + "@types/tough-cookie" "^4.0.5" + tough-cookie "^4.1.4" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" @@ -1161,115 +1183,120 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@formatjs/ecma402-abstract@1.18.2": version "1.18.2" @@ -1327,6 +1354,45 @@ resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.4.tgz#5c5361c06a37cdf10dcba4223f1afd0ca1c75091" integrity sha512-mlZEFUZrJnpfj+g/XeCWWuokvQyN68WvM78JM+0jfSFc98wegm259vCbC1zSllcspRwbgXK31ibehCy5PA78/Q== +"@inquirer/confirm@^3.0.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.2.0.tgz#6af1284670ea7c7d95e3f1253684cfbd7228ad6a" + integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + +"@inquirer/core@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.1.0.tgz#158b82dc44564a1abd0ce14723d50c3efa0634a2" + integrity sha512-RZVfH//2ytTjmaBIzeKT1zefcQZzuruwkpTwwbe/i2jTl4o9M+iML5ChULzz6iw1Ok8iUBBsRCjY2IEbD8Ft4w== + dependencies: + "@inquirer/figures" "^1.0.5" + "@inquirer/type" "^1.5.3" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.5.2" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790" + integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA== + +"@inquirer/type@^1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.3.tgz#220ae9f3d5ae17dd3b2ce5ffd6b48c4a30c73181" + integrity sha512-xUQ14WQGR/HK5ei+2CvgcwoH9fQ4PgPGmVFSN0pc1+fVyDL3MREhyAY7nxEErSu6CkllBM3D7e3e+kOvtu+eIg== + dependencies: + mute-stream "^1.0.0" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1616,6 +1682,11 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -1637,6 +1708,36 @@ resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== +"@mswjs/interceptors@^0.35.0": + version "0.35.0" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.35.0.tgz#ccdabb668833b97d3c5f26e761f5ea665629dd5f" + integrity sha512-f5cHyIvm4m4g1I5x9EH1etGx0puaU0OaX2szqGRVBVgUC6aMASlOI5hbpe7tJ9l4/VWjCUu5OMraCazLZGI24A== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" + +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + "@orchidjs/sifter@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@orchidjs/sifter/-/sifter-1.0.3.tgz" @@ -1654,6 +1755,11 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== + "@rollup/plugin-alias@^3.1.1": version "3.1.9" resolved "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.1.9.tgz" @@ -1773,81 +1879,161 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e" integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA== +"@rollup/rollup-android-arm-eabi@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11" + integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg== + "@rollup/rollup-android-arm64@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0" integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA== +"@rollup/rollup-android-arm64@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb" + integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA== + "@rollup/rollup-darwin-arm64@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947" integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA== +"@rollup/rollup-darwin-arm64@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1" + integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q== + "@rollup/rollup-darwin-x64@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0" integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg== +"@rollup/rollup-darwin-x64@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42" + integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w== + "@rollup/rollup-linux-arm-gnueabihf@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b" integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA== +"@rollup/rollup-linux-arm-gnueabihf@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1" + integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w== + "@rollup/rollup-linux-arm-musleabihf@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee" integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w== +"@rollup/rollup-linux-arm-musleabihf@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266" + integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w== + "@rollup/rollup-linux-arm64-gnu@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085" integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w== +"@rollup/rollup-linux-arm64-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7" + integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw== + "@rollup/rollup-linux-arm64-musl@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5" integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw== +"@rollup/rollup-linux-arm64-musl@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80" + integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w== + "@rollup/rollup-linux-powerpc64le-gnu@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4" integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg== +"@rollup/rollup-linux-powerpc64le-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54" + integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ== + "@rollup/rollup-linux-riscv64-gnu@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444" integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg== +"@rollup/rollup-linux-riscv64-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09" + integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg== + "@rollup/rollup-linux-s390x-gnu@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3" integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw== +"@rollup/rollup-linux-s390x-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18" + integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ== + "@rollup/rollup-linux-x64-gnu@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9" integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg== +"@rollup/rollup-linux-x64-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad" + integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw== + "@rollup/rollup-linux-x64-musl@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200" integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ== +"@rollup/rollup-linux-x64-musl@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8" + integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg== + "@rollup/rollup-win32-arm64-msvc@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc" integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ== +"@rollup/rollup-win32-arm64-msvc@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504" + integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ== + "@rollup/rollup-win32-ia32-msvc@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1" integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg== +"@rollup/rollup-win32-ia32-msvc@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e" + integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw== + "@rollup/rollup-win32-x64-msvc@4.21.0": version "4.21.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375" integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ== +"@rollup/rollup-win32-x64-msvc@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" + integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" @@ -1967,6 +2153,20 @@ mutationobserver-shim "^0.3.7" regenerator-runtime "^0.13.7" +"@testing-library/dom@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + "@testing-library/dom@^7.28.1", "@testing-library/dom@^7.31.0": version "7.31.2" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz" @@ -2010,6 +2210,11 @@ dependencies: "@babel/runtime" "^7.12.5" +"@testing-library/user-event@^14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" @@ -2025,6 +2230,11 @@ resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.20.0" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz" @@ -2069,17 +2279,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/chai-subset@^1.3.3": - version "1.3.4" - resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.4.tgz" - integrity sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.3.5": - version "4.3.9" - resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz" - integrity sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg== +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/estree@*", "@types/estree@^1.0.0": version "1.0.0" @@ -2147,6 +2350,13 @@ dependencies: "@types/geojson" "*" +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/node-fetch@^2.6.2": version "2.6.2" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz" @@ -2160,6 +2370,13 @@ resolved "https://registry.npmjs.org/@types/node/-/node-18.15.5.tgz" integrity sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew== +"@types/node@^22.5.2": + version "22.5.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" + integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== + dependencies: + undici-types "~6.19.2" + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" @@ -2218,6 +2435,11 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/statuses@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63" + integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A== + "@types/testing-library__jest-dom@^5.9.1": version "5.14.5" resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz" @@ -2225,11 +2447,21 @@ dependencies: "@types/jest" "*" +"@types/tough-cookie@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/webpack-env@^1.16": version "1.18.0" resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz" integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" @@ -2265,48 +2497,69 @@ resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz" integrity sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg== -"@vitest/expect@0.34.6": - version "0.34.6" - resolved "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz" - integrity sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw== +"@vitest/browser@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/browser/-/browser-2.0.5.tgz#009d27cf4145104678fb9c3e0d008e3ddf75b461" + integrity sha512-VbOYtu/6R3d7ASZREcrJmRY/sQuRFO9wMVsEDqfYbWiJRh2fDNi8CL1Csn7Ux31pOcPmmM5QvzFCMpiojvVh8g== + dependencies: + "@testing-library/dom" "^10.4.0" + "@testing-library/user-event" "^14.5.2" + "@vitest/utils" "2.0.5" + magic-string "^0.30.10" + msw "^2.3.2" + sirv "^2.0.4" + ws "^8.18.0" + +"@vitest/expect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" + integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== dependencies: - "@vitest/spy" "0.34.6" - "@vitest/utils" "0.34.6" - chai "^4.3.10" + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + tinyrainbow "^1.2.0" -"@vitest/runner@0.34.6": - version "0.34.6" - resolved "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz" - integrity sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ== +"@vitest/pretty-format@2.0.5", "@vitest/pretty-format@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== dependencies: - "@vitest/utils" "0.34.6" - p-limit "^4.0.0" - pathe "^1.1.1" + tinyrainbow "^1.2.0" -"@vitest/snapshot@0.34.6": - version "0.34.6" - resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz" - integrity sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w== +"@vitest/runner@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.5.tgz#89197e712bb93513537d6876995a4843392b2a84" + integrity sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig== dependencies: - magic-string "^0.30.1" - pathe "^1.1.1" - pretty-format "^29.5.0" + "@vitest/utils" "2.0.5" + pathe "^1.1.2" -"@vitest/spy@0.34.6": - version "0.34.6" - resolved "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz" - integrity sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ== +"@vitest/snapshot@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" + integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== dependencies: - tinyspy "^2.1.1" + "@vitest/pretty-format" "2.0.5" + magic-string "^0.30.10" + pathe "^1.1.2" -"@vitest/utils@0.34.6": - version "0.34.6" - resolved "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz" - integrity sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A== +"@vitest/spy@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" + integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== dependencies: - diff-sequences "^29.4.3" - loupe "^2.3.6" - pretty-format "^29.5.0" + tinyspy "^3.0.0" + +"@vitest/utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" + integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== + dependencies: + "@vitest/pretty-format" "2.0.5" + estree-walker "^3.0.3" + loupe "^3.1.1" + tinyrainbow "^1.2.0" "@vue/compiler-core@3.2.47": version "3.2.47" @@ -2416,11 +2669,6 @@ acorn-walk@^7.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - acorn@^7.1.1: version "7.4.1" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" @@ -2443,7 +2691,7 @@ agent-base@6: dependencies: debug "4" -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2517,6 +2765,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@5.3.0, aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" @@ -2532,13 +2787,6 @@ aria-query@^5.0.0: dependencies: deep-equal "^2.0.5" -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" @@ -2580,10 +2828,10 @@ arraybuffer.prototype.slice@^1.0.2: is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== assign-symbols@^1.0.0: version "1.0.0" @@ -2939,18 +3187,16 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -chai@^4.3.10: - version "4.3.10" - resolved "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== +chai@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" @@ -2980,7 +3226,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3005,12 +3251,10 @@ char-regex@^1.0.2: dependencies: "@kurkle/color" "^0.3.0" -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== chokidar@^3.5.2: version "3.5.3" @@ -3069,6 +3313,16 @@ clean-css@^5.3.2: dependencies: source-map "~0.6.0" +cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + cliui@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" @@ -3194,6 +3448,11 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" @@ -3419,6 +3678,13 @@ debug@^4.3.1: dependencies: ms "2.1.2" +debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" @@ -3434,12 +3700,10 @@ decode-uri-component@^0.2.0: resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== deep-equal@^2.0.5: version "2.2.0" @@ -3559,7 +3823,7 @@ diff-sequences@^29.4.3: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== -dom-accessibility-api@^0.5.6: +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== @@ -3660,11 +3924,6 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" @@ -3750,33 +4009,34 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.18.10: - version "0.18.20" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" escalade@^3.1.1: version "3.1.1" @@ -3890,6 +4150,21 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -4091,11 +4366,16 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2, fsevents@~2.3.2: +fsevents@2.3.2, fsevents@^2.1.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -4138,7 +4418,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.1, get-func-name@^2.0.2: +get-func-name@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== @@ -4181,6 +4461,11 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" @@ -4259,6 +4544,11 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphql@^16.8.1: + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== + growly@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" @@ -4278,15 +4568,6 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" -happy-dom@^14.12.3: - version "14.12.3" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-14.12.3.tgz#1b5892c670461fd1db041bee690981c22d3d521f" - integrity sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g== - dependencies: - entities "^4.5.0" - webidl-conversions "^7.0.0" - whatwg-mimetype "^3.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" @@ -4378,6 +4659,11 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -4417,6 +4703,11 @@ human-signals@^1.1.1: resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -4714,6 +5005,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" @@ -4789,6 +5085,11 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" @@ -5455,11 +5756,6 @@ json5@^2.2.0, json5@^2.2.3: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" @@ -5536,11 +5832,6 @@ loader-utils@^3.2.0: resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== -local-pkg@^0.4.3: - version "0.4.3" - resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz" - integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== - locate-character@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" @@ -5590,10 +5881,10 @@ loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== +loupe@^3.1.0, loupe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== dependencies: get-func-name "^2.0.1" @@ -5616,7 +5907,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lz-string@^1.4.4: +lz-string@^1.4.4, lz-string@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== @@ -5628,7 +5919,14 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.30.1, magic-string@^0.30.3: +magic-string@^0.30.10: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +magic-string@^0.30.3: version "0.30.5" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz" integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== @@ -5785,6 +6083,11 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -5829,16 +6132,6 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mlly@^1.2.0, mlly@^1.4.0: - version "1.4.2" - resolved "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz" - integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== - dependencies: - acorn "^8.10.0" - pathe "^1.1.1" - pkg-types "^1.0.3" - ufo "^1.3.0" - moo-color@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz" @@ -5851,6 +6144,11 @@ mri@^1.1.0: resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5861,11 +6159,44 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +msw@^2.3.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.4.tgz#d40c12b2d99750e3b2cbd94ef269a23b06a9aa67" + integrity sha512-iuM0qGs4YmgYCLH+xqb07w2e/e4fYmsx3+WHVlIOUA34TW1sw+wRpNmOlXnLDkw/T7233Jnm6t+aNf4v2E3e2Q== + dependencies: + "@bundled-es-modules/cookie" "^2.0.0" + "@bundled-es-modules/statuses" "^1.0.1" + "@bundled-es-modules/tough-cookie" "^0.1.6" + "@inquirer/confirm" "^3.0.0" + "@mswjs/interceptors" "^0.35.0" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + chalk "^4.1.2" + graphql "^16.8.1" + headers-polyfill "^4.0.2" + is-node-process "^1.2.0" + outvariant "^1.4.2" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" + mutationobserver-shim@^0.3.7: version "0.3.7" resolved "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz" integrity sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ== +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + nanoid@^3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" @@ -5876,6 +6207,11 @@ nanoid@^3.3.6: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" @@ -5990,6 +6326,13 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" @@ -6082,6 +6425,13 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@^8.4.0: version "8.4.2" resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" @@ -6108,6 +6458,11 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +outvariant@^1.4.0, outvariant@^1.4.2, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz" @@ -6125,13 +6480,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" @@ -6211,6 +6559,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -6224,20 +6577,25 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@^6.2.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0, pathe@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz" - integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== periscopic@^3.1.0: version "3.1.0" @@ -6280,14 +6638,19 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-types@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz" - integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== +playwright-core@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.47.0.tgz#b54ec060fd83e5c2e46b63986b5ebb5e96ace427" + integrity sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg== + +playwright@^1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.47.0.tgz#fb9b028883fad11362f9ff63ce7ba44bda0bf626" + integrity sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww== dependencies: - jsonc-parser "^3.2.0" - mlly "^1.2.0" - pathe "^1.1.0" + playwright-core "1.47.0" + optionalDependencies: + fsevents "2.3.2" posix-character-classes@^0.1.0: version "0.1.1" @@ -6563,7 +6926,7 @@ postcss@^8.1.10: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.2.1, postcss@^8.4.27: +postcss@^8.2.1: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -6572,6 +6935,15 @@ postcss@^8.2.1, postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.43: + version "8.4.45" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" + integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" @@ -6604,6 +6976,15 @@ pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.5.0: version "29.5.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz" @@ -6960,11 +7341,29 @@ rollup@^2.35.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== +rollup@^4.20.0: + version "4.21.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7" + integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw== + dependencies: + "@types/estree" "1.0.5" optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.21.2" + "@rollup/rollup-android-arm64" "4.21.2" + "@rollup/rollup-darwin-arm64" "4.21.2" + "@rollup/rollup-darwin-x64" "4.21.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.21.2" + "@rollup/rollup-linux-arm-musleabihf" "4.21.2" + "@rollup/rollup-linux-arm64-gnu" "4.21.2" + "@rollup/rollup-linux-arm64-musl" "4.21.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.21.2" + "@rollup/rollup-linux-riscv64-gnu" "4.21.2" + "@rollup/rollup-linux-s390x-gnu" "4.21.2" + "@rollup/rollup-linux-x64-gnu" "4.21.2" + "@rollup/rollup-linux-x64-musl" "4.21.2" + "@rollup/rollup-win32-arm64-msvc" "4.21.2" + "@rollup/rollup-win32-ia32-msvc" "4.21.2" + "@rollup/rollup-win32-x64-msvc" "4.21.2" fsevents "~2.3.2" rollup@^4.21.0: @@ -7201,11 +7600,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +sirv@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -7256,6 +7664,11 @@ source-map-js@^1.0.2: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" @@ -7363,10 +7776,15 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -std-env@^3.3.3: - version "3.4.3" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz" - integrity sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q== +statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== stop-iteration-iterator@^1.0.0: version "1.0.0" @@ -7375,6 +7793,11 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + string-hash@^1.1.1: version "1.1.3" resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz" @@ -7500,6 +7923,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" @@ -7507,13 +7935,6 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-literal@^1.0.1: - version "1.3.0" - resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz" - integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== - dependencies: - acorn "^8.10.0" - style-inject@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz" @@ -7650,20 +8071,25 @@ tiny-glob@^0.2.8: globalyzer "0.1.0" globrex "^0.1.2" -tinybench@^2.5.0: - version "2.5.1" - resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz" - integrity sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg== +tinybench@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -tinypool@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz" - integrity sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww== +tinypool@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" + integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== -tinyspy@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz" - integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg== +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== tmpl@1.0.5: version "1.0.5" @@ -7715,6 +8141,11 @@ tom-select@^2.2.2: "@orchidjs/sifter" "^1.0.3" "@orchidjs/unicode-variants" "^1.0.4" +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + tough-cookie@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" @@ -7725,6 +8156,16 @@ tough-cookie@^4.0.0: universalify "^0.2.0" url-parse "^1.5.3" +tough-cookie@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tr46@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" @@ -7759,7 +8200,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -7779,6 +8220,11 @@ type-fest@^0.8.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^4.9.0: + version "4.26.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" + integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" @@ -7845,11 +8291,6 @@ typescript@^5.5.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== -ufo@^1.3.0: - version "1.3.1" - resolved "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz" - integrity sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw== - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" @@ -7860,6 +8301,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" @@ -7972,28 +8418,27 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vite-node@0.34.6: - version "0.34.6" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz" - integrity sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA== +vite-node@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.5.tgz#36d909188fc6e3aba3da5fc095b3637d0d18e27b" + integrity sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q== dependencies: cac "^6.7.14" - debug "^4.3.4" - mlly "^1.4.0" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^3.0.0 || ^4.0.0 || ^5.0.0-0" - -"vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0-0": - version "4.5.0" - resolved "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz" - integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== - dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" + debug "^4.3.5" + pathe "^1.1.2" + tinyrainbow "^1.2.0" + vite "^5.0.0" + +vite@^5.0.0: + version "5.4.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.3.tgz#771c470e808cb6732f204e1ee96c2ed65b97a0eb" + integrity sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.3" vitefu@^0.2.4: version "0.2.5" @@ -8014,35 +8459,30 @@ vitest-fetch-mock@^0.2.2: dependencies: cross-fetch "^3.0.6" -vitest@^0.34.6: - version "0.34.6" - resolved "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz" - integrity sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q== - dependencies: - "@types/chai" "^4.3.5" - "@types/chai-subset" "^1.3.3" - "@types/node" "*" - "@vitest/expect" "0.34.6" - "@vitest/runner" "0.34.6" - "@vitest/snapshot" "0.34.6" - "@vitest/spy" "0.34.6" - "@vitest/utils" "0.34.6" - acorn "^8.9.0" - acorn-walk "^8.2.0" - cac "^6.7.14" - chai "^4.3.10" - debug "^4.3.4" - local-pkg "^0.4.3" - magic-string "^0.30.1" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.3.3" - strip-literal "^1.0.1" - tinybench "^2.5.0" - tinypool "^0.7.0" - vite "^3.1.0 || ^4.0.0 || ^5.0.0-0" - vite-node "0.34.6" - why-is-node-running "^2.2.2" +vitest@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.5.tgz#2f15a532704a7181528e399cc5b754c7f335fd62" + integrity sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@vitest/expect" "2.0.5" + "@vitest/pretty-format" "^2.0.5" + "@vitest/runner" "2.0.5" + "@vitest/snapshot" "2.0.5" + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + debug "^4.3.5" + execa "^8.0.1" + magic-string "^0.30.10" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.8.0" + tinypool "^1.0.0" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.0.5" + why-is-node-running "^2.3.0" vue@^3.0: version "3.2.47" @@ -8091,11 +8531,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" @@ -8108,11 +8543,6 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" @@ -8193,10 +8623,10 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -why-is-node-running@^2.2.2: - version "2.2.2" - resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz" - integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" stackback "0.0.2" @@ -8262,6 +8692,11 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" @@ -8327,7 +8762,7 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.5.1: +yargs@^17.5.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -8340,7 +8775,7 @@ yargs@^17.5.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== From eaab0f631de486ebdfcf2d36fe18d61fcb62ca27 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Tue, 10 Sep 2024 14:37:52 +0200 Subject: [PATCH 37/64] chore: rename vitest.config.js to vitest.config.mjs, to get rid of https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated --- src/Chartjs/assets/{vitest.config.js => vitest.config.mjs} | 2 +- .../Google/assets/{vitest.config.js => vitest.config.mjs} | 2 +- .../Leaflet/assets/{vitest.config.js => vitest.config.mjs} | 2 +- src/React/assets/{vitest.config.js => vitest.config.mjs} | 4 ++-- src/Svelte/assets/vitest.config.mjs | 2 +- src/Turbo/assets/{vitest.config.js => vitest.config.mjs} | 2 +- src/Vue/assets/{vitest.config.js => vitest.config.mjs} | 4 ++-- vitest.config.js => vitest.config.mjs | 0 8 files changed, 9 insertions(+), 9 deletions(-) rename src/Chartjs/assets/{vitest.config.js => vitest.config.mjs} (89%) rename src/Map/src/Bridge/Google/assets/{vitest.config.js => vitest.config.mjs} (95%) rename src/Map/src/Bridge/Leaflet/assets/{vitest.config.js => vitest.config.mjs} (95%) rename src/React/assets/{vitest.config.js => vitest.config.mjs} (79%) rename src/Turbo/assets/{vitest.config.js => vitest.config.mjs} (82%) rename src/Vue/assets/{vitest.config.js => vitest.config.mjs} (79%) rename vitest.config.js => vitest.config.mjs (100%) diff --git a/src/Chartjs/assets/vitest.config.js b/src/Chartjs/assets/vitest.config.mjs similarity index 89% rename from src/Chartjs/assets/vitest.config.js rename to src/Chartjs/assets/vitest.config.mjs index 7160fb241e7..ad1c9eb8b55 100644 --- a/src/Chartjs/assets/vitest.config.js +++ b/src/Chartjs/assets/vitest.config.mjs @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config'; -import configShared from '../../../vitest.config.js' +import configShared from '../../../vitest.config.mjs' import path from 'path'; export default mergeConfig( diff --git a/src/Map/src/Bridge/Google/assets/vitest.config.js b/src/Map/src/Bridge/Google/assets/vitest.config.mjs similarity index 95% rename from src/Map/src/Bridge/Google/assets/vitest.config.js rename to src/Map/src/Bridge/Google/assets/vitest.config.mjs index ae1a9ad4296..dde4635d203 100644 --- a/src/Map/src/Bridge/Google/assets/vitest.config.js +++ b/src/Map/src/Bridge/Google/assets/vitest.config.mjs @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config'; -import configShared from '../../../../../../vitest.config.js' +import configShared from '../../../../../../vitest.config.mjs' export default mergeConfig( configShared, diff --git a/src/Map/src/Bridge/Leaflet/assets/vitest.config.js b/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs similarity index 95% rename from src/Map/src/Bridge/Leaflet/assets/vitest.config.js rename to src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs index c033d519d7c..7072015ef3b 100644 --- a/src/Map/src/Bridge/Leaflet/assets/vitest.config.js +++ b/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config'; -import configShared from '../../../../../../vitest.config.js' +import configShared from '../../../../../../vitest.config.mjs' export default mergeConfig( configShared, diff --git a/src/React/assets/vitest.config.js b/src/React/assets/vitest.config.mjs similarity index 79% rename from src/React/assets/vitest.config.js rename to src/React/assets/vitest.config.mjs index e2eb3e8a3ce..a344f1fefcd 100644 --- a/src/React/assets/vitest.config.js +++ b/src/React/assets/vitest.config.mjs @@ -1,11 +1,11 @@ // vitest.config.ts import { defineConfig, mergeConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; -import configShared from '../../../vitest.config.js' +import configShared from '../../../vitest.config.mjs' export default mergeConfig( configShared, defineConfig({ plugins: [react()], }) -); \ No newline at end of file +); diff --git a/src/Svelte/assets/vitest.config.mjs b/src/Svelte/assets/vitest.config.mjs index 587ae7ce602..2400e2a19a9 100644 --- a/src/Svelte/assets/vitest.config.mjs +++ b/src/Svelte/assets/vitest.config.mjs @@ -1,7 +1,7 @@ // vitest.config.ts import { defineConfig, mergeConfig } from 'vitest/config'; import { svelte } from '@sveltejs/vite-plugin-svelte'; -import configShared from '../../../vitest.config.js' +import configShared from '../../../vitest.config.mjs' export default mergeConfig( configShared, diff --git a/src/Turbo/assets/vitest.config.js b/src/Turbo/assets/vitest.config.mjs similarity index 82% rename from src/Turbo/assets/vitest.config.js rename to src/Turbo/assets/vitest.config.mjs index 04a5d14a140..83341591ae8 100644 --- a/src/Turbo/assets/vitest.config.js +++ b/src/Turbo/assets/vitest.config.mjs @@ -1,5 +1,5 @@ import { defineConfig, mergeConfig } from 'vitest/config'; -import configShared from '../../../vitest.config.js' +import configShared from '../../../vitest.config.mjs' import path from 'path'; export default mergeConfig( diff --git a/src/Vue/assets/vitest.config.js b/src/Vue/assets/vitest.config.mjs similarity index 79% rename from src/Vue/assets/vitest.config.js rename to src/Vue/assets/vitest.config.mjs index 2c8a3cc89cf..7001a15e17b 100644 --- a/src/Vue/assets/vitest.config.js +++ b/src/Vue/assets/vitest.config.mjs @@ -1,11 +1,11 @@ // vitest.config.ts import { defineConfig, mergeConfig } from 'vitest/config'; import vue from '@vitejs/plugin-vue'; -import configShared from '../../../vitest.config.js' +import configShared from '../../../vitest.config.mjs' export default mergeConfig( configShared, defineConfig({ plugins: [vue()], }) -); \ No newline at end of file +); diff --git a/vitest.config.js b/vitest.config.mjs similarity index 100% rename from vitest.config.js rename to vitest.config.mjs From e31007446680ee4d82ae81c5b3843686a73cf1d3 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Tue, 10 Sep 2024 08:41:53 +0200 Subject: [PATCH 38/64] [TwigComponent] Deprecate `cva` twig function --- src/Map/src/Twig/MapExtension.php | 7 ++++--- src/TwigComponent/CHANGELOG.md | 1 + src/TwigComponent/doc/index.rst | 8 +++++++- src/TwigComponent/src/CVA.php | 2 ++ src/TwigComponent/src/Twig/ComponentExtension.php | 9 ++++++++- .../Fixtures/templates/components/Alert.html.twig | 2 +- .../tests/Integration/ComponentExtensionTest.php | 13 +++++++++++++ src/TwigComponent/tests/Unit/CVATest.php | 4 ++++ 8 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Map/src/Twig/MapExtension.php b/src/Map/src/Twig/MapExtension.php index 04afecf3975..57807f54c4e 100644 --- a/src/Map/src/Twig/MapExtension.php +++ b/src/Map/src/Twig/MapExtension.php @@ -12,6 +12,7 @@ namespace Symfony\UX\Map\Twig; use Symfony\UX\Map\Renderer\Renderers; +use Twig\DeprecatedCallableInfo; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -27,9 +28,9 @@ public function getFunctions(): array return [ new TwigFunction('render_map', [Renderers::class, 'renderMap'], [ 'is_safe' => ['html'], - 'deprecated' => '2.20', - 'deprecating_package' => 'symfony/ux-map', - 'alternative' => 'ux_map', + ...(class_exists(DeprecatedCallableInfo::class) + ? ['deprecation_info' => new DeprecatedCallableInfo('symfony/ux-map', '2.20', 'ux_map')] + : ['deprecated' => '2.20', 'deprecating_package' => 'symfony/ux-map', 'alternative' => 'ux_map']), ]), new TwigFunction('ux_map', [Renderers::class, 'renderMap'], ['is_safe' => ['html']]), ]; diff --git a/src/TwigComponent/CHANGELOG.md b/src/TwigComponent/CHANGELOG.md index 805c23711f4..34d110e3b36 100644 --- a/src/TwigComponent/CHANGELOG.md +++ b/src/TwigComponent/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.20.0 - Add Anonymous Component support for 3rd-party bundles #2019 +- Deprecate `cva` Twig function in favor of [`html_cva` from `twig/html-extra`](https://twig.symfony.com/html_cva) #2144 ## 2.17.0 diff --git a/src/TwigComponent/doc/index.rst b/src/TwigComponent/doc/index.rst index ce98de2f895..e324db1c00f 100644 --- a/src/TwigComponent/doc/index.rst +++ b/src/TwigComponent/doc/index.rst @@ -1158,6 +1158,11 @@ Component with Complex Variants (CVA) The ``cva`` function was added in TwigComponents 2.16. +.. deprecated:: 2.20 + + The ``cva`` function was deprecated in TwigComponents 2.20, and will be removed in 3.0. + The function is now provided by the ``twig/html-extra:^3.12`` package under the name `html_cva`_. + `CVA (Class Variant Authority)`_ is a concept from the JavaScript world and used by the well-known `shadcn/ui`_. CVA allows you to display a component with different variants (color, size, etc.), @@ -1763,6 +1768,7 @@ https://symfony.com/doc/current/contributing/code/bc.html .. _`Passing Blocks to Live Components`: https://symfony.com/bundles/ux-live-component/current/index.html#passing-blocks .. _`Stimulus controller`: https://symfony.com/bundles/StimulusBundle/current/index.html .. _`CVA (Class Variant Authority)`: https://cva.style/docs/getting-started/variants +.. _`html_cva`: https://twig.symfony.com/doc/3.x/functions/html_cva.html .. _`shadcn/ui`: https://ui.shadcn.com .. _`tales-from-a-dev/twig-tailwind-extra`: https://github.com/tales-from-a-dev/twig-tailwind-extra -.. _`ignore not defined options`: https://symfony.com/doc/current/components/options_resolver.html#ignore-not-defined-options +.. _`ignore not defined options`: https://symfony.com/doc/current/components/options_resolver.html#ignore-not-defined-options \ No newline at end of file diff --git a/src/TwigComponent/src/CVA.php b/src/TwigComponent/src/CVA.php index 65c8d0bbe0a..f0f086807dc 100644 --- a/src/TwigComponent/src/CVA.php +++ b/src/TwigComponent/src/CVA.php @@ -24,6 +24,8 @@ * @author Mathéo Daninos * * @experimental + * + * @deprecated since TwigComponent 2.20, use CVA from the "twig/html-extra:^3.12.0" package instead. */ final class CVA { diff --git a/src/TwigComponent/src/Twig/ComponentExtension.php b/src/TwigComponent/src/Twig/ComponentExtension.php index 14f30c382da..eaa737b68cb 100644 --- a/src/TwigComponent/src/Twig/ComponentExtension.php +++ b/src/TwigComponent/src/Twig/ComponentExtension.php @@ -16,6 +16,7 @@ use Symfony\UX\TwigComponent\ComponentRenderer; use Symfony\UX\TwigComponent\CVA; use Symfony\UX\TwigComponent\Event\PreRenderEvent; +use Twig\DeprecatedCallableInfo; use Twig\Error\RuntimeError; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -42,7 +43,11 @@ public function getFunctions(): array { return [ new TwigFunction('component', [$this, 'render'], ['is_safe' => ['all']]), - new TwigFunction('cva', [$this, 'cva']), + new TwigFunction('cva', [$this, 'cva'], [ + ...(class_exists(DeprecatedCallableInfo::class) + ? ['deprecation_info' => new DeprecatedCallableInfo('symfony/ux-twig-component', '2.20', 'html_cva', 'twig/html-extra')] + : ['deprecated' => '2.20', 'deprecating_package' => 'symfony/ux-twig-component', 'alternative' => 'html_cva']), + ]), ]; } @@ -105,6 +110,8 @@ public function finishEmbeddedComponentRender(): void */ public function cva(array $cva): CVA { + trigger_deprecation('symfony/ux-twig-component', '2.20', 'Twig Function "cva" is deprecated; use "html_cva" from the "twig/html-extra" package (available since version 3.12) instead.'); + return new CVA( $cva['base'] ?? '', $cva['variants'] ?? [], diff --git a/src/TwigComponent/tests/Fixtures/templates/components/Alert.html.twig b/src/TwigComponent/tests/Fixtures/templates/components/Alert.html.twig index 46b09843352..fe0360949d7 100644 --- a/src/TwigComponent/tests/Fixtures/templates/components/Alert.html.twig +++ b/src/TwigComponent/tests/Fixtures/templates/components/Alert.html.twig @@ -33,4 +33,4 @@
{% block content %} {% endblock %} -
\ No newline at end of file +
diff --git a/src/TwigComponent/tests/Integration/ComponentExtensionTest.php b/src/TwigComponent/tests/Integration/ComponentExtensionTest.php index 043906222ff..8b2b0e0987a 100644 --- a/src/TwigComponent/tests/Integration/ComponentExtensionTest.php +++ b/src/TwigComponent/tests/Integration/ComponentExtensionTest.php @@ -11,6 +11,7 @@ namespace Symfony\UX\TwigComponent\Tests\Integration; +use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\UX\TwigComponent\Tests\Fixtures\User; use Twig\Environment; @@ -21,6 +22,8 @@ */ final class ComponentExtensionTest extends KernelTestCase { + use ExpectDeprecationTrait; + public function testCanRenderComponent(): void { $output = $this->renderComponent('component_a', [ @@ -264,8 +267,13 @@ class="block" ]; } + /** + * @group legacy + */ public function testComponentWithClassMerge(): void { + $this->expectDeprecation('Since symfony/ux-twig-component 2.20: Twig Function "cva" is deprecated; use "html_cva" from the "twig/html-extra" package (available since version 3.12) instead.'); + $output = self::getContainer()->get(Environment::class)->render('class_merge.html.twig'); $this->assertStringContainsString('class="alert alert-red alert-lg font-semibold rounded-md dark:bg-gray-600 flex p-4"', $output); @@ -373,8 +381,13 @@ public function testComponentWithEmptyProps(): void $this->assertStringContainsString('I have an empty props tag', $output); } + /** + * @group legacy + */ public function testAnonymousComponentWithPropsOverwriteParentsProps(): void { + $this->expectDeprecation('Since symfony/ux-twig-component 2.20: Twig Function "cva" is deprecated; use "html_cva" from the "twig/html-extra" package (available since version 3.12) instead.'); + $output = self::getContainer()->get(Environment::class)->render('anonymous_component_with_props_overwrite_parents_props.html.twig'); $this->assertStringContainsString('I am an icon', $output); diff --git a/src/TwigComponent/tests/Unit/CVATest.php b/src/TwigComponent/tests/Unit/CVATest.php index 37242b694d0..c3ad61f2369 100644 --- a/src/TwigComponent/tests/Unit/CVATest.php +++ b/src/TwigComponent/tests/Unit/CVATest.php @@ -15,7 +15,11 @@ use Symfony\UX\TwigComponent\CVA; /** + * To remove in TwigComponent 3.0. + * * @author Mathéo Daninos + * + * @group legacy */ class CVATest extends TestCase { From 52ca1c9eeb41ff9329ab77cb7bfed1c90f2116a4 Mon Sep 17 00:00:00 2001 From: Matijn Woudt Date: Thu, 1 Aug 2024 14:08:21 +0200 Subject: [PATCH 39/64] [LiveComponent] Update CSRF token after component request --- .../assets/dist/Backend/Backend.d.ts | 2 ++ .../assets/dist/Backend/RequestBuilder.d.ts | 3 ++- .../assets/dist/live_controller.js | 9 +++++++++ .../assets/src/Backend/Backend.ts | 5 +++++ .../assets/src/Backend/RequestBuilder.ts | 6 +++++- .../assets/src/Component/index.ts | 5 +++++ .../assets/test/controller/render.test.ts | 19 +++++++++++++++++++ src/LiveComponent/assets/test/tools.ts | 6 ++++++ 8 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/LiveComponent/assets/dist/Backend/Backend.d.ts b/src/LiveComponent/assets/dist/Backend/Backend.d.ts index 53e5daae9ac..c664be92d5b 100644 --- a/src/LiveComponent/assets/dist/Backend/Backend.d.ts +++ b/src/LiveComponent/assets/dist/Backend/Backend.d.ts @@ -13,6 +13,7 @@ export interface BackendInterface { }, files: { [key: string]: FileList; }): BackendRequest; + updateCsrfToken(csrfToken: string): void; } export interface BackendAction { name: string; @@ -28,4 +29,5 @@ export default class implements BackendInterface { }, files: { [key: string]: FileList; }): BackendRequest; + updateCsrfToken(csrfToken: string): void; } diff --git a/src/LiveComponent/assets/dist/Backend/RequestBuilder.d.ts b/src/LiveComponent/assets/dist/Backend/RequestBuilder.d.ts index 2cee6c2fe49..8a29af3b516 100644 --- a/src/LiveComponent/assets/dist/Backend/RequestBuilder.d.ts +++ b/src/LiveComponent/assets/dist/Backend/RequestBuilder.d.ts @@ -2,7 +2,7 @@ import type { BackendAction, ChildrenFingerprints } from './Backend'; export default class { private url; private method; - private readonly csrfToken; + private csrfToken; constructor(url: string, method?: 'get' | 'post', csrfToken?: string | null); buildRequest(props: any, actions: BackendAction[], updated: { [key: string]: any; @@ -15,4 +15,5 @@ export default class { fetchOptions: RequestInit; }; private willDataFitInUrl; + updateCsrfToken(csrfToken: string): void; } diff --git a/src/LiveComponent/assets/dist/live_controller.js b/src/LiveComponent/assets/dist/live_controller.js index 05af8986dbe..22b6b68f43a 100644 --- a/src/LiveComponent/assets/dist/live_controller.js +++ b/src/LiveComponent/assets/dist/live_controller.js @@ -2052,6 +2052,9 @@ class Component { return response; } this.processRerender(html, backendResponse); + if (this.element.dataset.liveCsrfValue) { + this.backend.updateCsrfToken(this.element.dataset.liveCsrfValue); + } this.backendRequest = null; thisPromiseResolve(backendResponse); if (this.isRequestPending) { @@ -2325,6 +2328,9 @@ class RequestBuilder { const urlEncodedJsonData = new URLSearchParams(propsJson + updatedJson + childrenJson + propsFromParentJson).toString(); return (urlEncodedJsonData + params.toString()).length < 1500; } + updateCsrfToken(csrfToken) { + this.csrfToken = csrfToken; + } } class Backend { @@ -2335,6 +2341,9 @@ class Backend { const { url, fetchOptions } = this.requestBuilder.buildRequest(props, actions, updated, children, updatedPropsFromParent, files); return new BackendRequest(fetch(url, fetchOptions), actions.map((backendAction) => backendAction.name), Object.keys(updated)); } + updateCsrfToken(csrfToken) { + this.requestBuilder.updateCsrfToken(csrfToken); + } } class StimulusElementDriver { diff --git a/src/LiveComponent/assets/src/Backend/Backend.ts b/src/LiveComponent/assets/src/Backend/Backend.ts index b7bb6445f11..b3d019a4be4 100644 --- a/src/LiveComponent/assets/src/Backend/Backend.ts +++ b/src/LiveComponent/assets/src/Backend/Backend.ts @@ -15,6 +15,7 @@ export interface BackendInterface { updatedPropsFromParent: { [key: string]: any }, files: { [key: string]: FileList } ): BackendRequest; + updateCsrfToken(csrfToken: string): void; } export interface BackendAction { @@ -52,4 +53,8 @@ export default class implements BackendInterface { Object.keys(updated) ); } + + updateCsrfToken(csrfToken: string) { + this.requestBuilder.updateCsrfToken(csrfToken); + } } diff --git a/src/LiveComponent/assets/src/Backend/RequestBuilder.ts b/src/LiveComponent/assets/src/Backend/RequestBuilder.ts index 328f0647b91..b9bd2fc13dc 100644 --- a/src/LiveComponent/assets/src/Backend/RequestBuilder.ts +++ b/src/LiveComponent/assets/src/Backend/RequestBuilder.ts @@ -3,7 +3,7 @@ import type { BackendAction, ChildrenFingerprints } from './Backend'; export default class { private url: string; private method: 'get' | 'post'; - private readonly csrfToken: string | null; + private csrfToken: string | null; constructor(url: string, method: 'get' | 'post' = 'post', csrfToken: string | null = null) { this.url = url; @@ -117,4 +117,8 @@ export default class { // if the URL gets remotely close to 2000 chars, it may not fit return (urlEncodedJsonData + params.toString()).length < 1500; } + + updateCsrfToken(csrfToken: string) { + this.csrfToken = csrfToken; + } } diff --git a/src/LiveComponent/assets/src/Component/index.ts b/src/LiveComponent/assets/src/Component/index.ts index 28807c57884..18c6a5dea81 100644 --- a/src/LiveComponent/assets/src/Component/index.ts +++ b/src/LiveComponent/assets/src/Component/index.ts @@ -329,6 +329,11 @@ export default class Component { this.processRerender(html, backendResponse); + // Store updated csrf token + if (this.element.dataset.liveCsrfValue) { + this.backend.updateCsrfToken(this.element.dataset.liveCsrfValue); + } + // finally resolve this promise this.backendRequest = null; thisPromiseResolve(backendResponse); diff --git a/src/LiveComponent/assets/test/controller/render.test.ts b/src/LiveComponent/assets/test/controller/render.test.ts index efa875c0ba9..0e328a61517 100644 --- a/src/LiveComponent/assets/test/controller/render.test.ts +++ b/src/LiveComponent/assets/test/controller/render.test.ts @@ -630,4 +630,23 @@ describe('LiveController rendering Tests', () => { // verify the selectedIndex of the select option 2 is 0 expect(selectOption2.selectedIndex).toBe(0); }); + + it('backend will have a new csrf token', async () => { + const test = await createTest( + {}, + (data: any) => ` +
+
+ ` + ); + + test.expectsAjaxCall().serverWillChangeProps((data: any) => { + // change csrf token + data.csrf = 'Hello'; + }); + + await test.component.render(); + + expect(test.mockedBackend.csrfToken).toEqual('Hello'); + }); }); diff --git a/src/LiveComponent/assets/test/tools.ts b/src/LiveComponent/assets/test/tools.ts index 4b0f67993d4..958fdcc8b53 100644 --- a/src/LiveComponent/assets/test/tools.ts +++ b/src/LiveComponent/assets/test/tools.ts @@ -98,6 +98,8 @@ class FunctionalTest { class MockedBackend implements BackendInterface { private expectedMockedAjaxCalls: Array = []; + public csrfToken: string | null = null; + addMockedAjaxCall(mock: MockedAjaxCall) { this.expectedMockedAjaxCalls.push(mock); } @@ -139,6 +141,10 @@ class MockedBackend implements BackendInterface { return matchedMock.createBackendRequest(); } + updateCsrfToken(csrfToken: string) { + this.csrfToken = csrfToken; + } + getExpectedMockedAjaxCalls(): Array { return this.expectedMockedAjaxCalls; } From 5f1e2d3768f676520d22a623af61d0ceb862b5a4 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Wed, 11 Sep 2024 13:46:08 +0200 Subject: [PATCH 40/64] [Icons] Add support for int/float attribute to `ux_icon` function --- src/Icons/CHANGELOG.md | 1 + src/Icons/src/Icon.php | 6 +++--- src/Icons/tests/Fixtures/templates/template1.html.twig | 2 ++ src/Icons/tests/Integration/RenderIconsInTwigTest.php | 2 ++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Icons/CHANGELOG.md b/src/Icons/CHANGELOG.md index 71eb76d0f22..8ff2aad1fb0 100644 --- a/src/Icons/CHANGELOG.md +++ b/src/Icons/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.20.0 - Add `aliases` configuration option to define icon alternative names. +- Add support for `int` and `float` attribute values in ``. ## 2.19.0 diff --git a/src/Icons/src/Icon.php b/src/Icons/src/Icon.php index 41883a98254..e7a9e73b04e 100644 --- a/src/Icons/src/Icon.php +++ b/src/Icons/src/Icon.php @@ -176,7 +176,7 @@ public function getAttributes(): array } /** - * @param array $attributes + * @param array $attributes */ public function withAttributes(array $attributes): self { @@ -189,8 +189,8 @@ public function withAttributes(array $attributes): self throw new \InvalidArgumentException(\sprintf('Invalid attribute name "%s".', $name)); } - if (!\is_string($value) && !\is_bool($value)) { - throw new \InvalidArgumentException(\sprintf('Invalid value type for attribute "%s". Boolean or string allowed, "%s" provided. ', $name, get_debug_type($value))); + if (!\is_string($value) && !\is_bool($value) && !\is_int($value) && !\is_float($value)) { + throw new \InvalidArgumentException(\sprintf('Invalid value type for attribute "%s". Boolean, string, int or float allowed, "%s" provided. ', $name, get_debug_type($value))); } } diff --git a/src/Icons/tests/Fixtures/templates/template1.html.twig b/src/Icons/tests/Fixtures/templates/template1.html.twig index 9824703029a..096a3d5333d 100644 --- a/src/Icons/tests/Fixtures/templates/template1.html.twig +++ b/src/Icons/tests/Fixtures/templates/template1.html.twig @@ -2,8 +2,10 @@
  • {{ ux_icon('user', {class: 'h-8 w-8'}) }}
  • {{ ux_icon('user', {"aria-label": "AriaLabel"}) }}
  • {{ ux_icon('sub:check', {'data-action': 'string "with" quotes'}) }}
  • +
  • {{ ux_icon('sub:check', { height: 24, width: "24" }) }}
  • {{ ux_icon('iconamoon:3d-duotone') }}
  • +
  • {{ ux_icon('iconamoon:3d-duotone', { height: 24, width: "24" }) }}
  • diff --git a/src/Icons/tests/Integration/RenderIconsInTwigTest.php b/src/Icons/tests/Integration/RenderIconsInTwigTest.php index 0522a916f51..8789f29a150 100644 --- a/src/Icons/tests/Integration/RenderIconsInTwigTest.php +++ b/src/Icons/tests/Integration/RenderIconsInTwigTest.php @@ -29,10 +29,12 @@ public function testRenderIcons(): void
  • +
  • +
  • HTML, trim($output) From 4d03d400d877e62b71291d210050d3a2e08037cd Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Sat, 14 Sep 2024 16:31:15 -0400 Subject: [PATCH 41/64] doc: add versionadded to Icon Aliases --- src/Icons/doc/index.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Icons/doc/index.rst b/src/Icons/doc/index.rst index 9ac93419834..0950e88596f 100644 --- a/src/Icons/doc/index.rst +++ b/src/Icons/doc/index.rst @@ -339,6 +339,10 @@ Now, all icons will have the ``fill`` attribute set to ``currentColor`` by defau Icon Aliases ~~~~~~~~~~~~ +.. versionadded:: 2.20 + + Icon Aliases feature was added in 2.20. + Aliases are custom names you can define to refer to any icon. They are useful for creating shortcuts to icons you frequently use in your templates: @@ -544,11 +548,11 @@ Full Configuration default_icon_attributes: # Default: fill: currentColor - + # Icon aliases (alias => icon name). aliases: # Exemple: - dots: 'clarity:ellipsis-horizontal-line' + dots: 'clarity:ellipsis-horizontal-line' # Configuration for the "on demand" icons powered by Iconify.design. iconify: @@ -559,7 +563,7 @@ Full Configuration # The endpoint for the Iconify API. endpoint: 'https://api.iconify.design' - + # Whether to ignore errors when an icon is not found. ignore_not_found: false From d3000fb01e344ad9461a58f5f7322f3ca7eadc4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 14 Sep 2024 23:54:18 +0200 Subject: [PATCH 42/64] [Site] Complete migration to UX Icons --- .../cookbook/component_architecture.md | 8 ++--- ux.symfony.com/src/UX/IconRenderer.php | 34 +++++++++++++++++++ ux.symfony.com/templates/_banner.html.twig | 2 +- ux.symfony.com/templates/_footer.html.twig | 4 +-- ux.symfony.com/templates/_header.html.twig | 6 ++-- .../templates/components/Browser.html.twig | 8 ++--- .../components/ChangelogItem.html.twig | 2 +- .../components/Code/CodeBlock.html.twig | 2 +- .../Code/CodeBlockButtons.html.twig | 4 +-- .../components/Code/CodeLine.html.twig | 2 +- .../templates/components/DocsLink.html.twig | 4 +-- .../templates/components/FoodVote.html.twig | 6 ++-- .../templates/components/Icon.html.twig | 7 ---- .../components/Icon/IconModal.html.twig | 2 +- .../components/Icon/IconSearch.html.twig | 10 +++--- .../components/InlineEditFood.html.twig | 2 +- .../components/InvoiceCreator.html.twig | 8 ++--- .../InvoiceCreatorLineItem.html.twig | 2 +- .../components/Package/PackageBox.html.twig | 2 +- .../components/TerminalCommand.html.twig | 2 +- .../components/ThemeSwitcher.html.twig | 4 +-- .../LiveMemory/ThemeSwitch.html.twig | 4 +-- .../demos/live_memory/index.html.twig | 2 +- .../templates/main/_file_tree.html.twig | 4 +-- .../templates/main/homepage.html.twig | 8 +++-- ux.symfony.com/templates/support.html.twig | 2 +- .../ux_packages/lazy_image.html.twig | 4 +-- .../ux_packages/live_component.html.twig | 6 ++-- .../templates/ux_packages/swup.html.twig | 4 +-- .../templates/ux_packages/turbo.html.twig | 10 +++--- .../turbo/_chat_message_count.html.twig | 2 +- .../ux_packages/turbo/add_todo.html.twig | 2 +- .../ux_packages/turbo/todos.html.twig | 2 +- 33 files changed, 101 insertions(+), 70 deletions(-) create mode 100644 ux.symfony.com/src/UX/IconRenderer.php delete mode 100644 ux.symfony.com/templates/components/Icon.html.twig diff --git a/ux.symfony.com/cookbook/component_architecture.md b/ux.symfony.com/cookbook/component_architecture.md index 5314d8cdc7c..d178c87d4ad 100644 --- a/ux.symfony.com/cookbook/component_architecture.md +++ b/ux.symfony.com/cookbook/component_architecture.md @@ -33,7 +33,7 @@ In Symfony, you can have an `Alert` component, for example, with the following t ```twig
    - + {{ message }}
    ``` @@ -43,9 +43,9 @@ Or you can compose with the following syntax: ```twig - + - + ``` @@ -79,7 +79,7 @@ We have the following template: {% props type, icon, message %}
    - + {{ message }}
    ``` diff --git a/ux.symfony.com/src/UX/IconRenderer.php b/ux.symfony.com/src/UX/IconRenderer.php new file mode 100644 index 00000000000..f868a052084 --- /dev/null +++ b/ux.symfony.com/src/UX/IconRenderer.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\UX; + +use Symfony\Component\DependencyInjection\Attribute\AsDecorator; +use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated; +use Symfony\UX\Icons\IconRendererInterface; + +#[AsDecorator(decorates: '.ux_icons.icon_renderer')] +class IconRenderer implements IconRendererInterface +{ + public function __construct( + #[AutowireDecorated] + private IconRendererInterface $inner, + ) { + } + + public function renderIcon(string $name, array $attributes = []): string + { + return $this->inner->renderIcon($name, [ + ...$attributes, + 'class' => \sprintf('%s %s', 'Icon', $attributes['class'] ?? ''), + ]); + } +} diff --git a/ux.symfony.com/templates/_banner.html.twig b/ux.symfony.com/templates/_banner.html.twig index 15cdcd38787..eb02f25b1d0 100644 --- a/ux.symfony.com/templates/_banner.html.twig +++ b/ux.symfony.com/templates/_banner.html.twig @@ -8,7 +8,7 @@
    diff --git a/ux.symfony.com/templates/_footer.html.twig b/ux.symfony.com/templates/_footer.html.twig index 77a598a6384..1f114585703 100644 --- a/ux.symfony.com/templates/_footer.html.twig +++ b/ux.symfony.com/templates/_footer.html.twig @@ -8,7 +8,7 @@ aria-label="Symfony UX on GitHub" class="order-lg-1" > - + Docs Changelog @@ -17,7 +17,7 @@ style="font-size: 1.5rem;" aria-label="Symfony website" > - +

    diff --git a/ux.symfony.com/templates/_header.html.twig b/ux.symfony.com/templates/_header.html.twig index 5e9abd4537f..3a2eb26ca89 100644 --- a/ux.symfony.com/templates/_header.html.twig +++ b/ux.symfony.com/templates/_header.html.twig @@ -13,7 +13,7 @@ data-action="ux-header#toggleMenu" aria-label="Toggle menu" > - + - + - + diff --git a/ux.symfony.com/templates/components/Browser.html.twig b/ux.symfony.com/templates/components/Browser.html.twig index a18aa38fe50..d8eee9db897 100644 --- a/ux.symfony.com/templates/components/Browser.html.twig +++ b/ux.symfony.com/templates/components/Browser.html.twig @@ -15,23 +15,23 @@
    - + ux.symfony.com
    {% if false %} {% endif %} {% if githubUrl|default %} - + {% endif %}
    diff --git a/ux.symfony.com/templates/components/ChangelogItem.html.twig b/ux.symfony.com/templates/components/ChangelogItem.html.twig index 1fff78b9c6d..9c40a144655 100644 --- a/ux.symfony.com/templates/components/ChangelogItem.html.twig +++ b/ux.symfony.com/templates/components/ChangelogItem.html.twig @@ -14,7 +14,7 @@

    {{ item.name|default(item.version) }}

    - +
    {{ this.getContent()|markdown_to_html }} diff --git a/ux.symfony.com/templates/components/Code/CodeBlock.html.twig b/ux.symfony.com/templates/components/Code/CodeBlock.html.twig index 53e70a8cbdc..b64d27697e3 100644 --- a/ux.symfony.com/templates/components/Code/CodeBlock.html.twig +++ b/ux.symfony.com/templates/components/Code/CodeBlock.html.twig @@ -46,7 +46,7 @@ data-code-expander-target="expandCodeButton" data-action="code-expander#expandCode" > - + Expand code {% endblock %} diff --git a/ux.symfony.com/templates/components/Code/CodeBlockButtons.html.twig b/ux.symfony.com/templates/components/Code/CodeBlockButtons.html.twig index 4abed2b8a44..c059ec8fb7f 100644 --- a/ux.symfony.com/templates/components/Code/CodeBlockButtons.html.twig +++ b/ux.symfony.com/templates/components/Code/CodeBlockButtons.html.twig @@ -11,7 +11,7 @@ data-bs-placement="bottom" title="View on GitHub" > - + {% endset %} @@ -32,7 +32,7 @@ data-action="clipboarder#copy" data-clipboarder-target="button" > - +
    diff --git a/ux.symfony.com/templates/components/Code/CodeLine.html.twig b/ux.symfony.com/templates/components/Code/CodeLine.html.twig index eb3ffb0f4cc..b7033b2ff79 100644 --- a/ux.symfony.com/templates/components/Code/CodeLine.html.twig +++ b/ux.symfony.com/templates/components/Code/CodeLine.html.twig @@ -16,6 +16,6 @@ >{{ _code ? _code|trim|raw : code }} diff --git a/ux.symfony.com/templates/components/DocsLink.html.twig b/ux.symfony.com/templates/components/DocsLink.html.twig index a4e1f370095..d5fb6ad960a 100644 --- a/ux.symfony.com/templates/components/DocsLink.html.twig +++ b/ux.symfony.com/templates/components/DocsLink.html.twig @@ -5,9 +5,9 @@ rel="{{ isExternal ? 'external noopened noreferrer' }}" >{{ title }} {% if icon|default %} - + {% elseif isExternal %} - + {% endif %}

    diff --git a/ux.symfony.com/templates/components/Icon/IconSearch.html.twig b/ux.symfony.com/templates/components/Icon/IconSearch.html.twig index d264892d08a..799f8291403 100644 --- a/ux.symfony.com/templates/components/Icon/IconSearch.html.twig +++ b/ux.symfony.com/templates/components/Icon/IconSearch.html.twig @@ -7,7 +7,7 @@
    @@ -52,7 +52,7 @@ {% if false %}
    diff --git a/ux.symfony.com/templates/components/InlineEditFood.html.twig b/ux.symfony.com/templates/components/InlineEditFood.html.twig index 914d3df5f64..cfca8037930 100644 --- a/ux.symfony.com/templates/components/InlineEditFood.html.twig +++ b/ux.symfony.com/templates/components/InlineEditFood.html.twig @@ -41,7 +41,7 @@ class="btn btn-link" title="Click to edit!" > - + {% endif %} diff --git a/ux.symfony.com/templates/components/InvoiceCreator.html.twig b/ux.symfony.com/templates/components/InvoiceCreator.html.twig index 1a1b18ad08c..c3b52d8b4a8 100644 --- a/ux.symfony.com/templates/components/InvoiceCreator.html.twig +++ b/ux.symfony.com/templates/components/InvoiceCreator.html.twig @@ -59,7 +59,7 @@ data-live-action-param="addLineItem" class="btn btn-sm btn-secondary" type="button" - > Add Item + > Add Item @@ -101,13 +101,13 @@ {{ areAnyLineItemsEditing ? 'disabled' : '' }} > - + {% if savedSuccessfully %} - + {% endif %} {% if saveFailed %} - + {% endif %} Save Invoice diff --git a/ux.symfony.com/templates/components/InvoiceCreatorLineItem.html.twig b/ux.symfony.com/templates/components/InvoiceCreatorLineItem.html.twig index 4386a91b809..098ceaa7f14 100644 --- a/ux.symfony.com/templates/components/InvoiceCreatorLineItem.html.twig +++ b/ux.symfony.com/templates/components/InvoiceCreatorLineItem.html.twig @@ -73,6 +73,6 @@ data-live-key-param="{{ key }}" class="btn btn-link text-danger btn-sm ml-2" type="button" - > + > diff --git a/ux.symfony.com/templates/components/Package/PackageBox.html.twig b/ux.symfony.com/templates/components/Package/PackageBox.html.twig index 1e59da3c113..c6a5aa441e4 100644 --- a/ux.symfony.com/templates/components/Package/PackageBox.html.twig +++ b/ux.symfony.com/templates/components/Package/PackageBox.html.twig @@ -9,7 +9,7 @@ <{{ titleTag }} class="PackageBox_title"> {{ package.humanName }} - +
    diff --git a/ux.symfony.com/templates/components/TerminalCommand.html.twig b/ux.symfony.com/templates/components/TerminalCommand.html.twig index d9f6356e316..f796e109c9a 100644 --- a/ux.symfony.com/templates/components/TerminalCommand.html.twig +++ b/ux.symfony.com/templates/components/TerminalCommand.html.twig @@ -12,6 +12,6 @@ aria-label="Copy command" data-action="clipboarder#copy" > - +
    diff --git a/ux.symfony.com/templates/components/ThemeSwitcher.html.twig b/ux.symfony.com/templates/components/ThemeSwitcher.html.twig index deb5491e99b..6547b2c1733 100644 --- a/ux.symfony.com/templates/components/ThemeSwitcher.html.twig +++ b/ux.symfony.com/templates/components/ThemeSwitcher.html.twig @@ -5,6 +5,6 @@ data-controller="theme-switcher" data-action="theme-switcher#switch" > - - + + diff --git a/ux.symfony.com/templates/demos/live_memory/components/LiveMemory/ThemeSwitch.html.twig b/ux.symfony.com/templates/demos/live_memory/components/LiveMemory/ThemeSwitch.html.twig index 69e472e0b72..1ed088bcb67 100644 --- a/ux.symfony.com/templates/demos/live_memory/components/LiveMemory/ThemeSwitch.html.twig +++ b/ux.symfony.com/templates/demos/live_memory/components/LiveMemory/ThemeSwitch.html.twig @@ -7,9 +7,9 @@ data-action="theme-switcher#switch" > - + - + diff --git a/ux.symfony.com/templates/demos/live_memory/index.html.twig b/ux.symfony.com/templates/demos/live_memory/index.html.twig index 7530deece90..59acd43c8f0 100644 --- a/ux.symfony.com/templates/demos/live_memory/index.html.twig +++ b/ux.symfony.com/templates/demos/live_memory/index.html.twig @@ -16,7 +16,7 @@
    diff --git a/ux.symfony.com/templates/main/_file_tree.html.twig b/ux.symfony.com/templates/main/_file_tree.html.twig index 649c962fb5e..0e1ad131cc3 100644 --- a/ux.symfony.com/templates/main/_file_tree.html.twig +++ b/ux.symfony.com/templates/main/_file_tree.html.twig @@ -8,7 +8,7 @@ {% if file_info.isDirectory %}
  • - + {{ file_info.filename }} @@ -21,7 +21,7 @@ {% else %}
  • - + {{ file_info.filename }}
  • diff --git a/ux.symfony.com/templates/main/homepage.html.twig b/ux.symfony.com/templates/main/homepage.html.twig index 4b5b66b6c6a..1993b3f5eed 100644 --- a/ux.symfony.com/templates/main/homepage.html.twig +++ b/ux.symfony.com/templates/main/homepage.html.twig @@ -24,6 +24,10 @@ + {% block foo %} + {{ importmap() }} + {% endblock %} +

    Install it

    @@ -54,7 +58,7 @@

    Write custom JavaScript inside Stimulus Controllers

    Read full Documentation - +
    @@ -108,7 +112,7 @@

    Install extra Packages

    Browse all Packages - +
    diff --git a/ux.symfony.com/templates/support.html.twig b/ux.symfony.com/templates/support.html.twig index 8bfeafb0b4c..46cbf4108f1 100644 --- a/ux.symfony.com/templates/support.html.twig +++ b/ux.symfony.com/templates/support.html.twig @@ -21,7 +21,7 @@
    diff --git a/ux.symfony.com/templates/ux_packages/lazy_image.html.twig b/ux.symfony.com/templates/ux_packages/lazy_image.html.twig index dfcf31aa83d..79c53eaf66d 100644 --- a/ux.symfony.com/templates/ux_packages/lazy_image.html.twig +++ b/ux.symfony.com/templates/ux_packages/lazy_image.html.twig @@ -26,11 +26,11 @@
    - + Load a small (or blurred) image first
    - + The real (large) image is downloaded after page load
    diff --git a/ux.symfony.com/templates/ux_packages/live_component.html.twig b/ux.symfony.com/templates/ux_packages/live_component.html.twig index 472e9534b3f..c9fb51dd2ce 100644 --- a/ux.symfony.com/templates/ux_packages/live_component.html.twig +++ b/ux.symfony.com/templates/ux_packages/live_component.html.twig @@ -31,9 +31,9 @@
    Automatic debouncing
    - +
    Loading states
    - +
    Required writing ZERO JavaScript
    {% endblock %} @@ -48,7 +48,7 @@ Read full Documentation - +
    diff --git a/ux.symfony.com/templates/ux_packages/swup.html.twig b/ux.symfony.com/templates/ux_packages/swup.html.twig index 065a66da94c..03138436685 100644 --- a/ux.symfony.com/templates/ux_packages/swup.html.twig +++ b/ux.symfony.com/templates/ux_packages/swup.html.twig @@ -52,9 +52,9 @@
    Ajax-powered page navigation
    - +
    URL in address bar changes
    - +
    Customizable transitions
    {% endblock %} diff --git a/ux.symfony.com/templates/ux_packages/turbo.html.twig b/ux.symfony.com/templates/ux_packages/turbo.html.twig index 479b70ccb81..f54cacf1fbd 100644 --- a/ux.symfony.com/templates/ux_packages/turbo.html.twig +++ b/ux.symfony.com/templates/ux_packages/turbo.html.twig @@ -33,7 +33,7 @@
    Icon to indication information

    - + Click any links on this site or submit this form. Zero full page refreshes!

    @@ -47,7 +47,7 @@ {% block content %} {% if name and animal %}
    Say hello to {{ name }} the brave & noble {{ animal }}!
    - Back + Back {% else %}
    Build yourself a new pet
    @@ -83,7 +83,7 @@ The frame displays just part of the full page from {{ url('app_turbo_todo_list') }}. All link clicks and form submits stay *inside* the frame. -

    +

    @@ -113,10 +113,10 @@
    Icon to indication information -

    +

    Chat with someone else viewing this page (or open a 2nd browser tab to talk to yourself)! Submitting also - updates the icon in the header.

    + updates the icon in the header.

    diff --git a/ux.symfony.com/templates/ux_packages/turbo/_chat_message_count.html.twig b/ux.symfony.com/templates/ux_packages/turbo/_chat_message_count.html.twig index a142c89a96d..1ab66bfdfc5 100644 --- a/ux.symfony.com/templates/ux_packages/turbo/_chat_message_count.html.twig +++ b/ux.symfony.com/templates/ux_packages/turbo/_chat_message_count.html.twig @@ -5,5 +5,5 @@ id="message-count-header" title="The number of chat messages from Turbo Streams" > - {{ messageCount }} + {{ messageCount }} diff --git a/ux.symfony.com/templates/ux_packages/turbo/add_todo.html.twig b/ux.symfony.com/templates/ux_packages/turbo/add_todo.html.twig index c43b0365e70..1a6b968cd8e 100644 --- a/ux.symfony.com/templates/ux_packages/turbo/add_todo.html.twig +++ b/ux.symfony.com/templates/ux_packages/turbo/add_todo.html.twig @@ -6,7 +6,7 @@ {{ include('ux_packages/turbo/_demo_message.html.twig') }} - Back to list + Back to list {{ form_row(form.item, { attr: { diff --git a/ux.symfony.com/templates/ux_packages/turbo/todos.html.twig b/ux.symfony.com/templates/ux_packages/turbo/todos.html.twig index 72a46810b2a..8eece3de1f1 100644 --- a/ux.symfony.com/templates/ux_packages/turbo/todos.html.twig +++ b/ux.symfony.com/templates/ux_packages/turbo/todos.html.twig @@ -13,7 +13,7 @@ - + {% endfor %} From 51ca54eb403d7076a2c2163bf29fabeef75a5c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 15 Sep 2024 00:46:29 +0200 Subject: [PATCH 43/64] [Site] Update deps --- ux.symfony.com/composer.json | 26 +-- ux.symfony.com/composer.lock | 171 +++++++++--------- .../Functional/LiveComponentDemosTest.php | 4 +- 3 files changed, 102 insertions(+), 99 deletions(-) diff --git a/ux.symfony.com/composer.json b/ux.symfony.com/composer.json index 31d539062c3..c2c1b47b04d 100644 --- a/ux.symfony.com/composer.json +++ b/ux.symfony.com/composer.json @@ -8,12 +8,12 @@ "ext-ctype": "*", "ext-iconv": "*", "composer/semver": "^3.4", - "doctrine/doctrine-bundle": "^2.10", - "doctrine/doctrine-migrations-bundle": "^3.2.4", - "doctrine/orm": "^2.19.3", + "doctrine/doctrine-bundle": "^2.13", + "doctrine/doctrine-migrations-bundle": "^3.3.1", + "doctrine/orm": "^2.19.7", "intervention/image": "^2.7.2", "kornrunner/blurhash": "^1.2.2", - "league/commonmark": "^2.4", + "league/commonmark": "^2.5", "symfony/asset": "7.1.*", "symfony/asset-mapper": "7.1.*", "symfony/console": "7.1.*", @@ -55,14 +55,14 @@ "symfony/yaml": "7.1.*", "symfonycasts/dynamic-forms": "^0.1.2", "symfonycasts/sass-bundle": "^0.6.0", - "tempest/highlight": "^2.7.0", + "tempest/highlight": "^2.10.3", "twbs/bootstrap": "^5.3", - "twig/extra-bundle": "^3.10", - "twig/html-extra": "^3.10", - "twig/intl-extra": "^3.10", - "twig/markdown-extra": "^3.10", - "twig/string-extra": "^3.10", - "twig/twig": "^3.10" + "twig/extra-bundle": "^3.13", + "twig/html-extra": "^3.13", + "twig/intl-extra": "^3.13", + "twig/markdown-extra": "^3.13", + "twig/string-extra": "^3.13", + "twig/twig": "^3.14" }, "require-dev": { "phpunit/phpunit": "^9.6.9", @@ -73,9 +73,9 @@ "symfony/phpunit-bridge": "7.1.*", "symfony/stopwatch": "7.1.*", "symfony/web-profiler-bundle": "7.1.*", - "vincentlanglet/twig-cs-fixer": "^3.0", + "vincentlanglet/twig-cs-fixer": "3.1.*", "zenstruck/browser": "^1.8", - "zenstruck/foundry": "^1.33" + "zenstruck/foundry": "2.0.*" }, "replace": { "symfony/polyfill-ctype": "*", diff --git a/ux.symfony.com/composer.lock b/ux.symfony.com/composer.lock index 7bde0776f41..db247ca126d 100644 --- a/ux.symfony.com/composer.lock +++ b/ux.symfony.com/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d62f8ee7016044332d5d972f4bd06b5a", + "content-hash": "1c5f7250ac777e4c0fb8aadfb9c4fbc4", "packages": [ { "name": "composer/semver", @@ -2613,16 +2613,16 @@ }, { "name": "psr/log", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "79dff0b268932c640297f5208d6298f71855c03e" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", - "reference": "79dff0b268932c640297f5208d6298f71855c03e", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -2657,9 +2657,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.1" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2024-08-21T13:31:24+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "ralouphie/getallheaders", @@ -7215,12 +7215,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-chartjs.git", - "reference": "a16c8272e8e9d362c0f3b4d70742747e26d66147" + "reference": "3c07fe739f42a9c686fc64c05b494f3af4322b84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-chartjs/zipball/a16c8272e8e9d362c0f3b4d70742747e26d66147", - "reference": "a16c8272e8e9d362c0f3b4d70742747e26d66147", + "url": "https://api.github.com/repos/symfony/ux-chartjs/zipball/3c07fe739f42a9c686fc64c05b494f3af4322b84", + "reference": "3c07fe739f42a9c686fc64c05b494f3af4322b84", "shasum": "" }, "require": { @@ -7272,7 +7272,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-chartjs/tree/v2.19.3" + "source": "https://github.com/symfony/ux-chartjs/tree/2.x" }, "funding": [ { @@ -7288,7 +7288,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/ux-cropperjs", @@ -7462,12 +7462,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-icons.git", - "reference": "2a667537d5b30fdf8989ae4b713055c019565299" + "reference": "69daedf0b4f278a6a7f326fb9aea1ab787ee7be6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-icons/zipball/2a667537d5b30fdf8989ae4b713055c019565299", - "reference": "2a667537d5b30fdf8989ae4b713055c019565299", + "url": "https://api.github.com/repos/symfony/ux-icons/zipball/69daedf0b4f278a6a7f326fb9aea1ab787ee7be6", + "reference": "69daedf0b4f278a6a7f326fb9aea1ab787ee7be6", "shasum": "" }, "require": { @@ -7543,7 +7543,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T07:33:50+00:00" + "time": "2024-09-14T20:31:15+00:00" }, { "name": "symfony/ux-lazy-image", @@ -7631,12 +7631,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-leaflet-map.git", - "reference": "a28fe4315084c7dee8e632eea8866f34b50e62c9" + "reference": "ba957b5e04652177b00284200455610bff4d1b45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/a28fe4315084c7dee8e632eea8866f34b50e62c9", - "reference": "a28fe4315084c7dee8e632eea8866f34b50e62c9", + "url": "https://api.github.com/repos/symfony/ux-leaflet-map/zipball/ba957b5e04652177b00284200455610bff4d1b45", + "reference": "ba957b5e04652177b00284200455610bff4d1b45", "shasum": "" }, "require": { @@ -7692,7 +7692,7 @@ "type": "tidelift" } ], - "time": "2024-08-31T10:10:16+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/ux-live-component", @@ -7700,12 +7700,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-live-component.git", - "reference": "e439f05e1513af9a163c7dad6869fc33117b7394" + "reference": "ac6f0e7b99d3783a71d38d84a885a16a82cb68fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/e439f05e1513af9a163c7dad6869fc33117b7394", - "reference": "e439f05e1513af9a163c7dad6869fc33117b7394", + "url": "https://api.github.com/repos/symfony/ux-live-component/zipball/ac6f0e7b99d3783a71d38d84a885a16a82cb68fe", + "reference": "ac6f0e7b99d3783a71d38d84a885a16a82cb68fe", "shasum": "" }, "require": { @@ -7786,7 +7786,7 @@ "type": "tidelift" } ], - "time": "2024-09-06T08:18:29+00:00" + "time": "2024-09-12T17:42:03+00:00" }, { "name": "symfony/ux-map", @@ -7794,12 +7794,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-map.git", - "reference": "8d0279685f4ebf08cb63e21e0146a8ac7d911e1a" + "reference": "3185ecf75b0b2618b529703f8f5caab070e19ca2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-map/zipball/8d0279685f4ebf08cb63e21e0146a8ac7d911e1a", - "reference": "8d0279685f4ebf08cb63e21e0146a8ac7d911e1a", + "url": "https://api.github.com/repos/symfony/ux-map/zipball/3185ecf75b0b2618b529703f8f5caab070e19ca2", + "reference": "3185ecf75b0b2618b529703f8f5caab070e19ca2", "shasum": "" }, "require": { @@ -7865,7 +7865,7 @@ "type": "tidelift" } ], - "time": "2024-08-31T08:56:27+00:00" + "time": "2024-09-11T06:56:52+00:00" }, { "name": "symfony/ux-notify", @@ -7956,12 +7956,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-react.git", - "reference": "14a35bff619eaff8f25ebeeaa2adad92534d100a" + "reference": "35a3e878e6211169ffb634b788815ecb0c5bccf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-react/zipball/14a35bff619eaff8f25ebeeaa2adad92534d100a", - "reference": "14a35bff619eaff8f25ebeeaa2adad92534d100a", + "url": "https://api.github.com/repos/symfony/ux-react/zipball/35a3e878e6211169ffb634b788815ecb0c5bccf4", + "reference": "35a3e878e6211169ffb634b788815ecb0c5bccf4", "shasum": "" }, "require": { @@ -8025,7 +8025,7 @@ "type": "tidelift" } ], - "time": "2024-08-20T15:47:42+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/ux-svelte", @@ -8033,12 +8033,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-svelte.git", - "reference": "473f01392b10f92f01269e9b4d5a541fe766df59" + "reference": "9893ad99cdb6653832e7478312f5e6e1e719341b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/473f01392b10f92f01269e9b4d5a541fe766df59", - "reference": "473f01392b10f92f01269e9b4d5a541fe766df59", + "url": "https://api.github.com/repos/symfony/ux-svelte/zipball/9893ad99cdb6653832e7478312f5e6e1e719341b", + "reference": "9893ad99cdb6653832e7478312f5e6e1e719341b", "shasum": "" }, "require": { @@ -8106,7 +8106,7 @@ "type": "tidelift" } ], - "time": "2024-08-20T15:47:42+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/ux-swup", @@ -8340,12 +8340,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "53fb47391767ac12b9c7a093a0bcc7ba01fea905" + "reference": "5eaa803dea9f954aa124963f2c872b414d97cc97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/53fb47391767ac12b9c7a093a0bcc7ba01fea905", - "reference": "53fb47391767ac12b9c7a093a0bcc7ba01fea905", + "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/5eaa803dea9f954aa124963f2c872b414d97cc97", + "reference": "5eaa803dea9f954aa124963f2c872b414d97cc97", "shasum": "" }, "require": { @@ -8430,7 +8430,7 @@ "type": "tidelift" } ], - "time": "2024-08-20T19:19:54+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/ux-twig-component", @@ -8438,12 +8438,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "77a68152d083f4c493e05c5503e188c229de8275" + "reference": "456cb00dedf7a4f1bb92a6a9ff7a5efef8a3a332" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/77a68152d083f4c493e05c5503e188c229de8275", - "reference": "77a68152d083f4c493e05c5503e188c229de8275", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/456cb00dedf7a4f1bb92a6a9ff7a5efef8a3a332", + "reference": "456cb00dedf7a4f1bb92a6a9ff7a5efef8a3a332", "shasum": "" }, "require": { @@ -8515,7 +8515,7 @@ "type": "tidelift" } ], - "time": "2024-09-03T20:35:17+00:00" + "time": "2024-09-11T06:56:52+00:00" }, { "name": "symfony/ux-typed", @@ -8591,12 +8591,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-vue.git", - "reference": "48360b79af2c68e6cdecd549eada9e9084bd2353" + "reference": "8c4bcb86fa6a2b9770e9f6c7fabeee647a359b5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-vue/zipball/48360b79af2c68e6cdecd549eada9e9084bd2353", - "reference": "48360b79af2c68e6cdecd549eada9e9084bd2353", + "url": "https://api.github.com/repos/symfony/ux-vue/zipball/8c4bcb86fa6a2b9770e9f6c7fabeee647a359b5f", + "reference": "8c4bcb86fa6a2b9770e9f6c7fabeee647a359b5f", "shasum": "" }, "require": { @@ -8664,7 +8664,7 @@ "type": "tidelift" } ], - "time": "2024-08-20T15:47:42+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/validator", @@ -9187,16 +9187,16 @@ }, { "name": "tempest/highlight", - "version": "2.10.2", + "version": "2.10.3", "source": { "type": "git", "url": "https://github.com/tempestphp/highlight.git", - "reference": "fb3309cb2fb6a2353d58b4da49040ad532c21a76" + "reference": "ba50ebfe88e513b3de4f7d7c02be331d0b9035aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tempestphp/highlight/zipball/fb3309cb2fb6a2353d58b4da49040ad532c21a76", - "reference": "fb3309cb2fb6a2353d58b4da49040ad532c21a76", + "url": "https://api.github.com/repos/tempestphp/highlight/zipball/ba50ebfe88e513b3de4f7d7c02be331d0b9035aa", + "reference": "ba50ebfe88e513b3de4f7d7c02be331d0b9035aa", "shasum": "" }, "require": { @@ -9233,7 +9233,7 @@ "description": "Fast, extensible, server-side code highlighting", "support": { "issues": "https://github.com/tempestphp/highlight/issues", - "source": "https://github.com/tempestphp/highlight/tree/2.10.2" + "source": "https://github.com/tempestphp/highlight/tree/2.10.3" }, "funding": [ { @@ -9241,7 +9241,7 @@ "type": "github" } ], - "time": "2024-08-30T07:52:11+00:00" + "time": "2024-09-12T08:06:29+00:00" }, { "name": "twbs/bootstrap", @@ -12445,46 +12445,45 @@ }, { "name": "zenstruck/foundry", - "version": "v1.38.3", + "version": "v2.0.9", "source": { "type": "git", "url": "https://github.com/zenstruck/foundry.git", - "reference": "112e3a6ce1d75627a3fbfd6cd009055994167edb" + "reference": "b0a5d3d8b43acd4b0f356c6dcfdec6c8ebff1c08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zenstruck/foundry/zipball/112e3a6ce1d75627a3fbfd6cd009055994167edb", - "reference": "112e3a6ce1d75627a3fbfd6cd009055994167edb", + "url": "https://api.github.com/repos/zenstruck/foundry/zipball/b0a5d3d8b43acd4b0f356c6dcfdec6c8ebff1c08", + "reference": "b0a5d3d8b43acd4b0f356c6dcfdec6c8ebff1c08", "shasum": "" }, "require": { - "doctrine/persistence": "^1.3.3|^2.0|^3.0", - "fakerphp/faker": "^1.10", - "php": ">=8.0", + "doctrine/persistence": "^2.0|^3.0", + "fakerphp/faker": "^1.23", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.2|^3.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "zenstruck/assert": "^1.0", - "zenstruck/callback": "^1.1" - }, - "conflict": { - "doctrine/mongodb-odm": "2.5.0" + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/var-exporter": "^6.4.9|~7.0.9|^7.1.2", + "zenstruck/assert": "^1.4" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8", "dama/doctrine-test-bundle": "^7.0|^8.0", - "doctrine/doctrine-bundle": "^2.5", + "doctrine/collections": "^1.7|^2.0", + "doctrine/common": "^3.2", + "doctrine/doctrine-bundle": "^2.10", "doctrine/doctrine-migrations-bundle": "^2.2|^3.0", - "doctrine/mongodb-odm": "^2.4", - "doctrine/mongodb-odm-bundle": "^4.4.0|^5.0", - "doctrine/orm": "^2.11|^3.0", - "matthiasnoback/symfony-dependency-injection-test": "^4.1|^5.0", - "phpunit/phpunit": "^9.5.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/maker-bundle": "^1.49", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0", - "symfony/translation-contracts": "^2.5|^3.0" + "doctrine/mongodb-odm-bundle": "^4.6|^5.0", + "doctrine/orm": "^2.16|^3.0", + "phpunit/phpunit": "^9.5.0 || ^10.0 || ^11.0", + "symfony/console": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/maker-bundle": "^1.55", + "symfony/phpunit-bridge": "^6.4|^7.0", + "symfony/translation-contracts": "^3.4", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "extra": { @@ -12497,11 +12496,11 @@ "autoload": { "files": [ "src/functions.php", - "src/Persistence/functions.php" + "src/Persistence/functions.php", + "src/phpunit_helper.php" ], "psr-4": { - "Zenstruck\\Foundry\\": "src/", - "Zenstruck\\Foundry\\Utils\\Rector\\": "utils/rector/src/" + "Zenstruck\\Foundry\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -12512,6 +12511,10 @@ { "name": "Kevin Bond", "email": "kevinbond@gmail.com" + }, + { + "name": "Nicolas PHILIPPE", + "email": "nikophil@gmail.com" } ], "description": "A model factory library for creating expressive, auto-completable, on-demand dev/test fixtures with Symfony and Doctrine.", @@ -12527,7 +12530,7 @@ ], "support": { "issues": "https://github.com/zenstruck/foundry/issues", - "source": "https://github.com/zenstruck/foundry/tree/v1.38.3" + "source": "https://github.com/zenstruck/foundry/tree/v2.0.9" }, "funding": [ { @@ -12535,7 +12538,7 @@ "type": "github" } ], - "time": "2024-07-04T19:59:49+00:00" + "time": "2024-09-02T18:20:52+00:00" } ], "aliases": [], diff --git a/ux.symfony.com/tests/Functional/LiveComponentDemosTest.php b/ux.symfony.com/tests/Functional/LiveComponentDemosTest.php index b395a07212f..558284e4960 100644 --- a/ux.symfony.com/tests/Functional/LiveComponentDemosTest.php +++ b/ux.symfony.com/tests/Functional/LiveComponentDemosTest.php @@ -19,7 +19,7 @@ use Zenstruck\Foundry\Test\Factories; use Zenstruck\Foundry\Test\ResetDatabase; -use function Zenstruck\Foundry\Persistence\persist_proxy; +use function Zenstruck\Foundry\Persistence\persist; class LiveComponentDemosTest extends KernelTestCase { @@ -32,7 +32,7 @@ class LiveComponentDemosTest extends KernelTestCase */ public function setupEntities(): void { - persist_proxy(Food::class, ['name' => 'Pizza', 'votes' => 10]); + persist(Food::class, ['name' => 'Pizza', 'votes' => 10]); } /** From 675a707ebd690bb30f2bc314232767aab9405494 Mon Sep 17 00:00:00 2001 From: Laurent Marquet <16478286+LaurentMarquet@users.noreply.github.com> Date: Sun, 15 Sep 2024 12:06:54 +0200 Subject: [PATCH 44/64] Update index.rst Just removed a lasting " in code --- src/TwigComponent/doc/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TwigComponent/doc/index.rst b/src/TwigComponent/doc/index.rst index e324db1c00f..cb6e22ad55b 100644 --- a/src/TwigComponent/doc/index.rst +++ b/src/TwigComponent/doc/index.rst @@ -348,7 +348,7 @@ close tag, it's passed to your component template as the block called .. code-block:: html+twig -
    +
    {% block content %}{% endblock %}
    @@ -1771,4 +1771,4 @@ https://symfony.com/doc/current/contributing/code/bc.html .. _`html_cva`: https://twig.symfony.com/doc/3.x/functions/html_cva.html .. _`shadcn/ui`: https://ui.shadcn.com .. _`tales-from-a-dev/twig-tailwind-extra`: https://github.com/tales-from-a-dev/twig-tailwind-extra -.. _`ignore not defined options`: https://symfony.com/doc/current/components/options_resolver.html#ignore-not-defined-options \ No newline at end of file +.. _`ignore not defined options`: https://symfony.com/doc/current/components/options_resolver.html#ignore-not-defined-options From 8510b6536b07f2d0d5ede4ebb38d18a4ab9520c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 15 Sep 2024 06:11:20 +0200 Subject: [PATCH 45/64] [CI] Add tests on PHP8.4 --- .github/workflows/test.yaml | 6 ++++-- .../Fixtures/Serializer/Entity2Normalizer.php | 10 +++++----- .../tests/Fixtures/Serializer/MoneyNormalizer.php | 14 +++++++------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 15f70a23aff..49a8f3aa397 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -81,12 +81,14 @@ jobs: strategy: fail-fast: false matrix: - php-version: ['8.1', '8.3'] + php-version: ['8.1', '8.3', '8.4'] include: - php-version: '8.1' dependency-version: 'lowest' - php-version: '8.3' dependency-version: 'highest' + - php-version: '8.4' + dependency-version: 'highest' component: ${{ fromJson(needs.tests-php-components.outputs.components )}} exclude: - component: Map # does not support PHP 8.1 @@ -141,5 +143,5 @@ jobs: restore-keys: | ${{ runner.os }}-yarn- - run: yarn --immutable - - run: yarn playwright install + - run: yarn playwright install - run: yarn test diff --git a/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php b/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php index b63331a3dce..f7278ed9ed0 100644 --- a/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php +++ b/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php @@ -25,24 +25,24 @@ public function __construct(private ManagerRegistry $doctrine) { } - public function denormalize(mixed $data, string $type, string $format = null, array $context = []): mixed + public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): mixed { - [, $id] = \explode(':', $data); + [, $id] = explode(':', $data); return $this->doctrine->getRepository(Entity2::class)->find($id); } - public function supportsDenormalization(mixed $data, string $type, string $format = null, array $context = []): bool + public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool { return Entity2::class === $type; } - public function normalize(mixed $object, string $format = null, array $context = []): float|array|\ArrayObject|bool|int|string|null + public function normalize(mixed $object, ?string $format = null, array $context = []): float|array|\ArrayObject|bool|int|string|null { return 'entity2:'.$object->id; } - public function supportsNormalization(mixed $data, string $format = null, array $context = []): bool + public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool { return $data instanceof Entity2; } diff --git a/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php b/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php index 90889a47327..ad52f89ea73 100644 --- a/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php +++ b/src/LiveComponent/tests/Fixtures/Serializer/MoneyNormalizer.php @@ -17,27 +17,27 @@ final class MoneyNormalizer implements NormalizerInterface, DenormalizerInterface { - public function denormalize(mixed $data, string $type, string $format = null, array $context = []): Money + public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): Money { - return new Money(...\explode('|', $data)); + return new Money(...explode('|', $data)); } - public function supportsDenormalization(mixed $data, string $type, string $format = null, array $context = []): bool + public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool { return Money::class === $type; } - public function normalize(mixed $object, string $format = null, array $context = []): float|array|\ArrayObject|bool|int|string|null + public function normalize(mixed $object, ?string $format = null, array $context = []): float|array|\ArrayObject|bool|int|string|null { - return \implode('|', [$object->amount, $object->currency]); + return implode('|', [$object->amount, $object->currency]); } - public function supportsNormalization(mixed $data, string $format = null, array $context = []): bool + public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool { return $data instanceof Money; } - public function getSupportedTypes(string $format = null): array + public function getSupportedTypes(?string $format = null): array { return [Money::class => true]; } From 8e99e14731d94a229beb5eb1c547fe4f3fbc2292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 15 Sep 2024 05:22:30 +0200 Subject: [PATCH 46/64] [TwigComponent] Use a RuntimeExtension --- .../TwigComponentExtension.php | 9 ++- .../src/Twig/ComponentExtension.php | 62 +------------------ src/TwigComponent/src/Twig/ComponentNode.php | 44 ++++++------- .../src/Twig/ComponentRuntime.php | 59 ++++++++++++++++++ .../src/Twig/PropsTokenParser.php | 2 +- .../src/Twig/TwigEnvironmentConfigurator.php | 1 + 6 files changed, 91 insertions(+), 86 deletions(-) create mode 100644 src/TwigComponent/src/Twig/ComponentRuntime.php diff --git a/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php b/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php index e69bfb62ce7..c0c18b0ec66 100644 --- a/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php +++ b/src/TwigComponent/src/DependencyInjection/TwigComponentExtension.php @@ -34,6 +34,7 @@ use Symfony\UX\TwigComponent\DependencyInjection\Compiler\TwigComponentPass; use Symfony\UX\TwigComponent\Twig\ComponentExtension; use Symfony\UX\TwigComponent\Twig\ComponentLexer; +use Symfony\UX\TwigComponent\Twig\ComponentRuntime; use Symfony\UX\TwigComponent\Twig\TwigEnvironmentConfigurator; /** @@ -102,7 +103,13 @@ class_exists(AbstractArgument::class) ? new AbstractArgument(\sprintf('Added in $container->register('ux.twig_component.twig.component_extension', ComponentExtension::class) ->addTag('twig.extension') - ->addTag('container.service_subscriber', ['key' => ComponentRenderer::class, 'id' => 'ux.twig_component.component_renderer']) + ; + + $container->register('.ux.twig_component.twig.component_runtime', ComponentRuntime::class) + ->setArguments([ + new Reference('ux.twig_component.component_renderer'), + ]) + ->addTag('twig.runtime') ; $container->register('ux.twig_component.twig.lexer', ComponentLexer::class); diff --git a/src/TwigComponent/src/Twig/ComponentExtension.php b/src/TwigComponent/src/Twig/ComponentExtension.php index eaa737b68cb..f577ae08dcc 100644 --- a/src/TwigComponent/src/Twig/ComponentExtension.php +++ b/src/TwigComponent/src/Twig/ComponentExtension.php @@ -11,13 +11,8 @@ namespace Symfony\UX\TwigComponent\Twig; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceSubscriberInterface; -use Symfony\UX\TwigComponent\ComponentRenderer; use Symfony\UX\TwigComponent\CVA; -use Symfony\UX\TwigComponent\Event\PreRenderEvent; use Twig\DeprecatedCallableInfo; -use Twig\Error\RuntimeError; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -26,23 +21,12 @@ * * @internal */ -final class ComponentExtension extends AbstractExtension implements ServiceSubscriberInterface +final class ComponentExtension extends AbstractExtension { - public function __construct(private ContainerInterface $container) - { - } - - public static function getSubscribedServices(): array - { - return [ - ComponentRenderer::class, - ]; - } - public function getFunctions(): array { return [ - new TwigFunction('component', [$this, 'render'], ['is_safe' => ['all']]), + new TwigFunction('component', [ComponentRuntime::class, 'render'], ['is_safe' => ['all']]), new TwigFunction('cva', [$this, 'cva'], [ ...(class_exists(DeprecatedCallableInfo::class) ? ['deprecation_info' => new DeprecatedCallableInfo('symfony/ux-twig-component', '2.20', 'html_cva', 'twig/html-extra')] @@ -59,38 +43,6 @@ public function getTokenParsers(): array ]; } - public function render(string $name, array $props = []): string - { - try { - return $this->container->get(ComponentRenderer::class)->createAndRender($name, $props); - } catch (\Throwable $e) { - $this->throwRuntimeError($name, $e); - } - } - - public function extensionPreCreateForRender(string $name, array $props): ?string - { - try { - return $this->container->get(ComponentRenderer::class)->preCreateForRender($name, $props); - } catch (\Throwable $e) { - $this->throwRuntimeError($name, $e); - } - } - - public function startEmbeddedComponentRender(string $name, array $props, array $context, string $hostTemplateName, int $index): PreRenderEvent - { - try { - return $this->container->get(ComponentRenderer::class)->startEmbeddedComponentRender($name, $props, $context, $hostTemplateName, $index); - } catch (\Throwable $e) { - $this->throwRuntimeError($name, $e); - } - } - - public function finishEmbeddedComponentRender(): void - { - $this->container->get(ComponentRenderer::class)->finishEmbeddedComponentRender(); - } - /** * Create a CVA instance. * @@ -119,14 +71,4 @@ public function cva(array $cva): CVA $cva['defaultVariants'] ?? [], ); } - - private function throwRuntimeError(string $name, \Throwable $e): void - { - // if it's already a Twig RuntimeError, just rethrow it - if ($e instanceof RuntimeError) { - throw $e; - } - - throw new RuntimeError(\sprintf('Error rendering "%s" component: "%s"', $name, $e->getMessage()), previous: $e); - } } diff --git a/src/TwigComponent/src/Twig/ComponentNode.php b/src/TwigComponent/src/Twig/ComponentNode.php index 2c0561c64a6..439175c5bfa 100644 --- a/src/TwigComponent/src/Twig/ComponentNode.php +++ b/src/TwigComponent/src/Twig/ComponentNode.php @@ -48,6 +48,8 @@ public function compile(Compiler $compiler): void { $compiler->addDebugInfo($this); + $useYield = method_exists(Environment::class, 'useYield') && $compiler->getEnvironment()->useYield(); + // since twig/twig 3.9.0: Using the internal "twig_to_array" function is deprecated. if (method_exists(CoreExtension::class, 'toArray')) { $twig_to_array = 'Twig\Extension\CoreExtension::toArray'; @@ -55,6 +57,13 @@ public function compile(Compiler $compiler): void $twig_to_array = 'twig_to_array'; } + $componentRuntime = $compiler->getVarName(); + + $compiler + ->write(\sprintf('$%s = $this->env->getRuntime(', $componentRuntime)) + ->string(ComponentRuntime::class) + ->raw(");\n"); + /* * Block 1) PreCreateForRender handling * @@ -62,9 +71,7 @@ public function compile(Compiler $compiler): void * a string, we return that string and skip the rest of the rendering process. */ $compiler - ->write('$preRendered = $this->extensions[') - ->string(ComponentExtension::class) - ->raw(']->extensionPreCreateForRender(') + ->write(\sprintf('$preRendered = $%s->preRender(', $componentRuntime)) ->string($this->getAttribute('component')) ->raw(', ') ->raw($twig_to_array) @@ -96,9 +103,7 @@ public function compile(Compiler $compiler): void * the final template, template index & variables. */ $compiler - ->write('$preRenderEvent = $this->extensions[') - ->string(ComponentExtension::class) - ->raw(']->startEmbeddedComponentRender(') + ->write(\sprintf('$preRenderEvent = $%s->startEmbedComponent(', $componentRuntime)) ->string($this->getAttribute('component')) ->raw(', ') ->raw($twig_to_array) @@ -111,6 +116,7 @@ public function compile(Compiler $compiler): void ->raw(', ') ->raw($this->getAttribute('embedded_index')) ->raw(");\n"); + $compiler ->write('$embeddedContext = $preRenderEvent->getVariables();') ->raw("\n") @@ -132,18 +138,11 @@ public function compile(Compiler $compiler): void * We add the outerBlock to the context if it doesn't exist yet. * Then add them to the block stack and get the converted embedded blocks. */ - $compiler->write('if (!isset($embeddedContext["outerBlocks"])) {') - ->raw("\n") - ->indent() - ->write(\sprintf('$embeddedContext["outerBlocks"] = new \%s();', BlockStack::class)) - ->raw("\n") - ->outdent() - ->write('}') + $compiler + ->write(\sprintf('$embeddedContext["outerBlocks"] ??= new \%s();', BlockStack::class)) ->raw("\n"); - $compiler->write('$embeddedBlocks = $embeddedContext[') - ->string('outerBlocks') - ->raw(']->convert($blocks, ') + $compiler->write('$embeddedBlocks = $embeddedContext["outerBlocks"]->convert($blocks, ') ->raw($this->getAttribute('embedded_index')) ->raw(");\n"); @@ -152,9 +151,8 @@ public function compile(Compiler $compiler): void * * This will actually render the child component template. */ - if (method_exists(Environment::class, 'useYield') && $compiler->getEnvironment()->useYield()) { - $compiler - ->write('yield from '); + if ($useYield) { + $compiler->write('yield from '); } $compiler ->write('$this->loadTemplate(') @@ -167,7 +165,7 @@ public function compile(Compiler $compiler): void ->string($this->getAttribute('embedded_index')) ->raw(')'); - if (method_exists(Environment::class, 'useYield') && $compiler->getEnvironment()->useYield()) { + if ($useYield) { $compiler->raw('->unwrap()->yield('); } else { $compiler->raw('->display('); @@ -176,10 +174,8 @@ public function compile(Compiler $compiler): void ->raw('$embeddedContext, $embeddedBlocks') ->raw(");\n"); - $compiler->write('$this->extensions[') - ->string(ComponentExtension::class) - ->raw(']->finishEmbeddedComponentRender()') - ->raw(";\n") + $compiler->write(\sprintf('$%s->finishEmbedComponent();', $componentRuntime)) + ->raw("\n") ; $compiler diff --git a/src/TwigComponent/src/Twig/ComponentRuntime.php b/src/TwigComponent/src/Twig/ComponentRuntime.php new file mode 100644 index 00000000000..b6157599781 --- /dev/null +++ b/src/TwigComponent/src/Twig/ComponentRuntime.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\TwigComponent\Twig; + +use Symfony\UX\TwigComponent\ComponentRenderer; +use Symfony\UX\TwigComponent\Event\PreRenderEvent; + +/** + * @author Kevin Bond + * @author Simon André + * + * @internal + */ +final class ComponentRuntime +{ + public function __construct( + private readonly ComponentRenderer $renderer, + ) { + } + + /** + * @param array $props + */ + public function render(string $name, array $props = []): string + { + return $this->renderer->createAndRender($name, $props); + } + + /** + * @param array $props + */ + public function preRender(string $name, array $props): ?string + { + return $this->renderer->preCreateForRender($name, $props); + } + + /** + * @param array $props + * @param array $context + */ + public function startEmbedComponent(string $name, array $props, array $context, string $hostTemplateName, int $index): PreRenderEvent + { + return $this->renderer->startEmbeddedComponentRender($name, $props, $context, $hostTemplateName, $index); + } + + public function finishEmbedComponent(): void + { + $this->renderer->finishEmbeddedComponentRender(); + } +} diff --git a/src/TwigComponent/src/Twig/PropsTokenParser.php b/src/TwigComponent/src/Twig/PropsTokenParser.php index 9cc94e07d6e..fc3b66405c3 100644 --- a/src/TwigComponent/src/Twig/PropsTokenParser.php +++ b/src/TwigComponent/src/Twig/PropsTokenParser.php @@ -44,7 +44,7 @@ public function parse(Token $token): Node } } - return new PropsNode($names, $values, $token->getLine(), $token->getValue()); + return new PropsNode($names, $values, $token->getLine()); } public function getTag(): string diff --git a/src/TwigComponent/src/Twig/TwigEnvironmentConfigurator.php b/src/TwigComponent/src/Twig/TwigEnvironmentConfigurator.php index 3fe38967997..4b952a10047 100644 --- a/src/TwigComponent/src/Twig/TwigEnvironmentConfigurator.php +++ b/src/TwigComponent/src/Twig/TwigEnvironmentConfigurator.php @@ -30,6 +30,7 @@ public function __construct( public function configure(Environment $environment): void { $this->decorated->configure($environment); + $environment->setLexer(new ComponentLexer($environment)); if (class_exists(EscaperRuntime::class)) { From 19ff0718ec9af2f81966ad4ed82afdc2bb678858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 15 Sep 2024 03:06:24 +0200 Subject: [PATCH 47/64] [TwigComponent] Simplify the ComponentLoggerListener * Clean unused code * Reduce memory usage * Optimize class/templates lookup --- src/TwigComponent/composer.json | 1 - src/TwigComponent/config/debug.php | 3 - .../TwigComponentDataCollector.php | 13 ++-- .../TwigComponentLoggerListener.php | 63 +++++-------------- .../TwigComponentLoggerListenerTest.php | 26 ++------ 5 files changed, 29 insertions(+), 77 deletions(-) diff --git a/src/TwigComponent/composer.json b/src/TwigComponent/composer.json index 77f5a324ea8..1e0ca5d3bc1 100644 --- a/src/TwigComponent/composer.json +++ b/src/TwigComponent/composer.json @@ -40,7 +40,6 @@ "symfony/framework-bundle": "^5.4|^6.0|^7.0", "symfony/phpunit-bridge": "^6.0|^7.0", "symfony/stimulus-bundle": "^2.9.1", - "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/twig-bundle": "^5.4|^6.0|^7.0", "symfony/webpack-encore-bundle": "^1.15" }, diff --git a/src/TwigComponent/config/debug.php b/src/TwigComponent/config/debug.php index 6fb748d98ef..6afabb82245 100644 --- a/src/TwigComponent/config/debug.php +++ b/src/TwigComponent/config/debug.php @@ -21,9 +21,6 @@ $container->services() ->set('ux.twig_component.component_logger_listener', TwigComponentLoggerListener::class) - ->args([ - service('debug.stopwatch')->ignoreOnInvalid(), - ]) ->tag('kernel.event_subscriber') ->set('ux.twig_component.data_collector', TwigComponentDataCollector::class) diff --git a/src/TwigComponent/src/DataCollector/TwigComponentDataCollector.php b/src/TwigComponent/src/DataCollector/TwigComponentDataCollector.php index f0c1e05f2db..1ee94c71bdb 100644 --- a/src/TwigComponent/src/DataCollector/TwigComponentDataCollector.php +++ b/src/TwigComponent/src/DataCollector/TwigComponentDataCollector.php @@ -25,8 +25,10 @@ /** * @author Simon André + * + * @internal */ -class TwigComponentDataCollector extends AbstractDataCollector implements LateDataCollectorInterface +final class TwigComponentDataCollector extends AbstractDataCollector implements LateDataCollectorInterface { private bool $hasStub; @@ -99,6 +101,9 @@ private function collectDataFromLogger(): void $renders = []; $ongoingRenders = []; + $classStubs = []; + $templatePaths = []; + foreach ($this->logger->getEvents() as [$event, $profile]) { if ($event instanceof PreRenderEvent) { $mountedComponent = $event->getMountedComponent(); @@ -110,9 +115,9 @@ private function collectDataFromLogger(): void $components[$componentName] ??= [ 'name' => $componentName, 'class' => $componentClass, - 'class_stub' => $this->hasStub ? new ClassStub($componentClass) : $componentClass, - 'template' => $metadata->getTemplate(), - 'template_path' => $this->resolveTemplatePath($metadata->getTemplate()), // defer ? lazy ? + 'class_stub' => $classStubs[$componentClass] ??= ($this->hasStub ? new ClassStub($componentClass) : $componentClass), + 'template' => $template = $metadata->getTemplate(), + 'template_path' => $templatePaths[$template] ??= $this->resolveTemplatePath($template), 'render_count' => 0, 'render_time' => 0, ]; diff --git a/src/TwigComponent/src/EventListener/TwigComponentLoggerListener.php b/src/TwigComponent/src/EventListener/TwigComponentLoggerListener.php index acabac5c522..62af18d370f 100644 --- a/src/TwigComponent/src/EventListener/TwigComponentLoggerListener.php +++ b/src/TwigComponent/src/EventListener/TwigComponentLoggerListener.php @@ -12,75 +12,38 @@ namespace Symfony\UX\TwigComponent\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\Stopwatch\Stopwatch; use Symfony\Contracts\Service\ResetInterface; -use Symfony\UX\TwigComponent\Event\PostMountEvent; use Symfony\UX\TwigComponent\Event\PostRenderEvent; -use Symfony\UX\TwigComponent\Event\PreCreateForRenderEvent; -use Symfony\UX\TwigComponent\Event\PreMountEvent; use Symfony\UX\TwigComponent\Event\PreRenderEvent; /** * @author Simon André + * + * @internal */ -class TwigComponentLoggerListener implements EventSubscriberInterface, ResetInterface +final class TwigComponentLoggerListener implements EventSubscriberInterface, ResetInterface { private array $events = []; - public function __construct(private ?Stopwatch $stopwatch = null) - { - } - public static function getSubscribedEvents(): array { return [ - PreCreateForRenderEvent::class => [ - // High priority: start the stopwatch as soon as possible - ['onPreCreateForRender', 255], - // Low priority: check `event::getRenderedString()` as late as possible - ['onPostCreateForRender', -255], - ], - PreMountEvent::class => ['onPreMount', 255], - PostMountEvent::class => ['onPostMount', -255], PreRenderEvent::class => ['onPreRender', 255], PostRenderEvent::class => ['onPostRender', -255], ]; } + /** + * @return list + */ public function getEvents(): array { return $this->events; } - public function onPreCreateForRender(PreCreateForRenderEvent $event): void - { - $this->stopwatch?->start($event->getName(), 'twig_component'); - $this->logEvent($event); - } - - private function logEvent(object $event): void - { - $this->events[] = [$event, [microtime(true), memory_get_usage(true)]]; - } - - public function onPostCreateForRender(PreCreateForRenderEvent $event): void - { - if (\is_string($event->getRenderedString())) { - $this->stopwatch?->stop($event->getName()); - $this->logEvent($event); - } - } - - public function onPreMount(PreMountEvent $event): void - { - $this->logEvent($event); - } - - public function onPostMount(PostMountEvent $event): void - { - $this->logEvent($event); - } - public function onPreRender(PreRenderEvent $event): void { $this->logEvent($event); @@ -88,9 +51,6 @@ public function onPreRender(PreRenderEvent $event): void public function onPostRender(PostRenderEvent $event): void { - if ($this->stopwatch?->isStarted($name = $event->getMountedComponent()->getName())) { - $this->stopwatch->stop($name); - } $this->logEvent($event); } @@ -98,4 +58,9 @@ public function reset(): void { $this->events = []; } + + private function logEvent(object $event): void + { + $this->events[] = [$event, [microtime(true), memory_get_usage(true)]]; + } } diff --git a/src/TwigComponent/tests/Unit/EventListener/TwigComponentLoggerListenerTest.php b/src/TwigComponent/tests/Unit/EventListener/TwigComponentLoggerListenerTest.php index df6b81c7a9f..cd5ab7a9579 100644 --- a/src/TwigComponent/tests/Unit/EventListener/TwigComponentLoggerListenerTest.php +++ b/src/TwigComponent/tests/Unit/EventListener/TwigComponentLoggerListenerTest.php @@ -14,10 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\UX\TwigComponent\ComponentAttributes; use Symfony\UX\TwigComponent\ComponentMetadata; -use Symfony\UX\TwigComponent\Event\PostMountEvent; use Symfony\UX\TwigComponent\Event\PostRenderEvent; -use Symfony\UX\TwigComponent\Event\PreCreateForRenderEvent; -use Symfony\UX\TwigComponent\Event\PreMountEvent; use Symfony\UX\TwigComponent\Event\PreRenderEvent; use Symfony\UX\TwigComponent\EventListener\TwigComponentLoggerListener; use Symfony\UX\TwigComponent\MountedComponent; @@ -32,31 +29,20 @@ public function testLoggerStoreEvents(): void $logger = new TwigComponentLoggerListener(); $this->assertSame([], $logger->getEvents()); - $eventA = new PreCreateForRenderEvent('a'); - $logger->onPreCreateForRender($eventA); - - $eventB = new PreCreateForRenderEvent('b'); - $logger->onPreCreateForRender($eventB); - - $eventC = new PreMountEvent(new \stdClass(), [], new ComponentMetadata([])); - $logger->onPreMount($eventC); - $eventD = new PostMountEvent(new \stdClass(), [], new ComponentMetadata([])); - $logger->onPostMount($eventD); - $mounted = new MountedComponent('foo', new \stdClass(), new ComponentAttributes([])); - $eventE = new PreRenderEvent($mounted, new ComponentMetadata(['template' => 'bar']), []); - $logger->onPreRender($eventE); - $eventF = new PostRenderEvent($mounted); - $logger->onPostRender($eventF); + $eventA = new PreRenderEvent($mounted, new ComponentMetadata(['template' => 'bar']), []); + $logger->onPreRender($eventA); + $eventB = new PostRenderEvent($mounted); + $logger->onPostRender($eventB); - $this->assertSame([$eventA, $eventB, $eventC, $eventD, $eventE, $eventF], array_column($logger->getEvents(), 0)); + $this->assertSame([$eventA, $eventB], array_column($logger->getEvents(), 0)); } public function testLoggerReset(): void { $logger = new TwigComponentLoggerListener(); - $logger->onPreCreateForRender(new PreCreateForRenderEvent('foo')); + $logger->onPreRender(new PreRenderEvent(new MountedComponent('foo', new \stdClass(), new ComponentAttributes([])), new ComponentMetadata(['template' => 'bar']), [])); $this->assertNotSame([], $logger->getEvents()); $logger->reset(); From 6babdc9d2308229e87331d4b46d524876ff024f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 15 Sep 2024 01:49:47 +0200 Subject: [PATCH 48/64] [Site] Clean templates & css --- ux.symfony.com/assets/styles/app.scss | 59 ++++++++++++++++++- .../demos/live_component/invoice.html.twig | 21 +++++-- .../live_component/product_form.html.twig | 14 ++++- 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/ux.symfony.com/assets/styles/app.scss b/ux.symfony.com/assets/styles/app.scss index f96eca519b7..81a8c3d23a9 100644 --- a/ux.symfony.com/assets/styles/app.scss +++ b/ux.symfony.com/assets/styles/app.scss @@ -11,12 +11,54 @@ @import "../../vendor/twbs/bootstrap/scss/variables"; @import "../../vendor/twbs/bootstrap/scss/variables-dark"; +// Remove Bootstrap variables/overrides +$theme-colors: map-remove($theme-colors, "info", "light"); + // Boostrap remainder of required parts @import "../../vendor/twbs/bootstrap/scss/maps"; @import "../../vendor/twbs/bootstrap/scss/mixins"; @import "../../vendor/twbs/bootstrap/scss/utilities"; @import "../../vendor/twbs/bootstrap/scss/root"; +// Remove multiple utilities with a comma-separated list +// Margin +$utilities: map-remove( + $utilities, + // Background + "bg-opacity", + "subtle-background-color", + + // Negative margin + "negative-margin", + "negative-margin-x", + "negative-margin-y", + "negative-margin-top", + "negative-margin-end", + "negative-margin-bottom", + "negative-margin-start", + // Link + "link-opacity", + "link-offset", + "link-underline", + "link-underline-opacity", + // Border + "border", + "border-top", + "border-end", + "border-bottom", + "border-start", + "border-color", + "subtle-border-color", + "border-width", + "border-opacity", + // Position + "top", + "bottom", + "start", + "end", + "translate-middle", +); + // Layout & components @import "../../vendor/twbs/bootstrap/scss/reboot"; @import "../../vendor/twbs/bootstrap/scss/type"; @@ -48,8 +90,23 @@ // @import "../../vendor/twbs/bootstrap/scss/spinners"; // @import "../../vendor/twbs/bootstrap/scss/offcanvas"; // @import "../../vendor/twbs/bootstrap/scss/placeholders"; + // Helpers -@import "../../vendor/twbs/bootstrap/scss/helpers"; +@import "../../vendor/twbs/bootstrap/scss/helpers/clearfix"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/color-bg"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/colored-links"; +@import "../../vendor/twbs/bootstrap/scss/helpers/focus-ring"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/icon-link"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/ratio"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/position"; +@import "../../vendor/twbs/bootstrap/scss/helpers/stacks"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/visually-hidden"; +@import "../../vendor/twbs/bootstrap/scss/helpers/stretched-link"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/text-truncation"; +//@import "../../vendor/twbs/bootstrap/scss/helpers/vr"; + + + // Utilities @import "../../vendor/twbs/bootstrap/scss/utilities/api"; diff --git a/ux.symfony.com/templates/demos/live_component/invoice.html.twig b/ux.symfony.com/templates/demos/live_component/invoice.html.twig index f6238d4ebeb..b4c54257771 100644 --- a/ux.symfony.com/templates/demos/live_component/invoice.html.twig +++ b/ux.symfony.com/templates/demos/live_component/invoice.html.twig @@ -1,7 +1,9 @@ {% extends 'demos/live_demo.html.twig' %} {% block code_block_full %} - + +## Main Component + This main component keeps track of the `Invoice` (which may be new) and a list of the "invoice items" - stored on a `LiveProp` called `$lineItems`. @@ -16,7 +18,9 @@ This triggers the `removeLineItem()` method on this component, which removes the line item from the `$lineItems` array. - + +## Main Template + The template is fairly simple: rendering form fields with `data-model` to bind to writable `LiveProp`'s along with their validation errors. @@ -26,7 +30,9 @@ data: `productId`, `quantity`, and `isEditing`. It also passes a `key`, which is needed so LiveComponents can track which row is which. - + +## Child Component + The child component for each "line item". This handles validating, saving, and changing the "edit" state of the line item. @@ -41,7 +47,14 @@ by emitting events - e.g. `line_item:save`. > "edit" mode. - + +## Item template + Nothing too fancy here: some `data-model` elements and `data-action="live#action"` buttons. diff --git a/ux.symfony.com/templates/demos/live_component/product_form.html.twig b/ux.symfony.com/templates/demos/live_component/product_form.html.twig index f93bf52c820..bb2a7adad32 100644 --- a/ux.symfony.com/templates/demos/live_component/product_form.html.twig +++ b/ux.symfony.com/templates/demos/live_component/product_form.html.twig @@ -5,7 +5,9 @@ {% endblock %} {% block code_block_full %} - + +## New Product Form + Live component with a form, `ValidatableComponentTrait` and a `saveProduct()` LiveAction for instant validation & an AJAX submit. @@ -19,14 +21,20 @@ Then, thanks to the `Category` type-hint + Symfony's standard Symfony uses that id to query for the `Category` object. - + +## New Product Template + Near the bottom, this renders the `BootstrapModal` component with another component - `NewCategoryForm` - inside of it. Opening the modal is done entirely with normal Bootstrap logic: an `a` tag with `data-bs-toggle="modal"` and `data-bs-target="#new-category-modal"`. - + +## New Category Form + This component opens up in the modal! It has a `#[LiveAction]` that saves the new `Category` to the database and then does two important things: From 7eb48fb3bf9574a93a04cd39d496db3d1cf353e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Tue, 17 Sep 2024 01:10:49 +0200 Subject: [PATCH 49/64] [Site] Fix deprecations and remove debug block --- ux.symfony.com/config/packages/doctrine.yaml | 2 +- ux.symfony.com/config/packages/zenstruck_foundry.yaml | 3 +-- ux.symfony.com/templates/main/homepage.html.twig | 4 ---- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/ux.symfony.com/config/packages/doctrine.yaml b/ux.symfony.com/config/packages/doctrine.yaml index 75ec9e8410a..718692d7860 100644 --- a/ux.symfony.com/config/packages/doctrine.yaml +++ b/ux.symfony.com/config/packages/doctrine.yaml @@ -23,7 +23,7 @@ doctrine: prefix: 'App\Entity' alias: App controller_resolver: - auto_mapping: true + auto_mapping: false when@test: doctrine: diff --git a/ux.symfony.com/config/packages/zenstruck_foundry.yaml b/ux.symfony.com/config/packages/zenstruck_foundry.yaml index 0657d2c3c93..504f7e0b04c 100644 --- a/ux.symfony.com/config/packages/zenstruck_foundry.yaml +++ b/ux.symfony.com/config/packages/zenstruck_foundry.yaml @@ -1,7 +1,6 @@ when@dev: &dev # See full configuration: https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#full-default-bundle-configuration zenstruck_foundry: - # Whether to auto-refresh proxies by default (https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#auto-refresh) - auto_refresh_proxies: true + global_state: [] when@test: *dev diff --git a/ux.symfony.com/templates/main/homepage.html.twig b/ux.symfony.com/templates/main/homepage.html.twig index 1993b3f5eed..2de3ad10d95 100644 --- a/ux.symfony.com/templates/main/homepage.html.twig +++ b/ux.symfony.com/templates/main/homepage.html.twig @@ -24,10 +24,6 @@
    - {% block foo %} - {{ importmap() }} - {% endblock %} -

    Install it

    From 92f89d3a5a4007ed160f1d08a623b98174cf2a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sun, 1 Sep 2024 09:27:48 +0200 Subject: [PATCH 50/64] [Map] Render map from Twig with `ux_map()` and `` --- src/Map/CHANGELOG.md | 7 +- src/Map/composer.json | 3 +- src/Map/config/services.php | 8 +- src/Map/config/twig_component.php | 32 ++++++ src/Map/src/InfoWindow.php | 34 +++++- src/Map/src/Map.php | 32 ++++++ src/Map/src/Marker.php | 37 +++++- src/Map/src/Point.php | 12 ++ src/Map/src/Twig/MapExtension.php | 5 +- src/Map/src/Twig/MapRuntime.php | 64 +++++++++++ src/Map/src/Twig/UXMapComponent.php | 32 ++++++ src/Map/src/Twig/UXMapComponentListener.php | 42 +++++++ src/Map/src/UXMapBundle.php | 5 + src/Map/tests/Kernel/TwigComponentKernel.php | 63 +++++++++++ src/Map/tests/MapFactoryTest.php | 102 +++++++++++++++++ src/Map/tests/Twig/MapComponentTest.php | 50 ++++++++ src/Map/tests/Twig/MapExtensionTest.php | 113 +++++++++++++++++++ 17 files changed, 632 insertions(+), 9 deletions(-) create mode 100644 src/Map/config/twig_component.php create mode 100644 src/Map/src/Twig/MapRuntime.php create mode 100644 src/Map/src/Twig/UXMapComponent.php create mode 100644 src/Map/src/Twig/UXMapComponentListener.php create mode 100644 src/Map/tests/Kernel/TwigComponentKernel.php create mode 100644 src/Map/tests/MapFactoryTest.php create mode 100644 src/Map/tests/Twig/MapComponentTest.php create mode 100644 src/Map/tests/Twig/MapExtensionTest.php diff --git a/src/Map/CHANGELOG.md b/src/Map/CHANGELOG.md index 33431733d59..d4894408a83 100644 --- a/src/Map/CHANGELOG.md +++ b/src/Map/CHANGELOG.md @@ -2,8 +2,11 @@ ## 2.20 -- Rename `render_map` Twig function `ux_map` -- Deprecate `render_map` Twig function +- Deprecate `render_map` Twig function (will be removed in 2.21). Use + `ux_map` or the `` Twig component instead. +- Add `ux_map` Twig function (replaces `render_map` with a more flexible + interface) +- Add `` Twig component ## 2.19 diff --git a/src/Map/composer.json b/src/Map/composer.json index 73d39303f74..a24b4fd3ca9 100644 --- a/src/Map/composer.json +++ b/src/Map/composer.json @@ -39,7 +39,8 @@ "symfony/asset-mapper": "^6.4|^7.0", "symfony/framework-bundle": "^6.4|^7.0", "symfony/phpunit-bridge": "^6.4|^7.0", - "symfony/twig-bundle": "^6.4|^7.0" + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/ux-twig-component": "^2.18" }, "extra": { "thanks": { diff --git a/src/Map/config/services.php b/src/Map/config/services.php index 7dada5ec563..c94a9043cd9 100644 --- a/src/Map/config/services.php +++ b/src/Map/config/services.php @@ -15,6 +15,7 @@ use Symfony\UX\Map\Renderer\Renderer; use Symfony\UX\Map\Renderer\Renderers; use Symfony\UX\Map\Twig\MapExtension; +use Symfony\UX\Map\Twig\MapRuntime; /* * @author Hugo Alliaume @@ -26,7 +27,6 @@ ->args([ abstract_arg('renderers configuration'), ]) - ->tag('twig.runtime') ->set('ux_map.renderer_factory.abstract', AbstractRendererFactory::class) ->abstract() @@ -41,5 +41,11 @@ ->set('ux_map.twig_extension', MapExtension::class) ->tag('twig.extension') + + ->set('ux_map.twig_runtime', MapRuntime::class) + ->args([ + service('ux_map.renderers'), + ]) + ->tag('twig.runtime') ; }; diff --git a/src/Map/config/twig_component.php b/src/Map/config/twig_component.php new file mode 100644 index 00000000000..f09999e9b5c --- /dev/null +++ b/src/Map/config/twig_component.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Loader\Configurator; + +use Symfony\UX\Map\Twig\UXMapComponent; +use Symfony\UX\Map\Twig\UXMapComponentListener; +use Symfony\UX\TwigComponent\Event\PreCreateForRenderEvent; + +return static function (ContainerConfigurator $container): void { + $container->services() + ->set('.ux_map.twig_component_listener', UXMapComponentListener::class) + ->args([ + service('ux_map.twig_runtime'), + ]) + ->tag('kernel.event_listener', [ + 'event' => PreCreateForRenderEvent::class, + 'method' => 'onPreCreateForRender', + ]) + + ->set('.ux_map.twig_component.map', UXMapComponent::class) + ->tag('twig.component', ['key' => 'UX:Map']) + ; +}; diff --git a/src/Map/src/InfoWindow.php b/src/Map/src/InfoWindow.php index 4897b3c9cd2..f98fbb6995e 100644 --- a/src/Map/src/InfoWindow.php +++ b/src/Map/src/InfoWindow.php @@ -19,7 +19,8 @@ final readonly class InfoWindow { /** - * @param array $extra Extra data, can be used by the developer to store additional information and use them later JavaScript side + * @param array $extra Extra data, can be used by the developer to store additional information and + * use them later JavaScript side */ public function __construct( private ?string $headerContent = null, @@ -31,6 +32,16 @@ public function __construct( ) { } + /** + * @return array{ + * headerContent: string|null, + * content: string|null, + * position: array{lat: float, lng: float}|null, + * opened: bool, + * autoClose: bool, + * extra: object, + * } + */ public function toArray(): array { return [ @@ -42,4 +53,25 @@ public function toArray(): array 'extra' => (object) $this->extra, ]; } + + /** + * @param array{ + * headerContent: string|null, + * content: string|null, + * position: array{lat: float, lng: float}|null, + * opened: bool, + * autoClose: bool, + * extra: object, + * } $data + * + * @internal + */ + public static function fromArray(array $data): self + { + if (isset($data['position'])) { + $data['position'] = Point::fromArray($data['position']); + } + + return new self(...$data); + } } diff --git a/src/Map/src/Map.php b/src/Map/src/Map.php index 834e0d3d299..d8fdf005e56 100644 --- a/src/Map/src/Map.php +++ b/src/Map/src/Map.php @@ -103,4 +103,36 @@ public function toArray(): array 'markers' => array_map(static fn (Marker $marker) => $marker->toArray(), $this->markers), ]; } + + /** + * @param array{ + * center?: array{lat: float, lng: float}, + * zoom?: float, + * markers?: list, + * fitBoundsToMarkers?: bool, + * options?: object, + * } $map + * + * @internal + */ + public static function fromArray(array $map): self + { + $map['fitBoundsToMarkers'] = true; + + if (isset($map['center'])) { + $map['center'] = Point::fromArray($map['center']); + } + + if (isset($map['zoom']) || isset($map['center'])) { + $map['fitBoundsToMarkers'] = false; + } + + $map['markers'] ??= []; + if (!\is_array($map['markers'])) { + throw new InvalidArgumentException('The "markers" parameter must be an array.'); + } + $map['markers'] = array_map(Marker::fromArray(...), $map['markers']); + + return new self(...$map); + } } diff --git a/src/Map/src/Marker.php b/src/Map/src/Marker.php index 5c822698b74..ac0dc0e0af6 100644 --- a/src/Map/src/Marker.php +++ b/src/Map/src/Marker.php @@ -11,6 +11,8 @@ namespace Symfony\UX\Map; +use Symfony\UX\Map\Exception\InvalidArgumentException; + /** * Represents a marker on a map. * @@ -19,7 +21,8 @@ final readonly class Marker { /** - * @param array $extra Extra data, can be used by the developer to store additional information and use them later JavaScript side + * @param array $extra Extra data, can be used by the developer to store additional information and + * use them later JavaScript side */ public function __construct( private Point $position, @@ -29,6 +32,14 @@ public function __construct( ) { } + /** + * @return array{ + * position: array{lat: float, lng: float}, + * title: string|null, + * infoWindow: array|null, + * extra: object, + * } + */ public function toArray(): array { return [ @@ -38,4 +49,28 @@ public function toArray(): array 'extra' => (object) $this->extra, ]; } + + /** + * @param array{ + * position: array{lat: float, lng: float}, + * title: string|null, + * infoWindow: array|null, + * extra: object, + * } $marker + * + * @internal + */ + public static function fromArray(array $marker): self + { + if (!isset($marker['position'])) { + throw new InvalidArgumentException('The "position" parameter is required.'); + } + $marker['position'] = Point::fromArray($marker['position']); + + if (isset($marker['infoWindow'])) { + $marker['infoWindow'] = InfoWindow::fromArray($marker['infoWindow']); + } + + return new self(...$marker); + } } diff --git a/src/Map/src/Point.php b/src/Map/src/Point.php index a6d71d88f69..f34f37a2387 100644 --- a/src/Map/src/Point.php +++ b/src/Map/src/Point.php @@ -43,4 +43,16 @@ public function toArray(): array 'lng' => $this->longitude, ]; } + + /** + * @param array{lat: float, lng: float}|array{0: float, 1: float} $point + */ + public static function fromArray(array $point): self + { + if (isset($point['lat'], $point['lng'])) { + return new self($point['lat'], $point['lng']); + } + + return new self(...$point); + } } diff --git a/src/Map/src/Twig/MapExtension.php b/src/Map/src/Twig/MapExtension.php index 57807f54c4e..6442ff1b340 100644 --- a/src/Map/src/Twig/MapExtension.php +++ b/src/Map/src/Twig/MapExtension.php @@ -11,7 +11,6 @@ namespace Symfony\UX\Map\Twig; -use Symfony\UX\Map\Renderer\Renderers; use Twig\DeprecatedCallableInfo; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -26,13 +25,13 @@ final class MapExtension extends AbstractExtension public function getFunctions(): array { return [ - new TwigFunction('render_map', [Renderers::class, 'renderMap'], [ + new TwigFunction('render_map', [MapRuntime::class, 'renderMap'], [ 'is_safe' => ['html'], ...(class_exists(DeprecatedCallableInfo::class) ? ['deprecation_info' => new DeprecatedCallableInfo('symfony/ux-map', '2.20', 'ux_map')] : ['deprecated' => '2.20', 'deprecating_package' => 'symfony/ux-map', 'alternative' => 'ux_map']), ]), - new TwigFunction('ux_map', [Renderers::class, 'renderMap'], ['is_safe' => ['html']]), + new TwigFunction('ux_map', [MapRuntime::class, 'renderMap'], ['is_safe' => ['html']]), ]; } } diff --git a/src/Map/src/Twig/MapRuntime.php b/src/Map/src/Twig/MapRuntime.php new file mode 100644 index 00000000000..62e50be86da --- /dev/null +++ b/src/Map/src/Twig/MapRuntime.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Twig; + +use Symfony\UX\Map\Map; +use Symfony\UX\Map\Marker; +use Symfony\UX\Map\Point; +use Symfony\UX\Map\Renderer\RendererInterface; +use Twig\Extension\RuntimeExtensionInterface; + +/** + * @author Simon André + * + * @internal + */ +final class MapRuntime implements RuntimeExtensionInterface +{ + public function __construct( + private readonly RendererInterface $renderer, + ) { + } + + /** + * @param array $attributes + * @param array $markers + */ + public function renderMap( + ?Map $map = null, + array $attributes = [], + ?array $markers = null, + ?array $center = null, + ?float $zoom = null, + ): string { + if ($map instanceof Map) { + if (null !== $center || null !== $zoom || $markers) { + throw new \InvalidArgumentException('You cannot set "center", "markers" or "zoom" on an existing Map.'); + } + + return $this->renderer->renderMap($map, $attributes); + } + + $map = new Map(); + foreach ($markers ?? [] as $marker) { + $map->addMarker(Marker::fromArray($marker)); + } + if (null !== $center) { + $map->center(Point::fromArray($center)); + } + if (null !== $zoom) { + $map->zoom($zoom); + } + + return $this->renderer->renderMap($map, $attributes); + } +} diff --git a/src/Map/src/Twig/UXMapComponent.php b/src/Map/src/Twig/UXMapComponent.php new file mode 100644 index 00000000000..94cb6407e8f --- /dev/null +++ b/src/Map/src/Twig/UXMapComponent.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Twig; + +use Symfony\UX\Map\Marker; +use Symfony\UX\Map\Point; + +/** + * @author Simon André + * + * @internal + */ +final class UXMapComponent +{ + public ?float $zoom; + + public ?Point $center; + + /** + * @var Marker[] + */ + public array $markers; +} diff --git a/src/Map/src/Twig/UXMapComponentListener.php b/src/Map/src/Twig/UXMapComponentListener.php new file mode 100644 index 00000000000..3a36e5587da --- /dev/null +++ b/src/Map/src/Twig/UXMapComponentListener.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Twig; + +use Symfony\UX\TwigComponent\Event\PreCreateForRenderEvent; + +/** + * @author Simon André + * + * @internal + */ +final class UXMapComponentListener +{ + public function __construct( + private MapRuntime $mapRuntime, + ) { + } + + public function onPreCreateForRender(PreCreateForRenderEvent $event): void + { + if ('ux:map' !== strtolower($event->getName())) { + return; + } + + $attributes = $event->getInputProps(); + $map = array_intersect_key($attributes, ['markers' => 0, 'center' => 1, 'zoom' => 2]); + $attributes = array_diff_key($attributes, $map); + + $html = $this->mapRuntime->renderMap(...$map, attributes: $attributes); + $event->setRenderedString($html); + $event->stopPropagation(); + } +} diff --git a/src/Map/src/UXMapBundle.php b/src/Map/src/UXMapBundle.php index 52ecec412b5..1392926131f 100644 --- a/src/Map/src/UXMapBundle.php +++ b/src/Map/src/UXMapBundle.php @@ -19,6 +19,7 @@ use Symfony\UX\Map\Bridge as MapBridge; use Symfony\UX\Map\Renderer\AbstractRendererFactory; use Symfony\UX\Map\Renderer\NullRendererFactory; +use Symfony\UX\TwigComponent\TwigComponentBundle; /** * @author Hugo Alliaume @@ -55,6 +56,10 @@ public function loadExtension(array $config, ContainerConfigurator $container, C $config['renderer'] = 'null://null'; } + if (ContainerBuilder::willBeAvailable('symfony/ux-twig-component', TwigComponentBundle::class, ['symfony/ux-map'])) { + $container->import('../config/twig_component.php'); + } + if (str_starts_with($config['renderer'], 'null://')) { $container->services() ->set('ux_map.renderer_factory.null', NullRendererFactory::class) diff --git a/src/Map/tests/Kernel/TwigComponentKernel.php b/src/Map/tests/Kernel/TwigComponentKernel.php new file mode 100644 index 00000000000..7ee33360058 --- /dev/null +++ b/src/Map/tests/Kernel/TwigComponentKernel.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Tests\Kernel; + +use Symfony\Bundle\FrameworkBundle\FrameworkBundle; +use Symfony\Bundle\TwigBundle\TwigBundle; +use Symfony\Component\Config\Loader\LoaderInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\HttpKernel\Kernel; +use Symfony\UX\Map\UXMapBundle; +use Symfony\UX\StimulusBundle\StimulusBundle; +use Symfony\UX\TwigComponent\TwigComponentBundle; + +/** + * @internal + */ +class TwigComponentKernel extends Kernel +{ + use AppKernelTrait; + + public function registerBundles(): iterable + { + return [ + new FrameworkBundle(), + new StimulusBundle(), + new TwigBundle(), + new TwigComponentBundle(), + new UXMapBundle(), + ]; + } + + public function registerContainerConfiguration(LoaderInterface $loader) + { + $loader->load(function (ContainerBuilder $container) { + $container->loadFromExtension('framework', [ + 'secret' => '$ecret', + 'test' => true, + 'http_method_override' => false, + ]); + $container->loadFromExtension('twig', [ + 'default_path' => __DIR__.'/templates', + 'strict_variables' => true, + 'exception_controller' => null, + ]); + $container->loadFromExtension('twig_component', [ + 'defaults' => [], + 'anonymous_template_directory' => 'components', + ]); + $container->loadFromExtension('ux_map', []); + + $container->setAlias('test.ux_map.renderers', 'ux_map.renderers')->setPublic(true); + }); + } +} diff --git a/src/Map/tests/MapFactoryTest.php b/src/Map/tests/MapFactoryTest.php new file mode 100644 index 00000000000..a19e2d7996c --- /dev/null +++ b/src/Map/tests/MapFactoryTest.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\UX\Map\Map; + +class MapFactoryTest extends TestCase +{ + public function testFromArray(): void + { + $array = self::createMapArray(); + $map = Map::fromArray($array); + + $this->assertEquals($array['center']['lat'], $map->toArray()['center']['lat']); + $this->assertEquals($array['center']['lng'], $map->toArray()['center']['lng']); + + $this->assertEquals((float) $array['zoom'], $map->toArray()['zoom']); + + $this->assertCount(1, $markers = $map->toArray()['markers']); + $this->assertEquals($array['markers'][0]['position']['lat'], $markers[0]['position']['lat']); + $this->assertEquals($array['markers'][0]['position']['lng'], $markers[0]['position']['lng']); + $this->assertSame($array['markers'][0]['title'], $markers[0]['title']); + $this->assertSame($array['markers'][0]['infoWindow']['headerContent'], $markers[0]['infoWindow']['headerContent']); + $this->assertSame($array['markers'][0]['infoWindow']['content'], $markers[0]['infoWindow']['content']); + } + + public function testFromArrayWithInvalidCenter(): void + { + $array = self::createMapArray(); + $array['center'] = 'invalid'; + + $this->expectException(\TypeError::class); + Map::fromArray($array); + } + + public function testFromArrayWithInvalidZoom(): void + { + $array = self::createMapArray(); + $array['zoom'] = 'invalid'; + + $this->expectException(\TypeError::class); + Map::fromArray($array); + } + + public function testFromArrayWithInvalidMarkers(): void + { + $array = self::createMapArray(); + $array['markers'] = 'invalid'; + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The "markers" parameter must be an array.'); + Map::fromArray($array); + } + + public function testFromArrayWithInvalidMarker(): void + { + $array = self::createMapArray(); + $array['markers'] = [ + [ + 'invalid', + ], + ]; + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The "position" parameter is required.'); + Map::fromArray($array); + } + + private static function createMapArray(): array + { + return [ + 'center' => [ + 'lat' => 48.8566, + 'lng' => 2.3522, + ], + 'zoom' => 12, + 'markers' => [ + [ + 'position' => [ + 'lat' => 48.8566, + 'lng' => 2.3522, + ], + 'title' => 'Paris', + 'infoWindow' => [ + 'headerContent' => 'Paris', + 'content' => 'Paris, the city of lights', + ], + ], + ], + ]; + } +} diff --git a/src/Map/tests/Twig/MapComponentTest.php b/src/Map/tests/Twig/MapComponentTest.php new file mode 100644 index 00000000000..031fd9293a3 --- /dev/null +++ b/src/Map/tests/Twig/MapComponentTest.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Tests\Twig; + +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\UX\Map\Map; +use Symfony\UX\Map\Point; +use Symfony\UX\Map\Renderer\RendererInterface; +use Symfony\UX\Map\Tests\Kernel\TwigComponentKernel; + +class MapComponentTest extends KernelTestCase +{ + protected static function getKernelClass(): string + { + return TwigComponentKernel::class; + } + + public function testRenderMapComponent(): void + { + $map = (new Map()) + ->center(new Point(latitude: 5, longitude: 10)) + ->zoom(4); + $attributes = ['data-foo' => 'bar']; + + $renderer = self::createMock(RendererInterface::class); + $renderer + ->method('renderMap') + ->with($map, $attributes) + ->willReturn('
    ') + ; + self::getContainer()->set('test.ux_map.renderers', $renderer); + + $twig = self::getContainer()->get('twig'); + $template = $twig->createTemplate(''); + + $this->assertSame( + '
    ', + $template->render(['attributes' => $attributes]), + ); + } +} diff --git a/src/Map/tests/Twig/MapExtensionTest.php b/src/Map/tests/Twig/MapExtensionTest.php new file mode 100644 index 00000000000..e78e0ec3d16 --- /dev/null +++ b/src/Map/tests/Twig/MapExtensionTest.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map\Tests\Twig; + +use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\UX\Map\Map; +use Symfony\UX\Map\Point; +use Symfony\UX\Map\Renderer\RendererInterface; +use Symfony\UX\Map\Tests\Kernel\TwigAppKernel; +use Symfony\UX\Map\Twig\MapExtension; +use Symfony\UX\Map\Twig\MapRuntime; +use Twig\DeprecatedCallableInfo; +use Twig\Environment; +use Twig\Loader\ArrayLoader; +use Twig\Loader\ChainLoader; + +class MapExtensionTest extends KernelTestCase +{ + use ExpectDeprecationTrait; + + protected static function getKernelClass(): string + { + return TwigAppKernel::class; + } + + public function testExtensionIsRegistered(): void + { + /** @var Environment $twig */ + $twig = self::getContainer()->get('twig'); + + $this->assertTrue($twig->hasExtension(MapExtension::class)); + $this->assertInstanceOf(MapExtension::class, $twig->getExtension(MapExtension::class)); + } + + public function testRuntimeIsRegistered(): void + { + /** @var Environment $twig */ + $twig = self::getContainer()->get('twig'); + + $this->assertInstanceOf(MapRuntime::class, $twig->getRuntime(MapRuntime::class)); + } + + /** + * @group legacy + */ + public function testRenderFunctionIsDeprecated(): void + { + $map = (new Map()) + ->center(new Point(latitude: 5, longitude: 10)) + ->zoom(4); + + $renderer = self::createMock(RendererInterface::class); + $renderer + ->expects(self::once()) + ->method('renderMap') + ->with($map, []) + ->willReturn('') + ; + self::getContainer()->set('test.ux_map.renderers', $renderer); + + /** @var Environment $twig */ + $twig = self::getContainer()->get('twig'); + $twig->setLoader(new ChainLoader([ + new ArrayLoader([ + 'test' => '{{ render_map(map) }}', + ]), + $twig->getLoader(), + ])); + + if (class_exists(DeprecatedCallableInfo::class)) { + $this->expectDeprecation('Since symfony/ux-map 2.20: Twig Function "render_map" is deprecated; use "ux_map" instead in test at line 1.'); + } else { + $this->expectDeprecation('Since symfony/ux-map 2.20: Twig Function "render_map" is deprecated. Use "ux_map" instead in test at line 1.'); + } + $html = $twig->render('test', ['map' => $map]); + $this->assertSame('', $html); + } + + public function testMapFunctionWithArray(): void + { + $map = (new Map()) + ->center(new Point(latitude: 5, longitude: 10)) + ->zoom(4); + $attributes = ['data-foo' => 'bar']; + + $renderer = self::createMock(RendererInterface::class); + $renderer + ->expects(self::once()) + ->method('renderMap') + ->with($map, $attributes) + ->willReturn('
    ') + ; + self::getContainer()->set('test.ux_map.renderers', $renderer); + + $twig = self::getContainer()->get('twig'); + $template = $twig->createTemplate('{{ ux_map(center: {lat: 5, lng: 10}, zoom: 4, attributes: attributes) }}'); + + $this->assertSame( + '
    ', + $template->render(['attributes' => $attributes]), + ); + } +} From 35115288d235491e95d96168aa18496262abfc50 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 18 Sep 2024 16:41:38 +0200 Subject: [PATCH 51/64] Fix a data collector issue in the Twig Components --- .../templates/Collector/twig_component.html.twig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TwigComponent/templates/Collector/twig_component.html.twig b/src/TwigComponent/templates/Collector/twig_component.html.twig index fe6ded6a412..c2098156f22 100644 --- a/src/TwigComponent/templates/Collector/twig_component.html.twig +++ b/src/TwigComponent/templates/Collector/twig_component.html.twig @@ -287,15 +287,15 @@ Input props - {{ profiler_dump(render.input_props) }} + {{ profiler_dump(render.input_props) }} Attributes - {{ profiler_dump(render.attributes) }} + {{ profiler_dump(render.attributes) }} Component - {{ profiler_dump(render.component) }} + {{ profiler_dump(render.component) }} From 28454b8b1d8e64aa2ea8e68e0a4dff545e96a693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Wed, 11 Sep 2024 02:07:43 +0200 Subject: [PATCH 52/64] [Icons] Configure icon sets: path, alias & icon attributes --- src/Icons/config/services.php | 3 +- .../DependencyInjection/UXIconsExtension.php | 69 +++++- src/Icons/src/IconRenderer.php | 21 +- .../src/Registry/IconifyOnDemandRegistry.php | 9 +- .../src/Registry/LocalSvgIconRegistry.php | 31 ++- src/Icons/tests/Fixtures/TestKernel.php | 10 +- src/Icons/tests/Fixtures/icons/a/icon.svg | 3 + src/Icons/tests/Fixtures/images/a/b/icon.svg | 3 + src/Icons/tests/Fixtures/images/a/icon.svg | 3 + src/Icons/tests/Fixtures/images/ab/icon.svg | 3 + src/Icons/tests/Fixtures/images/icon.svg | 3 + src/Icons/tests/Unit/IconRendererTest.php | 230 +++++++++++++++--- .../Registry/IconifyOnDemandRegistryTest.php | 50 ++++ .../Registry/LocalSvgIconRegistryTest.php | 62 +++++ 14 files changed, 441 insertions(+), 59 deletions(-) create mode 100644 src/Icons/tests/Fixtures/icons/a/icon.svg create mode 100644 src/Icons/tests/Fixtures/images/a/b/icon.svg create mode 100644 src/Icons/tests/Fixtures/images/a/icon.svg create mode 100644 src/Icons/tests/Fixtures/images/ab/icon.svg create mode 100644 src/Icons/tests/Fixtures/images/icon.svg create mode 100644 src/Icons/tests/Unit/Registry/IconifyOnDemandRegistryTest.php diff --git a/src/Icons/config/services.php b/src/Icons/config/services.php index a0b8ca576bb..7d0dc0abd11 100644 --- a/src/Icons/config/services.php +++ b/src/Icons/config/services.php @@ -14,6 +14,7 @@ use Symfony\UX\Icons\Command\WarmCacheCommand; use Symfony\UX\Icons\IconCacheWarmer; use Symfony\UX\Icons\IconRenderer; +use Symfony\UX\Icons\IconRendererInterface; use Symfony\UX\Icons\Registry\CacheIconRegistry; use Symfony\UX\Icons\Registry\ChainIconRegistry; use Symfony\UX\Icons\Registry\LocalSvgIconRegistry; @@ -60,7 +61,7 @@ abstract_arg('icon_aliases'), ]) - ->alias('Symfony\UX\Icons\IconRendererInterface', '.ux_icons.icon_renderer') + ->alias(IconRendererInterface::class, '.ux_icons.icon_renderer') ->set('.ux_icons.icon_finder', IconFinder::class) ->args([ diff --git a/src/Icons/src/DependencyInjection/UXIconsExtension.php b/src/Icons/src/DependencyInjection/UXIconsExtension.php index d363de8afa0..618749ee701 100644 --- a/src/Icons/src/DependencyInjection/UXIconsExtension.php +++ b/src/Icons/src/DependencyInjection/UXIconsExtension.php @@ -42,32 +42,66 @@ public function getConfigTreeBuilder(): TreeBuilder ->variableNode('default_icon_attributes') ->info('Default attributes to add to all icons.') ->defaultValue(['fill' => 'currentColor']) + ->example(['class' => 'icon']) + ->end() + ->arrayNode('icon_sets') + ->info('Icon sets configuration.') + ->defaultValue([]) + ->normalizeKeys(false) + ->useAttributeAsKey('prefix') + ->arrayPrototype() + ->info('the icon set prefix (e.g. "acme")') + ->children() + ->scalarNode('path') + ->info("The local icon set directory path.\n(cannot be used with 'alias')") + ->example('%kernel.project_dir%/assets/svg/acme') + ->end() + ->scalarNode('alias') + ->info("The remote icon set identifier.\n(cannot be used with 'path')") + ->example('simple-icons') + ->end() + ->arrayNode('icon_attributes') + ->info('Override default icon attributes for icons in this set.') + ->example(['class' => 'icon icon-acme', 'fill' => 'none']) + ->normalizeKeys(false) + ->variablePrototype() + ->end() + ->end() + ->end() + ->end() + ->validate() + ->ifTrue(fn (array $v) => isset($v['path']) && isset($v['alias'])) + ->thenInvalid('You cannot define both "path" and "alias" for an icon set.') + ->end() ->end() ->arrayNode('aliases') - ->info('Icon aliases (alias => icon name).') - ->example(['dots' => 'clarity:ellipsis-horizontal-line']) + ->info('Icon aliases (map of alias => full name).') + ->example([ + 'dots' => 'clarity:ellipsis-horizontal-line', + 'privacy' => 'bi:cookie', + ]) ->normalizeKeys(false) ->scalarPrototype() ->cannotBeEmpty() ->end() ->end() ->arrayNode('iconify') - ->info('Configuration for the "on demand" icons powered by Iconify.design.') + ->info('Configuration for the remote icon service.') ->{interface_exists(HttpClientInterface::class) ? 'canBeDisabled' : 'canBeEnabled'}() ->children() ->booleanNode('on_demand') - ->info('Whether to use the "on demand" icons powered by Iconify.design.') + ->info('Whether to download icons "on demand".') ->defaultTrue() ->end() ->scalarNode('endpoint') - ->info('The endpoint for the Iconify API.') + ->info('The endpoint for the Iconify icons API.') ->defaultValue(Iconify::API_ENDPOINT) ->cannotBeEmpty() ->end() ->end() ->end() ->booleanNode('ignore_not_found') - ->info('Ignore error when an icon is not found.') + ->info("Ignore error when an icon is not found.\nSet to 'true' to fail silently.") ->defaultFalse() ->end() ->end() @@ -94,9 +128,25 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $loader->load('asset_mapper.php'); } + $iconSetAliases = []; + $iconSetAttributes = []; + $iconSetPaths = []; + foreach ($mergedConfig['icon_sets'] as $prefix => $config) { + if (isset($config['icon_attributes'])) { + $iconSetAttributes[$prefix] = $config['icon_attributes']; + } + if (isset($config['alias'])) { + $iconSetAliases[$prefix] = $config['alias']; + } + if (isset($config['path'])) { + $iconSetPaths[$prefix] = $config['path']; + } + } + $container->getDefinition('.ux_icons.local_svg_icon_registry') ->setArguments([ $mergedConfig['icon_dir'], + $iconSetPaths, ]) ; @@ -107,6 +157,7 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $container->getDefinition('.ux_icons.icon_renderer') ->setArgument(1, $mergedConfig['default_icon_attributes']) ->setArgument(2, $mergedConfig['aliases']) + ->setArgument(3, $iconSetAttributes) ; $container->getDefinition('.ux_icons.twig_icon_runtime') @@ -117,8 +168,10 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $loader->load('iconify.php'); $container->getDefinition('.ux_icons.iconify') - ->setArgument(1, $mergedConfig['iconify']['endpoint']) - ; + ->setArgument(1, $mergedConfig['iconify']['endpoint']); + + $container->getDefinition('.ux_icons.iconify_on_demand_registry') + ->setArgument(1, $iconSetAliases); if (!$mergedConfig['iconify']['on_demand']) { $container->removeDefinition('.ux_icons.iconify_on_demand_registry'); diff --git a/src/Icons/src/IconRenderer.php b/src/Icons/src/IconRenderer.php index f58614ba9f6..c698619d435 100644 --- a/src/Icons/src/IconRenderer.php +++ b/src/Icons/src/IconRenderer.php @@ -18,10 +18,16 @@ */ final class IconRenderer implements IconRendererInterface { + /** + * @param array $defaultIconAttributes + * @param array $iconAliases + * @param array> $iconSetsAttributes + */ public function __construct( private readonly IconRegistryInterface $registry, private readonly array $defaultIconAttributes = [], - private readonly ?array $iconAliases = [], + private readonly array $iconAliases = [], + private readonly array $iconSetsAttributes = [], ) { } @@ -36,11 +42,16 @@ public function __construct( */ public function renderIcon(string $name, array $attributes = []): string { - $name = $this->iconAliases[$name] ?? $name; + $iconName = $this->iconAliases[$name] ?? $name; - $icon = $this->registry->get($name) - ->withAttributes($this->defaultIconAttributes) - ->withAttributes($attributes); + $icon = $this->registry->get($iconName); + + if (0 < (int) $pos = strpos($name, ':')) { + $setAttributes = $this->iconSetsAttributes[substr($name, 0, $pos)] ?? []; + } elseif ($iconName !== $name && 0 < (int) $pos = strpos($iconName, ':')) { + $setAttributes = $this->iconSetsAttributes[substr($iconName, 0, $pos)] ?? []; + } + $icon = $icon->withAttributes([...$this->defaultIconAttributes, ...($setAttributes ?? []), ...$attributes]); foreach ($this->getPreRenderers() as $preRenderer) { $icon = $preRenderer($icon); diff --git a/src/Icons/src/Registry/IconifyOnDemandRegistry.php b/src/Icons/src/Registry/IconifyOnDemandRegistry.php index 7e9325adbd3..5931854ca75 100644 --- a/src/Icons/src/Registry/IconifyOnDemandRegistry.php +++ b/src/Icons/src/Registry/IconifyOnDemandRegistry.php @@ -23,8 +23,10 @@ */ final class IconifyOnDemandRegistry implements IconRegistryInterface { - public function __construct(private Iconify $iconify) - { + public function __construct( + private Iconify $iconify, + private ?array $prefixAliases = [], + ) { } public function get(string $name): Icon @@ -32,7 +34,8 @@ public function get(string $name): Icon if (2 !== \count($parts = explode(':', $name))) { throw new IconNotFoundException(\sprintf('The icon name "%s" is not valid.', $name)); } + [$prefix, $icon] = $parts; - return $this->iconify->fetchIcon(...$parts); + return $this->iconify->fetchIcon($this->prefixAliases[$prefix] ?? $prefix, $icon); } } diff --git a/src/Icons/src/Registry/LocalSvgIconRegistry.php b/src/Icons/src/Registry/LocalSvgIconRegistry.php index c12ef39475c..e393f358778 100644 --- a/src/Icons/src/Registry/LocalSvgIconRegistry.php +++ b/src/Icons/src/Registry/LocalSvgIconRegistry.php @@ -23,17 +23,38 @@ */ final class LocalSvgIconRegistry implements IconRegistryInterface { - public function __construct(private string $iconDir) - { + /** + * @param array $iconSetPaths + */ + public function __construct( + private readonly string $iconDir, + private readonly array $iconSetPaths = [], + ) { } public function get(string $name): Icon { - if (!file_exists($filename = \sprintf('%s/%s.svg', $this->iconDir, str_replace(':', '/', $name)))) { - throw new IconNotFoundException(\sprintf('The icon "%s" (%s) does not exist.', $name, $filename)); + if (str_contains($name, ':')) { + [$prefix, $icon] = explode(':', $name, 2) + ['', '']; + if ('' === $prefix || '' === $icon) { + throw new IconNotFoundException(\sprintf('The icon name "%s" is not valid.', $name)); + } + + if ($prefixPath = $this->iconSetPaths[$prefix] ?? null) { + if (!file_exists($filename = $prefixPath.'/'.str_replace(':', '/', $icon).'.svg')) { + throw new IconNotFoundException(\sprintf('The icon "%s" (%s) does not exist.', $name, $filename)); + } + + return Icon::fromFile($filename); + } + } + + $filepath = str_replace(':', '/', $name).'.svg'; + if (file_exists($filename = $this->iconDir.'/'.$filepath)) { + return Icon::fromFile($filename); } - return Icon::fromFile($filename); + throw new IconNotFoundException(\sprintf('The icon "%s" (%s) does not exist.', $name, $filename)); } public function has(string $name): bool diff --git a/src/Icons/tests/Fixtures/TestKernel.php b/src/Icons/tests/Fixtures/TestKernel.php index acee6579a97..6a9d0f0bdb0 100644 --- a/src/Icons/tests/Fixtures/TestKernel.php +++ b/src/Icons/tests/Fixtures/TestKernel.php @@ -50,7 +50,7 @@ protected function configureContainer(ContainerConfigurator $container): void ]); $container->extension('twig', [ - 'default_path' => __DIR__ . '/templates', + 'default_path' => __DIR__.'/templates', ]); $container->extension('twig_component', [ @@ -60,6 +60,14 @@ protected function configureContainer(ContainerConfigurator $container): void $container->extension('ux_icons', [ 'icon_dir' => '%kernel.project_dir%/tests/Fixtures/icons', + 'icon_sets' => [ + 'fla' => [ + 'path' => '%kernel.project_dir%/tests/Fixtures/images/flags', + ], + 'lu' => [ + 'alias' => 'lucide', + ], + ], ]); $container->services()->set('logger', NullLogger::class); diff --git a/src/Icons/tests/Fixtures/icons/a/icon.svg b/src/Icons/tests/Fixtures/icons/a/icon.svg new file mode 100644 index 00000000000..85878dfad4c --- /dev/null +++ b/src/Icons/tests/Fixtures/icons/a/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Icons/tests/Fixtures/images/a/b/icon.svg b/src/Icons/tests/Fixtures/images/a/b/icon.svg new file mode 100644 index 00000000000..e59e88ef245 --- /dev/null +++ b/src/Icons/tests/Fixtures/images/a/b/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Icons/tests/Fixtures/images/a/icon.svg b/src/Icons/tests/Fixtures/images/a/icon.svg new file mode 100644 index 00000000000..da8840f9ad7 --- /dev/null +++ b/src/Icons/tests/Fixtures/images/a/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Icons/tests/Fixtures/images/ab/icon.svg b/src/Icons/tests/Fixtures/images/ab/icon.svg new file mode 100644 index 00000000000..d56b0c56821 --- /dev/null +++ b/src/Icons/tests/Fixtures/images/ab/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Icons/tests/Fixtures/images/icon.svg b/src/Icons/tests/Fixtures/images/icon.svg new file mode 100644 index 00000000000..93c5b26d546 --- /dev/null +++ b/src/Icons/tests/Fixtures/images/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/Icons/tests/Unit/IconRendererTest.php b/src/Icons/tests/Unit/IconRendererTest.php index 75fd856688a..e6834b603dc 100644 --- a/src/Icons/tests/Unit/IconRendererTest.php +++ b/src/Icons/tests/Unit/IconRendererTest.php @@ -82,81 +82,196 @@ public function testRenderIconWithDefaultAttributes(): void } /** - * @dataProvider provideAttributesWithDefaultAttributesCases + * @dataProvider provideRenderIconWithAttributeCascadeCases */ - public function testRenderIconWithAttributesAndDefaultAttributes($iconAttrs, $defaultAttrs, $renderAttr, $expectedTag): void - { + public function testRenderIconWithAttributeCascade( + array $iconAttributes, + array $defaultAttributes = [], + array $iconSetAttributes = [], + array $renderAttributes = [], + string $expectedTag = '', + ): void { $registry = $this->createRegistry([ - 'foo' => ['', $iconAttrs], + 'ux:icon' => ['', $iconAttributes], ]); - $iconRenderer = new IconRenderer($registry, $defaultAttrs); + $iconRenderer = new IconRenderer($registry, $defaultAttributes, [], ['ux' => $iconSetAttributes]); - $svg = $iconRenderer->renderIcon('foo', $renderAttr); + $svg = $iconRenderer->renderIcon('ux:icon', $renderAttributes); $svg = str_replace(' aria-hidden="true"', '', $svg); $this->assertStringStartsWith($expectedTag, $svg); } - public static function provideAttributesWithDefaultAttributesCases() + /** + * @return iterable, + * array, + * array, + * array, + * string, + * }> + */ + public static function provideRenderIconWithAttributeCascadeCases(): iterable { yield 'no_attributes' => [ [], [], [], + [], '', ]; yield 'icon_attributes_are_used' => [ - ['id' => 'icon'], + ['ico' => 'ICO'], + [], [], [], - '', + '', ]; yield 'default_attributes_are_used' => [ [], - ['id' => 'default'], + ['def' => 'DEF'], [], - '', + [], + '', ]; - yield 'render_attributes_are_used' => [ + yield 'default_attributes_overwrite_icon_attributes' => [ + ['ico' => 'ICO'], + ['ico' => 'DEF'], [], [], - ['id' => 'render'], - '', + '', ]; - yield 'default_attributes_take_precedence_on_icon' => [ - ['id' => 'icon'], - ['id' => 'default'], + yield 'default_attributes_removes_icon_attributes' => [ + ['ico' => 'ICO'], + ['ico' => false], [], - '', + [], + '', ]; yield 'default_attributes_are_merged_with_icon_attributes' => [ - ['id' => 'icon', 'foo' => 'bar'], - ['id' => 'default', 'baz' => 'qux'], + ['ico' => 'ICO', 'foo' => 'ICO'], + ['ico' => 'DEF', 'bar' => 'DEF'], [], - '', + [], + '', ]; - yield 'render_attributes_take_precedence_on_default' => [ + yield 'icon_set_attributes_are_used' => [ + [], + [], + ['ico' => 'SET'], [], - ['id' => 'default'], - ['id' => 'render'], - '', + '', ]; - yield 'render_attributes_are_merged_with_default_attributes' => [ + yield 'icon_set_attributes_overwrite_icon_attributes' => [ + ['ico' => 'ICO'], + [], + ['ico' => 'SET'], + [], + '', + ]; + yield 'icon_set_attributes_overwrite_default_attributes' => [ + [], + ['ico' => 'DEF'], + ['ico' => 'SET'], + [], + '', + ]; + yield 'icon_set_attributes_are_merged_with_icon_attributes' => [ + ['ico' => 'ICO', 'foo' => 'ICO'], + [], + ['ico' => 'SET', 'bar' => 'SET'], + [], + '', + ]; + yield 'icon_set_attributes_are_merged_with_default_attributes' => [ + [], + ['ico' => 'DEF', 'foo' => 'DEF'], + ['ico' => 'SET', 'bar' => 'SET'], + [], + '', + ]; + yield 'icon_set_attributes_are_merged_with_default_attributes_and_icon_attributes' => [ + ['ico' => 'ICO', 'foo' => 'ICO'], + ['ico' => 'DEF', 'bar' => 'DEF'], + ['ico' => 'SET', 'baz' => 'SET'], + [], + '', + ]; + yield 'render_attributes_are_used' => [ + [], + [], + [], + ['ren' => 'REN'], + '', + ]; + yield 'render_attributes_overwrite_icon_attributes' => [ + ['ico' => 'ICO'], + [], + [], + ['ico' => 'REN'], + '', + ]; + yield 'render_attributes_overwrite_default_attributes' => [ + [], + ['ico' => 'DEF'], [], - ['id' => 'default', 'foo' => 'bar'], - ['id' => 'render', 'baz' => 'qux'], - '', + ['ico' => 'REN'], + '', ]; - yield 'render_attributes_take_precedence_on_icon' => [ - ['id' => 'icon'], + yield 'render_attributes_overwrite_icon_set_attributes' => [ [], - ['id' => 'render'], - '', + [], + ['ico' => 'SET'], + ['ico' => 'REN'], + '', ]; yield 'render_attributes_are_merged_with_icon_attributes' => [ - ['id' => 'icon', 'foo' => 'bar'], + ['ico' => 'ICO', 'foo' => 'ICO'], + [], + [], + ['ico' => 'REN', 'bar' => 'REN'], + '', + ]; + yield 'render_attributes_are_merged_with_default_attributes' => [ + [], + ['ico' => 'DEF', 'foo' => 'DEF'], + [], + ['ico' => 'REN', 'bar' => 'REN'], + '', + ]; + yield 'render_attributes_are_merged_with_icon_set_attributes' => [ + [], [], - ['id' => 'render', 'baz' => 'qux'], - '', + ['ico' => 'SET', 'foo' => 'SET'], + ['ico' => 'REN', 'bar' => 'REN'], + '', + ]; + yield 'render_attributes_are_merged_with_default_attributes_and_icon_attributes' => [ + ['ico' => 'ICO', 'foo' => 'ICO'], + ['ico' => 'DEF', 'bar' => 'DEF'], + [], + ['ico' => 'REN', 'baz' => 'REN'], + '', + ]; + yield 'render_attributes_are_merged_with_icon_set_attributes_and_default_attributes' => [ + [], + ['ico' => 'DEF', 'foo' => 'DEF'], + ['ico' => 'SET', 'bar' => 'SET'], + ['ico' => 'REN', 'baz' => 'REN'], + '', + ]; + yield 'render_attributes_are_merged_with_icon_set_attributes_and_icon_attributes' => [ + ['ico' => 'ICO', 'foo' => 'ICO'], + [], + ['ico' => 'SET', 'bar' => 'SET'], + ['ico' => 'REN', 'baz' => 'REN'], + '', + ]; + yield 'render_attributes_are_merged_with_icon_set_attributes_and_default_attributes_and_icon_attributes' => [ + ['ico' => 'ICO', 'foo' => 'ICO'], + ['ico' => 'DEF', 'bar' => 'DEF'], + ['ico' => 'SET', 'baz' => 'SET'], + ['ico' => 'REN', 'qux' => 'REN'], + '', ]; } @@ -249,6 +364,49 @@ public function testRenderIconWithAliases(): void $this->assertSame('', $svg); } + /** + * @param array $attributes + * + * @dataProvider provideRenderIconWithIconSetAttributes + */ + public function testRenderIconWithIconSetAttributes(string $name, array $attributes, string $expectedSvg): void + { + $registry = $this->createRegistry([ + 'a' => '', + 'a:b' => '', + 'a:b:c' => '', + ]); + $defaultIconAttributes = ['class' => 'def', 'x' => 'def_x']; + $iconSetsAttributes = [ + 'a' => ['class' => 'icons_a', 'x' => 'a'], + 'a:b' => ['class' => 'icons_ab', 'x' => 'ab'], + ]; + + $iconRenderer = new IconRenderer($registry, $defaultIconAttributes, [], $iconSetsAttributes); + + $svg = $iconRenderer->renderIcon($name, $attributes); + $this->assertSame($expectedSvg, $svg); + } + + public static function provideRenderIconWithIconSetAttributes(): iterable + { + yield 'icon set attributes (a:b)' => [ + 'a:b', + [], + '', + ]; + yield 'icon set attributes (a:b:c)' => [ + 'a:b:c', + [], + '', + ]; + yield 'icon set attributes and render attributes' => [ + 'a:b', + ['class' => 'render', 'y' => 'a'], + '', + ]; + } + private function createRegistry(array $icons): IconRegistryInterface { $registryIcons = []; diff --git a/src/Icons/tests/Unit/Registry/IconifyOnDemandRegistryTest.php b/src/Icons/tests/Unit/Registry/IconifyOnDemandRegistryTest.php new file mode 100644 index 00000000000..c3d1b1d6fcd --- /dev/null +++ b/src/Icons/tests/Unit/Registry/IconifyOnDemandRegistryTest.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Icons\Tests\Unit\Registry; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Cache\Adapter\NullAdapter; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\JsonMockResponse; +use Symfony\UX\Icons\Icon; +use Symfony\UX\Icons\Iconify; +use Symfony\UX\Icons\Registry\IconifyOnDemandRegistry; + +/** + * @author Simon André + */ +final class IconifyOnDemandRegistryTest extends TestCase +{ + public function testWithIconSetAlias(): void + { + $client = new MockHttpClient([ + new JsonMockResponse(['lucide' => []]), + new JsonMockResponse([ + 'icons' => [ + 'circle' => [ + 'body' => '', + 'height' => 24, + ], + ], + ]), + ]); + + $registry = new IconifyOnDemandRegistry( + new Iconify(new NullAdapter(), 'https://example.com', $client), + ['bi' => 'lucide'], + ); + + $icon = $registry->get('bi:circle'); + $this->assertInstanceOf(Icon::class, $icon); + $this->assertSame('', $icon->getInnerSvg()); + } +} diff --git a/src/Icons/tests/Unit/Registry/LocalSvgIconRegistryTest.php b/src/Icons/tests/Unit/Registry/LocalSvgIconRegistryTest.php index 4cef5927cfc..9404b498f34 100644 --- a/src/Icons/tests/Unit/Registry/LocalSvgIconRegistryTest.php +++ b/src/Icons/tests/Unit/Registry/LocalSvgIconRegistryTest.php @@ -82,6 +82,68 @@ public static function invalidSvgProvider(): iterable yield ['invalid4']; } + /** + * @dataProvider provideIconSetPathsCases + */ + public function testIconSetPaths(string $name, array $iconSetPaths, ?string $expectedContent): void + { + $registry = new LocalSvgIconRegistry( + iconDir: __DIR__.'/../../Fixtures/icons', + iconSetPaths: $iconSetPaths, + ); + + if (null === $expectedContent) { + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessageMatches(\sprintf('/The icon "%s" \(.+\) does not exist./', $name)); + $registry->get($name); + } else { + $icon = $registry->get($name); + $this->assertInstanceOf(Icon::class, $icon); + $this->assertSame($expectedContent, $icon->getInnerSvg()); + } + } + + public static function provideIconSetPathsCases(): iterable + { + yield 'no_iconset_path' => [ + 'icon', + [], + null, + ]; + yield 'iconset_path' => [ + 'ux:icon', + ['ux' => __DIR__.'/../../Fixtures/images'], + '', + ]; + yield 'partial_iconset_path' => [ + 'a:b:icon', + [ + 'a' => __DIR__.'/../../Fixtures/images/a/', + ], + '', + ]; + yield 'root_namespace_fallback_on_local' => [ + 'a:icon', + [], + '', + ]; + yield 'deep_namespace_refused' => [ + 'a:b:icon', + [ + 'a:b' => __DIR__.'/../../Fixtures/images/a/b', + ], + null, + ]; + yield 'root_namespace_over_nested' => [ + 'a:b:icon', + [ + 'a' => __DIR__.'/../../Fixtures/images/a', + 'a:b' => __DIR__.'/../../Fixtures/images/ab', + ], + '', + ]; + } + private function registry(): LocalSvgIconRegistry { return new LocalSvgIconRegistry(__DIR__.'/../../Fixtures/svg'); From 5982e3cee254986989ae5e8ba02b6890a8ca266c Mon Sep 17 00:00:00 2001 From: seb-jean Date: Thu, 19 Sep 2024 14:57:34 +0200 Subject: [PATCH 53/64] Update base.html.twig --- ux.symfony.com/templates/base.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ux.symfony.com/templates/base.html.twig b/ux.symfony.com/templates/base.html.twig index 5f487b2181a..61fbfd2494b 100644 --- a/ux.symfony.com/templates/base.html.twig +++ b/ux.symfony.com/templates/base.html.twig @@ -2,7 +2,7 @@ - {% block title %}{{ meta.title|default }}{{ meta.title_suffix|default(' - Symfony UX') }}{% endblock %} + {% block title %}{{ meta.title|default }}{{ meta.title_suffix ?? ' - Symfony UX' }}{% endblock %} From 1e23116f16803199f80f0c49fcfb55240e2076b6 Mon Sep 17 00:00:00 2001 From: gokakyu Date: Thu, 19 Sep 2024 17:11:48 +0200 Subject: [PATCH 54/64] [Dropzone] change physical link to the default style file --- src/Dropzone/doc/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Dropzone/doc/index.rst b/src/Dropzone/doc/index.rst index f564c8ad659..cff26ffbda6 100644 --- a/src/Dropzone/doc/index.rst +++ b/src/Dropzone/doc/index.rst @@ -62,7 +62,7 @@ Symfony UX Dropzone provides a default stylesheet in order to ease usage. You can disable it to add your own design if you wish. In ``assets/controllers.json``, disable the default stylesheet by -switching the ``@symfony/ux-dropzone/src/style.css`` autoimport to +switching the ``@symfony/ux-dropzone/dist/style.min.css`` autoimport to ``false``: .. code-block:: json @@ -74,7 +74,7 @@ switching the ``@symfony/ux-dropzone/src/style.css`` autoimport to "enabled": true, "fetch": "eager", "autoimport": { - "@symfony/ux-dropzone/src/style.css": false + "@symfony/ux-dropzone/dist/style.min.css": false } } } From 8a283198e1f9d281dd5eb6beecffab9562aac35b Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Fri, 20 Sep 2024 09:52:13 +0200 Subject: [PATCH 55/64] [Site] Fix tooltips positioning on FileTree component --- ux.symfony.com/assets/styles/components/_FileTree.scss | 2 +- ux.symfony.com/templates/main/_file_tree.html.twig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ux.symfony.com/assets/styles/components/_FileTree.scss b/ux.symfony.com/assets/styles/components/_FileTree.scss index 8c57394f1a1..0d2d24c431d 100644 --- a/ux.symfony.com/assets/styles/components/_FileTree.scss +++ b/ux.symfony.com/assets/styles/components/_FileTree.scss @@ -6,7 +6,7 @@ } .FileTree li > span { - display: flex; + display: inline-flex; flex-direction: row; align-items: center; gap: .75rem; diff --git a/ux.symfony.com/templates/main/_file_tree.html.twig b/ux.symfony.com/templates/main/_file_tree.html.twig index 0e1ad131cc3..b59fee12dfa 100644 --- a/ux.symfony.com/templates/main/_file_tree.html.twig +++ b/ux.symfony.com/templates/main/_file_tree.html.twig @@ -1,6 +1,6 @@ {% macro summaryAttributes(description) %} {% if description %} - data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="auto" title="{{ description|e('html_attr') }}" + data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="right" title="{{ description|e('html_attr') }}" {% endif %} {% endmacro %} From 33458cce9ec60ec7d85ff0157db83357e8e02ca2 Mon Sep 17 00:00:00 2001 From: Thibault G Date: Thu, 19 Sep 2024 12:50:12 +0200 Subject: [PATCH 56/64] [Translator] add `throwWhenNotFound` method --- src/Translator/CHANGELOG.md | 4 +++ src/Translator/assets/dist/translator.d.ts | 1 + .../assets/dist/translator_controller.js | 9 ++++- src/Translator/assets/src/translator.ts | 9 +++++ src/Translator/assets/test/translator.test.ts | 36 +++++++++++++++++++ src/Translator/doc/index.rst | 21 +++++++++++ 6 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/Translator/CHANGELOG.md b/src/Translator/CHANGELOG.md index b8d13254038..789af7f2eba 100644 --- a/src/Translator/CHANGELOG.md +++ b/src/Translator/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 2.20.0 + +- Add `throwWhenNotFound` function to configure the behavior when a translation is not found. + ## 2.19.0 - Add configuration to filter dumped translations by domain. diff --git a/src/Translator/assets/dist/translator.d.ts b/src/Translator/assets/dist/translator.d.ts index 70da6bb4cbf..8d9f73e022c 100644 --- a/src/Translator/assets/dist/translator.d.ts +++ b/src/Translator/assets/dist/translator.d.ts @@ -21,6 +21,7 @@ export interface Message): void; export declare function getLocaleFallbacks(): Record; export declare function trans, D extends DomainsOf, P extends ParametersOf>(...args: P extends NoParametersType ? [message: M, parameters?: P, domain?: RemoveIntlIcuSuffix, locale?: LocaleOf] : [message: M, parameters: P, domain?: RemoveIntlIcuSuffix, locale?: LocaleOf]): string; diff --git a/src/Translator/assets/dist/translator_controller.js b/src/Translator/assets/dist/translator_controller.js index 0dbb57935fe..76292583bfb 100644 --- a/src/Translator/assets/dist/translator_controller.js +++ b/src/Translator/assets/dist/translator_controller.js @@ -220,6 +220,7 @@ function getPluralizationRule(number, locale) { let _locale = null; let _localeFallbacks = {}; +let _throwWhenNotFound = false; function setLocale(locale) { _locale = locale; } @@ -229,6 +230,9 @@ function getLocale() { document.documentElement.lang || 'en'); } +function throwWhenNotFound(enabled) { + _throwWhenNotFound = enabled; +} function setLocaleFallbacks(localeFallbacks) { _localeFallbacks = localeFallbacks; } @@ -270,7 +274,10 @@ function trans(message, parameters = {}, domain = 'messages', locale = null) { return format(translations[locale], parameters, locale); } } + if (_throwWhenNotFound) { + throw new Error(`No translation message found with id "${message.id}".`); + } return message.id; } -export { getLocale, getLocaleFallbacks, setLocale, setLocaleFallbacks, trans }; +export { getLocale, getLocaleFallbacks, setLocale, setLocaleFallbacks, throwWhenNotFound, trans }; diff --git a/src/Translator/assets/src/translator.ts b/src/Translator/assets/src/translator.ts index 78e456463b2..0da20f53590 100644 --- a/src/Translator/assets/src/translator.ts +++ b/src/Translator/assets/src/translator.ts @@ -38,6 +38,7 @@ import { format } from './formatters/formatter'; let _locale: LocaleType | null = null; let _localeFallbacks: Record = {}; +let _throwWhenNotFound = false; export function setLocale(locale: LocaleType | null) { _locale = locale; @@ -52,6 +53,10 @@ export function getLocale(): LocaleType { ); } +export function throwWhenNotFound(enabled: boolean): void { + _throwWhenNotFound = enabled; +} + export function setLocaleFallbacks(localeFallbacks: Record): void { _localeFallbacks = localeFallbacks; } @@ -162,5 +167,9 @@ export function trans< } } + if (_throwWhenNotFound) { + throw new Error(`No translation message found with id "${message.id}".`); + } + return message.id; } diff --git a/src/Translator/assets/test/translator.test.ts b/src/Translator/assets/test/translator.test.ts index 5a468044cc7..6df854a1be9 100644 --- a/src/Translator/assets/test/translator.test.ts +++ b/src/Translator/assets/test/translator.test.ts @@ -4,6 +4,7 @@ import { type NoParametersType, setLocale, setLocaleFallbacks, + throwWhenNotFound, trans, } from '../src/translator'; @@ -11,6 +12,7 @@ describe('Translator', () => { beforeEach(() => { setLocale(null); setLocaleFallbacks({}); + throwWhenNotFound(false); document.documentElement.lang = ''; document.documentElement.removeAttribute('data-symfony-ux-translator-locale'); }); @@ -387,6 +389,40 @@ describe('Translator', () => { ); }); + test('missing message should return the message id when `throwWhenNotFound` is false', () => { + throwWhenNotFound(false); + setLocale('fr'); + + const MESSAGE_IN_ANOTHER_DOMAIN: Message<{ security: { parameters: NoParametersType } }, 'en'> = { + id: 'Invalid credentials.', + translations: { + messages: { + en: 'Invalid credentials.', + }, + }, + }; + + expect(trans(MESSAGE_IN_ANOTHER_DOMAIN)).toEqual('Invalid credentials.'); + }); + + test('missing message should throw an error if `throwWhenNotFound` is true', () => { + throwWhenNotFound(true); + setLocale('fr'); + + const MESSAGE_IN_ANOTHER_DOMAIN: Message<{ security: { parameters: NoParametersType } }, 'en'> = { + id: 'Invalid credentials.', + translations: { + messages: { + en: 'Invalid credentials.', + }, + }, + }; + + expect(() => { + trans(MESSAGE_IN_ANOTHER_DOMAIN); + }).toThrow(`No translation message found with id "Invalid credentials.".`); + }); + test('message from intl domain should be prioritized over its non-intl equivalent', () => { const MESSAGE: Message< { 'messages+intl-icu': { parameters: NoParametersType }; messages: { parameters: NoParametersType } }, diff --git a/src/Translator/doc/index.rst b/src/Translator/doc/index.rst index 614f47991f7..6d194ce4a53 100644 --- a/src/Translator/doc/index.rst +++ b/src/Translator/doc/index.rst @@ -98,6 +98,27 @@ By default, the default locale is ``en`` (English) that you can configure throug #. Or with ```` attribute #. Or with ```` attribute +Detecting missing translations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default, the translator will return the translation key if the translation is missing. + +You can change this behavior by calling ``throwWhenNotFound(true)``: + +.. code-block:: diff + + // assets/translator.js + + - import { trans, getLocale, setLocale, setLocaleFallbacks } from '@symfony/ux-translator'; + + import { trans, getLocale, setLocale, setLocaleFallbacks, throwWhenNotFound } from '@symfony/ux-translator'; + import { localeFallbacks } from '../var/translations/configuration'; + + setLocaleFallbacks(localeFallbacks); + + throwWhenNotFound(true) + + export { trans } + export * from '../var/translations'; + Importing and using translations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From c29fc0196b7581296898ac3cd0db7fc3483171b4 Mon Sep 17 00:00:00 2001 From: $!m0n Date: Mon, 23 Sep 2024 08:50:54 +0200 Subject: [PATCH 57/64] Fixed typo in links to Symfony UX repo I fixed typo in the links to Symfony UX repo (before: symfony/symfony-ux). Note: I wasn't able to deal with the "version" variable. --- src/Map/doc/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Map/doc/index.rst b/src/Map/doc/index.rst index 8231ea46149..894cf8e3347 100644 --- a/src/Map/doc/index.rst +++ b/src/Map/doc/index.rst @@ -233,5 +233,5 @@ https://symfony.com/doc/current/contributing/code/bc.html .. _StimulusBundle configured in your app: https://symfony.com/bundles/StimulusBundle/current/index.html .. _`Google Maps`: https://github.com/symfony/ux-google-map .. _`Leaflet`: https://github.com/symfony/ux-leaflet-map -.. _`Symfony UX Map Google Maps brige docs`: https://github.com/symfony/symfony-ux/blob/{version}/src/Map/src/Bridge/Google/README.md -.. _`Symfony UX Map Leaflet bridge docs`: https://github.com/symfony/symfony-ux/blob/{version}/src/Map/src/Bridge/Leaflet/README.md +.. _`Symfony UX Map Google Maps brige docs`: https://github.com/symfony/ux/blob/{version}/src/Map/src/Bridge/Google/README.md +.. _`Symfony UX Map Leaflet bridge docs`: https://github.com/symfony/ux/blob/{version}/src/Map/src/Bridge/Leaflet/README.md From b234d43f50b159378e3d8feba53183dde1e33aa2 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 23 Sep 2024 17:30:16 +0200 Subject: [PATCH 58/64] [Doc] Fix some links in UX Map docs --- src/Map/doc/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Map/doc/index.rst b/src/Map/doc/index.rst index 894cf8e3347..a6d70a80d68 100644 --- a/src/Map/doc/index.rst +++ b/src/Map/doc/index.rst @@ -233,5 +233,5 @@ https://symfony.com/doc/current/contributing/code/bc.html .. _StimulusBundle configured in your app: https://symfony.com/bundles/StimulusBundle/current/index.html .. _`Google Maps`: https://github.com/symfony/ux-google-map .. _`Leaflet`: https://github.com/symfony/ux-leaflet-map -.. _`Symfony UX Map Google Maps brige docs`: https://github.com/symfony/ux/blob/{version}/src/Map/src/Bridge/Google/README.md -.. _`Symfony UX Map Leaflet bridge docs`: https://github.com/symfony/ux/blob/{version}/src/Map/src/Bridge/Leaflet/README.md +.. _`Symfony UX Map Google Maps brige docs`: https://github.com/symfony/ux/blob/2.x/src/Map/src/Bridge/Google/README.md +.. _`Symfony UX Map Leaflet bridge docs`: https://github.com/symfony/ux/blob/2.x/src/Map/src/Bridge/Leaflet/README.md From 0d1bc8b9d6e79e11d53278ea66241f7e48b6cbf6 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Mon, 23 Sep 2024 22:28:02 +0200 Subject: [PATCH 59/64] [Map] Fix Google/Leaflet bridges when using Webpack Encore --- src/Map/CHANGELOG.md | 2 + src/Map/assets/package.json | 3 +- src/Map/src/Bridge/Google/CHANGELOG.md | 7 +++ .../Google/assets/dist/map_controller.d.ts | 4 +- .../Google/assets/dist/map_controller.js | 44 ++++++++++++++++++- src/Map/src/Bridge/Google/assets/package.json | 2 +- .../Google/assets/src/map_controller.ts | 4 +- .../Bridge/Google/assets/vitest.config.mjs | 2 +- src/Map/src/Bridge/Leaflet/CHANGELOG.md | 7 +++ src/Map/src/Bridge/Leaflet/README.md | 28 ++++++++++++ .../Leaflet/assets/dist/map_controller.d.ts | 4 +- .../Leaflet/assets/dist/map_controller.js | 44 ++++++++++++++++++- .../src/Bridge/Leaflet/assets/package.json | 2 +- .../Leaflet/assets/src/map_controller.ts | 4 +- .../Bridge/Leaflet/assets/vitest.config.mjs | 2 +- 15 files changed, 141 insertions(+), 18 deletions(-) diff --git a/src/Map/CHANGELOG.md b/src/Map/CHANGELOG.md index d4894408a83..de37e53e988 100644 --- a/src/Map/CHANGELOG.md +++ b/src/Map/CHANGELOG.md @@ -7,6 +7,8 @@ - Add `ux_map` Twig function (replaces `render_map` with a more flexible interface) - Add `` Twig component +- The importmap entry `@symfony/ux-map/abstract-map-controller` can be removed + from your importmap, it is no longer needed. ## 2.19 diff --git a/src/Map/assets/package.json b/src/Map/assets/package.json index 2561ef55ef4..4cd6dd529d2 100644 --- a/src/Map/assets/package.json +++ b/src/Map/assets/package.json @@ -8,8 +8,7 @@ "types": "dist/abstract_map_controller.d.ts", "symfony": { "importmap": { - "@hotwired/stimulus": "^3.0.0", - "@symfony/ux-map/abstract-map-controller": "path:%PACKAGE%/dist/abstract_map_controller.js" + "@hotwired/stimulus": "^3.0.0" } }, "peerDependencies": { diff --git a/src/Map/src/Bridge/Google/CHANGELOG.md b/src/Map/src/Bridge/Google/CHANGELOG.md index 1d4c12f8f6a..46f7d49c2f0 100644 --- a/src/Map/src/Bridge/Google/CHANGELOG.md +++ b/src/Map/src/Bridge/Google/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## 2.20 + +### BC Breaks + +- Renamed importmap entry `@symfony/ux-google-map/map-controller` to `@symfony/ux-google-map`, + you will need to update your importmap. + ## 2.19 - Bridge added diff --git a/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts index aef508dc189..8a2d2abca23 100644 --- a/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts +++ b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts @@ -1,5 +1,5 @@ -import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; -import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; +import AbstractMapController from '@symfony/ux-map'; +import type { Point, MarkerDefinition } from '@symfony/ux-map'; import type { LoaderOptions } from '@googlemaps/js-api-loader'; type MapOptions = Pick; export default class extends AbstractMapController { diff --git a/src/Map/src/Bridge/Google/assets/dist/map_controller.js b/src/Map/src/Bridge/Google/assets/dist/map_controller.js index 5a74163291a..d35e6512d3b 100644 --- a/src/Map/src/Bridge/Google/assets/dist/map_controller.js +++ b/src/Map/src/Bridge/Google/assets/dist/map_controller.js @@ -1,8 +1,48 @@ -import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; +import { Controller } from '@hotwired/stimulus'; import { Loader } from '@googlemaps/js-api-loader'; +let default_1$1 = class default_1 extends Controller { + constructor() { + super(...arguments); + this.markers = []; + this.infoWindows = []; + } + connect() { + const { center, zoom, options, markers, fitBoundsToMarkers } = this.viewValue; + this.dispatchEvent('pre-connect', { options }); + this.map = this.doCreateMap({ center, zoom, options }); + markers.forEach((marker) => this.createMarker(marker)); + if (fitBoundsToMarkers) { + this.doFitBoundsToMarkers(); + } + this.dispatchEvent('connect', { + map: this.map, + markers: this.markers, + infoWindows: this.infoWindows, + }); + } + createMarker(definition) { + this.dispatchEvent('marker:before-create', { definition }); + const marker = this.doCreateMarker(definition); + this.dispatchEvent('marker:after-create', { marker }); + this.markers.push(marker); + return marker; + } + createInfoWindow({ definition, marker, }) { + this.dispatchEvent('info-window:before-create', { definition, marker }); + const infoWindow = this.doCreateInfoWindow({ definition, marker }); + this.dispatchEvent('info-window:after-create', { infoWindow, marker }); + this.infoWindows.push(infoWindow); + return infoWindow; + } +}; +default_1$1.values = { + providerOptions: Object, + view: Object, +}; + let _google; -class default_1 extends AbstractMapController { +class default_1 extends default_1$1 { async connect() { if (!_google) { _google = { maps: {} }; diff --git a/src/Map/src/Bridge/Google/assets/package.json b/src/Map/src/Bridge/Google/assets/package.json index e5f5ea74011..8b8dfdbc8d7 100644 --- a/src/Map/src/Bridge/Google/assets/package.json +++ b/src/Map/src/Bridge/Google/assets/package.json @@ -18,7 +18,7 @@ "importmap": { "@hotwired/stimulus": "^3.0.0", "@googlemaps/js-api-loader": "^1.16.6", - "@symfony/ux-google-map/map-controller": "path:%PACKAGE%/dist/map_controller.js" + "@symfony/ux-google-map": "path:%PACKAGE%/dist/map_controller.js" } }, "peerDependencies": { diff --git a/src/Map/src/Bridge/Google/assets/src/map_controller.ts b/src/Map/src/Bridge/Google/assets/src/map_controller.ts index 1e1a1a06473..7eed733fc9c 100644 --- a/src/Map/src/Bridge/Google/assets/src/map_controller.ts +++ b/src/Map/src/Bridge/Google/assets/src/map_controller.ts @@ -7,8 +7,8 @@ * file that was distributed with this source code. */ -import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; -import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; +import AbstractMapController from '@symfony/ux-map'; +import type { Point, MarkerDefinition } from '@symfony/ux-map'; import type { LoaderOptions } from '@googlemaps/js-api-loader'; import { Loader } from '@googlemaps/js-api-loader'; diff --git a/src/Map/src/Bridge/Google/assets/vitest.config.mjs b/src/Map/src/Bridge/Google/assets/vitest.config.mjs index dde4635d203..c957798deee 100644 --- a/src/Map/src/Bridge/Google/assets/vitest.config.mjs +++ b/src/Map/src/Bridge/Google/assets/vitest.config.mjs @@ -6,7 +6,7 @@ export default mergeConfig( defineConfig({ resolve: { alias: { - '@symfony/ux-map/abstract-map-controller': __dirname + '/../../../../assets/src/abstract_map_controller.ts', + '@symfony/ux-map': __dirname + '/../../../../assets/src/abstract_map_controller.ts', }, }, define: { diff --git a/src/Map/src/Bridge/Leaflet/CHANGELOG.md b/src/Map/src/Bridge/Leaflet/CHANGELOG.md index 1d4c12f8f6a..e380bd8e66c 100644 --- a/src/Map/src/Bridge/Leaflet/CHANGELOG.md +++ b/src/Map/src/Bridge/Leaflet/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## 2.20 + +### BC Breaks + +- Renamed importmap entry `@symfony/ux-leaflet-map/map-controller` to `@symfony/ux-leaflet-map`, + you will need to update your importmap. + ## 2.19 - Bridge added diff --git a/src/Map/src/Bridge/Leaflet/README.md b/src/Map/src/Bridge/Leaflet/README.md index 9618f9ba71b..a267776de69 100644 --- a/src/Map/src/Bridge/Leaflet/README.md +++ b/src/Map/src/Bridge/Leaflet/README.md @@ -90,6 +90,34 @@ export default class extends Controller } ``` +## Known issues + +### Unable to find `leaflet/dist/leaflet.min.css` file when using Webpack Encore + +When using Webpack Encore with the Leaflet bridge, you may encounter the following error: +``` +Module build failed: Module not found: +"./node_modules/.pnpm/file+vendor+symfony+ux-leaflet-map+assets_@hotwired+stimulus@3.0.0_leaflet@1.9.4/node_modules/@symfony/ux-leaflet-map/dist/map_controller.js" contains a reference to the file "leaflet/dist/leaflet.min.css". +This file can not be found, please check it for typos or update it if the file got moved. + +Entrypoint app = runtime.67292354.js 488.0777101a.js app.b75294ae.css app.0975a86d.js +webpack compiled with 1 error + ELIFECYCLE  Command failed with exit code 1. +``` + +That's because the Leaflet's Stimulus controller references the `leaflet/dist/leaflet.min.css` file, +which exists on [jsDelivr](https://www.jsdelivr.com/package/npm/leaflet) (used by the Symfony AssetMapper component), +but does not in the [`leaflet` npm package](https://www.npmjs.com/package/leaflet). +The correct path is `leaflet/dist/leaflet.css`, but it is not possible to fix it because it would break compatibility +with the Symfony AssetMapper component. + +As a workaround, you can configure Webpack Encore to add an alias for the `leaflet/dist/leaflet.min.css` file: +```js +Encore.addAliases({ + 'leaflet/dist/leaflet.min.css': 'leaflet/dist/leaflet.css', +}) +``` + ## Resources - [Documentation](https://symfony.com/bundles/ux-map/current/index.html) diff --git a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts index c152fb4cce6..04e533b4bd9 100644 --- a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts +++ b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts @@ -1,5 +1,5 @@ -import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; -import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; +import AbstractMapController from '@symfony/ux-map'; +import type { Point, MarkerDefinition } from '@symfony/ux-map'; import 'leaflet/dist/leaflet.min.css'; import * as L from 'leaflet'; import type { MapOptions as LeafletMapOptions, MarkerOptions, PopupOptions } from 'leaflet'; diff --git a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js index 466d40c5dce..36331506e34 100644 --- a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js +++ b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.js @@ -1,8 +1,48 @@ -import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; +import { Controller } from '@hotwired/stimulus'; import 'leaflet/dist/leaflet.min.css'; import * as L from 'leaflet'; -class map_controller extends AbstractMapController { +class default_1 extends Controller { + constructor() { + super(...arguments); + this.markers = []; + this.infoWindows = []; + } + connect() { + const { center, zoom, options, markers, fitBoundsToMarkers } = this.viewValue; + this.dispatchEvent('pre-connect', { options }); + this.map = this.doCreateMap({ center, zoom, options }); + markers.forEach((marker) => this.createMarker(marker)); + if (fitBoundsToMarkers) { + this.doFitBoundsToMarkers(); + } + this.dispatchEvent('connect', { + map: this.map, + markers: this.markers, + infoWindows: this.infoWindows, + }); + } + createMarker(definition) { + this.dispatchEvent('marker:before-create', { definition }); + const marker = this.doCreateMarker(definition); + this.dispatchEvent('marker:after-create', { marker }); + this.markers.push(marker); + return marker; + } + createInfoWindow({ definition, marker, }) { + this.dispatchEvent('info-window:before-create', { definition, marker }); + const infoWindow = this.doCreateInfoWindow({ definition, marker }); + this.dispatchEvent('info-window:after-create', { infoWindow, marker }); + this.infoWindows.push(infoWindow); + return infoWindow; + } +} +default_1.values = { + providerOptions: Object, + view: Object, +}; + +class map_controller extends default_1 { connect() { L.Marker.prototype.options.icon = L.divIcon({ html: '', diff --git a/src/Map/src/Bridge/Leaflet/assets/package.json b/src/Map/src/Bridge/Leaflet/assets/package.json index dc95b75a7b9..3dd5663a147 100644 --- a/src/Map/src/Bridge/Leaflet/assets/package.json +++ b/src/Map/src/Bridge/Leaflet/assets/package.json @@ -18,7 +18,7 @@ "importmap": { "@hotwired/stimulus": "^3.0.0", "leaflet": "^1.9.4", - "@symfony/ux-leaflet-map/map-controller": "path:%PACKAGE%/dist/map_controller.js" + "@symfony/ux-leaflet-map": "path:%PACKAGE%/dist/map_controller.js" } }, "peerDependencies": { diff --git a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts index ec6a78dd8db..3e342b77b60 100644 --- a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts +++ b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts @@ -1,5 +1,5 @@ -import AbstractMapController from '@symfony/ux-map/abstract-map-controller'; -import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; +import AbstractMapController from '@symfony/ux-map'; +import type { Point, MarkerDefinition } from '@symfony/ux-map'; import 'leaflet/dist/leaflet.min.css'; import * as L from 'leaflet'; import type { MapOptions as LeafletMapOptions, MarkerOptions, PopupOptions } from 'leaflet'; diff --git a/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs b/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs index 7072015ef3b..8fb88b882e3 100644 --- a/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs +++ b/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs @@ -6,7 +6,7 @@ export default mergeConfig( defineConfig({ resolve: { alias: { - '@symfony/ux-map/abstract-map-controller': __dirname + '/../../../../assets/src/abstract_map_controller.ts', + '@symfony/ux-map': __dirname + '/../../../../assets/src/abstract_map_controller.ts', 'leaflet/dist/leaflet.min.css': 'leaflet/dist/leaflet.css', }, }, From b3283f40536b096c86879bd24c2c4e354ba5048f Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Mon, 23 Sep 2024 22:29:39 +0200 Subject: [PATCH 60/64] [Site] Adjust importmap.php due to last changes on Map --- ux.symfony.com/importmap.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ux.symfony.com/importmap.php b/ux.symfony.com/importmap.php index af8af902954..90273c85077 100644 --- a/ux.symfony.com/importmap.php +++ b/ux.symfony.com/importmap.php @@ -190,9 +190,6 @@ 'chart.js' => [ 'version' => '4.4.3', ], - '@symfony/ux-map/abstract-map-controller' => [ - 'path' => './vendor/symfony/ux-map/assets/dist/abstract_map_controller.js', - ], 'leaflet' => [ 'version' => '1.9.4', ], @@ -200,7 +197,7 @@ 'version' => '1.9.4', 'type' => 'css', ], - '@symfony/ux-leaflet-map/map-controller' => [ + '@symfony/ux-leaflet-map' => [ 'path' => './vendor/symfony/ux-leaflet-map/assets/dist/map_controller.js', ], ]; From 86e51e102256ccbff5d9e0d2698cbf20aca145f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Tue, 24 Sep 2024 00:26:19 +0200 Subject: [PATCH 61/64] [LiveComponent] Fix DeferLiveComponentSubscriber service definition Removes two unused arguments in the service definition (DeferLiveComponentSubscriber has no constructor) --- .../src/DependencyInjection/LiveComponentExtension.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/LiveComponent/src/DependencyInjection/LiveComponentExtension.php b/src/LiveComponent/src/DependencyInjection/LiveComponentExtension.php index e79e6c5ecf9..c45b840915e 100644 --- a/src/LiveComponent/src/DependencyInjection/LiveComponentExtension.php +++ b/src/LiveComponent/src/DependencyInjection/LiveComponentExtension.php @@ -233,10 +233,6 @@ function (ChildDefinition $definition, AsLiveComponent $attribute) { ->addTag('kernel.event_subscriber'); $container->register('ux.live_component.defer_live_component_subscriber', DeferLiveComponentSubscriber::class) - ->setArguments([ - new Reference('ux.twig_component.component_stack'), - new Reference('ux.live_component.live_controller_attributes_creator'), - ]) ->addTag('kernel.event_subscriber') ; From 2f63db788fb6be80383b4a98a5f5ce99245a0d1c Mon Sep 17 00:00:00 2001 From: rrr63 Date: Sat, 14 Sep 2024 04:50:23 -0400 Subject: [PATCH 62/64] [Map] Add support for Polygons --- src/Map/CHANGELOG.md | 1 + .../assets/dist/abstract_map_controller.d.ts | 30 ++++-- .../assets/dist/abstract_map_controller.js | 20 +++- src/Map/assets/src/abstract_map_controller.ts | 59 +++++++++--- .../test/abstract_map_controller.test.ts | 92 +++++++++++++++++-- src/Map/doc/index.rst | 17 +++- .../Google/assets/dist/map_controller.d.ts | 11 ++- .../Google/assets/dist/map_controller.js | 77 ++++++++++++---- .../Google/assets/src/map_controller.ts | 85 ++++++++++++----- .../Google/assets/test/map_controller.test.ts | 2 +- .../Google/tests/GoogleRendererTest.php | 12 +-- .../Leaflet/assets/dist/map_controller.d.ts | 13 +-- .../Leaflet/assets/dist/map_controller.js | 45 ++++++--- .../Leaflet/assets/src/map_controller.ts | 44 ++++++--- .../assets/test/map_controller.test.ts | 4 +- .../Leaflet/tests/LeafletRendererTest.php | 6 +- src/Map/src/Map.php | 20 ++++ src/Map/src/Polygon.php | 70 ++++++++++++++ src/Map/src/Twig/MapRuntime.php | 6 ++ src/Map/src/Twig/UXMapComponent.php | 6 ++ src/Map/src/Twig/UXMapComponentListener.php | 2 +- src/Map/tests/MapFactoryTest.php | 54 +++++++++++ src/Map/tests/MapTest.php | 61 +++++++++++- 23 files changed, 605 insertions(+), 132 deletions(-) create mode 100644 src/Map/src/Polygon.php diff --git a/src/Map/CHANGELOG.md b/src/Map/CHANGELOG.md index de37e53e988..3883fe057d4 100644 --- a/src/Map/CHANGELOG.md +++ b/src/Map/CHANGELOG.md @@ -9,6 +9,7 @@ - Add `` Twig component - The importmap entry `@symfony/ux-map/abstract-map-controller` can be removed from your importmap, it is no longer needed. +- Add `Polygon` support ## 2.19 diff --git a/src/Map/assets/dist/abstract_map_controller.d.ts b/src/Map/assets/dist/abstract_map_controller.d.ts index 142c2f697b7..f7f9ffd8096 100644 --- a/src/Map/assets/dist/abstract_map_controller.d.ts +++ b/src/Map/assets/dist/abstract_map_controller.d.ts @@ -3,11 +3,12 @@ export type Point = { lat: number; lng: number; }; -export type MapView = { +export type MapView = { center: Point | null; zoom: number | null; fitBoundsToMarkers: boolean; markers: Array>; + polygons: Array>; options: Options; }; export type MarkerDefinition = { @@ -17,6 +18,13 @@ export type MarkerDefinition = { rawOptions?: MarkerOptions; extra: Record; }; +export type PolygonDefinition = { + infoWindow?: Omit, 'position'>; + points: Array; + title: string | null; + rawOptions?: PolygonOptions; + extra: Record; +}; export type InfoWindowDefinition = { headerContent: string | null; content: string | null; @@ -26,15 +34,16 @@ export type InfoWindowDefinition = { rawOptions?: InfoWindowOptions; extra: Record; }; -export default abstract class extends Controller { +export default abstract class extends Controller { static values: { providerOptions: ObjectConstructor; view: ObjectConstructor; }; - viewValue: MapView; + viewValue: MapView; protected map: Map; protected markers: Array; protected infoWindows: Array; + protected polygons: Array; connect(): void; protected abstract doCreateMap({ center, zoom, options, }: { center: Point | null; @@ -42,14 +51,19 @@ export default abstract class): Marker; + createPolygon(definition: PolygonDefinition): Polygon; protected abstract doCreateMarker(definition: MarkerDefinition): Marker; - protected createInfoWindow({ definition, marker, }: { - definition: MarkerDefinition['infoWindow']; - marker: Marker; + protected abstract doCreatePolygon(definition: PolygonDefinition): Polygon; + protected createInfoWindow({ definition, element, }: { + definition: MarkerDefinition['infoWindow'] | PolygonDefinition['infoWindow']; + element: Marker | Polygon; }): InfoWindow; - protected abstract doCreateInfoWindow({ definition, marker, }: { + protected abstract doCreateInfoWindow({ definition, element, }: { definition: MarkerDefinition['infoWindow']; - marker: Marker; + element: Marker; + } | { + definition: PolygonDefinition['infoWindow']; + element: Polygon; }): InfoWindow; protected abstract doFitBoundsToMarkers(): void; protected abstract dispatchEvent(name: string, payload: Record): void; diff --git a/src/Map/assets/dist/abstract_map_controller.js b/src/Map/assets/dist/abstract_map_controller.js index 9d2e3024024..83cc772e76a 100644 --- a/src/Map/assets/dist/abstract_map_controller.js +++ b/src/Map/assets/dist/abstract_map_controller.js @@ -5,18 +5,21 @@ class default_1 extends Controller { super(...arguments); this.markers = []; this.infoWindows = []; + this.polygons = []; } connect() { - const { center, zoom, options, markers, fitBoundsToMarkers } = this.viewValue; + const { center, zoom, options, markers, polygons, fitBoundsToMarkers } = this.viewValue; this.dispatchEvent('pre-connect', { options }); this.map = this.doCreateMap({ center, zoom, options }); markers.forEach((marker) => this.createMarker(marker)); + polygons.forEach((polygon) => this.createPolygon(polygon)); if (fitBoundsToMarkers) { this.doFitBoundsToMarkers(); } this.dispatchEvent('connect', { map: this.map, markers: this.markers, + polygons: this.polygons, infoWindows: this.infoWindows, }); } @@ -27,10 +30,17 @@ class default_1 extends Controller { this.markers.push(marker); return marker; } - createInfoWindow({ definition, marker, }) { - this.dispatchEvent('info-window:before-create', { definition, marker }); - const infoWindow = this.doCreateInfoWindow({ definition, marker }); - this.dispatchEvent('info-window:after-create', { infoWindow, marker }); + createPolygon(definition) { + this.dispatchEvent('polygon:before-create', { definition }); + const polygon = this.doCreatePolygon(definition); + this.dispatchEvent('polygon:after-create', { polygon }); + this.polygons.push(polygon); + return polygon; + } + createInfoWindow({ definition, element, }) { + this.dispatchEvent('info-window:before-create', { definition, element }); + const infoWindow = this.doCreateInfoWindow({ definition, element }); + this.dispatchEvent('info-window:after-create', { infoWindow, element }); this.infoWindows.push(infoWindow); return infoWindow; } diff --git a/src/Map/assets/src/abstract_map_controller.ts b/src/Map/assets/src/abstract_map_controller.ts index 802b6477875..bae763cc529 100644 --- a/src/Map/assets/src/abstract_map_controller.ts +++ b/src/Map/assets/src/abstract_map_controller.ts @@ -2,11 +2,12 @@ import { Controller } from '@hotwired/stimulus'; export type Point = { lat: number; lng: number }; -export type MapView = { +export type MapView = { center: Point | null; zoom: number | null; fitBoundsToMarkers: boolean; markers: Array>; + polygons: Array>; options: Options; }; @@ -27,6 +28,14 @@ export type MarkerDefinition = { extra: Record; }; +export type PolygonDefinition = { + infoWindow?: Omit, 'position'>; + points: Array; + title: string | null; + rawOptions?: PolygonOptions; + extra: Record; +}; + export type InfoWindowDefinition = { headerContent: string | null; content: string | null; @@ -54,20 +63,23 @@ export default abstract class< Marker, InfoWindowOptions, InfoWindow, + PolygonOptions, + Polygon, > extends Controller { static values = { providerOptions: Object, view: Object, }; - declare viewValue: MapView; + declare viewValue: MapView; protected map: Map; protected markers: Array = []; protected infoWindows: Array = []; + protected polygons: Array = []; connect() { - const { center, zoom, options, markers, fitBoundsToMarkers } = this.viewValue; + const { center, zoom, options, markers, polygons, fitBoundsToMarkers } = this.viewValue; this.dispatchEvent('pre-connect', { options }); @@ -75,6 +87,8 @@ export default abstract class< markers.forEach((marker) => this.createMarker(marker)); + polygons.forEach((polygon) => this.createPolygon(polygon)); + if (fitBoundsToMarkers) { this.doFitBoundsToMarkers(); } @@ -82,6 +96,7 @@ export default abstract class< this.dispatchEvent('connect', { map: this.map, markers: this.markers, + polygons: this.polygons, infoWindows: this.infoWindows, }); } @@ -106,18 +121,29 @@ export default abstract class< return marker; } + createPolygon(definition: PolygonDefinition): Polygon { + this.dispatchEvent('polygon:before-create', { definition }); + const polygon = this.doCreatePolygon(definition); + this.dispatchEvent('polygon:after-create', { polygon }); + this.polygons.push(polygon); + return polygon; + } + protected abstract doCreateMarker(definition: MarkerDefinition): Marker; + protected abstract doCreatePolygon(definition: PolygonDefinition): Polygon; protected createInfoWindow({ definition, - marker, + element, }: { - definition: MarkerDefinition['infoWindow']; - marker: Marker; + definition: + | MarkerDefinition['infoWindow'] + | PolygonDefinition['infoWindow']; + element: Marker | Polygon; }): InfoWindow { - this.dispatchEvent('info-window:before-create', { definition, marker }); - const infoWindow = this.doCreateInfoWindow({ definition, marker }); - this.dispatchEvent('info-window:after-create', { infoWindow, marker }); + this.dispatchEvent('info-window:before-create', { definition, element }); + const infoWindow = this.doCreateInfoWindow({ definition, element }); + this.dispatchEvent('info-window:after-create', { infoWindow, element }); this.infoWindows.push(infoWindow); @@ -126,11 +152,16 @@ export default abstract class< protected abstract doCreateInfoWindow({ definition, - marker, - }: { - definition: MarkerDefinition['infoWindow']; - marker: Marker; - }): InfoWindow; + element, + }: + | { + definition: MarkerDefinition['infoWindow']; + element: Marker; + } + | { + definition: PolygonDefinition['infoWindow']; + element: Polygon; + }): InfoWindow; protected abstract doFitBoundsToMarkers(): void; diff --git a/src/Map/assets/test/abstract_map_controller.test.ts b/src/Map/assets/test/abstract_map_controller.test.ts index 0beadef2ee2..c9e0e38aeba 100644 --- a/src/Map/assets/test/abstract_map_controller.test.ts +++ b/src/Map/assets/test/abstract_map_controller.test.ts @@ -20,14 +20,28 @@ class MyMapController extends AbstractMapController { const marker = { marker: 'marker', title: definition.title }; if (definition.infoWindow) { - this.createInfoWindow({ definition: definition.infoWindow, marker }); + this.createInfoWindow({ definition: definition.infoWindow, element: marker }); } return marker; } - doCreateInfoWindow({ definition, marker }) { - return { infoWindow: 'infoWindow', headerContent: definition.headerContent, marker: marker.title }; + doCreatePolygon(definition) { + const polygon = { polygon: 'polygon', title: definition.title }; + + if (definition.infoWindow) { + this.createInfoWindow({ definition: definition.infoWindow, element: polygon }); + } + return polygon; + } + + doCreateInfoWindow({ definition, element }) { + if (element.marker) { + return { infoWindow: 'infoWindow', headerContent: definition.headerContent, marker: element.title }; + } + if (element.polygon) { + return { infoWindow: 'infoWindow', headerContent: definition.headerContent, polygon: element.title }; + } } doFitBoundsToMarkers() { @@ -47,12 +61,61 @@ describe('AbstractMapController', () => { beforeEach(() => { container = mountDOM(`
    + data-testid="map" + data-controller="map" + style="height: 700px; margin: 10px;" + data-map-provider-options-value="{}" + data-map-view-value='{ + "center": { "lat": 48.8566, "lng": 2.3522 }, + "zoom": 4, + "fitBoundsToMarkers": true, + "options": {}, + "markers": [ + { + "position": { "lat": 48.8566, "lng": 2.3522 }, + "title": "Paris", + "infoWindow": null + }, + { + "position": { "lat": 45.764, "lng": 4.8357 }, + "title": "Lyon", + "infoWindow": { + "headerContent": "Lyon", + "content": "The French town in the historic Rhône-Alpes region, located at the junction of the Rhône and Saône rivers.", + "position": null, + "opened": false, + "autoClose": true + } + } + ], + "polygons": [ + { + "coordinates": [ + { "lat": 48.858844, "lng": 2.294351 }, + { "lat": 48.853, "lng": 2.3499 }, + { "lat": 48.8566, "lng": 2.3522 } + ], + "title": "Polygon 1", + "infoWindow": null + }, + { + "coordinates": [ + { "lat": 45.764043, "lng": 4.835659 }, + { "lat": 45.750000, "lng": 4.850000 }, + { "lat": 45.770000, "lng": 4.820000 } + ], + "title": "Polygon 2", + "infoWindow": { + "headerContent": "Polygon 2", + "content": "A polygon around Lyon with some additional info.", + "position": null, + "opened": false, + "autoClose": true + } + } + ] + }'> +
    `); }); @@ -60,7 +123,7 @@ describe('AbstractMapController', () => { clearDOM(); }); - it('connect and create map, marker and info window', async () => { + it('connect and create map, marker, polygon and info window', async () => { const div = getByTestId(container, 'map'); expect(div).not.toHaveClass('connected'); @@ -73,12 +136,21 @@ describe('AbstractMapController', () => { { marker: 'marker', title: 'Paris' }, { marker: 'marker', title: 'Lyon' }, ]); + expect(controller.polygons).toEqual([ + { polygon: 'polygon', title: 'Polygon 1' }, + { polygon: 'polygon', title: 'Polygon 2' }, + ]); expect(controller.infoWindows).toEqual([ { headerContent: 'Lyon', infoWindow: 'infoWindow', marker: 'Lyon', }, + { + headerContent: 'Polygon 2', + infoWindow: 'infoWindow', + polygon: 'Polygon 2', + }, ]); }); }); diff --git a/src/Map/doc/index.rst b/src/Map/doc/index.rst index a6d70a80d68..be16614c0ed 100644 --- a/src/Map/doc/index.rst +++ b/src/Map/doc/index.rst @@ -118,8 +118,21 @@ A map is created by calling ``new Map()``. You can configure the center, zoom, a ), ) ; - - // 3. And inject the map in your template to render it + + // 3. You can also add Polygons, which represents an area enclosed by a series of `Point` instances + $map->addPolygon(new Polygon( + points: [ + new Point(48.8566, 2.3522), + new Point(45.7640, 4.8357), + new Point(43.2965, 5.3698), + new Point(44.8378, -0.5792), + ], + infoWindow: new InfoWindow( + content: 'Paris, Lyon, Marseille, Bordeaux', + ), + )); + + // 4. And inject the map in your template to render it return $this->render('contact/index.html.twig', [ 'my_map' => $myMap, ]); diff --git a/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts index 8a2d2abca23..5095762fc07 100644 --- a/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts +++ b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts @@ -1,8 +1,8 @@ import AbstractMapController from '@symfony/ux-map'; -import type { Point, MarkerDefinition } from '@symfony/ux-map'; +import type { Point, MarkerDefinition, PolygonDefinition } from '@symfony/ux-map'; import type { LoaderOptions } from '@googlemaps/js-api-loader'; type MapOptions = Pick; -export default class extends AbstractMapController { +export default class extends AbstractMapController { static values: { providerOptions: ObjectConstructor; }; @@ -15,9 +15,10 @@ export default class extends AbstractMapController): google.maps.marker.AdvancedMarkerElement; - protected doCreateInfoWindow({ definition, marker, }: { - definition: MarkerDefinition['infoWindow']; - marker: google.maps.marker.AdvancedMarkerElement; + protected doCreatePolygon(definition: PolygonDefinition): google.maps.Polygon; + protected doCreateInfoWindow({ definition, element, }: { + definition: MarkerDefinition['infoWindow'] | PolygonDefinition['infoWindow']; + element: google.maps.marker.AdvancedMarkerElement | google.maps.Polygon; }): google.maps.InfoWindow; private createTextOrElement; private closeInfoWindowsExcept; diff --git a/src/Map/src/Bridge/Google/assets/dist/map_controller.js b/src/Map/src/Bridge/Google/assets/dist/map_controller.js index d35e6512d3b..30fbe283118 100644 --- a/src/Map/src/Bridge/Google/assets/dist/map_controller.js +++ b/src/Map/src/Bridge/Google/assets/dist/map_controller.js @@ -6,18 +6,21 @@ let default_1$1 = class default_1 extends Controller { super(...arguments); this.markers = []; this.infoWindows = []; + this.polygons = []; } connect() { - const { center, zoom, options, markers, fitBoundsToMarkers } = this.viewValue; + const { center, zoom, options, markers, polygons, fitBoundsToMarkers } = this.viewValue; this.dispatchEvent('pre-connect', { options }); this.map = this.doCreateMap({ center, zoom, options }); markers.forEach((marker) => this.createMarker(marker)); + polygons.forEach((polygon) => this.createPolygon(polygon)); if (fitBoundsToMarkers) { this.doFitBoundsToMarkers(); } this.dispatchEvent('connect', { map: this.map, markers: this.markers, + polygons: this.polygons, infoWindows: this.infoWindows, }); } @@ -28,10 +31,17 @@ let default_1$1 = class default_1 extends Controller { this.markers.push(marker); return marker; } - createInfoWindow({ definition, marker, }) { - this.dispatchEvent('info-window:before-create', { definition, marker }); - const infoWindow = this.doCreateInfoWindow({ definition, marker }); - this.dispatchEvent('info-window:after-create', { infoWindow, marker }); + createPolygon(definition) { + this.dispatchEvent('polygon:before-create', { definition }); + const polygon = this.doCreatePolygon(definition); + this.dispatchEvent('polygon:after-create', { polygon }); + this.polygons.push(polygon); + return polygon; + } + createInfoWindow({ definition, element, }) { + this.dispatchEvent('info-window:before-create', { definition, element }); + const infoWindow = this.doCreateInfoWindow({ definition, element }); + this.dispatchEvent('info-window:after-create', { infoWindow, element }); this.infoWindows.push(infoWindow); return infoWindow; } @@ -92,11 +102,26 @@ class default_1 extends default_1$1 { map: this.map, }); if (infoWindow) { - this.createInfoWindow({ definition: infoWindow, marker }); + this.createInfoWindow({ definition: infoWindow, element: marker }); } return marker; } - doCreateInfoWindow({ definition, marker, }) { + doCreatePolygon(definition) { + const { points, title, infoWindow, rawOptions = {} } = definition; + const polygon = new _google.maps.Polygon({ + ...rawOptions, + paths: points, + map: this.map, + }); + if (title) { + polygon.set('title', title); + } + if (infoWindow) { + this.createInfoWindow({ definition: infoWindow, element: polygon }); + } + return polygon; + } + doCreateInfoWindow({ definition, element, }) { const { headerContent, content, extra, rawOptions = {}, ...otherOptions } = definition; const infoWindow = new _google.maps.InfoWindow({ headerContent: this.createTextOrElement(headerContent), @@ -104,22 +129,34 @@ class default_1 extends default_1$1 { ...otherOptions, ...rawOptions, }); - if (definition.opened) { - infoWindow.open({ - map: this.map, - shouldFocus: false, - anchor: marker, + if (element instanceof google.maps.marker.AdvancedMarkerElement) { + element.addListener('click', () => { + if (definition.autoClose) { + this.closeInfoWindowsExcept(infoWindow); + } + infoWindow.open({ map: this.map, anchor: element }); }); - } - marker.addListener('click', () => { - if (definition.autoClose) { - this.closeInfoWindowsExcept(infoWindow); + if (definition.opened) { + infoWindow.open({ map: this.map, anchor: element }); } - infoWindow.open({ - map: this.map, - anchor: marker, + } + else if (element instanceof google.maps.Polygon) { + element.addListener('click', (event) => { + if (definition.autoClose) { + this.closeInfoWindowsExcept(infoWindow); + } + infoWindow.setPosition(event.latLng); + infoWindow.open(this.map); }); - }); + if (definition.opened) { + const bounds = new google.maps.LatLngBounds(); + element.getPath().forEach((point) => { + bounds.extend(point); + }); + infoWindow.setPosition(bounds.getCenter()); + infoWindow.open({ map: this.map, anchor: element }); + } + } return infoWindow; } createTextOrElement(content) { diff --git a/src/Map/src/Bridge/Google/assets/src/map_controller.ts b/src/Map/src/Bridge/Google/assets/src/map_controller.ts index 7eed733fc9c..05116d80253 100644 --- a/src/Map/src/Bridge/Google/assets/src/map_controller.ts +++ b/src/Map/src/Bridge/Google/assets/src/map_controller.ts @@ -8,7 +8,7 @@ */ import AbstractMapController from '@symfony/ux-map'; -import type { Point, MarkerDefinition } from '@symfony/ux-map'; +import type { Point, MarkerDefinition, PolygonDefinition } from '@symfony/ux-map'; import type { LoaderOptions } from '@googlemaps/js-api-loader'; import { Loader } from '@googlemaps/js-api-loader'; @@ -33,8 +33,12 @@ let _google: typeof google; export default class extends AbstractMapController< MapOptions, google.maps.Map, + google.maps.marker.AdvancedMarkerElementOptions, google.maps.marker.AdvancedMarkerElement, - google.maps.InfoWindow + google.maps.InfoWindowOptions, + google.maps.InfoWindow, + google.maps.PolygonOptions, + google.maps.Polygon > { static values = { providerOptions: Object, @@ -121,21 +125,45 @@ export default class extends AbstractMapController< }); if (infoWindow) { - this.createInfoWindow({ definition: infoWindow, marker }); + this.createInfoWindow({ definition: infoWindow, element: marker }); } return marker; } + protected doCreatePolygon( + definition: PolygonDefinition + ): google.maps.Polygon { + const { points, title, infoWindow, rawOptions = {} } = definition; + + const polygon = new _google.maps.Polygon({ + ...rawOptions, + paths: points, + map: this.map, + }); + + if (title) { + polygon.set('title', title); + } + + if (infoWindow) { + this.createInfoWindow({ definition: infoWindow, element: polygon }); + } + + return polygon; + } + protected doCreateInfoWindow({ definition, - marker, + element, }: { - definition: MarkerDefinition< - google.maps.marker.AdvancedMarkerElementOptions, - google.maps.InfoWindowOptions - >['infoWindow']; - marker: google.maps.marker.AdvancedMarkerElement; + definition: + | MarkerDefinition< + google.maps.marker.AdvancedMarkerElementOptions, + google.maps.InfoWindowOptions + >['infoWindow'] + | PolygonDefinition['infoWindow']; + element: google.maps.marker.AdvancedMarkerElement | google.maps.Polygon; }): google.maps.InfoWindow { const { headerContent, content, extra, rawOptions = {}, ...otherOptions } = definition; @@ -146,24 +174,35 @@ export default class extends AbstractMapController< ...rawOptions, }); - if (definition.opened) { - infoWindow.open({ - map: this.map, - shouldFocus: false, - anchor: marker, + if (element instanceof google.maps.marker.AdvancedMarkerElement) { + element.addListener('click', () => { + if (definition.autoClose) { + this.closeInfoWindowsExcept(infoWindow); + } + infoWindow.open({ map: this.map, anchor: element }); }); - } - marker.addListener('click', () => { - if (definition.autoClose) { - this.closeInfoWindowsExcept(infoWindow); + if (definition.opened) { + infoWindow.open({ map: this.map, anchor: element }); } - - infoWindow.open({ - map: this.map, - anchor: marker, + } else if (element instanceof google.maps.Polygon) { + element.addListener('click', (event: any) => { + if (definition.autoClose) { + this.closeInfoWindowsExcept(infoWindow); + } + infoWindow.setPosition(event.latLng); + infoWindow.open(this.map); }); - }); + + if (definition.opened) { + const bounds = new google.maps.LatLngBounds(); + element.getPath().forEach((point: google.maps.LatLng) => { + bounds.extend(point); + }); + infoWindow.setPosition(bounds.getCenter()); + infoWindow.open({ map: this.map, anchor: element }); + } + } return infoWindow; } diff --git a/src/Map/src/Bridge/Google/assets/test/map_controller.test.ts b/src/Map/src/Bridge/Google/assets/test/map_controller.test.ts index 1db8edfff7b..f1b08abba5c 100644 --- a/src/Map/src/Bridge/Google/assets/test/map_controller.test.ts +++ b/src/Map/src/Bridge/Google/assets/test/map_controller.test.ts @@ -41,7 +41,7 @@ describe('GoogleMapsController', () => { data-controller="check google" style="height: 700px; margin: 10px" data-google-provider-options-value="{"version":"weekly","libraries":["maps","marker"],"apiKey":""}" - data-google-view-value="{"center":{"lat":48.8566,"lng":2.3522},"zoom":4,"fitBoundsToMarkers":true,"options":{"mapId":"YOUR_MAP_ID","gestureHandling":"auto","backgroundColor":null,"disableDoubleClickZoom":false,"zoomControl":true,"zoomControlOptions":{"position":22},"mapTypeControl":true,"mapTypeControlOptions":{"mapTypeIds":[],"position":14,"style":0},"streetViewControl":true,"streetViewControlOptions":{"position":22},"fullscreenControl":true,"fullscreenControlOptions":{"position":20}},"markers":[{"position":{"lat":48.8566,"lng":2.3522},"title":"Paris","infoWindow":null},{"position":{"lat":45.764,"lng":4.8357},"title":"Lyon","infoWindow":{"headerContent":"<b>Lyon<\/b>","content":"The French town in the historic Rh\u00f4ne-Alpes region, located at the junction of the Rh\u00f4ne and Sa\u00f4ne rivers.","position":null,"opened":false,"autoClose":true}}]}" + data-google-view-value="{"center":{"lat":48.8566,"lng":2.3522},"zoom":4,"fitBoundsToMarkers":true,"options":{"mapId":"YOUR_MAP_ID","gestureHandling":"auto","backgroundColor":null,"disableDoubleClickZoom":false,"zoomControl":true,"zoomControlOptions":{"position":22},"mapTypeControl":true,"mapTypeControlOptions":{"mapTypeIds":[],"position":14,"style":0},"streetViewControl":true,"streetViewControlOptions":{"position":22},"fullscreenControl":true,"fullscreenControlOptions":{"position":20}},"markers":[{"position":{"lat":48.8566,"lng":2.3522},"title":"Paris","infoWindow":null},{"position":{"lat":45.764,"lng":4.8357},"title":"Lyon","infoWindow":{"headerContent":"<b>Lyon<\/b>","content":"The French town in the historic Rh\u00f4ne-Alpes region, located at the junction of the Rh\u00f4ne and Sa\u00f4ne rivers.","position":null,"opened":false,"autoClose":true}}],"polygons":[]}" > `); }); diff --git a/src/Map/src/Bridge/Google/tests/GoogleRendererTest.php b/src/Map/src/Bridge/Google/tests/GoogleRendererTest.php index db011e30998..32ca96df600 100644 --- a/src/Map/src/Bridge/Google/tests/GoogleRendererTest.php +++ b/src/Map/src/Bridge/Google/tests/GoogleRendererTest.php @@ -29,26 +29,26 @@ public function provideTestRenderMap(): iterable ->zoom(12); yield 'simple map, with minimum options' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new GoogleRenderer(new StimulusHelper(null), apiKey: 'api_key'), 'map' => $map, ]; yield 'with every options' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new GoogleRenderer(new StimulusHelper(null), apiKey: 'api_key', id: 'gmap', language: 'fr', region: 'FR', nonce: 'abcd', retries: 10, url: 'https://maps.googleapis.com/maps/api/js', version: 'quarterly'), 'map' => $map, ]; yield 'with custom attributes' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new GoogleRenderer(new StimulusHelper(null), apiKey: 'api_key'), 'map' => $map, 'attributes' => ['data-controller' => 'my-custom-controller', 'class' => 'map'], ]; yield 'with markers and infoWindows' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new GoogleRenderer(new StimulusHelper(null), apiKey: 'api_key'), 'map' => (clone $map) ->addMarker(new Marker(new Point(48.8566, 2.3522), 'Paris')) @@ -56,7 +56,7 @@ public function provideTestRenderMap(): iterable ]; yield 'with controls enabled' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new GoogleRenderer(new StimulusHelper(null), apiKey: 'api_key'), 'map' => (clone $map) ->options(new GoogleOptions( @@ -68,7 +68,7 @@ public function provideTestRenderMap(): iterable ]; yield 'without controls enabled' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new GoogleRenderer(new StimulusHelper(null), apiKey: 'api_key'), 'map' => (clone $map) ->options(new GoogleOptions( diff --git a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts index 04e533b4bd9..6b32a8df45b 100644 --- a/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts +++ b/src/Map/src/Bridge/Leaflet/assets/dist/map_controller.d.ts @@ -1,8 +1,8 @@ import AbstractMapController from '@symfony/ux-map'; -import type { Point, MarkerDefinition } from '@symfony/ux-map'; +import type { Point, MarkerDefinition, PolygonDefinition } from '@symfony/ux-map'; import 'leaflet/dist/leaflet.min.css'; import * as L from 'leaflet'; -import type { MapOptions as LeafletMapOptions, MarkerOptions, PopupOptions } from 'leaflet'; +import type { MapOptions as LeafletMapOptions, MarkerOptions, PopupOptions, PolygonOptions } from 'leaflet'; type MapOptions = Pick & { tileLayer: { url: string; @@ -10,7 +10,7 @@ type MapOptions = Pick & { options: Record; }; }; -export default class extends AbstractMapController { +export default class extends AbstractMapController { connect(): void; protected dispatchEvent(name: string, payload?: Record): void; protected doCreateMap({ center, zoom, options, }: { @@ -19,9 +19,10 @@ export default class extends AbstractMapController this.createMarker(marker)); + polygons.forEach((polygon) => this.createPolygon(polygon)); if (fitBoundsToMarkers) { this.doFitBoundsToMarkers(); } this.dispatchEvent('connect', { map: this.map, markers: this.markers, + polygons: this.polygons, infoWindows: this.infoWindows, }); } @@ -29,10 +32,17 @@ class default_1 extends Controller { this.markers.push(marker); return marker; } - createInfoWindow({ definition, marker, }) { - this.dispatchEvent('info-window:before-create', { definition, marker }); - const infoWindow = this.doCreateInfoWindow({ definition, marker }); - this.dispatchEvent('info-window:after-create', { infoWindow, marker }); + createPolygon(definition) { + this.dispatchEvent('polygon:before-create', { definition }); + const polygon = this.doCreatePolygon(definition); + this.dispatchEvent('polygon:after-create', { polygon }); + this.polygons.push(polygon); + return polygon; + } + createInfoWindow({ definition, element, }) { + this.dispatchEvent('info-window:before-create', { definition, element }); + const infoWindow = this.doCreateInfoWindow({ definition, element }); + this.dispatchEvent('info-window:after-create', { infoWindow, element }); this.infoWindows.push(infoWindow); return infoWindow; } @@ -78,19 +88,30 @@ class map_controller extends default_1 { const { position, title, infoWindow, extra, rawOptions = {}, ...otherOptions } = definition; const marker = L.marker(position, { title, ...otherOptions, ...rawOptions }).addTo(this.map); if (infoWindow) { - this.createInfoWindow({ definition: infoWindow, marker }); + this.createInfoWindow({ definition: infoWindow, element: marker }); } return marker; } - doCreateInfoWindow({ definition, marker, }) { - const { headerContent, content, extra, rawOptions = {}, ...otherOptions } = definition; - marker.bindPopup([headerContent, content].filter((x) => x).join('
    '), { ...otherOptions, ...rawOptions }); + doCreatePolygon(definition) { + const { points, title, infoWindow, rawOptions = {} } = definition; + const polygon = L.polygon(points, { ...rawOptions }).addTo(this.map); + if (title) { + polygon.bindPopup(title); + } + if (infoWindow) { + this.createInfoWindow({ definition: infoWindow, element: polygon }); + } + return polygon; + } + doCreateInfoWindow({ definition, element, }) { + const { headerContent, content, rawOptions = {}, ...otherOptions } = definition; + element.bindPopup([headerContent, content].filter((x) => x).join('
    '), { ...otherOptions, ...rawOptions }); if (definition.opened) { - marker.openPopup(); + element.openPopup(); } - const popup = marker.getPopup(); + const popup = element.getPopup(); if (!popup) { - throw new Error('Unable to get the Popup associated to the Marker, this should not happens.'); + throw new Error('Unable to get the Popup associated with the element.'); } return popup; } diff --git a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts index 3e342b77b60..12ed1f2922f 100644 --- a/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts +++ b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts @@ -1,8 +1,8 @@ import AbstractMapController from '@symfony/ux-map'; -import type { Point, MarkerDefinition } from '@symfony/ux-map'; +import type { Point, MarkerDefinition, PolygonDefinition } from '@symfony/ux-map'; import 'leaflet/dist/leaflet.min.css'; import * as L from 'leaflet'; -import type { MapOptions as LeafletMapOptions, MarkerOptions, PopupOptions } from 'leaflet'; +import type { MapOptions as LeafletMapOptions, MarkerOptions, PopupOptions, PolygonOptions } from 'leaflet'; type MapOptions = Pick & { tileLayer: { url: string; attribution: string; options: Record }; @@ -13,8 +13,10 @@ export default class extends AbstractMapController< typeof L.Map, MarkerOptions, typeof L.Marker, + PopupOptions, typeof L.Popup, - PopupOptions + PolygonOptions, + typeof L.Polygon > { connect(): void { L.Marker.prototype.options.icon = L.divIcon({ @@ -63,30 +65,48 @@ export default class extends AbstractMapController< const marker = L.marker(position, { title, ...otherOptions, ...rawOptions }).addTo(this.map); if (infoWindow) { - this.createInfoWindow({ definition: infoWindow, marker }); + this.createInfoWindow({ definition: infoWindow, element: marker }); } return marker; } + protected doCreatePolygon(definition: PolygonDefinition): L.Polygon { + const { points, title, infoWindow, rawOptions = {} } = definition; + + const polygon = L.polygon(points, { ...rawOptions }).addTo(this.map); + + if (title) { + polygon.bindPopup(title); + } + + if (infoWindow) { + this.createInfoWindow({ definition: infoWindow, element: polygon }); + } + + return polygon; + } + protected doCreateInfoWindow({ definition, - marker, + element, }: { - definition: MarkerDefinition['infoWindow']; - marker: L.Marker; + definition: MarkerDefinition['infoWindow'] | PolygonDefinition['infoWindow']; + element: L.Marker | L.Polygon; }): L.Popup { - const { headerContent, content, extra, rawOptions = {}, ...otherOptions } = definition; + const { headerContent, content, rawOptions = {}, ...otherOptions } = definition; + + element.bindPopup([headerContent, content].filter((x) => x).join('
    '), { ...otherOptions, ...rawOptions }); - marker.bindPopup([headerContent, content].filter((x) => x).join('
    '), { ...otherOptions, ...rawOptions }); if (definition.opened) { - marker.openPopup(); + element.openPopup(); } - const popup = marker.getPopup(); + const popup = element.getPopup(); if (!popup) { - throw new Error('Unable to get the Popup associated to the Marker, this should not happens.'); + throw new Error('Unable to get the Popup associated with the element.'); } + return popup; } diff --git a/src/Map/src/Bridge/Leaflet/assets/test/map_controller.test.ts b/src/Map/src/Bridge/Leaflet/assets/test/map_controller.test.ts index e6aa9276e27..5a51bf5f8a0 100644 --- a/src/Map/src/Bridge/Leaflet/assets/test/map_controller.test.ts +++ b/src/Map/src/Bridge/Leaflet/assets/test/map_controller.test.ts @@ -36,12 +36,12 @@ describe('LeafletController', () => { beforeEach(() => { container = mountDOM(` -
    `); }); diff --git a/src/Map/src/Bridge/Leaflet/tests/LeafletRendererTest.php b/src/Map/src/Bridge/Leaflet/tests/LeafletRendererTest.php index 6931f53abf6..d9ad391ca15 100644 --- a/src/Map/src/Bridge/Leaflet/tests/LeafletRendererTest.php +++ b/src/Map/src/Bridge/Leaflet/tests/LeafletRendererTest.php @@ -28,20 +28,20 @@ public function provideTestRenderMap(): iterable ->zoom(12); yield 'simple map' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new LeafletRenderer(new StimulusHelper(null)), 'map' => $map, ]; yield 'with custom attributes' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new LeafletRenderer(new StimulusHelper(null)), 'map' => $map, 'attributes' => ['data-controller' => 'my-custom-controller', 'class' => 'map'], ]; yield 'with markers and infoWindows' => [ - 'expected_render' => '
    ', + 'expected_render' => '
    ', 'renderer' => new LeafletRenderer(new StimulusHelper(null)), 'map' => (clone $map) ->addMarker(new Marker(new Point(48.8566, 2.3522), 'Paris')) diff --git a/src/Map/src/Map.php b/src/Map/src/Map.php index d8fdf005e56..3ab240ae1e2 100644 --- a/src/Map/src/Map.php +++ b/src/Map/src/Map.php @@ -30,6 +30,11 @@ public function __construct( * @var array */ private array $markers = [], + + /** + * @var array + */ + private array $polygons = [], ) { } @@ -83,6 +88,13 @@ public function addMarker(Marker $marker): self return $this; } + public function addPolygon(Polygon $polygon): self + { + $this->polygons[] = $polygon; + + return $this; + } + public function toArray(): array { if (!$this->fitBoundsToMarkers) { @@ -101,6 +113,7 @@ public function toArray(): array 'fitBoundsToMarkers' => $this->fitBoundsToMarkers, 'options' => (object) ($this->options?->toArray() ?? []), 'markers' => array_map(static fn (Marker $marker) => $marker->toArray(), $this->markers), + 'polygons' => array_map(static fn (Polygon $polygon) => $polygon->toArray(), $this->polygons), ]; } @@ -109,6 +122,7 @@ public function toArray(): array * center?: array{lat: float, lng: float}, * zoom?: float, * markers?: list, + * polygons?: list, * fitBoundsToMarkers?: bool, * options?: object, * } $map @@ -133,6 +147,12 @@ public static function fromArray(array $map): self } $map['markers'] = array_map(Marker::fromArray(...), $map['markers']); + $map['polygons'] ??= []; + if (!\is_array($map['polygons'])) { + throw new InvalidArgumentException('The "polygons" parameter must be an array.'); + } + $map['polygons'] = array_map(Polygon::fromArray(...), $map['polygons']); + return new self(...$map); } } diff --git a/src/Map/src/Polygon.php b/src/Map/src/Polygon.php new file mode 100644 index 00000000000..5d474346e7d --- /dev/null +++ b/src/Map/src/Polygon.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\Map; + +use Symfony\UX\Map\Exception\InvalidArgumentException; + +/** + * Represents a polygon on a map. + * + * @author [Pierre Svgnt] + */ +final readonly class Polygon +{ + /** + * @param array $extra Extra data, can be used by the developer to store additional information and use them later JavaScript side + */ + public function __construct( + private array $points, + private ?string $title = null, + private ?InfoWindow $infoWindow = null, + private array $extra = [], + ) { + } + + /** + * Convert the polygon to an array representation. + */ + public function toArray(): array + { + return [ + 'points' => array_map(fn (Point $point) => $point->toArray(), $this->points), + 'title' => $this->title, + 'infoWindow' => $this->infoWindow?->toArray(), + 'extra' => (object) $this->extra, + ]; + } + + /** + * @param array{ + * points: array, + * title: string|null, + * infoWindow: array|null, + * extra: object, + * } $polygon + * + * @internal + */ + public static function fromArray(array $polygon): self + { + if (!isset($polygon['points'])) { + throw new InvalidArgumentException('The "points" parameter is required.'); + } + $polygon['points'] = array_map(Point::fromArray(...), $polygon['points']); + + if (isset($polygon['infoWindow'])) { + $polygon['infoWindow'] = InfoWindow::fromArray($polygon['infoWindow']); + } + + return new self(...$polygon); + } +} diff --git a/src/Map/src/Twig/MapRuntime.php b/src/Map/src/Twig/MapRuntime.php index 62e50be86da..cfb47560bd2 100644 --- a/src/Map/src/Twig/MapRuntime.php +++ b/src/Map/src/Twig/MapRuntime.php @@ -14,6 +14,7 @@ use Symfony\UX\Map\Map; use Symfony\UX\Map\Marker; use Symfony\UX\Map\Point; +use Symfony\UX\Map\Polygon; use Symfony\UX\Map\Renderer\RendererInterface; use Twig\Extension\RuntimeExtensionInterface; @@ -32,11 +33,13 @@ public function __construct( /** * @param array $attributes * @param array $markers + * @param array $polygons */ public function renderMap( ?Map $map = null, array $attributes = [], ?array $markers = null, + ?array $polygons = null, ?array $center = null, ?float $zoom = null, ): string { @@ -52,6 +55,9 @@ public function renderMap( foreach ($markers ?? [] as $marker) { $map->addMarker(Marker::fromArray($marker)); } + foreach ($polygons ?? [] as $polygons) { + $map->addPolygon(Polygon::fromArray($polygons)); + } if (null !== $center) { $map->center(Point::fromArray($center)); } diff --git a/src/Map/src/Twig/UXMapComponent.php b/src/Map/src/Twig/UXMapComponent.php index 94cb6407e8f..39e362b34b9 100644 --- a/src/Map/src/Twig/UXMapComponent.php +++ b/src/Map/src/Twig/UXMapComponent.php @@ -13,6 +13,7 @@ use Symfony\UX\Map\Marker; use Symfony\UX\Map\Point; +use Symfony\UX\Map\Polygon; /** * @author Simon André @@ -29,4 +30,9 @@ final class UXMapComponent * @var Marker[] */ public array $markers; + + /** + * @var Polygon[] + */ + public array $polygons; } diff --git a/src/Map/src/Twig/UXMapComponentListener.php b/src/Map/src/Twig/UXMapComponentListener.php index 3a36e5587da..51034c53b4d 100644 --- a/src/Map/src/Twig/UXMapComponentListener.php +++ b/src/Map/src/Twig/UXMapComponentListener.php @@ -32,7 +32,7 @@ public function onPreCreateForRender(PreCreateForRenderEvent $event): void } $attributes = $event->getInputProps(); - $map = array_intersect_key($attributes, ['markers' => 0, 'center' => 1, 'zoom' => 2]); + $map = array_intersect_key($attributes, ['markers' => 0, 'polygons' => 0, 'center' => 1, 'zoom' => 2]); $attributes = array_diff_key($attributes, $map); $html = $this->mapRuntime->renderMap(...$map, attributes: $attributes); diff --git a/src/Map/tests/MapFactoryTest.php b/src/Map/tests/MapFactoryTest.php index a19e2d7996c..fcff3b0539c 100644 --- a/src/Map/tests/MapFactoryTest.php +++ b/src/Map/tests/MapFactoryTest.php @@ -32,6 +32,13 @@ public function testFromArray(): void $this->assertSame($array['markers'][0]['title'], $markers[0]['title']); $this->assertSame($array['markers'][0]['infoWindow']['headerContent'], $markers[0]['infoWindow']['headerContent']); $this->assertSame($array['markers'][0]['infoWindow']['content'], $markers[0]['infoWindow']['content']); + + $this->assertCount(1, $polygons = $map->toArray()['polygons']); + $this->assertEquals($array['polygons'][0]['points'], $polygons[0]['points']); + $this->assertEquals($array['polygons'][0]['points'], $polygons[0]['points']); + $this->assertSame($array['polygons'][0]['title'], $polygons[0]['title']); + $this->assertSame($array['polygons'][0]['infoWindow']['headerContent'], $polygons[0]['infoWindow']['headerContent']); + $this->assertSame($array['polygons'][0]['infoWindow']['content'], $polygons[0]['infoWindow']['content']); } public function testFromArrayWithInvalidCenter(): void @@ -76,6 +83,30 @@ public function testFromArrayWithInvalidMarker(): void Map::fromArray($array); } + public function testFromArrayWithInvalidPolygons(): void + { + $array = self::createMapArray(); + $array['polygons'] = 'invalid'; + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The "polygons" parameter must be an array.'); + Map::fromArray($array); + } + + public function testFromArrayWithInvalidPolygon(): void + { + $array = self::createMapArray(); + $array['polygons'] = [ + [ + 'invalid', + ], + ]; + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The "points" parameter is required.'); + Map::fromArray($array); + } + private static function createMapArray(): array { return [ @@ -97,6 +128,29 @@ private static function createMapArray(): array ], ], ], + 'polygons' => [ + [ + 'points' => [ + [ + 'lat' => 48.858844, + 'lng' => 2.294351, + ], + [ + 'lat' => 48.853, + 'lng' => 2.3499, + ], + [ + 'lat' => 48.8566, + 'lng' => 2.3522, + ], + ], + 'title' => 'Polygon 1', + 'infoWindow' => [ + 'headerContent' => 'Polygon 1', + 'content' => 'Polygon 1', + ], + ], + ], ]; } } diff --git a/src/Map/tests/MapTest.php b/src/Map/tests/MapTest.php index 99a4f1ebc37..95703724466 100644 --- a/src/Map/tests/MapTest.php +++ b/src/Map/tests/MapTest.php @@ -18,6 +18,7 @@ use Symfony\UX\Map\MapOptionsInterface; use Symfony\UX\Map\Marker; use Symfony\UX\Map\Point; +use Symfony\UX\Map\Polygon; class MapTest extends TestCase { @@ -55,6 +56,7 @@ public function testZoomAndCenterCanBeOmittedIfFitBoundsToMarkers(): void 'fitBoundsToMarkers' => true, 'options' => $array['options'], 'markers' => [], + 'polygons' => [], ], $array); } @@ -73,6 +75,7 @@ public function testWithMinimumConfiguration(): void 'fitBoundsToMarkers' => false, 'options' => $array['options'], 'markers' => [], + 'polygons' => [], ], $array); } @@ -105,11 +108,36 @@ public function toArray(): array position: new Point(43.2965, 5.3698), title: 'Marseille', infoWindow: new InfoWindow(headerContent: 'Marseille', content: 'Marseille', position: new Point(43.2965, 5.3698), opened: true) - )); + )) + ->addPolygon(new Polygon( + points: [ + new Point(48.858844, 2.294351), + new Point(48.853, 2.3499), + new Point(48.8566, 2.3522), + ], + title: 'Polygon 1', + infoWindow: null, + )) + ->addPolygon(new Polygon( + points: [ + new Point(45.764043, 4.835659), + new Point(45.75, 4.85), + new Point(45.77, 4.82), + ], + title: 'Polygon 2', + infoWindow: new InfoWindow( + headerContent: 'Polygon 2', + content: 'A polygon around Lyon with some additional info.', + position: new Point(45.764, 4.8357), + opened: true, + autoClose: true, + ), + )) + ; $array = $map->toArray(); - self::assertSame([ + self::assertEquals([ 'center' => ['lat' => 48.8566, 'lng' => 2.3522], 'zoom' => 6.0, 'fitBoundsToMarkers' => true, @@ -155,6 +183,35 @@ public function toArray(): array 'extra' => $array['markers'][2]['extra'], ], ], + 'polygons' => [ + [ + 'points' => [ + ['lat' => 48.858844, 'lng' => 2.294351], + ['lat' => 48.853, 'lng' => 2.3499], + ['lat' => 48.8566, 'lng' => 2.3522], + ], + 'title' => 'Polygon 1', + 'infoWindow' => null, + 'extra' => $array['polygons'][0]['extra'], + ], + [ + 'points' => [ + ['lat' => 45.764043, 'lng' => 4.835659], + ['lat' => 45.75, 'lng' => 4.85], + ['lat' => 45.77, 'lng' => 4.82], + ], + 'title' => 'Polygon 2', + 'infoWindow' => [ + 'headerContent' => 'Polygon 2', + 'content' => 'A polygon around Lyon with some additional info.', + 'position' => ['lat' => 45.764, 'lng' => 4.8357], + 'opened' => true, + 'autoClose' => true, + 'extra' => $array['polygons'][1]['infoWindow']['extra'], + ], + 'extra' => $array['polygons'][1]['extra'], + ], + ], ], $array); self::assertSame('roadmap', $array['options']->mapTypeId); From 647532ab688f79acfbcb1c895e88a8b2f1a502f6 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Wed, 18 Sep 2024 15:16:42 +0200 Subject: [PATCH 63/64] [StimulusBundle] Improve `StimulusAttributes` rendering performances by switching to `html` escaping strategy --- src/Chartjs/tests/Twig/ChartExtensionTest.php | 2 +- .../Unit/Twig/LiveComponentRuntimeTest.php | 10 ++- src/Notify/tests/Twig/NotifyRuntimeTest.php | 8 +-- .../Twig/ReactComponentExtensionTest.php | 4 +- .../src/Dto/StimulusAttributes.php | 68 +++++++------------ .../tests/Dto/StimulusAttributesTest.php | 2 +- .../tests/Twig/StimulusTwigExtensionTest.php | 4 +- .../Twig/SvelteComponentExtensionTest.php | 6 +- .../tests/Unit/ComponentAttributesTest.php | 2 +- .../tests/Twig/VueComponentExtensionTest.php | 4 +- 10 files changed, 45 insertions(+), 65 deletions(-) diff --git a/src/Chartjs/tests/Twig/ChartExtensionTest.php b/src/Chartjs/tests/Twig/ChartExtensionTest.php index 03472690cbf..0f3ae34e8b0 100644 --- a/src/Chartjs/tests/Twig/ChartExtensionTest.php +++ b/src/Chartjs/tests/Twig/ChartExtensionTest.php @@ -56,7 +56,7 @@ public function testRenderChart() ); $this->assertSame( - '', + '', $rendered ); } diff --git a/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php b/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php index 30c3ba8cbbf..01f067c08fa 100644 --- a/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php +++ b/src/LiveComponent/tests/Unit/Twig/LiveComponentRuntimeTest.php @@ -28,17 +28,15 @@ public function testGetLiveAction(): void $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-some-prop-param="val2" data-live-action-param="action-name"', $props); $props = $runtime->liveAction('action-name', ['prop1' => 'val1', 'prop2' => 'val2'], ['debounce' => 300]); - $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); - $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); + $this->assertSame('data-action="live#action" data-live-prop1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name:prevent', ['pro1' => 'val1', 'prop2' => 'val2'], ['debounce' => 300]); - $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); - $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); + $this->assertSame('data-action="live#action:prevent" data-live-pro1-param="val1" data-live-prop2-param="val2" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name:prevent', [], ['debounce' => 300]); - $this->assertSame('data-action="live#action:prevent" data-live-action-param="debounce(300)|action-name"', html_entity_decode($props)); + $this->assertSame('data-action="live#action:prevent" data-live-action-param="debounce(300)|action-name"', $props); $props = $runtime->liveAction('action-name', [], [], 'keydown.esc'); - $this->assertSame('data-action="keydown.esc->live#action" data-live-action-param="action-name"', html_entity_decode($props)); + $this->assertSame('data-action="keydown.esc->live#action" data-live-action-param="action-name"', $props); } } diff --git a/src/Notify/tests/Twig/NotifyRuntimeTest.php b/src/Notify/tests/Twig/NotifyRuntimeTest.php index 7f21970fa61..8c3b3786337 100644 --- a/src/Notify/tests/Twig/NotifyRuntimeTest.php +++ b/src/Notify/tests/Twig/NotifyRuntimeTest.php @@ -39,13 +39,13 @@ public function testStreamNotifications(array $params, string $expected) public static function streamNotificationsDataProvider(): iterable { - $publicUrl = 'http://localhost:9090/.well-known/mercure'; + $publicUrl = 'http://localhost:9090/.well-known/mercure'; yield [ [['/topic/1', '/topic/2']], '
    ', ]; @@ -54,7 +54,7 @@ public static function streamNotificationsDataProvider(): iterable ['/topic/1'], '
    ', ]; @@ -63,7 +63,7 @@ public static function streamNotificationsDataProvider(): iterable [], '
    ', ]; diff --git a/src/React/tests/Twig/ReactComponentExtensionTest.php b/src/React/tests/Twig/ReactComponentExtensionTest.php index aae2d6b6b6a..9fbf8c8b0a3 100644 --- a/src/React/tests/Twig/ReactComponentExtensionTest.php +++ b/src/React/tests/Twig/ReactComponentExtensionTest.php @@ -36,7 +36,7 @@ public function testRenderComponent() ); $this->assertSame( - 'data-controller="symfony--ux-react--react" data-symfony--ux-react--react-component-value="SubDir/MyComponent" data-symfony--ux-react--react-props-value="{"fullName":"Titouan Galopin"}"', + 'data-controller="symfony--ux-react--react" data-symfony--ux-react--react-component-value="SubDir/MyComponent" data-symfony--ux-react--react-props-value="{"fullName":"Titouan Galopin"}"', $rendered ); } @@ -52,7 +52,7 @@ public function testRenderComponentWithoutProps() $rendered = $extension->renderReactComponent('SubDir/MyComponent'); $this->assertSame( - 'data-controller="symfony--ux-react--react" data-symfony--ux-react--react-component-value="SubDir/MyComponent"', + 'data-controller="symfony--ux-react--react" data-symfony--ux-react--react-component-value="SubDir/MyComponent"', $rendered ); } diff --git a/src/StimulusBundle/src/Dto/StimulusAttributes.php b/src/StimulusBundle/src/Dto/StimulusAttributes.php index 1b477172260..5b91589ae63 100644 --- a/src/StimulusBundle/src/Dto/StimulusAttributes.php +++ b/src/StimulusBundle/src/Dto/StimulusAttributes.php @@ -107,54 +107,36 @@ public function addAttribute(string $name, string $value): void public function __toString(): string { - $controllers = array_map(function (string $controllerName): string { - return $this->escapeAsHtmlAttr($controllerName); - }, $this->controllers); - - // done separately so we can escape, but avoid escaping -> - $actions = array_map(function (array $actionData): string { - $controllerName = $this->escapeAsHtmlAttr($actionData['controllerName']); - $actionName = $this->escapeAsHtmlAttr($actionData['actionName']); - $eventName = $actionData['eventName']; - - $action = $controllerName.'#'.$actionName; - if (null !== $eventName) { - $action = $this->escapeAsHtmlAttr($eventName).'->'.$action; - } - - return $action; - }, $this->actions); + $attributes = []; - $targets = []; - foreach ($this->targets as $key => $targetNamesString) { - $targetNames = explode(' ', $targetNamesString); - $targets[$key] = implode(' ', array_map(function (string $targetName): string { - return $this->escapeAsHtmlAttr($targetName); - }, $targetNames)); + if ($this->controllers) { + $attributes[] = 'data-controller="'.$this->escape(implode(' ', $this->controllers)).'"'; } - $attributes = []; + if ($this->actions) { + $actions = []; + foreach ($this->actions as ['controllerName' => $controllerName, 'actionName' => $actionName, 'eventName' => $eventName]) { + $action = $this->escape($controllerName.'#'.$actionName); + if (null !== $eventName) { + // done separately so we can escape, but avoid escaping -> + $action = $this->escape($eventName).'->'.$action; + } + + $actions[] = $action; + } - if ($controllers) { - $attributes[] = \sprintf('data-controller="%s"', implode(' ', $controllers)); + $attributes[] = 'data-action="'.implode(' ', $actions).'"'; } - if ($actions) { - $attributes[] = \sprintf('data-action="%s"', implode(' ', $actions)); + foreach ($this->targets as $k => $v) { + $attributes[] = $this->escape($k, 'html_attr').'="'.$this->escape($v).'"'; } - if ($targets) { - $attributes[] = implode(' ', array_map(function (string $key, string $value): string { - return \sprintf('%s="%s"', $key, $value); - }, array_keys($targets), $targets)); + foreach ($this->attributes as $k => $v) { + $attributes[] = $this->escape($k, 'html_attr').'="'.$this->escape($v).'"'; } - return rtrim(implode(' ', [ - ...$attributes, - ...array_map(function (string $attribute, string $value): string { - return $attribute.'="'.$this->escapeAsHtmlAttr($value).'"'; - }, array_keys($this->attributes), $this->attributes), - ])); + return implode(' ', $attributes); } public function toArray(): array @@ -193,7 +175,7 @@ public function toEscapedArray(): array { $escaped = []; foreach ($this->toArray() as $key => $value) { - $escaped[$key] = $this->escapeAsHtmlAttr($value); + $escaped[$key] = $this->escape($value); } return $escaped; @@ -212,18 +194,18 @@ private function getFormattedValue(mixed $value): string return (string) $value; } - private function escapeAsHtmlAttr(mixed $value): string + private function escape(mixed $value, string $strategy = 'html'): string { if (class_exists(EscaperRuntime::class)) { - return $this->env->getRuntime(EscaperRuntime::class)->escape($value, 'html_attr'); + return $this->env->getRuntime(EscaperRuntime::class)->escape($value, $strategy); } if (method_exists(EscaperExtension::class, 'escape')) { - return EscaperExtension::escape($this->env, $value, 'html_attr'); + return EscaperExtension::escape($this->env, $value, $strategy); } // since twig/twig 3.9.0: Using the internal "twig_escape_filter" function is deprecated. - return (string) twig_escape_filter($this->env, $value, 'html_attr'); + return (string) twig_escape_filter($this->env, $value, $strategy); } /** diff --git a/src/StimulusBundle/tests/Dto/StimulusAttributesTest.php b/src/StimulusBundle/tests/Dto/StimulusAttributesTest.php index 63393d99cd9..17527a3491c 100644 --- a/src/StimulusBundle/tests/Dto/StimulusAttributesTest.php +++ b/src/StimulusBundle/tests/Dto/StimulusAttributesTest.php @@ -145,7 +145,7 @@ public function testIsTraversable() public function testAddAttribute() { $this->stimulusAttributes->addAttribute('foo', 'bar baz'); - $this->assertSame('foo="bar baz"', (string) $this->stimulusAttributes); + $this->assertSame('foo="bar baz"', (string) $this->stimulusAttributes); $this->assertSame(['foo' => 'bar baz'], $this->stimulusAttributes->toArray()); } } diff --git a/src/StimulusBundle/tests/Twig/StimulusTwigExtensionTest.php b/src/StimulusBundle/tests/Twig/StimulusTwigExtensionTest.php index 41793ed5efc..0e8cdbf8893 100644 --- a/src/StimulusBundle/tests/Twig/StimulusTwigExtensionTest.php +++ b/src/StimulusBundle/tests/Twig/StimulusTwigExtensionTest.php @@ -135,8 +135,8 @@ public function testAppendStimulusController(): void $extension = new StimulusTwigExtension(new StimulusHelper($this->twig)); $dto = $extension->renderStimulusController('my-controller', ['myValue' => 'scalar-value']); $this->assertSame( - 'data-controller="my-controller another-controller" data-my-controller-my-value-value="scalar-value" data-another-controller-another-value-value="scalar-value 2"', - (string) $extension->appendStimulusController($dto, 'another-controller', ['another-value' => 'scalar-value 2']), + 'data-controller="my-controller another-controller" data-my-controller-my-value-value="scalar-value" data-another-controller-another-value-value="scalar-value 2" data-another-controller-json-value-value="{"key":"Value with quotes ' and \"."}"', + (string) $extension->appendStimulusController($dto, 'another-controller', ['another-value' => 'scalar-value 2', 'jsonValue' => json_encode(['key' => 'Value with quotes \' and ".'])]), ); } diff --git a/src/Svelte/tests/Twig/SvelteComponentExtensionTest.php b/src/Svelte/tests/Twig/SvelteComponentExtensionTest.php index 8231c0282db..7a9a6d03263 100644 --- a/src/Svelte/tests/Twig/SvelteComponentExtensionTest.php +++ b/src/Svelte/tests/Twig/SvelteComponentExtensionTest.php @@ -37,7 +37,7 @@ public function testRenderComponent() ); $this->assertSame( - 'data-controller="symfony--ux-svelte--svelte" data-symfony--ux-svelte--svelte-component-value="SubDir/MyComponent" data-symfony--ux-svelte--svelte-props-value="{"fullName":"Titouan Galopin"}"', + 'data-controller="symfony--ux-svelte--svelte" data-symfony--ux-svelte--svelte-component-value="SubDir/MyComponent" data-symfony--ux-svelte--svelte-props-value="{"fullName":"Titouan Galopin"}"', $rendered ); } @@ -53,7 +53,7 @@ public function testRenderComponentWithoutProps() $rendered = $extension->renderSvelteComponent('SubDir/MyComponent'); $this->assertSame( - 'data-controller="symfony--ux-svelte--svelte" data-symfony--ux-svelte--svelte-component-value="SubDir/MyComponent"', + 'data-controller="symfony--ux-svelte--svelte" data-symfony--ux-svelte--svelte-component-value="SubDir/MyComponent"', $rendered ); } @@ -73,7 +73,7 @@ public function testRenderComponentWithIntro() ); $this->assertSame( - 'data-controller="symfony--ux-svelte--svelte" data-symfony--ux-svelte--svelte-component-value="SubDir/MyComponent" data-symfony--ux-svelte--svelte-props-value="{"fullName":"Titouan Galopin"}" data-symfony--ux-svelte--svelte-intro-value="true"', + 'data-controller="symfony--ux-svelte--svelte" data-symfony--ux-svelte--svelte-component-value="SubDir/MyComponent" data-symfony--ux-svelte--svelte-props-value="{"fullName":"Titouan Galopin"}" data-symfony--ux-svelte--svelte-intro-value="true"', $rendered ); } diff --git a/src/TwigComponent/tests/Unit/ComponentAttributesTest.php b/src/TwigComponent/tests/Unit/ComponentAttributesTest.php index 5e22ac737c8..8ed7aa4f004 100644 --- a/src/TwigComponent/tests/Unit/ComponentAttributesTest.php +++ b/src/TwigComponent/tests/Unit/ComponentAttributesTest.php @@ -147,7 +147,7 @@ public function testCanAddStimulusControllerViaStimulusAttributes(): void 'data-controller' => 'foo live', 'data-live-data-value' => '{}', 'data-foo-name-value' => 'ryan', - 'data-foo-some-array-value' => '["a","b"]', + 'data-foo-some-array-value' => '["a","b"]', ], $attributes->all()); } diff --git a/src/Vue/tests/Twig/VueComponentExtensionTest.php b/src/Vue/tests/Twig/VueComponentExtensionTest.php index 3c618cca2e6..6a539395d4d 100644 --- a/src/Vue/tests/Twig/VueComponentExtensionTest.php +++ b/src/Vue/tests/Twig/VueComponentExtensionTest.php @@ -37,7 +37,7 @@ public function testRenderComponent() ); $this->assertSame( - 'data-controller="symfony--ux-vue--vue" data-symfony--ux-vue--vue-component-value="SubDir/MyComponent" data-symfony--ux-vue--vue-props-value="{"fullName":"Titouan Galopin"}"', + 'data-controller="symfony--ux-vue--vue" data-symfony--ux-vue--vue-component-value="SubDir/MyComponent" data-symfony--ux-vue--vue-props-value="{"fullName":"Titouan Galopin"}"', $rendered ); } @@ -53,7 +53,7 @@ public function testRenderComponentWithoutProps() $rendered = $extension->renderVueComponent('SubDir/MyComponent'); $this->assertSame( - 'data-controller="symfony--ux-vue--vue" data-symfony--ux-vue--vue-component-value="SubDir/MyComponent"', + 'data-controller="symfony--ux-vue--vue" data-symfony--ux-vue--vue-component-value="SubDir/MyComponent"', $rendered ); } From da0537d96182b40f60ac9d1dd4b961fa3c605011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Tue, 24 Sep 2024 01:45:55 +0200 Subject: [PATCH 64/64] [TwigComponent] Optimize ComponentFactory --- src/TwigComponent/src/ComponentFactory.php | 73 +++++++-------- src/TwigComponent/src/ComponentMetadata.php | 5 + .../tests/Unit/ComponentFactoryTest.php | 92 +++++++++++++++++++ 3 files changed, 131 insertions(+), 39 deletions(-) create mode 100644 src/TwigComponent/tests/Unit/ComponentFactoryTest.php diff --git a/src/TwigComponent/src/ComponentFactory.php b/src/TwigComponent/src/ComponentFactory.php index 2a677d38803..d797c399add 100644 --- a/src/TwigComponent/src/ComponentFactory.php +++ b/src/TwigComponent/src/ComponentFactory.php @@ -41,20 +41,28 @@ public function __construct( public function metadataFor(string $name): ComponentMetadata { - $name = $this->classMap[$name] ?? $name; - - if (!$config = $this->config[$name] ?? null) { - if (($template = $this->componentTemplateFinder->findAnonymousComponentTemplate($name)) !== null) { - return new ComponentMetadata([ - 'key' => $name, - 'template' => $template, - ]); + if ($config = $this->config[$name] ?? null) { + return new ComponentMetadata($config); + } + + if ($template = $this->componentTemplateFinder->findAnonymousComponentTemplate($name)) { + $this->config[$name] = [ + 'key' => $name, + 'template' => $template, + ]; + + return new ComponentMetadata($this->config[$name]); + } + + if ($mappedName = $this->classMap[$name] ?? null) { + if ($config = $this->config[$mappedName] ?? null) { + return new ComponentMetadata($config); } - $this->throwUnknownComponentException($name); + throw new \InvalidArgumentException(\sprintf('Unknown component "%s".', $name)); } - return new ComponentMetadata($config); + $this->throwUnknownComponentException($name); } /** @@ -62,11 +70,13 @@ public function metadataFor(string $name): ComponentMetadata */ public function create(string $name, array $data = []): MountedComponent { - return $this->mountFromObject( - $this->getComponent($name), - $data, - $this->metadataFor($name) - ); + $metadata = $this->metadataFor($name); + + if ($metadata->isAnonymous()) { + return $this->mountFromObject(new AnonymousComponent(), $data, $metadata); + } + + return $this->mountFromObject($this->components->get($metadata->getName()), $data, $metadata); } /** @@ -101,10 +111,7 @@ public function mountFromObject(object $component, array $data, ComponentMetadat foreach ($data as $key => $value) { if ($value instanceof \Stringable) { $data[$key] = (string) $value; - continue; } - - $data[$key] = $value; } return new MountedComponent( @@ -118,10 +125,18 @@ public function mountFromObject(object $component, array $data, ComponentMetadat /** * Returns the "unmounted" component. + * + * @internal */ public function get(string $name): object { - return $this->getComponent($name); + $metadata = $this->metadataFor($name); + + if ($metadata->isAnonymous()) { + return new AnonymousComponent(); + } + + return $this->components->get($metadata->getName()); } private function mount(object $component, array &$data): void @@ -159,21 +174,6 @@ private function mount(object $component, array &$data): void $component->mount(...$parameters); } - private function getComponent(string $name): object - { - $name = $this->classMap[$name] ?? $name; - - if (!$this->components->has($name)) { - if ($this->isAnonymousComponent($name)) { - return new AnonymousComponent(); - } - - $this->throwUnknownComponentException($name); - } - - return $this->components->get($name); - } - private function preMount(object $component, array $data, ComponentMetadata $componentMetadata): array { $event = new PreMountEvent($component, $data, $componentMetadata); @@ -215,11 +215,6 @@ private function postMount(object $component, array $data, ComponentMetadata $co ]; } - private function isAnonymousComponent(string $name): bool - { - return null !== $this->componentTemplateFinder->findAnonymousComponentTemplate($name); - } - /** * @return never */ diff --git a/src/TwigComponent/src/ComponentMetadata.php b/src/TwigComponent/src/ComponentMetadata.php index a152417a8e7..b71e349161c 100644 --- a/src/TwigComponent/src/ComponentMetadata.php +++ b/src/TwigComponent/src/ComponentMetadata.php @@ -57,6 +57,11 @@ public function isPublicPropsExposed(): bool return $this->get('expose_public_props', false); } + public function isAnonymous(): bool + { + return !isset($this->config['service_id']); + } + public function getAttributesVar(): string { return $this->get('attributes_var', 'attributes'); diff --git a/src/TwigComponent/tests/Unit/ComponentFactoryTest.php b/src/TwigComponent/tests/Unit/ComponentFactoryTest.php new file mode 100644 index 00000000000..fd1fd337c89 --- /dev/null +++ b/src/TwigComponent/tests/Unit/ComponentFactoryTest.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\UX\TwigComponent\Tests\Unit; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\ServiceLocator; +use Symfony\Component\PropertyAccess\PropertyAccessorInterface; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use Symfony\UX\TwigComponent\ComponentFactory; +use Symfony\UX\TwigComponent\ComponentTemplateFinderInterface; + +/** + * @author Simon André + */ +class ComponentFactoryTest extends TestCase +{ + public function testMetadataForConfig(): void + { + $factory = new ComponentFactory( + $this->createMock(ComponentTemplateFinderInterface::class), + $this->createMock(ServiceLocator::class), + $this->createMock(PropertyAccessorInterface::class), + $this->createMock(EventDispatcherInterface::class), + ['foo' => ['key' => 'foo', 'template' => 'bar.html.twig']], + [] + ); + + $metadata = $factory->metadataFor('foo'); + + $this->assertSame('foo', $metadata->getName()); + $this->assertSame('bar.html.twig', $metadata->getTemplate()); + } + + public function testMetadataForResolveAlias(): void + { + $factory = new ComponentFactory( + $this->createMock(ComponentTemplateFinderInterface::class), + $this->createMock(ServiceLocator::class), + $this->createMock(PropertyAccessorInterface::class), + $this->createMock(EventDispatcherInterface::class), + [ + 'bar' => ['key' => 'bar', 'template' => 'bar.html.twig'], + 'foo' => ['key' => 'foo', 'template' => 'foo.html.twig'], + ], + ['Foo\\Bar' => 'bar'], + ); + + $metadata = $factory->metadataFor('Foo\\Bar'); + + $this->assertSame('bar', $metadata->getName()); + $this->assertSame('bar.html.twig', $metadata->getTemplate()); + } + + public function testMetadataForReuseAnonymousConfig(): void + { + $templateFinder = $this->createMock(ComponentTemplateFinderInterface::class); + $templateFinder->expects($this->atLeastOnce()) + ->method('findAnonymousComponentTemplate') + ->with('foo') + ->willReturnOnConsecutiveCalls('foo.html.twig', 'bar.html.twig', 'bar.html.twig'); + + $factory = new ComponentFactory( + $templateFinder, + $this->createMock(ServiceLocator::class), + $this->createMock(PropertyAccessorInterface::class), + $this->createMock(EventDispatcherInterface::class), + [], + [] + ); + + $metadata = $factory->metadataFor('foo'); + $this->assertSame('foo', $metadata->getName()); + $this->assertSame('foo.html.twig', $metadata->getTemplate()); + + $metadata = $factory->metadataFor('foo'); + $this->assertSame('foo', $metadata->getName()); + $this->assertSame('foo.html.twig', $metadata->getTemplate()); + + $metadata = $factory->metadataFor('foo'); + $this->assertSame('foo', $metadata->getName()); + $this->assertSame('foo.html.twig', $metadata->getTemplate()); + } +}