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..664ba662684 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: 🛟 Support / help + url: https://ux.symfony.com/support + about: Ask your questions about Symfony UX diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index cb42ed10aa2..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,4 +143,5 @@ jobs: restore-keys: | ${{ runner.os }}-yarn- - run: yarn --immutable + - run: yarn playwright install - run: yarn test 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/package.json b/package.json index 60340d501f0..b33d28bf9a0 100644 --- a/package.json +++ b/package.json @@ -10,19 +10,21 @@ "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", + "@vitest/browser": "^2.0.5", "clean-css-cli": "^5.6.2", - "rollup": "^3.7.0", - "tslib": "^2.3.1", - "typescript": "^4.4.4", - "vitest": "^0.34.6" + "playwright": "^1.47.0", + "rollup": "^4.21.0", + "tslib": "^2.6.3", + "typescript": "^5.5.4", + "vitest": "^2.0.5" } } 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/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 d54467ef57d..c6e9660b1d6 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 { @@ -232,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, @@ -307,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, }); @@ -329,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/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/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/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; + } } 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%...', ]; 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/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/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 } } } diff --git a/src/Icons/CHANGELOG.md b/src/Icons/CHANGELOG.md index 3b1eb8f7fe0..8ff2aad1fb0 100644 --- a/src/Icons/CHANGELOG.md +++ b/src/Icons/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## 2.20.0 + +- Add `aliases` configuration option to define icon alternative names. +- Add support for `int` and `float` attribute values in ``. + ## 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..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; @@ -56,9 +57,11 @@ ->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') + ->alias(IconRendererInterface::class, '.ux_icons.icon_renderer') ->set('.ux_icons.icon_finder', IconFinder::class) ->args([ diff --git a/src/Icons/doc/index.rst b/src/Icons/doc/index.rst index b66346f155b..0950e88596f 100644 --- a/src/Icons/doc/index.rst +++ b/src/Icons/doc/index.rst @@ -336,6 +336,37 @@ 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 +~~~~~~~~~~~~ + +.. 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: + +.. 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:: html+twig + + {{ ux_icon('dots') }} + {# with the previous configuration, this is the same as: #} + {{ ux_icon('clarity:ellipsis-horizontal-line') }} + + {# using the HTML syntax #} + + {# same as: #} + + Errors ------ @@ -518,6 +549,11 @@ Full Configuration # 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: enabled: true @@ -527,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 diff --git a/src/Icons/src/DependencyInjection/UXIconsExtension.php b/src/Icons/src/DependencyInjection/UXIconsExtension.php index 81e705b7926..618749ee701 100644 --- a/src/Icons/src/DependencyInjection/UXIconsExtension.php +++ b/src/Icons/src/DependencyInjection/UXIconsExtension.php @@ -42,24 +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 (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() @@ -86,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, ]) ; @@ -98,6 +156,8 @@ 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') @@ -108,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/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/src/IconRenderer.php b/src/Icons/src/IconRenderer.php index 95edf56d0ca..c698619d435 100644 --- a/src/Icons/src/IconRenderer.php +++ b/src/Icons/src/IconRenderer.php @@ -18,9 +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 $iconSetsAttributes = [], ) { } @@ -35,9 +42,16 @@ public function __construct( */ public function renderIcon(string $name, array $attributes = []): string { - $icon = $this->registry->get($name) - ->withAttributes($this->defaultIconAttributes) - ->withAttributes($attributes); + $iconName = $this->iconAliases[$name] ?? $name; + + $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/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/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/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/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/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) diff --git a/src/Icons/tests/Unit/IconRendererTest.php b/src/Icons/tests/Unit/IconRendererTest.php index 4dc3eeb4a03..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' => [ + [], [], - ['id' => 'default'], - ['id' => 'render'], - '', + ['ico' => 'SET'], + [], + '', ]; - 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' => [ [], - ['id' => 'default', 'foo' => 'bar'], - ['id' => 'render', 'baz' => 'qux'], - '', + ['ico' => 'DEF'], + ['ico' => 'SET'], + [], + '', ]; - yield 'render_attributes_take_precedence_on_icon' => [ - ['id' => 'icon'], + 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'], [], - ['id' => 'render'], - '', + '', + ]; + 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'], + [], + ['ico' => 'REN'], + '', + ]; + yield 'render_attributes_overwrite_icon_set_attributes' => [ + [], + [], + ['ico' => 'SET'], + ['ico' => 'REN'], + '', ]; yield 'render_attributes_are_merged_with_icon_attributes' => [ - ['id' => 'icon', 'foo' => 'bar'], + ['ico' => 'ICO', 'foo' => 'ICO'], + [], [], - ['id' => 'render', 'baz' => 'qux'], - '', + ['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' => [ + [], + [], + ['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'], + '', ]; } @@ -230,6 +345,68 @@ 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); + } + + /** + * @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'); 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/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; } 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/doc/index.rst b/src/LiveComponent/doc/index.rst index d858a42dc3b..e24b87a6bed 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -3711,6 +3718,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/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/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') ; 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 @@ + + * + * 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..4e6b412f5a1 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() @@ -214,5 +214,6 @@ protected function configureRoutes(RoutingConfigurator $routes): void $routes->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/Serializer/Entity2Normalizer.php b/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php index c1b449e46b7..f7278ed9ed0 100644 --- a/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php +++ b/src/LiveComponent/tests/Fixtures/Serializer/Entity2Normalizer.php @@ -25,29 +25,29 @@ 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; } - 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..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): array + public function getSupportedTypes(?string $format = null): array { return [Money::class => true]; } 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/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/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()); + } } 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 2441146fccd..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, @@ -151,7 +152,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 +162,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; @@ -180,11 +181,11 @@ 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() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name'], onUpdated: ['name' => 'onNameUpdated'])] public ProductFixtureEntity $product; @@ -203,12 +204,12 @@ 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); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: [LiveProp::IDENTITY], onUpdated: [LiveProp::IDENTITY => 'onEntireEntityUpdated'])] public Entity1 $entity1; @@ -235,8 +236,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'string: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public string $firstName; }) ->mountWith(['firstName' => 'Ryan']) @@ -247,8 +248,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'string: changing non-writable causes checksum fail' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public string $firstName; }) ->mountWith(['firstName' => 'Ryan']) @@ -258,7 +259,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 +273,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,8 +294,8 @@ 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() { - #[LiveProp()] + return HydrationTest::create(new class { + #[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()] + return HydrationTest::create(new class { + #[LiveProp] public Entity1 $entity1; }) ->mountWith(['entity1' => $entity1]) @@ -328,12 +329,12 @@ 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); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: true)] public Entity1 $entity1; }) @@ -349,12 +350,12 @@ 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); - return HydrationTest::create(new class() { + return HydrationTest::create(new class { #[LiveProp(writable: [LiveProp::IDENTITY])] public Entity1 $entity1; }) @@ -370,11 +371,11 @@ 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() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name'])] public ProductFixtureEntity $product; }) @@ -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() { + 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,9 +421,9 @@ 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() { + return HydrationTest::create(new class { #[LiveProp(useSerializerForHydration: true)] public Entity2 $entity2; }) @@ -445,7 +446,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,8 +470,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Index array: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public array $foods = []; }) ->mountWith(['foods' => ['banana', 'popcorn']]) @@ -485,7 +486,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,8 +504,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Associative array: (de)hyrates correctly' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public array $options = []; }) ->mountWith(['options' => [ @@ -530,7 +531,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 +559,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 +584,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 +626,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 +656,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 +679,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 +705,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,8 +733,8 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Empty array: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[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]]) @@ -777,11 +778,11 @@ public function onEntireEntityUpdated($oldValue) }]; yield 'Enum: null remains null' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public ?IntEnum $int = null; - #[LiveProp()] + #[LiveProp] public ?StringEnum $string = null; }) ->mountWith([]) @@ -794,11 +795,11 @@ public function onEntireEntityUpdated($oldValue) }, 80100]; yield 'Enum: (de)hydrates correctly' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public ?IntEnum $int = null; - #[LiveProp()] + #[LiveProp] public ?StringEnum $string = null; }) ->mountWith(['int' => IntEnum::HIGH, 'string' => StringEnum::ACTIVE]) @@ -813,7 +814,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 +827,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 +857,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 +871,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 +898,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 +931,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 */ @@ -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() { + 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() { + 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,30 +1028,30 @@ 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); }); }]; 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[] + * @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 ); @@ -1091,7 +1092,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 +1121,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 +1137,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 +1156,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 +1196,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,8 +1209,8 @@ public function mount() }]; yield 'Updating non-writable property is rejected' => [function () { - return HydrationTest::create(new class() { - #[LiveProp()] + return HydrationTest::create(new class { + #[LiveProp] public string $name; }) ->mountWith(['name' => 'Ryan']) @@ -1221,7 +1222,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,8 +1258,8 @@ 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')] + return HydrationTest::create(new class { + #[LiveProp(writable: true, hydrateWith: 'hydrateDate', dehydrateWith: 'dehydrateDate')] public \DateTime $createdAt; public function __construct() @@ -1300,7 +1301,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 +1327,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 +1380,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 +1404,7 @@ public function __construct() public function testPassingArrayToWritablePropForHydrationIsNotAllowed(): void { - $component = new class() { + $component = new class { #[LiveProp(writable: true)] public \DateTime $createdAt; @@ -1434,7 +1435,7 @@ public function __construct() public function testInterfaceTypedLivePropCannotBeHydrated(): void { - $componentClass = new class() { + $componentClass = new class { #[LiveProp(writable: true)] public ?SimpleDtoInterface $prop = null; }; @@ -1453,7 +1454,7 @@ public function testInterfaceTypedLivePropCannotBeHydrated(): void public function testInterfaceTypedLivePropCannotBeDehydrated(): void { - $componentClass = new class() { + $componentClass = new class { #[LiveProp(writable: true)] public ?SimpleDtoInterface $prop = null; }; @@ -1478,7 +1479,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 +1492,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; }) @@ -1503,12 +1504,12 @@ 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() { + return HydrationTest::create(new class { #[LiveProp(writable: ['name', 'price'])] public ProductFixtureEntity $product; }) @@ -1525,7 +1526,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 +1555,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 +1588,7 @@ public function testHydrationFailsOnChecksumMismatch(): void public function testHydrationTakeUpdatedParentPropsIntoAccount(): void { - $component = new class() { + $component = new class { #[LiveProp(writable: true)] public string $name = 'Ryan'; @@ -1621,7 +1622,7 @@ public function testHydrationTakeUpdatedParentPropsIntoAccount(): void public function testHydrationWithUpdatesParentPropsAndBadChecksumFails(): void { - $component = new class() { + $component = new class { #[LiveProp(updateFromParent: true)] public string $name = 'Ryan'; }; @@ -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 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..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/Map/CHANGELOG.md b/src/Map/CHANGELOG.md index 9603bd3c5f1..3883fe057d4 100644 --- a/src/Map/CHANGELOG.md +++ b/src/Map/CHANGELOG.md @@ -1,5 +1,16 @@ # CHANGELOG -## Unreleased +## 2.20 + +- 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 +- 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 - Component added 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/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/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/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/doc/index.rst b/src/Map/doc/index.rst index 70dc9d386a9..be16614c0ed 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,32 +102,52 @@ 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, + ], + ), ) ; - - // 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, ]); } } -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) }} - - {# or with custom attributes #} - {{ render_map(my_map, { style: 'height: 300px' }) }} + {# 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -203,11 +223,17 @@ 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 - {{ render_map(my_map, { 'data-controller': 'mymap', style: 'height: 300px' }) }} + {{ ux_map(my_map, { 'data-controller': 'mymap', style: 'height: 300px' }) }} Backward Compatibility promise ------------------------------ @@ -218,5 +244,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/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 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/Google/CHANGELOG.md b/src/Map/src/Bridge/Google/CHANGELOG.md index 2b5de26f0c4..46f7d49c2f0 100644 --- a/src/Map/src/Bridge/Google/CHANGELOG.md +++ b/src/Map/src/Bridge/Google/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG -## Unreleased +## 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/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/Google/assets/dist/map_controller.d.ts b/src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts index 9a8da864f15..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,9 +1,8 @@ -/// -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, 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; }; @@ -16,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 5a74163291a..30fbe283118 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,58 @@ -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 = []; + this.polygons = []; + } + connect() { + 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, + }); + } + 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; + } + 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; + } +}; +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: {} }; @@ -52,11 +102,26 @@ class default_1 extends AbstractMapController { 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), @@ -64,22 +129,34 @@ class default_1 extends AbstractMapController { ...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/package.json b/src/Map/src/Bridge/Google/assets/package.json index 28004e0ef73..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": { @@ -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/src/map_controller.ts b/src/Map/src/Bridge/Google/assets/src/map_controller.ts index 1e1a1a06473..05116d80253 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, 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/assets/vitest.config.js b/src/Map/src/Bridge/Google/assets/vitest.config.js deleted file mode 100644 index 3892eefac50..00000000000 --- a/src/Map/src/Bridge/Google/assets/vitest.config.js +++ /dev/null @@ -1,17 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config'; -import configShared from '../../../../../../vitest.config.js' - -export default mergeConfig( - configShared, - defineConfig({ - resolve: { - alias: { - '@symfony/ux-map/abstract-map-controller': __dirname + '/../../../../assets/src/abstract_map_controller.ts', - }, - }, - test: { - // We need a browser(-like) environment to run the tests - environment: 'happy-dom', - }, - }) -); diff --git a/src/Map/src/Bridge/Google/assets/vitest.config.mjs b/src/Map/src/Bridge/Google/assets/vitest.config.mjs new file mode 100644 index 00000000000..c957798deee --- /dev/null +++ b/src/Map/src/Bridge/Google/assets/vitest.config.mjs @@ -0,0 +1,29 @@ +import { defineConfig, mergeConfig } from 'vitest/config'; +import configShared from '../../../../../../vitest.config.mjs' + +export default mergeConfig( + configShared, + defineConfig({ + resolve: { + alias: { + '@symfony/ux-map': __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: { + browser: { + enabled: true, + provider: 'playwright', // or 'webdriverio' + name: 'chromium', // browser name is required + headless: true, + }, + }, + }) +); 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/.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 diff --git a/src/Map/src/Bridge/Leaflet/CHANGELOG.md b/src/Map/src/Bridge/Leaflet/CHANGELOG.md index 2b5de26f0c4..e380bd8e66c 100644 --- a/src/Map/src/Bridge/Leaflet/CHANGELOG.md +++ b/src/Map/src/Bridge/Leaflet/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG -## Unreleased +## 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 219cf511592..a267776de69 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: @@ -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..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/abstract-map-controller'; -import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; +import AbstractMapController 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, + }); + } + 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; + } + 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; + } +} +default_1.values = { + providerOptions: Object, + view: Object, +}; + +class map_controller extends default_1 { connect() { L.Marker.prototype.options.icon = L.divIcon({ html: '', @@ -18,7 +68,7 @@ class map_controller extends AbstractMapController { prefix: 'ux:map', detail: { ...payload, - leaflet: L, + L, }, }); } @@ -38,19 +88,30 @@ class map_controller extends AbstractMapController { 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/package.json b/src/Map/src/Bridge/Leaflet/assets/package.json index 97d1014e125..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": { @@ -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/src/map_controller.ts b/src/Map/src/Bridge/Leaflet/assets/src/map_controller.ts index 7cccc56928c..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/abstract-map-controller'; -import type { Point, MarkerDefinition } from '@symfony/ux-map/abstract-map-controller'; +import AbstractMapController 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({ @@ -33,7 +35,7 @@ export default class extends AbstractMapController< prefix: 'ux:map', detail: { ...payload, - leaflet: L, + L, }, }); } @@ -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/assets/vitest.config.js b/src/Map/src/Bridge/Leaflet/assets/vitest.config.js deleted file mode 100644 index 276e4b0d1be..00000000000 --- a/src/Map/src/Bridge/Leaflet/assets/vitest.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config'; -import configShared from '../../../../../../vitest.config.js' - -export default mergeConfig( - configShared, - defineConfig({ - resolve: { - alias: { - '@symfony/ux-map/abstract-map-controller': __dirname + '/../../../../assets/src/abstract_map_controller.ts', - 'leaflet/dist/leaflet.min.css': 'leaflet/dist/leaflet.css', - }, - }, - test: { - // We need a browser(-like) environment to run the tests - environment: 'happy-dom', - }, - }) -); diff --git a/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs b/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs new file mode 100644 index 00000000000..8fb88b882e3 --- /dev/null +++ b/src/Map/src/Bridge/Leaflet/assets/vitest.config.mjs @@ -0,0 +1,30 @@ +import { defineConfig, mergeConfig } from 'vitest/config'; +import configShared from '../../../../../../vitest.config.mjs' + +export default mergeConfig( + configShared, + defineConfig({ + resolve: { + alias: { + '@symfony/ux-map': __dirname + '/../../../../assets/src/abstract_map_controller.ts', + '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: { + browser: { + enabled: true, + provider: 'playwright', // or 'webdriverio' + name: 'chromium', // browser name is required + headless: true, + }, + }, + }) +); 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/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..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,46 @@ 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), ]; } + + /** + * @param array{ + * center?: array{lat: float, lng: float}, + * zoom?: float, + * markers?: list, + * polygons?: 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']); + + $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/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/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/MapExtension.php b/src/Map/src/Twig/MapExtension.php index b55e5de562d..6442ff1b340 100644 --- a/src/Map/src/Twig/MapExtension.php +++ b/src/Map/src/Twig/MapExtension.php @@ -11,7 +11,7 @@ namespace Symfony\UX\Map\Twig; -use Symfony\UX\Map\Renderer\Renderers; +use Twig\DeprecatedCallableInfo; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -22,8 +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']]); + return [ + 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', [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..cfb47560bd2 --- /dev/null +++ b/src/Map/src/Twig/MapRuntime.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\Twig; + +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; + +/** + * @author Simon André + * + * @internal + */ +final class MapRuntime implements RuntimeExtensionInterface +{ + public function __construct( + private readonly RendererInterface $renderer, + ) { + } + + /** + * @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 { + 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)); + } + foreach ($polygons ?? [] as $polygons) { + $map->addPolygon(Polygon::fromArray($polygons)); + } + 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..39e362b34b9 --- /dev/null +++ b/src/Map/src/Twig/UXMapComponent.php @@ -0,0 +1,38 @@ + + * + * 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; +use Symfony\UX\Map\Polygon; + +/** + * @author Simon André + * + * @internal + */ +final class UXMapComponent +{ + public ?float $zoom; + + public ?Point $center; + + /** + * @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 new file mode 100644 index 00000000000..51034c53b4d --- /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, 'polygons' => 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..fcff3b0539c --- /dev/null +++ b/src/Map/tests/MapFactoryTest.php @@ -0,0 +1,156 @@ + + * + * 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']); + + $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 + { + $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); + } + + 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 [ + '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', + ], + ], + ], + '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 c108e8f67c0..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); } @@ -83,7 +86,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 [ @@ -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); 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]), + ); + } +} 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(), ])); 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/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/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/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/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/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/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/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/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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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/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/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']]), + ]; } /** 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/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/doc/index.rst b/src/TwigComponent/doc/index.rst index d1fa5ee12fc..cb6e22ad55b 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 }}
    @@ -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 ~~~~~~~~~~~~~~~~~~~~~ @@ -295,17 +297,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 +326,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 +348,7 @@ close tag, it's passed to your component template as the block called .. code-block:: html+twig -
    +
    {% block content %}{% endblock %}
    @@ -450,7 +457,7 @@ passed to ``mount()``. .. code-block:: html+twig @@ -592,7 +599,7 @@ name is determined by the location of the template: .. code-block:: html+twig {# templates/components/Button/Primary.html.twig #} - @@ -641,7 +648,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 +1002,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 +1027,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 +1047,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 +1062,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 +1082,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 +1109,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 %}
    @@ -1149,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.), @@ -1162,7 +1176,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 +1236,7 @@ with the ``cva()`` function: // ... }) %} -
    +
    {% block content %}{% endblock %}
    @@ -1238,7 +1252,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 +1305,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', @@ -1578,11 +1592,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 ------------- @@ -1634,7 +1681,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 @@ -1721,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 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/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/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/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/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/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/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/src/Twig/ComponentExtension.php b/src/TwigComponent/src/Twig/ComponentExtension.php index 82fa37a972a..f577ae08dcc 100644 --- a/src/TwigComponent/src/Twig/ComponentExtension.php +++ b/src/TwigComponent/src/Twig/ComponentExtension.php @@ -11,12 +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\Error\RuntimeError; +use Twig\DeprecatedCallableInfo; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -25,24 +21,17 @@ * * @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('cva', [$this, 'cva']), + 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')] + : ['deprecated' => '2.20', 'deprecating_package' => 'symfony/ux-twig-component', 'alternative' => 'html_cva']), + ]), ]; } @@ -54,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. * @@ -105,6 +62,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'] ?? [], @@ -112,18 +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; - } - - 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); - } } diff --git a/src/TwigComponent/src/Twig/ComponentNode.php b/src/TwigComponent/src/Twig/ComponentNode.php index 5fd9b2f5f82..439175c5bfa 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); @@ -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/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 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)) { 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) }} 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/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/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(); 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/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/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 { diff --git a/src/TwigComponent/tests/Unit/ComponentAttributesTest.php b/src/TwigComponent/tests/Unit/ComponentAttributesTest.php index 824a148f7d3..8ed7aa4f004 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;'; @@ -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()); } @@ -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/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()); + } +} 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/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(); 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/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/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 ); } 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) 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/app.scss b/ux.symfony.com/assets/styles/app.scss index 20a3353bff1..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"; @@ -85,6 +142,7 @@ @import "components/PackageHeader"; @import "components/PackageBox"; @import "components/Cookbook"; +@import "components/SupportBox"; @import "components/Tabs"; @import "components/Tag"; @import "components/Terminal"; 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..7e6f456480e 100644 --- a/ux.symfony.com/assets/styles/components/_Banner.scss +++ b/ux.symfony.com/assets/styles/components/_Banner.scss @@ -5,32 +5,23 @@ .Banner { background: #0A0A0A; color: #fff; + transition: transform 250ms linear; } .Banner + .App { position: relative; } .Banner:has(+ .App .AppHeader.open) { - display: none; + transform: translateY(-100%); } .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 +33,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 +57,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 +88,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/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/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 { diff --git a/ux.symfony.com/assets/styles/components/_SupportBox.scss b/ux.symfony.com/assets/styles/components/_SupportBox.scss new file mode 100644 index 00000000000..1c87124a431 --- /dev/null +++ b/ux.symfony.com/assets/styles/components/_SupportBox.scss @@ -0,0 +1,88 @@ +.SupportBox { + --space-large: 1.5rem; + --bg-color: var(--bs-body-bg); + + border: 1px solid var(--bs-secondary-bg); + border-radius: var(--border-radius); + display: flex; + flex-direction: column; + gap: var(--space-large); + padding: var(--space-large); + position: relative; + place-self: stretch; + background: var(--bg-color); + transition: transform 750ms ease-in-out; + + &:hover { + transition: transform 200ms ease-in-out; + transform: translateY(-.25rem); + } +} + +@media screen and (max-width: 800px) { + .SupportBox { + --space-large: 1rem; + } +} + +.SupportBox_logo { + --logo-size: 3rem; + width: var(--logo-size); + height: var(--logo-size); + border-radius: 14%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + + svg { + width: 100%; + height: auto; + } + + @media screen and (max-width: 740px) { + --logo-size: 4rem; + } +} + +.SupportBox_badge { + position: absolute; + top: var(--space-large, 1rem); + right: var(--space-large, 1rem); + .Badge { + background: var(--bs-secondary-bg); + border: 1px solid var(--bs-secondary-bg); + } +} + +.SupportBox_content { + display: flex; + flex-direction: column; + justify-content: center; + flex: 1 1 auto; + gap: 1rem; +} + +.SupportBox_title { + font-weight: 500; + font-size: 2rem; + color: var(--bs-body-color); + text-decoration: none; + margin: 0; +} + +.SupportBox_link { + &:after { + content: ''; + position: absolute; + inset: 0 0; + z-index: 40; + } +} + +.SupportBox_description { + line-height: 1.5; + margin-bottom: 0; +} + + diff --git a/ux.symfony.com/assets/styles/sections/_nav.scss b/ux.symfony.com/assets/styles/sections/_nav.scss index 7f2827b98d8..df616e9916b 100644 --- a/ux.symfony.com/assets/styles/sections/_nav.scss +++ b/ux.symfony.com/assets/styles/sections/_nav.scss @@ -50,16 +50,19 @@ transform: translateY(-20%); opacity: 0; z-index: -1; - transition: transform 250ms ease-out; + transition: transform 350ms ease-out; width: 100%; flex-direction: column; padding: 1rem; gap: 1rem; + height: 0; } .AppHeader.open .AppNav_menu { transform: translateY(0); + transition: transform 500ms ease-out, height 500ms ease-out; opacity: 1; z-index: 1; + height: auto; } .AppNav_menu a { font-size: 1.5rem; @@ -94,6 +97,11 @@ opacity: 1; } } +.AppNav_item--desktop { + @media (min-width: 860px) { + display: none; + } +} .AppNav_actions .AppNav_item:hover { transform: scale(1.1); diff --git a/ux.symfony.com/assets/styles/vendor/_highlight.scss b/ux.symfony.com/assets/styles/vendor/_highlight.scss index 2eb5e6f4503..18abc50606a 100644 --- a/ux.symfony.com/assets/styles/vendor/_highlight.scss +++ b/ux.symfony.com/assets/styles/vendor/_highlight.scss @@ -33,7 +33,7 @@ } .hl-comment { - color: #6e738d; + color: #a3af87; } .hl-blur { 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 472010b4920..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", @@ -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.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "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/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "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.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+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", @@ -5331,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" @@ -5389,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": [ { @@ -5405,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\"" @@ -5473,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": [ { @@ -5489,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" @@ -5557,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": [ { @@ -5573,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" @@ -5638,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": [ { @@ -5654,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": "*" @@ -5718,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": [ { @@ -5734,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": "*" @@ -5797,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": [ { @@ -5813,7 +5813,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", @@ -5878,16 +5878,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 +5934,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 +5950,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 +6038,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 +6099,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 +6115,7 @@ "type": "tidelift" } ], - "time": "2024-07-17T06:10:24+00:00" + "time": "2024-08-29T08:16:25+00:00" }, { "name": "symfony/runtime", @@ -6198,16 +6198,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 +6275,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 +6291,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 +6510,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 +6577,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 +6593,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:25:37+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "symfony/translation", @@ -6769,16 +6769,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 +6858,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 +6874,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 +7044,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 +7098,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 +7114,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 +7122,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 +7191,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 +7207,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:54:57+00:00" + "time": "2024-09-06T17:27:37+00:00" }, { "name": "symfony/ux-chartjs", @@ -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": { @@ -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", @@ -7358,7 +7358,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 +7438,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 +7462,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-icons.git", - "reference": "c4826439f464c23cc0c2e2a997252100d6049daa" + "reference": "69daedf0b4f278a6a7f326fb9aea1ab787ee7be6" }, "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/69daedf0b4f278a6a7f326fb9aea1ab787ee7be6", + "reference": "69daedf0b4f278a6a7f326fb9aea1ab787ee7be6", "shasum": "" }, "require": { @@ -7527,7 +7527,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 +7543,7 @@ "type": "tidelift" } ], - "time": "2024-08-07T13:07:19+00:00" + "time": "2024-09-14T20:31:15+00:00" }, { "name": "symfony/ux-lazy-image", @@ -7551,12 +7551,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 +7623,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 +7631,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-leaflet-map.git", - "reference": "b5f6a7d053646c0d7272cde50822e1d1240139f0" + "reference": "ba957b5e04652177b00284200455610bff4d1b45" }, "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/ba957b5e04652177b00284200455610bff4d1b45", + "reference": "ba957b5e04652177b00284200455610bff4d1b45", "shasum": "" }, "require": { @@ -7676,7 +7676,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 +7692,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:54:07+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": "9b292543eed8ae0d760d7f5e5397e91e632f2cf5" + "reference": "ac6f0e7b99d3783a71d38d84a885a16a82cb68fe" }, "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/ac6f0e7b99d3783a71d38d84a885a16a82cb68fe", + "reference": "ac6f0e7b99d3783a71d38d84a885a16a82cb68fe", "shasum": "" }, "require": { @@ -7737,7 +7737,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 +7770,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 +7786,7 @@ "type": "tidelift" } ], - "time": "2024-08-11T12:24:16+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": "216594c4bed747b9a580d5f92cdd331152d94c00" + "reference": "3185ecf75b0b2618b529703f8f5caab070e19ca2" }, "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/3185ecf75b0b2618b529703f8f5caab070e19ca2", + "reference": "3185ecf75b0b2618b529703f8f5caab070e19ca2", "shasum": "" }, "require": { @@ -7865,7 +7865,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T11:50:02+00:00" + "time": "2024-09-11T06:56:52+00:00" }, { "name": "symfony/ux-notify", @@ -7873,12 +7873,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 +7948,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 +7956,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-react.git", - "reference": "6518cecc62c800b1ece02b70d1dec0067d012495" + "reference": "35a3e878e6211169ffb634b788815ecb0c5bccf4" }, "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/35a3e878e6211169ffb634b788815ecb0c5bccf4", + "reference": "35a3e878e6211169ffb634b788815ecb0c5bccf4", "shasum": "" }, "require": { @@ -8025,7 +8025,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+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": "cbd401041a605e14010a82066b378a0be01734e8" + "reference": "9893ad99cdb6653832e7478312f5e6e1e719341b" }, "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/9893ad99cdb6653832e7478312f5e6e1e719341b", + "reference": "9893ad99cdb6653832e7478312f5e6e1e719341b", "shasum": "" }, "require": { @@ -8106,7 +8106,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-09-10T12:38:04+00:00" }, { "name": "symfony/ux-swup", @@ -8158,7 +8158,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 +8239,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 +8316,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 +8340,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "4a38f267193017958d487171c0a86e64f36164a3" + "reference": "5eaa803dea9f954aa124963f2c872b414d97cc97" }, "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/5eaa803dea9f954aa124963f2c872b414d97cc97", + "reference": "5eaa803dea9f954aa124963f2c872b414d97cc97", "shasum": "" }, "require": { @@ -8430,7 +8430,7 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+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": "7f8d4891e8e3a3303de11bfc7224b176a23a2c1c" + "reference": "456cb00dedf7a4f1bb92a6a9ff7a5efef8a3a332" }, "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/456cb00dedf7a4f1bb92a6a9ff7a5efef8a3a332", + "reference": "456cb00dedf7a4f1bb92a6a9ff7a5efef8a3a332", "shasum": "" }, "require": { @@ -8499,7 +8499,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 +8515,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T03:00:01+00:00" + "time": "2024-09-11T06:56:52+00:00" }, { "name": "symfony/ux-typed", @@ -8567,7 +8567,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 +8591,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/ux-vue.git", - "reference": "3f2966b0677f2b025bf3966fc50ee8e43f8f1caf" + "reference": "8c4bcb86fa6a2b9770e9f6c7fabeee647a359b5f" }, "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/8c4bcb86fa6a2b9770e9f6c7fabeee647a359b5f", + "reference": "8c4bcb86fa6a2b9770e9f6c7fabeee647a359b5f", "shasum": "" }, "require": { @@ -8664,20 +8664,20 @@ "type": "tidelift" } ], - "time": "2024-08-14T04:55:38+00:00" + "time": "2024-09-10T12:38:04+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 +8745,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 +8761,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 +8828,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 +8844,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 +9007,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 +9058,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 +9074,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 +9187,16 @@ }, { "name": "tempest/highlight", - "version": "2.8.2", + "version": "2.10.3", "source": { "type": "git", "url": "https://github.com/tempestphp/highlight.git", - "reference": "7901d5f3d632fdcd3a0c1c360af7bfdcf8785f65" + "reference": "ba50ebfe88e513b3de4f7d7c02be331d0b9035aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tempestphp/highlight/zipball/7901d5f3d632fdcd3a0c1c360af7bfdcf8785f65", - "reference": "7901d5f3d632fdcd3a0c1c360af7bfdcf8785f65", + "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.8.2" + "source": "https://github.com/tempestphp/highlight/tree/2.10.3" }, "funding": [ { @@ -9241,7 +9241,7 @@ "type": "github" } ], - "time": "2024-08-14T12:31:48+00:00" + "time": "2024-09-12T08:06:29+00:00" }, { "name": "twbs/bootstrap", @@ -9295,23 +9295,23 @@ }, { "name": "twig/extra-bundle", - "version": "v3.11.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "bf8a304eac15838d7724fdf64c345bdefbb75f03" + "reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5" }, "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/21a9a7aa9f79d4493bb6fed4eb2794339f9551f5", + "reference": "21a9a7aa9f79d4493bb6fed4eb2794339f9551f5", "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" + "twig/twig": "^3.0|^4.0" }, "require-dev": { "league/commonmark": "^1.0|^2.0", @@ -9353,7 +9353,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.13.0" }, "funding": [ { @@ -9365,27 +9365,27 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-09-01T20:39:12+00:00" }, { "name": "twig/html-extra", - "version": "v3.11.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", - "reference": "e5de60eb0afb24a60f371de428864b5df9414aa6" + "reference": "8229e750091171c1f11801a525927811c7ac5a7e" }, "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/8229e750091171c1f11801a525927811c7ac5a7e", + "reference": "8229e750091171c1f11801a525927811c7ac5a7e", "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" + "twig/twig": "^3.13|^4.0" }, "require-dev": { "symfony/phpunit-bridge": "^6.4|^7.0" @@ -9421,7 +9421,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/html-extra/tree/v3.13.0" }, "funding": [ { @@ -9433,26 +9433,26 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-09-03T13:08:40+00:00" }, { "name": "twig/intl-extra", - "version": "v3.11.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566" + "reference": "1b8d78c5db08bdc61015fd55009d2e84b3aa7e38" }, "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/1b8d78c5db08bdc61015fd55009d2e84b3aa7e38", + "reference": "1b8d78c5db08bdc61015fd55009d2e84b3aa7e38", "shasum": "" }, "require": { - "php": ">=7.2.5", + "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" @@ -9485,7 +9485,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.13.0" }, "funding": [ { @@ -9497,26 +9497,26 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-09-03T13:08:40+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.11.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "504557d60d80478260ebd2221a2b3332a480865d" + "reference": "25f23c02936f8c7157a8413154c06a462c9c20d3" }, "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/25f23c02936f8c7157a8413154c06a462c9c20d3", + "reference": "25f23c02936f8c7157a8413154c06a462c9c20d3", "shasum": "" }, "require": { - "php": ">=7.2.5", + "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", @@ -9557,7 +9557,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.13.0" }, "funding": [ { @@ -9569,27 +9569,27 @@ "type": "tidelift" } ], - "time": "2024-08-07T17:34:09+00:00" + "time": "2024-09-03T20:17:35+00:00" }, { "name": "twig/string-extra", - "version": "v3.11.0", + "version": "v3.13.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", - "reference": "d25c61baf38705a72ebb5a92d2e9ecb7c473b8ac" + "reference": "148e869d87cf4bea9d97896ab49e048e4add3310" }, "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/148e869d87cf4bea9d97896ab49e048e4add3310", + "reference": "148e869d87cf4bea9d97896ab49e048e4add3310", "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" + "twig/twig": "^3.13|^4.0" }, "require-dev": { "symfony/phpunit-bridge": "^6.4|^7.0" @@ -9624,7 +9624,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.13.0" }, "funding": [ { @@ -9636,28 +9636,27 @@ "type": "tidelift" } ], - "time": "2024-08-07T17:34:09+00:00" + "time": "2024-09-03T13:08:40+00:00" }, { "name": "twig/twig", - "version": "v3.11.0", + "version": "v3.14.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d" + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", - "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", + "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "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 +9703,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.14.0" }, "funding": [ { @@ -9716,7 +9715,7 @@ "type": "tidelift" } ], - "time": "2024-08-08T16:15:16+00:00" + "time": "2024-09-09T17:55:12+00:00" } ], "packages-dev": [ @@ -10154,35 +10153,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 +10190,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -10220,7 +10219,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 +10227,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 +11812,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 +11884,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 +11900,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 +11966,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 +11982,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 +12047,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 +12063,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-12T09:59:40+00:00" }, { "name": "theseer/tokenizer", @@ -12118,16 +12117,16 @@ }, { "name": "vincentlanglet/twig-cs-fixer", - "version": "3.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "ac11c63f17322e31dc6d8c5e8dada54423d66fe0" + "reference": "a0e552fbd6fe264f09f6389a950347a7bf70cfb9" }, "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/a0e552fbd6fe264f09f6389a950347a7bf70cfb9", + "reference": "a0e552fbd6fe264f09f6389a950347a7bf70cfb9", "shasum": "" }, "require": { @@ -12139,11 +12138,11 @@ "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": { - "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.1" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.1.0" }, "funding": [ { @@ -12194,7 +12193,7 @@ "type": "github" } ], - "time": "2024-08-13T16:27:40+00:00" + "time": "2024-08-30T11:23:49+00:00" }, { "name": "webmozart/assert", @@ -12446,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": { @@ -12498,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/", @@ -12513,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.", @@ -12528,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": [ { @@ -12536,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/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/cookbook/component_architecture.md b/ux.symfony.com/cookbook/component_architecture.md index 57d2eb908b6..d178c87d4ad 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,90 +11,89 @@ 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
    - + {{ message }}
    ``` -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 - + - + ``` -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 {% props type, icon, message %}
    - + {{ message }}
    ``` -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. 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', ], ]; diff --git a/ux.symfony.com/src/Controller/DocumentationController.php b/ux.symfony.com/src/Controller/DocumentationController.php new file mode 100644 index 00000000000..daacda7822e --- /dev/null +++ b/ux.symfony.com/src/Controller/DocumentationController.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller; + +use App\Service\UxPackageRepository; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class DocumentationController extends AbstractController +{ + #[Route('/documentation', name: 'app_documentation')] + public function __invoke(UxPackageRepository $packageRepository): Response + { + $packages = $packageRepository->findAll(); + usort($packages, fn ($a, $b) => $a->getHumanName() <=> $b->getHumanName()); + + return $this->render('documentation/index.html.twig', [ + 'packages' => $packages, + ]); + } +} diff --git a/ux.symfony.com/src/Controller/SitemapController.php b/ux.symfony.com/src/Controller/SitemapController.php index bfd51c6a893..e139565d866 100644 --- a/ux.symfony.com/src/Controller/SitemapController.php +++ b/ux.symfony.com/src/Controller/SitemapController.php @@ -48,7 +48,10 @@ private function getSitemapUrls(): iterable yield $this->generateAbsoluteUrl('app_packages'); yield $this->generateAbsoluteUrl('app_icons'); yield $this->generateAbsoluteUrl('app_demos'); + yield $this->generateAbsoluteUrl('app_cookbook'); + yield $this->generateAbsoluteUrl('app_documentation'); yield $this->generateAbsoluteUrl('app_changelog'); + yield $this->generateAbsoluteUrl('app_support'); // UX Packages foreach ($this->uxPackageRepository->findAll() as $package) { diff --git a/ux.symfony.com/src/Controller/SupportController.php b/ux.symfony.com/src/Controller/SupportController.php new file mode 100644 index 00000000000..6a0106c2891 --- /dev/null +++ b/ux.symfony.com/src/Controller/SupportController.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller; + +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +class SupportController extends AbstractController +{ + #[Route('/support', name: 'app_support')] + public function __invoke(): Response + { + return $this->render('support.html.twig'); + } +} 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/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/_aside.html.twig b/ux.symfony.com/templates/_aside.html.twig index b9fbdc0e1bf..bc44205fa8f 100644 --- a/ux.symfony.com/templates/_aside.html.twig +++ b/ux.symfony.com/templates/_aside.html.twig @@ -5,21 +5,21 @@ - + {% endblock %}
    diff --git a/ux.symfony.com/templates/_banner.html.twig b/ux.symfony.com/templates/_banner.html.twig index 403904abeca..eb02f25b1d0 100644 --- a/ux.symfony.com/templates/_banner.html.twig +++ b/ux.symfony.com/templates/_banner.html.twig @@ -1,21 +1,14 @@ 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 %} 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 %} 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]); } /** diff --git a/vitest.config.js b/vitest.config.mjs similarity index 100% rename from vitest.config.js rename to vitest.config.mjs diff --git a/yarn.lock b/yarn.lock index a0030d02357..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== @@ -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== +"@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-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== +"@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-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@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-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== +"@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-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@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-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== +"@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/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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/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/helper-plugin-utils" "^7.24.8" -"@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== +"@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.20.2" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-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/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-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== +"@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-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" + "@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-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== +"@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-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== +"@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-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== +"@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-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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.9" + "@babel/helper-create-regexp-features-plugin" "^7.25.0" + "@babel/helper-plugin-utils" "^7.24.8" -"@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== +"@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/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/helper-plugin-utils" "^7.24.7" "@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== +"@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-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/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-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== +"@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/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/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-flow" "^7.24.7" -"@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== +"@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/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@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== +"@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-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@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-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== +"@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-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== +"@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-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.8" -"@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== +"@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-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/helper-plugin-utils" "^7.24.7" "@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== +"@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-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.8" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-simple-access" "^7.24.7" -"@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== +"@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-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@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-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== +"@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-module-transforms" "^7.23.0" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-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/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== +"@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-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/helper-plugin-utils" "^7.24.7" -"@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== +"@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-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-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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - 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-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-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.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@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-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/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^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.22.15" + "@babel/plugin-transform-parameters" "^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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@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-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.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^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-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-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-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.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@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-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-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.20.2" + "@babel/helper-plugin-utils" "^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-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.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@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-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-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - 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/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-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-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-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@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-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.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@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-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/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^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== + 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-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== + 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-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/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== - 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-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-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-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@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-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-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-annotate-as-pure" "^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/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-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/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.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== - 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/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== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@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== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@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== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@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== - 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/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" + 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/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" - 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": @@ -1987,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" @@ -1995,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" @@ -2161,6 +1354,57 @@ 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" + 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 +1635,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 +1672,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 +1682,12 @@ 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/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.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,11 +1695,49 @@ "@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" 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" @@ -2480,6 +1750,16 @@ 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== + +"@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" @@ -2508,17 +1788,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 +1819,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 +1865,175 @@ 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-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" @@ -2704,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" @@ -2747,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" @@ -2762,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" @@ -2806,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" @@ -2828,7 +2294,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== @@ -2884,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" @@ -2897,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" @@ -2955,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" @@ -2962,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" @@ -3002,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" @@ -3153,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" @@ -3180,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== @@ -3197,6 +2708,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 +2737,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" @@ -3244,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" @@ -3259,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" @@ -3307,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" @@ -3405,53 +2926,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 +3066,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 +3076,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 +3170,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" @@ -3690,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" @@ -3714,7 +3209,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== @@ -3731,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== @@ -3756,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" @@ -3820,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" @@ -3935,7 +3438,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== @@ -3945,29 +3448,27 @@ 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" 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 +3671,20 @@ 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" + +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" @@ -4185,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" @@ -4310,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== @@ -4362,6 +3875,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 +3887,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 +3907,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" @@ -4401,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" @@ -4491,39 +4009,45 @@ 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" 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" @@ -4626,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" @@ -4784,6 +4323,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" @@ -4819,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" @@ -4866,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== @@ -4909,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" @@ -4929,6 +4486,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 +4510,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" @@ -4986,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" @@ -5005,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" @@ -5105,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" @@ -5144,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" @@ -5315,9 +4879,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" @@ -5441,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" @@ -5516,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" @@ -5664,6 +5238,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,16 +5751,11 @@ 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== -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" @@ -6254,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" @@ -6308,13 +5881,18 @@ 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" +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" @@ -6329,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== @@ -6341,14 +5919,14 @@ 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== +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.4.13" + "@jridgewell/sourcemap-codec" "^1.5.0" -magic-string@^0.30.1, magic-string@^0.30.3: +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== @@ -6505,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" @@ -6524,11 +6107,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" @@ -6537,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" @@ -6559,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" @@ -6569,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" @@ -6584,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" @@ -6647,10 +6275,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" @@ -6698,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" @@ -6790,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" @@ -6816,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" @@ -6833,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" @@ -6867,6 +6507,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" @@ -6914,25 +6559,43 @@ 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" 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-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" @@ -6948,6 +6611,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" @@ -6970,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" @@ -7253,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== @@ -7262,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" @@ -7294,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" @@ -7429,17 +7120,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" @@ -7652,18 +7341,54 @@ rollup@^2.35.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" - 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@^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 +7478,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 +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.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" @@ -7925,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" @@ -8032,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" @@ -8044,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" @@ -8057,6 +7811,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 +7829,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 +7880,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 +7901,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" @@ -8137,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" @@ -8144,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" @@ -8287,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" @@ -8352,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" @@ -8362,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" @@ -8379,11 +8183,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" @@ -8391,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== @@ -8411,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" @@ -8467,15 +8281,15 @@ 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== -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== +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== unbox-primitive@^1.0.2: version "1.0.2" @@ -8487,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" @@ -8538,14 +8357,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 +8365,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" @@ -8599,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" @@ -8641,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" @@ -8718,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" @@ -8735,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" @@ -8820,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" @@ -8833,6 +8636,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 +8663,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" @@ -8871,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" @@ -8936,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== @@ -8949,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==