From 677f8d776c7efa4be5ba065490e52c38cb033f0b Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Sun, 4 Jan 2026 15:04:25 +0100 Subject: [PATCH] [3.0] Update Symfony to 7.4 and dependencies, removed deprecated code, removed API password (#5622) * deactivate deprecated auto-mapping * use native month-picker with fallback on old browser * bump dependencies to new major versions * replace deprecated ARRAY column type with JSON * named arguments * nullable arguments * native lazy ghosts * update routes to use php config * disable PHP < 8.4 * use static RTL configuration * new qr code package * clear out env file * recipe updates * fix deprecations * preset new env variable if not existing * bump maria db version examples * remove deprecated api-token support * fix validator deprecations * remove timesheet category column * fix broken validator autoconfiguration * stabilize tests * fix migration syntax compatibility * fix doctrine deprecation * fix datetime format * remove constructor dependency * only include visible preferences in invoice templates * fix test container dependency * removed ProjectConstraint multi-constraint logic * allow to disable plugins in certain environments * refactor TimesheetConstraint to non-service * activate new interface methods * prevent update issues with .env * improved customer fixture * removed $user->isExportDecimal() --- .editorconfig | 24 +- .env.dist | 63 +- .github/workflows/testing.yaml | 2 +- .gitignore | 8 +- UPGRADING-2.md | 50 + UPGRADING-3.md | 26 +- UPGRADING.md | 51 +- assets/js/KimaiLoader.js | 2 + assets/js/forms/KimaiMonthPicker.js | 44 + bin/console | 4 +- composer.json | 82 +- composer.lock | 2890 ++++++++--------- config/bundles.php | 2 +- config/locales.php | 312 +- config/packages/assets.yaml | 6 - config/packages/cache.yaml | 17 - .../packages/dama_doctrine_test_bundle.yaml | 5 + config/packages/debug.yaml | 5 + config/packages/doctrine.yaml | 30 +- config/packages/doctrine_migrations.yaml | 9 +- config/packages/fos_rest.yaml | 1 + config/packages/framework.yaml | 3 + config/packages/jms_serializer.yaml | 21 +- config/packages/monolog.yaml | 86 +- config/packages/nelmio_cors.yaml | 2 +- config/packages/routing.yaml | 5 +- config/packages/security.yaml | 33 +- config/packages/twig.yaml | 8 +- config/packages/web_profiler.yaml | 12 +- config/packages/webpack_encore.yaml | 48 +- config/routes.yaml | 13 +- config/routes/dev/twig.yaml | 5 - config/routes/dev/web_profiler.yaml | 7 - config/routes/framework.yaml | 6 + config/routes/security.yaml | 3 + config/routes/web_profiler.yaml | 8 + config/services.yaml | 23 +- config/services_test.yaml | 25 - migrations/.gitignore | 0 migrations/Version20190510205245.php | 4 +- migrations/Version20190617100845.php | 8 +- migrations/Version20190730123324.php | 8 +- migrations/Version20191108151534.php | 4 +- migrations/Version20200109102138.php | 4 +- migrations/Version20200205115243.php | 6 +- migrations/Version20200308171950.php | 2 +- migrations/Version20200524142042.php | 2 +- migrations/Version20200725213424.php | 2 +- migrations/Version20210316224358.php | 2 +- migrations/Version20210802174318.php | 4 +- migrations/Version20220101204501.php | 2 +- migrations/Version20230327143628.php | 2 +- migrations/Version20240214061246.php | 2 +- migrations/Version20250608143244.php | 2 +- migrations/Version20260101010000.php | 109 + package.json | 113 +- phpstan.neon | 182 +- phpunit.xml.dist | 139 +- public/build/app.03312b52.js | 2 + ...ICENSE.txt => app.03312b52.js.LICENSE.txt} | 0 public/build/app.1899dc33.js | 2 - public/build/app.9662939e.js | 2 - public/build/entrypoints.json | 4 +- public/build/manifest.json | 2 +- src/API/ActivityController.php | 6 +- src/API/Authentication/ApiRequestMatcher.php | 10 - .../ApiTokenMigratingListener.php | 59 - .../Authentication/ApiTokenUpgradeBadge.php | 43 - src/API/Authentication/TokenAuthenticator.php | 117 - src/API/CustomerController.php | 6 +- src/API/InvoiceController.php | 4 +- src/API/ProjectController.php | 6 +- src/API/StatusController.php | 22 +- src/API/TagController.php | 10 +- src/API/TeamController.php | 6 +- src/API/TimesheetController.php | 10 +- src/API/UserController.php | 10 +- src/Activity/ActivityService.php | 14 +- src/Command/AbstractUserCommand.php | 7 +- src/Command/ChangePasswordCommand.php | 6 + src/Command/CreateUserCommand.php | 8 +- src/Command/InvoiceCreateCommand.php | 3 - src/Command/RegenerateLocalesCommand.php | 15 - src/Command/ResetTestCommand.php | 1 - src/Configuration/LocaleService.php | 8 +- src/Configuration/SystemConfiguration.php | 50 +- src/Constants.php | 4 +- src/Controller/AbstractController.php | 2 +- src/Controller/ActivityController.php | 3 +- src/Controller/CustomerController.php | 3 +- src/Controller/ExportController.php | 15 +- src/Controller/HelpController.php | 10 +- src/Controller/InvoiceController.php | 8 +- src/Controller/PermissionController.php | 6 +- src/Controller/ProfileController.php | 47 +- src/Controller/ProjectController.php | 3 +- .../Security/PasswordResetController.php | 8 +- .../SystemConfigurationController.php | 34 +- src/Controller/TagController.php | 3 +- src/Controller/TeamController.php | 7 +- .../TimesheetAbstractController.php | 3 +- src/Controller/TimesheetTeamController.php | 4 +- src/Controller/UserController.php | 3 +- src/Customer/CustomerService.php | 20 +- src/Customer/CustomerStatisticService.php | 2 +- .../{AllFixtures.php => AppFixtures.php} | 2 +- src/DataFixtures/CustomerFixtures.php | 108 +- src/DataFixtures/InvoiceFixtures.php | 23 +- src/DataFixtures/UserFixtures.php | 9 - src/DependencyInjection/AppExtension.php | 3 +- .../Compiler/ConstraintCompilerPass.php | 26 + src/DependencyInjection/Configuration.php | 6 - src/Doctrine/AbstractMigration.php | 22 +- src/Doctrine/TimesheetSubscriber.php | 4 +- src/Doctrine/UTCDateTimeImmutableType.php | 5 +- src/Doctrine/UTCDateTimeType.php | 5 +- src/Entity/ExportableItem.php | 17 +- src/Entity/InvoiceTemplate.php | 55 +- src/Entity/MetaTableTypeInterface.php | 13 +- src/Entity/Rate.php | 2 +- src/Entity/Timesheet.php | 54 +- src/Entity/User.php | 242 +- src/Entity/UserPreference.php | 15 - src/Event/ConfigureMainMenuEvent.php | 14 - src/Event/PermissionSectionsEvent.php | 16 +- .../ThemeJavascriptTranslationsEvent.php | 61 - src/Event/WorkingTimeApproveMonthEvent.php | 8 - src/EventSubscriber/MenuBuilderSubscriber.php | 4 +- .../UserPreferenceSubscriber.php | 11 +- src/Export/Base/CsvRenderer.php | 2 - src/Export/Base/HtmlRenderer.php | 48 +- src/Export/Base/PDFRenderer.php | 56 +- src/Export/Base/PdfTemplateRenderer.php | 4 +- src/Export/Base/RendererTrait.php | 25 +- src/Export/Base/XlsxRenderer.php | 2 - src/Export/ColumnConverter.php | 9 +- src/Export/DefaultTemplate.php | 9 +- src/Export/ExportRendererInterface.php | 9 +- src/Export/Package/SpoutSpreadsheet.php | 6 +- .../Extractor/AnnotationExtractor.php | 8 - src/Form/API/TimesheetApiEditForm.php | 2 - src/Form/API/UserApiCreateForm.php | 13 - .../DurationStringToSecondsTransformer.php | 4 +- src/Form/InvoiceDocumentUploadForm.php | 12 +- src/Form/Model/UserContractModel.php | 2 +- src/Form/QuickEntryForm.php | 2 +- src/Form/Toolbar/AbstractToolbarForm.php | 33 - src/Form/Type/MailType.php | 2 +- src/Form/Type/MenuChoiceType.php | 1 - src/Form/Type/QuickEntryWeekType.php | 2 +- src/Form/Type/SearchTermType.php | 2 +- src/Form/Type/UserPreferenceType.php | 2 +- src/Form/UserApiPasswordType.php | 46 - src/Form/UserTwoFactorType.php | 2 +- src/Invoice/Calculator/AbstractCalculator.php | 11 +- .../Calculator/AbstractMergedCalculator.php | 2 +- src/Invoice/CalculatorInterface.php | 4 +- .../Hydrator/InvoiceItemDefaultHydrator.php | 14 +- .../Hydrator/InvoiceModelActivityHydrator.php | 2 +- .../Hydrator/InvoiceModelCustomerHydrator.php | 6 +- .../Hydrator/InvoiceModelDefaultHydrator.php | 49 +- .../Hydrator/InvoiceModelIssuerHydrator.php | 2 +- .../Hydrator/InvoiceModelProjectHydrator.php | 2 +- .../Hydrator/InvoiceModelUserHydrator.php | 2 +- src/Invoice/InvoiceItem.php | 9 - src/Invoice/InvoiceModel.php | 11 +- src/Invoice/InvoiceModelFactory.php | 6 +- src/Kernel.php | 18 +- src/Ldap/LdapManager.php | 6 - src/Model/PermissionSection.php | 5 +- src/Model/PermissionSectionInterface.php | 31 - src/Plugin/AbstractPluginExtension.php | 2 +- src/Plugin/PluginManager.php | 4 +- src/Plugin/PluginMetadata.php | 15 + src/Project/ProjectDuplicationService.php | 2 +- src/Project/ProjectService.php | 29 +- src/Project/ProjectStatisticService.php | 3 +- .../CustomerMonthlyProjectsRepository.php | 2 +- src/Repository/ActivityRepository.php | 3 + src/Repository/ApiUserRepository.php | 42 - src/Repository/CustomerRepository.php | 3 + src/Repository/InvoiceRepository.php | 3 + src/Repository/InvoiceTemplateRepository.php | 3 + src/Repository/Loader/DefaultLoader.php | 25 - .../Paginator/QueryBuilderPaginator.php | 66 - src/Repository/ProjectRepository.php | 3 + src/Repository/Query/TimesheetQuery.php | 7 +- src/Repository/Query/VisibilityTrait.php | 8 - src/Repository/RepositorySearchTrait.php | 69 - src/Repository/Result/TimesheetResult.php | 3 + src/Repository/TagRepository.php | 5 +- src/Repository/TeamRepository.php | 3 + src/Repository/TimesheetRepository.php | 88 +- src/Repository/UserRepository.php | 3 + src/Repository/WorkingTimeRepository.php | 29 - src/Saml/SamlProvider.php | 17 +- .../SamlAuthenticationFailureHandler.php | 2 +- .../SamlAuthenticationSuccessHandler.php | 2 +- src/Security/SessionHandler.php | 4 +- src/Security/UserChecker.php | 5 +- src/Timesheet/DateTimeFactory.php | 71 - src/Timesheet/RoundingService.php | 4 +- src/Timesheet/TimesheetService.php | 35 +- src/Timesheet/TrackingModeService.php | 4 +- src/Timesheet/Util.php | 40 - src/Twig/Context.php | 10 +- src/Twig/Extensions.php | 6 + src/Twig/PaginationExtension.php | 17 +- src/Twig/Runtime/QrCodeExtension.php | 21 +- src/Twig/Runtime/ThemeExtension.php | 32 +- src/Twig/SecurityPolicy/InvoicePolicy.php | 4 +- src/User/UserService.php | 18 +- src/Utils/DataTable.php | 38 +- src/Utils/PageSetup.php | 8 +- src/Utils/Pagination.php | 8 + src/Utils/Parsedown.php | 2 +- src/Utils/ParsedownExtension.php | 2 +- src/Utils/SearchTerm.php | 63 +- .../Attribute/TimesheetConstraint.php | 15 + src/Validator/Constraints/Activity.php | 2 +- src/Validator/Constraints/ColorChoices.php | 6 +- src/Validator/Constraints/Customer.php | 4 +- src/Validator/Constraints/DateTimeFormat.php | 10 +- src/Validator/Constraints/Duration.php | 5 +- src/Validator/Constraints/ExportRenderer.php | 4 +- src/Validator/Constraints/HexColor.php | 4 +- src/Validator/Constraints/Project.php | 6 +- .../Constraints/ProjectConstraint.php | 21 - .../Constraints/ProjectValidator.php | 15 +- src/Validator/Constraints/QuickEntryModel.php | 4 +- .../QuickEntryTimesheetValidator.php | 14 +- src/Validator/Constraints/Role.php | 10 +- src/Validator/Constraints/RoleName.php | 10 +- src/Validator/Constraints/Team.php | 4 +- src/Validator/Constraints/TimeFormat.php | 4 +- .../{Timesheet.php => TimesheetAll.php} | 2 +- ...alidator.php => TimesheetAllValidator.php} | 18 +- src/Validator/Constraints/TimesheetBasic.php | 26 +- .../Constraints/TimesheetBudgetUsed.php | 6 +- .../Constraints/TimesheetConstraint.php | 21 - .../Constraints/TimesheetDeactivated.php | 17 +- .../Constraints/TimesheetExported.php | 12 +- .../Constraints/TimesheetFutureTimes.php | 15 +- .../Constraints/TimesheetLockdown.php | 16 +- .../TimesheetLockdownValidator.php | 13 +- .../Constraints/TimesheetLongRunning.php | 14 +- .../Constraints/TimesheetMultiUpdate.php | 22 +- .../Constraints/TimesheetMultiUser.php | 10 +- .../TimesheetMultiUserValidator.php | 3 +- .../Constraints/TimesheetNegativeDuration.php | 12 +- .../Constraints/TimesheetOverlapping.php | 12 +- .../Constraints/TimesheetRestart.php | 12 +- .../Constraints/TimesheetZeroDuration.php | 18 +- src/Validator/Constraints/User.php | 16 +- src/Voter/ActivityVoter.php | 5 +- src/Voter/ApiVoter.php | 3 +- src/Voter/CustomerVoter.php | 5 +- src/Voter/EntityMultiRoleVoter.php | 7 +- src/Voter/ProjectVoter.php | 5 +- src/Voter/QuickEntryVoter.php | 3 +- src/Voter/ReportingVoter.php | 5 +- src/Voter/RolePermissionVoter.php | 3 +- src/Voter/TeamVoter.php | 5 +- src/Voter/TimesheetVoter.php | 23 +- src/Voter/UserVoter.php | 5 +- src/WorkingTime/Mode/WorkingTimeModeDay.php | 18 +- .../Mode/WorkingTimeModeFactory.php | 4 +- src/WorkingTime/WorkingTimeService.php | 22 - symfony.lock | 280 +- templates/activity/details.html.twig | 2 +- templates/export/index.html.twig | 4 +- templates/export/pdf-layout.html.twig | 1 + templates/export/renderer/timesheet.pdf.twig | 4 +- templates/timesheet/export.html.twig | 8 +- templates/user/api-token.html.twig | 13 - .../widget/widget-counter-money.html.twig | 5 +- tests/API/APIControllerBaseTestCase.php | 12 +- tests/API/ApiDocControllerTest.php | 12 +- .../Authentication/TokenAuthenticatorTest.php | 168 - tests/API/AuthenticationTest.php | 92 - tests/API/TimesheetControllerTest.php | 68 +- tests/API/UserControllerTest.php | 1 - tests/Command/ActivateUserCommandTest.php | 6 +- tests/Command/BundleInstallerCommandTest.php | 6 +- tests/Command/ChangePasswordCommandTest.php | 4 +- tests/Command/CreateUserCommandTest.php | 18 +- tests/Command/DeactivateUserCommandTest.php | 6 +- tests/Command/DemoteUserCommandTest.php | 8 +- tests/Command/ExportCreateCommandTest.php | 2 +- tests/Command/InstallCommandTest.php | 4 +- tests/Command/InvoiceCreateCommandTest.php | 2 +- tests/Command/ListUserCommandTest.php | 2 +- tests/Command/MailTestCommandTest.php | 2 +- tests/Command/PluginCommandTest.php | 2 +- tests/Command/PromoteUserCommandTest.php | 8 +- tests/Command/ReloadCommandTest.php | 2 +- tests/Command/ResetDevelopmentCommandTest.php | 2 +- tests/Command/ResetTestCommandTest.php | 2 +- tests/Command/TimesheetStopAllCommandTest.php | 2 +- tests/Command/UserLoginLinkCommandTest.php | 2 +- tests/Command/VersionCommandTest.php | 2 +- .../AbstractControllerBaseTestCase.php | 20 +- tests/Controller/ContractControllerTest.php | 6 +- tests/Controller/HelpControllerTest.php | 2 +- tests/Controller/InvoiceControllerTest.php | 16 +- tests/Controller/PermissionControllerTest.php | 2 +- tests/Controller/PluginControllerTest.php | 4 + tests/Controller/ProfileControllerTest.php | 71 +- tests/Controller/ProjectControllerTest.php | 2 + tests/Controller/ReportingControllerTest.php | 11 +- .../SystemConfigurationControllerTest.php | 4 +- tests/Customer/CustomerServiceTest.php | 2 +- .../DataFixtures/InvoiceTemplateFixtures.php | 2 +- .../DependencyInjection/AppExtensionTest.php | 5 - tests/Entity/AbstractEntityTestCase.php | 2 - tests/Entity/AbstractMetaEntityTestCase.php | 10 +- tests/Entity/ExportTemplateTest.php | 1 - tests/Entity/InvoiceTemplateTest.php | 20 +- tests/Entity/InvoiceTest.php | 3 +- tests/Entity/TeamTest.php | 2 - tests/Entity/TimesheetTest.php | 2 - tests/Entity/TimesheetValidationTest.php | 60 +- tests/Entity/UserTest.php | 86 +- tests/Entity/WorkingTimeTest.php | 4 +- tests/Event/ConfigureMainMenuEventTest.php | 12 - .../ThemeJavascriptTranslationsEventTest.php | 43 - .../WorkingTimeApproveMonthEventTest.php | 1 - .../UserPreferenceSubscriberTest.php | 1 - tests/Export/Base/CsvRendererTest.php | 14 +- tests/Export/Base/HtmlRendererTest.php | 12 +- tests/Export/Base/PdfRendererTest.php | 14 +- tests/Export/Base/PdfTemplateRendererTest.php | 4 +- tests/Export/ColumnConverterTest.php | 6 +- tests/Export/DefaultTemplateTest.php | 12 +- tests/Export/ExportFilenameTest.php | 11 +- .../Package/PhpOfficeSpreadsheetTest.php | 3 - .../Renderer/AbstractRendererTestCase.php | 41 +- .../Renderer/HtmlRendererFactoryTest.php | 2 +- tests/Export/Renderer/HtmlRendererTest.php | 10 +- .../Renderer/PdfRendererFactoryTest.php | 4 +- tests/Export/Renderer/PdfRendererTest.php | 23 +- tests/Export/ServiceExportTest.php | 9 +- .../Timesheet/AbstractRendererTestCase.php | 16 + tests/Export/Timesheet/PdfRendererTest.php | 14 +- .../SearchTermTransformerTest.php | 2 - .../Calculator/AbstractCalculatorTestCase.php | 3 +- .../ActivityInvoiceCalculatorTest.php | 2 +- .../ActivityUserInvoiceCalculatorTest.php | 2 +- .../Calculator/DateInvoiceCalculatorTest.php | 2 +- .../DateUserInvoiceCalculatorTest.php | 2 +- .../Calculator/DefaultCalculatorTest.php | 2 +- .../Calculator/PriceInvoiceCalculatorTest.php | 2 +- .../ProjectActivityInvoiceCalculatorTest.php | 2 +- .../ProjectInvoiceCalculatorTest.php | 2 +- .../ProjectUserInvoiceCalculatorTest.php | 2 +- .../Calculator/ShortInvoiceCalculatorTest.php | 6 +- .../Calculator/UserInvoiceCalculatorTest.php | 2 +- .../WeeklyInvoiceCalculatorTest.php | 2 +- .../InvoiceModelCustomerHydratorTest.php | 2 +- .../InvoiceModelDefaultHydratorTest.php | 1 - .../InvoiceModelIssuerHydratorTest.php | 2 +- tests/Invoice/InvoiceItemTest.php | 2 +- tests/Invoice/InvoiceModelTest.php | 3 - tests/Invoice/Renderer/RendererTestTrait.php | 35 +- tests/Invoice/ServiceInvoiceTest.php | 23 +- tests/Ldap/LdapManagerTest.php | 46 - .../ActivityTestMetaFieldSubscriberMock.php | 2 +- .../CustomerTestMetaFieldSubscriberMock.php | 2 +- .../Mocks/PrepareUserEventSubscriberMock.php | 2 +- .../ProjectTestMetaFieldSubscriberMock.php | 2 +- .../TimesheetTestMetaFieldSubscriberMock.php | 2 +- tests/Project/ProjectServiceTest.php | 6 +- .../Loader/AbstractLoaderTestCase.php | 6 +- .../AbstractBaseFormTypeQueryTestCase.php | 19 +- tests/Repository/Query/BaseQueryTest.php | 12 +- tests/Repository/Search/SearchHelperTest.php | 16 +- tests/Repository/TimesheetRepositoryTest.php | 21 +- tests/Saml/SamlProviderTest.php | 2 +- tests/Timesheet/DateTimeFactoryTest.php | 11 + tests/Timesheet/TimesheetServiceTest.php | 37 - tests/Timesheet/UtilTest.php | 112 - tests/Twig/ContextTest.php | 18 +- tests/Twig/ExtensionsTest.php | 2 +- tests/Twig/LocaleFormatExtensionsTest.php | 2 +- tests/Twig/PaginationExtensionTest.php | 20 +- .../Twig/Runtime/ThemeEventExtensionTest.php | 5 +- tests/Utils/PageSetupTest.php | 4 +- tests/Utils/SearchTermTest.php | 35 - .../AbstractConstraintTestCase.php | 25 + .../Constraints/DurationValidatorTest.php | 8 +- .../QuickEntryTimesheetValidatorTest.php | 2 +- .../Constraints/RoleNameValidatorTest.php | 6 +- .../Constraints/RoleValidatorTest.php | 6 +- ...Test.php => TimesheetAllValidatorTest.php} | 20 +- .../Constraints/TimesheetBasicTest.php | 6 +- .../TimesheetBasicValidatorTest.php | 12 +- .../Constraints/TimesheetBudgetUsedTest.php | 6 +- .../Constraints/TimesheetDeactivatedTest.php | 6 +- .../TimesheetDeactivatedValidatorTest.php | 4 +- .../Constraints/TimesheetExportedTest.php | 6 +- .../TimesheetExportedValidatorTest.php | 2 +- .../Constraints/TimesheetFutureTimesTest.php | 6 +- .../TimesheetFutureTimesValidatorTest.php | 6 +- .../Constraints/TimesheetLockdownTest.php | 6 +- .../TimesheetLockdownValidatorTest.php | 39 +- .../Constraints/TimesheetLongRunningTest.php | 6 +- .../TimesheetLongRunningValidatorTest.php | 2 +- .../TimesheetMultiUpdateValidatorTest.php | 10 +- .../TimesheetMultiUserValidatorTest.php | 2 +- .../TimesheetNegativeDurationTest.php | 6 +- ...TimesheetNegativeDurationValidatorTest.php | 8 +- .../Constraints/TimesheetOverlappingTest.php | 6 +- .../TimesheetOverlappingValidatorTest.php | 10 +- .../Constraints/TimesheetRestartTest.php | 6 +- .../TimesheetRestartValidatorTest.php | 4 +- .../Constraints/TimesheetZeroDurationTest.php | 6 +- .../TimesheetZeroDurationValidatorTest.php | 6 +- .../Constraints/UserValidatorTest.php | 8 +- tests/Voter/AbstractVoterTestCase.php | 1 - .../Mode/WorkingTimeModeFactoryTest.php | 2 +- tests/WorkingTime/Model/MonthTest.php | 2 +- tests/phpstan.neon | 78 +- translations/messages.ar.xlf | 12 - translations/messages.bg.xlf | 12 - translations/messages.ca.xlf | 12 - translations/messages.cs.xlf | 12 - translations/messages.da.xlf | 12 - translations/messages.de.xlf | 12 - translations/messages.de_CH.xlf | 12 - translations/messages.el.xlf | 12 - translations/messages.en.xlf | 12 - translations/messages.eo.xlf | 8 - translations/messages.es.xlf | 12 - translations/messages.et.xlf | 8 - translations/messages.eu.xlf | 8 - translations/messages.fa.xlf | 12 - translations/messages.fi.xlf | 12 - translations/messages.fo.xlf | 8 - translations/messages.fr.xlf | 12 - translations/messages.he.xlf | 12 - translations/messages.hr.xlf | 12 - translations/messages.hu.xlf | 12 - translations/messages.id.xlf | 12 - translations/messages.it.xlf | 12 - translations/messages.ja.xlf | 8 - translations/messages.ko.xlf | 8 - translations/messages.lv.xlf | 8 - translations/messages.mk.xlf | 12 - translations/messages.nb_NO.xlf | 12 - translations/messages.nl.xlf | 12 - translations/messages.pa.xlf | 8 - translations/messages.pl.xlf | 12 - translations/messages.pt.xlf | 12 - translations/messages.pt_BR.xlf | 12 - translations/messages.ro.xlf | 12 - translations/messages.ru.xlf | 12 - translations/messages.sk.xlf | 8 - translations/messages.sl.xlf | 8 - translations/messages.sv.xlf | 12 - translations/messages.ta.xlf | 12 - translations/messages.tr.xlf | 12 - translations/messages.uk.xlf | 12 - translations/messages.vi.xlf | 12 - translations/messages.zh_CN.xlf | 12 - translations/messages.zh_Hant.xlf | 12 - webpack.config.js | 52 +- yarn.lock | 100 +- 467 files changed, 3929 insertions(+), 6567 deletions(-) create mode 100644 UPGRADING-2.md create mode 100644 assets/js/forms/KimaiMonthPicker.js delete mode 100644 config/packages/assets.yaml delete mode 100644 config/packages/cache.yaml create mode 100644 config/packages/dama_doctrine_test_bundle.yaml create mode 100644 config/packages/debug.yaml delete mode 100644 config/routes/dev/twig.yaml delete mode 100644 config/routes/dev/web_profiler.yaml create mode 100644 config/routes/framework.yaml create mode 100644 config/routes/security.yaml create mode 100644 config/routes/web_profiler.yaml delete mode 100644 config/services_test.yaml create mode 100644 migrations/.gitignore create mode 100644 migrations/Version20260101010000.php create mode 100644 public/build/app.03312b52.js rename public/build/{app.9662939e.js.LICENSE.txt => app.03312b52.js.LICENSE.txt} (100%) delete mode 100644 public/build/app.1899dc33.js delete mode 100644 public/build/app.9662939e.js delete mode 100644 src/API/Authentication/ApiTokenMigratingListener.php delete mode 100644 src/API/Authentication/ApiTokenUpgradeBadge.php delete mode 100644 src/API/Authentication/TokenAuthenticator.php rename src/DataFixtures/{AllFixtures.php => AppFixtures.php} (95%) create mode 100644 src/DependencyInjection/Compiler/ConstraintCompilerPass.php delete mode 100644 src/Event/ThemeJavascriptTranslationsEvent.php delete mode 100644 src/Form/Toolbar/AbstractToolbarForm.php delete mode 100644 src/Form/UserApiPasswordType.php delete mode 100644 src/Model/PermissionSectionInterface.php delete mode 100644 src/Repository/ApiUserRepository.php delete mode 100644 src/Repository/Loader/DefaultLoader.php delete mode 100644 src/Repository/Paginator/QueryBuilderPaginator.php delete mode 100644 src/Repository/RepositorySearchTrait.php delete mode 100644 src/Timesheet/Util.php create mode 100644 src/Validator/Attribute/TimesheetConstraint.php delete mode 100644 src/Validator/Constraints/ProjectConstraint.php rename src/Validator/Constraints/{Timesheet.php => TimesheetAll.php} (91%) rename src/Validator/Constraints/{TimesheetValidator.php => TimesheetAllValidator.php} (67%) delete mode 100644 src/Validator/Constraints/TimesheetConstraint.php delete mode 100644 tests/API/Authentication/TokenAuthenticatorTest.php delete mode 100644 tests/API/AuthenticationTest.php delete mode 100644 tests/Event/ThemeJavascriptTranslationsEventTest.php delete mode 100644 tests/Timesheet/UtilTest.php create mode 100644 tests/Validator/Constraints/AbstractConstraintTestCase.php rename tests/Validator/Constraints/{TimesheetValidatorTest.php => TimesheetAllValidatorTest.php} (67%) diff --git a/.editorconfig b/.editorconfig index e49ab5718..66990769e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,23 +1,17 @@ -; top-most EditorConfig file +# editorconfig.org + root = true -; Unix-style newlines [*] -end_of_line = lf charset = utf-8 - -[*.php] -indent_style = space +end_of_line = lf indent_size = 4 - -[*.twig] indent_style = space -indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true -[*.yaml] -indent_style = space -indent_size = 4 +[{compose.yaml,compose.*.yaml}] +indent_size = 2 -[*.yml] -indent_style = space -indent_size = 4 +[*.md] +trim_trailing_whitespace = false diff --git a/.env.dist b/.env.dist index 881374f80..d8e0de9b3 100644 --- a/.env.dist +++ b/.env.dist @@ -1,7 +1,18 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: # -# You should NOT use this file in production, but instead move the environment variables to your webserver configuration. -# The .env file is only existing to simplify the initial setup! +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides # +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# https://symfony.com/doc/current/configuration/secrets.html +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration #================================================================================ # Configure your database connection and set the correct server version. @@ -16,32 +27,34 @@ # For MySQL that would be "serverVersion=5.7" as in: # DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=5.7 # -# For MariaDB it would be "serverVersion=10.5.8-MariaDB": -# DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB +# For MariaDB it would be "serverVersion=10.11.15-MariaDB": +# DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.11.15-MariaDB # -DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB +DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.11.15-MariaDB -#================================================================================ -# The full documentation can be found at https://www.kimai.org/documentation/emails.html -# -# Email will be sent with this address as sender: -MAILER_FROM=kimai@example.com -# Email connection (disabled by default) - see documentation for the format -MAILER_URL=null://null - -#================================================================================ -# do not change, unless you are developing for Kimai -APP_ENV=prod - -#================================================================================ -# should be changed to a unique character sequence, used for hashing cookies -APP_SECRET=change_this_to_something_unique - -#================================================================================ # Running behind reverse proxies? Try these: # TRUSTED_PROXIES=127.0.0.1,127.0.0.2 # TRUSTED_HOSTS=localhost|example.com -#================================================================================ -# unlikely, that you need to change this one -CORS_ALLOW_ORIGIN=^https?://localhost(:[0-9]+)?$ +###> symfony/framework-bundle ### +APP_ENV=prod +APP_SECRET= +APP_SHARE_DIR=var/share +###< symfony/framework-bundle ### + +###> symfony/mailer ### +# Documentation at https://www.kimai.org/documentation/emails.html +MAILER_FROM=kimai@example.com +# Email connection (disabled by default) - see documentation for the format +MAILER_URL=null://null +###< symfony/mailer ### + +###> nelmio/cors-bundle ### +CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$' +###< nelmio/cors-bundle ### + +###> symfony/routing ### +# Configure how to generate URLs in non-HTTP contexts, such as CLI commands. +# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands +DEFAULT_URI=http://localhost +###< symfony/routing ### diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index 8b369ed68..7ee3630ba 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -19,7 +19,7 @@ jobs: options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 strategy: matrix: - php: ['8.1', '8.2', '8.3', '8.4', '8.5'] + php: ['8.4', '8.5'] name: Integration (${{ matrix.php }}) steps: diff --git a/.gitignore b/.gitignore index 40a21331e..68990917a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ # some hosters require a htaccess to change the PHP version /public/.htaccess -/.env-* /.idea/ .DS_Store @@ -21,6 +20,7 @@ /var/dev/* /var/data/* /var/cache/* +/var/share/* /var/invoices* /var/export* /var/log/* @@ -34,7 +34,6 @@ /.env.local.php /.env.*.local /config/secrets/prod/prod.decrypt.private.php -.env /public/bundles/ /vendor/ ###< symfony/framework-bundle ### @@ -45,9 +44,8 @@ ###< phpunit/phpunit ### ###> friendsofphp/php-cs-fixer ### -.php_cs -.php_cs.cache -.php-cs-fixer.cache +/.php-cs-fixer.php +/.php-cs-fixer.cache ###< friendsofphp/php-cs-fixer ### ###> symfony/phpunit-bridge ### diff --git a/UPGRADING-2.md b/UPGRADING-2.md new file mode 100644 index 000000000..67733df6e --- /dev/null +++ b/UPGRADING-2.md @@ -0,0 +1,50 @@ +# Upgrading Kimai - Version 2.x + +_Make sure to create a backup before you start!_ + +Read the [updates documentation](https://www.kimai.org/documentation/updates.html) to find out how +you can upgrade your Kimai installation to the latest stable release. + +Check below if there are more version specific steps required, which need to be executed after the normal update process. +Perform EACH version specific task between your version and the new one, otherwise you risk data inconsistency or a broken installation. + +## [2.0.30](https://github.com/kimai/kimai/releases/tag/2.0.30) + +The `DATABASE_URL` in your environment settings (e.g. [.env](https://github.com/kimai/kimai/issues/4246), [docker-compose.yaml](https://github.com/tobybatch/kimai2/issues/531) or webserver config) +now requires the `charset` and `serverVersion` params, e.g.: `DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB` (examples in `.env`). + +## [2.0](https://github.com/kimai/kimai/releases/tag/2.0) + +**!! This release requires minimum PHP version to 8.1 !!** + +### Breaking changes + +- All plugins need to be updated: delete all previous version from your installation (`rm -r var/plugins/*`) before updating! +- The `local.yaml` is not compatible with old version, remove it before the update and then re-create it after everything works + - removed: configuring the `dashboard` is not supported any longer + - removed: custom translation files via `theme.branding.translation` + - removed: changing the plugin directory via `kimai.plugin_dir` + +### Developer + +Developer read the full documentation at [https://www.kimai.org/documentation/migration-v2.html](https://www.kimai.org/documentation/migration-v2.html). + +- Invoice renderer and templates for XML, JSON and TEXT were moved to the [Extended invoicing plugin](https://www.kimai.org/store/invoice-bundle.html) (install if you use one of those) +- Moved `company.docx` to [external repo](https://github.com/kimai/invoice-templates/tree/main/docx-company) (needs to be re-uploaded if you want to keep on using it!) +- Role names are forced to be uppercase +- Removed unused `public/avatars/` directory +- Time-tracking mode `duration_only` was removed, existing installations will be switched to `duration_fixed_begin` +- Removed Twig filters. You might have to replace them in your custom export/invoice templates: + - `date_full` => `date_time` + - `duration_decimal` => `duration(true)` + - `currency` => `currency_name` + - `country` => `country_name` + - `language` => `language_name` +- Removed support for custom translation files (use [TranslationBundle](https://www.kimai.org/store/translation-bundle.html) instead or write your own plugin) +- Removed all 3rd party mailer packages, you need to install them manually (ONLY if you used a short syntax to configure the `MAILER_URL` in `.env`): + - `composer require symfony/amazon-mailer` + - `composer require symfony/google-mailer` + - `composer require symfony/mailchimp-mailer` + - `composer require symfony/mailgun-mailer` + - `composer require symfony/postmark-mailer` + - `composer require symfony/sendgrid-mailer` diff --git a/UPGRADING-3.md b/UPGRADING-3.md index eccea7112..29a1e970f 100644 --- a/UPGRADING-3.md +++ b/UPGRADING-3.md @@ -11,16 +11,22 @@ Perform EACH version specific task between your version and the new one, otherwi **!! This release requires minimum PHP version 8.4 !!** +### Rename .env + +Rename your file `.env` to `.env.local` or even better: move all variables to your webserver/container environment. + ### Developer -Do not use method chaining: all fluent interface, especially in Entities, are no longer supported. +Do not use method chaining: all fluent interface, especially in Entities, are no longer supported. -Removed translations: -- `action.edit`: use `edit` instead -- `my.profile`: use `user_profile` instead -- `stats.userAmountToday`: use `` instead -- `stats.userAmountWeek`: use `` instead -- `stats.userAmountMonth`: use `` instead -- `stats.userAmountYear`: use `` instead -- `stats.userAmountTotal`: use `` instead -- `update_multiple` \ No newline at end of file +- Require PHP 8.4 +- Bump to Symfony 7.4 +- Removed old API token `X-AUTH-USER` and `X-AUTH-TOKEN` +- Removed `TimesheetConstraint` - use a normal `Constraint` as base class and attach the `#[App\Validator\Attribute\TimesheetConstraint]` attribute +- Removed `ProjectConstraint` - use a `FormExtension` and attach your custom constraints +- Interface `MetaTableTypeInterface` has new methods: `getSection()`, `setSection()` +- Interface `ExportRendererInterface` has new methods: `getType()`, `isInternal()` +- Interface `ExportableItem` has new methods: `getTags()`, `getBreak()` +- Removed and renamed translations, most important `action.edit` => `edit`, `my.profile` => `user_profile` +- Removed `User::isExportDecimal()` + - Use duration format `HH:mm` in default PDF exports diff --git a/UPGRADING.md b/UPGRADING.md index 67733df6e..de81164f4 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -1,50 +1,3 @@ -# Upgrading Kimai - Version 2.x +# Upgrading Kimai -_Make sure to create a backup before you start!_ - -Read the [updates documentation](https://www.kimai.org/documentation/updates.html) to find out how -you can upgrade your Kimai installation to the latest stable release. - -Check below if there are more version specific steps required, which need to be executed after the normal update process. -Perform EACH version specific task between your version and the new one, otherwise you risk data inconsistency or a broken installation. - -## [2.0.30](https://github.com/kimai/kimai/releases/tag/2.0.30) - -The `DATABASE_URL` in your environment settings (e.g. [.env](https://github.com/kimai/kimai/issues/4246), [docker-compose.yaml](https://github.com/tobybatch/kimai2/issues/531) or webserver config) -now requires the `charset` and `serverVersion` params, e.g.: `DATABASE_URL=mysql://user:password@127.0.0.1:3306/database?charset=utf8mb4&serverVersion=10.5.8-MariaDB` (examples in `.env`). - -## [2.0](https://github.com/kimai/kimai/releases/tag/2.0) - -**!! This release requires minimum PHP version to 8.1 !!** - -### Breaking changes - -- All plugins need to be updated: delete all previous version from your installation (`rm -r var/plugins/*`) before updating! -- The `local.yaml` is not compatible with old version, remove it before the update and then re-create it after everything works - - removed: configuring the `dashboard` is not supported any longer - - removed: custom translation files via `theme.branding.translation` - - removed: changing the plugin directory via `kimai.plugin_dir` - -### Developer - -Developer read the full documentation at [https://www.kimai.org/documentation/migration-v2.html](https://www.kimai.org/documentation/migration-v2.html). - -- Invoice renderer and templates for XML, JSON and TEXT were moved to the [Extended invoicing plugin](https://www.kimai.org/store/invoice-bundle.html) (install if you use one of those) -- Moved `company.docx` to [external repo](https://github.com/kimai/invoice-templates/tree/main/docx-company) (needs to be re-uploaded if you want to keep on using it!) -- Role names are forced to be uppercase -- Removed unused `public/avatars/` directory -- Time-tracking mode `duration_only` was removed, existing installations will be switched to `duration_fixed_begin` -- Removed Twig filters. You might have to replace them in your custom export/invoice templates: - - `date_full` => `date_time` - - `duration_decimal` => `duration(true)` - - `currency` => `currency_name` - - `country` => `country_name` - - `language` => `language_name` -- Removed support for custom translation files (use [TranslationBundle](https://www.kimai.org/store/translation-bundle.html) instead or write your own plugin) -- Removed all 3rd party mailer packages, you need to install them manually (ONLY if you used a short syntax to configure the `MAILER_URL` in `.env`): - - `composer require symfony/amazon-mailer` - - `composer require symfony/google-mailer` - - `composer require symfony/mailchimp-mailer` - - `composer require symfony/mailgun-mailer` - - `composer require symfony/postmark-mailer` - - `composer require symfony/sendgrid-mailer` +The most recent version is Kimai 3, please read the changelog at [UPGRADING-3.md](UPGRADING-3.md). diff --git a/assets/js/KimaiLoader.js b/assets/js/KimaiLoader.js index bd33cda6f..8f5726182 100644 --- a/assets/js/KimaiLoader.js +++ b/assets/js/KimaiLoader.js @@ -43,6 +43,7 @@ import KimaiHotkeys from "./plugins/KimaiHotkeys"; import KimaiRemoteModal from "./plugins/KimaiRemoteModal"; import KimaiUser from "./plugins/KimaiUser"; import KimaiAutocompleteTags from "./forms/KimaiAutocompleteTags"; +import KimaiMonthPicker from "./forms/KimaiMonthPicker"; export default class KimaiLoader { @@ -76,6 +77,7 @@ export default class KimaiLoader { kimai.registerPlugin(new KimaiTeamForm()); kimai.registerPlugin(new KimaiCopyDataForm()); kimai.registerPlugin(new KimaiDateNowForm()); + kimai.registerPlugin(new KimaiMonthPicker()); kimai.registerPlugin(new KimaiForm()); kimai.registerPlugin(new KimaiHotkeys()); diff --git a/assets/js/forms/KimaiMonthPicker.js b/assets/js/forms/KimaiMonthPicker.js new file mode 100644 index 000000000..c0ba4e7fc --- /dev/null +++ b/assets/js/forms/KimaiMonthPicker.js @@ -0,0 +1,44 @@ +/* + * This file is part of the Kimai time-tracking app. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/*! + * [KIMAI] KimaiDatePicker: single date selects (currently unused) + */ + +import KimaiFormPlugin from "./KimaiFormPlugin"; + +export default class KimaiMonthPicker extends KimaiFormPlugin { + + /** + * @param {HTMLFormElement} form + * @return boolean + */ + supportsForm(form) // eslint-disable-line no-unused-vars + { + return true; + } + + /** + * @param {HTMLFormElement} form + */ + activateForm(form) + { + const input = document.createElement('input'); + input.setAttribute('type','month'); + + const notADateValue = 'not-a-month'; + input.setAttribute('value', notADateValue); + + if (input.value === notADateValue) { + const polyfills = form.querySelectorAll('a.input-month-polyfill'); + polyfills.forEach(i => i.classList.toggle('d-none')); + const inputs = form.querySelectorAll('input[type="month"]'); + inputs.forEach(i => i.classList.toggle('d-none')); + } + } + +} diff --git a/bin/console b/bin/console index 33b63f450..9111f93b3 100755 --- a/bin/console +++ b/bin/console @@ -6,8 +6,8 @@ use App\ConsoleApplication; set_time_limit(0); -if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) { - throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".'); +if (!is_dir(dirname(__DIR__).'/vendor')) { + throw new LogicException('Dependencies are missing. Try running "composer install".'); } require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; diff --git a/composer.json b/composer.json index 1aca19c6a..115283887 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ } ], "require": { - "php": "8.1.*||8.2.*||8.3.*||8.4.*||8.5.*", + "php": "8.4.*||8.5.*", "ext-gd": "*", "ext-intl": "*", "ext-json": "*", @@ -29,11 +29,11 @@ "composer/semver": "^3.3", "doctrine/doctrine-bundle": "^2.7", "doctrine/doctrine-migrations-bundle": "^3.3", - "doctrine/orm": "^2.8", + "doctrine/orm": "^3.0", "easybill/zugferd-php": "^2.1", - "endroid/qr-code": "^4.8", - "erusev/parsedown": "^1.6", - "friendsofsymfony/rest-bundle": "^3.0", + "endroid/qr-code": "^6.0", + "parsedown/parsedown": "^1.6", + "friendsofsymfony/rest-bundle": "3.9.0-beta1", "gedmo/doctrine-extensions": "^3.6", "horstoeko/zugferd": "^1.0", "horstoeko/zugferdublbridge": "^1.0", @@ -45,37 +45,38 @@ "nelmio/cors-bundle": "^2.0", "onelogin/php-saml": "^4.0", "openspout/openspout": "^4.0", - "pagerfanta/pagerfanta": "^3.0", + "pagerfanta/pagerfanta": "^4.0", "phpoffice/phpspreadsheet": "^2.0", "phpoffice/phpword": "^1.0", "psr/container": "^2.0", "psr/log": "^3.0", - "scheb/2fa-backup-code": "^6.2", - "scheb/2fa-bundle": "^6.2", - "scheb/2fa-totp": "^6.2", - "symfony/asset": "^6.0", - "symfony/console": "^6.0", - "symfony/dotenv": "^6.0", - "symfony/expression-language": "^6.0", + "scheb/2fa-backup-code": "^7.11", + "scheb/2fa-bundle": "^7.11", + "scheb/2fa-totp": "^7.11", + "symfony/asset": "^7.0", + "symfony/console": "^7.0", + "symfony/dependency-injection": "^7.0", + "symfony/dotenv": "^7.0", + "symfony/expression-language": "^7.0", "symfony/flex": "^2", - "symfony/form": "^6.0", - "symfony/framework-bundle": "^6.0", - "symfony/http-client": "^6.0", - "symfony/intl": "^6.0", - "symfony/mailer": "^6.0", - "symfony/mime": "^6.0", + "symfony/form": "^7.0", + "symfony/framework-bundle": "^7.0", + "symfony/http-client": "^7.0", + "symfony/intl": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", "symfony/monolog-bundle": "^3.4", - "symfony/process": "^6.0", - "symfony/rate-limiter": "^6.0", - "symfony/runtime": "^6.0", - "symfony/security-bundle": "^6.0", - "symfony/security-csrf": "^6.0", - "symfony/serializer": "^6.0", - "symfony/translation": "^6.0", - "symfony/twig-bundle": "^6.0", - "symfony/validator": "^6.0", + "symfony/process": "^7.0", + "symfony/rate-limiter": "^7.0", + "symfony/runtime": "^7.0", + "symfony/security-bundle": "^7.0", + "symfony/security-csrf": "^7.0", + "symfony/serializer": "^7.0", + "symfony/translation": "^7.0", + "symfony/twig-bundle": "^7.0", + "symfony/validator": "^7.0", "symfony/webpack-encore-bundle": "^2.0", - "symfony/yaml": "^6.0", + "symfony/yaml": "^7.0", "twig/cssinliner-extra": "^3.0", "twig/extra-bundle": "^3.0", "twig/inky-extra": "^3.0", @@ -95,14 +96,14 @@ "phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^10.0", - "symfony/browser-kit": "^6.0", - "symfony/css-selector": "^6.0", - "symfony/debug-bundle": "^6.0", - "symfony/dom-crawler": "^6.0", - "symfony/phpunit-bridge": "^6.0", - "symfony/stopwatch": "^6.0", - "symfony/var-dumper": "^6.0", - "symfony/web-profiler-bundle": "^6.0" + "symfony/browser-kit": "^7.0", + "symfony/css-selector": "^7.0", + "symfony/debug-bundle": "^7.0", + "symfony/dom-crawler": "^7.0", + "symfony/phpunit-bridge": "^7.0", + "symfony/stopwatch": "^7.0", + "symfony/var-dumper": "^7.0", + "symfony/web-profiler-bundle": "^7.0" }, "repositories": [ { @@ -117,7 +118,7 @@ }, "optimize-autoloader": true, "platform": { - "php": "8.1.3" + "php": "8.4.4" }, "preferred-install": { "*": "dist" @@ -144,6 +145,9 @@ "symfony/polyfill-intl-idn": "*", "symfony/polyfill-intl-normalizer": "*", "symfony/polyfill-iconv": "*", + "symfony/polyfill-php84": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php82": "*", "symfony/polyfill-php81": "*", "symfony/polyfill-php80": "*", "symfony/polyfill-php74": "*", @@ -209,7 +213,7 @@ "symfony": { "id": "01C3FWRDJJEX9K6Y3A4XDFXPBR", "allow-contrib": true, - "require": "6.4.*" + "require": "7.4.*" } } } diff --git a/composer.lock b/composer.lock index aa1268831..8f8f3178e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4f02c81fc72ab3bd887f6e8cf1361757", + "content-hash": "fce96dfab09cb39be7c01bc3617030c6", "packages": [ { "name": "azuyalabs/yasumi", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/azuyalabs/yasumi.git", - "reference": "cc07874da062070fdc201a4297a7724f7d6aafb2" + "reference": "36005a0796b64bc07257f39c11c42f147fe5320f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/azuyalabs/yasumi/zipball/cc07874da062070fdc201a4297a7724f7d6aafb2", - "reference": "cc07874da062070fdc201a4297a7724f7d6aafb2", + "url": "https://api.github.com/repos/azuyalabs/yasumi/zipball/36005a0796b64bc07257f39c11c42f147fe5320f", + "reference": "36005a0796b64bc07257f39c11c42f147fe5320f", "shasum": "" }, "require": { @@ -30,8 +30,7 @@ "mikey179/vfsstream": "^1.6", "phpstan/phpstan": "^2.1", "phpstan/phpstan-deprecation-rules": "^2.0", - "phpunit/phpunit": "^8.5 || ^9.6", - "vimeo/psalm": "^6.12" + "phpunit/phpunit": "^8.5 || ^9.6" }, "suggest": { "ext-calendar": "For calculating the date of Easter" @@ -78,32 +77,33 @@ "type": "other" } ], - "time": "2025-07-13T15:40:05+00:00" + "time": "2025-12-29T16:13:54+00:00" }, { "name": "bacon/bacon-qr-code", - "version": "2.0.8", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + "reference": "36a1cb2b81493fa5b82e50bf8068bf84d1542563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", - "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/36a1cb2b81493fa5b82e50bf8068bf84d1542563", + "reference": "36a1cb2b81493fa5b82e50bf8068bf84d1542563", "shasum": "" }, "require": { "dasprid/enum": "^1.0.3", "ext-iconv": "*", - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "phly/keep-a-changelog": "^2.1", - "phpunit/phpunit": "^7 | ^8 | ^9", - "spatie/phpunit-snapshot-assertions": "^4.2.9", - "squizlabs/php_codesniffer": "^3.4" + "phly/keep-a-changelog": "^2.12", + "phpunit/phpunit": "^10.5.11 || ^11.0.4", + "spatie/phpunit-snapshot-assertions": "^5.1.5", + "spatie/pixelmatch-php": "^1.2.0", + "squizlabs/php_codesniffer": "^3.9" }, "suggest": { "ext-imagick": "to generate QR code images" @@ -130,9 +130,9 @@ "homepage": "https://github.com/Bacon/BaconQrCode", "support": { "issues": "https://github.com/Bacon/BaconQrCode/issues", - "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.3" }, - "time": "2022-12-07T17:46:57+00:00" + "time": "2025-11-19T17:15:36+00:00" }, { "name": "composer/pcre", @@ -340,100 +340,6 @@ }, "time": "2025-09-16T12:23:56+00:00" }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "abandoned": true, - "time": "2022-05-20T20:07:39+00:00" - }, { "name": "doctrine/collections", "version": "2.4.0", @@ -520,141 +426,42 @@ ], "time": "2025-10-25T09:18:13+00:00" }, - { - "name": "doctrine/common", - "version": "3.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/d9ea4a54ca2586db781f0265d36bea731ac66ec5", - "reference": "d9ea4a54ca2586db781f0265d36bea731ac66ec5", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "doctrine/collections": "^1", - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^6.1", - "vimeo/psalm": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.5.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", - "type": "tidelift" - } - ], - "time": "2025-01-01T22:12:03+00:00" - }, { "name": "doctrine/dbal", - "version": "3.10.4", + "version": "4.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "63a46cb5aa6f60991186cc98c1d1b50c09311868" + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/63a46cb5aa6f60991186cc98c1d1b50c09311868", - "reference": "63a46cb5aa6f60991186cc98c1d1b50c09311868", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", "shasum": "" }, "require": { - "composer-runtime-api": "^2", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, - "conflict": { - "doctrine/cache": "< 1.11" - }, "require-dev": { - "doctrine/cache": "^1.11|^2.0", "doctrine/coding-standard": "14.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", + "jetbrains/phpstorm-stubs": "2023.2", "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "9.6.29", + "phpunit/phpunit": "11.5.23", "slevomat/coding-standard": "8.24.0", "squizlabs/php_codesniffer": "4.0.0", - "symfony/cache": "^5.4|^6.0|^7.0|^8.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0|^8.0" + "symfony/cache": "^6.3.8|^7.0|^8.0", + "symfony/console": "^5.4|^6.3|^7.0|^8.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "bin": [ - "bin/doctrine-dbal" - ], "type": "library", "autoload": { "psr-4": { @@ -707,7 +514,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.10.4" + "source": "https://github.com/doctrine/dbal/tree/4.4.1" }, "funding": [ { @@ -723,7 +530,7 @@ "type": "tidelift" } ], - "time": "2025-11-29T10:46:08+00:00" + "time": "2025-12-04T10:11:03+00:00" }, { "name": "doctrine/deprecations", @@ -1412,61 +1219,48 @@ }, { "name": "doctrine/orm", - "version": "2.20.9", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "87f1ba74e04c8694ca00099f3c64706ebac0b114" + "reference": "d4e9276e79602b1eb4c4029c6c999b0d93478e2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/87f1ba74e04c8694ca00099f3c64706ebac0b114", - "reference": "87f1ba74e04c8694ca00099f3c64706ebac0b114", + "url": "https://api.github.com/repos/doctrine/orm/zipball/d4e9276e79602b1eb4c4029c6c999b0d93478e2f", + "reference": "d4e9276e79602b1eb4c4029c6c999b0d93478e2f", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/cache": "^1.12.1 || ^2.1.1", - "doctrine/collections": "^1.5 || ^2.1", - "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.1 || ^3.2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2", "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^2 || ^3", - "doctrine/persistence": "^2.4 || ^3", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1 || ^4", "ext-ctype": "*", - "php": "^7.1 || ^8.0", + "php": "^8.1", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "doctrine/annotations": "<1.13 || >= 3.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.3.9 || ^7.0 || ^8.0" }, "require-dev": { - "doctrine/annotations": "^1.13 || ^2", - "doctrine/coding-standard": "^9.0.2 || ^14.0", - "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/extension-installer": "~1.1.0 || ^1.4", - "phpstan/phpstan": "~1.4.10 || 2.1.23", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "doctrine/coding-standard": "^14.0", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.1.23", + "phpstan/phpstan-deprecation-rules": "^2", + "phpunit/phpunit": "^10.5.0 || ^11.5", "psr/log": "^1 || ^2 || ^3", - "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0" + "symfony/cache": "^5.4 || ^6.2 || ^7.0 || ^8.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" }, - "bin": [ - "bin/doctrine" - ], "type": "library", "autoload": { "psr-4": { @@ -1507,40 +1301,37 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.20.9" + "source": "https://github.com/doctrine/orm/tree/3.6.0" }, - "time": "2025-11-29T14:03:56+00:00" + "time": "2025-12-19T20:36:14+00:00" }, { "name": "doctrine/persistence", - "version": "3.4.3", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "d59e6ef7caffe6a30f4b6f9e9079a75f52c64ae0" + "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/d59e6ef7caffe6a30f4b6f9e9079a75f52c64ae0", - "reference": "d59e6ef7caffe6a30f4b6f9e9079a75f52c64ae0", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", "shasum": "" }, "require": { "doctrine/event-manager": "^1 || ^2", - "php": "^7.2 || ^8.0", + "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, - "conflict": { - "doctrine/common": "<2.10" - }, "require-dev": { - "doctrine/coding-standard": "^12 || ^14", - "doctrine/common": "^3.0", - "phpstan/phpstan": "^1 || 2.1.30", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8.5.38 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.58 || ^12", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -1589,7 +1380,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.4.3" + "source": "https://github.com/doctrine/persistence/tree/4.1.1" }, "funding": [ { @@ -1605,7 +1396,7 @@ "type": "tidelift" } ], - "time": "2025-10-21T15:21:39+00:00" + "time": "2025-10-16T20:13:18+00:00" }, { "name": "doctrine/sql-formatter", @@ -1664,22 +1455,22 @@ }, { "name": "easybill/zugferd-php", - "version": "v2.1.1", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/easybill/zugferd-php.git", - "reference": "376749138f5ecd216b73b5cdd5d4473f2a2d3252" + "reference": "fba2a504feb58ae2b3a19da5a0c051ce8fe13895" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easybill/zugferd-php/zipball/376749138f5ecd216b73b5cdd5d4473f2a2d3252", - "reference": "376749138f5ecd216b73b5cdd5d4473f2a2d3252", + "url": "https://api.github.com/repos/easybill/zugferd-php/zipball/fba2a504feb58ae2b3a19da5a0c051ce8fe13895", + "reference": "fba2a504feb58ae2b3a19da5a0c051ce8fe13895", "shasum": "" }, "require": { "ext-dom": "*", "jms/serializer": "^3.16", - "php": "^8.1" + "php": "^8.2" }, "require-dev": { "ext-libxml": "*", @@ -1722,9 +1513,9 @@ ], "support": { "issues": "https://github.com/easybill/zugferd-php/issues", - "source": "https://github.com/easybill/zugferd-php/tree/v2.1.1" + "source": "https://github.com/easybill/zugferd-php/tree/v2.3.1" }, - "time": "2024-11-07T08:28:44+00:00" + "time": "2025-09-13T13:57:46+00:00" }, { "name": "egulias/email-validator", @@ -1795,29 +1586,26 @@ }, { "name": "endroid/qr-code", - "version": "4.8.5", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/endroid/qr-code.git", - "reference": "0db25b506a8411a5e1644ebaa67123a6eb7b6a77" + "reference": "5a74873ba8873ddcc557d22755c914ac899563ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/endroid/qr-code/zipball/0db25b506a8411a5e1644ebaa67123a6eb7b6a77", - "reference": "0db25b506a8411a5e1644ebaa67123a6eb7b6a77", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/5a74873ba8873ddcc557d22755c914ac899563ae", + "reference": "5a74873ba8873ddcc557d22755c914ac899563ae", "shasum": "" }, "require": { - "bacon/bacon-qr-code": "^2.0.5", - "php": "^8.1" - }, - "conflict": { - "khanamiryan/qrcode-detector-decoder": "^1.0.6" + "bacon/bacon-qr-code": "^3.0", + "php": "^8.4" }, "require-dev": { - "endroid/quality": "dev-master", + "endroid/quality": "dev-main", "ext-gd": "*", - "khanamiryan/qrcode-detector-decoder": "^1.0.4||^2.0.2", + "khanamiryan/qrcode-detector-decoder": "^2.0.3", "setasign/fpdf": "^1.8.2" }, "suggest": { @@ -1829,7 +1617,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-main": "6.x-dev" } }, "autoload": { @@ -1858,7 +1646,7 @@ ], "support": { "issues": "https://github.com/endroid/qr-code/issues", - "source": "https://github.com/endroid/qr-code/tree/4.8.5" + "source": "https://github.com/endroid/qr-code/tree/6.1.0" }, "funding": [ { @@ -1866,83 +1654,33 @@ "type": "github" } ], - "time": "2023-09-29T14:03:20+00:00" - }, - { - "name": "erusev/parsedown", - "version": "1.7.4", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35" - }, - "type": "library", - "autoload": { - "psr-0": { - "Parsedown": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", - "keywords": [ - "markdown", - "parser" - ], - "support": { - "issues": "https://github.com/erusev/parsedown/issues", - "source": "https://github.com/erusev/parsedown/tree/1.7.x" - }, - "time": "2019-12-30T22:54:17+00:00" + "time": "2025-11-25T10:47:45+00:00" }, { "name": "friendsofsymfony/rest-bundle", - "version": "3.8.0", + "version": "3.9.0-beta1", "source": { "type": "git", "url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git", - "reference": "d24736896518bae817bf0de8a6b682cb6535044b" + "reference": "342632e21f53fdaff12d9d83234c08e2045ea0f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/d24736896518bae817bf0de8a6b682cb6535044b", - "reference": "d24736896518bae817bf0de8a6b682cb6535044b", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/342632e21f53fdaff12d9d83234c08e2045ea0f6", + "reference": "342632e21f53fdaff12d9d83234c08e2045ea0f6", "shasum": "" }, "require": { "php": "^7.4|^8.0", "symfony/config": "^5.4|^6.4|^7.0", - "symfony/dependency-injection": "^5.4|^6.4|^7.0", + "symfony/dependency-injection": "^5.4|^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.1|^3.0", - "symfony/event-dispatcher": "^5.4|^6.4|^7.0", - "symfony/framework-bundle": "^5.4|^6.4|^7.0", - "symfony/http-foundation": "^5.4|^6.4|^7.0", - "symfony/http-kernel": "^5.4|^6.4|^7.0", - "symfony/routing": "^5.4|^6.4|^7.0", - "symfony/security-core": "^5.4|^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^5.4|^6.4|^7.0|^8.0", + "symfony/http-foundation": "^5.4|^6.4|^7.0|^8.0", + "symfony/http-kernel": "^5.4|^6.4|^7.0|^8.0", + "symfony/routing": "^5.4|^6.4|^7.0|^8.0", + "symfony/security-core": "^5.4|^6.4|^7.0|^8.0", "willdurand/jsonp-callback-validator": "^1.0|^2.0", "willdurand/negotiation": "^2.0|^3.0" }, @@ -1960,19 +1698,19 @@ "psr/http-message": "^1.0", "psr/log": "^1.0|^2.0|^3.0", "sensio/framework-extra-bundle": "^6.1", - "symfony/asset": "^5.4|^6.4|^7.0", - "symfony/browser-kit": "^5.4|^6.4|^7.0", - "symfony/css-selector": "^5.4|^6.4|^7.0", - "symfony/expression-language": "^5.4|^6.4|^7.0", - "symfony/form": "^5.4|^6.4|^7.0", - "symfony/mime": "^5.4|^6.4|^7.0", - "symfony/phpunit-bridge": "^7.0.1", - "symfony/security-bundle": "^5.4|^6.4|^7.0", - "symfony/serializer": "^5.4|^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.4|^7.0", - "symfony/validator": "^5.4|^6.4|^7.0", - "symfony/web-profiler-bundle": "^5.4|^6.4|^7.0", - "symfony/yaml": "^5.4|^6.4|^7.0" + "symfony/asset": "^5.4|^6.4|^7.0|^8.0", + "symfony/browser-kit": "^5.4|^6.4|^7.0|^8.0", + "symfony/css-selector": "^5.4|^6.4|^7.0|^8.0", + "symfony/expression-language": "^5.4|^6.4|^7.0|^8.0", + "symfony/form": "^5.4|^6.4|^7.0|^8.0", + "symfony/mime": "^5.4|^6.4|^7.0|^8.0", + "symfony/phpunit-bridge": "^7.0.1|^8.0", + "symfony/security-bundle": "^5.4|^6.4|^7.0|^8.0", + "symfony/serializer": "^5.4|^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^5.4|^6.4|^7.0|^8.0", + "symfony/validator": "^5.4|^6.4|^7.0|^8.0", + "symfony/web-profiler-bundle": "^5.4|^6.4|^7.0|^8.0", + "symfony/yaml": "^5.4|^6.4|^7.0|^8.0" }, "suggest": { "jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended", @@ -2020,9 +1758,9 @@ ], "support": { "issues": "https://github.com/FriendsOfSymfony/FOSRestBundle/issues", - "source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.8.0" + "source": "https://github.com/FriendsOfSymfony/FOSRestBundle/tree/3.9.0-beta1" }, - "time": "2024-11-04T08:41:36+00:00" + "time": "2025-12-22T13:26:35+00:00" }, { "name": "gedmo/doctrine-extensions", @@ -2798,16 +2536,16 @@ }, { "name": "league/csv", - "version": "9.27.1", + "version": "9.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797" + "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/26de738b8fccf785397d05ee2fc07b6cd8749797", - "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/6582ace29ae09ba5b07049d40ea13eb19c8b5073", + "reference": "6582ace29ae09ba5b07049d40ea13eb19c8b5073", "shasum": "" }, "require": { @@ -2817,14 +2555,14 @@ "require-dev": { "ext-dom": "*", "ext-xdebug": "*", - "friendsofphp/php-cs-fixer": "^3.75.0", - "phpbench/phpbench": "^1.4.1", - "phpstan/phpstan": "^1.12.27", + "friendsofphp/php-cs-fixer": "^3.92.3", + "phpbench/phpbench": "^1.4.3", + "phpstan/phpstan": "^1.12.32", "phpstan/phpstan-deprecation-rules": "^1.2.1", "phpstan/phpstan-phpunit": "^1.4.2", "phpstan/phpstan-strict-rules": "^1.6.2", - "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.3.6", - "symfony/var-dumper": "^6.4.8 || ^7.3.0" + "phpunit/phpunit": "^10.5.16 || ^11.5.22 || ^12.5.4", + "symfony/var-dumper": "^6.4.8 || ^7.4.0 || ^8.0" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -2885,7 +2623,7 @@ "type": "github" } ], - "time": "2025-10-25T08:35:20+00:00" + "time": "2025-12-27T15:18:42+00:00" }, { "name": "lorenzo/pinky", @@ -2942,31 +2680,32 @@ }, { "name": "maennchen/zipstream-php", - "version": "3.1.1", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "6187e9cc4493da94b9b63eb2315821552015fca9" + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9", - "reference": "6187e9cc4493da94b9b63eb2315821552015fca9", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", "shasum": "" }, "require": { "ext-mbstring": "*", "ext-zlib": "*", - "php-64bit": "^8.1" + "php-64bit": "^8.3" }, "require-dev": { + "brianium/paratest": "^7.7", "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.16", + "friendsofphp/php-cs-fixer": "^3.86", "guzzlehttp/guzzle": "^7.5", "mikey179/vfsstream": "^1.6", "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^10.0", - "vimeo/psalm": "^5.0" + "phpunit/phpunit": "^12.0", + "vimeo/psalm": "^6.0" }, "suggest": { "guzzlehttp/psr7": "^2.4", @@ -3007,7 +2746,7 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" }, "funding": [ { @@ -3015,7 +2754,7 @@ "type": "github" } ], - "time": "2024-10-10T12:33:01+00:00" + "time": "2025-12-10T09:58:31+00:00" }, { "name": "markbaker/complex", @@ -3126,16 +2865,16 @@ }, { "name": "monolog/monolog", - "version": "3.9.0", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", - "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", "shasum": "" }, "require": { @@ -3153,7 +2892,7 @@ "graylog2/gelf-php": "^1.4.2 || ^2.0", "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.8", "phpstan/phpstan": "^2", @@ -3213,7 +2952,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.9.0" + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" }, "funding": [ { @@ -3225,7 +2964,7 @@ "type": "tidelift" } ], - "time": "2025-03-24T10:02:05+00:00" + "time": "2026-01-02T08:56:05+00:00" }, { "name": "mpdf/mpdf", @@ -3462,35 +3201,36 @@ }, { "name": "nelmio/api-doc-bundle", - "version": "v5.7.1", + "version": "v5.8.2", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioApiDocBundle.git", - "reference": "772d26a9d940c9a8d173f75f0fdbaab47c1c87f2" + "reference": "b29ed29a460cc25dab91c2eb6a4f22fd4f31dd37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/772d26a9d940c9a8d173f75f0fdbaab47c1c87f2", - "reference": "772d26a9d940c9a8d173f75f0fdbaab47c1c87f2", + "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/b29ed29a460cc25dab91c2eb6a4f22fd4f31dd37", + "reference": "b29ed29a460cc25dab91c2eb6a4f22fd4f31dd37", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "phpdocumentor/reflection-docblock": "^5.0", "phpdocumentor/type-resolver": "^1.8.2", "psr/cache": "^1.0 || ^2.0 || ^3.0", "psr/container": "^1.0 || ^2.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/config": "^6.4 || ^7.1", - "symfony/console": "^6.4 || ^7.1", - "symfony/dependency-injection": "^6.4 || ^7.1", + "symfony/config": "^6.4 || ^7.2", + "symfony/console": "^6.4 || ^7.2", + "symfony/dependency-injection": "^6.4 || ^7.2", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/framework-bundle": "^6.4 || ^7.1", - "symfony/http-foundation": "^6.4 || ^7.1", - "symfony/http-kernel": "^6.4 || ^7.1", - "symfony/options-resolver": "^6.4 || ^7.1", - "symfony/property-info": "^6.4 || ^7.1", - "symfony/routing": "^6.4 || ^7.1", + "symfony/framework-bundle": "^6.4 || ^7.2", + "symfony/http-foundation": "^6.4 || ^7.2", + "symfony/http-kernel": "^6.4 || ^7.2", + "symfony/options-resolver": "^6.4 || ^7.2", + "symfony/property-info": "^6.4 || ^7.2", + "symfony/routing": "^6.4 || ^7.2", + "symfony/type-info": "^7.2", "zircote/swagger-php": "^4.11.1 || ^5.0" }, "conflict": { @@ -3507,24 +3247,24 @@ "phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^10.5", - "symfony/asset": "^6.4 || ^7.1", - "symfony/browser-kit": "^6.4 || ^7.1", - "symfony/cache": "^6.4 || ^7.1", - "symfony/dom-crawler": "^6.4 || ^7.1", - "symfony/expression-language": "^6.4 || ^7.1", - "symfony/finder": "^6.4 || ^7.1", - "symfony/form": "^6.4 || ^7.1", - "symfony/phpunit-bridge": "^6.4 || ^7.1", - "symfony/property-access": "^6.4 || ^7.1", - "symfony/security-csrf": "^6.4 || ^7.1", - "symfony/security-http": "^6.4 || ^7.1", - "symfony/serializer": "^6.4 || ^7.1", - "symfony/stopwatch": "^6.4 || ^7.1", - "symfony/templating": "^6.4 || ^7.1", - "symfony/translation": "^6.4 || ^7.1", - "symfony/twig-bundle": "^6.4 || ^7.1", - "symfony/uid": "^6.4 || ^7.1", - "symfony/validator": "^6.4 || ^7.1", + "symfony/asset": "^6.4 || ^7.2", + "symfony/browser-kit": "^6.4 || ^7.2", + "symfony/cache": "^6.4 || ^7.2", + "symfony/dom-crawler": "^6.4 || ^7.2", + "symfony/expression-language": "^6.4 || ^7.2", + "symfony/finder": "^6.4 || ^7.2", + "symfony/form": "^6.4 || ^7.2", + "symfony/phpunit-bridge": "^6.4 || ^7.2", + "symfony/property-access": "^6.4 || ^7.2", + "symfony/security-csrf": "^6.4 || ^7.2", + "symfony/security-http": "^6.4 || ^7.2", + "symfony/serializer": "^6.4 || ^7.2", + "symfony/stopwatch": "^6.4 || ^7.2", + "symfony/templating": "^6.4 || ^7.2", + "symfony/translation": "^6.4 || ^7.2", + "symfony/twig-bundle": "^6.4 || ^7.2", + "symfony/uid": "^6.4 || ^7.2", + "symfony/validator": "^6.4 || ^7.2", "willdurand/hateoas-bundle": "^2.7", "willdurand/negotiation": "^3.0" }, @@ -3573,7 +3313,7 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioApiDocBundle/issues", - "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v5.7.1" + "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v5.8.2" }, "funding": [ { @@ -3581,7 +3321,7 @@ "type": "github" } ], - "time": "2025-11-13T10:32:15+00:00" + "time": "2025-11-28T10:30:41+00:00" }, { "name": "nelmio/cors-bundle", @@ -3772,16 +3512,16 @@ }, { "name": "openspout/openspout", - "version": "v4.25.0", + "version": "v4.32.0", "source": { "type": "git", "url": "https://github.com/openspout/openspout.git", - "reference": "519affe730d92e1598720a6467227fc28550f0e6" + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openspout/openspout/zipball/519affe730d92e1598720a6467227fc28550f0e6", - "reference": "519affe730d92e1598720a6467227fc28550f0e6", + "url": "https://api.github.com/repos/openspout/openspout/zipball/41f045c1f632e1474e15d4c7bc3abcb4a153563d", + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d", "shasum": "" }, "require": { @@ -3791,17 +3531,17 @@ "ext-libxml": "*", "ext-xmlreader": "*", "ext-zip": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "ext-zlib": "*", - "friendsofphp/php-cs-fixer": "^3.64.0", - "infection/infection": "^0.29.6", - "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.12.4", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^10.5.20 || ^11.3.6" + "friendsofphp/php-cs-fixer": "^3.86.0", + "infection/infection": "^0.31.2", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^12.3.7" }, "suggest": { "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", @@ -3849,7 +3589,7 @@ ], "support": { "issues": "https://github.com/openspout/openspout/issues", - "source": "https://github.com/openspout/openspout/tree/v4.25.0" + "source": "https://github.com/openspout/openspout/tree/v4.32.0" }, "funding": [ { @@ -3861,36 +3601,35 @@ "type": "github" } ], - "time": "2024-09-24T09:03:42+00:00" + "time": "2025-09-03T16:03:54+00:00" }, { "name": "pagerfanta/pagerfanta", - "version": "v3.8.0", + "version": "v4.7.2", "source": { "type": "git", "url": "https://github.com/BabDev/Pagerfanta.git", - "reference": "a07c84296e491add39d103b812129de77610c33b" + "reference": "9320a542e1ed8d1a099a3d380685870e8bb5d553" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BabDev/Pagerfanta/zipball/a07c84296e491add39d103b812129de77610c33b", - "reference": "a07c84296e491add39d103b812129de77610c33b", + "url": "https://api.github.com/repos/BabDev/Pagerfanta/zipball/9320a542e1ed8d1a099a3d380685870e8bb5d553", + "reference": "9320a542e1ed8d1a099a3d380685870e8bb5d553", "shasum": "" }, "require": { "ext-json": "*", - "php": "^7.4 || ^8.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.15" + "php": "^8.1", + "symfony/deprecation-contracts": "^2.1 || ^3.0" }, "conflict": { "doctrine/collections": "<1.8", - "doctrine/dbal": "<3.1", - "doctrine/mongodb-odm": "<2.2.2", - "doctrine/orm": "<2.8", - "doctrine/phpcr-odm": "<1.5", - "ruflin/elastica": "<6.0", - "solarium/solarium": "<5.0", + "doctrine/dbal": "<3.5", + "doctrine/mongodb-odm": "<2.4", + "doctrine/orm": "<2.14", + "doctrine/phpcr-odm": "<1.7", + "ruflin/elastica": "<7.3", + "solarium/solarium": "<6.2", "twig/twig": "<2.13" }, "replace": { @@ -3905,22 +3644,21 @@ "pagerfanta/twig": "self.version" }, "require-dev": { - "dg/bypass-finals": "^1.3", - "doctrine/cache": "^1.11 || ^2.0", + "dg/bypass-finals": "^1.9", "doctrine/collections": "^1.8 || ^2.0", - "doctrine/dbal": "^3.1", - "doctrine/mongodb-odm": "^2.2.2", - "doctrine/orm": "^2.8", - "doctrine/phpcr-odm": "^1.5", - "jackalope/jackalope-doctrine-dbal": "^1.7.4", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.9.14", - "phpstan/phpstan-phpunit": "1.3.3", - "phpunit/phpunit": "9.6.7 || 10.1.0", - "rector/rector": "0.15.12", - "ruflin/elastica": "^6.0 || ^7.0", - "solarium/solarium": "^5.0 || ^6.0", - "symfony/cache": "^5.4 || ^6.0", + "doctrine/dbal": "^3.5 || ^4.0", + "doctrine/mongodb-odm": "^2.4", + "doctrine/orm": "^2.14 || ^3.0", + "doctrine/phpcr-odm": "^1.7 || ^2.0", + "jackalope/jackalope-doctrine-dbal": "^1.9 || ^2.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.1.31", + "phpstan/phpstan-phpunit": "2.0.7", + "phpunit/phpunit": "10.5.58", + "rector/rector": "2.2.3", + "ruflin/elastica": "^7.3 || ^8.0", + "solarium/solarium": "^6.2", + "symfony/cache": "^5.4 || ^6.3 || ^7.0", "twig/twig": "^2.13 || ^3.0" }, "suggest": { @@ -3956,7 +3694,7 @@ ], "support": { "issues": "https://github.com/BabDev/Pagerfanta/issues", - "source": "https://github.com/BabDev/Pagerfanta/tree/v3.8.0" + "source": "https://github.com/BabDev/Pagerfanta/tree/v4.7.2" }, "funding": [ { @@ -3964,28 +3702,30 @@ "type": "github" } ], - "time": "2023-04-15T16:39:36+00:00" + "time": "2025-10-12T17:35:33+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.8.2", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "e30811f7bc69e4b5b6d5783e712c06c8eabf0226" + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/e30811f7bc69e4b5b6d5783e712c06c8eabf0226", - "reference": "e30811f7bc69e4b5b6d5783e712c06c8eabf0226", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", "shasum": "" }, "require": { - "php": "^7|^8" + "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" }, "type": "library", "autoload": { @@ -4031,7 +3771,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2025-09-24T15:12:37+00:00" + "time": "2025-09-24T15:06:41+00:00" }, { "name": "paragonie/random_compat", @@ -4083,6 +3823,67 @@ }, "time": "2020-10-15T08:29:30+00:00" }, + { + "name": "parsedown/parsedown", + "version": "1.7.5", + "source": { + "type": "git", + "url": "https://github.com/parsedown/parsedown.git", + "reference": "6ca5690b0282544416897376abe056601847ddb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/parsedown/parsedown/zipball/6ca5690b0282544416897376abe056601847ddb3", + "reference": "6ca5690b0282544416897376abe056601847ddb3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7|^6.5|^7.5|^8.5|^9.6" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "https://erusev.com" + }, + { + "name": "Aidan Woods", + "email": "aidantwoods@gmail.com", + "homepage": "https://aidanwoods.com", + "role": "Developer" + }, + { + "name": "Damien Regad", + "email": "dregad@mantisbt.org", + "role": "Fork Maintainer" + } + ], + "description": "Parser for Markdown.", + "homepage": "https://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "support": { + "issues": "https://github.com/parsedown/parsedown/issues", + "source": "https://github.com/parsedown/parsedown/tree/1.7.5" + }, + "time": "2025-11-29T19:20:59+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -5075,20 +4876,20 @@ }, { "name": "scheb/2fa-backup-code", - "version": "v6.13.1", + "version": "v7.13.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-backup-code.git", - "reference": "6dceeb5be0f6339d76f8e380ee09631c8bbebc7e" + "reference": "35f1ace4be7be2c10158d2bb8284208499111db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/6dceeb5be0f6339d76f8e380ee09631c8bbebc7e", - "reference": "6dceeb5be0f6339d76f8e380ee09631c8bbebc7e", + "url": "https://api.github.com/repos/scheb/2fa-backup-code/zipball/35f1ace4be7be2c10158d2bb8284208499111db8", + "reference": "35f1ace4be7be2c10158d2bb8284208499111db8", "shasum": "" }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "scheb/2fa-bundle": "self.version" }, "type": "library", @@ -5118,40 +4919,40 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-backup-code/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-backup-code/tree/v7.13.1" }, - "time": "2024-11-29T19:22:48+00:00" + "time": "2025-11-20T13:35:24+00:00" }, { "name": "scheb/2fa-bundle", - "version": "v6.13.1", + "version": "v7.13.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-bundle.git", - "reference": "8eadd57ebc2078ef273dca72b1ac4bd283812346" + "reference": "edcc14456b508aab37ec792cfc36793d04226784" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/8eadd57ebc2078ef273dca72b1ac4bd283812346", - "reference": "8eadd57ebc2078ef273dca72b1ac4bd283812346", + "url": "https://api.github.com/repos/scheb/2fa-bundle/zipball/edcc14456b508aab37ec792cfc36793d04226784", + "reference": "edcc14456b508aab37ec792cfc36793d04226784", "shasum": "" }, "require": { "ext-json": "*", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", - "symfony/config": "^5.4 || ^6.0", - "symfony/dependency-injection": "^5.4 || ^6.0", - "symfony/event-dispatcher": "^5.4 || ^6.0", - "symfony/framework-bundle": "^5.4 || ^6.0", - "symfony/http-foundation": "^5.4 || ^6.0", - "symfony/http-kernel": "^5.4 || ^6.0", - "symfony/property-access": "^5.4 || ^6.0", - "symfony/security-bundle": "^5.4 || ^6.0", - "symfony/twig-bundle": "^5.4 || ^6.0" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/event-dispatcher": "^6.4 || ^7.0", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/http-kernel": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/twig-bundle": "^6.4 || ^7.0" }, "conflict": { - "scheb/two-factor-bundle": "*", - "symfony/security-core": "^7" + "scheb/two-factor-bundle": "*" }, "suggest": { "scheb/2fa-backup-code": "Emergency codes when you have no access to other methods", @@ -5186,29 +4987,31 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-bundle/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-bundle/tree/v7.13.1" }, - "time": "2024-11-29T19:29:49+00:00" + "time": "2025-12-18T15:29:07+00:00" }, { "name": "scheb/2fa-totp", - "version": "v6.13.1", + "version": "v7.13.1", "source": { "type": "git", "url": "https://github.com/scheb/2fa-totp.git", - "reference": "e72879c8e0aca5d21fdcfdecdaa98a1d1cad8612" + "reference": "89a0557e191cc3b49d138452e095e8b5fb703f40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scheb/2fa-totp/zipball/e72879c8e0aca5d21fdcfdecdaa98a1d1cad8612", - "reference": "e72879c8e0aca5d21fdcfdecdaa98a1d1cad8612", + "url": "https://api.github.com/repos/scheb/2fa-totp/zipball/89a0557e191cc3b49d138452e095e8b5fb703f40", + "reference": "89a0557e191cc3b49d138452e095e8b5fb703f40", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^2.4", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", "scheb/2fa-bundle": "self.version", - "spomky-labs/otphp": "^10.0 || ^11.0" + "spomky-labs/otphp": "^11.0" + }, + "suggest": { + "symfony/validator": "Needed if you want to use the TOTP validator constraint" }, "type": "library", "autoload": { @@ -5237,9 +5040,9 @@ "two-step" ], "support": { - "source": "https://github.com/scheb/2fa-totp/tree/v6.13.1" + "source": "https://github.com/scheb/2fa-totp/tree/v7.13.1" }, - "time": "2024-11-29T19:22:48+00:00" + "time": "2025-12-04T15:55:14+00:00" }, { "name": "setasign/fpdf", @@ -5494,28 +5297,28 @@ }, { "name": "symfony/asset", - "version": "v6.4.24", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab" + "reference": "0f7bccb9ffa1f373cbd659774d90629b2773464f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/cfee7c0d64be113383db74a2fdd65d426b7f3aab", - "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab", + "url": "https://api.github.com/repos/symfony/asset/zipball/0f7bccb9ffa1f373cbd659774d90629b2773464f", + "reference": "0f7bccb9ffa1f373cbd659774d90629b2773464f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/http-foundation": "<5.4" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0" + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5543,7 +5346,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.4.24" + "source": "https://github.com/symfony/asset/tree/v7.4.0" }, "funding": [ { @@ -5563,35 +5366,38 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-04T07:05:15+00:00" }, { "name": "symfony/cache", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "eb3272ed2daed13ed24816e862d73f73d995972a" + "reference": "642117d18bc56832e74b68235359ccefab03dd11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/eb3272ed2daed13ed24816e862d73f73d995972a", - "reference": "eb3272ed2daed13ed24816e862d73f73d995972a", + "url": "https://api.github.com/repos/symfony/cache/zipball/642117d18bc56832e74b68235359ccefab03dd11", + "reference": "642117d18bc56832e74b68235359ccefab03dd11", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", + "symfony/cache-contracts": "^3.6", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.3.6|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "doctrine/dbal": "<3.6", + "ext-redis": "<6.1", + "ext-relay": "<0.12.1", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" }, "provide": { "psr/cache-implementation": "2.0|3.0", @@ -5600,15 +5406,16 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5643,7 +5450,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.30" + "source": "https://github.com/symfony/cache/tree/v7.4.3" }, "funding": [ { @@ -5663,7 +5470,7 @@ "type": "tidelift" } ], - "time": "2025-12-01T16:41:59+00:00" + "time": "2025-12-28T10:45:24+00:00" }, { "name": "symfony/cache-contracts", @@ -5743,20 +5550,20 @@ }, { "name": "symfony/clock", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68" + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/fb2df4bc9e3037c4765ba7fd29e00167001a9b68", - "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/clock": "^1.0", "symfony/polyfill-php83": "^1.28" }, @@ -5797,7 +5604,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.4.30" + "source": "https://github.com/symfony/clock/tree/v7.4.0" }, "funding": [ { @@ -5817,38 +5624,38 @@ "type": "tidelift" } ], - "time": "2025-11-11T21:24:34+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/config", - "version": "v6.4.28", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62" + "reference": "800ce889e358a53a9678b3212b0c8cecd8c6aace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/15947c18ef3ddb0b2f4ec936b9e90e2520979f62", - "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62", + "url": "https://api.github.com/repos/symfony/config/zipball/800ce889e358a53a9678b3212b0c8cecd8c6aace", + "reference": "800ce889e358a53a9678b3212b0c8cecd8c6aace", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^7.1|^8.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4", + "symfony/finder": "<6.4", "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5876,7 +5683,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.28" + "source": "https://github.com/symfony/config/tree/v7.4.3" }, "funding": [ { @@ -5896,51 +5703,51 @@ "type": "tidelift" } ], - "time": "2025-11-01T19:52:02+00:00" + "time": "2025-12-23T14:24:27+00:00" }, { "name": "symfony/console", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e" + "reference": "732a9ca6cd9dfd940c639062d5edbde2f6727fb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1b2813049506b39eb3d7e64aff033fd5ca26c97e", - "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e", + "url": "https://api.github.com/repos/symfony/console/zipball/732a9ca6cd9dfd940c639062d5edbde2f6727fb6", + "reference": "732a9ca6cd9dfd940c639062d5edbde2f6727fb6", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5974,7 +5781,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.30" + "source": "https://github.com/symfony/console/tree/v7.4.3" }, "funding": [ { @@ -5994,24 +5801,24 @@ "type": "tidelift" } ], - "time": "2025-12-05T13:47:41+00:00" + "time": "2025-12-23T14:50:43+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.24", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761" + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/9b784413143701aa3c94ac1869a159a9e53e8761", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -6043,7 +5850,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.24" + "source": "https://github.com/symfony/css-selector/tree/v7.4.0" }, "funding": [ { @@ -6063,44 +5870,43 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-10-30T13:39:42+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5328f994cbb0855ba25c3a54f4a31a279511640f" + "reference": "54122901b6d772e94f1e71a75e0533bc16563499" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5328f994cbb0855ba25c3a54f4a31a279511640f", - "reference": "5328f994cbb0855ba25c3a54f4a31a279511640f", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/54122901b6d772e94f1e71a75e0533bc16563499", + "reference": "54122901b6d772e94f1e71a75e0533bc16563499", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4.20|^7.2.5" + "symfony/service-contracts": "^3.6", + "symfony/var-exporter": "^6.4.20|^7.2.5|^8.0" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "psr/container-implementation": "1.1|2.0", "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6128,7 +5934,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/v6.4.30" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.3" }, "funding": [ { @@ -6148,7 +5954,7 @@ "type": "tidelift" } ], - "time": "2025-12-07T09:29:59+00:00" + "time": "2025-12-28T10:55:46+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6219,67 +6025,68 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.26", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "c14bb5a9125c411e73354954940e06b6e7fcc344" + "reference": "bd338ba08f5c47fe77e0a15e85ec3c5d070f9ceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c14bb5a9125c411e73354954940e06b6e7fcc344", - "reference": "c14bb5a9125c411e73354954940e06b6e7fcc344", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/bd338ba08f5c47fe77e0a15e85ec3c5d070f9ceb", + "reference": "bd338ba08f5c47fe77e0a15e85ec3c5d070f9ceb", "shasum": "" }, "require": { - "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^2.5|^3.1|^4", - "php": ">=8.1", + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1|^4", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/dbal": "<2.13.1", + "doctrine/collections": "<1.8", + "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", - "symfony/http-foundation": "<6.3", - "symfony/http-kernel": "<6.2", - "symfony/lock": "<6.3", - "symfony/messenger": "<5.4", - "symfony/property-info": "<5.4", - "symfony/security-bundle": "<5.4", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", "symfony/security-core": "<6.4", - "symfony/validator": "<6.4" + "symfony/validator": "<7.4" }, "require-dev": { - "doctrine/collections": "^1.0|^2.0", + "doctrine/collections": "^1.8|^2.0", "doctrine/data-fixtures": "^1.1|^2", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.2|^7.0", - "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.38|^6.4.6|^7.0.6", - "symfony/http-kernel": "^6.3|^7.0", - "symfony/lock": "^6.3|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/proxy-manager-bridge": "^6.4", - "symfony/security-core": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/doctrine-messenger": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.2|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -6307,7 +6114,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.26" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.3" }, "funding": [ { @@ -6327,32 +6134,32 @@ "type": "tidelift" } ], - "time": "2025-09-26T15:07:38+00:00" + "time": "2025-12-22T13:47:05+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "924edbc9631b75302def0258ed1697948b17baf6" + "reference": "1658a4d34df028f3d93bcdd8e81f04423925a364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/924edbc9631b75302def0258ed1697948b17baf6", - "reference": "924edbc9631b75302def0258ed1697948b17baf6", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/1658a4d34df028f3d93bcdd8e81f04423925a364", + "reference": "1658a4d34df028f3d93bcdd8e81f04423925a364", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/console": "<5.4", - "symfony/process": "<5.4" + "symfony/console": "<6.4", + "symfony/process": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6385,7 +6192,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.30" + "source": "https://github.com/symfony/dotenv/tree/v7.4.0" }, "funding": [ { @@ -6405,35 +6212,38 @@ "type": "tidelift" } ], - "time": "2025-11-14T17:33:48+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.26", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "41bedcaec5b72640b0ec2096547b75fda72ead6c" + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/41bedcaec5b72640b0ec2096547b75fda72ead6c", - "reference": "41bedcaec5b72640b0ec2096547b75fda72ead6c", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -6464,7 +6274,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.26" + "source": "https://github.com/symfony/error-handler/tree/v7.4.0" }, "funding": [ { @@ -6484,28 +6294,28 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2025-11-05T14:29:59+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.25", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b0cf3162020603587363f0551cd3be43958611ff" + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b0cf3162020603587363f0551cd3be43958611ff", - "reference": "b0cf3162020603587363f0551cd3be43958611ff", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -6514,13 +6324,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6548,7 +6359,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.25" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0" }, "funding": [ { @@ -6568,7 +6379,7 @@ "type": "tidelift" } ], - "time": "2025-08-13T09:41:44+00:00" + "time": "2025-10-28T09:38:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -6648,21 +6459,21 @@ }, { "name": "symfony/expression-language", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "01906f3b379833b347de9abc8ddc326593e9122b" + "reference": "8b9bbbb8c71f79a09638f6ea77c531e511139efa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/01906f3b379833b347de9abc8ddc326593e9122b", - "reference": "01906f3b379833b347de9abc8ddc326593e9122b", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/8b9bbbb8c71f79a09638f6ea77c531e511139efa", + "reference": "8b9bbbb8c71f79a09638f6ea77c531e511139efa", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3" }, @@ -6692,7 +6503,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.30" + "source": "https://github.com/symfony/expression-language/tree/v7.4.0" }, "funding": [ { @@ -6712,29 +6523,29 @@ "type": "tidelift" } ], - "time": "2025-11-09T10:02:06+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6762,7 +6573,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -6782,27 +6593,27 @@ "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", - "version": "v6.4.27", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b" + "reference": "fffe05569336549b20a1be64250b40516d6e8d06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b6aa435d2fba50793b994a839c32b6064f063b", - "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b", + "url": "https://api.github.com/repos/symfony/finder/zipball/fffe05569336549b20a1be64250b40516d6e8d06", + "reference": "fffe05569336549b20a1be64250b40516d6e8d06", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6830,7 +6641,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.27" + "source": "https://github.com/symfony/finder/tree/v7.4.3" }, "funding": [ { @@ -6850,7 +6661,7 @@ "type": "tidelift" } ], - "time": "2025-10-15T18:32:00+00:00" + "time": "2025-12-23T14:50:43+00:00" }, { "name": "symfony/flex", @@ -6927,56 +6738,58 @@ }, { "name": "symfony/form", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "e6378bc56d5d56db65754a09c91a7cf7c35b44db" + "reference": "f7e147d3e57198122568f17909bc85266b0b2592" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/e6378bc56d5d56db65754a09c91a7cf7c35b44db", - "reference": "e6378bc56d5d56db65754a09c91a7cf7c35b44db", + "url": "https://api.github.com/repos/symfony/form/zipball/f7e147d3e57198122568f17909bc85266b0b2592", + "reference": "f7e147d3e57198122568f17909bc85266b0b2592", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/options-resolver": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/options-resolver": "^7.3|^8.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-access": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", - "symfony/error-handler": "<5.4", - "symfony/framework-bundle": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/error-handler": "<6.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<7.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.3" + "symfony/twig-bridge": "<6.4" }, "require-dev": { "doctrine/collections": "^1.0|^2.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4.3|^7.0.3|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4.12|^7.1.5|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7004,7 +6817,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.30" + "source": "https://github.com/symfony/form/tree/v7.4.3" }, "funding": [ { @@ -7024,112 +6837,117 @@ "type": "tidelift" } ], - "time": "2025-12-05T07:26:17+00:00" + "time": "2025-12-23T14:50:43+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "3c212ec5cac588da8357f5c061194363a4e91010" + "reference": "df908e8f9e5f6cc3c9e0d0172e030a5c1c280582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3c212ec5cac588da8357f5c061194363a4e91010", - "reference": "3c212ec5cac588da8357f5c061194363a4e91010", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/df908e8f9e5f6cc3c9e0d0172e030a5c1c280582", + "reference": "df908e8f9e5f6cc3c9e0d0172e030a5c1c280582", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.12|^7.0", + "php": ">=8.2", + "symfony/cache": "^6.4.12|^7.0|^8.0", + "symfony/config": "^7.4.3|^8.0.3", + "symfony/dependency-injection": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.1|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4", + "symfony/error-handler": "^7.3|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^7.1|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^6.4|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/routing": "^7.4|^8.0" }, "conflict": { - "doctrine/annotations": "<1.13.1", "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<5.4", + "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", - "symfony/clock": "<6.3", - "symfony/console": "<5.4|>=7.0", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", "symfony/dom-crawler": "<6.4", - "symfony/dotenv": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<6.3", - "symfony/lock": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<6.3", + "symfony/dotenv": "<6.4", + "symfony/form": "<7.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<7.4", "symfony/mime": "<6.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4", - "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", - "symfony/security-core": "<5.4", - "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.4", - "symfony/stopwatch": "<5.4", - "symfony/translation": "<6.4", - "symfony/twig-bridge": "<5.4", - "symfony/twig-bundle": "<5.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<7.2", + "symfony/serializer": "<7.2.5", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<7.3", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" + "symfony/webhook": "<7.2", + "symfony/workflow": "<7.4" }, "require-dev": { - "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "seld/jsonlint": "^1.10", - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/console": "^5.4.9|^6.0.9|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-client": "^6.3|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.3|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/notifier": "^5.4|^6.0|^7.0", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/dotenv": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/json-streamer": "^7.3|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/notifier": "^6.4|^7.0|^8.0", + "symfony/object-mapper": "^7.3|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/scheduler": "^6.4.4|^7.0.4", - "symfony/security-bundle": "^5.4|^6.0|^7.0", - "symfony/semaphore": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.10|^3.0.4" + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/scheduler": "^6.4.4|^7.0.4|^8.0", + "symfony/security-bundle": "^6.4|^7.0|^8.0", + "symfony/semaphore": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.2.5|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^7.3|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.3|^8.0", + "twig/twig": "^3.12" }, "type": "symfony-bundle", "autoload": { @@ -7157,7 +6975,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/v6.4.30" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.3" }, "funding": [ { @@ -7177,24 +6995,24 @@ "type": "tidelift" } ], - "time": "2025-11-29T11:31:32+00:00" + "time": "2025-12-29T09:31:36+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "a67de2002d72f76ce7c57f830c4df503febc8d77" + "reference": "d01dfac1e0dc99f18da48b18101c23ce57929616" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/a67de2002d72f76ce7c57f830c4df503febc8d77", - "reference": "a67de2002d72f76ce7c57f830c4df503febc8d77", + "url": "https://api.github.com/repos/symfony/http-client/zipball/d01dfac1e0dc99f18da48b18101c23ce57929616", + "reference": "d01dfac1e0dc99f18da48b18101c23ce57929616", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", @@ -7202,8 +7020,10 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.3" + "symfony/http-foundation": "<6.4" }, "provide": { "php-http/async-client-implementation": "*", @@ -7212,19 +7032,20 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7255,7 +7076,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.30" + "source": "https://github.com/symfony/http-client/tree/v7.4.3" }, "funding": [ { @@ -7275,7 +7096,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T16:42:50+00:00" + "time": "2025-12-23T14:50:43+00:00" }, { "name": "symfony/http-client-contracts", @@ -7357,36 +7178,37 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "0384c62b79d96e9b22d77bc1272c9e83342ba3a6" + "reference": "a70c745d4cea48dbd609f4075e5f5cbce453bd52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0384c62b79d96e9b22d77bc1272c9e83342ba3a6", - "reference": "0384c62b79d96e9b22d77bc1272c9e83342ba3a6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a70c745d4cea48dbd609f4075e5f5cbce453bd52", + "reference": "a70c745d4cea48dbd609f4075e5f5cbce453bd52", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" + "symfony/polyfill-mbstring": "^1.1" }, "conflict": { + "doctrine/dbal": "<3.6", "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7414,7 +7236,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.30" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.3" }, "funding": [ { @@ -7434,77 +7256,78 @@ "type": "tidelift" } ], - "time": "2025-12-01T20:07:31+00:00" + "time": "2025-12-23T14:23:49+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "ceac681e74e824bbf90468eb231d40988d6d18a5" + "reference": "885211d4bed3f857b8c964011923528a55702aa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ceac681e74e824bbf90468eb231d40988d6d18a5", - "reference": "ceac681e74e824bbf90468eb231d40988d6d18a5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/885211d4bed3f857b8c964011923528a55702aa5", + "reference": "885211d4bed3f857b8c964011923528a55702aa5", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<6.1", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<5.4", + "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.3", - "twig/twig": "<2.13" + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.5|^6.0.5|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", - "symfony/var-exporter": "^6.2|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -7532,7 +7355,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/v6.4.30" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.3" }, "funding": [ { @@ -7552,29 +7375,32 @@ "type": "tidelift" } ], - "time": "2025-12-07T15:49:34+00:00" + "time": "2025-12-31T08:43:57+00:00" }, { "name": "symfony/intl", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "5f40c7141be52f7ee86c4a42dce2845e6fbe3c85" + "reference": "2fa074de6c7faa6b54f2891fc22708f42245ed5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/5f40c7141be52f7ee86c4a42dce2845e6fbe3c85", - "reference": "5f40c7141be52f7ee86c4a42dce2845e6fbe3c85", + "url": "https://api.github.com/repos/symfony/intl/zipball/2fa074de6c7faa6b54f2891fc22708f42245ed5c", + "reference": "2fa074de6c7faa6b54f2891fc22708f42245ed5c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/string": "<7.1" }, "require-dev": { - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7619,7 +7445,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.30" + "source": "https://github.com/symfony/intl/tree/v7.4.0" }, "funding": [ { @@ -7639,43 +7465,43 @@ "type": "tidelift" } ], - "time": "2025-11-24T13:57:00+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.27", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "2f096718ed718996551f66e3a24e12b2ed027f95" + "reference": "e472d35e230108231ccb7f51eb6b2100cac02ee4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/2f096718ed718996551f66e3a24e12b2ed027f95", - "reference": "2f096718ed718996551f66e3a24e12b2ed027f95", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e472d35e230108231ccb7f51eb6b2100cac02ee4", + "reference": "e472d35e230108231ccb7f51eb6b2100cac02ee4", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", + "php": ">=8.2", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7703,7 +7529,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.27" + "source": "https://github.com/symfony/mailer/tree/v7.4.3" }, "funding": [ { @@ -7723,24 +7549,24 @@ "type": "tidelift" } ], - "time": "2025-10-24T13:29:09+00:00" + "time": "2025-12-16T08:02:06+00:00" }, { "name": "symfony/mime", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "69aeef5d2692bb7c18ce133b09f67b27260b7acf" + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/69aeef5d2692bb7c18ce133b09f67b27260b7acf", - "reference": "69aeef5d2692bb7c18ce133b09f67b27260b7acf", + "url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a", + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" @@ -7749,18 +7575,18 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", + "symfony/mailer": "<6.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3" + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" }, "type": "library", "autoload": { @@ -7792,7 +7618,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.30" + "source": "https://github.com/symfony/mime/tree/v7.4.0" }, "funding": [ { @@ -7812,42 +7638,42 @@ "type": "tidelift" } ], - "time": "2025-11-16T09:57:53+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.4.28", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "d2f4b68e3247cf44d93f48545c8c072a75c17e5b" + "reference": "189d16466ff83d9c51fad26382bf0beeb41bda21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/d2f4b68e3247cf44d93f48545c8c072a75c17e5b", - "reference": "d2f4b68e3247cf44d93f48545c8c072a75c17e5b", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/189d16466ff83d9c51fad26382bf0beeb41bda21", + "reference": "189d16466ff83d9c51fad26382bf0beeb41bda21", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2|^3", - "php": ">=8.1", + "monolog/monolog": "^3", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/security-core": "<5.4" + "symfony/console": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -7875,7 +7701,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.28" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.4.0" }, "funding": [ { @@ -7895,7 +7721,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T19:57:08+00:00" + "time": "2025-11-01T09:17:33+00:00" }, { "name": "symfony/monolog-bundle", @@ -7979,20 +7805,20 @@ }, { "name": "symfony/options-resolver", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f" + "reference": "b38026df55197f9e39a44f3215788edf83187b80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", - "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80", + "reference": "b38026df55197f9e39a44f3215788edf83187b80", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -8026,7 +7852,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.30" + "source": "https://github.com/symfony/options-resolver/tree/v7.4.0" }, "funding": [ { @@ -8046,31 +7872,31 @@ "type": "tidelift" } ], - "time": "2025-11-12T13:06:53+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.4.24", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557" + "reference": "aa075ce6f54fe931f03c1e382597912f4fd94e1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/dcab5ac87450aaed26483ba49c2ce86808da7557", - "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/aa075ce6f54fe931f03c1e382597912f4fd94e1e", + "reference": "aa075ce6f54fe931f03c1e382597912f4fd94e1e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/security-core": "<5.4" + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -8102,7 +7928,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.24" + "source": "https://github.com/symfony/password-hasher/tree/v7.4.0" }, "funding": [ { @@ -8122,20 +7948,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-13T16:46:49+00:00" }, { - "name": "symfony/polyfill-php83", + "name": "symfony/polyfill-php85", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", "shasum": "" }, "require": { @@ -8153,7 +7979,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, "classmap": [ "Resources/stubs" @@ -8173,7 +7999,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -8182,7 +8008,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" }, "funding": [ { @@ -8202,104 +8028,24 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" - }, - { - "name": "symfony/polyfill-php84", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/process", - "version": "v6.4.26", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "48bad913268c8cafabbf7034b39c8bb24fbc5ab8" + "reference": "2f8e1a6cdf590ca63715da4d3a7a3327404a523f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/48bad913268c8cafabbf7034b39c8bb24fbc5ab8", - "reference": "48bad913268c8cafabbf7034b39c8bb24fbc5ab8", + "url": "https://api.github.com/repos/symfony/process/zipball/2f8e1a6cdf590ca63715da4d3a7a3327404a523f", + "reference": "2f8e1a6cdf590ca63715da4d3a7a3327404a523f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -8327,7 +8073,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.26" + "source": "https://github.com/symfony/process/tree/v7.4.3" }, "funding": [ { @@ -8347,29 +8093,29 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2025-12-19T10:00:43+00:00" }, { "name": "symfony/property-access", - "version": "v6.4.25", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "fedc771326d4978a7d3167fa009a509b06a2e168" + "reference": "30aff8455647be949fc2e8fcef2847d5a6743c98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/fedc771326d4978a7d3167fa009a509b06a2e168", - "reference": "fedc771326d4978a7d3167fa009a509b06a2e168", + "url": "https://api.github.com/repos/symfony/property-access/zipball/30aff8455647be949fc2e8fcef2847d5a6743c98", + "reference": "30aff8455647be949fc2e8fcef2847d5a6743c98", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/property-info": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/property-info": "^6.4.31|~7.3.9|^7.4.2|^8.0.3" }, "require-dev": { - "symfony/cache": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4.1|^7.0.1|^8.0" }, "type": "library", "autoload": { @@ -8408,7 +8154,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.25" + "source": "https://github.com/symfony/property-access/tree/v7.4.3" }, "funding": [ { @@ -8428,41 +8174,41 @@ "type": "tidelift" } ], - "time": "2025-08-12T15:42:57+00:00" + "time": "2025-12-18T10:35:58+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "13243e748cb77b3d2300c0bffa21c2d325dd6e98" + "reference": "ea62b28cd68fb36e252abd77de61e505a0f2a7b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/13243e748cb77b3d2300c0bffa21c2d325dd6e98", - "reference": "13243e748cb77b3d2300c0bffa21c2d325dd6e98", + "url": "https://api.github.com/repos/symfony/property-info/zipball/ea62b28cd68fb36e252abd77de61e505a0f2a7b1", + "reference": "ea62b28cd68fb36e252abd77de61e505a0f2a7b1", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/string": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/type-info": "~7.3.8|^7.4.1|^8.0.1" }, "conflict": { - "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<5.4|>=6.0,<6.4", - "symfony/serializer": "<5.4" + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/serializer": "^5.4|^6.4|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -8498,7 +8244,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.30" + "source": "https://github.com/symfony/property-info/tree/v7.4.3" }, "funding": [ { @@ -8518,30 +8264,29 @@ "type": "tidelift" } ], - "time": "2025-11-29T16:02:37+00:00" + "time": "2025-12-18T08:28:41+00:00" }, { "name": "symfony/rate-limiter", - "version": "v6.4.24", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "15a9a10fd0f060243c88ce98d5c29e9cc4b886e7" + "reference": "5c6df5bc10308505bb0fa8d1388bc6bd8a628ba8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/15a9a10fd0f060243c88ce98d5c29e9cc4b886e7", - "reference": "15a9a10fd0f060243c88ce98d5c29e9cc4b886e7", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/5c6df5bc10308505bb0fa8d1388bc6bd8a628ba8", + "reference": "5c6df5bc10308505bb0fa8d1388bc6bd8a628ba8", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/options-resolver": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/options-resolver": "^7.3|^8.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/lock": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -8573,7 +8318,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.4.24" + "source": "https://github.com/symfony/rate-limiter/tree/v7.4.0" }, "funding": [ { @@ -8593,40 +8338,38 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-04T07:05:15+00:00" }, { "name": "symfony/routing", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ea50a13c2711eebcbb66b38ef6382e62e3262859" + "reference": "5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ea50a13c2711eebcbb66b38ef6382e62e3262859", - "reference": "ea50a13c2711eebcbb66b38ef6382e62e3262859", + "url": "https://api.github.com/repos/symfony/routing/zipball/5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090", + "reference": "5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<6.2", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -8660,7 +8403,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.30" + "source": "https://github.com/symfony/routing/tree/v7.4.3" }, "funding": [ { @@ -8680,35 +8423,35 @@ "type": "tidelift" } ], - "time": "2025-11-22T09:51:35+00:00" + "time": "2025-12-19T10:00:43+00:00" }, { "name": "symfony/runtime", - "version": "v6.4.30", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "fb3149ee85d3b639dd3e49ea9dda05656f0537e3" + "reference": "876f902a6cb6b26c003de244188c06b2ba1c172f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/fb3149ee85d3b639dd3e49ea9dda05656f0537e3", - "reference": "fb3149ee85d3b639dd3e49ea9dda05656f0537e3", + "url": "https://api.github.com/repos/symfony/runtime/zipball/876f902a6cb6b26c003de244188c06b2ba1c172f", + "reference": "876f902a6cb6b26c003de244188c06b2ba1c172f", "shasum": "" }, "require": { "composer-plugin-api": "^1.0|^2.0", - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/dotenv": "<5.4" + "symfony/dotenv": "<6.4" }, "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "symfony/console": "^5.4.9|^6.0.9|^7.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0" + "composer/composer": "^2.6", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dotenv": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0" }, "type": "composer-plugin", "extra": { @@ -8743,7 +8486,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v6.4.30" + "source": "https://github.com/symfony/runtime/tree/v7.4.1" }, "funding": [ { @@ -8763,75 +8506,71 @@ "type": "tidelift" } ], - "time": "2025-12-05T10:55:13+00:00" + "time": "2025-12-05T14:04:53+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "508e67e68156cf3cb2b982504191b2ce34daa921" + "reference": "48a64e746857464a5e8fd7bab84b31c9ba967eb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/508e67e68156cf3cb2b982504191b2ce34daa921", - "reference": "508e67e68156cf3cb2b982504191b2ce34daa921", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/48a64e746857464a5e8fd7bab84b31c9ba967eb9", + "reference": "48a64e746857464a5e8fd7bab84b31c9ba967eb9", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/clock": "^6.3|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.11|^7.1.4", + "php": ">=8.2", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/password-hasher": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^6.3.6|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/password-hasher": "^6.4|^7.0|^8.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/security-http": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/console": "<6.4", "symfony/framework-bundle": "<6.4", - "symfony/http-client": "<5.4", - "symfony/ldap": "<5.4", + "symfony/http-client": "<6.4", + "symfony/ldap": "<6.4", "symfony/serializer": "<6.4", - "symfony/twig-bundle": "<5.4", + "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4" }, "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1", - "web-token/jwt-signature-algorithm-eddsa": "^3.1", - "web-token/jwt-signature-algorithm-hmac": "^3.1", - "web-token/jwt-signature-algorithm-none": "^3.1", - "web-token/jwt-signature-algorithm-rsa": "^3.1" + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", + "twig/twig": "^3.15", + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", "autoload": { @@ -8859,7 +8598,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.30" + "source": "https://github.com/symfony/security-bundle/tree/v7.4.0" }, "funding": [ { @@ -8879,49 +8618,50 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:05:02+00:00" + "time": "2025-11-14T09:57:20+00:00" }, { "name": "symfony/security-core", - "version": "v6.4.27", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "673018434b38e504eb04ca3c6d7e2e7c86735bfb" + "reference": "be0b8585f2d69b48a9b1a6372aa48d23c7e7eeb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/673018434b38e504eb04ca3c6d7e2e7c86735bfb", - "reference": "673018434b38e504eb04ca3c6d7e2e7c86735bfb", + "url": "https://api.github.com/repos/symfony/security-core/zipball/be0b8585f2d69b48a9b1a6372aa48d23c7e7eeb4", + "reference": "be0b8585f2d69b48a9b1a6372aa48d23c7e7eeb4", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", - "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/password-hasher": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/event-dispatcher": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/ldap": "<5.4", - "symfony/security-guard": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/validator": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/ldap": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/validator": "<6.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/validator": "^6.4|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4.3|^7.0.3|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -8949,7 +8689,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.27" + "source": "https://github.com/symfony/security-core/tree/v7.4.3" }, "funding": [ { @@ -8969,31 +8709,33 @@ "type": "tidelift" } ], - "time": "2025-10-23T19:49:35+00:00" + "time": "2025-12-19T23:18:26+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.4.24", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7" + "reference": "d526fa61963d926e91c9fb22edf829d9f8793dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/9a1efc8c10b86bcedc9233affd10c716b54ca1b7", - "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/d526fa61963d926e91c9fb22edf829d9f8793dfe", + "reference": "d526fa61963d926e91c9fb22edf829d9f8793dfe", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/security-core": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/security-core": "^6.4|^7.0|^8.0" }, "conflict": { - "symfony/http-foundation": "<5.4" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-foundation": "^5.4|^6.0|^7.0" + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -9021,7 +8763,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.24" + "source": "https://github.com/symfony/security-csrf/tree/v7.4.3" }, "funding": [ { @@ -9041,51 +8783,51 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-12-23T15:24:11+00:00" }, { "name": "symfony/security-http", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "5705ae14ed77b38ac99990959d8c6dbcba86e513" + "reference": "72f3b3fa9f322c9579d5246895a09f945cc33e36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/5705ae14ed77b38ac99990959d8c6dbcba86e513", - "reference": "5705ae14ed77b38ac99990959d8c6dbcba86e513", + "url": "https://api.github.com/repos/symfony/security-http/zipball/72f3b3fa9f322c9579d5246895a09f945cc33e36", + "reference": "72f3b3fa9f322c9579d5246895a09f945cc33e36", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.3|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/security-core": "^7.3|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/clock": "<6.3", - "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/clock": "<6.4", "symfony/http-client-contracts": "<3.0", - "symfony/security-bundle": "<5.4", - "symfony/security-csrf": "<5.4" + "symfony/security-bundle": "<6.4", + "symfony/security-csrf": "<6.4" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.3|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^3.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1" + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "library", "autoload": { @@ -9113,7 +8855,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.30" + "source": "https://github.com/symfony/security-http/tree/v7.4.3" }, "funding": [ { @@ -9133,61 +8875,62 @@ "type": "tidelift" } ], - "time": "2025-11-12T13:33:48+00:00" + "time": "2025-12-19T23:18:26+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d7976be554af097c788d7df25e10dd99facbfe65" + "reference": "af01e99d6fc63549063fb9e849ce1240cfef5c4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d7976be554af097c788d7df25e10dd99facbfe65", - "reference": "d7976be554af097c788d7df25e10dd99facbfe65", + "url": "https://api.github.com/repos/symfony/serializer/zipball/af01e99d6fc63549063fb9e849ce1240cfef5c4a", + "reference": "af01e99d6fc63549063fb9e849ce1240cfef5c4a", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php84": "^1.30" }, "conflict": { - "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<5.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4.24|>=6,<6.2.11", - "symfony/uid": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/uid": "<6.4", "symfony/validator": "<6.4", - "symfony/yaml": "<5.4" + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.26|^6.3|^7.0", - "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^7.2|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -9215,7 +8958,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/v6.4.30" + "source": "https://github.com/symfony/serializer/tree/v7.4.3" }, "funding": [ { @@ -9235,7 +8978,7 @@ "type": "tidelift" } ], - "time": "2025-11-12T13:46:18+00:00" + "time": "2025-12-23T14:50:43+00:00" }, { "name": "symfony/service-contracts", @@ -9326,20 +9069,20 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.24", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + "reference": "8a24af0a2e8a872fb745047180649b8418303084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084", + "reference": "8a24af0a2e8a872fb745047180649b8418303084", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -9368,7 +9111,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + "source": "https://github.com/symfony/stopwatch/tree/v7.4.0" }, "funding": [ { @@ -9388,26 +9131,27 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-04T07:05:15+00:00" }, { "name": "symfony/string", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.33", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, @@ -9415,10 +9159,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -9457,7 +9202,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v7.4.0" }, "funding": [ { @@ -9477,55 +9222,56 @@ "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/translation", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "d1fdeefd0707d15eb150c04e8837bf0b15ebea39" + "reference": "7ef27c65d78886f7599fdd5c93d12c9243ecf44d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/d1fdeefd0707d15eb150c04e8837bf0b15ebea39", - "reference": "d1fdeefd0707d15eb150c04e8837bf0b15ebea39", + "url": "https://api.github.com/repos/symfony/translation/zipball/7ef27c65d78886f7599fdd5c93d12c9243ecf44d", + "reference": "7ef27c65d78886f7599fdd5c93d12c9243ecf44d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" + "symfony/translation-contracts": "^2.5.3|^3.3" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", + "symfony/http-kernel": "<6.4", "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -9556,7 +9302,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.30" + "source": "https://github.com/symfony/translation/tree/v7.4.3" }, "funding": [ { @@ -9576,7 +9322,7 @@ "type": "tidelift" } ], - "time": "2025-11-24T13:57:00+00:00" + "time": "2025-12-29T09:31:36+00:00" }, { "name": "symfony/translation-contracts", @@ -9662,68 +9408,70 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.30", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d77a78c7fffaf7cb0158d28db824ba78d89a9f34" + "reference": "43c922fce020060c65b0fd54bfd8def3b38949b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d77a78c7fffaf7cb0158d28db824ba78d89a9f34", - "reference": "d77a78c7fffaf7cb0158d28db824ba78d89a9f34", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/43c922fce020060c65b0fd54bfd8def3b38949b6", + "reference": "43c922fce020060c65b0fd54bfd8def3b38949b6", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^2.13|^3.0.4" + "twig/twig": "^3.21" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<5.4", + "symfony/console": "<6.4", "symfony/form": "<6.4", - "symfony/http-foundation": "<5.4", + "symfony/http-foundation": "<6.4", "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.2", + "symfony/mime": "<6.4", "symfony/serializer": "<6.4", - "symfony/translation": "<5.4", - "symfony/workflow": "<5.4" + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/asset-mapper": "^6.3|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/form": "^6.4.30|~7.3.8|^7.4.1", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4.30|~7.3.8|^7.4.1|^8.0.1", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.3|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.1|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/security-http": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/workflow": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -9751,7 +9499,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.30" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.3" }, "funding": [ { @@ -9771,47 +9519,49 @@ "type": "tidelift" } ], - "time": "2025-12-05T13:01:31+00:00" + "time": "2025-12-16T08:02:06+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.4.24", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba" + "reference": "9e1f5fd2668ed26c60d17d63f15fe270ed8da5e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/3b48b6e8225495c6d2438828982b4d219ca565ba", - "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/9e1f5fd2668ed26c60d17d63f15fe270ed8da5e6", + "reference": "9e1f5fd2668ed26c60d17d63f15fe270ed8da5e6", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", - "php": ">=8.1", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/twig-bridge": "^6.4", - "twig/twig": "^2.13|^3.0.4" + "php": ">=8.2", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/twig-bridge": "^7.3|^8.0", + "twig/twig": "^3.12" }, "conflict": { - "symfony/framework-bundle": "<5.4", - "symfony/translation": "<5.4" + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" }, "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -9839,7 +9589,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v6.4.24" + "source": "https://github.com/symfony/twig-bundle/tree/v7.4.3" }, "funding": [ { @@ -9859,24 +9609,107 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-12-19T10:00:43+00:00" }, { - "name": "symfony/validator", - "version": "v6.4.30", + "name": "symfony/type-info", + "version": "v7.4.1", "source": { "type": "git", - "url": "https://github.com/symfony/validator.git", - "reference": "572dcc789ddf53174c61551aa5a3ec58d6a48b9b" + "url": "https://github.com/symfony/type-info.git", + "reference": "ac5ab66b21c758df71b7210cf1033d1ac807f202" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/572dcc789ddf53174c61551aa5a3ec58d6a48b9b", - "reference": "572dcc789ddf53174c61551aa5a3ec58d6a48b9b", + "url": "https://api.github.com/repos/symfony/type-info/zipball/ac5ab66b21c758df71b7210cf1033d1ac807f202", + "reference": "ac5ab66b21c758df71b7210cf1033d1ac807f202", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-05T14:04:53+00:00" + }, + { + "name": "symfony/validator", + "version": "v7.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "9670bedf4c454b21d1e04606b6c227990da8bebe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/9670bedf4c454b21d1e04606b6c227990da8bebe", + "reference": "9670bedf4c454b21d1e04606b6c227990da8bebe", + "shasum": "" + }, + "require": { + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", @@ -9884,34 +9717,37 @@ "symfony/translation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "symfony/dependency-injection": "<5.4", - "symfony/expression-language": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/intl": "<5.4", - "symfony/property-info": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/yaml": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/var-exporter": "<6.4.25|>=7.0,<7.3.3", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.13|^2", "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4.3|^7.0.3|^8.0", + "symfony/type-info": "^7.1.8", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -9940,7 +9776,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.30" + "source": "https://github.com/symfony/validator/tree/v7.4.3" }, "funding": [ { @@ -9960,37 +9796,36 @@ "type": "tidelift" } ], - "time": "2025-12-05T09:41:49+00:00" + "time": "2025-12-27T17:05:22+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.26", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a" + "reference": "7e99bebcb3f90d8721890f2963463280848cba92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfae1497a2f1eaad78dbc0590311c599c7178d4a", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7e99bebcb3f90d8721890f2963463280848cba92", + "reference": "7e99bebcb3f90d8721890f2963463280848cba92", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -10028,7 +9863,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.26" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.3" }, "funding": [ { @@ -10048,30 +9883,30 @@ "type": "tidelift" } ], - "time": "2025-09-25T15:37:27+00:00" + "time": "2025-12-18T07:04:31+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.26", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -10109,7 +9944,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" }, "funding": [ { @@ -10129,7 +9964,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2025-09-11T10:15:23+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -10209,28 +10044,28 @@ }, { "name": "symfony/yaml", - "version": "v6.4.30", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -10261,7 +10096,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.30" + "source": "https://github.com/symfony/yaml/tree/v7.4.1" }, "funding": [ { @@ -10281,7 +10116,7 @@ "type": "tidelift" } ], - "time": "2025-12-02T11:50:18+00:00" + "time": "2025-12-04T18:11:45+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10763,23 +10598,23 @@ }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/1b34b004e35a164bc5bb6ebd33c844b2d8069a54", + "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -10789,7 +10624,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -10805,6 +10640,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -10815,9 +10654,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.0.0" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2025-12-16T21:36:00+00:00" }, { "name": "willdurand/jsonp-callback-validator", @@ -14093,27 +13932,28 @@ }, { "name": "symfony/browser-kit", - "version": "v6.4.28", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "067e301786bbb58048077fc10507aceb18226e23" + "reference": "d5b5c731005f224fbc25289587a8538e4f62c762" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/067e301786bbb58048077fc10507aceb18226e23", - "reference": "067e301786bbb58048077fc10507aceb18226e23", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/d5b5c731005f224fbc25289587a8538e4f62c762", + "reference": "d5b5c731005f224fbc25289587a8538e4f62c762", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/dom-crawler": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/dom-crawler": "^6.4|^7.0|^8.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -14141,7 +13981,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.28" + "source": "https://github.com/symfony/browser-kit/tree/v7.4.3" }, "funding": [ { @@ -14161,37 +14001,34 @@ "type": "tidelift" } ], - "time": "2025-10-16T22:35:35+00:00" + "time": "2025-12-16T08:02:06+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.4.27", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "21a61c55192d558a6b81cdb12e8c010fc9474fe0" + "reference": "329383fb895353e3c8ab792cc35c4a7e7b17881b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/21a61c55192d558a6b81cdb12e8c010fc9474fe0", - "reference": "21a61c55192d558a6b81cdb12e8c010fc9474fe0", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/329383fb895353e3c8ab792cc35c4a7e7b17881b", + "reference": "329383fb895353e3c8ab792cc35c4a7e7b17881b", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/config": "<5.4", - "symfony/dependency-injection": "<5.4" + "php": ">=8.2", + "symfony/config": "^7.3|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "require-dev": { - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" + "symfony/web-profiler-bundle": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -14219,7 +14056,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.4.27" + "source": "https://github.com/symfony/debug-bundle/tree/v7.4.0" }, "funding": [ { @@ -14239,30 +14076,31 @@ "type": "tidelift" } ], - "time": "2025-10-11T17:35:31+00:00" + "time": "2025-10-24T13:56:35+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.25", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "976302990f9f2a6d4c07206836dd4ca77cae9524" + "reference": "0c5e8f20c74c78172a8ee72b125909b505033597" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/976302990f9f2a6d4c07206836dd4ca77cae9524", - "reference": "976302990f9f2a6d4c07206836dd4ca77cae9524", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0c5e8f20c74c78172a8ee72b125909b505033597", + "reference": "0c5e8f20c74c78172a8ee72b125909b505033597", "shasum": "" }, "require": { "masterminds/html5": "^2.6", - "php": ">=8.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0" + "symfony/css-selector": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -14290,7 +14128,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.25" + "source": "https://github.com/symfony/dom-crawler/tree/v7.4.1" }, "funding": [ { @@ -14310,32 +14148,28 @@ "type": "tidelift" } ], - "time": "2025-08-05T18:56:08+00:00" + "time": "2025-12-06T15:47:47+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.26", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f" + "reference": "f933e68bb9df29d08077a37e1515a23fea8562ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/406aa80401bf960e7a173a3ccf268ae82b6bc93f", - "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f933e68bb9df29d08077a37e1515a23fea8562ab", + "reference": "f933e68bb9df29d08077a37e1515a23fea8562ab", "shasum": "" }, "require": { - "php": ">=7.1.3" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "php": ">=8.1.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/polyfill-php81": "^1.27" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4.3|^7.0.3|^8.0" }, "bin": [ "bin/simple-phpunit" @@ -14379,7 +14213,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.26" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.4.3" }, "funding": [ { @@ -14399,42 +14233,46 @@ "type": "tidelift" } ], - "time": "2025-09-12T08:37:02+00:00" + "time": "2025-12-09T15:33:45+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.27", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "4c2ab411372e8bd854678cd7c81f1a9bfd6914aa" + "reference": "5220b59d06f6554658a0dc4d6bd4497a789e51dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4c2ab411372e8bd854678cd7c81f1a9bfd6914aa", - "reference": "4c2ab411372e8bd854678cd7c81f1a9bfd6914aa", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/5220b59d06f6554658a0dc4d6bd4497a789e51dd", + "reference": "5220b59d06f6554658a0dc4d6bd4497a789e51dd", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0", - "twig/twig": "^2.13|^3.0.4" + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^7.3|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "twig/twig": "^3.15" }, "conflict": { - "symfony/form": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/twig-bundle": ">=7.0" + "symfony/form": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "require-dev": { - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -14465,7 +14303,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.27" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.3" }, "funding": [ { @@ -14485,7 +14323,7 @@ "type": "tidelift" } ], - "time": "2025-10-05T13:55:43+00:00" + "time": "2025-12-27T17:05:22+00:00" }, { "name": "theseer/tokenizer", @@ -14540,11 +14378,13 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": { + "friendsofsymfony/rest-bundle": 10 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "8.1.*||8.2.*||8.3.*||8.4.*||8.5.*", + "php": "8.4.*||8.5.*", "ext-gd": "*", "ext-intl": "*", "ext-json": "*", @@ -14560,7 +14400,7 @@ "ext-simplexml": "*" }, "platform-overrides": { - "php": "8.1.3" + "php": "8.4.4" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/config/bundles.php b/config/bundles.php index 6b8d787c1..175893d5c 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -9,7 +9,7 @@ return [ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], - Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true], DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true], JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], FOS\RestBundle\FOSRestBundle::class => ['all' => true], diff --git a/config/locales.php b/config/locales.php index 024797a25..764a8a3e9 100644 --- a/config/locales.php +++ b/config/locales.php @@ -3,2030 +3,1740 @@ [ 'date' => 'd‏/M‏/y', 'time' => 'h:mm a', - 'rtl' => true, 'translation' => true, ], 'bg' => [ 'date' => 'd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'cs' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'cs_CZ' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'da' => [ 'date' => 'dd.MM.y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => true, ], 'da_DK' => [ 'date' => 'dd.MM.y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => false, ], 'da_GL' => [ 'date' => 'dd.MM.y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => false, ], 'de' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'de_AT' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'de_BE' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'de_CH' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'de_DE' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'de_IT' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'de_LI' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'de_LU' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'el' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => true, ], 'el_CY' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'el_GR' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => true, ], 'en_AE' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_AG' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_AI' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_AS' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_AT' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_AU' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_BB' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_BE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_BI' => [ 'date' => 'M/d/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_BM' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_BS' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_BW' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_BZ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_CA' => [ 'date' => 'y-MM-dd', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_CC' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_CH' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_CK' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_CM' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_CX' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_CY' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_CZ' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_DE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_DK' => [ 'date' => 'dd/MM/y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => false, ], 'en_DM' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_ER' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_ES' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_FI' => [ 'date' => 'dd/MM/y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => false, ], 'en_FJ' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_FK' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_FM' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_FR' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_GB' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_GD' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_GG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_GH' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_GI' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_GM' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_GS' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_GU' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_GY' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_HK' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_HU' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_ID' => [ 'date' => 'dd/MM/y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => false, ], 'en_IE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_IL' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_IM' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_IN' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_IO' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_IT' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_JE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_JM' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_KE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_KI' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_KN' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_KY' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_LC' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_LR' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_LS' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_MG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_MH' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_MO' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_MP' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_MS' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_MT' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_MU' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_MV' => [ 'date' => 'd-M-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_MW' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_MY' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_NA' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_NF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_NG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_NL' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_NO' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_NR' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_NU' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_NZ' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_PG' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_PH' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_PK' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_PL' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_PN' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_PR' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_PT' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_PW' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_RO' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_RW' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SB' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_SC' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SD' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_SE' => [ 'date' => 'y-MM-dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SG' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_SH' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SI' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SK' => [ - 'date' => 'M/d/y', + 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SL' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_SS' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_SX' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_SZ' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_TC' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_TK' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_TO' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_TT' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_TV' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_TZ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_UG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_UM' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_US' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_VC' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_VG' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_VI' => [ 'date' => 'M/d/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_VU' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_WS' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_ZA' => [ 'date' => 'y/MM/dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'en_ZM' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'en_ZW' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'eo' => [ 'date' => 'y-MM-dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'es' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'es_AR' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_BO' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_BR' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'es_BZ' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'es_CL' => [ 'date' => 'dd-MM-y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_CO' => [ 'date' => 'd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_CR' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_CU' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_DO' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_EC' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_ES' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'es_GQ' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'es_GT' => [ 'date' => 'd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_HN' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_MX' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_NI' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_PA' => [ 'date' => 'MM/dd/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_PE' => [ 'date' => 'd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_PH' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_PR' => [ 'date' => 'MM/dd/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_PY' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_SV' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_US' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_UY' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'es_VE' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'eu' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'eu_ES' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fa' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => true, 'translation' => true, ], 'fa_AF' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => true, 'translation' => false, ], 'fa_IR' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => true, 'translation' => false, ], 'fi' => [ 'date' => 'd.M.y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => true, ], 'fi_FI' => [ 'date' => 'd.M.y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => false, ], 'fo' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'fo_DK' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fo_FO' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'fr_BE' => [ 'date' => 'd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_BF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_BI' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_BJ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_BL' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_CA' => [ 'date' => 'y-MM-dd', 'time' => 'HH \'h\' mm', - 'rtl' => false, 'translation' => false, ], 'fr_CD' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_CF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_CG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_CH' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_CI' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_CM' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_DJ' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_DZ' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_FR' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_GA' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_GF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_GN' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_GP' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_GQ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_HT' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_KM' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_LU' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_MA' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_MC' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_MF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_MG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_ML' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_MQ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_MR' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_MU' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_NC' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_NE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_PF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_PM' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_RE' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_RW' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_SC' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_SN' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_SY' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_TD' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_TG' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_TN' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_VU' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'fr_WF' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'fr_YT' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'he' => [ 'date' => 'd.M.y', 'time' => 'HH:mm', - 'rtl' => true, 'translation' => true, ], 'he_IL' => [ 'date' => 'd.M.y', 'time' => 'HH:mm', - 'rtl' => true, 'translation' => false, ], 'hr' => [ 'date' => 'dd. MM. y.', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'hr_BA' => [ 'date' => 'd. M. y.', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'hr_HR' => [ 'date' => 'dd. MM. y.', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'hu' => [ 'date' => 'y. MM. dd.', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'hu_HU' => [ 'date' => 'y. MM. dd.', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'id' => [ 'date' => 'dd/MM/y', 'time' => 'HH.mm', - 'rtl' => false, 'translation' => true, ], 'it' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'it_CH' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'it_IT' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'it_SM' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'it_VA' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ja' => [ 'date' => 'y/MM/dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'ja_JP' => [ 'date' => 'y/MM/dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ko' => [ 'date' => 'y. M. d.', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => true, ], 'ko_CN' => [ 'date' => 'y. M. d.', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ko_KP' => [ 'date' => 'y. M. d.', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'ko_KR' => [ 'date' => 'y. M. d.', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'nb_NO' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'nl' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'nl_AW' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'nl_BE' => [ 'date' => 'd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'nl_BQ' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'nl_CW' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'nl_NL' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'nl_SR' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'nl_SX' => [ 'date' => 'dd-MM-y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pa' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => true, ], 'pl' => [ 'date' => 'd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'pl_PL' => [ 'date' => 'd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'pt_AO' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_BR' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'pt_CH' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_CV' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_GQ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_GW' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_LU' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_MO' => [ 'date' => 'dd/MM/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'pt_MZ' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_PT' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_ST' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'pt_TL' => [ 'date' => 'dd/MM/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ro' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'ro_MD' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ro_RO' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ru' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'ru_BY' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ru_KG' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ru_KZ' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ru_MD' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ru_RU' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ru_UA' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'sk' => [ 'date' => 'd. M. y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'sk_SK' => [ 'date' => 'd. M. y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'sl' => [ 'date' => 'd. M. y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'sv' => [ 'date' => 'y-MM-dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'sv_AX' => [ 'date' => 'y-MM-dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'sv_FI' => [ 'date' => 'y-MM-dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'sv_SE' => [ 'date' => 'y-MM-dd', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'ta' => [ 'date' => 'd/M/y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => true, ], 'tr' => [ 'date' => 'd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'tr_CY' => [ 'date' => 'd.MM.y', 'time' => 'h:mm a', - 'rtl' => false, 'translation' => false, ], 'tr_TR' => [ 'date' => 'd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'uk' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'uk_UA' => [ 'date' => 'dd.MM.y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'vi' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'vi_VN' => [ 'date' => 'd/M/y', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => false, ], 'zh_CN' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'zh_Hant' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], 'zh_Hant_TW' => [ 'date' => 'y/M/d', 'time' => 'HH:mm', - 'rtl' => false, 'translation' => true, ], ]; \ No newline at end of file diff --git a/config/packages/assets.yaml b/config/packages/assets.yaml deleted file mode 100644 index 98263b8ab..000000000 --- a/config/packages/assets.yaml +++ /dev/null @@ -1,6 +0,0 @@ -framework: - assets: - json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' - packages: - avatars: - base_path: 'avatars' diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml deleted file mode 100644 index 8fd915824..000000000 --- a/config/packages/cache.yaml +++ /dev/null @@ -1,17 +0,0 @@ -framework: - cache: - #app: cache.adapter.redis - #default_redis_provider: redis://127.0.0.1:6379 - - #app: cache.adapter.memcached - #default_memcached_provider: 'memcached://localhost' - - # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) - #app: cache.adapter.apcu - - pools: - doctrine.result_cache_pool: - adapter: cache.app - - doctrine.system_cache_pool: - adapter: cache.system diff --git a/config/packages/dama_doctrine_test_bundle.yaml b/config/packages/dama_doctrine_test_bundle.yaml new file mode 100644 index 000000000..3482cbae1 --- /dev/null +++ b/config/packages/dama_doctrine_test_bundle.yaml @@ -0,0 +1,5 @@ +when@test: + dama_doctrine_test: + enable_static_connection: true + enable_static_meta_data_cache: true + enable_static_query_cache: true diff --git a/config/packages/debug.yaml b/config/packages/debug.yaml new file mode 100644 index 000000000..ad874afdd --- /dev/null +++ b/config/packages/debug.yaml @@ -0,0 +1,5 @@ +when@dev: + debug: + # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. + # See the "server:dump" command to start a new server. + dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 6fd3b3f18..31a75ed44 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -10,29 +10,31 @@ doctrine: default_connection: default connections: default: + profiling_collect_backtrace: '%kernel.debug%' + use_savepoints: true # existing migrations will fail if the schema filter is activated #schema_filter: ~^(?!(bundle_migration_|kimai2_sessions))~ - url: '%env(DATABASE_URL)%' + url: '%env(resolve:DATABASE_URL)%' driver: 'pdo_mysql' charset: utf8mb4 default_table_options: charset: utf8mb4 collation: utf8mb4_unicode_ci schema_manager_factory: doctrine.dbal.default_schema_manager_factory - types: datetime: App\Doctrine\UTCDateTimeType datetime_immutable: App\Doctrine\UTCDateTimeImmutableType orm: controller_resolver: - # FIXME this is causing a deprecation and needs to be changed - # auto_mapping: false - auto_mapping: true - auto_generate_proxy_classes: '%kernel.debug%' + auto_mapping: false + auto_generate_proxy_classes: true default_entity_manager: default - enable_lazy_ghost_objects: true + enable_native_lazy_objects: true entity_managers: default: + identity_generation_preferences: + Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity + validate_xml_mapping: true report_fields_where_declared: true connection: default naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware @@ -56,17 +58,23 @@ when@test: connections: default: logging: false - use_savepoints: true when@prod: doctrine: orm: - metadata_cache_driver: - type: pool - pool: doctrine.system_cache_pool + auto_generate_proxy_classes: false + proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies' query_cache_driver: type: pool pool: doctrine.system_cache_pool result_cache_driver: type: pool pool: doctrine.result_cache_pool + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml index 99ee9ca3c..05ff6ba1b 100644 --- a/config/packages/doctrine_migrations.yaml +++ b/config/packages/doctrine_migrations.yaml @@ -1,8 +1,11 @@ doctrine_migrations: + migrations_paths: + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + 'DoctrineMigrations': '%kernel.project_dir%/migrations' + enable_profiler: false transactional: false storage: table_storage: table_name: 'migration_versions' - migrations_paths: - 'DoctrineMigrations': '%kernel.project_dir%/migrations' - custom_template: '%kernel.project_dir%/migrations/MigrationTemplate.txt' \ No newline at end of file + custom_template: '%kernel.project_dir%/migrations/MigrationTemplate.txt' diff --git a/config/packages/fos_rest.yaml b/config/packages/fos_rest.yaml index f65e4f35e..47cbdf20b 100644 --- a/config/packages/fos_rest.yaml +++ b/config/packages/fos_rest.yaml @@ -1,3 +1,4 @@ +# Read the documentation: https://fosrestbundle.readthedocs.io/en/3.x/ fos_rest: param_fetcher_listener: enabled: true diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index b798664ef..f6618d212 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -37,6 +37,9 @@ framework: php_errors: log: true + property_info: + with_constructor_extractor: true + mailer: dsn: '%env(MAILER_URL)%' diff --git a/config/packages/jms_serializer.yaml b/config/packages/jms_serializer.yaml index d12d2c37d..abc01faac 100644 --- a/config/packages/jms_serializer.yaml +++ b/config/packages/jms_serializer.yaml @@ -3,10 +3,6 @@ jms_serializer: datetime: default_format: 'Y-m-d\TH:i:sO' # DATE_ISO8601 visitors: - json_serialization: - options: - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION xml_serialization: format_output: '%kernel.debug%' metadata: @@ -18,3 +14,20 @@ jms_serializer: excluded: [] property_naming: id: 'jms_serializer.identical_property_naming_strategy' + +when@prod: + jms_serializer: + visitors: + json_serialization: + options: + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION + +when@dev: + jms_serializer: + visitors: + json_serialization: + options: + - JSON_PRETTY_PRINT + - JSON_UNESCAPED_SLASHES + - JSON_PRESERVE_ZERO_FRACTION diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index e55a948dd..0d54bb050 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -1,5 +1,50 @@ monolog: - channels: ["deprecation"] + channels: + - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists + +when@dev: + monolog: + handlers: + main: + type: fingers_crossed + action_level: notice + handler: file_log + excluded_http_codes: + - {400: ['^/api/']} + - {401: ['^/api/']} + - 403 + - 404 + - 405 + channels: ["!event", "!deprecation"] + file_log: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + formatter: monolog.formatter.kimai + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!deprecation"] + deprecation: + type: stream + channels: ["deprecation"] + path: "%kernel.logs_dir%/deprecations.log" + formatter: monolog.formatter.deprecation + +when@test: + monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + formatter: monolog.formatter.kimai when@prod: monolog: @@ -24,42 +69,3 @@ when@prod: type: console process_psr_3_messages: false channels: ["!event", "!doctrine", "!deprecation"] - -when@dev: - monolog: - handlers: - main: - type: fingers_crossed - action_level: notice - handler: file_log - excluded_http_codes: - - {400: ['^/api/']} - - {401: ['^/api/']} - - 403 - - 404 - - {405: ['/homepage$', '/login_check$', '/export/data$']} - channels: ["!event", "!deprecation"] - file_log: - type: stream - path: "%kernel.logs_dir%/%kernel.environment%.log" - level: debug - formatter: monolog.formatter.kimai - console: - type: console - process_psr_3_messages: false - channels: ["!event", "!doctrine", "!deprecation"] - deprecation: - type: stream - channels: ["deprecation"] - path: "%kernel.logs_dir%/deprecations.log" - formatter: monolog.formatter.deprecation - -when@test: - monolog: - handlers: - main: - type: stream - path: "%kernel.logs_dir%/%kernel.environment%.log" - level: info - channels: ["!event"] - formatter: monolog.formatter.kimai diff --git a/config/packages/nelmio_cors.yaml b/config/packages/nelmio_cors.yaml index d0cd7640d..c859f3d9a 100644 --- a/config/packages/nelmio_cors.yaml +++ b/config/packages/nelmio_cors.yaml @@ -17,7 +17,7 @@ nelmio_cors: '^/api/': # allow_origin: ['%env(CORS_ALLOW_ORIGIN)%'] allow_origin: ['*'] - allow_headers: ['Content-Type', 'Authorization', 'X-AUTH-USER', 'X-AUTH-TOKEN'] + allow_headers: ['Content-Type', 'Authorization'] allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE'] # expose_headers: ['Link'] max_age: 3600 diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml index c45d1af92..d0d34c039 100644 --- a/config/packages/routing.yaml +++ b/config/packages/routing.yaml @@ -1,3 +1,6 @@ +parameters: + env(default_uri): 'http://localhost' + framework: router: utf8: true @@ -5,7 +8,7 @@ framework: # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands - #default_uri: http://localhost + default_uri: '%env(DEFAULT_URI)%' when@test: framework: diff --git a/config/packages/security.yaml b/config/packages/security.yaml index dd3f10efc..d9b03fc11 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -1,7 +1,8 @@ security: + # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords password_hashers: App\Entity\User: auto - + # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider providers: chain_provider: chain: @@ -11,12 +12,11 @@ security: class: App\Entity\User kimai_ldap: id: App\Ldap\LdapUserProvider - firewalls: dev: + # Ensure dev tools and static assets are always allowed pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false - api: access_token: token_handler: App\API\Authentication\AccessTokenHandler @@ -27,66 +27,52 @@ security: stateless: true remember_me: false provider: chain_provider - custom_authenticators: - - App\API\Authentication\TokenAuthenticator - secured_area: kimai_ldap: ~ pattern: ^/ user_checker: App\Security\UserChecker stateless: false - entry_point: form_login - custom_authenticators: - App\Saml\SamlAuthenticator - remember_me: name: KIMAI_REMEMBER secret: '%kernel.secret%' lifetime: 604800 path: / always_remember_me: true - # activate all configured user provider provider: chain_provider - form_login: check_path: security_check login_path: login enable_csrf: true - two_factor: auth_form_path: 2fa_login check_path: 2fa_login_check remember_me_sets_trusted: true - logout: path: logout target: homepage enable_csrf: false - login_throttling: max_attempts: 5 interval: '5 minutes' - login_link: check_route: link_login_check signature_properties: ['id'] lifetime: 900 max_uses: 3 - access_decision_manager: # only grants access if there is no voter denying access strategy: unanimous allow_if_all_abstain: false - role_hierarchy: ROLE_USER: ~ ROLE_TEAMLEAD: ROLE_USER ROLE_ADMIN: ROLE_TEAMLEAD ROLE_SUPER_ADMIN: ROLE_ADMIN - + # Note: Only the *first* matching rule is applied access_control: - {path: '^/auth/2fa', role: IS_AUTHENTICATED_2FA_IN_PROGRESS} - {path: '^/auth', roles: PUBLIC_ACCESS} @@ -99,13 +85,12 @@ security: - {path: '^/api', roles: IS_AUTHENTICATED} when@test: - # this configuration simplifies testing URLs protected by the security mechanism - # See https://symfony.com/doc/current/cookbook/testing/http_authentication.html security: password_hashers: + # Password hashers are resource-intensive by design to ensure security. + # In tests, it's safe to reduce their cost to improve performance. App\Entity\User: algorithm: auto - # see https://github.com/symfony/recipes/pull/1026 - cost: 4 # Lowest possible value for bcrypt - time_cost: 3 # Lowest possible value for argon - memory_cost: 10 # Lowest possible value for argon + cost: 4 # Lowest possible value for bcrypt + time_cost: 3 # Lowest possible value for argon + memory_cost: 10 # Lowest possible value for argon diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 90a442037..72961c8e1 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -1,9 +1,11 @@ twig: - debug: '%kernel.debug%' - strict_variables: '%kernel.debug%' + file_name_pattern: '*.twig' form_themes: - 'form/vertical.html.twig' - exception_controller: null paths: '%kernel.project_dir%/templates/bundles/TablerBundle': theme '%kernel.project_dir%/vendor/kevinpapst/tabler-bundle/templates': theme + +when@test: + twig: + strict_variables: true diff --git a/config/packages/web_profiler.yaml b/config/packages/web_profiler.yaml index 17893da18..0eac3c989 100644 --- a/config/packages/web_profiler.yaml +++ b/config/packages/web_profiler.yaml @@ -1,15 +1,13 @@ when@dev: web_profiler: toolbar: true - intercept_redirects: false framework: - profiler: { only_exceptions: false } + profiler: + collect_serializer_data: true when@test: - web_profiler: - toolbar: false - intercept_redirects: false - framework: - profiler: { collect: false } + profiler: + collect: false + collect_serializer_data: true diff --git a/config/packages/webpack_encore.yaml b/config/packages/webpack_encore.yaml index 3062278c6..cc50b572d 100644 --- a/config/packages/webpack_encore.yaml +++ b/config/packages/webpack_encore.yaml @@ -1,17 +1,45 @@ webpack_encore: - # The path where Encore is building the assets. - # This should match Encore.setOutputPath() in webpack.config.js. + # The path where Encore is building the assets - i.e. Encore.setOutputPath() output_path: '%kernel.project_dir%/public/build' # If multiple builds are defined (as shown below), you can disable the default build: # output_path: false - # if using Encore.enableIntegrityHashes() specify the crossorigin attribute value (default: false, or use 'anonymous' or 'use-credentials') - # crossorigin: 'anonymous' - - # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) - # Available in version 1.2 - cache: '%kernel.debug%' + # Set attributes that will be rendered on all script and link tags + script_attributes: + defer: true + # Uncomment (also under link_attributes) if using Turbo Drive + # https://turbo.hotwired.dev/handbook/drive#reloading-when-assets-change + # 'data-turbo-track': reload + # link_attributes: + # Uncomment if using Turbo Drive + # 'data-turbo-track': reload -when@dev: + # If using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials') + # crossorigin: 'anonymous' + + # Preload all rendered script and link tags automatically via the HTTP/2 Link header + # preload: true + + # Throw an exception if the entrypoints.json file is missing or an entry is missing from the data + # strict_mode: false + + # If you have multiple builds: + # builds: + # frontend: '%kernel.project_dir%/public/frontend/build' + + # pass the build name as the 3rd argument to the Twig functions + # {{ encore_entry_script_tags('entry1', null, 'frontend') }} + +framework: + assets: + json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' + +when@prod: webpack_encore: - cache: false + # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) + # Available in version 1.2 + cache: true + +#when@test: +# webpack_encore: +# strict_mode: false diff --git a/config/routes.yaml b/config/routes.yaml index 51e42a569..dc42456ae 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,4 +1,14 @@ +# yaml-language-server: $schema=../vendor/symfony/routing/Loader/schema/routing.schema.json + +# This file is the entry point to configure the routes of your app. +# Methods with the #[Route] attribute are automatically imported. +# See also https://symfony.com/doc/current/routing.html + +# To list all registered routes, run the following command: +# bin/console debug:router + controllers: +# resource: routing.controllers resource: ../src/Controller/ type: attribute prefix: /{_locale} @@ -8,7 +18,8 @@ controllers: api.swagger_ui: path: /api/doc methods: GET - defaults: { _controller: nelmio_api_doc.controller.stoplight } + defaults: + _controller: nelmio_api_doc.controller.stoplight api: resource: ../src/API/ diff --git a/config/routes/dev/twig.yaml b/config/routes/dev/twig.yaml deleted file mode 100644 index 104f99d00..000000000 --- a/config/routes/dev/twig.yaml +++ /dev/null @@ -1,5 +0,0 @@ -_errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' - prefix: /{_locale}/_error - defaults: - _locale: '%locale%' diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml deleted file mode 100644 index c82beff2f..000000000 --- a/config/routes/dev/web_profiler.yaml +++ /dev/null @@ -1,7 +0,0 @@ -web_profiler_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' - prefix: /_wdt - -web_profiler_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' - prefix: /_profiler diff --git a/config/routes/framework.yaml b/config/routes/framework.yaml new file mode 100644 index 000000000..dc0c8d442 --- /dev/null +++ b/config/routes/framework.yaml @@ -0,0 +1,6 @@ +when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.php' + prefix: /{_locale}/_error + defaults: + _locale: '%locale%' diff --git a/config/routes/security.yaml b/config/routes/security.yaml new file mode 100644 index 000000000..f853be15c --- /dev/null +++ b/config/routes/security.yaml @@ -0,0 +1,3 @@ +_security_logout: + resource: security.route_loader.logout + type: service diff --git a/config/routes/web_profiler.yaml b/config/routes/web_profiler.yaml new file mode 100644 index 000000000..b3b7b4b0e --- /dev/null +++ b/config/routes/web_profiler.yaml @@ -0,0 +1,8 @@ +when@dev: + web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.php' + prefix: /_wdt + + web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.php' + prefix: /_profiler diff --git a/config/services.yaml b/config/services.yaml index 57b64d43b..d6876bfbf 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -1,3 +1,11 @@ +# yaml-language-server: $schema=../vendor/symfony/dependency-injection/Loader/schema/services.schema.json + +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. +# See also https://symfony.com/doc/current/service_container/import.html + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: locale: en # can be regenerated with: bin/console kimai:reset:locales @@ -6,8 +14,8 @@ parameters: services: # default configuration for services in *this* file _defaults: - autowire: true - autoconfigure: true + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. public: false bind: $projectDirectory: '%kernel.project_dir%' @@ -16,7 +24,7 @@ services: # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name App\: - resource: '../src/*' + resource: '../src/' exclude: - '../src/API/Model/' - '../src/DependencyInjection/' @@ -35,6 +43,9 @@ services: - '../src/Kernel.php' - '../src/Constants.php' + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class App\Controller\: @@ -227,3 +238,9 @@ services: App\API\ViewHandler: arguments: ['@fos_rest.view_handler.default'] + + App\Validator\Constraints\TimesheetAllValidator: + arguments: ['%kimai.validator_timesheet%'] + + App\Validator\Constraints\QuickEntryTimesheetValidator: + arguments: ['%kimai.validator_timesheet%'] diff --git a/config/services_test.yaml b/config/services_test.yaml deleted file mode 100644 index 1c181ac12..000000000 --- a/config/services_test.yaml +++ /dev/null @@ -1,25 +0,0 @@ -parameters: - locale: en - kimai_locales: ['ar', 'cs', 'de', 'de_CH', 'da', 'en', 'eo', 'es', 'eu', 'fr', 'he', 'hu', 'it', 'ja', 'ko', 'nl', 'pl', 'pt_BR', 'ro', 'ru', 'sk', 'sv', 'tr', 'vi', 'zh_CN'] - -services: - _defaults: - public: true - - App\Configuration\SystemConfiguration: - arguments: ['@App\Configuration\ConfigurationService', "%kimai.config%"] - - # required for the importer command test - App\Repository\UserRepository: - class: Doctrine\ORM\EntityRepository - factory: ['@doctrine.orm.entity_manager', getRepository] - arguments: ['App\Entity\User'] - - # required for the importer command test - App\Importer\ImporterService: - public: true - arguments: ['@App\Customer\CustomerService', '@App\Project\ProjectService'] - - App\User\UserService: - public: true - arguments: ['@App\Repository\UserRepository', '@event_dispatcher', '@validator', '@App\Configuration\SystemConfiguration', '@security.user_password_hasher'] diff --git a/migrations/.gitignore b/migrations/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/migrations/Version20190510205245.php b/migrations/Version20190510205245.php index c06a78d61..fd6e163fb 100644 --- a/migrations/Version20190510205245.php +++ b/migrations/Version20190510205245.php @@ -28,13 +28,13 @@ class Version20190510205245 extends AbstractMigration $timesheetTags->addColumn('tag_id', 'integer', ['length' => 11, 'notnull' => true]); $timesheetTags->addIndex(['timesheet_id'], 'IDX_E3284EFEABDD46BE'); $timesheetTags->addIndex(['tag_id'], 'IDX_E3284EFEBAD26311'); - $timesheetTags->setPrimaryKey(['timesheet_id', 'tag_id']); + $this->addPrimaryKeyConstraint($timesheetTags, ['timesheet_id', 'tag_id']); $tags = $schema->createTable('kimai2_tags'); $tags->addColumn('id', 'integer', ['length' => 11, 'autoincrement' => true, 'notnull' => true]); $tags->addColumn('name', 'string', ['length' => 100, 'notnull' => true]); $tags->addUniqueIndex(['name'], 'UNIQ_27CAF54C5E237E06'); - $tags->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($tags, ['id']); } public function down(Schema $schema): void diff --git a/migrations/Version20190617100845.php b/migrations/Version20190617100845.php index 5349e6d49..f7a3162a1 100644 --- a/migrations/Version20190617100845.php +++ b/migrations/Version20190617100845.php @@ -34,7 +34,7 @@ final class Version20190617100845 extends AbstractMigration $timesheetMeta->addColumn('name', 'string', ['notnull' => true, 'length' => 50]); $timesheetMeta->addColumn('value', 'string', ['notnull' => false, 'length' => 255]); $timesheetMeta->addColumn('visible', 'boolean', ['notnull' => false, 'default' => false]); - $timesheetMeta->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($timesheetMeta, ['id']); $timesheetMeta->addIndex(['timesheet_id'], 'IDX_CB606CBAABDD46BE'); $timesheetMeta->addUniqueIndex(['timesheet_id', 'name'], 'UNIQ_CB606CBAABDD46BE5E237E06'); $timesheetMeta->addForeignKeyConstraint('kimai2_timesheet', ['timesheet_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_CB606CBAABDD46BE'); @@ -45,7 +45,7 @@ final class Version20190617100845 extends AbstractMigration $customerMeta->addColumn('name', 'string', ['notnull' => true, 'length' => 50]); $customerMeta->addColumn('value', 'string', ['notnull' => false, 'length' => 255]); $customerMeta->addColumn('visible', 'boolean', ['notnull' => false, 'default' => false]); - $customerMeta->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($customerMeta, ['id']); $customerMeta->addIndex(['customer_id'], 'IDX_A48A760F9395C3F3'); $customerMeta->addUniqueIndex(['customer_id', 'name'], 'UNIQ_A48A760F9395C3F35E237E06'); $customerMeta->addForeignKeyConstraint('kimai2_customers', ['customer_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_A48A760F9395C3F3'); @@ -56,7 +56,7 @@ final class Version20190617100845 extends AbstractMigration $projectMeta->addColumn('name', 'string', ['notnull' => true, 'length' => 50]); $projectMeta->addColumn('value', 'string', ['notnull' => false, 'length' => 255]); $projectMeta->addColumn('visible', 'boolean', ['notnull' => false, 'default' => false]); - $projectMeta->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($projectMeta, ['id']); $projectMeta->addIndex(['project_id'], 'IDX_50536EF2166D1F9C'); $projectMeta->addUniqueIndex(['project_id', 'name'], 'UNIQ_50536EF2166D1F9C5E237E06'); $projectMeta->addForeignKeyConstraint('kimai2_projects', ['project_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_50536EF2166D1F9C'); @@ -67,7 +67,7 @@ final class Version20190617100845 extends AbstractMigration $activityMeta->addColumn('name', 'string', ['notnull' => true, 'length' => 50]); $activityMeta->addColumn('value', 'string', ['notnull' => false, 'length' => 255]); $activityMeta->addColumn('visible', 'boolean', ['notnull' => false, 'default' => false]); - $activityMeta->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($activityMeta, ['id']); $activityMeta->addIndex(['activity_id'], 'IDX_A7C0A43D81C06096'); $activityMeta->addUniqueIndex(['activity_id', 'name'], 'UNIQ_A7C0A43D81C060965E237E06'); $activityMeta->addForeignKeyConstraint('kimai2_activities', ['activity_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_A7C0A43D81C06096'); diff --git a/migrations/Version20190730123324.php b/migrations/Version20190730123324.php index f19626c48..c8b5d32d4 100644 --- a/migrations/Version20190730123324.php +++ b/migrations/Version20190730123324.php @@ -32,7 +32,7 @@ final class Version20190730123324 extends AbstractMigration $teams->addColumn('id', 'integer', ['autoincrement' => true, 'notnull' => true]); $teams->addColumn('name', 'string', ['notnull' => true, 'length' => 100]); $teams->addColumn('teamlead_id', 'integer', ['length' => 11, 'notnull' => true]); - $teams->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($teams, ['id']); $teams->addUniqueIndex(['name'], 'UNIQ_3BEDDC7F5E237E06'); $teams->addForeignKeyConstraint('kimai2_users', ['teamlead_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_3BEDDC7F8F7DE5D7'); @@ -41,21 +41,21 @@ final class Version20190730123324 extends AbstractMigration $userTeams->addColumn('team_id', 'integer', ['length' => 11, 'notnull' => true]); $userTeams->addForeignKeyConstraint('kimai2_users', ['user_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_B5E92CF8A76ED395'); $userTeams->addForeignKeyConstraint('kimai2_teams', ['team_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_B5E92CF8296CD8AE'); - $userTeams->setPrimaryKey(['user_id', 'team_id']); + $this->addPrimaryKeyConstraint($userTeams, ['user_id', 'team_id']); $customerTeams = $schema->createTable('kimai2_customers_teams'); $customerTeams->addColumn('customer_id', 'integer', ['length' => 11, 'notnull' => true]); $customerTeams->addColumn('team_id', 'integer', ['length' => 11, 'notnull' => true]); $customerTeams->addForeignKeyConstraint('kimai2_customers', ['customer_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_50BD83889395C3F3'); $customerTeams->addForeignKeyConstraint('kimai2_teams', ['team_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_50BD8388296CD8AE'); - $customerTeams->setPrimaryKey(['customer_id', 'team_id']); + $this->addPrimaryKeyConstraint($customerTeams, ['customer_id', 'team_id']); $projectTeams = $schema->createTable('kimai2_projects_teams'); $projectTeams->addColumn('project_id', 'integer', ['length' => 11, 'notnull' => true]); $projectTeams->addColumn('team_id', 'integer', ['length' => 11, 'notnull' => true]); $projectTeams->addForeignKeyConstraint('kimai2_projects', ['project_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_9345D431166D1F9C'); $projectTeams->addForeignKeyConstraint('kimai2_teams', ['team_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_9345D431296CD8AE'); - $projectTeams->setPrimaryKey(['project_id', 'team_id']); + $this->addPrimaryKeyConstraint($projectTeams, ['project_id', 'team_id']); } public function down(Schema $schema): void diff --git a/migrations/Version20191108151534.php b/migrations/Version20191108151534.php index 5cd3e5a29..9ad5e0be0 100644 --- a/migrations/Version20191108151534.php +++ b/migrations/Version20191108151534.php @@ -31,7 +31,7 @@ final class Version20191108151534 extends AbstractMigration $roles = $schema->createTable('kimai2_roles'); $roles->addColumn('id', 'integer', ['autoincrement' => true, 'notnull' => true]); $roles->addColumn('name', 'string', ['notnull' => true, 'length' => 50]); - $roles->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($roles, ['id']); $roles->addUniqueIndex(['name'], 'roles_name'); $rolePermissions = $schema->createTable('kimai2_roles_permissions'); @@ -39,7 +39,7 @@ final class Version20191108151534 extends AbstractMigration $rolePermissions->addColumn('role_id', 'integer', ['length' => 11, 'notnull' => true]); $rolePermissions->addColumn('permission', 'string', ['notnull' => true, 'length' => 50]); $rolePermissions->addColumn('allowed', 'boolean', ['notnull' => true, 'default' => false]); - $rolePermissions->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($rolePermissions, ['id']); $rolePermissions->addUniqueIndex(['role_id', 'permission'], 'role_permission'); $rolePermissions->addForeignKeyConstraint('kimai2_roles', ['role_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_D263A3B8D60322AC'); } diff --git a/migrations/Version20200109102138.php b/migrations/Version20200109102138.php index c48336dbe..d2095803f 100644 --- a/migrations/Version20200109102138.php +++ b/migrations/Version20200109102138.php @@ -35,7 +35,7 @@ final class Version20200109102138 extends AbstractMigration $customerComment->addColumn('created_by_id', 'integer', ['notnull' => true]); $customerComment->addColumn('created_at', 'datetime', ['notnull' => true]); $customerComment->addColumn('pinned', 'boolean', ['notnull' => true, 'default' => false]); - $customerComment->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($customerComment, ['id']); $customerComment->addIndex(['customer_id'], 'IDX_A5B142D99395C3F3'); $customerComment->addForeignKeyConstraint('kimai2_customers', ['customer_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_A5B142D99395C3F3'); $customerComment->addForeignKeyConstraint('kimai2_users', ['created_by_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_A5B142D9B03A8386'); @@ -47,7 +47,7 @@ final class Version20200109102138 extends AbstractMigration $projectComment->addColumn('created_by_id', 'integer', ['notnull' => true]); $projectComment->addColumn('created_at', 'datetime', ['notnull' => true]); $projectComment->addColumn('pinned', 'boolean', ['notnull' => true, 'default' => false]); - $projectComment->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($projectComment, ['id']); $projectComment->addIndex(['project_id'], 'IDX_29A23638166D1F9C'); $projectComment->addForeignKeyConstraint('kimai2_projects', ['project_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_29A23638166D1F9C'); $projectComment->addForeignKeyConstraint('kimai2_users', ['created_by_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_29A23638B03A8386'); diff --git a/migrations/Version20200205115243.php b/migrations/Version20200205115243.php index 1a25f1d2d..1d7133e45 100644 --- a/migrations/Version20200205115243.php +++ b/migrations/Version20200205115243.php @@ -37,7 +37,7 @@ final class Version20200205115243 extends AbstractMigration $customerRates->addForeignKeyConstraint('kimai2_users', ['user_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_82AB0AECA76ED395'); $customerRates->addForeignKeyConstraint('kimai2_customers', ['customer_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_82AB0AEC9395C3F3'); $customerRates->addUniqueIndex(['user_id', 'customer_id'], 'UNIQ_82AB0AECA76ED3959395C3F3'); - $customerRates->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($customerRates, ['id']); $projectRates = $schema->createTable('kimai2_projects_rates'); $projectRates->addColumn('id', 'integer', ['autoincrement' => true, 'notnull' => true]); @@ -48,7 +48,7 @@ final class Version20200205115243 extends AbstractMigration $projectRates->addForeignKeyConstraint('kimai2_users', ['user_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_41535D55A76ED395'); $projectRates->addForeignKeyConstraint('kimai2_projects', ['project_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_41535D55166D1F9C'); $projectRates->addUniqueIndex(['user_id', 'project_id'], 'UNIQ_41535D55A76ED395166D1F9C'); - $projectRates->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($projectRates, ['id']); $activityRates = $schema->createTable('kimai2_activities_rates'); $activityRates->addColumn('id', 'integer', ['autoincrement' => true, 'notnull' => true]); @@ -59,7 +59,7 @@ final class Version20200205115243 extends AbstractMigration $activityRates->addForeignKeyConstraint('kimai2_users', ['user_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_4A7F11BEA76ED395'); $activityRates->addForeignKeyConstraint('kimai2_activities', ['activity_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_4A7F11BE81C06096'); $activityRates->addUniqueIndex(['user_id', 'activity_id'], 'UNIQ_4A7F11BEA76ED39581C06096'); - $activityRates->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($activityRates, ['id']); } public function down(Schema $schema): void diff --git a/migrations/Version20200308171950.php b/migrations/Version20200308171950.php index 2078f3d6f..71abed8a8 100644 --- a/migrations/Version20200308171950.php +++ b/migrations/Version20200308171950.php @@ -45,7 +45,7 @@ final class Version20200308171950 extends AbstractMigration $invoices->addUniqueIndex(['invoice_filename'], 'UNIQ_76C38E372323B33D'); $invoices->addForeignKeyConstraint('kimai2_users', ['user_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_76C38E37A76ED395'); $invoices->addForeignKeyConstraint('kimai2_customers', ['customer_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_76C38E379395C3F3'); - $invoices->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($invoices, ['id']); } public function down(Schema $schema): void diff --git a/migrations/Version20200524142042.php b/migrations/Version20200524142042.php index 8e49cc00a..fc0041dbf 100644 --- a/migrations/Version20200524142042.php +++ b/migrations/Version20200524142042.php @@ -31,7 +31,7 @@ final class Version20200524142042 extends AbstractMigration $sessions->addColumn('data', 'blob', ['length' => 65535, 'notnull' => true]); $sessions->addColumn('time', 'integer', ['unsigned' => true, 'notnull' => true]); $sessions->addColumn('lifetime', 'integer', ['unsigned' => true, 'notnull' => true]); - $sessions->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($sessions, ['id']); } public function down(Schema $schema): void diff --git a/migrations/Version20200725213424.php b/migrations/Version20200725213424.php index 5e54a9d82..158b32d18 100644 --- a/migrations/Version20200725213424.php +++ b/migrations/Version20200725213424.php @@ -33,7 +33,7 @@ final class Version20200725213424 extends AbstractMigration $activityTeams->addColumn('team_id', 'integer', ['length' => 11, 'notnull' => true]); $activityTeams->addForeignKeyConstraint('kimai2_activities', ['activity_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_986998DA81C06096'); $activityTeams->addForeignKeyConstraint('kimai2_teams', ['team_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_986998DA296CD8AE'); - $activityTeams->setPrimaryKey(['activity_id', 'team_id']); + $this->addPrimaryKeyConstraint($activityTeams, ['activity_id', 'team_id']); } public function down(Schema $schema): void diff --git a/migrations/Version20210316224358.php b/migrations/Version20210316224358.php index 4337288a2..f4c94d061 100644 --- a/migrations/Version20210316224358.php +++ b/migrations/Version20210316224358.php @@ -36,7 +36,7 @@ final class Version20210316224358 extends AbstractMigration $bookmarks->addColumn('content', 'text', ['notnull' => true]); $bookmarks->addForeignKeyConstraint('kimai2_users', ['user_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_4016EF25A76ED395'); $bookmarks->addUniqueIndex(['user_id', 'name'], 'UNIQ_4016EF25A76ED3955E237E06'); - $bookmarks->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($bookmarks, ['id']); } public function down(Schema $schema): void diff --git a/migrations/Version20210802174318.php b/migrations/Version20210802174318.php index c7331b8b4..2d4e2fe66 100644 --- a/migrations/Version20210802174318.php +++ b/migrations/Version20210802174318.php @@ -30,7 +30,7 @@ final class Version20210802174318 extends AbstractMigration $teamMember->addColumn('id', 'integer', ['autoincrement' => true, 'notnull' => true]); $teamMember->addColumn('teamlead', 'boolean', ['notnull' => true, 'default' => false]); $teamMember->dropPrimaryKey(); - $teamMember->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($teamMember, ['id']); $teamMember->addUniqueIndex(['user_id', 'team_id'], 'UNIQ_B5E92CF8A76ED395296CD8AE'); } @@ -41,6 +41,6 @@ final class Version20210802174318 extends AbstractMigration $teamMember->dropPrimaryKey(); $teamMember->dropColumn('teamlead'); $teamMember->dropColumn('id'); - $teamMember->setPrimaryKey(['user_id', 'team_id']); + $this->addPrimaryKeyConstraint($teamMember, ['user_id', 'team_id']); } } diff --git a/migrations/Version20220101204501.php b/migrations/Version20220101204501.php index e96d0a690..6c7bb6cdf 100644 --- a/migrations/Version20220101204501.php +++ b/migrations/Version20220101204501.php @@ -29,7 +29,7 @@ final class Version20220101204501 extends AbstractMigration $table->addColumn('name', 'string', ['notnull' => true, 'length' => 50]); $table->addColumn('value', 'text', ['notnull' => false, 'length' => 65535]); $table->addColumn('visible', 'boolean', ['notnull' => true, 'default' => false]); - $table->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($table, ['id']); $table->addIndex(['invoice_id'], 'IDX_7EDC37D92989F1FD'); $table->addUniqueIndex(['invoice_id', 'name'], 'UNIQ_7EDC37D92989F1FD5E237E06'); $table->addForeignKeyConstraint('kimai2_invoices', ['invoice_id'], ['id'], ['onDelete' => 'CASCADE'], 'FK_7EDC37D92989F1FD'); diff --git a/migrations/Version20230327143628.php b/migrations/Version20230327143628.php index f4bbe284c..8eb7e0d00 100644 --- a/migrations/Version20230327143628.php +++ b/migrations/Version20230327143628.php @@ -35,7 +35,7 @@ final class Version20230327143628 extends AbstractMigration $workingTimes->addColumn('expected', 'integer', ['notnull' => true]); $workingTimes->addColumn('actual', 'integer', ['notnull' => true]); $workingTimes->addColumn('approved_at', 'datetime', ['notnull' => false, 'default' => null]); - $workingTimes->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($workingTimes, ['id']); $workingTimes->addIndex(['user_id'], 'IDX_F95E4933A76ED395'); $workingTimes->addIndex(['approved_by'], 'IDX_F95E49334EA3CB3D'); $workingTimes->addUniqueIndex(['user_id', 'date'], 'UNIQ_F95E4933A76ED395AA9E377A'); diff --git a/migrations/Version20240214061246.php b/migrations/Version20240214061246.php index 601bf7767..105d2a936 100644 --- a/migrations/Version20240214061246.php +++ b/migrations/Version20240214061246.php @@ -33,7 +33,7 @@ final class Version20240214061246 extends AbstractMigration $accessTokens->addColumn('last_usage', 'datetime_immutable', ['notnull' => false, 'default' => null]); $accessTokens->addColumn('expires_at', 'datetime_immutable', ['notnull' => false, 'default' => null]); - $accessTokens->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($accessTokens, ['id']); $accessTokens->addIndex(['user_id'], 'IDX_6FB0DB1EA76ED395'); $accessTokens->addUniqueIndex(['token'], 'UNIQ_6FB0DB1E5F37A13B'); diff --git a/migrations/Version20250608143244.php b/migrations/Version20250608143244.php index 4fa3d405c..2bfa11e1f 100644 --- a/migrations/Version20250608143244.php +++ b/migrations/Version20250608143244.php @@ -33,7 +33,7 @@ final class Version20250608143244 extends AbstractMigration $table->addColumn('columns', 'json', ['notnull' => true]); $table->addColumn('options', 'json', ['notnull' => true]); - $table->setPrimaryKey(['id']); + $this->addPrimaryKeyConstraint($table, ['id']); $table->addUniqueIndex(['title'], 'UNIQ_2F0CA26F2B36786B'); } diff --git a/migrations/Version20260101010000.php b/migrations/Version20260101010000.php new file mode 100644 index 000000000..e6776b3ea --- /dev/null +++ b/migrations/Version20260101010000.php @@ -0,0 +1,109 @@ +connection; + + $rows = $connection->fetchAllAssociative('SELECT id, roles FROM kimai2_users'); + + foreach ($rows as $row) { + $id = $row['id']; + $value = $row['roles']; + $data = []; + + if (\is_string($value) && str_starts_with($value, 'a:')) { + $data = unserialize($value); + } + + if (!\is_array($data)) { + $data = []; + } + + $json = json_encode($data); + + $connection->executeStatement('UPDATE kimai2_users SET roles = :data WHERE id = :id', [ + 'data' => $json, + 'id' => $id, + ]); + } + + $table = $schema->getTable('kimai2_users'); + $table->dropColumn('api_token'); + + $column = $table->getColumn('roles'); + $column->setType(Type::getType(Types::JSON)); + $column->setComment('(DC2Type:json)'); + $column->setNotnull(true); + + $table = $schema->getTable('kimai2_timesheet'); + $table->dropColumn('category'); + + $this->addSql("DELETE FROM kimai2_user_preferences WHERE `name` = 'export_decimal'"); + } + + public function down(Schema $schema): void + { + $connection = $this->connection; + + // this will leave behind a json_valid() check in mariadb + $connection->executeStatement('ALTER TABLE kimai2_users CHANGE roles roles LONGTEXT NOT NULL COMMENT \'(DC2Type:array)\''); + + // Fetch the existing rows from the table + $rows = $connection->fetchAllAssociative('SELECT id, roles FROM kimai2_users'); + + // Iterate over each row + foreach ($rows as $row) { + $id = $row['id']; + $roles = $row['roles']; + $data = []; + + if (json_validate($roles)) { + $data = json_decode($roles, true); + } + + if (!\is_array($data)) { + $data = []; + } + + $connection->executeStatement('UPDATE kimai2_users SET roles = :roles WHERE id = :id', [ + 'roles' => serialize($data), + 'id' => $id, + ]); + } + + $timesheetTable = $schema->getTable('kimai2_timesheet'); + $timesheetTable->addColumn('category', 'string', ['length' => 10, 'notnull' => true, 'default' => 'work']); + + $usersTable = $schema->getTable('kimai2_users'); + $usersTable->addColumn('api_token', 'string', ['length' => 255, 'notnull' => false, 'default' => null]); + } + + public function isTransactional(): bool + { + return false; + } +} diff --git a/package.json b/package.json index 4de2d43cd..810dd7bf9 100644 --- a/package.json +++ b/package.json @@ -1,58 +1,59 @@ { - "name": "kimai", - "homepage": "https://github.com/kimai/kimai", - "license": "AGPL", - "maintainers": [ - { - "name": "Kevin Papst", - "url": "https://www.kevinpapst.de" - } - ], - "repository": { - "type": "git", - "url": "git+https://github.com/kimai/kimai.git" - }, - "scripts": { - "dev-server": "yarn encore dev-server", - "dev": "yarn encore dev", - "watch": "yarn encore dev --watch", - "lint": "yarn eslint assets/js/", - "build": "yarn encore production" - }, - "browserslist": [ - "defaults" - ], - "dependencies": { - "@babel/core": "^7", - "@babel/eslint-parser": "^7", - "@babel/plugin-syntax-dynamic-import": "^7", - "@babel/preset-env": "^7", - "@eslint/js": "^9", - "@fortawesome/fontawesome-free": "^6", - "@fullcalendar/bootstrap5": "^5", - "@fullcalendar/core": "^5", - "@fullcalendar/daygrid": "^5", - "@fullcalendar/google-calendar": "^5", - "@fullcalendar/icalendar": "^5", - "@fullcalendar/interaction": "^5", - "@fullcalendar/timegrid": "^5", - "@popperjs/core": "^2", - "@symfony/webpack-encore": "^5", - "@tabler/core": "1.4", - "bootstrap": "^5.3", - "chart.js": "^4", - "core-js": "^3", - "eslint": "^9", - "globals": "^15", - "gridstack": "^7", - "highlight.js": "^11.11.1", - "litepicker": "^2", - "luxon": "^3", - "sass": "^1", - "sass-loader": "^16", - "tom-select": "^2.4.3", - "webpack": "^5", - "webpack-cli": "^5" - }, - "packageManager": "yarn@4.5.3" + "name": "kimai", + "homepage": "https://github.com/kimai/kimai", + "license": "AGPL", + "private": true, + "maintainers": [ + { + "name": "Kevin Papst", + "url": "https://www.kevinpapst.de" + } + ], + "repository": { + "type": "git", + "url": "git+https://github.com/kimai/kimai.git" + }, + "scripts": { + "dev-server": "yarn encore dev-server", + "dev": "yarn encore dev", + "watch": "yarn encore dev --watch", + "lint": "yarn eslint assets/js/", + "build": "yarn encore production" + }, + "browserslist": [ + "defaults" + ], + "dependencies": { + "@babel/core": "^7", + "@babel/eslint-parser": "^7", + "@babel/plugin-syntax-dynamic-import": "^7", + "@babel/preset-env": "^7", + "@eslint/js": "^9", + "@fortawesome/fontawesome-free": "^6", + "@fullcalendar/bootstrap5": "^5", + "@fullcalendar/core": "^5", + "@fullcalendar/daygrid": "^5", + "@fullcalendar/google-calendar": "^5", + "@fullcalendar/icalendar": "^5", + "@fullcalendar/interaction": "^5", + "@fullcalendar/timegrid": "^5", + "@popperjs/core": "^2", + "@symfony/webpack-encore": "^5", + "@tabler/core": "1.4", + "bootstrap": "^5.3", + "chart.js": "^4", + "core-js": "^3", + "eslint": "^9", + "globals": "^15", + "gridstack": "^7", + "highlight.js": "^11", + "litepicker": "^2", + "luxon": "^3", + "sass": "^1", + "sass-loader": "^16", + "tom-select": "^2", + "webpack": "^5", + "webpack-cli": "^5" + }, + "packageManager": "yarn@4.5.3" } diff --git a/phpstan.neon b/phpstan.neon index d0fb259a9..7f3912ea4 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -49,16 +49,6 @@ parameters: count: 1 path: src/API/ActivityController.php - - - message: "#^Method App\\\\API\\\\Authentication\\\\TokenAuthenticator\\:\\:getCredentials\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/API/Authentication/TokenAuthenticator.php - - - - message: "#^Parameter \\#2 \\$plainPassword of method Symfony\\\\Component\\\\PasswordHasher\\\\PasswordHasherInterface\\:\\:verify\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: src/API/Authentication/TokenAuthenticator.php - - message: "#^Parameter \\#1 \\$name of method App\\\\Entity\\\\Customer\\:\\:getMetaField\\(\\) expects string, mixed given\\.$#" count: 1 @@ -179,11 +169,6 @@ parameters: count: 1 path: src/Command/AbstractUserCommand.php - - - message: "#^Parameter \\#1 \\$string of function trim expects string, string\\|null given\\.$#" - count: 1 - path: src/Command/AbstractUserCommand.php - - message: "#^Parameter \\#1 \\$username of method App\\\\User\\\\UserService\\:\\:findUserByUsernameOrThrowException\\(\\) expects string, mixed given\\.$#" count: 1 @@ -404,11 +389,6 @@ parameters: count: 1 path: src/Command/PromoteUserCommand.php - - - message: "#^Parameter \\#3 \\$length of function substr expects int\\|null, int\\<0, max\\>\\|false given\\.$#" - count: 1 - path: src/Command/RegenerateLocalesCommand.php - - message: "#^Cannot call method find\\(\\) on Symfony\\\\Component\\\\Console\\\\Application\\|null\\.$#" count: 4 @@ -594,21 +574,6 @@ parameters: count: 1 path: src/Configuration/SystemConfiguration.php - - - message: "#^Method App\\\\Configuration\\\\SystemConfiguration\\:\\:offsetExists\\(\\) has parameter \\$offset with no type specified\\.$#" - count: 1 - path: src/Configuration/SystemConfiguration.php - - - - message: "#^Method App\\\\Configuration\\\\SystemConfiguration\\:\\:offsetGet\\(\\) has parameter \\$offset with no type specified\\.$#" - count: 1 - path: src/Configuration/SystemConfiguration.php - - - - message: "#^Parameter \\#1 \\$key of method App\\\\Configuration\\\\SystemConfiguration\\:\\:set\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/Configuration/SystemConfiguration.php - - message: "#^Parameter \\#1 \\$string of function trim expects string, bool\\|float\\|int\\|string given\\.$#" count: 1 @@ -1174,21 +1139,11 @@ parameters: count: 1 path: src/Entity/Team.php - - - message: "#^Method App\\\\Entity\\\\Timesheet\\:\\:getCategory\\(\\) should return string but returns string\\|null\\.$#" - count: 1 - path: src/Entity/Timesheet.php - - message: "#^Method App\\\\Entity\\\\Timesheet\\:\\:getMetaFields\\(\\) return type with generic interface Doctrine\\\\Common\\\\Collections\\\\Collection does not specify its types\\: TKey, T$#" count: 1 path: src/Entity/Timesheet.php - - - message: "#^Method App\\\\Entity\\\\Timesheet\\:\\:getTags\\(\\) return type with generic interface Doctrine\\\\Common\\\\Collections\\\\Collection does not specify its types\\: TKey, T$#" - count: 1 - path: src/Entity/Timesheet.php - - message: "#^Parameter \\#1 \\$name of method App\\\\Entity\\\\Timesheet\\:\\:getMetaField\\(\\) expects string, string\\|null given\\.$#" count: 1 @@ -1264,21 +1219,6 @@ parameters: count: 1 path: src/Entity/User.php - - - message: "#^Method App\\\\Entity\\\\User\\:\\:setConfirmationToken\\(\\) has parameter \\$confirmationToken with no type specified\\.$#" - count: 1 - path: src/Entity/User.php - - - - message: "#^Method App\\\\Entity\\\\User\\:\\:setPassword\\(\\) has parameter \\$password with no type specified\\.$#" - count: 1 - path: src/Entity/User.php - - - - message: "#^Method App\\\\Entity\\\\User\\:\\:setPlainPassword\\(\\) has parameter \\$password with no type specified\\.$#" - count: 1 - path: src/Entity/User.php - - message: "#^Method App\\\\Entity\\\\User\\:\\:setRoles\\(\\) has parameter \\$roles with no value type specified in iterable type array\\.$#" count: 1 @@ -1364,11 +1304,6 @@ parameters: count: 1 path: src/Event/RevenueStatisticEvent.php - - - message: "#^Method App\\\\Event\\\\ThemeJavascriptTranslationsEvent\\:\\:getTranslations\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Event/ThemeJavascriptTranslationsEvent.php - - message: "#^Parameter \\#1 \\$string of function strtolower expects string, string\\|null given\\.$#" count: 2 @@ -1429,16 +1364,6 @@ parameters: count: 1 path: src/Export/Annotation/Order.php - - - message: "#^Method App\\\\Export\\\\Base\\\\HtmlRenderer\\:\\:getOptions\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Export/Base/HtmlRenderer.php - - - - message: "#^Method App\\\\Export\\\\Base\\\\PDFRenderer\\:\\:getOptions\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Export/Base/PDFRenderer.php - - message: "#^Method App\\\\Export\\\\Base\\\\PDFRenderer\\:\\:getPdfOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -1939,61 +1864,6 @@ parameters: count: 1 path: src/Form/TimesheetPreCreateForm.php - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addActivityMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addActivitySelect\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addCustomerMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addCustomerSelect\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addDateRange\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addOrderBy\\(\\) has parameter \\$allowedColumns with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addProjectMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addProjectSelect\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addTeamsChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Method App\\\\Form\\\\Toolbar\\\\AbstractToolbarForm\\:\\:addUsersChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Form/Toolbar/AbstractToolbarForm.php - - - - message: "#^Parameter \\#1 \\$user of method App\\\\Repository\\\\Query\\\\BaseFormTypeQuery\\:\\:setUser\\(\\) expects App\\\\Entity\\\\User, mixed given\\.$#" - count: 2 - path: src/Form/Toolbar/AbstractToolbarForm.php - - message: "#^Method App\\\\Form\\\\Toolbar\\\\ActivityToolbarForm\\:\\:addActivityMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" count: 1 @@ -3331,7 +3201,7 @@ parameters: - message: "#^Parameter \\#1 \\$identifier of method App\\\\Entity\\\\User\\:\\:setUserIdentifier\\(\\) expects string, string\\|null given\\.$#" - count: 2 + count: 1 path: src/Saml/SamlProvider.php - @@ -3339,16 +3209,6 @@ parameters: count: 1 path: src/Saml/SamlProvider.php - - - message: "#^Property App\\\\Saml\\\\Security\\\\SamlAuthenticationFailureHandler\\:\\:\\$defaultOptions has no type specified\\.$#" - count: 1 - path: src/Saml/Security/SamlAuthenticationFailureHandler.php - - - - message: "#^Property App\\\\Saml\\\\Security\\\\SamlAuthenticationSuccessHandler\\:\\:\\$defaultOptions has no type specified\\.$#" - count: 1 - path: src/Saml/Security/SamlAuthenticationSuccessHandler.php - - message: "#^Method App\\\\Security\\\\KimaiUserProvider\\:\\:getProviders\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -3549,21 +3409,6 @@ parameters: count: 1 path: src/Twig/LocaleFormatExtensions.php - - - message: "#^Method App\\\\Twig\\\\PaginationExtension\\:\\:createRouteGenerator\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Twig/PaginationExtension.php - - - - message: "#^Method App\\\\Twig\\\\PaginationExtension\\:\\:renderPagination\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Twig/PaginationExtension.php - - - - message: "#^Method App\\\\Twig\\\\PaginationExtension\\:\\:renderPagination\\(\\) has parameter \\$pager with generic class Pagerfanta\\\\Pagerfanta but does not specify its types\\: T$#" - count: 1 - path: src/Twig/PaginationExtension.php - - message: "#^Method App\\\\Twig\\\\Runtime\\\\ThemeExtension\\:\\:actions\\(\\) has parameter \\$payload with no value type specified in iterable type array\\.$#" count: 1 @@ -3604,11 +3449,6 @@ parameters: count: 3 path: src/Utils/Color.php - - - message: "#^Class App\\\\Utils\\\\DataTable implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" - count: 1 - path: src/Utils/DataTable.php - - message: "#^Method App\\\\Utils\\\\DataTable\\:\\:addColumn\\(\\) has parameter \\$column with no value type specified in iterable type array\\.$#" count: 1 @@ -3619,11 +3459,6 @@ parameters: count: 1 path: src/Utils/DataTable.php - - - message: "#^Method App\\\\Utils\\\\DataTable\\:\\:getIterator\\(\\) should return Traversable\\ but returns Traversable\\<\\(int\\|string\\), mixed\\>\\|null\\.$#" - count: 1 - path: src/Utils/DataTable.php - - message: "#^Method App\\\\Utils\\\\DataTable\\:\\:getOptions\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -3764,11 +3599,6 @@ parameters: count: 1 path: src/Utils/PageSetup.php - - - message: "#^Class App\\\\Utils\\\\Pagination extends generic class Pagerfanta\\\\Pagerfanta but does not specify its types\\: T$#" - count: 1 - path: src/Utils/Pagination.php - - message: "#^Parameter \\#1 \\$class of method App\\\\Utils\\\\PaginationTemplate\\:\\:linkLi\\(\\) expects string, mixed given\\.$#" count: 1 @@ -3874,16 +3704,6 @@ parameters: count: 1 path: src/Utils/ReleaseVersion.php - - - message: "#^Cannot access offset 'pattern' on mixed\\.$#" - count: 1 - path: src/Validator/Constraints/Duration.php - - - - message: "#^Parameter \\#1 \\$pattern of method Symfony\\\\Component\\\\Validator\\\\Constraints\\\\Regex\\:\\:__construct\\(\\) expects array\\|string\\|null, mixed given\\.$#" - count: 1 - path: src/Validator/Constraints/Duration.php - - message: "#^Parameter \\#1 \\$value \\(App\\\\Entity\\\\Team\\) of method App\\\\Validator\\\\Constraints\\\\TeamValidator\\:\\:validate\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" count: 2 diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 577d748af..d807db45d 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,8 +1,12 @@ + + - - - - - - - - - - - - - - - - + + + - - - - - tests/ - - - - - - - - src/ - templates/ - - - migrations/ - assets/ - bin/ - config/ - node_modules/ - public/ - tests/ - translations/ - var/ - vendor/ - - + CREATE DATABASE IF NOT EXISTS `kimai2_test`; + CREATE USER IF NOT EXISTS `kimai2_test`@127.0.0.1; + ALTER USER `kimai2_test`@127.0.0.1 IDENTIFIED BY "kimai2_test"; + GRANT execute,select,insert,update,delete,create,alter,drop,index,references ON `kimai2_test`.* TO kimai2_test@127.0.0.1; + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + tests/ + + + + + + + + + + + + src/ + templates/ + + + migrations/ + assets/ + bin/ + config/ + node_modules/ + public/ + tests/ + translations/ + var/ + vendor/ + + diff --git a/public/build/app.03312b52.js b/public/build/app.03312b52.js new file mode 100644 index 000000000..8b6bcedd8 --- /dev/null +++ b/public/build/app.03312b52.js @@ -0,0 +1,2 @@ +/*! For license information please see app.03312b52.js.LICENSE.txt */ +(self.webpackChunkkimai=self.webpackChunkkimai||[]).push([[524],{424:function(t){window,t.exports=function(t){var e={};function n(i){if(e[i])return e[i].exports;var s=e[i]={i:i,l:!1,exports:{}};return t[i].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)n.d(i,s,function(e){return t[e]}.bind(null,s));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=4)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(e,n,i){void 0===e&&(e=null),void 0===n&&(n=null),void 0===i&&(i="en-US"),this.dateInstance="object"==typeof n&&null!==n?n.parse(e instanceof t?e.clone().toJSDate():e):"string"==typeof n?t.parseDateTime(e,n,i):e?t.parseDateTime(e):t.parseDateTime(new Date),this.lang=i}return t.parseDateTime=function(e,n,i){if(void 0===n&&(n="YYYY-MM-DD"),void 0===i&&(i="en-US"),!e)return new Date(NaN);if(e instanceof Date)return new Date(e);if(e instanceof t)return e.clone().toJSDate();if(/^-?\d{10,}$/.test(e))return t.getDateZeroTime(new Date(Number(e)));if("string"==typeof e){for(var s=[],r=null;null!=(r=t.regex.exec(n));)"\\"!==r[1]&&s.push(r);if(s.length){var o={year:null,month:null,shortMonth:null,longMonth:null,day:null,value:""};s[0].index>0&&(o.value+=".*?");for(var a=0,l=Object.entries(s);at.getTime()&&this.timestamp()=t.getTime()&&this.timestamp()t.getTime()&&this.timestamp()<=e.getTime();case"[]":return this.timestamp()>=t.getTime()&&this.timestamp()<=e.getTime()}},t.prototype.isBefore=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":return t.getTime()>this.getTime();case"day":case"days":return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()>new Date(this.getFullYear(),this.getMonth(),this.getDate()).getTime();case"month":case"months":return new Date(t.getFullYear(),t.getMonth(),1).getTime()>new Date(this.getFullYear(),this.getMonth(),1).getTime();case"year":case"years":return t.getFullYear()>this.getFullYear()}throw new Error("isBefore: Invalid unit!")},t.prototype.isSameOrBefore=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":return t.getTime()>=this.getTime();case"day":case"days":return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()>=new Date(this.getFullYear(),this.getMonth(),this.getDate()).getTime();case"month":case"months":return new Date(t.getFullYear(),t.getMonth(),1).getTime()>=new Date(this.getFullYear(),this.getMonth(),1).getTime()}throw new Error("isSameOrBefore: Invalid unit!")},t.prototype.isAfter=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":return this.getTime()>t.getTime();case"day":case"days":return new Date(this.getFullYear(),this.getMonth(),this.getDate()).getTime()>new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime();case"month":case"months":return new Date(this.getFullYear(),this.getMonth(),1).getTime()>new Date(t.getFullYear(),t.getMonth(),1).getTime();case"year":case"years":return this.getFullYear()>t.getFullYear()}throw new Error("isAfter: Invalid unit!")},t.prototype.isSameOrAfter=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":return this.getTime()>=t.getTime();case"day":case"days":return new Date(this.getFullYear(),this.getMonth(),this.getDate()).getTime()>=new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime();case"month":case"months":return new Date(this.getFullYear(),this.getMonth(),1).getTime()>=new Date(t.getFullYear(),t.getMonth(),1).getTime()}throw new Error("isSameOrAfter: Invalid unit!")},t.prototype.isSame=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":return this.getTime()===t.getTime();case"day":case"days":return new Date(this.getFullYear(),this.getMonth(),this.getDate()).getTime()===new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime();case"month":case"months":return new Date(this.getFullYear(),this.getMonth(),1).getTime()===new Date(t.getFullYear(),t.getMonth(),1).getTime()}throw new Error("isSame: Invalid unit!")},t.prototype.add=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":this.setSeconds(this.getSeconds()+t);break;case"day":case"days":this.setDate(this.getDate()+t);break;case"month":case"months":this.setMonth(this.getMonth()+t)}return this},t.prototype.subtract=function(t,e){switch(void 0===e&&(e="seconds"),e){case"second":case"seconds":this.setSeconds(this.getSeconds()-t);break;case"day":case"days":this.setDate(this.getDate()-t);break;case"month":case"months":this.setMonth(this.getMonth()-t)}return this},t.prototype.diff=function(t,e){switch(void 0===e&&(e="seconds"),e){default:case"second":case"seconds":return this.getTime()-t.getTime();case"day":case"days":return Math.round((this.timestamp()-t.getTime())/864e5);case"month":case"months":}},t.prototype.format=function(e,n){if(void 0===n&&(n="en-US"),"object"==typeof e)return e.output(this.clone().toJSDate());for(var i="",s=[],r=null;null!=(r=t.regex.exec(e));)"\\"!==r[1]&&s.push(r);if(s.length){s[0].index>0&&(i+=e.substring(0,s[0].index));for(var o=0,a=Object.entries(s);o1&&n.isAfter(e)&&n.setMonth(n.getMonth()-(this.options.numberOfMonths-1)),this.calendars[0]=n.clone()):(e.setDate(1),this.calendars[0]=e.clone())}},e.prototype.bindEvents=function(){document.addEventListener("click",this.onClick.bind(this),!0),this.ui=document.createElement("div"),this.ui.className=l.litepicker,this.ui.style.display="none",this.ui.addEventListener("mouseenter",this.onMouseEnter.bind(this),!0),this.ui.addEventListener("mouseleave",this.onMouseLeave.bind(this),!1),this.options.autoRefresh?(this.options.element instanceof HTMLElement&&this.options.element.addEventListener("keyup",this.onInput.bind(this),!0),this.options.elementEnd instanceof HTMLElement&&this.options.elementEnd.addEventListener("keyup",this.onInput.bind(this),!0)):(this.options.element instanceof HTMLElement&&this.options.element.addEventListener("change",this.onInput.bind(this),!0),this.options.elementEnd instanceof HTMLElement&&this.options.elementEnd.addEventListener("change",this.onInput.bind(this),!0)),this.options.parentEl?this.options.parentEl instanceof HTMLElement?this.options.parentEl.appendChild(this.ui):document.querySelector(this.options.parentEl).appendChild(this.ui):this.options.inlineMode?this.options.element instanceof HTMLInputElement?this.options.element.parentNode.appendChild(this.ui):this.options.element.appendChild(this.ui):document.body.appendChild(this.ui),this.updateInput(),this.init(),"function"==typeof this.options.setup&&this.options.setup.call(this,this),this.render(),this.options.inlineMode&&this.show()},e.prototype.updateInput=function(){if(this.options.element instanceof HTMLInputElement){var t=this.options.startDate,e=this.options.endDate;if(this.options.singleMode&&t)this.options.element.value=t.format(this.options.format,this.options.lang);else if(!this.options.singleMode&&t&&e){var n=t.format(this.options.format,this.options.lang),i=e.format(this.options.format,this.options.lang);this.options.elementEnd instanceof HTMLInputElement?(this.options.element.value=n,this.options.elementEnd.value=i):this.options.element.value=""+n+this.options.delimiter+i}t||e||(this.options.element.value="",this.options.elementEnd instanceof HTMLInputElement&&(this.options.elementEnd.value=""))}},e.prototype.isSamePicker=function(t){return t.closest("."+l.litepicker)===this.ui},e.prototype.shouldShown=function(t){return!t.disabled&&(t===this.options.element||this.options.elementEnd&&t===this.options.elementEnd)},e.prototype.shouldResetDatePicked=function(){return this.options.singleMode||2===this.datePicked.length},e.prototype.shouldSwapDatePicked=function(){return 2===this.datePicked.length&&this.datePicked[0].getTime()>this.datePicked[1].getTime()},e.prototype.shouldCheckLockDays=function(){return this.options.disallowLockDaysInRange&&2===this.datePicked.length},e.prototype.onClick=function(t){var e=t.target;if(t.target.shadowRoot&&(e=t.composedPath()[0]),e&&this.ui)if(this.shouldShown(e))this.show(e);else if(e.closest("."+l.litepicker)||!this.isShowning()){if(this.isSamePicker(e))if(this.emit("before:click",e),this.preventClick)this.preventClick=!1;else{if(e.classList.contains(l.dayItem)){if(t.preventDefault(),e.classList.contains(l.isLocked))return;if(this.shouldResetDatePicked()&&(this.datePicked.length=0),this.datePicked[this.datePicked.length]=new a.DateTime(e.dataset.time),this.shouldSwapDatePicked()){var n=this.datePicked[1].clone();this.datePicked[1]=this.datePicked[0].clone(),this.datePicked[0]=n.clone()}return this.shouldCheckLockDays()&&c.rangeIsLocked(this.datePicked,this.options)&&(this.emit("error:range",this.datePicked),this.datePicked.length=0),this.render(),this.emit.apply(this,r(["preselect"],r(this.datePicked).map((function(t){return t.clone()})))),void(this.options.autoApply&&(this.options.singleMode&&this.datePicked.length?(this.setDate(this.datePicked[0]),this.hide()):this.options.singleMode||2!==this.datePicked.length||(this.setDateRange(this.datePicked[0],this.datePicked[1]),this.hide())))}if(e.classList.contains(l.buttonPreviousMonth)){t.preventDefault();var i=0,s=this.options.switchingMonths||this.options.numberOfMonths;if(this.options.splitView){var o=e.closest("."+l.monthItem);i=c.findNestedMonthItem(o),s=1}return this.calendars[i].setMonth(this.calendars[i].getMonth()-s),this.gotoDate(this.calendars[i],i),void this.emit("change:month",this.calendars[i],i)}if(e.classList.contains(l.buttonNextMonth))return t.preventDefault(),i=0,s=this.options.switchingMonths||this.options.numberOfMonths,this.options.splitView&&(o=e.closest("."+l.monthItem),i=c.findNestedMonthItem(o),s=1),this.calendars[i].setMonth(this.calendars[i].getMonth()+s),this.gotoDate(this.calendars[i],i),void this.emit("change:month",this.calendars[i],i);e.classList.contains(l.buttonCancel)&&(t.preventDefault(),this.hide(),this.emit("button:cancel")),e.classList.contains(l.buttonApply)&&(t.preventDefault(),this.options.singleMode&&this.datePicked.length?this.setDate(this.datePicked[0]):this.options.singleMode||2!==this.datePicked.length||this.setDateRange(this.datePicked[0],this.datePicked[1]),this.hide(),this.emit("button:apply",this.options.startDate,this.options.endDate))}}else this.hide()},e.prototype.showTooltip=function(t,e){var n=this.ui.querySelector("."+l.containerTooltip);n.style.visibility="visible",n.innerHTML=e;var i=this.ui.getBoundingClientRect(),s=n.getBoundingClientRect(),r=t.getBoundingClientRect(),o=r.top,a=r.left;if(this.options.inlineMode&&this.options.parentEl){var c=this.ui.parentNode.getBoundingClientRect();o-=c.top,a-=c.left}else o-=i.top,a-=i.left;o-=s.height,a-=s.width/2,a+=r.width/2,n.style.top=o+"px",n.style.left=a+"px",this.emit("tooltip",n,t)},e.prototype.hideTooltip=function(){this.ui.querySelector("."+l.containerTooltip).style.visibility="hidden"},e.prototype.shouldAllowMouseEnter=function(t){return!this.options.singleMode&&!t.classList.contains(l.isLocked)},e.prototype.shouldAllowRepick=function(){return this.options.elementEnd&&this.options.allowRepick&&this.options.startDate&&this.options.endDate},e.prototype.isDayItem=function(t){return t.classList.contains(l.dayItem)},e.prototype.onMouseEnter=function(t){var e=this,n=t.target;if(this.isDayItem(n)&&this.shouldAllowMouseEnter(n)){if(this.shouldAllowRepick()&&(this.triggerElement===this.options.element?this.datePicked[0]=this.options.endDate.clone():this.triggerElement===this.options.elementEnd&&(this.datePicked[0]=this.options.startDate.clone())),1!==this.datePicked.length)return;var i=this.ui.querySelector("."+l.dayItem+'[data-time="'+this.datePicked[0].getTime()+'"]'),s=this.datePicked[0].clone(),r=new a.DateTime(n.dataset.time),o=!1;if(s.getTime()>r.getTime()){var c=s.clone();s=r.clone(),r=c.clone(),o=!0}if(Array.prototype.slice.call(this.ui.querySelectorAll("."+l.dayItem)).forEach((function(t){var n=new a.DateTime(t.dataset.time),i=e.renderDay(n);n.isBetween(s,r)&&i.classList.add(l.isInRange),t.className=i.className})),n.classList.add(l.isEndDate),o?(i&&i.classList.add(l.isFlipped),n.classList.add(l.isFlipped)):(i&&i.classList.remove(l.isFlipped),n.classList.remove(l.isFlipped)),this.options.showTooltip){var u=r.diff(s,"day")+1;if("function"==typeof this.options.tooltipNumber&&(u=this.options.tooltipNumber.call(this,u)),u>0){var d=this.pluralSelector(u),h=u+" "+(this.options.tooltipText[d]?this.options.tooltipText[d]:"["+d+"]");this.showTooltip(n,h);var p=window.navigator.userAgent,m=/(iphone|ipad)/i.test(p),f=/OS 1([0-2])/i.test(p);m&&f&&n.dispatchEvent(new Event("click"))}else this.hideTooltip()}}},e.prototype.onMouseLeave=function(t){t.target,this.options.allowRepick&&(!this.options.allowRepick||this.options.startDate||this.options.endDate)&&(this.datePicked.length=0,this.render())},e.prototype.onInput=function(t){var e=this.parseInput(),n=e[0],i=e[1],s=this.options.format;if(this.options.elementEnd?n instanceof a.DateTime&&i instanceof a.DateTime&&n.format(s)===this.options.element.value&&i.format(s)===this.options.elementEnd.value:this.options.singleMode?n instanceof a.DateTime&&n.format(s)===this.options.element.value:n instanceof a.DateTime&&i instanceof a.DateTime&&""+n.format(s)+this.options.delimiter+i.format(s)===this.options.element.value){if(i&&n.getTime()>i.getTime()){var r=n.clone();n=i.clone(),i=r.clone()}this.options.startDate=new a.DateTime(n,this.options.format,this.options.lang),i&&(this.options.endDate=new a.DateTime(i,this.options.format,this.options.lang)),this.updateInput(),this.render();var o=n.clone(),l=0;(this.options.elementEnd?n.format(s)===t.target.value:t.target.value.startsWith(n.format(s)))||(o=i.clone(),l=this.options.numberOfMonths-1),this.emit("selected",this.getStartDate(),this.getEndDate()),this.gotoDate(o,l)}},e}(o.Calendar);e.Litepicker=u},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.findNestedMonthItem=function(t){for(var e=t.parentNode.childNodes,n=0;ny&&((p=document.createElement("option")).value=String(t.getFullYear()),p.text=String(t.getFullYear()),p.selected=!0,p.disabled=!0,g.appendChild(p)),h=y;h>=v;h-=1){p=document.createElement("option");var b=new o.DateTime(new Date(h,0,1,0,0,0));p.value=String(h),p.text=String(h),p.disabled=this.options.minDate&&b.isBefore(new o.DateTime(this.options.minDate),"year")||this.options.maxDate&&b.isAfter(new o.DateTime(this.options.maxDate),"year"),p.selected=t.getFullYear()===h,g.appendChild(p)}if(t.getFullYear()W");for(var D=1;D<=7;D+=1){var x=3+this.options.firstDay+D,S=document.createElement("div");S.innerHTML=this.weekdayName(x),S.title=this.weekdayName(x,"long"),E.appendChild(S)}var O=document.createElement("div");O.className=a.containerDays;var L=this.calcSkipDays(i);this.options.showWeekNumbers&&L&&O.appendChild(this.renderWeekNumber(i));for(var C=0;C1&&1===this.datePicked.length){var s=this.options.minDays-1,r=this.datePicked[0].clone().subtract(s,"day"),c=this.datePicked[0].clone().add(s,"day");t.isBetween(r,this.datePicked[0],"(]")&&e.classList.add(a.isLocked),t.isBetween(this.datePicked[0],c,"[)")&&e.classList.add(a.isLocked)}if(this.options.maxDays&&1===this.datePicked.length){var u=this.options.maxDays;r=this.datePicked[0].clone().subtract(u,"day"),c=this.datePicked[0].clone().add(u,"day"),t.isSameOrBefore(r)&&e.classList.add(a.isLocked),t.isSameOrAfter(c)&&e.classList.add(a.isLocked)}return this.options.selectForward&&1===this.datePicked.length&&t.isBefore(this.datePicked[0])&&e.classList.add(a.isLocked),this.options.selectBackward&&1===this.datePicked.length&&t.isAfter(this.datePicked[0])&&e.classList.add(a.isLocked),l.dateIsLocked(t,this.options,this.datePicked)&&e.classList.add(a.isLocked),this.options.highlightedDays.length&&this.options.highlightedDays.filter((function(e){return e instanceof Array?t.isBetween(e[0],e[1],"[]"):e.isSame(t,"day")})).length&&e.classList.add(a.isHighlighted),e.tabIndex=e.classList.contains("is-locked")?-1:0,this.emit("render:day",e,t),e},e.prototype.renderFooter=function(){var t=document.createElement("div");if(t.className=a.containerFooter,this.options.footerHTML?t.innerHTML=this.options.footerHTML:t.innerHTML='\n \n \n \n ",this.options.singleMode){if(1===this.datePicked.length){var e=this.datePicked[0].format(this.options.format,this.options.lang);t.querySelector("."+a.previewDateRange).innerHTML=e}}else if(1===this.datePicked.length&&t.querySelector("."+a.buttonApply).setAttribute("disabled",""),2===this.datePicked.length){e=this.datePicked[0].format(this.options.format,this.options.lang);var n=this.datePicked[1].format(this.options.format,this.options.lang);t.querySelector("."+a.previewDateRange).innerHTML=""+e+this.options.delimiter+n}return this.emit("render:footer",t),t},e.prototype.renderWeekNumber=function(t){var e=document.createElement("div"),n=t.getWeek(this.options.firstDay);return e.className=a.weekNumber,e.innerHTML=53===n&&0===t.getMonth()?"53 / 1":n,e},e.prototype.renderTooltip=function(){var t=document.createElement("div");return t.className=a.containerTooltip,t},e.prototype.weekdayName=function(t,e){return void 0===e&&(e="short"),new Date(1970,0,t,12,0,0,0).toLocaleString(this.options.lang,{weekday:e})},e.prototype.calcSkipDays=function(t){var e=t.getDay()-this.options.firstDay;return e<0&&(e+=7),e},e}(r.LPCore);e.Calendar=c},function(t,e,n){"use strict";var i,s=this&&this.__extends||(i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),r=this&&this.__assign||function(){return(r=Object.assign||function(t){for(var e,n=1,i=arguments.length;n',nextMonth:'',reset:'\n \n \n '},tooltipText:{one:"day",other:"days"}},n.options=r(r({},n.options),e.element.dataset),Object.keys(n.options).forEach((function(t){"true"!==n.options[t]&&"false"!==n.options[t]||(n.options[t]="true"===n.options[t])}));var i=r(r({},n.options.dropdowns),e.dropdowns),s=r(r({},n.options.buttonText),e.buttonText),o=r(r({},n.options.tooltipText),e.tooltipText);n.options=r(r({},n.options),e),n.options.dropdowns=r({},i),n.options.buttonText=r({},s),n.options.tooltipText=r({},o),n.options.elementEnd||(n.options.allowRepick=!1),n.options.lockDays.length&&(n.options.lockDays=a.DateTime.convertArray(n.options.lockDays,n.options.lockDaysFormat)),n.options.highlightedDays.length&&(n.options.highlightedDays=a.DateTime.convertArray(n.options.highlightedDays,n.options.highlightedDaysFormat));var l=n.parseInput(),c=l[0],u=l[1];n.options.startDate&&(n.options.singleMode||n.options.endDate)&&(c=new a.DateTime(n.options.startDate,n.options.format,n.options.lang)),c&&n.options.endDate&&(u=new a.DateTime(n.options.endDate,n.options.format,n.options.lang)),c instanceof a.DateTime&&!isNaN(c.getTime())&&(n.options.startDate=c),n.options.startDate&&u instanceof a.DateTime&&!isNaN(u.getTime())&&(n.options.endDate=u),!n.options.singleMode||n.options.startDate instanceof a.DateTime||(n.options.startDate=null),n.options.singleMode||n.options.startDate instanceof a.DateTime&&n.options.endDate instanceof a.DateTime||(n.options.startDate=null,n.options.endDate=null);for(var d=0;dwindow.innerHeight,c=e.top+r-n.height>=n.height;l&&c&&(o=e.top+r-n.height)}if(/left|right/.test(i[0])||i[1]&&"auto"!==i[1]&&/left|right/.test(i[1]))a=/left|right/.test(i[0])?e[i[0]]+s:e[i[1]]+s,"right"!==i[0]&&"right"!==i[1]||(a-=n.width);else{a=e.left+s,l=e.left+n.width>window.innerWidth;var u=e.right+s-n.width>=0;l&&u&&(a=e.right+s-n.width)}return{left:a,top:o}},e}(o.EventEmitter);e.LPCore=c},function(t,e,n){"use strict";var i,s="object"==typeof Reflect?Reflect:null,r=s&&"function"==typeof s.apply?s.apply:function(t,e,n){return Function.prototype.apply.call(t,e,n)};i=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var o=Number.isNaN||function(t){return t!=t};function a(){a.init.call(this)}t.exports=a,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var l=10;function c(t){return void 0===t._maxListeners?a.defaultMaxListeners:t._maxListeners}function u(t,e,n,i){var s,r,o,a;if("function"!=typeof n)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof n);if(void 0===(r=t._events)?(r=t._events=Object.create(null),t._eventsCount=0):(void 0!==r.newListener&&(t.emit("newListener",e,n.listener?n.listener:n),r=t._events),o=r[e]),void 0===o)o=r[e]=n,++t._eventsCount;else if("function"==typeof o?o=r[e]=i?[n,o]:[o,n]:i?o.unshift(n):o.push(n),(s=c(t))>0&&o.length>s&&!o.warned){o.warned=!0;var l=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");l.name="MaxListenersExceededWarning",l.emitter=t,l.type=e,l.count=o.length,a=l,console&&console.warn&&console.warn(a)}return t}function d(){for(var t=[],e=0;e0&&(o=e[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var l=s[t];if(void 0===l)return!1;if("function"==typeof l)r(l,this,e);else{var c=l.length,u=f(l,c);for(n=0;n=0;r--)if(n[r]===e||n[r].listener===e){o=n[r].listener,s=r;break}if(s<0)return this;0===s?n.shift():function(t,e){for(;e+1=0;i--)this.removeListener(t,e[i]);return this},a.prototype.listeners=function(t){return p(this,t,!0)},a.prototype.rawListeners=function(t){return p(this,t,!1)},a.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):m.call(t,e)},a.prototype.listenerCount=m,a.prototype.eventNames=function(){return this._eventsCount>0?i(this._events):[]}},function(t,e,n){(e=n(9)(!1)).push([t.i,':root{--litepicker-container-months-color-bg: #fff;--litepicker-container-months-box-shadow-color: #ddd;--litepicker-footer-color-bg: #fafafa;--litepicker-footer-box-shadow-color: #ddd;--litepicker-tooltip-color-bg: #fff;--litepicker-month-header-color: #333;--litepicker-button-prev-month-color: #9e9e9e;--litepicker-button-next-month-color: #9e9e9e;--litepicker-button-prev-month-color-hover: #2196f3;--litepicker-button-next-month-color-hover: #2196f3;--litepicker-month-width: calc(var(--litepicker-day-width) * 7);--litepicker-month-weekday-color: #9e9e9e;--litepicker-month-week-number-color: #9e9e9e;--litepicker-day-width: 38px;--litepicker-day-color: #333;--litepicker-day-color-hover: #2196f3;--litepicker-is-today-color: #f44336;--litepicker-is-in-range-color: #bbdefb;--litepicker-is-locked-color: #9e9e9e;--litepicker-is-start-color: #fff;--litepicker-is-start-color-bg: #2196f3;--litepicker-is-end-color: #fff;--litepicker-is-end-color-bg: #2196f3;--litepicker-button-cancel-color: #fff;--litepicker-button-cancel-color-bg: #9e9e9e;--litepicker-button-apply-color: #fff;--litepicker-button-apply-color-bg: #2196f3;--litepicker-button-reset-color: #909090;--litepicker-button-reset-color-hover: #2196f3;--litepicker-highlighted-day-color: #333;--litepicker-highlighted-day-color-bg: #ffeb3b}.show-week-numbers{--litepicker-month-width: calc(var(--litepicker-day-width) * 8)}.litepicker{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;font-size:0.8em;display:none}.litepicker button{border:none;background:none}.litepicker .container__main{display:-webkit-box;display:-ms-flexbox;display:flex}.litepicker .container__months{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;background-color:var(--litepicker-container-months-color-bg);border-radius:5px;-webkit-box-shadow:0 0 5px var(--litepicker-container-months-box-shadow-color);box-shadow:0 0 5px var(--litepicker-container-months-box-shadow-color);width:calc(var(--litepicker-month-width) + 10px);-webkit-box-sizing:content-box;box-sizing:content-box}.litepicker .container__months.columns-2{width:calc((var(--litepicker-month-width) * 2) + 20px)}.litepicker .container__months.columns-3{width:calc((var(--litepicker-month-width) * 3) + 30px)}.litepicker .container__months.columns-4{width:calc((var(--litepicker-month-width) * 4) + 40px)}.litepicker .container__months.split-view .month-item-header .button-previous-month,.litepicker .container__months.split-view .month-item-header .button-next-month{visibility:visible}.litepicker .container__months .month-item{padding:5px;width:var(--litepicker-month-width);-webkit-box-sizing:content-box;box-sizing:content-box}.litepicker .container__months .month-item-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-weight:500;padding:10px 5px;text-align:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:var(--litepicker-month-header-color)}.litepicker .container__months .month-item-header div{-webkit-box-flex:1;-ms-flex:1;flex:1}.litepicker .container__months .month-item-header div>.month-item-name{margin-right:5px}.litepicker .container__months .month-item-header div>.month-item-year{padding:0}.litepicker .container__months .month-item-header .reset-button{color:var(--litepicker-button-reset-color)}.litepicker .container__months .month-item-header .reset-button>svg{fill:var(--litepicker-button-reset-color)}.litepicker .container__months .month-item-header .reset-button *{pointer-events:none}.litepicker .container__months .month-item-header .reset-button:hover{color:var(--litepicker-button-reset-color-hover)}.litepicker .container__months .month-item-header .reset-button:hover>svg{fill:var(--litepicker-button-reset-color-hover)}.litepicker .container__months .month-item-header .button-previous-month,.litepicker .container__months .month-item-header .button-next-month{visibility:hidden;text-decoration:none;padding:3px 5px;border-radius:3px;-webkit-transition:color 0.3s, border 0.3s;transition:color 0.3s, border 0.3s;cursor:default}.litepicker .container__months .month-item-header .button-previous-month *,.litepicker .container__months .month-item-header .button-next-month *{pointer-events:none}.litepicker .container__months .month-item-header .button-previous-month{color:var(--litepicker-button-prev-month-color)}.litepicker .container__months .month-item-header .button-previous-month>svg,.litepicker .container__months .month-item-header .button-previous-month>img{fill:var(--litepicker-button-prev-month-color)}.litepicker .container__months .month-item-header .button-previous-month:hover{color:var(--litepicker-button-prev-month-color-hover)}.litepicker .container__months .month-item-header .button-previous-month:hover>svg{fill:var(--litepicker-button-prev-month-color-hover)}.litepicker .container__months .month-item-header .button-next-month{color:var(--litepicker-button-next-month-color)}.litepicker .container__months .month-item-header .button-next-month>svg,.litepicker .container__months .month-item-header .button-next-month>img{fill:var(--litepicker-button-next-month-color)}.litepicker .container__months .month-item-header .button-next-month:hover{color:var(--litepicker-button-next-month-color-hover)}.litepicker .container__months .month-item-header .button-next-month:hover>svg{fill:var(--litepicker-button-next-month-color-hover)}.litepicker .container__months .month-item-weekdays-row{display:-webkit-box;display:-ms-flexbox;display:flex;justify-self:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;color:var(--litepicker-month-weekday-color)}.litepicker .container__months .month-item-weekdays-row>div{padding:5px 0;font-size:85%;-webkit-box-flex:1;-ms-flex:1;flex:1;width:var(--litepicker-day-width);text-align:center}.litepicker .container__months .month-item:first-child .button-previous-month{visibility:visible}.litepicker .container__months .month-item:last-child .button-next-month{visibility:visible}.litepicker .container__months .month-item.no-previous-month .button-previous-month{visibility:hidden}.litepicker .container__months .month-item.no-next-month .button-next-month{visibility:hidden}.litepicker .container__days{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;justify-self:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:center;-webkit-box-sizing:content-box;box-sizing:content-box}.litepicker .container__days>div,.litepicker .container__days>a{padding:5px 0;width:var(--litepicker-day-width)}.litepicker .container__days .day-item{color:var(--litepicker-day-color);text-align:center;text-decoration:none;border-radius:3px;-webkit-transition:color 0.3s, border 0.3s;transition:color 0.3s, border 0.3s;cursor:default}.litepicker .container__days .day-item:hover{color:var(--litepicker-day-color-hover);-webkit-box-shadow:inset 0 0 0 1px var(--litepicker-day-color-hover);box-shadow:inset 0 0 0 1px var(--litepicker-day-color-hover)}.litepicker .container__days .day-item.is-today{color:var(--litepicker-is-today-color)}.litepicker .container__days .day-item.is-locked{color:var(--litepicker-is-locked-color)}.litepicker .container__days .day-item.is-locked:hover{color:var(--litepicker-is-locked-color);-webkit-box-shadow:none;box-shadow:none;cursor:default}.litepicker .container__days .day-item.is-in-range{background-color:var(--litepicker-is-in-range-color);border-radius:0}.litepicker .container__days .day-item.is-start-date{color:var(--litepicker-is-start-color);background-color:var(--litepicker-is-start-color-bg);border-top-left-radius:5px;border-bottom-left-radius:5px;border-top-right-radius:0;border-bottom-right-radius:0}.litepicker .container__days .day-item.is-start-date.is-flipped{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.litepicker .container__days .day-item.is-end-date{color:var(--litepicker-is-end-color);background-color:var(--litepicker-is-end-color-bg);border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.litepicker .container__days .day-item.is-end-date.is-flipped{border-top-left-radius:5px;border-bottom-left-radius:5px;border-top-right-radius:0;border-bottom-right-radius:0}.litepicker .container__days .day-item.is-start-date.is-end-date{border-top-left-radius:5px;border-bottom-left-radius:5px;border-top-right-radius:5px;border-bottom-right-radius:5px}.litepicker .container__days .day-item.is-highlighted{color:var(--litepicker-highlighted-day-color);background-color:var(--litepicker-highlighted-day-color-bg)}.litepicker .container__days .week-number{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:var(--litepicker-month-week-number-color);font-size:85%}.litepicker .container__footer{text-align:right;padding:10px 5px;margin:0 5px;background-color:var(--litepicker-footer-color-bg);-webkit-box-shadow:inset 0px 3px 3px 0px var(--litepicker-footer-box-shadow-color);box-shadow:inset 0px 3px 3px 0px var(--litepicker-footer-box-shadow-color);border-bottom-left-radius:5px;border-bottom-right-radius:5px}.litepicker .container__footer .preview-date-range{margin-right:10px;font-size:90%}.litepicker .container__footer .button-cancel{background-color:var(--litepicker-button-cancel-color-bg);color:var(--litepicker-button-cancel-color);border:0;padding:3px 7px 4px;border-radius:3px}.litepicker .container__footer .button-cancel *{pointer-events:none}.litepicker .container__footer .button-apply{background-color:var(--litepicker-button-apply-color-bg);color:var(--litepicker-button-apply-color);border:0;padding:3px 7px 4px;border-radius:3px;margin-left:10px;margin-right:10px}.litepicker .container__footer .button-apply:disabled{opacity:0.7}.litepicker .container__footer .button-apply *{pointer-events:none}.litepicker .container__tooltip{position:absolute;margin-top:-4px;padding:4px 8px;border-radius:4px;background-color:var(--litepicker-tooltip-color-bg);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25);box-shadow:0 1px 3px rgba(0,0,0,0.25);white-space:nowrap;font-size:11px;pointer-events:none;visibility:hidden}.litepicker .container__tooltip:before{position:absolute;bottom:-5px;left:calc(50% - 5px);border-top:5px solid rgba(0,0,0,0.12);border-right:5px solid transparent;border-left:5px solid transparent;content:""}.litepicker .container__tooltip:after{position:absolute;bottom:-4px;left:calc(50% - 4px);border-top:4px solid var(--litepicker-tooltip-color-bg);border-right:4px solid transparent;border-left:4px solid transparent;content:""}\n',""]),e.locals={showWeekNumbers:"show-week-numbers",litepicker:"litepicker",containerMain:"container__main",containerMonths:"container__months",columns2:"columns-2",columns3:"columns-3",columns4:"columns-4",splitView:"split-view",monthItemHeader:"month-item-header",buttonPreviousMonth:"button-previous-month",buttonNextMonth:"button-next-month",monthItem:"month-item",monthItemName:"month-item-name",monthItemYear:"month-item-year",resetButton:"reset-button",monthItemWeekdaysRow:"month-item-weekdays-row",noPreviousMonth:"no-previous-month",noNextMonth:"no-next-month",containerDays:"container__days",dayItem:"day-item",isToday:"is-today",isLocked:"is-locked",isInRange:"is-in-range",isStartDate:"is-start-date",isFlipped:"is-flipped",isEndDate:"is-end-date",isHighlighted:"is-highlighted",weekNumber:"week-number",containerFooter:"container__footer",previewDateRange:"preview-date-range",buttonCancel:"button-cancel",buttonApply:"button-apply",containerTooltip:"container__tooltip"},t.exports=e},function(t,e,n){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=function(t,e){var n,i,s,r=t[1]||"",o=t[3];if(!o)return r;if(e&&"function"==typeof btoa){var a=(n=o,i=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),s="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(i),"/*# ".concat(s," */")),l=o.sources.map((function(t){return"/*# sourceURL=".concat(o.sourceRoot||"").concat(t," */")}));return[r].concat(l).concat([a]).join("\n")}return[r].join("\n")}(e,t);return e[2]?"@media ".concat(e[2]," {").concat(n,"}"):n})).join("")},e.i=function(t,n,i){"string"==typeof t&&(t=[[null,t,""]]);var s={};if(i)for(var r=0;rthis.options.endDate.getTime()&&(this.options.endDate=this.options.startDate.clone(),this.options.startDate=new s.DateTime(t,this.options.format,this.options.lang)),this.updateInput())},r.Litepicker.prototype.setDateRange=function(t,e,n){void 0===n&&(n=!1),this.triggerElement=void 0;var i=new s.DateTime(t,this.options.format,this.options.lang),r=new s.DateTime(e,this.options.format,this.options.lang);(this.options.disallowLockDaysInRange?o.rangeIsLocked([i,r],this.options):o.dateIsLocked(i,this.options,[i,r])||o.dateIsLocked(r,this.options,[i,r]))&&!n?this.emit("error:range",[i,r]):(this.setStartDate(i),this.setEndDate(r),this.options.inlineMode&&this.render(),this.updateInput(),this.emit("selected",this.getStartDate(),this.getEndDate()))},r.Litepicker.prototype.gotoDate=function(t,e){void 0===e&&(e=0);var n=new s.DateTime(t);n.setDate(1),this.calendars[e]=n.clone(),this.render()},r.Litepicker.prototype.setLockDays=function(t){this.options.lockDays=s.DateTime.convertArray(t,this.options.lockDaysFormat),this.render()},r.Litepicker.prototype.setHighlightedDays=function(t){this.options.highlightedDays=s.DateTime.convertArray(t,this.options.highlightedDaysFormat),this.render()},r.Litepicker.prototype.setOptions=function(t){delete t.element,delete t.elementEnd,delete t.parentEl,t.startDate&&(t.startDate=new s.DateTime(t.startDate,this.options.format,this.options.lang)),t.endDate&&(t.endDate=new s.DateTime(t.endDate,this.options.format,this.options.lang));var e=i(i({},this.options.dropdowns),t.dropdowns),n=i(i({},this.options.buttonText),t.buttonText),r=i(i({},this.options.tooltipText),t.tooltipText);this.options=i(i({},this.options),t),this.options.dropdowns=i({},e),this.options.buttonText=i({},n),this.options.tooltipText=i({},r),!this.options.singleMode||this.options.startDate instanceof s.DateTime||(this.options.startDate=null,this.options.endDate=null),this.options.singleMode||this.options.startDate instanceof s.DateTime&&this.options.endDate instanceof s.DateTime||(this.options.startDate=null,this.options.endDate=null);for(var o=0;o'),null!==t.url){if(n+='"}this.createFromClickEvent(t,n)}createFromClickEvent(t,e){const n=this.getContextMenuElement();n.classList.contains("action-dropdown")||n.classList.add("action-dropdown"),n.innerHTML=e,n.style.position="fixed",n.style.top=t.clientY+"px",n.style.left=t.clientX+"px";const i=t=>{t.target.classList.contains("dropdown-toggle")||t.target.classList.contains("dropdown-divider")||(n.classList.remove("d-block"),n.classList.contains("d-none")||n.classList.add("d-none"),n.removeEventListener("click",i),document.removeEventListener("click",i))};n.addEventListener("click",i),document.addEventListener("click",i),n.classList.remove("d-none"),n.classList.contains("d-block")||n.classList.add("d-block")}static createForDataTable(t){[].slice.call(document.querySelectorAll(t)).map((t=>{null!==t.querySelector("td.actions div.dropdown-menu")&&t.addEventListener("contextmenu",(e=>{let n=e.target;for(;null!==n;){const t=n.tagName.toUpperCase();if("TH"===t||"TABLE"===t||"BODY"===t)return;if("TR"===t)break;n=n.parentNode}if(null===n||!n.matches("table.dataTable tbody tr"))return;const s=n.querySelector("td.actions div.dropdown-menu");if(null===s)return;e.preventDefault();new i(t.dataset.contextMenu).createFromClickEvent(e,s.innerHTML)}))}))}}},4028:function(t,e,n){n(4975),n(5844),n.g.KimaiPaginatedBoxWidget=n(4100).A,n.g.KimaiReloadPageWidget=n(5170).A,n.g.KimaiColor=n(9997).A,n.g.KimaiStorage=n(5247).A},4100:function(t,e,n){"use strict";n.d(e,{A:function(){return s}});var i=n(2758);class s{constructor(t){this.selector=t;const e=document.querySelector(this.selector);if(void 0!==e.dataset.reload){this.events=e.dataset.reload.split(" ");const t=()=>{let t=null;t=void 0!==document.querySelector(this.selector).dataset.reloadHref?document.querySelector(this.selector).dataset.reloadHref:document.querySelector(this.selector+" ul.pagination li.active a").href,this.loadPage(t)};for(const e of this.events)document.addEventListener(e,t)}document.body.addEventListener("click",(t=>{let e=t.target;e.matches(this.selector+" a.pagination-link")||(e=e.parentNode),e.matches(this.selector+" a.pagination-link")&&(t.preventDefault(),this.loadPage(e.href))}))}static create(t){return new s(t)}loadPage(t){const e=this.selector;document.dispatchEvent(new CustomEvent("kimai.reloadContent",{detail:this.selector}));const n=()=>{document.dispatchEvent(new Event("kimai.reloadedContent"))};window.kimai.getPlugin("fetch").fetch(t).then((t=>{t.text().then((t=>{const s=document.createElement("div");s.innerHTML=t,document.querySelector(e).replaceWith(this._makeScriptExecutable(s.firstElementChild)),i.A.createForDataTable(e+" table.dataTable"),n()}))})).catch((()=>{window.kimai.getPlugin("alert").error("Failed loading selected page"),n()}))}_makeScriptExecutable(t){if(void 0!==t.tagName&&"SCRIPT"===t.tagName){const e=document.createElement("script");e.text=t.innerHTML,t.parentNode.replaceChild(e,t)}else for(const e of t.childNodes)this._makeScriptExecutable(e);return t}}},4975:function(t,e,n){"use strict";n.r(e)},5170:function(t,e,n){"use strict";n.d(e,{A:function(){return i}});class i{constructor(t,e){const n=()=>{e?document.location.reload():this._loadPage(document.location)};for(const e of t.split(" "))document.addEventListener(e,n)}static create(t,e){return null==e&&(e=!1),new i(t,e)}_showOverlay(){document.dispatchEvent(new CustomEvent("kimai.reloadContent",{detail:"div.page-wrapper"}))}_hideOverlay(){document.dispatchEvent(new Event("kimai.reloadedContent"))}_loadPage(t){this._showOverlay(),window.kimai.getPlugin("fetch").fetch(t).then((t=>{t.text().then((t=>{const e=document.createElement("div");e.innerHTML=t;const n=e.querySelector("section.content");document.querySelector("section.content").replaceWith(n),document.dispatchEvent(new Event("kimai.reloadPage")),this._hideOverlay()}))})).catch((()=>{this._hideOverlay(),document.location=t}))}}},5247:function(t,e,n){"use strict";n.d(e,{A:function(){return i}});class i{static set(t,e){window.localStorage.setItem(t,JSON.stringify(e))}static get(t){let e=window.localStorage.getItem(t);return null==e?null:JSON.parse(e)}static remove(t){window.localStorage.removeItem(t)}}},5844:function(t,e,n){"use strict";var i=n(8097);class s{constructor(t){this._translations=t}get(t){return this._translations[t]}has(t){return t in this._translations}}class r{constructor(t){this._configurations=t}get(t){return this._configurations[t]}has(t){return t in this._configurations}isRTL(){return"rtl"===this.get("direction")}getLanguage(){return this.get("locale").replace("_","-")}is24Hours(){return!!this.get("twentyFourHours")}getFirstDayOfWeek(t=!0){void 0===t&&(t=!0);let e=this.get("first_dow_iso");return t||(e%=7),e}}class o{init(){}getId(){return null}setContainer(t){if(!(t instanceof a))throw new Error("Plugin was given an invalid KimaiContainer");this._core=t}getContainer(){return this._core}getConfiguration(t){return this.getContainer().getConfiguration().get(t)}getConfigurations(){return this.getContainer().getConfiguration()}getDateUtils(){return this.getPlugin("date")}getPlugin(t){return this.getContainer().getPlugin(t)}getTranslation(){return this.getContainer().getTranslation()}translate(t){return this.getTranslation().get(t)}escape(t){return this.getPlugin("escape").escapeForHtml(t)}trigger(t,e=null){this.getPlugin("event").trigger(t,e)}fetch(t,e={}){return this.getPlugin("fetch").fetch(t,e)}fetchForm(t,e={},n=null){n=n||t.getAttribute("action");const i=t.getAttribute("method").toUpperCase();if("GET"===i){const i=this.getPlugin("form").convertFormDataToQueryString(t,{},!0);n=n+(n.includes("?")?"&":"?")+i,e={method:"GET",...e}}else"POST"===i&&(e={method:"POST",body:new FormData(t),...e});return this.fetch(n,e)}isMobile(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)<576}}class a{constructor(t,e){if(!(t instanceof r))throw new Error("Configuration needs to a KimaiConfiguration instance");if(this._configuration=t,!(e instanceof s))throw new Error("Configuration needs to a KimaiTranslation instance");this._translation=e,this._plugins=[]}registerPlugin(t){if(!(t instanceof o))throw new Error("Invalid plugin given, needs to be a KimaiPlugin instance");return t.setContainer(this),this._plugins.push(t),t}getPlugin(t){for(let e of this._plugins)if(null!==e.getId()&&e.getId()===t)return e;throw new Error("Unknown plugin: "+t)}getPlugins(){return this._plugins}getTranslation(){return this._translation}getConfiguration(){return this._configuration}getUser(){return this.getPlugin("user")}}class l extends o{constructor(t){super(),this.dataAttribute=t}getId(){return"datatable-column-visibility"}init(){let t=document.querySelector("["+this.dataAttribute+"]");if(null!==t){this._id=t.getAttribute(this.dataAttribute),this._modal=document.getElementById("modal_"+this._id),this._modal.addEventListener("show.bs.modal",(()=>{this._evaluateCheckboxes()})),this._modal.querySelector("button[data-type=save]").addEventListener("click",(()=>{this._saveVisibility()})),this._modal.querySelector("button[data-type=reset]").addEventListener("click",(t=>{this._resetVisibility(t.currentTarget)})),this._modal.querySelectorAll("input[name=datatable_profile]").forEach((t=>{t.addEventListener("change",(()=>{const e=this._modal.getElementsByTagName("form")[0];this.fetchForm(e,{},t.getAttribute("data-href")).then((()=>{localStorage.setItem("kimai_profile",t.getAttribute("value")),document.location.reload()})).catch((()=>{e.setAttribute("action",t.getAttribute("data-href")),e.submit()}))}))}));for(let t of this._modal.querySelectorAll("form input[type=checkbox]"))t.addEventListener("change",(()=>{this._changeVisibility(t.getAttribute("name"),t.checked)}))}}_evaluateCheckboxes(){const t=this._modal.getElementsByTagName("form")[0],e=document.getElementsByClassName("datatable_"+this._id)[0];for(let n of e.getElementsByTagName("th")){const e=n.getAttribute("data-field");if(null===e)continue;const i=t.querySelector("input[name="+e+"]");null!==i&&(i.checked="none"!==window.getComputedStyle(n).display)}}_saveVisibility(){const t=this._modal.getElementsByTagName("form")[0];this.fetchForm(t).then((()=>{document.location.reload()})).catch((()=>{t.submit()}))}_resetVisibility(t){const e=this._modal.getElementsByTagName("form")[0];this.fetchForm(e,{},t.getAttribute("formaction")).then((()=>{document.location.reload()})).catch((()=>{e.setAttribute("action",t.getAttribute("formaction")),e.submit()}))}_changeVisibility(t,e){for(const n of document.getElementsByClassName("datatable_"+this._id)){let i=null;for(let s of n.getElementsByClassName("col_"+t)){if(null===i){let t="-none",n="d-table-cell";e||(t="-table-cell",n="d-none"),i="",s.classList.forEach((function(e,n,s){-1===e.indexOf(t)&&(i+=" "+e)})),-1===i.indexOf(n)&&(i+=" "+n)}s.className=i}}}}var c=n(9336);class u extends o{init(){[].slice.call(document.querySelectorAll('[data-toggle="tooltip"]')).map((function(t){return new c.m_(t)}));[...document.querySelectorAll(".offcanvas")].map((t=>new c.go(t)));this.getContainer().getPlugin("form").activateForm("div.page-wrapper form"),this._registerModalAutofocus("#remote_form_modal"),this.overlay=null,document.addEventListener("kimai.reloadContent",(t=>{if(null!==this.overlay)return;let e="body";void 0!==t.detail&&null!==t.detail&&(e=t.detail);const n=document.createElement("div");n.innerHTML='
',this.overlay=n.firstElementChild,document.querySelector(e).append(this.overlay)})),document.addEventListener("kimai.reloadedContent",(()=>{null!==this.overlay&&(this.overlay.remove(),this.overlay=null)}))}_registerModalAutofocus(t){if(this.isMobile())return;const e=document.querySelector(t);null!==e&&e.addEventListener("shown.bs.modal",(()=>{const t=e.querySelector("form");let n=t.querySelectorAll("[autofocus]");n.length<1&&(n=t.querySelectorAll("input[type=text],input[type=date],textarea,select")),n.length>0&&n[0].focus()}))}}var d=n(424);n(8214);class h extends o{supportsForm(t){return!1}activateForm(t){}destroyForm(t){}}class p extends h{constructor(t){super(),this._selector=t}init(){window.disableLitepickerStyles=!0,this._pickers=[]}supportsForm(t){return!0}activateForm(t){const e=this.getConfigurations().getFirstDayOfWeek(!1),n=this.getConfigurations().getLanguage();let i={buttonText:{previousMonth:'',nextMonth:'',apply:this.translate("confirm"),cancel:this.translate("cancel")}};const s=[].slice.call(t.querySelectorAll(this._selector)).map((t=>(void 0===t.dataset.format&&console.log("Trying to bind litepicker to an element without data-format attribute"),void 0!==t.hasAttribute("min")&&(i={...i,minDate:t.getAttribute("min")}),void 0!==t.hasAttribute("max")&&(i={...i,maxDate:t.getAttribute("max")}),i={...i,format:t.dataset.format,showTooltip:!1,element:t,lang:n,autoRefresh:!0,firstDay:e,setup:e=>{e.on("preselect",((t,n)=>{e._wasPreselected=!0})),e.on("selected",((n,i)=>{void 0!==e._wasPreselected&&(t.dispatchEvent(new Event("change",{bubbles:!0})),delete e._wasPreselected)})),void 0!==e.backdrop&&document.body.appendChild(e.backdrop)}},[t,new d.Litepicker(this.prepareOptions(i))])));this._pickers=this._pickers.concat(s)}prepareOptions(t){return{...t,plugins:["mobilefriendly"]}}destroyForm(t){[].slice.call(t.querySelectorAll(this._selector)).map((t=>{for(let e=0;e{this.reloadDatatable()};for(let t of e.split(" "))document.addEventListener(t,n);document.addEventListener("pagination-change",n),document.addEventListener("filter-change",n)}registerContextMenu(t){f.A.createForDataTable(t)}reloadDatatable(){const t=this.getContainer().getPlugin("toolbar").getSelector(),e=document.querySelector(t),n=t=>{const e=document.createElement("div");e.innerHTML=t;const n=e.querySelector(this._contentArea);document.querySelector(this._contentArea).replaceWith(n),this.registerContextMenu(this._selector),document.dispatchEvent(new Event("kimai.reloadedContent"))};document.dispatchEvent(new CustomEvent("kimai.reloadContent",{detail:this._contentArea})),null!==e?this.fetchForm(e).then((t=>{t.text().then(n)})).catch((()=>{e.submit()})):this.fetch(document.location).then((t=>{t.text().then(n)})).catch((()=>{document.location.reload()}))}}class v extends o{constructor(t,e){super(),this._formSelector=t,this._actionClass=e}getId(){return"toolbar"}init(){const t=this.getSelector();this._registerPagination(t),this._registerSortableTables(t),this._registerAlternativeSubmitActions(t,this._actionClass),[].slice.call(document.querySelectorAll(t+" input")).map((e=>{e.addEventListener("change",(e=>{switch(e.target.id){case"order":case"orderBy":case"page":break;default:document.querySelector(t+" input#page").value=1}})),this.triggerChange()})),[].slice.call(document.querySelectorAll(t+" select")).map((e=>{e.addEventListener("change",(e=>{let n=!0;switch(e.target.id){case"customer":null!==document.querySelector(t+" select#project")&&(n=!1);break;case"project":null!==document.querySelector(t+" select#activity")&&(n=!1)}document.querySelector(t+" input#page").value=1,n&&this.triggerChange()}))}))}_registerAlternativeSubmitActions(t,e){document.addEventListener("click",(function(n){let i=n.target;for(;null!==i&&"function"==typeof i.matches&&!i.matches("body");){if(i.classList.contains(e)){const e=document.querySelector(t);if(null===e)return;const s=e.getAttribute("action"),r=e.getAttribute("method");void 0!==i.dataset.target&&(e.target=i.dataset.target),e.action=i.href,void 0!==i.dataset.method&&(e.method=i.dataset.method),e.submit(),e.target="",e.action=s,e.method=r,n.preventDefault(),n.stopPropagation()}i=i.parentNode}}))}_registerSortableTables(t){document.body.addEventListener("click",(e=>{if(!e.target.matches("th.sortable"))return;let n="DESC",i=e.target.dataset.order;e.target.classList.contains("sorting_desc")&&(n="ASC"),document.querySelector(t+" #orderBy").value=i,document.querySelector(t+" #order").value=n,document.querySelector(t+" #orderBy").dispatchEvent(new Event("change")),document.querySelector(t+" #order").dispatchEvent(new Event("change")),document.dispatchEvent(new Event("filter-change"))}))}_registerPagination(t){document.body.addEventListener("click",(e=>{if(!(e.target.matches("ul.pagination li a")||null!==e.target.parentNode&&e.target.parentNode.matches("ul.pagination li a")))return;let n=document.querySelector(t+" input#page");if(null===n)return;let i=e.target;i.matches("a")||(i=i.parentNode),e.preventDefault(),e.stopPropagation();let s=i.href.split("/"),r=s[s.length-1];return/\d/.test(r)||(r=1),n.value=r,n.dispatchEvent(new Event("change")),document.dispatchEvent(new Event("pagination-change")),!1}))}triggerChange(){document.dispatchEvent(new Event("toolbar-change"))}getSelector(){return this._formSelector}}class y extends o{getId(){return"api"}_headers(){const t=new Headers;return t.append("Content-Type","application/json"),t}get(t,e,n,i){if(void 0!==e){const n=new URLSearchParams(e).toString();""!==n&&(t=t+(t.includes("?")?"&":"?")+n)}void 0===i&&(i=t=>{this.handleError("An error occurred",t)}),this.fetch(t,{method:"GET",headers:this._headers()}).then((t=>{t.json().then((t=>{n(t)}))})).catch((t=>{i(t)}))}post(t,e,n,i){void 0===i&&(i=t=>{this.handleError("action.update.error",t)}),this.fetch(t,{method:"POST",body:this._parseData(e),headers:this._headers()}).then((t=>{t.json().then((t=>{n(t)}))})).catch((t=>{i(t)}))}patch(t,e,n,i){void 0===i&&(i=t=>{this.handleError("action.update.error",t)}),this.fetch(t,{method:"PATCH",body:this._parseData(e),headers:this._headers()}).then((t=>{204===t.statusCode?n():t.json().then((t=>{n(t)}))})).catch((t=>{i(t)}))}delete(t,e,n){void 0===n&&(n=t=>{this.handleError("action.delete.error",t)}),this.fetch(t,{method:"DELETE",headers:this._headers()}).then((()=>{e()})).catch((t=>{n(t)}))}_parseData(t){return"object"==typeof t?JSON.stringify(t):t}handleError(t,e){if(void 0===e.headers)return;const n=e.headers.get("content-type");n&&-1!==n.indexOf("application/json")?e.json().then((n=>{let i=n.message;if(400===e.status&&n.errors){let t=[""+i+""];if(n.errors.errors)for(let e of n.errors.errors)t.push(e);if(n.errors.children)for(let e in n.errors.children){let i=n.errors.children[e];if(void 0!==i.errors&&i.errors.length>0)for(let e of i.errors)t.push(e)}t.length>0&&(i=t)}this.getPlugin("alert").error(t,i)})):e.text().then((()=>{const n="["+e.statusCode+"] "+e.statusText;this.getPlugin("alert").error(t,n)}))}}class b extends o{addClickHandler(t,e,n){document.body.addEventListener("click",(i=>{let s=i.target;for(;null!==s;){const e=s.tagName.toUpperCase();if("BODY"===e)return;if(s.matches(t))break;if("A"===e||"BUTTON"===e||"INPUT"===e||"LABEL"===e)return;for(let t of n)if(s.matches(t))return;s=s.parentNode}if(null===s)return;if(s.isContentEditable||s.parentNode.isContentEditable)return;if(!s.matches(t))return;for(let t of n)if(s.matches(t))return;i.preventDefault(),i.stopPropagation();let r=s.dataset.href;null==r&&(r=s.href),null!=r&&""!==r&&e(r)}))}}class _ extends b{constructor(t){super(),this._selector=t}init(){this.addClickHandler(this._selector,(function(t){window.location=t}),[])}}class w extends b{constructor(t,e){super(),this._selector=t,this._stopSelector=e}getId(){return"modal"}init(){this._isDirty=!1;const t=this._getModalElement();null!==t&&(t.addEventListener("hide.bs.modal",(e=>{if(this._isDirty){if(null===t.querySelector(".modal-body .remote_modal_is_dirty_warning")){const e=this.translate("modal.dirty"),n=document.createElement("div");n.innerHTML='

'+e+"

",t.querySelector(".modal-body").prepend(n.firstElementChild)}e.preventDefault()}else this._isDirty=!1,document.dispatchEvent(new Event("modal-hide"))})),t.addEventListener("hidden.bs.modal",(()=>{this.getContainer().getPlugin("form").destroyForm(this._getFormIdentifier()),t.querySelector(".modal-body").replaceWith("")})),t.addEventListener("show.bs.modal",(()=>{document.dispatchEvent(new Event("modal-show"))})),this.addClickHandler(this._selector,(t=>{this.openUrlInModal(t)}),this._stopSelector))}_getModal(){return c.aF.getOrCreateInstance(this._getModalElement())}openUrlInModal(t,e){const n=new Headers;n.append("X-Requested-With","Kimai-Modal"),this.fetch(t,{method:"GET",redirect:"follow",headers:n}).then((e=>{if(e.ok)return e.text().then((t=>{this._openFormInModal(t)}));window.location=t})).catch((n=>{null==e?window.location=t:e(n)}))}_getFormIdentifier(){return"#remote_form_modal .modal-content form"}_getModalElement(){return document.getElementById("remote_form_modal")}_makeScriptExecutable(t){if(void 0!==t.tagName&&"SCRIPT"===t.tagName){const e=document.createElement("script");e.text=t.innerHTML,t.parentNode.replaceChild(e,t)}else for(const e of t.childNodes)this._makeScriptExecutable(e);return t}_openFormInModal(t){const e=this._getFormIdentifier();let n=this._getModalElement();const i=document.createElement("div");i.innerHTML=t;const s=this._makeScriptExecutable(i.querySelector("#form_modal .modal-content"));if(null!==s){let t=n.querySelector(".modal-dialog"),r=i.querySelector(".modal-dialog").classList.contains("modal-lg");r&&!t.classList.contains("modal-lg")&&t.classList.toggle("modal-lg"),!r&&t.classList.contains("modal-lg")&&t.classList.toggle("modal-lg"),n.querySelector(".modal-content").replaceWith(s),[].slice.call(n.querySelectorAll('[data-bs-dismiss="modal"]')).map((t=>{t.addEventListener("click",(()=>{this._isDirty=!1,this._getModal().hide()}))})),this.getContainer().getPlugin("form").activateForm(e)}let r=i.querySelector("div.alert");null!==r&&n.querySelector(".modal-body").prepend(r);const o=document.querySelector(e);o.addEventListener("change",(()=>{this._isDirty=!0})),o.addEventListener("submit",this._getEventHandler()),this._getModal().show()}_getEventHandler(){return void 0===this.eventHandler&&(this.eventHandler=t=>{const e=t.target;if(void 0!==e.target&&""!==e.target)return!0;const n=document.querySelector(this._getFormIdentifier()+" button[type=submit]");n.textContent=n.textContent+" …",n.disabled=!0;const i=e.dataset.formEvent,s=this.getContainer().getPlugin("event"),r=this.getContainer().getPlugin("alert");t.preventDefault(),t.stopPropagation();const o=new Headers;o.append("X-Requested-With","Kimai-Modal");const a={headers:o};this.fetchForm(e,a).then((t=>{t.text().then((t=>{const o=document.createElement("div");o.innerHTML=t;let a=!1,l=!1,c=!1;n.textContent=n.textContent.replace(" …",""),n.disabled=!1;const u=o.querySelector("#form_modal .modal-content");if(null!==u&&(a=null!==u.querySelector(".is-invalid"),a||(a=null!==u.querySelector(".invalid-feedback")),l=null!==u.querySelector("ul.list-unstyled li.text-danger"),c=null!==o.querySelector("div.alert-danger")),a||l||c)this._openFormInModal(t);else{s.trigger(i);let t=e.dataset.msgSuccess;null!=t&&""!==t||(t="action.update.success"),this._isDirty=!1,this._getModal().hide(),r.success(t)}}))})).catch((t=>{let i=e.dataset.msgError;null!=i&&""!==i||(i="action.update.error"),r.error(i,t.message),setTimeout((()=>{n.textContent=n.textContent.replace(" …",""),n.disabled=!1}),1500)}))}),this.eventHandler}}class k extends o{constructor(){super(),this._selector=".ticktac-menu",this._selectorEmpty=".ticktac-menu-empty",this._favIconUrl=null}getId(){return"active-records"}init(){if(null===document.querySelector(this._selector))return;const t=()=>{this.reloadActiveRecords()};document.addEventListener("kimai.timesheetUpdate",t),document.addEventListener("kimai.timesheetDelete",t),document.addEventListener("kimai.activityUpdate",t),document.addEventListener("kimai.activityDelete",t),document.addEventListener("kimai.projectUpdate",t),document.addEventListener("kimai.projectDelete",t),document.addEventListener("kimai.customerUpdate",t),document.addEventListener("kimai.customerDelete",t),this._updateBrowserTitle=!!this.getConfiguration("updateBrowserTitle");const e=()=>{this._updateDuration()};this._updatesHandler=setInterval(e,1e4),document.addEventListener("kimai.timesheetUpdate",e),document.addEventListener("kimai.reloadedContent",e)}_updateDuration(){const t=document.querySelectorAll('[data-since]:not([data-since=""])');if(this._updateBrowserTitle&&this._changeFavicon(t.length>0),0===t.length)return void(this._updateBrowserTitle&&(void 0===document.body.dataset.title?this._updateBrowserTitle=!1:document.title=document.body.dataset.title));const e=this.getDateUtils();let n=[];for(const i of t){const t=e.formatDuration(i.dataset.since);void 0!==i.dataset.replacer&&null!==i.dataset.title&&"?"!==t&&n.push(t),i.textContent=t}0!==n.length&&this._updateBrowserTitle&&(document.title=n.shift())}_setEntries(t){const e=t.length>0;for(let t of document.querySelectorAll(this._selectorEmpty))t.style.display=e?"none":"inline-block";for(let n of document.querySelectorAll(this._selector)){if(n.style.display=e?"inline-block":"none",!e)for(let t of n.querySelectorAll("[data-since]"))t.dataset.since="";const i=n.querySelector(".ticktac-stop");e?(i&&(i.accesskey="s"),this._replaceInNode(n,t[0])):i&&(i.accesskey=null)}this._updateDuration()}_replaceInNode(t,e){const n=this.getDateUtils(),i=t.querySelectorAll("[data-replacer]");for(let s of i){const i=s.dataset.replacer;"url"===i?s.dataset.href=t.dataset.href.replace("000",e.id):"activity"===i?s.innerText=e.activity.name:"project"===i?s.innerText=e.project.name:"customer"===i?s.innerText=e.project.customer.name:"duration"===i&&(s.dataset.since=e.begin,s.innerText=n.formatDuration(e.duration))}}reloadActiveRecords(){const t=this.getContainer().getPlugin("api"),e=document.querySelector(this._selector).dataset.api;t.get(e,{},(t=>{this._setEntries(t)}))}_changeFavicon(t){const e=document.createElement("canvas"),n=document.getElementById("favicon");null===this._favIconUrl&&(this._favIconUrl=n.href);const i=n.cloneNode(!0);if(e.getContext&&i){const s=window.devicePixelRatio,r=document.createElement("img");e.height=e.width=16*s,r.onload=function(){const r=e.getContext("2d");if(r.drawImage(this,0,0,e.width,e.height),t){const t=5.5*s;r.fillStyle="rgb(182,57,57)",r.fillRect(e.width/2-t/2,e.height/2-t/2,t,t)}i.href=e.toDataURL("image/png"),n.remove(),document.head.appendChild(i)},r.src=this._favIconUrl}}}class T extends o{getId(){return"event"}trigger(t,e=null){if(""!==t)for(const n of t.split(" ")){let t=new Event(n);null!==e&&(t=new CustomEvent(n,{detail:e})),document.dispatchEvent(t)}}}class E extends o{constructor(t){super(),this._selector=t}init(){document.addEventListener("click",(t=>{let e=t.target;for(;null!==e&&"function"==typeof e.matches&&!e.matches("body");){if(e.classList.contains(this._selector)){const n=e.dataset;let i=n.href;i||(i=e.getAttribute("href")),void 0!==n.question?this.getContainer().getPlugin("alert").question(n.question,(t=>{t&&this._callApi(i,n)})):this._callApi(i,n),t.preventDefault(),t.stopPropagation()}e=e.parentNode}}))}_callApi(t,e){const n=e.method,i=e.event,s=this.getContainer().getPlugin("api"),r=this.getContainer().getPlugin("event"),o=this.getContainer().getPlugin("alert"),a=()=>{r.trigger(i),void 0!==e.msgSuccess&&o.success(e.msgSuccess)},l=t=>{let n="action.update.error";void 0!==e.msgError&&(n=e.msgError),s.handleError(n,t)};let c={};if(void 0!==e.payload&&(c=e.payload),"PATCH"===n)s.patch(t,c,a,l);else if("POST"===n){let e={};s.post(t,e,a,l)}else"DELETE"===n?s.delete(t,a,l):"GET"===n&&s.get(t,c,a,l)}}class D extends o{getId(){return"alert"}error(t,e){const n=this.getTranslation();n.has(t)&&(t=n.get(t)),t=t.replace("%reason%",""),void 0===e&&(e=null),null!==e&&(n.has(e)&&(e=n.get(e)),Array.isArray(e)&&(e=e.join("
")));const i="alert_global_error",s=document.getElementById(i);null!==s&&c.aF.getOrCreateInstance(s).hide();const r='\n
\n ";this._showModal(r)}warning(t){this._show("warning",t)}success(t){this._toast("success",t)}info(t){this._show("info",t)}_showModal(t){const e=document.body,n=document.createElement("template");n.innerHTML=t.trim();const i=n.content.firstChild;e.appendChild(i);const s=new c.aF(i);i.addEventListener("hidden.bs.modal",(function(){e.removeChild(i)})),s.show()}_show(t,e){const n=this.getTranslation();n.has(e)&&(e=n.get(e));const i='\n \n ";this._showModal(i)}_mapClass(t){return"info"===t||"success"===t||"warning"===t||"danger"===t?t:"error"===t?"danger":"primary"}_toast(t,e){const n=this.getTranslation();n.has(e)&&(e=n.get(e));let i='';"success"===t?i='':"warning"===t?i='':"danger"!==t&&"error"!==t||(i='');const s='',r=document.getElementById("toast-container"),o=document.createElement("template");o.innerHTML=s.trim();const a=o.content.firstChild;r.appendChild(a);const l=new c.y8(a);a.addEventListener("hidden.bs.toast",(function(){r.removeChild(a)})),l.show()}question(t,e){const n=this.getTranslation();n.has(t)&&(t=n.get(t));const i=this._mapClass("info"),s='\n \n ",r=document.body,o=document.createElement("template");o.innerHTML=s.trim();const a=o.content.firstChild;r.appendChild(a),a.querySelector(".question-confirm").addEventListener("click",(()=>{e(!0)})),a.querySelector(".question-cancel").addEventListener("click",(()=>{e(!1)}));const l=new c.aF(a);a.addEventListener("hidden.bs.modal",(()=>{r.removeChild(a)})),l.show()}}function x(t,e){t.split(/\s+/).forEach((t=>{e(t)}))}class S{constructor(){this._events={}}on(t,e){x(t,(t=>{const n=this._events[t]||[];n.push(e),this._events[t]=n}))}off(t,e){var n=arguments.length;0!==n?x(t,(t=>{if(1===n)return void delete this._events[t];const i=this._events[t];void 0!==i&&(i.splice(i.indexOf(e),1),this._events[t]=i)})):this._events={}}trigger(t,...e){var n=this;x(t,(t=>{const i=n._events[t];void 0!==i&&i.forEach((t=>{t.apply(n,e)}))}))}}const O=t=>(t=t.filter(Boolean)).length<2?t[0]||"":1==I(t)?"["+t.join("")+"]":"(?:"+t.join("|")+")",L=t=>{if(!M(t))return t.join("");let e="",n=0;const i=()=>{n>1&&(e+="{"+n+"}")};return t.forEach(((s,r)=>{s!==t[r-1]?(i(),e+=s,n=1):n++})),i(),e},C=t=>{let e=Array.from(t);return O(e)},M=t=>new Set(t).size!==t.length,A=t=>(t+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),I=t=>t.reduce(((t,e)=>Math.max(t,N(e))),0),N=t=>Array.from(t).length,F=t=>{if(1===t.length)return[[t]];let e=[];const n=t.substring(1);return F(n).forEach((function(n){let i=n.slice(0);i[0]=t.charAt(0)+i[0],e.push(i),i=n.slice(0),i.unshift(t.charAt(0)),e.push(i)})),e},P=[[0,65535]];let j,q;const H={},V={"/":"⁄∕",0:"߀",a:"ⱥɐɑ",aa:"ꜳ",ae:"æǽǣ",ao:"ꜵ",au:"ꜷ",av:"ꜹꜻ",ay:"ꜽ",b:"ƀɓƃ",c:"ꜿƈȼↄ",d:"đɗɖᴅƌꮷԁɦ",e:"ɛǝᴇɇ",f:"ꝼƒ",g:"ǥɠꞡᵹꝿɢ",h:"ħⱨⱶɥ",i:"ɨı",j:"ɉȷ",k:"ƙⱪꝁꝃꝅꞣ",l:"łƚɫⱡꝉꝇꞁɭ",m:"ɱɯϻ",n:"ꞥƞɲꞑᴎлԉ",o:"øǿɔɵꝋꝍᴑ",oe:"œ",oi:"ƣ",oo:"ꝏ",ou:"ȣ",p:"ƥᵽꝑꝓꝕρ",q:"ꝗꝙɋ",r:"ɍɽꝛꞧꞃ",s:"ßȿꞩꞅʂ",t:"ŧƭʈⱦꞇ",th:"þ",tz:"ꜩ",u:"ʉ",v:"ʋꝟʌ",vy:"ꝡ",w:"ⱳ",y:"ƴɏỿ",z:"ƶȥɀⱬꝣ",hv:"ƕ"};for(let t in V){let e=V[t]||"";for(let n=0;nt.normalize(e),R=t=>Array.from(t).reduce(((t,e)=>t+W(e)),""),W=t=>(t=B(t).toLowerCase().replace($,(t=>H[t]||"")),B(t,"NFC"));const z=t=>{const e={},n=(t,n)=>{const i=e[t]||new Set,s=new RegExp("^"+C(i)+"$","iu");n.match(s)||(i.add(A(n)),e[t]=i)};for(let e of function*(t){for(const[e,n]of t)for(let t=e;t<=n;t++){let e=String.fromCharCode(t),n=R(e);n!=e.toLowerCase()&&(n.length>3||0!=n.length&&(yield{folded:n,composed:e,code_point:t}))}}(t))n(e.folded,e.folded),n(e.folded,e.composed);return e},U=t=>{const e=z(t),n={};let i=[];for(let t in e){let s=e[t];s&&(n[t]=C(s)),t.length>1&&i.push(A(t))}i.sort(((t,e)=>e.length-t.length));const s=O(i);return q=new RegExp("^"+s,"u"),n},Y=(t,e=1)=>(e=Math.max(e,t.length-1),O(F(t).map((t=>((t,e=1)=>{let n=0;return t=t.map((t=>(j[t]&&(n+=t.length),j[t]||t))),n>=e?L(t):""})(t,e))))),Z=(t,e=!0)=>{let n=t.length>1?1:0;return O(t.map((t=>{let i=[];const s=e?t.length():t.length()-1;for(let e=0;e{for(const n of e){if(n.start!=t.start||n.end!=t.end)continue;if(n.substrs.join("")!==t.substrs.join(""))continue;let e=t.parts;const i=t=>{for(const n of e){if(n.start===t.start&&n.substr===t.substr)return!1;if(1!=t.length&&1!=n.length){if(t.startn.start)return!0;if(n.startt.start)return!0}}return!1};if(!(n.parts.filter(i).length>0))return!0}return!1};class J{parts;substrs;start;end;constructor(){this.parts=[],this.substrs=[],this.start=0,this.end=0}add(t){t&&(this.parts.push(t),this.substrs.push(t.substr),this.start=Math.min(t.start,this.start),this.end=Math.max(t.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(t,e){let n=new J,i=JSON.parse(JSON.stringify(this.parts)),s=i.pop();for(const t of i)n.add(t);let r=e.substr.substring(0,t-s.start),o=r.length;return n.add({start:s.start,end:s.start+o,length:o,substr:r}),n}}const G=t=>{var e;void 0===j&&(j=U(e||P)),t=R(t);let n="",i=[new J];for(let e=0;e0){a=a.sort(((t,e)=>t.length()-e.length()));for(let t of a)K(t,i)||i.push(t)}else if(e>0&&1==l.size&&!l.has("3")){n+=Z(i,!1);let t=new J;const e=i[0];e&&t.add(e.last()),i=[t]}}return n+=Z(i,!0),n},Q=(t,e)=>{if(t)return t[e]},X=(t,e)=>{if(t){for(var n,i=e.split(".");(n=i.shift())&&(t=t[n]););return t}},tt=(t,e,n)=>{var i,s;return t?(t+="",null==e.regex||-1===(s=t.search(e.regex))?0:(i=e.string.length/t.length,0===s&&(i+=.5),i*n)):0},et=(t,e)=>{var n=t[e];if("function"==typeof n)return n;n&&!Array.isArray(n)&&(t[e]=[n])},nt=(t,e)=>{if(Array.isArray(t))t.forEach(e);else for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)},it=(t,e)=>"number"==typeof t&&"number"==typeof e?t>e?1:t(e=R(e+"").toLowerCase())?1:e>t?-1:0;class st{items;settings;constructor(t,e){this.items=t,this.settings=e||{diacritics:!0}}tokenize(t,e,n){if(!t||!t.length)return[];const i=[],s=t.split(/\s+/);var r;return n&&(r=new RegExp("^("+Object.keys(n).map(A).join("|")+"):(.*)$")),s.forEach((t=>{let n,s=null,o=null;r&&(n=t.match(r))&&(s=n[1],t=n[2]),t.length>0&&(o=this.settings.diacritics?G(t)||null:A(t),o&&e&&(o="\\b"+o)),i.push({string:t,regex:o?new RegExp(o,"iu"):null,field:s})})),i}getScoreFunction(t,e){var n=this.prepareSearch(t,e);return this._getScoreFunction(n)}_getScoreFunction(t){const e=t.tokens,n=e.length;if(!n)return function(){return 0};const i=t.options.fields,s=t.weights,r=i.length,o=t.getAttrFn;if(!r)return function(){return 1};const a=1===r?function(t,e){const n=i[0].field;return tt(o(e,n),t,s[n]||1)}:function(t,e){var n=0;if(t.field){const i=o(e,t.field);!t.regex&&i?n+=1/r:n+=tt(i,t,1)}else nt(s,((i,s)=>{n+=tt(o(e,s),t,i)}));return n/r};return 1===n?function(t){return a(e[0],t)}:"and"===t.options.conjunction?function(t){var i,s=0;for(let n of e){if((i=a(n,t))<=0)return 0;s+=i}return s/n}:function(t){var i=0;return nt(e,(e=>{i+=a(e,t)})),i/n}}getSortFunction(t,e){var n=this.prepareSearch(t,e);return this._getSortFunction(n)}_getSortFunction(t){var e,n=[];const i=this,s=t.options,r=!t.query&&s.sort_empty?s.sort_empty:s.sort;if("function"==typeof r)return r.bind(this);const o=function(e,n){return"$score"===e?n.score:t.getAttrFn(i.items[n.id],e)};if(r)for(let e of r)(t.query||"$score"!==e.field)&&n.push(e);if(t.query){e=!0;for(let t of n)if("$score"===t.field){e=!1;break}e&&n.unshift({field:"$score",direction:"desc"})}else n=n.filter((t=>"$score"!==t.field));return n.length?function(t,e){var i,s;for(let r of n){if(s=r.field,i=("desc"===r.direction?-1:1)*it(o(s,t),o(s,e)))return i}return 0}:null}prepareSearch(t,e){const n={};var i=Object.assign({},e);if(et(i,"sort"),et(i,"sort_empty"),i.fields){et(i,"fields");const t=[];i.fields.forEach((e=>{"string"==typeof e&&(e={field:e,weight:1}),t.push(e),n[e.field]="weight"in e?e.weight:1})),i.fields=t}return{options:i,query:t.toLowerCase().trim(),tokens:this.tokenize(t,i.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:i.nesting?X:Q}}search(t,e){var n,i,s=this;i=this.prepareSearch(t,e),e=i.options,t=i.query;const r=e.score||s._getScoreFunction(i);t.length?nt(s.items,((t,s)=>{n=r(t),(!1===e.filter||n>0)&&i.items.push({score:n,id:s})})):nt(s.items,((t,e)=>{i.items.push({score:1,id:e})}));const o=s._getSortFunction(i);return o&&i.items.sort(o),i.total=i.items.length,"number"==typeof e.limit&&(i.items=i.items.slice(0,e.limit)),i}}const rt=t=>null==t?null:ot(t),ot=t=>"boolean"==typeof t?t?"1":"0":t+"",at=t=>(t+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),lt=(t,e)=>{var n;return function(i,s){var r=this;n&&(r.loading=Math.max(r.loading-1,0),clearTimeout(n)),n=setTimeout((function(){n=null,r.loadedSearches[i]=!0,t.call(r,i,s)}),e)}},ct=(t,e,n)=>{var i,s=t.trigger,r={};for(i of(t.trigger=function(){var n=arguments[0];if(-1===e.indexOf(n))return s.apply(t,arguments);r[n]=arguments},n.apply(t,[]),t.trigger=s,e))i in r&&s.apply(t,r[i])},ut=(t,e=!1)=>{t&&(t.preventDefault(),e&&t.stopPropagation())},dt=(t,e,n,i)=>{t.addEventListener(e,n,i)},ht=(t,e)=>!!e&&(!!e[t]&&1===(e.altKey?1:0)+(e.ctrlKey?1:0)+(e.shiftKey?1:0)+(e.metaKey?1:0)),pt=(t,e)=>{const n=t.getAttribute("id");return n||(t.setAttribute("id",e),e)},mt=t=>t.replace(/[\\"']/g,"\\$&"),ft=(t,e)=>{e&&t.append(e)},gt=(t,e)=>{if(Array.isArray(t))t.forEach(e);else for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)},vt=t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if(yt(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)},yt=t=>"string"==typeof t&&t.indexOf("<")>-1,bt=(t,e)=>{var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!1),t.dispatchEvent(n)},_t=(t,e)=>{Object.assign(t.style,e)},wt=(t,...e)=>{var n=Tt(e);(t=Et(t)).map((t=>{n.map((e=>{t.classList.add(e)}))}))},kt=(t,...e)=>{var n=Tt(e);(t=Et(t)).map((t=>{n.map((e=>{t.classList.remove(e)}))}))},Tt=t=>{var e=[];return gt(t,(t=>{"string"==typeof t&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))})),e.filter(Boolean)},Et=t=>(Array.isArray(t)||(t=[t]),t),Dt=(t,e,n)=>{if(!n||n.contains(t))for(;t&&t.matches;){if(t.matches(e))return t;t=t.parentNode}},xt=(t,e=0)=>e>0?t[t.length-1]:t[0],St=(t,e)=>{if(!t)return-1;e=e||t.nodeName;for(var n=0;t=t.previousElementSibling;)t.matches(e)&&n++;return n},Ot=(t,e)=>{gt(e,((e,n)=>{null==e?t.removeAttribute(n):t.setAttribute(n,""+e)}))},Lt=(t,e)=>{t.parentNode&&t.parentNode.replaceChild(e,t)},Ct=(t,e)=>{if(null===e)return;if("string"==typeof e){if(!e.length)return;e=new RegExp(e,"i")}const n=t=>3===t.nodeType?(t=>{var n=t.data.match(e);if(n&&t.data.length>0){var i=document.createElement("span");i.className="highlight";var s=t.splitText(n.index);s.splitText(n[0].length);var r=s.cloneNode(!0);return i.appendChild(r),Lt(s,i),1}return 0})(t):((t=>{1!==t.nodeType||!t.childNodes||/(script|style)/i.test(t.tagName)||"highlight"===t.className&&"SPAN"===t.tagName||Array.from(t.childNodes).forEach((t=>{n(t)}))})(t),0);n(t)},Mt="undefined"!=typeof navigator&&/Mac/.test(navigator.userAgent)?"metaKey":"ctrlKey";var At={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:null,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,shouldOpen:null,maxOptions:50,maxItems:null,hideSelected:null,duplicates:!1,addPrecedence:!1,selectOnTab:!1,preload:null,allowEmptyOption:!1,refreshThrottle:300,loadThrottle:300,loadingClass:"loading",dataAttr:null,optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"ts-wrapper",controlClass:"ts-control",dropdownClass:"ts-dropdown",dropdownContentClass:"ts-dropdown-content",itemClass:"item",optionClass:"option",dropdownParent:null,controlInput:'',copyClassesToDropdown:!1,placeholder:null,hidePlaceholder:null,shouldLoad:function(t){return t.length>0},render:{}};function It(t,e){var n=Object.assign({},At,e),i=n.dataAttr,s=n.labelField,r=n.valueField,o=n.disabledField,a=n.optgroupField,l=n.optgroupLabelField,c=n.optgroupValueField,u=t.tagName.toLowerCase(),d=t.getAttribute("placeholder")||t.getAttribute("data-placeholder");if(!d&&!n.allowEmptyOption){let e=t.querySelector('option[value=""]');e&&(d=e.textContent)}var h={placeholder:d,options:[],optgroups:[],items:[],maxItems:null};return"select"===u?(()=>{var e,u=h.options,d={},p=1;let m=0;var f=t=>{var e=Object.assign({},t.dataset),n=i&&e[i];return"string"==typeof n&&n.length&&(e=Object.assign(e,JSON.parse(n))),e},g=(t,e)=>{var i=rt(t.value);if(null!=i&&(i||n.allowEmptyOption)){if(d.hasOwnProperty(i)){if(e){var l=d[i][a];l?Array.isArray(l)?l.push(e):d[i][a]=[l,e]:d[i][a]=e}}else{var c=f(t);c[s]=c[s]||t.textContent,c[r]=c[r]||i,c[o]=c[o]||t.disabled,c[a]=c[a]||e,c.$option=t,c.$order=c.$order||++m,d[i]=c,u.push(c)}t.selected&&h.items.push(i)}};h.maxItems=t.hasAttribute("multiple")?null:1,gt(t.children,(t=>{var n,i,s;"optgroup"===(e=t.tagName.toLowerCase())?((s=f(n=t))[l]=s[l]||n.getAttribute("label")||"",s[c]=s[c]||p++,s[o]=s[o]||n.disabled,s.$order=s.$order||++m,h.optgroups.push(s),i=s[c],gt(n.children,(t=>{g(t,i)}))):"option"===e&&g(t)}))})():(()=>{const e=t.getAttribute(i);if(e)h.options=JSON.parse(e),gt(h.options,(t=>{h.items.push(t[r])}));else{var o=t.value.trim()||"";if(!n.allowEmptyOption&&!o.length)return;const e=o.split(n.delimiter);gt(e,(t=>{const e={};e[s]=t,e[r]=t,h.options.push(e)})),h.items=e}})(),Object.assign({},At,h,e)}var Nt=0;class Ft extends(function(t){return t.plugins={},class extends t{constructor(){super(...arguments),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(e,n){t.plugins[e]={name:e,fn:n}}initializePlugins(t){var e,n;const i=this,s=[];if(Array.isArray(t))t.forEach((t=>{"string"==typeof t?s.push(t):(i.plugins.settings[t.name]=t.options,s.push(t.name))}));else if(t)for(e in t)t.hasOwnProperty(e)&&(i.plugins.settings[e]=t[e],s.push(e));for(;n=s.shift();)i.require(n)}loadPlugin(e){var n=this,i=n.plugins,s=t.plugins[e];if(!t.plugins.hasOwnProperty(e))throw new Error('Unable to find "'+e+'" plugin');i.requested[e]=!0,i.loaded[e]=s.fn.apply(n,[n.plugins.settings[e]||{}]),i.names.push(e)}require(t){var e=this,n=e.plugins;if(!e.plugins.loaded.hasOwnProperty(t)){if(n.requested[t])throw new Error('Plugin has circular dependency ("'+t+'")');e.loadPlugin(t)}return n.loaded[t]}}}(S)){constructor(t,e){var n;super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,Nt++;var i=vt(t);if(i.tomselect)throw new Error("Tom Select already initialized on this element");i.tomselect=this,n=(window.getComputedStyle&&window.getComputedStyle(i,null)).getPropertyValue("direction");const s=It(i,e);this.settings=s,this.input=i,this.tabIndex=i.tabIndex||0,this.is_select_tag="select"===i.tagName.toLowerCase(),this.rtl=/rtl/i.test(n),this.inputId=pt(i,"tomselect-"+Nt),this.isRequired=i.required,this.sifter=new st(this.options,{diacritics:s.diacritics}),s.mode=s.mode||(1===s.maxItems?"single":"multi"),"boolean"!=typeof s.hideSelected&&(s.hideSelected="multi"===s.mode),"boolean"!=typeof s.hidePlaceholder&&(s.hidePlaceholder="multi"!==s.mode);var r=s.createFilter;"function"!=typeof r&&("string"==typeof r&&(r=new RegExp(r)),r instanceof RegExp?s.createFilter=t=>r.test(t):s.createFilter=t=>this.settings.duplicates||!this.options[t]),this.initializePlugins(s.plugins),this.setupCallbacks(),this.setupTemplates();const o=vt("
"),a=vt("
"),l=this._render("dropdown"),c=vt('
'),u=this.input.getAttribute("class")||"",d=s.mode;var h;if(wt(o,s.wrapperClass,u,d),wt(a,s.controlClass),ft(o,a),wt(l,s.dropdownClass,d),s.copyClassesToDropdown&&wt(l,u),wt(c,s.dropdownContentClass),ft(l,c),vt(s.dropdownParent||o).appendChild(l),yt(s.controlInput)){h=vt(s.controlInput);gt(["autocorrect","autocapitalize","autocomplete","spellcheck"],(t=>{i.getAttribute(t)&&Ot(h,{[t]:i.getAttribute(t)})})),h.tabIndex=-1,a.appendChild(h),this.focus_node=h}else s.controlInput?(h=vt(s.controlInput),this.focus_node=h):(h=vt(""),this.focus_node=a);this.wrapper=o,this.dropdown=l,this.dropdown_content=c,this.control=a,this.control_input=h,this.setup()}setup(){const t=this,e=t.settings,n=t.control_input,i=t.dropdown,s=t.dropdown_content,r=t.wrapper,o=t.control,a=t.input,l=t.focus_node,c={passive:!0},u=t.inputId+"-ts-dropdown";Ot(s,{id:u}),Ot(l,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":u});const d=pt(l,t.inputId+"-ts-control"),h="label[for='"+(t=>t.replace(/['"\\]/g,"\\$&"))(t.inputId)+"']",p=document.querySelector(h),m=t.focus.bind(t);if(p){dt(p,"click",m),Ot(p,{for:d});const e=pt(p,t.inputId+"-ts-label");Ot(l,{"aria-labelledby":e}),Ot(s,{"aria-labelledby":e})}if(r.style.width=a.style.width,t.plugins.names.length){const e="plugin-"+t.plugins.names.join(" plugin-");wt([r,i],e)}(null===e.maxItems||e.maxItems>1)&&t.is_select_tag&&Ot(a,{multiple:"multiple"}),e.placeholder&&Ot(n,{placeholder:e.placeholder}),!e.splitOn&&e.delimiter&&(e.splitOn=new RegExp("\\s*"+A(e.delimiter)+"+\\s*")),e.load&&e.loadThrottle&&(e.load=lt(e.load,e.loadThrottle)),dt(i,"mousemove",(()=>{t.ignoreHover=!1})),dt(i,"mouseenter",(e=>{var n=Dt(e.target,"[data-selectable]",i);n&&t.onOptionHover(e,n)}),{capture:!0}),dt(i,"click",(e=>{const n=Dt(e.target,"[data-selectable]");n&&(t.onOptionSelect(e,n),ut(e,!0))})),dt(o,"click",(e=>{var i=Dt(e.target,"[data-ts-item]",o);i&&t.onItemSelect(e,i)?ut(e,!0):""==n.value&&(t.onClick(),ut(e,!0))})),dt(l,"keydown",(e=>t.onKeyDown(e))),dt(n,"keypress",(e=>t.onKeyPress(e))),dt(n,"input",(e=>t.onInput(e))),dt(l,"blur",(e=>t.onBlur(e))),dt(l,"focus",(e=>t.onFocus(e))),dt(n,"paste",(e=>t.onPaste(e)));const f=e=>{const s=e.composedPath()[0];if(!r.contains(s)&&!i.contains(s))return t.isFocused&&t.blur(),void t.inputState();s==n&&t.isOpen?e.stopPropagation():ut(e,!0)},g=()=>{t.isOpen&&t.positionDropdown()};dt(document,"mousedown",f),dt(window,"scroll",g,c),dt(window,"resize",g,c),this._destroy=()=>{document.removeEventListener("mousedown",f),window.removeEventListener("scroll",g),window.removeEventListener("resize",g),p&&p.removeEventListener("click",m)},this.revertSettings={innerHTML:a.innerHTML,tabIndex:a.tabIndex},a.tabIndex=-1,a.insertAdjacentElement("afterend",t.wrapper),t.sync(!1),e.items=[],delete e.optgroups,delete e.options,dt(a,"invalid",(()=>{t.isValid&&(t.isValid=!1,t.isInvalid=!0,t.refreshState())})),t.updateOriginalInput(),t.refreshItems(),t.close(!1),t.inputState(),t.isSetup=!0,a.disabled?t.disable():a.readOnly?t.setReadOnly(!0):t.enable(),t.on("change",this.onChange),wt(a,"tomselected","ts-hidden-accessible"),t.trigger("initialize"),!0===e.preload&&t.preload()}setupOptions(t=[],e=[]){this.addOptions(t),gt(e,(t=>{this.registerOptionGroup(t)}))}setupTemplates(){var t=this,e=t.settings.labelField,n=t.settings.optgroupLabelField,i={optgroup:t=>{let e=document.createElement("div");return e.className="optgroup",e.appendChild(t.options),e},optgroup_header:(t,e)=>'
'+e(t[n])+"
",option:(t,n)=>"
"+n(t[e])+"
",item:(t,n)=>"
"+n(t[e])+"
",option_create:(t,e)=>'
Add '+e(t.input)+"
",no_results:()=>'
No results found
',loading:()=>'
',not_loading:()=>{},dropdown:()=>"
"};t.settings.render=Object.assign({},i,t.settings.render)}setupCallbacks(){var t,e,n={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(t in n)(e=this.settings[n[t]])&&this.on(t,e)}sync(t=!0){const e=this,n=t?It(e.input,{delimiter:e.settings.delimiter}):e.settings;e.setupOptions(n.options,n.optgroups),e.setValue(n.items||[],!0),e.lastQuery=null}onClick(){var t=this;if(t.activeItems.length>0)return t.clearActiveItems(),void t.focus();t.isFocused&&t.isOpen?t.blur():t.focus()}onMouseDown(){}onChange(){bt(this.input,"input"),bt(this.input,"change")}onPaste(t){var e=this;e.isInputHidden||e.isLocked?ut(t):e.settings.splitOn&&setTimeout((()=>{var t=e.inputValue();if(t.match(e.settings.splitOn)){var n=t.trim().split(e.settings.splitOn);gt(n,(t=>{rt(t)&&(this.options[t]?e.addItem(t):e.createItem(t))}))}}),0)}onKeyPress(t){var e=this;if(!e.isLocked){var n=String.fromCharCode(t.keyCode||t.which);return e.settings.create&&"multi"===e.settings.mode&&n===e.settings.delimiter?(e.createItem(),void ut(t)):void 0}ut(t)}onKeyDown(t){var e=this;if(e.ignoreHover=!0,e.isLocked)9!==t.keyCode&&ut(t);else{switch(t.keyCode){case 65:if(ht(Mt,t)&&""==e.control_input.value)return ut(t),void e.selectAll();break;case 27:return e.isOpen&&(ut(t,!0),e.close()),void e.clearActiveItems();case 40:if(!e.isOpen&&e.hasOptions)e.open();else if(e.activeOption){let t=e.getAdjacent(e.activeOption,1);t&&e.setActiveOption(t)}return void ut(t);case 38:if(e.activeOption){let t=e.getAdjacent(e.activeOption,-1);t&&e.setActiveOption(t)}return void ut(t);case 13:return void(e.canSelect(e.activeOption)?(e.onOptionSelect(t,e.activeOption),ut(t)):(e.settings.create&&e.createItem()||document.activeElement==e.control_input&&e.isOpen)&&ut(t));case 37:return void e.advanceSelection(-1,t);case 39:return void e.advanceSelection(1,t);case 9:return void(e.settings.selectOnTab&&(e.canSelect(e.activeOption)&&(e.onOptionSelect(t,e.activeOption),ut(t)),e.settings.create&&e.createItem()&&ut(t)));case 8:case 46:return void e.deleteSelection(t)}e.isInputHidden&&!ht(Mt,t)&&ut(t)}}onInput(t){if(this.isLocked)return;const e=this.inputValue();this.lastValue!==e&&(this.lastValue=e,""!=e?(this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=((t,e)=>e>0?window.setTimeout(t,e):(t.call(null),null))((()=>{this.refreshTimeout=null,this._onInput()}),this.settings.refreshThrottle)):this._onInput())}_onInput(){const t=this.lastValue;this.settings.shouldLoad.call(this,t)&&this.load(t),this.refreshOptions(),this.trigger("type",t)}onOptionHover(t,e){this.ignoreHover||this.setActiveOption(e,!1)}onFocus(t){var e=this,n=e.isFocused;if(e.isDisabled||e.isReadOnly)return e.blur(),void ut(t);e.ignoreFocus||(e.isFocused=!0,"focus"===e.settings.preload&&e.preload(),n||e.trigger("focus"),e.activeItems.length||(e.inputState(),e.refreshOptions(!!e.settings.openOnFocus)),e.refreshState())}onBlur(t){if(!1!==document.hasFocus()){var e=this;if(e.isFocused){e.isFocused=!1,e.ignoreFocus=!1;var n=()=>{e.close(),e.setActiveItem(),e.setCaret(e.items.length),e.trigger("blur")};e.settings.create&&e.settings.createOnBlur?e.createItem(null,n):n()}}}onOptionSelect(t,e){var n,i=this;e.parentElement&&e.parentElement.matches("[data-disabled]")||(e.classList.contains("create")?i.createItem(null,(()=>{i.settings.closeAfterSelect&&i.close()})):void 0!==(n=e.dataset.value)&&(i.lastQuery=null,i.addItem(n),i.settings.closeAfterSelect&&i.close(),!i.settings.hideSelected&&t.type&&/click/.test(t.type)&&i.setActiveOption(e)))}canSelect(t){return!!(this.isOpen&&t&&this.dropdown_content.contains(t))}onItemSelect(t,e){var n=this;return!n.isLocked&&"multi"===n.settings.mode&&(ut(t),n.setActiveItem(e,t),!0)}canLoad(t){return!!this.settings.load&&!this.loadedSearches.hasOwnProperty(t)}load(t){const e=this;if(!e.canLoad(t))return;wt(e.wrapper,e.settings.loadingClass),e.loading++;const n=e.loadCallback.bind(e);e.settings.load.call(e,t,n)}loadCallback(t,e){const n=this;n.loading=Math.max(n.loading-1,0),n.lastQuery=null,n.clearActiveOption(),n.setupOptions(t,e),n.refreshOptions(n.isFocused&&!n.isInputHidden),n.loading||kt(n.wrapper,n.settings.loadingClass),n.trigger("load",t,e)}preload(){var t=this.wrapper.classList;t.contains("preloaded")||(t.add("preloaded"),this.load(""))}setTextboxValue(t=""){var e=this.control_input;e.value!==t&&(e.value=t,bt(e,"update"),this.lastValue=t)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(t,e){ct(this,e?[]:["change"],(()=>{this.clear(e),this.addItems(t,e)}))}setMaxItems(t){0===t&&(t=null),this.settings.maxItems=t,this.refreshState()}setActiveItem(t,e){var n,i,s,r,o,a,l=this;if("single"!==l.settings.mode){if(!t)return l.clearActiveItems(),void(l.isFocused&&l.inputState());if("click"===(n=e&&e.type.toLowerCase())&&ht("shiftKey",e)&&l.activeItems.length){for(a=l.getLastActive(),(s=Array.prototype.indexOf.call(l.control.children,a))>(r=Array.prototype.indexOf.call(l.control.children,t))&&(o=s,s=r,r=o),i=s;i<=r;i++)t=l.control.children[i],-1===l.activeItems.indexOf(t)&&l.setActiveItemClass(t);ut(e)}else"click"===n&&ht(Mt,e)||"keydown"===n&&ht("shiftKey",e)?t.classList.contains("active")?l.removeActiveItem(t):l.setActiveItemClass(t):(l.clearActiveItems(),l.setActiveItemClass(t));l.inputState(),l.isFocused||l.focus()}}setActiveItemClass(t){const e=this,n=e.control.querySelector(".last-active");n&&kt(n,"last-active"),wt(t,"active last-active"),e.trigger("item_select",t),-1==e.activeItems.indexOf(t)&&e.activeItems.push(t)}removeActiveItem(t){var e=this.activeItems.indexOf(t);this.activeItems.splice(e,1),kt(t,"active")}clearActiveItems(){kt(this.activeItems,"active"),this.activeItems=[]}setActiveOption(t,e=!0){t!==this.activeOption&&(this.clearActiveOption(),t&&(this.activeOption=t,Ot(this.focus_node,{"aria-activedescendant":t.getAttribute("id")}),Ot(t,{"aria-selected":"true"}),wt(t,"active"),e&&this.scrollToOption(t)))}scrollToOption(t,e){if(!t)return;const n=this.dropdown_content,i=n.clientHeight,s=n.scrollTop||0,r=t.offsetHeight,o=t.getBoundingClientRect().top-n.getBoundingClientRect().top+s;o+r>i+s?this.scroll(o-i+r,e):o{t.setActiveItemClass(e)})))}inputState(){var t=this;t.control.contains(t.control_input)&&(Ot(t.control_input,{placeholder:t.settings.placeholder}),t.activeItems.length>0||!t.isFocused&&t.settings.hidePlaceholder&&t.items.length>0?(t.setTextboxValue(),t.isInputHidden=!0):(t.settings.hidePlaceholder&&t.items.length>0&&Ot(t.control_input,{placeholder:""}),t.isInputHidden=!1),t.wrapper.classList.toggle("input-hidden",t.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var t=this;t.isDisabled||t.isReadOnly||(t.ignoreFocus=!0,t.control_input.offsetWidth?t.control_input.focus():t.focus_node.focus(),setTimeout((()=>{t.ignoreFocus=!1,t.onFocus()}),0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(t){return this.sifter.getScoreFunction(t,this.getSearchOptions())}getSearchOptions(){var t=this.settings,e=t.sortField;return"string"==typeof t.sortField&&(e=[{field:t.sortField}]),{fields:t.searchField,conjunction:t.searchConjunction,sort:e,nesting:t.nesting}}search(t){var e,n,i=this,s=this.getSearchOptions();if(i.settings.score&&"function"!=typeof(n=i.settings.score.call(i,t)))throw new Error('Tom Select "score" setting must be a function that returns a function');return t!==i.lastQuery?(i.lastQuery=t,e=i.sifter.search(t,Object.assign(s,{score:n})),i.currentResults=e):e=Object.assign({},i.currentResults),i.settings.hideSelected&&(e.items=e.items.filter((t=>{let e=rt(t.id);return!(e&&-1!==i.items.indexOf(e))}))),e}refreshOptions(t=!0){var e,n,i,s,r,o,a,l,c,u;const d={},h=[];var p=this,m=p.inputValue();const f=m===p.lastQuery||""==m&&null==p.lastQuery;var g=p.search(m),v=null,y=p.settings.shouldOpen||!1,b=p.dropdown_content;f&&(v=p.activeOption)&&(c=v.closest("[data-group]")),s=g.items.length,"number"==typeof p.settings.maxOptions&&(s=Math.min(s,p.settings.maxOptions)),s>0&&(y=!0);const _=(t,e)=>{let n=d[t];if(void 0!==n){let t=h[n];if(void 0!==t)return[n,t.fragment]}let i=document.createDocumentFragment();return n=h.length,h.push({fragment:i,order:e,optgroup:t}),[n,i]};for(e=0;e0&&(u=u.cloneNode(!0),Ot(u,{id:a.$id+"-clone-"+n,"aria-selected":null}),u.classList.add("ts-cloned"),kt(u,"active"),p.activeOption&&p.activeOption.dataset.value==s&&c&&c.dataset.group===r.toString()&&(v=u)),l.appendChild(u),""!=r&&(d[r]=i)}}var w;p.settings.lockOptgroupOrder&&h.sort(((t,e)=>t.order-e.order)),a=document.createDocumentFragment(),gt(h,(t=>{let e=t.fragment,n=t.optgroup;if(!e||!e.children.length)return;let i=p.optgroups[n];if(void 0!==i){let t=document.createDocumentFragment(),n=p.render("optgroup_header",i);ft(t,n),ft(t,e);let s=p.render("optgroup",{group:i,options:t});ft(a,s)}else ft(a,e)})),b.innerHTML="",ft(b,a),p.settings.highlight&&(w=b.querySelectorAll("span.highlight"),Array.prototype.forEach.call(w,(function(t){var e=t.parentNode;e.replaceChild(t.firstChild,t),e.normalize()})),g.query.length&&g.tokens.length&>(g.tokens,(t=>{Ct(b,t.regex)})));var k=t=>{let e=p.render(t,{input:m});return e&&(y=!0,b.insertBefore(e,b.firstChild)),e};if(p.loading?k("loading"):p.settings.shouldLoad.call(p,m)?0===g.items.length&&k("no_results"):k("not_loading"),(l=p.canCreate(m))&&(u=k("option_create")),p.hasOptions=g.items.length>0||l,y){if(g.items.length>0){if(v||"single"!==p.settings.mode||null==p.items[0]||(v=p.getOption(p.items[0])),!b.contains(v)){let t=0;u&&!p.settings.addPrecedence&&(t=1),v=p.selectable()[t]}}else u&&(v=u);t&&!p.isOpen&&(p.open(),p.scrollToOption(v,"auto")),p.setActiveOption(v)}else p.clearActiveOption(),t&&p.isOpen&&p.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(t,e=!1){const n=this;if(Array.isArray(t))return n.addOptions(t,e),!1;const i=rt(t[n.settings.valueField]);return null!==i&&!n.options.hasOwnProperty(i)&&(t.$order=t.$order||++n.order,t.$id=n.inputId+"-opt-"+t.$order,n.options[i]=t,n.lastQuery=null,e&&(n.userOptions[i]=e,n.trigger("option_add",i,t)),i)}addOptions(t,e=!1){gt(t,(t=>{this.addOption(t,e)}))}registerOption(t){return this.addOption(t)}registerOptionGroup(t){var e=rt(t[this.settings.optgroupValueField]);return null!==e&&(t.$order=t.$order||++this.order,this.optgroups[e]=t,e)}addOptionGroup(t,e){var n;e[this.settings.optgroupValueField]=t,(n=this.registerOptionGroup(e))&&this.trigger("optgroup_add",n,e)}removeOptionGroup(t){this.optgroups.hasOwnProperty(t)&&(delete this.optgroups[t],this.clearCache(),this.trigger("optgroup_remove",t))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(t,e){const n=this;var i,s;const r=rt(t),o=rt(e[n.settings.valueField]);if(null===r)return;const a=n.options[r];if(null==a)return;if("string"!=typeof o)throw new Error("Value must be set in option data");const l=n.getOption(r),c=n.getItem(r);if(e.$order=e.$order||a.$order,delete n.options[r],n.uncacheValue(o),n.options[o]=e,l){if(n.dropdown_content.contains(l)){const t=n._render("option",e);Lt(l,t),n.activeOption===l&&n.setActiveOption(t)}l.remove()}c&&(-1!==(s=n.items.indexOf(r))&&n.items.splice(s,1,o),i=n._render("item",e),c.classList.contains("active")&&wt(i,"active"),Lt(c,i)),n.lastQuery=null}removeOption(t,e){const n=this;t=ot(t),n.uncacheValue(t),delete n.userOptions[t],delete n.options[t],n.lastQuery=null,n.trigger("option_remove",t),n.removeItem(t,e)}clearOptions(t){const e=(t||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();const n={};gt(this.options,((t,i)=>{e(t,i)&&(n[i]=t)})),this.options=this.sifter.items=n,this.lastQuery=null,this.trigger("option_clear")}clearFilter(t,e){return this.items.indexOf(e)>=0}getOption(t,e=!1){const n=rt(t);if(null===n)return null;const i=this.options[n];if(null!=i){if(i.$div)return i.$div;if(e)return this._render("option",i)}return null}getAdjacent(t,e,n="option"){var i;if(!t)return null;i="item"==n?this.controlChildren():this.dropdown_content.querySelectorAll("[data-selectable]");for(let n=0;n0?i[n+1]:i[n-1];return null}getItem(t){if("object"==typeof t)return t;var e=rt(t);return null!==e?this.control.querySelector(`[data-value="${mt(e)}"]`):null}addItems(t,e){var n=this,i=Array.isArray(t)?t:[t];const s=(i=i.filter((t=>-1===n.items.indexOf(t))))[i.length-1];i.forEach((t=>{n.isPending=t!==s,n.addItem(t,e)}))}addItem(t,e){ct(this,e?[]:["change","dropdown_close"],(()=>{var n,i;const s=this,r=s.settings.mode,o=rt(t);if((!o||-1===s.items.indexOf(o)||("single"===r&&s.close(),"single"!==r&&s.settings.duplicates))&&null!==o&&s.options.hasOwnProperty(o)&&("single"===r&&s.clear(e),"multi"!==r||!s.isFull())){if(n=s._render("item",s.options[o]),s.control.contains(n)&&(n=n.cloneNode(!0)),i=s.isFull(),s.items.splice(s.caretPos,0,o),s.insertAtCaret(n),s.isSetup){if(!s.isPending&&s.settings.hideSelected){let t=s.getOption(o),e=s.getAdjacent(t,1);e&&s.setActiveOption(e)}s.isPending||s.settings.closeAfterSelect||s.refreshOptions(s.isFocused&&"single"!==r),0!=s.settings.closeAfterSelect&&s.isFull()?s.close():s.isPending||s.positionDropdown(),s.trigger("item_add",o,n),s.isPending||s.updateOriginalInput({silent:e})}(!s.isPending||!i&&s.isFull())&&(s.inputState(),s.refreshState())}}))}removeItem(t=null,e){const n=this;if(!(t=n.getItem(t)))return;var i,s;const r=t.dataset.value;i=St(t),t.remove(),t.classList.contains("active")&&(s=n.activeItems.indexOf(t),n.activeItems.splice(s,1),kt(t,"active")),n.items.splice(i,1),n.lastQuery=null,!n.settings.persist&&n.userOptions.hasOwnProperty(r)&&n.removeOption(r,e),i{})){3===arguments.length&&(e=arguments[2]),"function"!=typeof e&&(e=()=>{});var n,i=this,s=i.caretPos;if(t=t||i.inputValue(),!i.canCreate(t))return e(),!1;i.lock();var r=!1,o=t=>{if(i.unlock(),!t||"object"!=typeof t)return e();var n=rt(t[i.settings.valueField]);if("string"!=typeof n)return e();i.setTextboxValue(),i.addOption(t,!0),i.setCaret(s),i.addItem(n),e(t),r=!0};return n="function"==typeof i.settings.create?i.settings.create.call(this,t,o):{[i.settings.labelField]:t,[i.settings.valueField]:t},r||o(n),!0}refreshItems(){var t=this;t.lastQuery=null,t.isSetup&&t.addItems(t.items),t.updateOriginalInput(),t.refreshState()}refreshState(){const t=this;t.refreshValidityState();const e=t.isFull(),n=t.isLocked;t.wrapper.classList.toggle("rtl",t.rtl);const i=t.wrapper.classList;var s;i.toggle("focus",t.isFocused),i.toggle("disabled",t.isDisabled),i.toggle("readonly",t.isReadOnly),i.toggle("required",t.isRequired),i.toggle("invalid",!t.isValid),i.toggle("locked",n),i.toggle("full",e),i.toggle("input-active",t.isFocused&&!t.isInputHidden),i.toggle("dropdown-active",t.isOpen),i.toggle("has-options",(s=t.options,0===Object.keys(s).length)),i.toggle("has-items",t.items.length>0)}refreshValidityState(){var t=this;t.input.validity&&(t.isValid=t.input.validity.valid,t.isInvalid=!t.isValid)}isFull(){return null!==this.settings.maxItems&&this.items.length>=this.settings.maxItems}updateOriginalInput(t={}){const e=this;var n,i;const s=e.input.querySelector('option[value=""]');if(e.is_select_tag){const r=[],o=e.input.querySelectorAll("option:checked").length;function a(t,n,i){return t||(t=vt('")),t!=s&&e.input.append(t),r.push(t),(t!=s||o>0)&&(t.selected=!0),t}e.input.querySelectorAll("option:checked").forEach((t=>{t.selected=!1})),0==e.items.length&&"single"==e.settings.mode?a(s,"",""):e.items.forEach((t=>{if(n=e.options[t],i=n[e.settings.labelField]||"",r.includes(n.$option)){a(e.input.querySelector(`option[value="${mt(t)}"]:not(:checked)`),t,i)}else n.$option=a(n.$option,t,i)}))}else e.input.value=e.getValue();e.isSetup&&(t.silent||e.trigger("change",e.getValue()))}open(){var t=this;t.isLocked||t.isOpen||"multi"===t.settings.mode&&t.isFull()||(t.isOpen=!0,Ot(t.focus_node,{"aria-expanded":"true"}),t.refreshState(),_t(t.dropdown,{visibility:"hidden",display:"block"}),t.positionDropdown(),_t(t.dropdown,{visibility:"visible",display:"block"}),t.focus(),t.trigger("dropdown_open",t.dropdown))}close(t=!0){var e=this,n=e.isOpen;t&&(e.setTextboxValue(),"single"===e.settings.mode&&e.items.length&&e.inputState()),e.isOpen=!1,Ot(e.focus_node,{"aria-expanded":"false"}),_t(e.dropdown,{display:"none"}),e.settings.hideSelected&&e.clearActiveOption(),e.refreshState(),n&&e.trigger("dropdown_close",e.dropdown)}positionDropdown(){if("body"===this.settings.dropdownParent){var t=this.control,e=t.getBoundingClientRect(),n=t.offsetHeight+e.top+window.scrollY,i=e.left+window.scrollX;_t(this.dropdown,{width:e.width+"px",top:n+"px",left:i+"px"})}}clear(t){var e=this;if(e.items.length){var n=e.controlChildren();gt(n,(t=>{e.removeItem(t,!0)})),e.inputState(),t||e.updateOriginalInput(),e.trigger("clear")}}insertAtCaret(t){const e=this,n=e.caretPos,i=e.control;i.insertBefore(t,i.children[n]||null),e.setCaret(n+1)}deleteSelection(t){var e,n,i,s,r,o=this;e=t&&8===t.keyCode?-1:1,n={start:(r=o.control_input).selectionStart||0,length:(r.selectionEnd||0)-(r.selectionStart||0)};const a=[];if(o.activeItems.length)s=xt(o.activeItems,e),i=St(s),e>0&&i++,gt(o.activeItems,(t=>a.push(t)));else if((o.isFocused||"single"===o.settings.mode)&&o.items.length){const t=o.controlChildren();let i;e<0&&0===n.start&&0===n.length?i=t[o.caretPos-1]:e>0&&n.start===o.inputValue().length&&(i=t[o.caretPos]),void 0!==i&&a.push(i)}if(!o.shouldDelete(a,t))return!1;for(ut(t,!0),void 0!==i&&o.setCaret(i);a.length;)o.removeItem(a.pop());return o.inputState(),o.positionDropdown(),o.refreshOptions(!1),!0}shouldDelete(t,e){const n=t.map((t=>t.dataset.value));return!(!n.length||"function"==typeof this.settings.onDelete&&!1===this.settings.onDelete(n,e))}advanceSelection(t,e){var n,i,s=this;s.rtl&&(t*=-1),s.inputValue().length||(ht(Mt,e)||ht("shiftKey",e)?(i=(n=s.getLastActive(t))?n.classList.contains("active")?s.getAdjacent(n,t,"item"):n:t>0?s.control_input.nextElementSibling:s.control_input.previousElementSibling)&&(i.classList.contains("active")&&s.removeActiveItem(n),s.setActiveItemClass(i)):s.moveCaret(t))}moveCaret(t){}getLastActive(t){let e=this.control.querySelector(".last-active");if(e)return e;var n=this.control.querySelectorAll(".active");return n?xt(n,t):void 0}setCaret(t){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(t=this.isReadOnly||this.isDisabled){this.isLocked=t,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(t){this.focus_node.tabIndex=t?-1:this.tabIndex,this.isDisabled=t,this.input.disabled=t,this.control_input.disabled=t,this.setLocked()}setReadOnly(t){this.isReadOnly=t,this.input.readOnly=t,this.control_input.readOnly=t,this.setLocked()}destroy(){var t=this,e=t.revertSettings;t.trigger("destroy"),t.off(),t.wrapper.remove(),t.dropdown.remove(),t.input.innerHTML=e.innerHTML,t.input.tabIndex=e.tabIndex,kt(t.input,"tomselected","ts-hidden-accessible"),t._destroy(),delete t.input.tomselect}render(t,e){var n,i;const s=this;if("function"!=typeof this.settings.render[t])return null;if(!(i=s.settings.render[t].call(this,e,at)))return null;if(i=vt(i),"option"===t||"option_create"===t?e[s.settings.disabledField]?Ot(i,{"aria-disabled":"true"}):Ot(i,{"data-selectable":""}):"optgroup"===t&&(n=e.group[s.settings.optgroupValueField],Ot(i,{"data-group":n}),e.group[s.settings.disabledField]&&Ot(i,{"data-disabled":""})),"option"===t||"item"===t){const n=ot(e[s.settings.valueField]);Ot(i,{"data-value":n}),"item"===t?(wt(i,s.settings.itemClass),Ot(i,{"data-ts-item":""})):(wt(i,s.settings.optionClass),Ot(i,{role:"option",id:e.$id}),e.$div=i,s.options[n]=e)}return i}_render(t,e){const n=this.render(t,e);if(null==n)throw"HTMLElement expected";return n}clearCache(){gt(this.options,(t=>{t.$div&&(t.$div.remove(),delete t.$div)}))}uncacheValue(t){const e=this.getOption(t);e&&e.remove()}canCreate(t){return this.settings.create&&t.length>0&&this.settings.createFilter.call(this,t)}hook(t,e,n){var i=this,s=i[e];i[e]=function(){var e,r;return"after"===t&&(e=s.apply(i,arguments)),r=n.apply(i,arguments),"instead"===t?r:("before"===t&&(e=s.apply(i,arguments)),e)}}}const Pt=t=>"boolean"==typeof t?t?"1":"0":t+"",jt=(t,e=!1)=>{t&&(t.preventDefault(),e&&t.stopPropagation())},qt=t=>"string"==typeof t&&t.indexOf("<")>-1;const Ht=t=>"string"==typeof t&&t.indexOf("<")>-1;const Vt=(t,e,n,i)=>{t.addEventListener(e,n,i)},$t=t=>"string"==typeof t&&t.indexOf("<")>-1,Bt=(t,e)=>{((t,e)=>{if(Array.isArray(t))t.forEach(e);else for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)})(e,((e,n)=>{null==e?t.removeAttribute(n):t.setAttribute(n,""+e)}))};const Rt=t=>"string"==typeof t&&t.indexOf("<")>-1;const Wt=t=>{var e=[];return((t,e)=>{if(Array.isArray(t))t.forEach(e);else for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)})(t,(t=>{"string"==typeof t&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))})),e.filter(Boolean)},zt=t=>(Array.isArray(t)||(t=[t]),t);const Ut=t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if(Yt(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)},Yt=t=>"string"==typeof t&&t.indexOf("<")>-1,Zt=t=>{var e=[];return((t,e)=>{if(Array.isArray(t))t.forEach(e);else for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)})(t,(t=>{"string"==typeof t&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))})),e.filter(Boolean)},Kt=t=>(Array.isArray(t)||(t=[t]),t);const Jt=(t,e,n,i)=>{t.addEventListener(e,n,i)};const Gt=(t,e=!1)=>{t&&(t.preventDefault(),e&&t.stopPropagation())},Qt=(t,e,n,i)=>{t.addEventListener(e,n,i)},Xt=t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if(te(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)},te=t=>"string"==typeof t&&t.indexOf("<")>-1;const ee=t=>{var e=[];return((t,e)=>{if(Array.isArray(t))t.forEach(e);else for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)})(t,(t=>{"string"==typeof t&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))})),e.filter(Boolean)},ne=t=>(Array.isArray(t)||(t=[t]),t);Ft.define("change_listener",(function(){var t,e,n,i;t=this.input,e="change",n=()=>{this.sync()},t.addEventListener(e,n,i)})),Ft.define("checkbox_options",(function(t){var e=this,n=e.onOptionSelect;e.settings.hideSelected=!1;const i=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},t);var s=function(t,e){e?(t.checked=!0,i.uncheckedClassNames&&t.classList.remove(...i.uncheckedClassNames),i.checkedClassNames&&t.classList.add(...i.checkedClassNames)):(t.checked=!1,i.checkedClassNames&&t.classList.remove(...i.checkedClassNames),i.uncheckedClassNames&&t.classList.add(...i.uncheckedClassNames))},r=function(t){setTimeout((()=>{var e=t.querySelector("input."+i.className);e instanceof HTMLInputElement&&s(e,t.classList.contains("selected"))}),1)};e.hook("after","setupTemplates",(()=>{var t=e.settings.render.option;e.settings.render.option=(n,r)=>{var o=(t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if(qt(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)})(t.call(e,n,r)),a=document.createElement("input");i.className&&a.classList.add(i.className),a.addEventListener("click",(function(t){jt(t)})),a.type="checkbox";const l=null==(c=n[e.settings.valueField])?null:Pt(c);var c;return s(a,!!(l&&e.items.indexOf(l)>-1)),o.prepend(a),o}})),e.on("item_remove",(t=>{var n=e.getOption(t);n&&(n.classList.remove("selected"),r(n))})),e.on("item_add",(t=>{var n=e.getOption(t);n&&r(n)})),e.hook("instead","onOptionSelect",((t,i)=>{if(i.classList.contains("selected"))return i.classList.remove("selected"),e.removeItem(i.dataset.value),e.refreshOptions(),void jt(t,!0);n.call(e,t,i),r(i)}))})),Ft.define("clear_button",(function(t){const e=this,n=Object.assign({className:"clear-button",title:"Clear All",html:t=>`
`},t);e.on("initialize",(()=>{var t=(t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if(Ht(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)})(n.html(n));t.addEventListener("click",(t=>{e.isLocked||(e.clear(),"single"===e.settings.mode&&e.settings.allowEmptyOption&&e.addItem(""),t.preventDefault(),t.stopPropagation())})),e.control.appendChild(t)}))})),Ft.define("drag_drop",(function(){var t=this;if("multi"!==t.settings.mode)return;var e=t.lock,n=t.unlock;let i,s=!0;t.hook("after","setupTemplates",(()=>{var e=t.settings.render.item;t.settings.render.item=(n,r)=>{const o=(t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if($t(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)})(e.call(t,n,r));Bt(o,{draggable:"true"});const a=t=>{t.preventDefault(),o.classList.add("ts-drag-over"),l(o,i)},l=(t,e)=>{var n,i,s;void 0!==e&&(((t,e)=>{do{var n;if(t==(e=null==(n=e)?void 0:n.previousElementSibling))return!0}while(e&&e.previousElementSibling);return!1})(e,o)?(i=e,null==(s=(n=t).parentNode)||s.insertBefore(i,n.nextSibling)):((t,e)=>{var n;null==(n=t.parentNode)||n.insertBefore(e,t)})(t,e))};return Vt(o,"mousedown",(t=>{s||((t,e=!1)=>{t&&(t.preventDefault(),e&&t.stopPropagation())})(t),t.stopPropagation()})),Vt(o,"dragstart",(t=>{i=o,setTimeout((()=>{o.classList.add("ts-dragging")}),0)})),Vt(o,"dragenter",a),Vt(o,"dragover",a),Vt(o,"dragleave",(()=>{o.classList.remove("ts-drag-over")})),Vt(o,"dragend",(()=>{var e;document.querySelectorAll(".ts-drag-over").forEach((t=>t.classList.remove("ts-drag-over"))),null==(e=i)||e.classList.remove("ts-dragging"),i=void 0;var n=[];t.control.querySelectorAll("[data-value]").forEach((t=>{if(t.dataset.value){let e=t.dataset.value;e&&n.push(e)}})),t.setValue(n)})),o}})),t.hook("instead","lock",(()=>(s=!1,e.call(t)))),t.hook("instead","unlock",(()=>(s=!0,n.call(t))))})),Ft.define("dropdown_header",(function(t){const e=this,n=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:t=>'
'+t.title+'×
'},t);e.on("initialize",(()=>{var t=(t=>{if(t.jquery)return t[0];if(t instanceof HTMLElement)return t;if(Rt(t)){var e=document.createElement("template");return e.innerHTML=t.trim(),e.content.firstChild}return document.querySelector(t)})(n.html(n)),i=t.querySelector("."+n.closeClass);i&&i.addEventListener("click",(t=>{((t,e=!1)=>{t&&(t.preventDefault(),e&&t.stopPropagation())})(t,!0),e.close()})),e.dropdown.insertBefore(t,e.dropdown.firstChild)}))})),Ft.define("caret_position",(function(){var t=this;t.hook("instead","setCaret",(e=>{"single"!==t.settings.mode&&t.control.contains(t.control_input)?(e=Math.max(0,Math.min(t.items.length,e)))==t.caretPos||t.isPending||t.controlChildren().forEach(((n,i)=>{i{if(!t.isFocused)return;const n=t.getLastActive(e);if(n){const i=((t,e)=>{if(!t)return-1;e=e||t.nodeName;for(var n=0;t=t.previousElementSibling;)t.matches(e)&&n++;return n})(n);t.setCaret(e>0?i+1:i),t.setActiveItem(),((t,...e)=>{var n=Wt(e);(t=zt(t)).map((t=>{n.map((e=>{t.classList.remove(e)}))}))})(n,"last-active")}else t.setCaret(t.caretPos+e)}))})),Ft.define("dropdown_input",(function(){const t=this;t.settings.shouldOpen=!0,t.hook("before","setup",(()=>{t.focus_node=t.control,((t,...e)=>{var n=Zt(e);(t=Kt(t)).map((t=>{n.map((e=>{t.classList.add(e)}))}))})(t.control_input,"dropdown-input");const e=Ut('