From 6fbd31c3c24e38c5eae32abcd6314ce740fe6506 Mon Sep 17 00:00:00 2001 From: Tomasz Puch Date: Mon, 16 Dec 2024 12:39:51 +0100 Subject: [PATCH] feat: strapi v5 rc (#443) Strapi 5 compatibility ON Co-authored-by: Tomasz Puch Co-authored-by: Mateusz Ziarko --- .circleci/config.yml | 64 +- .gitignore | 7 +- .npmignore | 3 +- .nvmrc | 2 +- .prettierrc | 7 + README.md | 118 +- admin/custom.d.ts | 2 + admin/src/api/client.ts | 192 + admin/src/api/index.ts | 1 + admin/src/api/validators.ts | 325 + .../components/AdditionalFieldInput/index.tsx | 144 - .../components/AdditionalFieldInput/types.ts | 15 - admin/src/components/Alert/styles.js | 8 - admin/src/components/CollapseButton/index.js | 31 - .../components/ConfirmationDialog/index.js | 59 - .../components/ConfirmationDialog/index.tsx | 84 + admin/src/components/DragButton/index.tsx | 65 - admin/src/components/EmptyView/index.js | 26 - admin/src/components/Initializer.tsx | 19 + .../components/Item/ItemCardBadge/index.js | 22 - .../Item/ItemCardHeader/Wrapper.tsx | 20 - .../components/Item/ItemCardHeader/icons.tsx | 8 - .../components/Item/ItemCardHeader/index.tsx | 75 - .../Item/ItemCardRemovedOverlay/index.js | 12 - admin/src/components/Item/Wrapper.js | 39 - admin/src/components/Item/index.js | 278 - .../components/NavigationItemList/index.js | 73 - admin/src/components/RestartAlert/index.js | 8 - admin/src/components/RestartAlert/index.tsx | 8 + admin/src/components/TextArrayInput/index.tsx | 36 +- admin/src/components/icons/index.ts | 1 + admin/src/components/icons/navigation.js | 14 - admin/src/components/icons/navigation.tsx | 26 + admin/src/components/icons/pluginIcon.tsx | 11 + admin/src/contexts/DataManagerContext.js | 5 - admin/src/hooks/useAllContentTypes.ts | 11 - admin/src/hooks/useDataManager.js | 6 - .../hooks/useI18nCopyNavigationItemsModal.tsx | 44 - admin/src/hooks/useNavigationConfig.js | 58 - admin/src/index.js | 65 - admin/src/index.ts | 81 + admin/src/pages/App.tsx | 19 + admin/src/pages/App/index.js | 31 - .../src/pages/DataManagerProvider/actions.js | 31 - admin/src/pages/DataManagerProvider/index.js | 484 - admin/src/pages/DataManagerProvider/init.js | 5 - .../src/pages/DataManagerProvider/reducer.js | 150 - .../components/AdditionalFieldInput/index.tsx | 137 + .../components/CollapseButton/index.tsx | 37 + .../HomePage/components/DragButton/index.tsx | 62 + .../I18nCopyNavigationItems/index.tsx | 38 + .../NavigationContentHeader/index.tsx | 16 + .../components/NavigationHeader/hooks.tsx} | 10 +- .../components/NavigationHeader/index.tsx | 182 + .../components/NavigationHeader/styles.ts} | 2 +- .../components/NavigationItemForm/index.tsx | 932 + .../components/NavigationItemForm/types.ts | 51 + .../NavigationItemForm/utils/form.ts | 146 + .../NavigationItemForm/utils/hooks.ts | 15 + .../NavigationItemForm/utils/properties.ts | 130 + .../components/NavigationItemList/Wrapper.ts} | 8 +- .../components/NavigationItemList/index.tsx | 75 + .../ItemCardBadge/index.ts | 22 + .../ItemCardHeader/Wrapper.tsx | 15 + .../ItemCardHeader/icons.tsx | 7 + .../ItemCardHeader/index.tsx | 112 + .../ItemCardRemovedOverlay/index.ts | 12 + .../NavigationItemListItem/Wrapper.ts | 44 + .../NavigationItemListItem/index.tsx | 442 + .../NavigationItemPopupFooter.tsx | 41 + .../NavigationItemPopupHeader.tsx | 34 + .../components/NavigationItemPopup/index.tsx | 91 + .../AllNavigations/icons.tsx | 4 +- .../AllNavigations/index.tsx | 264 + .../DeletionConfirm/index.tsx | 53 + .../NavigationManager/ErrorDetails/index.tsx | 48 + .../NavigationManager/Footer/index.tsx | 44 + .../NavigationManager/Form/hooks.ts | 10 + .../NavigationManager/Form/index.tsx | 157 + .../NavigationUpdate/index.tsx | 63 + .../NavigationManager/NewNavigation/index.tsx | 59 + .../PurgeCacheConfirm/index.tsx | 53 + .../components/NavigationManager/index.tsx | 323 + .../components/NavigationManager/types.ts | 36 +- .../HomePage}/components/Search/index.tsx | 59 +- admin/src/pages/HomePage/components/index.ts | 1 + admin/src/pages/HomePage/hooks/index.tsx | 216 + admin/src/pages/HomePage/index.tsx | 556 + admin/src/pages/HomePage/utils/index.ts | 27 + admin/src/pages/HomePage/utils/parsers.ts | 327 + admin/src/pages/NoAccessPage/index.tsx | 55 - admin/src/pages/SettingsPage/common/const.ts | 2 +- .../components/CustomFieldForm/index.tsx | 372 +- .../components/CustomFieldModal/index.tsx | 67 +- .../components/CustomFieldTable/index.tsx | 196 +- .../components/DisableI18nModal/index.tsx | 161 - admin/src/pages/SettingsPage/hooks/index.ts | 116 + admin/src/pages/SettingsPage/index.tsx | 1319 +- admin/src/pages/SettingsPage/types.ts | 24 +- admin/src/pages/SettingsPage/utils/form.ts | 37 - .../src/pages/SettingsPage/utils/functions.js | 39 - admin/src/pages/SettingsPage/utils/index.ts | 83 + .../I18nCopyNavigationItems/index.tsx | 41 - .../NavigationContentHeader/index.js | 18 - .../View/components/NavigationHeader/index.js | 157 - .../components/NavigationItemForm/index.tsx | 686 - .../components/NavigationItemForm/types.ts | 114 - .../NavigationItemForm/utils/form.ts | 104 - .../NavigationItemPopupFooter.js | 41 - .../NavigationItemPopupHeader.js | 20 - .../components/NavigationItemPopup/index.js | 125 - .../AllNavigations/index.tsx | 266 - .../DeletionConfirm/index.tsx | 52 - .../NavigationManager/ErrorDetails/index.tsx | 42 - .../NavigationManager/Footer/index.tsx | 46 - .../NavigationManager/Form/index.tsx | 144 - .../NavigationUpdate/index.tsx | 71 - .../NavigationManager/NewNavigation/index.tsx | 75 - .../PurgeCacheConfirm/index.tsx | 52 - .../components/NavigationManager/index.tsx | 229 - admin/src/pages/View/index.js | 417 - admin/src/pages/View/utils/form.js | 13 - admin/src/pages/View/utils/index.js | 3 - admin/src/pages/View/utils/parsers.js | 327 - admin/src/pages/View/utils/types.ts | 3 - admin/src/permissions.js | 9 - admin/src/pluginId.js | 5 - admin/src/pluginId.ts | 1 + admin/src/schemas/config.ts | 69 + admin/src/schemas/content-type.ts | 16 + admin/src/schemas/index.ts | 2 + admin/src/translations/ca.json | 199 - admin/src/translations/ca.ts | 483 + admin/src/translations/en.json | 220 - admin/src/translations/en.ts | 491 + admin/src/translations/fr.json | 48 - admin/src/translations/fr.ts | 489 + admin/src/translations/index.js | 15 - admin/src/translations/index.ts | 19 + admin/src/types.ts | 6 + admin/src/utils/api.ts | 19 - admin/src/utils/constants.ts | 1 + admin/src/utils/enums.ts | 29 - admin/src/utils/functions.ts | 54 - admin/src/utils/getTranslation.ts | 7 + admin/src/utils/index.ts | 3 - admin/src/utils/permissions.ts | 20 + admin/src/utils/prefixPluginTranslations.ts | 5 + admin/tsconfig.build.json | 10 + admin/tsconfig.json | 8 + jest.config.ts | 29 +- ...ion-3.0.0-no-1-related-id-to-documentid.js | 40 + ...ion-3.0.0-no-2-locale-slug-regular-slug.js | 31 + ...in-navigation-3.0.0-no-3-morph-relation.js | 85 + package.json | 175 +- server/bootstrap/index.ts | 58 - .../cache/__tests__/serviceEnhancers.test.ts | 39 - server/cache/__tests__/utils.test.ts | 87 - server/cache/index.ts | 1 - server/cache/serviceEnhancers.ts | 17 - server/cache/setupStrategy.ts | 46 - server/cache/types.ts | 12 - server/cache/utils.ts | 31 - server/config/setupStrategy.ts | 105 - server/content-types/index.ts | 13 - .../navigation-item/lifecycles.ts | 6 - .../content-types/navigation-item/schema.ts | 110 - server/content-types/navigation/lifecycles.ts | 6 - server/content-types/navigation/schema.ts | 54 - .../navigations-items-related/index.ts | 7 - .../navigations-items-related/schema.ts | 47 - server/controllers/admin.ts | 209 - server/controllers/client.ts | 87 - server/controllers/index.ts | 11 - server/destroy.ts | 3 - server/graphql/config.ts | 31 - server/graphql/index.js | 1 - server/graphql/queries/index.js | 17 - .../queries/render-navigation-child.js | 24 - server/graphql/queries/render-navigation.js | 35 - server/graphql/resolvers-config.js | 4 - server/graphql/setupStrategy.ts | 12 - .../types/content-types-name-fields.js | 13 - server/graphql/types/content-types.js | 16 - .../graphql/types/create-navigation-item.js | 17 - .../types/create-navigation-related.js | 8 - server/graphql/types/create-navigation.js | 7 - server/graphql/types/index.js | 17 - server/graphql/types/navigation-config.js | 9 - .../navigation-item-additional-field-media.js | 11 - .../types/navigation-item-related-data.js | 8 - server/graphql/types/navigation-item.js | 58 - .../graphql/types/navigation-render-type.js | 6 - server/graphql/types/navigation.js | 9 - server/i18n/__tests__/utils.test.ts | 146 - server/i18n/constant.ts | 1 - server/i18n/errors.ts | 9 - server/i18n/graphQLEnhancers.ts | 17 - server/i18n/index.ts | 7 - server/i18n/navigationSetupStrategy.ts | 255 - server/i18n/serviceEnhancers.ts | 257 - server/i18n/types.ts | 76 - server/i18n/utils.ts | 46 - server/navigation/index.ts | 1 - server/navigation/setupStrategy.ts | 57 - server/register/index.ts | 1 - server/routes/admin.ts | 206 - server/services/__tests__/service.test.ts | 1568 - server/services/admin.ts | 468 - server/services/client.ts | 452 - server/services/common.ts | 492 - server/services/index.ts | 13 - server/src/app-errors.ts | 17 + server/src/bootstrap.ts | 14 + server/src/cache/index.ts | 42 + server/{ => src}/config/index.ts | 10 +- server/src/config/setup.ts | 101 + .../{ => src}/content-types/audience/index.ts | 0 .../content-types/audience/schema.ts | 0 server/src/content-types/index.ts | 11 + .../content-types/navigation-item/index.ts | 0 .../navigation-item/lifecycles.ts | 5 + .../content-types/navigation-item/schema.ts | 106 + .../content-types/navigation/index.ts | 0 .../content-types/navigation/lifecycles.ts | 5 + server/src/content-types/navigation/schema.ts | 48 + server/src/controllers/admin.ts | 154 + server/src/controllers/client.ts | 85 + server/src/controllers/index.ts | 7 + server/src/controllers/utils.ts | 24 + server/src/controllers/validators.ts | 35 + server/src/destroy.ts | 7 + server/src/dtos/config.ts | 40 + server/src/dtos/index.ts | 4 + server/src/dtos/navigation-item.ts | 61 + server/src/dtos/navigation.ts | 6 + server/src/graphql/config.ts | 32 + server/src/graphql/index.ts | 1 + server/src/graphql/queries/index.ts | 20 + .../queries/render-navigation-child.ts | 30 + .../src/graphql/queries/render-navigation.ts | 35 + server/src/graphql/resolvers-config.ts | 4 + server/src/graphql/setup.ts | 11 + .../types/content-types-name-fields.ts | 17 + server/src/graphql/types/content-types.ts | 17 + .../graphql/types/create-navigation-item.ts | 18 + .../types/create-navigation-related.ts | 9 + server/src/graphql/types/create-navigation.ts | 8 + server/src/graphql/types/index.ts | 35 + server/src/graphql/types/navigation-config.ts | 10 + .../graphql/types/navigation-details.ts} | 5 +- .../navigation-item-additional-field-media.ts | 12 + .../navigation-item-additional-fields.ts | 34 + .../types/navigation-item-related-data.ts | 9 + .../graphql/types/navigation-item-related.ts} | 11 +- server/src/graphql/types/navigation-item.ts | 38 + .../graphql/types/navigation-render-type.ts | 5 + server/src/graphql/types/navigation.ts | 11 + server/src/i18n/index.ts | 52 + server/{ => src}/index.ts | 24 +- server/src/middlewares/index.ts | 1 + server/src/permissions.ts | 41 + server/src/permissions/index.ts | 5 + server/src/permissions/permissions.ts | 12 + server/src/permissions/setup.ts | 27 + server/src/policies/index.ts | 1 + server/src/register.ts | 7 + server/src/repositories/audience.ts | 14 + server/src/repositories/generic.ts | 39 + server/src/repositories/index.ts | 4 + server/src/repositories/navigation-item.ts | 130 + server/src/repositories/navigation.ts | 113 + server/src/routes/admin.ts | 213 + server/{ => src}/routes/client.ts | 8 +- server/{ => src}/routes/index.ts | 2 +- server/src/schemas/config.ts | 63 + server/src/schemas/content-type.ts | 149 + server/src/schemas/index.ts | 3 + server/src/schemas/navigation.ts | 125 + server/src/services/admin/admin.ts | 764 + server/src/services/admin/index.ts | 5 + server/src/services/admin/types.ts | 63 + server/src/services/admin/utils.ts | 97 + server/src/services/client/client.ts | 510 + server/src/services/client/index.ts | 5 + server/src/services/client/types.ts | 77 + server/src/services/client/utils.ts | 98 + server/src/services/common/common.ts | 415 + server/src/services/common/index.ts | 5 + server/src/services/common/types.ts | 87 + server/src/services/common/utils.ts | 42 + server/src/services/index.ts | 16 + server/src/services/migration/index.ts | 5 + server/src/services/migration/migration.ts | 47 + server/src/types.ts | 73 + server/src/utils/constants.ts | 59 + server/src/utils/functions.ts | 164 + server/{ => src}/utils/index.ts | 2 +- server/tests/config/setup.test.ts | 169 + server/tests/content-types/audience.test.ts | 38 + .../content-types/navigation-item.test.ts | 152 + server/tests/content-types/navigation.test.ts | 90 + server/tests/controllers/admin.test.ts | 747 + server/tests/controllers/client.test.ts | 265 + server/tests/utils.ts | 16 + server/tests/utils/functions.test.ts | 248 + server/tsconfig.build.json | 10 + server/tsconfig.json | 9 + server/utils/__tests__/functions.test.ts | 259 - server/utils/constant.ts | 45 - server/utils/functions.ts | 484 - setup-package.ts | 22 +- strapi-admin.ts | 3 - strapi-server.ts | 3 - tsconfig.json | 37 - types/bootstrap.ts | 19 - types/config.ts | 34 - types/contentTypes.ts | 128 - types/controllers.ts | 46 - types/graphQL.ts | 3 - types/i18n.ts | 9 - types/index.ts | 9 - types/lifecycle.ts | 45 - types/services.ts | 61 - types/utils.ts | 128 - yarn.lock | 28159 ++++++++++------ 326 files changed, 33682 insertions(+), 23460 deletions(-) create mode 100644 .prettierrc create mode 100644 admin/custom.d.ts create mode 100644 admin/src/api/client.ts create mode 100644 admin/src/api/index.ts create mode 100644 admin/src/api/validators.ts delete mode 100644 admin/src/components/AdditionalFieldInput/index.tsx delete mode 100644 admin/src/components/AdditionalFieldInput/types.ts delete mode 100644 admin/src/components/Alert/styles.js delete mode 100644 admin/src/components/CollapseButton/index.js delete mode 100644 admin/src/components/ConfirmationDialog/index.js create mode 100644 admin/src/components/ConfirmationDialog/index.tsx delete mode 100644 admin/src/components/DragButton/index.tsx delete mode 100644 admin/src/components/EmptyView/index.js create mode 100644 admin/src/components/Initializer.tsx delete mode 100644 admin/src/components/Item/ItemCardBadge/index.js delete mode 100644 admin/src/components/Item/ItemCardHeader/Wrapper.tsx delete mode 100644 admin/src/components/Item/ItemCardHeader/icons.tsx delete mode 100644 admin/src/components/Item/ItemCardHeader/index.tsx delete mode 100644 admin/src/components/Item/ItemCardRemovedOverlay/index.js delete mode 100644 admin/src/components/Item/Wrapper.js delete mode 100644 admin/src/components/Item/index.js delete mode 100644 admin/src/components/NavigationItemList/index.js delete mode 100644 admin/src/components/RestartAlert/index.js create mode 100644 admin/src/components/RestartAlert/index.tsx create mode 100644 admin/src/components/icons/index.ts delete mode 100644 admin/src/components/icons/navigation.js create mode 100644 admin/src/components/icons/navigation.tsx create mode 100644 admin/src/components/icons/pluginIcon.tsx delete mode 100644 admin/src/contexts/DataManagerContext.js delete mode 100644 admin/src/hooks/useAllContentTypes.ts delete mode 100644 admin/src/hooks/useDataManager.js delete mode 100644 admin/src/hooks/useI18nCopyNavigationItemsModal.tsx delete mode 100644 admin/src/hooks/useNavigationConfig.js delete mode 100644 admin/src/index.js create mode 100644 admin/src/index.ts create mode 100644 admin/src/pages/App.tsx delete mode 100644 admin/src/pages/App/index.js delete mode 100644 admin/src/pages/DataManagerProvider/actions.js delete mode 100644 admin/src/pages/DataManagerProvider/index.js delete mode 100644 admin/src/pages/DataManagerProvider/init.js delete mode 100644 admin/src/pages/DataManagerProvider/reducer.js create mode 100644 admin/src/pages/HomePage/components/AdditionalFieldInput/index.tsx create mode 100644 admin/src/pages/HomePage/components/CollapseButton/index.tsx create mode 100644 admin/src/pages/HomePage/components/DragButton/index.tsx create mode 100644 admin/src/pages/HomePage/components/I18nCopyNavigationItems/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationContentHeader/index.tsx rename admin/src/{hooks/useNavigationManager.tsx => pages/HomePage/components/NavigationHeader/hooks.tsx} (65%) create mode 100644 admin/src/pages/HomePage/components/NavigationHeader/index.tsx rename admin/src/pages/{View/components/NavigationHeader/styles.js => HomePage/components/NavigationHeader/styles.ts} (81%) create mode 100644 admin/src/pages/HomePage/components/NavigationItemForm/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemForm/types.ts create mode 100644 admin/src/pages/HomePage/components/NavigationItemForm/utils/form.ts create mode 100644 admin/src/pages/HomePage/components/NavigationItemForm/utils/hooks.ts create mode 100644 admin/src/pages/HomePage/components/NavigationItemForm/utils/properties.ts rename admin/src/{components/NavigationItemList/Wrapper.js => pages/HomePage/components/NavigationItemList/Wrapper.ts} (75%) create mode 100644 admin/src/pages/HomePage/components/NavigationItemList/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardBadge/index.ts create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/Wrapper.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/icons.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardRemovedOverlay/index.ts create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/Wrapper.ts create mode 100644 admin/src/pages/HomePage/components/NavigationItemListItem/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupFooter.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupHeader.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationItemPopup/index.tsx rename admin/src/pages/{View => HomePage}/components/NavigationManager/AllNavigations/icons.tsx (50%) create mode 100644 admin/src/pages/HomePage/components/NavigationManager/AllNavigations/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/DeletionConfirm/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/ErrorDetails/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/Footer/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/Form/hooks.ts create mode 100644 admin/src/pages/HomePage/components/NavigationManager/Form/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/NavigationUpdate/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/NewNavigation/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/PurgeCacheConfirm/index.tsx create mode 100644 admin/src/pages/HomePage/components/NavigationManager/index.tsx rename admin/src/pages/{View => HomePage}/components/NavigationManager/types.ts (63%) rename admin/src/{ => pages/HomePage}/components/Search/index.tsx (58%) create mode 100644 admin/src/pages/HomePage/components/index.ts create mode 100644 admin/src/pages/HomePage/hooks/index.tsx create mode 100644 admin/src/pages/HomePage/index.tsx create mode 100644 admin/src/pages/HomePage/utils/index.ts create mode 100644 admin/src/pages/HomePage/utils/parsers.ts delete mode 100644 admin/src/pages/NoAccessPage/index.tsx delete mode 100644 admin/src/pages/SettingsPage/components/DisableI18nModal/index.tsx create mode 100644 admin/src/pages/SettingsPage/hooks/index.ts delete mode 100644 admin/src/pages/SettingsPage/utils/form.ts delete mode 100644 admin/src/pages/SettingsPage/utils/functions.js create mode 100644 admin/src/pages/SettingsPage/utils/index.ts delete mode 100644 admin/src/pages/View/components/I18nCopyNavigationItems/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationContentHeader/index.js delete mode 100644 admin/src/pages/View/components/NavigationHeader/index.js delete mode 100644 admin/src/pages/View/components/NavigationItemForm/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationItemForm/types.ts delete mode 100644 admin/src/pages/View/components/NavigationItemForm/utils/form.ts delete mode 100644 admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js delete mode 100644 admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js delete mode 100644 admin/src/pages/View/components/NavigationItemPopup/index.js delete mode 100644 admin/src/pages/View/components/NavigationManager/AllNavigations/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/DeletionConfirm/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/ErrorDetails/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/Footer/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/Form/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/NavigationUpdate/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/NewNavigation/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/PurgeCacheConfirm/index.tsx delete mode 100644 admin/src/pages/View/components/NavigationManager/index.tsx delete mode 100644 admin/src/pages/View/index.js delete mode 100644 admin/src/pages/View/utils/form.js delete mode 100644 admin/src/pages/View/utils/index.js delete mode 100644 admin/src/pages/View/utils/parsers.js delete mode 100644 admin/src/pages/View/utils/types.ts delete mode 100644 admin/src/permissions.js delete mode 100644 admin/src/pluginId.js create mode 100644 admin/src/pluginId.ts create mode 100644 admin/src/schemas/config.ts create mode 100644 admin/src/schemas/content-type.ts create mode 100644 admin/src/schemas/index.ts delete mode 100644 admin/src/translations/ca.json create mode 100644 admin/src/translations/ca.ts delete mode 100644 admin/src/translations/en.json create mode 100644 admin/src/translations/en.ts delete mode 100644 admin/src/translations/fr.json create mode 100644 admin/src/translations/fr.ts delete mode 100644 admin/src/translations/index.js create mode 100644 admin/src/translations/index.ts create mode 100644 admin/src/types.ts delete mode 100644 admin/src/utils/api.ts create mode 100644 admin/src/utils/constants.ts delete mode 100644 admin/src/utils/enums.ts delete mode 100644 admin/src/utils/functions.ts create mode 100644 admin/src/utils/getTranslation.ts delete mode 100644 admin/src/utils/index.ts create mode 100644 admin/src/utils/permissions.ts create mode 100644 admin/src/utils/prefixPluginTranslations.ts create mode 100644 admin/tsconfig.build.json create mode 100644 admin/tsconfig.json create mode 100644 migrations/strapi-plugin-navigation-3.0.0-no-1-related-id-to-documentid.js create mode 100644 migrations/strapi-plugin-navigation-3.0.0-no-2-locale-slug-regular-slug.js create mode 100644 migrations/strapi-plugin-navigation-3.0.0-no-3-morph-relation.js delete mode 100755 server/bootstrap/index.ts delete mode 100644 server/cache/__tests__/serviceEnhancers.test.ts delete mode 100644 server/cache/__tests__/utils.test.ts delete mode 100644 server/cache/index.ts delete mode 100644 server/cache/serviceEnhancers.ts delete mode 100644 server/cache/setupStrategy.ts delete mode 100644 server/cache/types.ts delete mode 100644 server/cache/utils.ts delete mode 100644 server/config/setupStrategy.ts delete mode 100644 server/content-types/index.ts delete mode 100644 server/content-types/navigation-item/lifecycles.ts delete mode 100644 server/content-types/navigation-item/schema.ts delete mode 100644 server/content-types/navigation/lifecycles.ts delete mode 100644 server/content-types/navigation/schema.ts delete mode 100644 server/content-types/navigations-items-related/index.ts delete mode 100644 server/content-types/navigations-items-related/schema.ts delete mode 100644 server/controllers/admin.ts delete mode 100644 server/controllers/client.ts delete mode 100644 server/controllers/index.ts delete mode 100644 server/destroy.ts delete mode 100644 server/graphql/config.ts delete mode 100644 server/graphql/index.js delete mode 100644 server/graphql/queries/index.js delete mode 100644 server/graphql/queries/render-navigation-child.js delete mode 100644 server/graphql/queries/render-navigation.js delete mode 100644 server/graphql/resolvers-config.js delete mode 100644 server/graphql/setupStrategy.ts delete mode 100644 server/graphql/types/content-types-name-fields.js delete mode 100644 server/graphql/types/content-types.js delete mode 100644 server/graphql/types/create-navigation-item.js delete mode 100644 server/graphql/types/create-navigation-related.js delete mode 100644 server/graphql/types/create-navigation.js delete mode 100644 server/graphql/types/index.js delete mode 100644 server/graphql/types/navigation-config.js delete mode 100644 server/graphql/types/navigation-item-additional-field-media.js delete mode 100644 server/graphql/types/navigation-item-related-data.js delete mode 100644 server/graphql/types/navigation-item.js delete mode 100644 server/graphql/types/navigation-render-type.js delete mode 100644 server/graphql/types/navigation.js delete mode 100644 server/i18n/__tests__/utils.test.ts delete mode 100644 server/i18n/constant.ts delete mode 100644 server/i18n/errors.ts delete mode 100644 server/i18n/graphQLEnhancers.ts delete mode 100644 server/i18n/index.ts delete mode 100644 server/i18n/navigationSetupStrategy.ts delete mode 100644 server/i18n/serviceEnhancers.ts delete mode 100644 server/i18n/types.ts delete mode 100644 server/i18n/utils.ts delete mode 100644 server/navigation/index.ts delete mode 100644 server/navigation/setupStrategy.ts delete mode 100644 server/register/index.ts delete mode 100644 server/routes/admin.ts delete mode 100644 server/services/__tests__/service.test.ts delete mode 100644 server/services/admin.ts delete mode 100644 server/services/client.ts delete mode 100644 server/services/common.ts delete mode 100644 server/services/index.ts create mode 100644 server/src/app-errors.ts create mode 100644 server/src/bootstrap.ts create mode 100644 server/src/cache/index.ts rename server/{ => src}/config/index.ts (68%) create mode 100644 server/src/config/setup.ts rename server/{ => src}/content-types/audience/index.ts (100%) rename server/{ => src}/content-types/audience/schema.ts (100%) create mode 100644 server/src/content-types/index.ts rename server/{ => src}/content-types/navigation-item/index.ts (100%) create mode 100644 server/src/content-types/navigation-item/lifecycles.ts create mode 100644 server/src/content-types/navigation-item/schema.ts rename server/{ => src}/content-types/navigation/index.ts (100%) create mode 100644 server/src/content-types/navigation/lifecycles.ts create mode 100644 server/src/content-types/navigation/schema.ts create mode 100644 server/src/controllers/admin.ts create mode 100644 server/src/controllers/client.ts create mode 100644 server/src/controllers/index.ts create mode 100644 server/src/controllers/utils.ts create mode 100644 server/src/controllers/validators.ts create mode 100644 server/src/destroy.ts create mode 100644 server/src/dtos/config.ts create mode 100644 server/src/dtos/index.ts create mode 100644 server/src/dtos/navigation-item.ts create mode 100644 server/src/dtos/navigation.ts create mode 100644 server/src/graphql/config.ts create mode 100644 server/src/graphql/index.ts create mode 100644 server/src/graphql/queries/index.ts create mode 100644 server/src/graphql/queries/render-navigation-child.ts create mode 100644 server/src/graphql/queries/render-navigation.ts create mode 100644 server/src/graphql/resolvers-config.ts create mode 100644 server/src/graphql/setup.ts create mode 100644 server/src/graphql/types/content-types-name-fields.ts create mode 100644 server/src/graphql/types/content-types.ts create mode 100644 server/src/graphql/types/create-navigation-item.ts create mode 100644 server/src/graphql/types/create-navigation-related.ts create mode 100644 server/src/graphql/types/create-navigation.ts create mode 100644 server/src/graphql/types/index.ts create mode 100644 server/src/graphql/types/navigation-config.ts rename server/{graphql/types/navigation-details.js => src/graphql/types/navigation-details.ts} (65%) create mode 100644 server/src/graphql/types/navigation-item-additional-field-media.ts create mode 100644 server/src/graphql/types/navigation-item-additional-fields.ts create mode 100644 server/src/graphql/types/navigation-item-related-data.ts rename server/{graphql/types/navigation-item-related.js => src/graphql/types/navigation-item-related.ts} (57%) create mode 100644 server/src/graphql/types/navigation-item.ts create mode 100644 server/src/graphql/types/navigation-render-type.ts create mode 100644 server/src/graphql/types/navigation.ts create mode 100644 server/src/i18n/index.ts rename server/{ => src}/index.ts (70%) create mode 100644 server/src/middlewares/index.ts create mode 100644 server/src/permissions.ts create mode 100644 server/src/permissions/index.ts create mode 100644 server/src/permissions/permissions.ts create mode 100644 server/src/permissions/setup.ts create mode 100644 server/src/policies/index.ts create mode 100644 server/src/register.ts create mode 100644 server/src/repositories/audience.ts create mode 100644 server/src/repositories/generic.ts create mode 100644 server/src/repositories/index.ts create mode 100644 server/src/repositories/navigation-item.ts create mode 100644 server/src/repositories/navigation.ts create mode 100644 server/src/routes/admin.ts rename server/{ => src}/routes/client.ts (79%) rename server/{ => src}/routes/index.ts (83%) create mode 100644 server/src/schemas/config.ts create mode 100644 server/src/schemas/content-type.ts create mode 100644 server/src/schemas/index.ts create mode 100644 server/src/schemas/navigation.ts create mode 100644 server/src/services/admin/admin.ts create mode 100644 server/src/services/admin/index.ts create mode 100644 server/src/services/admin/types.ts create mode 100644 server/src/services/admin/utils.ts create mode 100644 server/src/services/client/client.ts create mode 100644 server/src/services/client/index.ts create mode 100644 server/src/services/client/types.ts create mode 100644 server/src/services/client/utils.ts create mode 100644 server/src/services/common/common.ts create mode 100644 server/src/services/common/index.ts create mode 100644 server/src/services/common/types.ts create mode 100644 server/src/services/common/utils.ts create mode 100644 server/src/services/index.ts create mode 100644 server/src/services/migration/index.ts create mode 100644 server/src/services/migration/migration.ts create mode 100644 server/src/types.ts create mode 100644 server/src/utils/constants.ts create mode 100644 server/src/utils/functions.ts rename server/{ => src}/utils/index.ts (50%) create mode 100644 server/tests/config/setup.test.ts create mode 100644 server/tests/content-types/audience.test.ts create mode 100644 server/tests/content-types/navigation-item.test.ts create mode 100644 server/tests/content-types/navigation.test.ts create mode 100644 server/tests/controllers/admin.test.ts create mode 100644 server/tests/controllers/client.test.ts create mode 100644 server/tests/utils.ts create mode 100644 server/tests/utils/functions.test.ts create mode 100644 server/tsconfig.build.json create mode 100644 server/tsconfig.json delete mode 100644 server/utils/__tests__/functions.test.ts delete mode 100644 server/utils/constant.ts delete mode 100644 server/utils/functions.ts delete mode 100644 strapi-admin.ts delete mode 100644 strapi-server.ts delete mode 100644 tsconfig.json delete mode 100644 types/bootstrap.ts delete mode 100644 types/config.ts delete mode 100644 types/contentTypes.ts delete mode 100644 types/controllers.ts delete mode 100644 types/graphQL.ts delete mode 100644 types/i18n.ts delete mode 100644 types/index.ts delete mode 100644 types/lifecycle.ts delete mode 100644 types/services.ts delete mode 100644 types/utils.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index 1362cea2..2c2ce599 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,12 +2,13 @@ version: 2.1 orbs: codecov: codecov/codecov@1.1.1 jobs: - build-and-test: + test: environment: CODECOV_TOKEN: c803c20c-c45d-4a63-9ba9-58c7d5d05bbf docker: - - image: cimg/node:18.18.2 + - image: cimg/node:20.12.2 working_directory: ~/repo + resource_class: large steps: - checkout - run: @@ -20,13 +21,17 @@ jobs: - restore_cache: keys: # when lock file changes, use increasingly general patterns to restore cache - - strapi-plugin-navigation-v1-{{ checksum "yarn.lock" }} - - strapi-plugin-navigation- + - strapi-plugin-navigation-v4-{{ checksum "yarn.lock" }} + - strapi-plugin-navigation-v4 - run: name: Echo versions command: | node --version yarn --version + - run: + name: Configure NPM + command: | + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc - run: name: Install command: | @@ -34,15 +39,56 @@ jobs: - run: name: Test command: | - yarn test:unit + yarn test:unit:ci + environment: + JEST_JUNIT_OUTPUT_DIR: ./reports/ + - store_test_results: + path: ./reports/ - codecov/upload: flags: unittest file: - save_cache: paths: - ./node_modules - key: strapi-plugin-navigation-v1-{{ checksum "yarn.lock" }} + key: strapi-plugin-navigation-v3-{{ checksum "yarn.lock" }} + - persist_to_workspace: + root: ~/repo + paths: . + deploy: + environment: + CODECOV_TOKEN: c803c20c-c45d-4a63-9ba9-58c7d5d05bbf + docker: + - image: cimg/node:20.12.2 + working_directory: ~/repo + resource_class: large + steps: + - attach_workspace: + at: ~/repo + - run: + name: Configure NPM + command: | + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc + - run: + name: Build + command: | + yarn build + - run: + name: Publish package + command: npm publish --tag beta + workflows: - build-and-test: - jobs: - - build-and-test + version: 2 + test-deploy: + jobs: + - test: + filters: + tags: + only: /^v.*/ + - deploy: + requires: + - test + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 17a0dba4..e2daaf73 100644 --- a/.gitignore +++ b/.gitignore @@ -79,6 +79,7 @@ $RECYCLE.BIN/ *# ssl .idea +.vscode nbproject public/uploads/* !public/uploads/.gitkeep @@ -94,8 +95,8 @@ logs results node_modules .node_history -yarn.lock package-lock.json +.yarnrc.yml ############################ @@ -104,6 +105,7 @@ package-lock.json testApp coverage +junit.xml ############################ # Strapi @@ -112,4 +114,5 @@ coverage .env exports .cache -build +dist +.vscode diff --git a/.npmignore b/.npmignore index 784cb629..dd34767f 100644 --- a/.npmignore +++ b/.npmignore @@ -9,4 +9,5 @@ codecov.yml *.spec.* setup-package.* **/__tests__/** -**/__mocks__/** \ No newline at end of file +**/__mocks__/** +migrations/** \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 49991d30..3f330989 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.14.0 +v20.12.0 \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..a6a6978f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "endOfLine": "lf", + "tabWidth": 2, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/README.md b/README.md index da3af042..82efbfef 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Logo - Strapi Navigation plugin
-

Strapi v4 - Navigation plugin

+

Strapi - Navigation plugin

Create consumable navigation with a simple and straightforward visual builder

GitHub package.json version @@ -30,6 +30,7 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo - Tree (nested) - RFR (ready for handling by Redux First Router) + ### Table of Contents 1. [💎 Versions](#-versions) 2. [✨ Features](#-features) @@ -54,8 +55,8 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo 17. [👨‍💻 Community support](#-community-support) ## 💎 Versions -- **Strapi v5** - [v3.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/v5) -- **Strapi v4** - (current) [v2.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation) +- **Strapi v5** - (current) [v3.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation) +- **Strapi v4** - [v2.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/strapi-v4) - **Strapi v3** - [v1.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/strapi-v3) ## ✨ Features @@ -70,14 +71,9 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo - **Customizable:** Possibility to customize the options like: available Content Types, Maximum level for "attach to menu", Additional fields (audience) - **[Audit log](https://github.com/VirtusLab/strapi-molecules/tree/master/packages/strapi-plugin-audit-log):** integration with Strapi Molecules Audit Log plugin that provides changes track record -## ⚙️ Versions - -- **Strapi v4** - (current) - [v2.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation) -- **Strapi v3** - [v1.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/strapi-v3) - ## ⏳ Installation -### Via Strapi Markerplace +### Via Strapi Marketplace As a ✅ **verified** plugin by Strapi team we're available on the [**Strapi Marketplace**](https://market.strapi.io/plugins/strapi-plugin-navigation) as well as **In-App Marketplace** where you can follow the installation instructions. @@ -90,7 +86,7 @@ As a ✅ **verified** plugin by Strapi team we're available on the [**Strapi Mar It's recommended to use **yarn** to install this plugin within your Strapi project. [You can install yarn with these docs](https://yarnpkg.com/lang/en/docs/install/). ```bash -yarn add strapi-plugin-navigation@latest +yarn add strapi-plugin-navigation@beta ``` After successful installation you've to re-build your Strapi instance. To archive that simply use: @@ -100,12 +96,6 @@ yarn build yarn develop ``` -or just run Strapi in the development mode with `--watch-admin` option: - -```bash -yarn develop --watch-admin -``` - The **UI Navigation** plugin should appear in the **Plugins** section of Strapi sidebar after you run app again. You can manage your multiple navigation containers by going to the **Navigation** manage view by clicking "Manage" button. @@ -124,20 +114,18 @@ Complete installation requirements are exact same as for Strapi itself and can b **Supported Strapi versions**: -- Strapi v4.25.11 (recently tested) -- Strapi v4.x +- Strapi v5.5.1 (recently tested) +- Strapi v5.x -> This plugin is designed for **Strapi v4** and is not working with v3.x. To get version for **Strapi v3** install version [v1.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/strapi-v3). +> This plugin is designed for **Strapi v5** and is not working with v4.x. To get version for **Strapi v4** install version [v4.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/strapi-v4). **We recommend always using the latest version of Strapi to start your new projects**. ## 🔧 Configuration -To start your journey with **Navigation plugin** you must first setup it using the dedicated Settings page (`v2.0.3` and newer) or for any version, put your configuration in `config/plugins.js`. Anyway we're recommending the click-through option where your configuration is going to be properly validated. - -### In `v2.0.3` and newer +To start your journey with **Navigation plugin** you must first setup it using the dedicated Settings page or for any version, put your configuration in `config/plugins.js`. Anyway we're recommending the click-through option where your configuration is going to be properly validated. -Version `2.0.3` introduces the intuitive **Settings** page which you can easily access via `Strapi Settings -> Section: Navigation Plugin -> Configuration`. +### Settings page On the dedicated page, you will be able to set up all crucial properties which drive the plugin and customize each individual collection for which **Navigation plugin** should be enabled. @@ -148,15 +136,10 @@ On the dedicated page, you will be able to set up all crucial properties which d > *Note* > The default configuration for your plugin is fetched from `config/plugins.js` or, if the file is not there, directly from the plugin itself. If you would like to customize the default state to which you might revert, please follow the next section. -### In `v2.0.2` and older + default configuration state for `v2.0.3` and newer +### File Config for this plugin is stored as a part of the `config/plugins.js` or `config//plugins.js` file. You can use the following snippet to make sure that the config structure is correct. If you've got already configurations for other plugins stores by this way, you can use the `navigation` along with them. -> *Note v2.0.3 and newer only* -> Changing this file will not automatically change plugin configuration. To synchronize plugin's config with plugins.js file, it is necessary to restore configuration through the settings page - -> *Note for newer than v2.2.0* -> `slugify` as been removed. **THIS A BREAKING CHANGE** ```js module.exports = ({ env }) => ({ @@ -194,7 +177,7 @@ Config for this plugin is stored as a part of the `config/plugins.js` or `config ### Additional Fields It is advised to configure additional fields through the plugin's Settings Page. There you can find the table of custom fields and toggle input for the audience field. When enabled, the audience field can be customized through the content manager. Custom fields can be added, edited, toggled, and removed with the use of the table provided on the Settings Page. When removing custom fields be advised that their values in navigation items will be lost. Disabling the custom fields will not affect the data and can be done with no consequence of loosing information. -Creating configuration for additional fields with the `config.js` file should be done with caution. Config object contains the `additionalFields` property of type `Array`, where CustomField is of type `{ type: 'string' | 'boolean' | { "name": string, "url": string, "mime": string, "width": number, "height": number, "previewUrl": string }, name: string, label: string }`. When creating custom fields be advised that the `name` property has to be unique. When editing a custom field it is advised not to edit its `name` and `type` properties. After config has been restored the custom fields that are not present in `config.js` file will be deleted and their values in navigation items will be lost. +Creating configuration for additional fields with the `config.(js|ts)` file should be done with caution. Config object contains the `additionalFields` property of type `Array`, where CustomField is of type `{ type: 'string' | 'boolean' | { "name": string, "url": string, "mime": string, "width": number, "height": number, "previewUrl": string }, name: string, label: string }`. When creating custom fields be advised that the `name` property has to be unique. When editing a custom field it is advised not to edit its `name` and `type` properties. After config has been restored the custom fields that are not present in `config.js` file will be deleted and their values in navigation items will be lost. ## 🔧 GQL Configuration Using navigation with GraphQL requires both plugins to be installed and working. You can find installation guide for GraphQL plugin **[here](https://docs.strapi.io/developer-docs/latest/plugins/graphql.html#graphql)**. To properly configure GQL to work with navigation you should provide `gql` prop. This should contain union types that will be used to define GQL response format for your data while fetching: @@ -227,15 +210,7 @@ where `Page` and `UploadFile` are your type names for the **Content Types** you' ## 🌍 i18n Internationalization -### Settings - -This feature is **opt-in**. - -In order to use this functionality setting **default locale** is required. (See: Settings -> Internationalization) - -Once feature is enabled a restart is required. On server startup missing navigations for other locales will be created. From then you can manage navigation's localizations just like before. - -If you want go back to _pre-i18n_ way you can disable it in settings. Already created navigations will not be removed unless you make a choice for plugin to do so(this will require a restart). +On server startup missing navigations for other locales will be created. From then you can manage navigation's localizations just like before. If your newly created navigation localization is empty you can copy contents of one version's to the empty one. If related item is localized and locale version exists localization will be used as a related item. Otherwise plugin will fallback to an original item. @@ -340,7 +315,6 @@ Is applied for **Public API** both for REST and GraphQL. You can manage is by tw { "id": "News", "title": "News", - "templateName": "pages:1", "related": { "contentType": "page", "collectionName": "pages", @@ -375,10 +349,6 @@ Plugin supports both **REST API** and **GraphQL API** exposed by Strapi. ### REST API -> **Important!** -> Version `v2.0.13` introduced breaking change! -> All responses have changed their structure. Related field will now be of type ContentType instead of Array\ - `GET /api/navigation/?locale=&orderBy=&orderDirection=` NOTE: All params are optional @@ -396,7 +366,7 @@ NOTE: All params are optional "visible": true, "createdAt": "2023-09-29T12:45:54.399Z", "updatedAt": "2023-09-29T13:44:08.702Z", - "localeCode": "pl" + "locale": "pl" }, { "id": 384, @@ -405,7 +375,7 @@ NOTE: All params are optional "visible": true, "createdAt": "2023-09-29T12:45:54.399Z", "updatedAt": "2023-09-29T13:44:08.725Z", - "localeCode": "fr" + "locale": "fr" }, { "id": 382, @@ -414,7 +384,7 @@ NOTE: All params are optional "visible": true, "createdAt": "2023-09-29T12:45:54.173Z", "updatedAt": "2023-09-29T13:44:08.747Z", - "localeCode": "en" + "locale": "en" }, { "id": 374, @@ -423,7 +393,7 @@ NOTE: All params are optional "visible": true, "createdAt": "2023-09-29T12:22:30.373Z", "updatedAt": "2023-09-29T13:44:08.631Z", - "localeCode": "pl" + "locale": "pl" }, { "id": 375, @@ -432,7 +402,7 @@ NOTE: All params are optional "visible": true, "createdAt": "2023-09-29T12:22:30.373Z", "updatedAt": "2023-09-29T13:44:08.658Z", - "localeCode": "fr" + "locale": "fr" }, { "id": 373, @@ -441,7 +411,7 @@ NOTE: All params are optional "visible": true, "createdAt": "2023-09-29T12:22:30.356Z", "updatedAt": "2023-09-29T13:44:08.680Z", - "localeCode": "en" + "locale": "en" } ] ``` @@ -527,7 +497,6 @@ Return a rendered navigation structure depends on passed type (`TREE`, `RFR` or "News": { "id": "News", "title": "News", - "templateName": "pages:1", "related": { "contentType": "page", "collectionName": "pages", @@ -541,7 +510,6 @@ Return a rendered navigation structure depends on passed type (`TREE`, `RFR` or "Community": { "id": "Community", "title": "Community", - "templateName": "pages:2", "related": { "contentType": "page", "collectionName": "pages", @@ -555,7 +523,6 @@ Return a rendered navigation structure depends on passed type (`TREE`, `RFR` or "Highlights": { "id": "Highlights", "title": "Highlights", - "templateName": "pages:3", "related": { "contentType": "page", "collectionName": "pages", @@ -700,14 +667,6 @@ query { } ``` -### Template name - -Depending on a content type `templateName` will be resolved differently - -For collection types it will be read from content type's attribute name `template` holding a component which definition has option named `templateName`. - -For single types a global name of this content type will be used as a template name or it can be set manually with an option named `templateName`. - ## 🔌 Extensions ### Slug generation @@ -819,27 +778,34 @@ If you already got it, make sure that `navigation` plugin is inserted before `gr Feel free to fork and make a Pull Request to this plugin project. All the input is warmly welcome! -- Clone repository +1. Clone repository + + ``` + git clone git@github.com:VirtusLab-Open-Source/strapi-plugin-navigation.git + ``` - ``` - git clone git@github.com:VirtusLab-Open-Source/strapi-plugin-navigation.git - ``` +2. Run `install` & `watch:link` command -- Create a soft link in your strapi project to plugin build folder + ```ts + // Install all dependencies + yarn install - ```sh - ln -s <...>/strapi-plugin-navigation/build <...>/strapi-project/src/plugins/navigation - ``` + // Watch for file changes using `plugin-sdk` and follow the instructions provided by this official Strapi developer tool + yarn watch:link + ``` -- Run build command +3. Within the Strapi project, modify `config/plugins.{js,ts}` for `imgix` - ```ts - // Watch for file changes - yarn develop +```ts +//... +'navigation': { + enabled: true, + //... +} +//... +``` - // or run build without nodemon - yarn build:dev - ``` +4. Run your Strapi instance ## 👨‍💻 Community support diff --git a/admin/custom.d.ts b/admin/custom.d.ts new file mode 100644 index 00000000..f5d1b284 --- /dev/null +++ b/admin/custom.d.ts @@ -0,0 +1,2 @@ +declare module '@strapi/design-system/*'; +declare module '@strapi/design-system'; diff --git a/admin/src/api/client.ts b/admin/src/api/client.ts new file mode 100644 index 00000000..f5952910 --- /dev/null +++ b/admin/src/api/client.ts @@ -0,0 +1,192 @@ +import { getFetchClient } from '@strapi/strapi/admin'; +import { once } from 'lodash'; +import { strapiContentTypeSchema } from '../schemas'; +import { + NavigationPluginConfigSchema, + NavigationSchema, + configFromServerSchema, + i18nCopyItemDetails, + localeSchema, + navigationSchema, + slugifyResult, + strapiContentTypeItemSchema, +} from './validators'; + +const URL_PREFIX = 'navigation'; + +export type ApiClient = ReturnType; + +export const getApiClient = once((fetch: ReturnType) => ({ + getIndexPrefix() { + return [URL_PREFIX]; + }, + + readAll() { + return fetch.get(`/${URL_PREFIX}`).then(({ data }) => navigationSchema.array().parse(data)); + }, + readAllIndex() { + return [URL_PREFIX, 'navigations']; + }, + + delete(documentId: string) { + return fetch.del(`/${URL_PREFIX}/${documentId}`); + }, + + create(body: Omit) { + return fetch.post(`/${URL_PREFIX}/`, body); + }, + + update(body: NavigationSchema) { + return fetch.put(`/${URL_PREFIX}/${body.documentId}`, body); + }, + + purge({ documentId, withLangVersions }: { documentId?: string; withLangVersions?: boolean }) { + return fetch.del( + `/${URL_PREFIX}/cache/purge/${documentId ?? ''}?clearLocalisations=${!!withLangVersions}` + ); + }, + + slugify(query: string) { + const queryParams = new URLSearchParams(); + + queryParams.append('q', query); + + return fetch + .get(`/${URL_PREFIX}/slug?${queryParams.toString()}`) + .then(({ data }) => slugifyResult.parse(data)) + .then(({ slug }) => slug); + }, + + readConfig() { + return fetch + .get(`/${URL_PREFIX}/config`) + .then(({ data }) => configFromServerSchema.parse(data)); + }, + readConfigIndex() { + return [URL_PREFIX, 'config']; + }, + + healthCheck() { + return fetch + .get(`/_health`); + }, + + healthCheckIndex() { + return ['health']; + }, + + readNavigationItemFromLocale({ + source, + structureId, + target, + documentId, + }: { + source: string; + target: string; + documentId: string; + structureId: string; + }) { + return fetch.get( + `/${URL_PREFIX}/i18n/item/read/${documentId}/${source}/${target}?path=${structureId}` + ); + }, + + updateConfig( + body: Omit + ) { + return fetch.put(`/${URL_PREFIX}/config`, body).then(() => {}); + }, + + restart() { + return fetch.get(`/${URL_PREFIX}/settings/restart`).then(() => {}); + }, + + restoreConfig() { + return fetch.del(`/${URL_PREFIX}/config`).then(() => {}); + }, + + readSettingsConfig() { + return fetch.get(`/${URL_PREFIX}/settings/config`).then(({ data }) => { + const fromServer = configFromServerSchema.parse(data); + + return { + ...fromServer, + contentTypes: fromServer.contentTypes.map(({ uid }) => uid), + }; + }); + }, + readSettingsConfigIndex() { + return [URL_PREFIX, 'config']; + }, + + readContentType() { + return fetch + .get(`/content-manager/content-types`) + .then(({ data }) => strapiContentTypeSchema.array().parse(data.data)); + }, + readContentTypeIndex() { + return [URL_PREFIX, 'content-manager', 'content-types']; + }, + + readContentTypeItems({ uid, locale, query }: { uid: string; locale?: string; query?: string }) { + const queryParams = new URLSearchParams(); + + if (query) { + queryParams.append('_q', query); + } + + if (locale) { + queryParams.append('locale', locale); + } + + return fetch + .get(`/${URL_PREFIX}/content-type-items/${uid}?${queryParams.toString()}`) + .then(({ data }) => strapiContentTypeItemSchema.array().parse(data)); + }, + readContentTypeItemsIndex({ + uid, + locale, + query, + }: { + uid: string; + locale?: string; + query?: string; + }) { + return [URL_PREFIX, 'content-manager', 'content-type-items', uid, locale, query]; + }, + + readLocale() { + return fetch + .get(`/${URL_PREFIX}/settings/locale`) + .then((data) => localeSchema.parse(data.data)); + }, + readLocaleIndex() { + return [URL_PREFIX, 'locale']; + }, + + copyNavigationLocale({ + documentId, + source, + target, + }: { + source: string; + target: string; + documentId: string; + }) { + return fetch.put(`/${URL_PREFIX}/i18n/copy/${documentId}/${source}/${target}`); + }, + + copyNavigationItemLocale({ + source, + structureId = '', + target, + }: { + source: string; + target: string; + structureId?: string; + }) { + return fetch + .get(`/${URL_PREFIX}/i18n/item/read/${source}/${target}?path=${structureId}`) + .then((data) => i18nCopyItemDetails.parse(data.data)); + }, +})); diff --git a/admin/src/api/index.ts b/admin/src/api/index.ts new file mode 100644 index 00000000..4f1cce44 --- /dev/null +++ b/admin/src/api/index.ts @@ -0,0 +1 @@ +export * from './client'; diff --git a/admin/src/api/validators.ts b/admin/src/api/validators.ts new file mode 100644 index 00000000..aef6b385 --- /dev/null +++ b/admin/src/api/validators.ts @@ -0,0 +1,325 @@ +import * as z from 'zod'; + +export type NavigationPluginConfigSchema = z.infer; + +export type AudienceDBSchema = z.infer; +export const audienceDBSchema = z.object({ + id: z.number(), + documentId: z.string(), + name: z.string(), + key: z.string(), +}); + +export type NavigationItemTypeSchema = z.infer; +export const navigationItemTypeSchema = z.enum(['INTERNAL', 'EXTERNAL', 'WRAPPER']); + +const navigationItemBaseSchema = z.object({ + id: z.number(), + documentId: z.string(), + title: z.string(), + type: navigationItemTypeSchema, + path: z.string(), + externalPath: z.string().or(z.null()).optional(), + uiRouterKey: z.string(), + menuAttached: z.boolean(), + order: z.number().int(), + collapsed: z.boolean(), + autoSync: z.boolean().or(z.null()).optional(), + related: z + .object({ documentId: z.string().optional(), __type: z.string() }) + .catchall(z.unknown()) + .nullish(), + additionalFields: z.record(z.string(), z.unknown()).or(z.null()).optional(), + audience: z.array(audienceDBSchema).or(z.null()).optional(), + viewId: z.number().optional(), + viewParentId: z.number().optional(), + structureId: z.string().optional(), + removed: z.boolean().optional(), + isSearchActive: z.boolean().optional(), + updated: z.boolean().optional(), +}); + +export type NavigationItemSchema = z.infer & { + items?: NavigationItemSchema[] | null; +}; +export const navigationItemSchema: z.ZodType = + navigationItemBaseSchema.extend({ + items: z.lazy(() => navigationItemSchema.array().or(z.null())).optional(), + }); + +export type NavigationSchema = z.infer; +export const navigationSchema = z.object({ + id: z.number(), + documentId: z.string(), + name: z.string(), + slug: z.string(), + locale: z.string(), + visible: z.boolean(), + items: z.array(navigationItemSchema), +}); + +const navigationCustomFieldBase = z.object({ + // TODO: Proper message translation + name: z.string().refine((current) => !current.includes(' '), { message: 'No space allowed' }), + label: z.string(), + required: z.boolean().optional(), + enabled: z.boolean().optional(), +}); + +export type NavigationItemCustomFieldSelect = z.infer; +const navigationItemCustomFieldSelect = navigationCustomFieldBase.extend({ + type: z.literal('select'), + multi: z.boolean(), + options: z.array(z.string()), +}); + +export type NavigationItemCustomFieldPrimitive = z.infer; +const navigationItemCustomFieldPrimitive = navigationCustomFieldBase.extend({ + type: z.enum(['boolean', 'string']), + multi: z.literal(false).optional(), + options: z.array(z.string()).max(0).optional(), +}); + +export type NavigationItemCustomFieldMedia = z.infer; +const navigationItemCustomFieldMedia = navigationCustomFieldBase.extend({ + type: z.literal('media'), + multi: z.literal(false).optional(), + options: z.array(z.string()).max(0).optional(), +}); + +export type NavigationItemCustomField = z.infer; +export const navigationItemCustomField = navigationItemCustomFieldPrimitive + .or(navigationItemCustomFieldMedia) + .or(navigationItemCustomFieldSelect); + +export type NavigationItemAdditionalField = z.infer; +export const navigationItemAdditionalField = z.union([ + z.literal('audience'), + navigationItemCustomField, +]); + +export const configContentTypeSchema = z.object({ + uid: z.string(), + name: z.string(), + draftAndPublish: z.boolean(), + isSingle: z.boolean(), + description: z.string(), + collectionName: z.string(), + contentTypeName: z.string(), + label: z.string(), + labelSingular: z.string(), + endpoint: z.string(), + available: z.boolean(), + visible: z.boolean(), +}); + +export const configSchema = z.object({ + additionalFields: z.array(navigationItemAdditionalField), + allowedLevels: z.number(), + availableAudience: z + .object({ + id: z.number(), + documentId: z.string(), + name: z.string(), + key: z.string(), + }) + .array(), + contentTypes: z.array(z.string()), + contentTypesNameFields: z.record(z.string(), z.array(z.string())), + contentTypesPopulate: z.record(z.string(), z.array(z.string())), + gql: z.object({ + navigationItemRelated: z.array(z.string()), + }), + pathDefaultFields: z.record(z.string(), z.string().array()), + cascadeMenuAttached: z.boolean(), + preferCustomContentTypes: z.boolean(), + allowedContentTypes: z.string().array(), + restrictedContentTypes: z.string().array(), + isCacheEnabled: z.boolean().optional(), + isCachePluginEnabled: z.boolean().optional(), +}); + +export type ConfigFromServerSchema = z.infer; +export const configFromServerSchema = configSchema + .omit({ + contentTypes: true, + }) + .extend({ + contentTypes: configContentTypeSchema.array(), + }); + +export const localeSchema = z.object({ + defaultLocale: z.string(), + restLocale: z.string().array(), +}); + +export type ContentType = z.infer; +export const contentType = z.enum(['collectionType', 'singleType']); + +export type ContentTypeInfo = z.infer; +export const contentTypeInfo = z.object({ + singularName: z.string(), + pluralName: z.string(), + displayName: z.string(), + description: z.string().optional(), + name: z.string().optional(), +}); + +export type ContentTypeAttributeValidator = z.infer; +export const contentTypeAttributeValidator = z.object({ + required: z.boolean().optional(), + max: z.number().optional(), + min: z.number().optional(), + minLength: z.number().optional(), + maxLength: z.number().optional(), + private: z.boolean().optional(), + configurable: z.boolean().optional(), + default: z.any().optional(), +}); + +export type contentTypeFieldTypeSchema = z.infer; +export const contentTypeFieldTypeSchema = z.enum([ + 'string', + 'text', + 'richtext', + 'blocks', + 'email', + 'password', + 'date', + 'time', + 'datetime', + 'timestamp', + 'boolean', + 'integer', + 'biginteger', + 'float', + 'decimal', + 'json', + 'relation', +]); + +export type SimpleContentTypeAttribute = z.infer; +export const simpleContentTypeAttribute = contentTypeAttributeValidator.extend({ + type: contentTypeFieldTypeSchema, +}); + +export type ContentTypeEnumerationAttribute = z.infer; +export const contentTypeEnumerationAttribute = contentTypeAttributeValidator.extend({ + type: z.literal('enumeration'), + enum: z.string().array(), +}); + +export type ContentTypeComponentAttribute = z.infer; +export const contentTypeComponentAttribute = z.object({ + type: z.literal('component'), + component: z.string(), + repeatable: z.boolean().optional(), +}); + +export type ContentTypeDynamicZoneAttribute = z.infer; +export const contentTypeDynamicZoneAttribute = z.object({ + type: z.literal('dynamiczone'), + components: z.string().array(), +}); + +export type ContentTypeMediaAttribute = z.infer; +export const contentTypeMediaAttribute = z.object({ + media: z.literal('media'), + allowedTypes: z.enum(['images', 'videos', 'files']).array(), + required: z.boolean().optional(), +}); + +export type ContentTypeRelationType = z.infer; +export const contentTypeRelationType = z.enum([ + 'oneToOne', + 'oneToMany', + 'manyToOne', + 'manyToMany', + 'morphToMany', + 'manyToMorph', +]); + +export type ContentTypeRelationAttribute = z.infer; +export const contentTypeRelationAttribute = z.object({ + type: z.literal('relation'), + relation: contentTypeRelationType, + target: z.string(), + mappedBy: z.string().optional(), + inversedBy: z.string().optional(), +}); + +export type ContentTypeAttributes = z.infer; +export const contentTypeAttributes = z.record( + z.string(), + z.union([ + simpleContentTypeAttribute, + contentTypeEnumerationAttribute, + contentTypeComponentAttribute, + contentTypeDynamicZoneAttribute, + contentTypeRelationAttribute, + contentTypeMediaAttribute, + ]) +); + +export type ContentTypeFullSchema = z.infer; +export const contentTypeFullSchema = z.object({ + kind: contentType, + collectionName: z.string(), + info: contentTypeInfo, + options: z + .object({ + draftAndPublish: z.boolean().optional(), + hidden: z.boolean().optional(), + templateName: z.string().optional(), + }) + .optional(), + attributes: contentTypeAttributes, + actions: z.record(z.string(), z.any()).optional(), + lifecycles: z.record(z.string(), z.any()).optional(), + uid: z.string(), + apiName: z.string().optional(), + + // TODO?: remove + associations: z + .object({ + model: z.string(), + alias: z.string(), + }) + .array() + .optional(), + modelName: z.string().optional(), + plugin: z.string().optional(), + pluginOptions: z.record(z.string(), z.any()).optional(), + isSingle: z.boolean().optional(), +}); + +export type ContentTypeSchema = z.infer; +export const contentTypeSchema = contentTypeFullSchema.pick({ + info: true, + kind: true, + attributes: true, + options: true, +}); + +export type StrapiContentTypeItemSchema = z.infer; +export const strapiContentTypeItemSchema = z + .object({ + id: z.number(), + documentId: z.string(), + locale: z.string().or(z.null()).optional(), + }) + .and(z.record(z.string(), z.any())); + +export const slugifyResult = z.object({ slug: z.string() }); + +export const i18nCopyItemDetails = z.object({ + externalPath: z.string().or(z.null()).optional(), + path: z.string().or(z.null()).optional(), + related: z + .object({ documentId: z.string().optional(), __type: z.string() }) + .catchall(z.unknown()) + .nullish(), + title: z.string(), + type: navigationItemTypeSchema, + uiRouterKey: z.string(), +}); diff --git a/admin/src/components/AdditionalFieldInput/index.tsx b/admin/src/components/AdditionalFieldInput/index.tsx deleted file mode 100644 index 0c76a1bc..00000000 --- a/admin/src/components/AdditionalFieldInput/index.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import React, { BaseSyntheticEvent, useEffect, useMemo } from "react"; -import { ToBeFixed, assertBoolean, assertString } from "../../../../types"; -//@ts-ignore -import { ToggleInput } from "@strapi/design-system/ToggleInput"; -//@ts-ignore -import { TextInput } from "@strapi/design-system/TextInput"; -//@ts-ignore -import { Select, Option } from "@strapi/design-system/Select"; -//@ts-ignore -import { useNotification, useLibrary } from "@strapi/helper-plugin"; -import { getTrad } from "../../translations"; -import { AdditionalFieldInputProps, Input } from "./types"; -import { isNil } from "lodash"; -import { useIntl } from "react-intl"; - -const DEFAULT_STRING_VALUE = ""; -const handlerFactory = - ({ field, prop, onChange }: Input) => - ({ target }: BaseSyntheticEvent) => { - onChange(field.name, target[prop], field.type); - }; - -const mediaAttribute = { - type: "media", - multiple: false, - required: false, - allowedTypes: ["images"], - pluginOptions: { - i18n: { - localized: false, - }, - }, -}; - -const AdditionalFieldInput: React.FC = ({ - field, - isLoading, - onChange, - value: baseValue, - disabled, - error, -}) => { - const { fields } = useLibrary(); - const value = useMemo( - () => - field.type === "media" && baseValue - ? JSON.parse(baseValue as string) - : baseValue, - [baseValue, field.type] - ); - const toggleNotification = useNotification(); - const { formatMessage } = useIntl(); - const defaultInputProps = useMemo( - () => ({ - id: field.name, - name: field.name, - label: field.label, - disabled: isLoading || disabled, - error: error && formatMessage(error), - }), - [field, isLoading, error] - ); - const handleBoolean = useMemo( - () => handlerFactory({ field, onChange, prop: "checked" }), - [onChange, field] - ); - const handleString = useMemo( - () => handlerFactory({ field, onChange, prop: "value" }), - [onChange, field] - ); - const handleMedia = useMemo( - () => handlerFactory({ field, onChange, prop: "value" }), - [onChange, field] - ); - const MediaInput = (fields?.media ?? - (() => <>)) as React.ComponentType; - - useEffect(() => { - if (!MediaInput) { - toggleNotification({ - type: "warning", - message: getTrad("notification.error.customField.media.missing"), - }); - } - }, []); - - switch (field.type) { - case "boolean": - if (!isNil(value)) assertBoolean(value); - return ( - - ); - case "string": - if (!isNil(value)) assertString(value); - return ( - - ); - case "select": - return ( - - ); - case "media": - return ( - - ); - default: - toggleNotification({ - type: "warning", - message: getTrad("notification.error.customField.type"), - }); - throw new Error(`Type of custom field is unsupported`); - } -}; - -export default AdditionalFieldInput; diff --git a/admin/src/components/AdditionalFieldInput/types.ts b/admin/src/components/AdditionalFieldInput/types.ts deleted file mode 100644 index a97319ee..00000000 --- a/admin/src/components/AdditionalFieldInput/types.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { MessageDescriptor } from "react-intl"; -import { NavigationItemCustomField } from "../../../../types"; - -export type AdditionalFieldInputProps = { - field: NavigationItemCustomField; - isLoading: boolean; - onChange: (name: string, value: string, fieldType: string) => void; - value: string | boolean | string[] | null; - disabled: boolean; - error: MessageDescriptor | null; -} -export type TargetProp = "value" | "checked"; -export type Input = { - prop: TargetProp; -} & Pick; diff --git a/admin/src/components/Alert/styles.js b/admin/src/components/Alert/styles.js deleted file mode 100644 index a2dc959c..00000000 --- a/admin/src/components/Alert/styles.js +++ /dev/null @@ -1,8 +0,0 @@ -import styled from 'styled-components'; -import { Alert } from '@strapi/design-system/Alert'; - -export const PermanentAlert = styled(Alert)` - button { - display: none; - } -`; diff --git a/admin/src/components/CollapseButton/index.js b/admin/src/components/CollapseButton/index.js deleted file mode 100644 index 84ef0f33..00000000 --- a/admin/src/components/CollapseButton/index.js +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; -import styled from 'styled-components' -import { Flex } from '@strapi/design-system/Flex'; -import { Typography } from '@strapi/design-system/Typography'; -import { Icon } from '@strapi/design-system/Icon'; -import { CarretUp, CarretDown } from '@strapi/icons'; - -const Wrapper = styled.div` - border-radius: 50%; - background: #DCDCE4; - width: 25px; - height: 25px; - display: flex; - justify-content: center; - align-items: center; - margin-right: 8px; -`; - -const CollapseButton = ({ toggle, collapsed, itemsCount }) => ( - - - { collapsed ? - : - - } - - {itemsCount} nested items - -); - -export default CollapseButton; diff --git a/admin/src/components/ConfirmationDialog/index.js b/admin/src/components/ConfirmationDialog/index.js deleted file mode 100644 index d22f0a9b..00000000 --- a/admin/src/components/ConfirmationDialog/index.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * - * Entity Details - * - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import { Button } from '@strapi/design-system/Button'; -import { Dialog, DialogBody, DialogFooter } from '@strapi/design-system/Dialog'; -import { Flex } from '@strapi/design-system/Flex'; -import { Stack } from '@strapi/design-system/Stack'; -import { Typography } from '@strapi/design-system/Typography'; -import { ExclamationMarkCircle, Check } from '@strapi/icons'; -import { getMessage } from '../../utils'; - -const DEFAULT_ICON = - -const ConfirmationDialog = ({ - isVisible = false, - isActionAsync = false, - children, - onConfirm, - onCancel, - header, - labelCancel, - labelConfirm, - iconConfirm, - mainIcon = DEFAULT_ICON -}) => ( - - - - - {children || getMessage('components.confirmation.dialog.description')} - - - - - {labelCancel || getMessage('components.confirmation.dialog.button.cancel', 'Cancel')} - } endAction={} /> - -); - -ConfirmationDialog.propTypes = { - isVisible: PropTypes.bool, - isActionAsync: PropTypes.bool, - children: PropTypes.any, - header: PropTypes.string, - labelCancel: PropTypes.string, - labelConfirm: PropTypes.string, - iconConfirm: PropTypes.object, - onConfirm: PropTypes.func.isRequired, - onCancel: PropTypes.func.isRequired, -}; - -export default ConfirmationDialog; \ No newline at end of file diff --git a/admin/src/components/ConfirmationDialog/index.tsx b/admin/src/components/ConfirmationDialog/index.tsx new file mode 100644 index 00000000..903f57e0 --- /dev/null +++ b/admin/src/components/ConfirmationDialog/index.tsx @@ -0,0 +1,84 @@ +/** + * + * Entity Details + * + */ + +import { Button, Dialog, Flex, Typography } from '@strapi/design-system'; +import { Check, WarningCircle } from '@strapi/icons'; +import { FC, PropsWithChildren, ReactNode } from 'react'; +import { useIntl } from 'react-intl'; +import { getTrad } from '../../translations'; +import { Effect } from '../../types'; + +const DEFAULT_ICON = ; + +interface Props { + isVisible?: boolean; + isActionAsync?: boolean; + onConfirm: Effect; + onCancel: Effect; + header?: ReactNode; + labelCancel?: ReactNode; + labelConfirm?: ReactNode; + iconConfirm?: ReactNode; + mainIcon?: ReactNode; +} + +export const ConfirmationDialog: FC> = ({ + isVisible = false, + isActionAsync = false, + children, + onConfirm, + onCancel, + header, + labelCancel, + labelConfirm, + iconConfirm, + mainIcon = DEFAULT_ICON, +}) => { + const { formatMessage } = useIntl(); + + return isVisible ? ( + { + if (!isOpen && isVisible) { + onCancel?.(undefined); + } + }} + title={ + header || formatMessage(getTrad('components.confirmation.dialog.header', 'Confirmation')) + } + > + + + + + {children || formatMessage(getTrad('components.confirmation.dialog.description'))} + + + + + + + + + + + + + ) : null; +}; diff --git a/admin/src/components/DragButton/index.tsx b/admin/src/components/DragButton/index.tsx deleted file mode 100644 index 777f3c23..00000000 --- a/admin/src/components/DragButton/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; -// @ts-ignore -import styled from 'styled-components'; -// @ts-ignore -import { Drag } from '@strapi/icons' -import { ToBeFixed } from '../../../../types'; - -const DRAG_BUTTON_SIZE_IN_REM = 2; -const DragButtonWrapper = styled.span` - display: flex; - align-items: center; - justify-content: center; - - height: ${DRAG_BUTTON_SIZE_IN_REM}rem; - width: ${DRAG_BUTTON_SIZE_IN_REM}rem; - padding: ${({ theme }: ToBeFixed) => theme.spaces[2]}; - - background: ${({ theme, isActive }: ToBeFixed) => isActive ? theme.colors.neutral150 : theme.colors.neutral0}; - border: 1px solid ${({ theme }: ToBeFixed) => theme.colors.neutral200}; - border-radius: ${({ theme }: ToBeFixed) => theme.borderRadius}; - cursor: pointer; - transition: background-color 0.3s ease-in; - - svg { - height: ${({ theme }: ToBeFixed) => theme.spaces[3]}; - width: ${({ theme }: ToBeFixed) => theme.spaces[3]}; - - > g, - path { - fill: ${({ theme }: ToBeFixed) => theme.colors.neutral500}; - } - } - &:hover { - svg { - > g, - path { - fill: ${({ theme }: ToBeFixed) => theme.colors.neutral600}; - } - } - } - &:active { - svg { - > g, - path { - fill: ${({ theme }: ToBeFixed) => theme.colors.neutral400}; - } - } - } - &[aria-disabled='true'] { - background-color: ${({ theme }: ToBeFixed) => theme.colors.neutral150}; - svg { - path { - fill: ${({ theme }: ToBeFixed) => theme.colors.neutral600}; - } - } - } -`; - -const DragButton = React.forwardRef((props, ref) => ( - - - -)); - -export default DragButton; \ No newline at end of file diff --git a/admin/src/components/EmptyView/index.js b/admin/src/components/EmptyView/index.js deleted file mode 100644 index 7a38e487..00000000 --- a/admin/src/components/EmptyView/index.js +++ /dev/null @@ -1,26 +0,0 @@ -import styled from "styled-components"; -import { Box } from '@strapi/design-system/Box'; -import { Button } from "@strapi/design-system/Button"; - -const EmptyView = styled.div` - display: flex; - flex-grow: 1; - flex-direction: column; - align-items: center; - justify-content: center; - padding-left: 2rem; - padding-right: 2rem; - padding-bottom: 8rem; - - - font-size: 2rem; - font-weight: 600; - color: ${({ theme }) => theme.colors.neutral600}; - text-align: center; - - > { - margin: 1rem; - } -`; - -export default EmptyView; diff --git a/admin/src/components/Initializer.tsx b/admin/src/components/Initializer.tsx new file mode 100644 index 00000000..115377a1 --- /dev/null +++ b/admin/src/components/Initializer.tsx @@ -0,0 +1,19 @@ +import { useEffect, useRef } from 'react'; + +import { PLUGIN_ID } from '../pluginId'; + +type InitializerProps = { + setPlugin: (id: string) => void; +}; + +const Initializer = ({ setPlugin }: InitializerProps) => { + const ref = useRef(setPlugin); + + useEffect(() => { + ref.current?.(PLUGIN_ID); + }, []); + + return null; +}; + +export { Initializer }; diff --git a/admin/src/components/Item/ItemCardBadge/index.js b/admin/src/components/Item/ItemCardBadge/index.js deleted file mode 100644 index 4ffca44a..00000000 --- a/admin/src/components/Item/ItemCardBadge/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import styled from "styled-components"; -import { Badge } from '@strapi/design-system/Badge'; - -const ItemCardBadge = styled(Badge)` - border: 1px solid ${({ theme, borderColor }) => theme.colors[borderColor]}; - - ${ ({small, theme}) => small && ` - padding: ${theme.spaces[1]} ${theme.spaces[2]}; - margin: 0px ${theme.spaces[3]}; - vertical-align: middle; - - cursor: default; - - span { - font-size: .65rem; - line-height: 1; - vertical-align: middle; - } - `} -`; - -export default ItemCardBadge; \ No newline at end of file diff --git a/admin/src/components/Item/ItemCardHeader/Wrapper.tsx b/admin/src/components/Item/ItemCardHeader/Wrapper.tsx deleted file mode 100644 index c15477cd..00000000 --- a/admin/src/components/Item/ItemCardHeader/Wrapper.tsx +++ /dev/null @@ -1,20 +0,0 @@ -//@ts-ignore -import styled from "styled-components"; -//@ts-ignore -import { CardTitle } from '@strapi/design-system/Card'; -import { ToBeFixed } from "../../../../../types"; - -const CardItemTitle = styled(CardTitle)` - width: 100%; - - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - - > div > * { - margin: 0px ${({ theme }: ToBeFixed) => theme.spaces[1]}; - } -`; - -export default CardItemTitle; diff --git a/admin/src/components/Item/ItemCardHeader/icons.tsx b/admin/src/components/Item/ItemCardHeader/icons.tsx deleted file mode 100644 index 7df1eb41..00000000 --- a/admin/src/components/Item/ItemCardHeader/icons.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import React from "react"; -// @ts-ignore -import { Pencil, Trash, Refresh, Eye } from '@strapi/icons'; - -export const pencilIcon = ; -export const refreshIcon = ; -export const trashIcon = ; -export const eyeIcon = diff --git a/admin/src/components/Item/ItemCardHeader/index.tsx b/admin/src/components/Item/ItemCardHeader/index.tsx deleted file mode 100644 index 284e6474..00000000 --- a/admin/src/components/Item/ItemCardHeader/index.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react'; -//@ts-ignore -import styled from 'styled-components'; -//@ts-ignore -import { Flex } from '@strapi/design-system/Flex'; -//@ts-ignore -import { Typography } from '@strapi/design-system/Typography'; -//@ts-ignore -import { IconButton as BaseIconButton } from '@strapi/design-system/IconButton'; -//@ts-ignore -import { Icon } from '@strapi/design-system/Icon'; -//@ts-ignore -import DragButton from '../../DragButton'; -import Wrapper from './Wrapper'; -import ItemCardBadge from '../ItemCardBadge'; -import { getMessage } from '../../../utils'; -import { ToBeFixed, VoidEffect } from '../../../../../types'; -import { pencilIcon, refreshIcon, trashIcon, eyeIcon } from './icons'; - -interface IProps { - title: string, - path: string, - icon: ToBeFixed, - removed: boolean, - canUpdate: boolean, - onItemRemove: VoidEffect, - onItemEdit: VoidEffect, - onItemRestore: VoidEffect, - dragRef: React.MutableRefObject, - isSearchActive?: boolean -} - -const wrapperStyle = { zIndex: 2 }; -const pathWrapperStyle = { maxWidth: "425px" }; - -const ItemCardHeader: React.FC = ({ title, path, icon, removed, canUpdate, onItemRemove, onItemEdit, onItemRestore, dragRef, isSearchActive }) => ( - - - {canUpdate && ()} - - {title} - - - {path} - - - - - - - {removed && - ( - {getMessage("components.navigationItem.badge.removed")} - ) - } - - - {canUpdate && (<>{removed ? - : - - })} - - -); - -const IconButton = styled(BaseIconButton)` - transition: background-color 0.3s ease-in; - ${({isActive, theme}: ToBeFixed) => isActive ? `background-color: ${theme.colors.neutral150} ;` : ''} -` - -export default ItemCardHeader; \ No newline at end of file diff --git a/admin/src/components/Item/ItemCardRemovedOverlay/index.js b/admin/src/components/Item/ItemCardRemovedOverlay/index.js deleted file mode 100644 index 0b02598b..00000000 --- a/admin/src/components/Item/ItemCardRemovedOverlay/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import styled from "styled-components"; - -export const ItemCardRemovedOverlay = styled.div` - width: 100%; - height: 100%; - position: absolute; - left: 0; - right: 0; - z-index: 1; - - background: rgba(255,255,255,.75); -`; \ No newline at end of file diff --git a/admin/src/components/Item/Wrapper.js b/admin/src/components/Item/Wrapper.js deleted file mode 100644 index 9a432622..00000000 --- a/admin/src/components/Item/Wrapper.js +++ /dev/null @@ -1,39 +0,0 @@ -import styled from "styled-components"; - -const Wrapper = styled.div` -position: relative; -margin-top: ${({theme}) => theme.spaces[2]}; -margin-left: ${({ level }) => level && '54px'}}; - -${({ level, theme, isLast }) => level && ` - &::before { - ${!isLast && 'content: "";'} - display: block; - top: ${theme.spaces[1]}; - left: -24px; - position: absolute; - height: calc(100% + ${theme.spaces[2]}); - width: 19px; - border: 0px solid transparent; - border-left: 4px solid ${theme.colors.neutral300}; - } - - &::after { - content: ""; - display: block; - height: 22px; - width: 19px; - position: absolute; - top: ${theme.spaces[1]}; - left: -${theme.spaces[6]}; - - background: transparent; - border: 4px solid ${theme.colors.neutral300}; - border-top: transparent; - border-right: transparent; - border-radius: 0 0 0 100%; - } -`}; -`; - -export default Wrapper; \ No newline at end of file diff --git a/admin/src/components/Item/index.js b/admin/src/components/Item/index.js deleted file mode 100644 index dd6f7ee5..00000000 --- a/admin/src/components/Item/index.js +++ /dev/null @@ -1,278 +0,0 @@ -import React, { useCallback, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import { useDrag, useDrop } from 'react-dnd'; -import { isEmpty, isNumber } from 'lodash'; -import { useTheme } from 'styled-components'; - -import { Card, CardBody } from '@strapi/design-system/Card'; -import { Divider } from '@strapi/design-system/Divider'; -import { Flex } from '@strapi/design-system/Flex'; -import { Link } from '@strapi/design-system/Link'; -import { TextButton } from '@strapi/design-system/TextButton'; -import { Typography } from '@strapi/design-system/Typography'; -import { ArrowRight, Link as LinkIcon, Earth, Plus, Cog } from '@strapi/icons'; - -import ItemCardHeader from './ItemCardHeader'; -import List from '../NavigationItemList'; -import Wrapper from './Wrapper'; -import { extractRelatedItemLabel } from '../../pages/View/utils/parsers'; -import ItemCardBadge from './ItemCardBadge'; -import { ItemCardRemovedOverlay } from './ItemCardRemovedOverlay'; -import { getMessage, ItemTypes, navigationItemType } from '../../utils'; -import CollapseButton from '../CollapseButton'; - -const Item = (props) => { - const { - item, - isLast = false, - level = 0, - levelPath = '', - allowedLevels, - relatedRef, - isParentAttachedToMenu, - onItemLevelAdd, - onItemRemove, - onItemRestore, - onItemEdit, - onItemReOrder, - onItemToggleCollapse, - error, - displayChildren, - config = {}, - permissions = {}, - } = props; - - const { - viewId, - title, - type, - path, - removed, - externalPath, - menuAttached, - collapsed, - structureId, - items = [], - isSearchActive, - } = item; - - const { contentTypes = [], contentTypesNameFields } = config; - const isExternal = type === navigationItemType.EXTERNAL; - const isWrapper = type === navigationItemType.WRAPPER; - const isHandledByPublishFlow = contentTypes.find(_ => _.uid === relatedRef?.__collectionUid)?.draftAndPublish; - const isPublished = isHandledByPublishFlow && relatedRef.publishedAt; - const isNextMenuAllowedLevel = isNumber(allowedLevels) ? level < (allowedLevels - 1) : true; - const isMenuAllowedLevel = isNumber(allowedLevels) ? level < allowedLevels : true; - const hasChildren = !isEmpty(item.items) && !isExternal && !displayChildren; - const absolutePath = isExternal ? undefined : `${levelPath === '/' ? '' : levelPath}/${path === '/' ? '' : path}`; - - const relatedItemLabel = !isExternal ? extractRelatedItemLabel(relatedRef, contentTypesNameFields, { contentTypes }) : ''; - const relatedTypeLabel = relatedRef?.labelSingular; - const relatedBadgeColor = isPublished ? 'success' : 'secondary'; - - const { canUpdate } = permissions; - - const dragRef = useRef(null); - const dropRef = useRef(null); - const previewRef = useRef(null); - - const [, drop] = useDrop({ - accept: `${ItemTypes.NAVIGATION_ITEM}_${levelPath}`, - hover(hoveringItem, monitor) { - const dragIndex = hoveringItem.order; - const dropIndex = item.order; - - // Don't replace items with themselves - if (dragIndex === dropIndex) { - return; - } - - const hoverBoundingRect = dropRef.current.getBoundingClientRect(); - const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; - const clientOffset = monitor.getClientOffset(); - const hoverClientY = clientOffset.y - hoverBoundingRect.top; - - // Place the hovering item before or after the drop target - const isAfter = hoverClientY > hoverMiddleY; - const newOrder = isAfter ? item.order + 0.5 : item.order - 0.5; - - if (dragIndex < dropIndex && hoverClientY < hoverMiddleY) { - return; - } - // Dragging upwards - if (dragIndex > dropIndex && hoverClientY > hoverMiddleY) { - return; - } - - onItemReOrder({ ...hoveringItem }, newOrder); - hoveringItem.order = newOrder; - }, - collect: monitor => ({ - isOverCurrent: monitor.isOver({ shallow: true }), - }) - }); - - const [{ isDragging }, drag, dragPreview] = useDrag({ - type: `${ItemTypes.NAVIGATION_ITEM}_${levelPath}`, - item: () => { - return item; - }, - collect: monitor => ({ - isDragging: monitor.isDragging(), - }), - }); - - const refs = { - dragRef: drag(dragRef), - dropRef: drop(dropRef), - previewRef: dragPreview(previewRef), - } - - const contentTypeUid = relatedRef?.__collectionUid; - const contentType = contentTypes.find(_ => _.uid === contentTypeUid) || {}; - const generatePreviewUrl = entity => { - const { isSingle } = contentType; - const entityLocale = entity?.locale ? `?plugins[i18n][locale]=${entity?.locale}` : ''; - return `/content-manager/${ isSingle ? 'single-types' : 'collection-types'}/${entity?.__collectionUid}${!isSingle ? '/' + entity?.id : ''}${entityLocale}` - } - const onNewItemClick = useCallback((event) => canUpdate && onItemLevelAdd( - event, - viewId, - isNextMenuAllowedLevel, - absolutePath, - menuAttached, - `${structureId}.${items.length}`, - ), [viewId, isNextMenuAllowedLevel, absolutePath, menuAttached, structureId, items, canUpdate]); - - useEffect(() => { - if (isSearchActive) { - refs.dropRef.current?.scrollIntoView?.({ - behavior: "smooth", - block: "center", - inline: "center", - }); - } - }, [isSearchActive, refs.dropRef.current]) - - const theme = useTheme(); - - return ( - - - {removed && ()} -
- - onItemRemove(item)} - onItemEdit={() => onItemEdit({ - ...item, - isMenuAllowedLevel, - isParentAttachedToMenu, - isSearchActive: false, - }, levelPath, isParentAttachedToMenu)} - onItemRestore={() => onItemRestore(item)} - dragRef={refs.dragRef} - removed={removed} - canUpdate={canUpdate} - isSearchActive={isSearchActive} - /> - - - {!isExternal && ( - - - - {!isEmpty(item.items) && onItemToggleCollapse(item)} collapsed={collapsed} itemsCount={item.items.length}/>} - {canUpdate && (} - onClick={onNewItemClick} - > - - {getMessage("components.navigationItem.action.newItem")} - - )} - - {relatedItemLabel && ( - - {isHandledByPublishFlow && ( - {getMessage({id: `components.navigationItem.badge.${isPublished ? 'published' : 'draft'}`})} - )} - {relatedTypeLabel} /  - {relatedItemLabel} - }>  - ) - } - - )} -
-
- {hasChildren && !removed && !collapsed && - } -
- - ); -}; - -Item.propTypes = { - item: PropTypes.shape({ - title: PropTypes.string, - type: PropTypes.string, - uiRouterKey: PropTypes.string, - path: PropTypes.string, - externalPath: PropTypes.string, - related: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - menuAttached: PropTypes.bool, - collapsed: PropTypes.bool, - }).isRequired, - relatedRef: PropTypes.object, - level: PropTypes.number, - levelPath: PropTypes.string, - isParentAttachedToMenu: PropTypes.bool, - onItemRestore: PropTypes.func.isRequired, - onItemLevelAdd: PropTypes.func.isRequired, - onItemRemove: PropTypes.func.isRequired, - onItemReOrder: PropTypes.func.isRequired, - onItemToggleCollapse: PropTypes.func.isRequired, - config: PropTypes.shape({ - contentTypes: PropTypes.array.isRequired, - contentTypesNameFields: PropTypes.object.isRequired, - }).isRequired -}; - -export default Item; diff --git a/admin/src/components/NavigationItemList/index.js b/admin/src/components/NavigationItemList/index.js deleted file mode 100644 index aa46b8a3..00000000 --- a/admin/src/components/NavigationItemList/index.js +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; -import PropTypes from "prop-types"; - -import Item from "../Item"; -import Wrapper from "./Wrapper"; - -const List = ({ - allowedLevels, - error, - isParentAttachedToMenu = false, - items, - level = 0, - levelPath = '', - onItemEdit, - onItemLevelAdd, - onItemRemove, - onItemRestore, - onItemReOrder, - onItemToggleCollapse, - displayFlat, - contentTypes, - contentTypesNameFields, - permissions, -}) => ( - - {items.map((item, n) => { - const { relatedRef, ...itemProps } = item - return ( - - ); - })} - -); - -List.propTypes = { - allowedLevels: PropTypes.number, - isParentAttachedToMenu: PropTypes.bool, - items: PropTypes.array, - level: PropTypes.number, - onItemLevelAdd: PropTypes.func.isRequired, - onItemRemove: PropTypes.func.isRequired, - onItemRestore: PropTypes.func.isRequired, - onItemRestore: PropTypes.func.isRequired, - onItemReOrder: PropTypes.func.isRequired, - onItemToggleCollapse: PropTypes.func.isRequired, - contentTypes: PropTypes.array.isRequired, - contentTypesNameFields: PropTypes.object.isRequired -}; - -export default List; \ No newline at end of file diff --git a/admin/src/components/RestartAlert/index.js b/admin/src/components/RestartAlert/index.js deleted file mode 100644 index b6ec4d66..00000000 --- a/admin/src/components/RestartAlert/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import styled from 'styled-components'; -import { Alert } from '@strapi/design-system/Alert'; - -export default styled(Alert)` - [role="status"] { - flex-direction: column; - } -` diff --git a/admin/src/components/RestartAlert/index.tsx b/admin/src/components/RestartAlert/index.tsx new file mode 100644 index 00000000..a92090c9 --- /dev/null +++ b/admin/src/components/RestartAlert/index.tsx @@ -0,0 +1,8 @@ +import { Alert } from '@strapi/design-system'; +import styled from 'styled-components'; + +export const RestartAlert = styled(Alert)` + [role='status'] { + flex-direction: column; + } +`; diff --git a/admin/src/components/TextArrayInput/index.tsx b/admin/src/components/TextArrayInput/index.tsx index 466e1e05..23fa3480 100644 --- a/admin/src/components/TextArrayInput/index.tsx +++ b/admin/src/components/TextArrayInput/index.tsx @@ -1,9 +1,8 @@ -import React, { useState } from 'react'; -import { Effect } from '../../../../types'; -// @ts-ignore -import { TextInput } from '@strapi/design-system/TextInput'; -import { GenericInputProps } from "@strapi/helper-plugin" +import { TextInput } from '@strapi/design-system'; import { isArray } from 'lodash'; +import React, { useState } from 'react'; + +import { Effect } from '../../types'; interface IProps { onChange: Effect; @@ -12,29 +11,22 @@ interface IProps { name?: string; label?: string; disabled?: boolean; - error?: GenericInputProps["error"]; } const TextArrayInput: React.FC = ({ onChange, initialValue, ...props }) => { - const [value, setValue] = useState(isArray(initialValue) - ? initialValue.reduce((acc, cur) => `${acc}${cur}; `, "") - : ""); - const handleOnChange = ({target: { value }}: React.BaseSyntheticEvent) => { + const [value, setValue] = useState( + isArray(initialValue) ? initialValue.reduce((acc, cur) => `${acc}${cur}; `, '') : '' + ); + const handleOnChange = (value: string) => { const newValue: string = value; const valuesArray = newValue .split(';') - .map(v => v.trim()) - .filter(v => !!v.length); + .map((v) => v.trim()) + .filter((v) => !!v.length); setValue(value); onChange(valuesArray); - } - return ( - - ) -} + }; + return ; +}; -export default TextArrayInput; \ No newline at end of file +export default TextArrayInput; diff --git a/admin/src/components/icons/index.ts b/admin/src/components/icons/index.ts new file mode 100644 index 00000000..701e5050 --- /dev/null +++ b/admin/src/components/icons/index.ts @@ -0,0 +1 @@ +export * from './navigation'; diff --git a/admin/src/components/icons/navigation.js b/admin/src/components/icons/navigation.js deleted file mode 100644 index 6c3aa3b1..00000000 --- a/admin/src/components/icons/navigation.js +++ /dev/null @@ -1,14 +0,0 @@ - -import React from 'react'; - -const initSize = 92; - -const NavigationIcon = ({ width = 24, height = 24 }) => - - - - ; - - export default NavigationIcon; \ No newline at end of file diff --git a/admin/src/components/icons/navigation.tsx b/admin/src/components/icons/navigation.tsx new file mode 100644 index 00000000..e2b8ebfb --- /dev/null +++ b/admin/src/components/icons/navigation.tsx @@ -0,0 +1,26 @@ +import styled from "styled-components"; + +const initSize = 92; + +const NavigationIconSvg = styled.svg` + path { + fill: ${ ({ theme }) => theme.colors.neutral500 }; + } +`; + +export const NavigationIcon = ({ width = 24, height = 24 }) => ( + + + + + +); \ No newline at end of file diff --git a/admin/src/components/icons/pluginIcon.tsx b/admin/src/components/icons/pluginIcon.tsx new file mode 100644 index 00000000..18735d54 --- /dev/null +++ b/admin/src/components/icons/pluginIcon.tsx @@ -0,0 +1,11 @@ +/** + * + * PluginIcon + * + */ + +import { NavigationIcon } from './navigation'; + +const PluginIcon = () => ; + +export { PluginIcon }; \ No newline at end of file diff --git a/admin/src/contexts/DataManagerContext.js b/admin/src/contexts/DataManagerContext.js deleted file mode 100644 index f36acc32..00000000 --- a/admin/src/contexts/DataManagerContext.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createContext } from "react"; - -const DataManagerContext = createContext(); - -export default DataManagerContext; diff --git a/admin/src/hooks/useAllContentTypes.ts b/admin/src/hooks/useAllContentTypes.ts deleted file mode 100644 index 50fac971..00000000 --- a/admin/src/hooks/useAllContentTypes.ts +++ /dev/null @@ -1,11 +0,0 @@ -//@ts-ignore -import { useQuery } from 'react-query'; -import { pick } from 'lodash'; -import { fetchAllContentTypes } from '../utils'; - -const useAllContentTypes = () => pick( - useQuery('contentTypes', () => fetchAllContentTypes()), - ["data", "isLoading", "error"] -); - -export default useAllContentTypes; diff --git a/admin/src/hooks/useDataManager.js b/admin/src/hooks/useDataManager.js deleted file mode 100644 index 0ab90871..00000000 --- a/admin/src/hooks/useDataManager.js +++ /dev/null @@ -1,6 +0,0 @@ -import { useContext } from "react"; -import DataManagerContext from "../contexts/DataManagerContext"; - -const useDataManager = () => useContext(DataManagerContext); - -export default useDataManager; diff --git a/admin/src/hooks/useI18nCopyNavigationItemsModal.tsx b/admin/src/hooks/useI18nCopyNavigationItemsModal.tsx deleted file mode 100644 index 72a2a58d..00000000 --- a/admin/src/hooks/useI18nCopyNavigationItemsModal.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React, { useState, useCallback, useMemo } from "react"; -import { - ConfirmEffect, - I18nCopyNavigationItemsModal, -} from "../pages/View/components/I18nCopyNavigationItems"; - -export const useI18nCopyNavigationItemsModal = (onConfirm: ConfirmEffect) => { - const [isOpened, setIsOpened] = useState(false); - const [sourceLocale, setSourceLocale] = useState( - undefined - ); - const onCancel = useCallback(() => { - setIsOpened(false); - }, [setIsOpened]); - const onConfirmWithModalClose = useCallback(() => { - if (!sourceLocale) { - return; - } - - onConfirm(sourceLocale); - setIsOpened(false); - }, [onConfirm, sourceLocale]); - - const modal = useMemo( - () => - isOpened ? ( - - ) : null, - [isOpened, onConfirmWithModalClose, onCancel] - ); - - return useMemo( - () => ({ - setI18nCopyModalOpened: setIsOpened, - setI18nCopySourceLocale: setSourceLocale, - i18nCopyItemsModal: modal, - i18nCopySourceLocale: sourceLocale, - }), - [setSourceLocale, setIsOpened, modal, sourceLocale] - ); -}; diff --git a/admin/src/hooks/useNavigationConfig.js b/admin/src/hooks/useNavigationConfig.js deleted file mode 100644 index 1b913441..00000000 --- a/admin/src/hooks/useNavigationConfig.js +++ /dev/null @@ -1,58 +0,0 @@ -import { useQuery, useQueryClient } from 'react-query'; -import { useNotification } from '@strapi/helper-plugin'; -import { fetchNavigationConfig, restartStrapi, restoreNavigationConfig, updateNavigationConfig } from '../utils'; -import { getTrad } from '../translations'; - -const useNavigationConfig = () => { - const queryClient = useQueryClient(); - const toggleNotification = useNotification(); - const { isLoading, data, error } = useQuery('navigationConfig', () => - fetchNavigationConfig(toggleNotification) - ); - - const handleError = (type) => { - toggleNotification({ - type: 'warning', - message: getTrad(`pages.settings.notification.${type}.error`), - }); - }; - - const handleSuccess = async (type) => { - await queryClient.invalidateQueries('navigationConfig'); - toggleNotification({ - type: 'success', - message: getTrad(`pages.settings.notification.${type}.success`), - }); - }; - - const submitMutation = async (...args) => { - try { - await updateNavigationConfig(...args); - await handleSuccess('submit'); - } catch (e) { - handleError('submit'); - } - } - - const restoreMutation = async (...args) => { - try { - await restoreNavigationConfig(...args); - await handleSuccess('restore'); - } catch (e) { - handleError('restore'); - } - } - - const restartMutation = async (...args) => { - try { - await restartStrapi(...args); - await handleSuccess('restart'); - } catch (e) { - handleError('restart'); - } - } - - return { data, isLoading, error, submitMutation, restoreMutation, restartMutation }; -}; - -export default useNavigationConfig; diff --git a/admin/src/index.js b/admin/src/index.js deleted file mode 100644 index e43f65d2..00000000 --- a/admin/src/index.js +++ /dev/null @@ -1,65 +0,0 @@ -import { prefixPluginTranslations } from '@strapi/helper-plugin'; -import pluginPkg from '../../package.json'; -import pluginId from './pluginId'; -import pluginPermissions from './permissions'; -import NavigationIcon from './components/icons/navigation'; -import trads, { getTrad } from './translations'; -import { get } from 'lodash'; -const name = pluginPkg.strapi.name; - -export default { - register(app) { - app.createSettingSection( - { - id: pluginId, - intlLabel: { id: getTrad('pages.settings.section.title'), defaultMessage: 'Navigation Plugin' }, - }, - [ - { - intlLabel: { - id: getTrad('pages.settings.section.subtitle'), - defaultMessage: 'Configuration', - }, - id: 'navigation', - to: `/settings/${pluginId}`, - Component: async () => { - const component = await import( - /* webpackChunkName: "navigation-settings" */ './pages/SettingsPage' - ); - - return component; - }, - permissions: pluginPermissions.settings, - } - ]); - app.addMenuLink({ - to: `/plugins/${pluginId}`, - icon: NavigationIcon, - intlLabel: { - id: `${pluginId}.plugin.name`, - defaultMessage: 'Navigation', - }, - Component: async () => { - const component = await import(/* webpackChunkName: "navigation-main-app" */ './pages/App'); - - return component; - }, - permissions: pluginPermissions.access, - }); - app.registerPlugin({ - id: pluginId, - name, - }); - }, - bootstrap() {}, - registerTrads({ locales = [] }) { - return locales - .filter((locale) => Object.keys(trads).includes(locale)) - .map((locale) => { - return { - data: prefixPluginTranslations(get(trads, locale, trads.en), pluginId, {}), - locale, - }; - }); - }, -}; diff --git a/admin/src/index.ts b/admin/src/index.ts new file mode 100644 index 00000000..30024339 --- /dev/null +++ b/admin/src/index.ts @@ -0,0 +1,81 @@ +import { Initializer } from './components/Initializer'; +import { PluginIcon } from './components/icons/pluginIcon'; +import App from './pages/App'; +import SettingsPage from './pages/SettingsPage'; +import { PLUGIN_ID } from './pluginId'; +import pluginPermissions from './utils/permissions'; +import { flattenObject, prefixPluginTranslations } from '@sensinum/strapi-utils'; +import trads from "./translations"; + +const name = "navigation"; +const displayName = "Navigation"; + +export default { + register(app: any) { + app.createSettingSection( + { + id: PLUGIN_ID, + intlLabel: { + id: `${PLUGIN_ID}.plugin.section.name`, + defaultMessage: `${displayName} plugin`, + }, + }, + [ + { + intlLabel: { + id: `${PLUGIN_ID}.plugin.section.item`, + defaultMessage: "Configuration", + }, + id: 'navigation', + to: PLUGIN_ID, + Component() { + return SettingsPage; + }, + permissions: pluginPermissions.settings, + }, + ] + ); + + app.addMenuLink({ + to: `plugins/${PLUGIN_ID}`, + icon: PluginIcon, + intlLabel: { + id: `${PLUGIN_ID}.plugin.name`, + defaultMessage: displayName, + }, + Component() { + return App; + }, + permissions: pluginPermissions.access, + position: 1, + }); + + app.registerPlugin({ + id: PLUGIN_ID, + initializer: Initializer, + isReady: false, + name, + }); + }, + + + registerTrads: async function ({ locales = [] }: { locales: string[] }) { + return Promise.all( + locales.map(async (locale: string) => { + if (locale in trads) { + const typedLocale = locale as keyof typeof trads; + return trads[typedLocale]().then(({ default: trad }) => { + return { + data: prefixPluginTranslations(flattenObject(trad), PLUGIN_ID), + locale, + }; + }); + } + return { + data: prefixPluginTranslations(flattenObject({}), PLUGIN_ID), + locale, + }; + }), + ); + }, +}; diff --git a/admin/src/pages/App.tsx b/admin/src/pages/App.tsx new file mode 100644 index 00000000..79994162 --- /dev/null +++ b/admin/src/pages/App.tsx @@ -0,0 +1,19 @@ +import { Page } from '@strapi/strapi/admin'; +import { DndProvider } from 'react-dnd'; +import { HTML5Backend } from 'react-dnd-html5-backend'; +import { Route, Routes } from 'react-router-dom'; + +import { HomePage } from './HomePage'; + +const App = () => { + return ( + + + + + + + ); +}; + +export default App; diff --git a/admin/src/pages/App/index.js b/admin/src/pages/App/index.js deleted file mode 100644 index 99512d85..00000000 --- a/admin/src/pages/App/index.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * - * This component is the skeleton around the actual pages, and should only - * contain code that should be seen on all pages. (e.g. navigation bar) - * - */ - - import React, { Suspense, lazy } from "react"; - import { Switch, Route } from "react-router-dom"; - import { NotFound, LoadingIndicatorPage } from "@strapi/helper-plugin"; - // Utils - import DataManagerProvider from "../DataManagerProvider"; - import pluginId from "../../pluginId"; - // Containers - const View = lazy(() => import("../View")); - - const App = () => { - return ( - - }> - - - - - - - ); - }; - - export default App; - \ No newline at end of file diff --git a/admin/src/pages/DataManagerProvider/actions.js b/admin/src/pages/DataManagerProvider/actions.js deleted file mode 100644 index 6a7d9aa1..00000000 --- a/admin/src/pages/DataManagerProvider/actions.js +++ /dev/null @@ -1,31 +0,0 @@ -export const GET_LIST_DATA = "GET_LIST_DATA"; -export const GET_LIST_DATA_SUCCEEDED = "GET_LIST_DATA_SUCCEEDED"; -export const GET_NAVIGATION_DATA = "GET_NAVIGATION_DATA"; -export const GET_NAVIGATION_DATA_SUCCEEDED = "GET_NAVIGATION_DATA_SUCCEEDED"; - -export const CHANGE_NAVIGATION_DATA = "CHANGE_NAVIGATION_DATA"; -export const RESET_NAVIGATION_DATA = "RESET_NAVIGATION_DATA"; - -export const CHANGE_NAVIGATION_POPUP_VISIBILITY = - "CHANGE_NAVIGATION_POPUP_VISIBILITY"; -export const CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY = - "CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY"; - -export const GET_CONTENT_TYPE_ITEMS = "GET_CONTENT_TYPE_ITEMS"; -export const GET_CONTENT_TYPE_ITEMS_SUCCEEDED = - "GET_CONTENT_TYPE_ITEMS_SUCCEEDED"; - -export const GET_CONFIG = "GET_CONFIG"; -export const GET_CONFIG_SUCCEEDED = "GET_CONFIG_SUCCEEDED"; - -export const SUBMIT_NAVIGATION = "SUBMIT_NAVIGATION"; -export const SUBMIT_NAVIGATION_SUCCEEDED = "SUBMIT_NAVIGATION_SUCCEEDED"; -export const SUBMIT_NAVIGATION_ERROR = "SUBMIT_NAVIGATION_ERROR"; - -export const CACHE_CLEAR = "CACHE_CLEAR"; -export const CACHE_CLEAR_SUCCEEDED = "CACHE_CLEAR_SUCCEEDED"; - -export const RELOAD_PLUGIN = "RELOAD_PLUGIN"; - -export const I18N_COPY_NAVIGATION = "I18N_COPY_NAVIGATION"; -export const I18N_COPY_NAVIGATION_SUCCESS = "I18N_COPY_NAVIGATION_SUCCESS"; \ No newline at end of file diff --git a/admin/src/pages/DataManagerProvider/index.js b/admin/src/pages/DataManagerProvider/index.js deleted file mode 100644 index d01adbbe..00000000 --- a/admin/src/pages/DataManagerProvider/index.js +++ /dev/null @@ -1,484 +0,0 @@ -import React, { memo, useEffect, useMemo, useReducer, useRef } from "react"; -import { useLocation, useRouteMatch } from "react-router-dom"; -import { useIntl } from 'react-intl'; -import PropTypes from "prop-types"; -import { get, find, first, isEmpty } from "lodash"; -import { - request, - LoadingIndicatorPage, - useNotification, - useAppInfos, - useRBAC, -} from "@strapi/helper-plugin"; -import DataManagerContext from "../../contexts/DataManagerContext"; -import pluginId from "../../pluginId"; -import init from "./init"; -import { getTrad } from "../../translations"; -import reducer, { initialState } from "./reducer"; -import { - GET_NAVIGATION_DATA, - GET_NAVIGATION_DATA_SUCCEEDED, - GET_LIST_DATA, - GET_LIST_DATA_SUCCEEDED, - CHANGE_NAVIGATION_POPUP_VISIBILITY, - CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY, - RESET_NAVIGATION_DATA, - CHANGE_NAVIGATION_DATA, - GET_CONFIG, - GET_CONFIG_SUCCEEDED, - GET_CONTENT_TYPE_ITEMS_SUCCEEDED, - GET_CONTENT_TYPE_ITEMS, - SUBMIT_NAVIGATION, - SUBMIT_NAVIGATION_SUCCEEDED, - SUBMIT_NAVIGATION_ERROR, - I18N_COPY_NAVIGATION, - I18N_COPY_NAVIGATION_SUCCESS, - CACHE_CLEAR_SUCCEEDED, - CACHE_CLEAR, -} from './actions'; -import { prepareItemToViewPayload } from '../View/utils/parsers'; -import { errorStatusResourceFor, resolvedResourceFor } from "../../utils"; -import NoAcccessPage from "../NoAccessPage"; -import pluginPermissions from "../../permissions"; - -const i18nAwareItems = ({ items, config }) => - config.i18nEnabled ? items.filter(({ localeCode }) => localeCode === config.defaultLocale) : items; - -const DataManagerProvider = ({ children }) => { - const [reducerState, dispatch] = useReducer(reducer, initialState, init); - const toggleNotification = useNotification(); - const { autoReload } = useAppInfos(); - const { formatMessage } = useIntl(); - - const { - items, - config, - activeItem, - initialData, - changedActiveItem, - navigationPopupOpened, - navigationItemPopupOpened, - isLoading, - isLoadingForDataToBeSet, - isLoadingForDetailsDataToBeSet, - isLoadingForAdditionalDataToBeSet, - isLoadingForSubmit, - error, - availableLocale, - } = reducerState; - const { pathname } = useLocation(); - const formatMessageRef = useRef(); - formatMessageRef.current = formatMessage; - - const viewPermissions = useMemo( - () => ({ - access: pluginPermissions.access || pluginPermissions.update, - update: pluginPermissions.update, - }), - [], - ); - - const { - isLoading: isLoadingForPermissions, - allowedActions: { - canAccess, - canUpdate, - }, - } = useRBAC(viewPermissions); - - const getLayoutSettingRef = useRef(); - getLayoutSettingRef.current = (settingName) => - get({}, ["settings", settingName], ""); - - const isInDevelopmentMode = autoReload; - - const abortController = new AbortController(); - const { signal } = abortController; - const getDataRef = useRef(); - - const menuViewMatch = useRouteMatch(`/plugins/${pluginId}/:id`); - const activeId = get(menuViewMatch, "params.id", null); - const passedActiveItems = useMemo(() => { - return i18nAwareItems({ config, items }) - }, [config, items]); - - const getNavigation = async (id, navigationConfig) => { - try { - if (activeId || id) { - dispatch({ - type: GET_NAVIGATION_DATA, - }); - - const activeItem = await request(`/${pluginId}/${activeId || id}`, { - method: "GET", - signal, - }); - - dispatch({ - type: GET_NAVIGATION_DATA_SUCCEEDED, - activeItem: { - ...activeItem, - items: prepareItemToViewPayload({ - config: navigationConfig, - items: activeItem.items, - }), - }, - }); - } - } catch (err) { - console.error({ err }); - toggleNotification({ - type: 'warning', - message: getTrad('notification.error'), - }); - } - }; - - getDataRef.current = async (id) => { - try { - dispatch({ - type: GET_CONFIG, - }); - const config = await request(`/${pluginId}/config`, { - method: "GET", - signal, - }); - dispatch({ - type: GET_CONFIG_SUCCEEDED, - config, - }); - - dispatch({ - type: GET_LIST_DATA, - }); - const items = await request(`/${pluginId}`, { - method: "GET", - signal, - }); - - dispatch({ - type: GET_LIST_DATA_SUCCEEDED, - items, - }); - - if (id || !isEmpty(items)) { - await getNavigation(id || first(i18nAwareItems({ items, config })).id, config); - } - } catch (err) { - console.error({ err }); - toggleNotification({ - type: 'warning', - message: getTrad('notification.error'), - }); - } - }; - - useEffect(() => { - getDataRef.current(); - }, []); - - useEffect(() => { - // We need to set the modifiedData after the data has been retrieved - // and also on pathname change - if (!isLoading) { - getNavigation(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isLoading, pathname]); - - useEffect(() => { - if (!autoReload) { - toggleNotification({ - type: 'info', - message: { id: 'notification.info.autoreaload-disable' }, - }); - } - }, [autoReload]); - - const getContentTypeItems = async ({ modelUID, query, locale }) => { - dispatch({ - type: GET_CONTENT_TYPE_ITEMS, - }); - const url =`/navigation/content-type-items/${modelUID}`; - const queryParams = new URLSearchParams(); - queryParams.append('_publicationState', 'preview'); - if (query) { - queryParams.append('_q', query); - } - if (locale) { - queryParams.append('localeCode', locale); - } - - const contentTypeItems = await request(`${url}?${queryParams.toString()}`, { - method: "GET", - signal, - }); - - const fetchedContentType = find(config.contentTypes, ct => ct.uid === modelUID); - const isArray = Array.isArray(contentTypeItems); - dispatch({ - type: GET_CONTENT_TYPE_ITEMS_SUCCEEDED, - contentTypeItems: (isArray ? contentTypeItems : [contentTypeItems]).map(item => ({ - ...item, - __collectionUid: get(fetchedContentType, 'collectionUid', modelUID), - })), - }); - }; - - const handleChangeSelection = (id) => { - getNavigation(id, config); - }; - - const handleLocalizationSelection = (id) => { - getNavigation(id, config); - }; - - const handleI18nCopy = async (sourceId, targetId) => { - dispatch({ - type: I18N_COPY_NAVIGATION - }); - - const url = `/navigation/i18n/copy/${sourceId}/${targetId}`; - - await request(url, { - method: "PUT", - signal, - }); - - dispatch({ - type: I18N_COPY_NAVIGATION_SUCCESS, - }); - - handleChangeSelection(targetId); - }; - - const readNavigationItemFromLocale = async ({ locale, structureId }) => { - try { - const source = changedActiveItem.localizations?.find((navigation) => navigation.locale === locale); - - if (!source) { - return errorStatusResourceFor(['popup.item.form.i18n.locale.error.unavailable']); - } - - const url = `/navigation/i18n/item/read/${source.id}/${changedActiveItem.id}?path=${structureId}`; - - return resolvedResourceFor(await request(url, { - method: "GET", - signal, - })); - } catch (error) { - let messageKey; - - if (error instanceof Error) { - messageKey = get(error, 'response.payload.error.details.messageKey'); - } - - return errorStatusResourceFor([messageKey ?? 'popup.item.form.i18n.locale.error.generic']); - } - }; - - const handleChangeNavigationPopupVisibility = (visible) => { - dispatch({ - type: CHANGE_NAVIGATION_POPUP_VISIBILITY, - navigationPopupOpened: visible, - }); - }; - - const handleChangeNavigationItemPopupVisibility = (visible) => { - dispatch({ - type: CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY, - navigationItemPopupOpened: visible, - }); - }; - - const handleChangeNavigationData = (payload, forceClosePopups) => { - dispatch({ - type: CHANGE_NAVIGATION_DATA, - changedActiveItem: payload, - forceClosePopups, - }); - }; - - const handleResetNavigationData = () => { - dispatch({ - type: RESET_NAVIGATION_DATA, - activeItem, - }); - }; - - const handleSubmitNavigation = async (formatMessage, payload = {}) => { - try { - dispatch({ - type: SUBMIT_NAVIGATION, - }); - - const nagivationId = payload.id ? `/${payload.id}` : ""; - const method = payload.id ? "PUT" : "POST"; - const navigation = await request(`/${pluginId}${nagivationId}`, { - method, - signal, - body: payload, - }); - dispatch({ - type: SUBMIT_NAVIGATION_SUCCEEDED, - navigation: { - ...navigation, - items: prepareItemToViewPayload({ - config, - items: navigation.items, - }), - }, - }); - toggleNotification({ - type: 'success', - message: getTrad('notification.navigation.submit'), - }); - } catch (err) { - dispatch({ - type: SUBMIT_NAVIGATION_ERROR, - error: err.response.payload.data - }); - - if ( - err.response.payload.error && - err.response.payload.error.details && - err.response.payload.error.details.errorTitles - ) { - return toggleNotification({ - type: 'warning', - message: { - id: formatMessage( - getTrad('notification.navigation.error'), - { - ...err.response.payload.error.details, - errorTitles: err.response.payload.error.details.errorTitles - .map(title => `"${title}"`) - .join(", ") - }, - ) - }, - }); - } - - toggleNotification({ - type: 'warning', - message: getTrad('notification.error'), - }); - } - }; - - const handleNavigationsDeletion = (ids) => - Promise.all(ids.map(handleNavigationDeletion)); - - const handleNavigationsPurge = async (ids, withLangVersions = false, skipDispatch = false) => { - if (!skipDispatch) { - dispatch({ type: CACHE_CLEAR }); - } - - try { - if (ids.length) { - - await Promise.all(ids.map((id) => handleNavigationPurgeReq(id, withLangVersions))); - } else { - await handleNavigationsPurgeReq(); - } - } catch (error) { - console.error("Unable to clear navigation cache"); - } - - if (!skipDispatch) { - dispatch({ type: CACHE_CLEAR_SUCCEEDED }); - } - } - - const handleNavigationPurgeReq = (id, withLangVersions) => - request(`/${pluginId}/cache/purge/${id}?clearLocalisations=${!!withLangVersions}`, { - method: "DELETE", - signal, - }); - - const handleNavigationsPurgeReq = () => - request(`/${pluginId}/cache/purge`, { - method: "DELETE", - signal, - }); - - const handleNavigationDeletion = (id) => - request(`/${pluginId}/${id}`, { - method: "DELETE", - signal, - }); - - const slugify = (query) => - request( - `/${pluginId}/slug?q=${query}`, - { method: "GET", signal } - ).then((res) => { - if (!res?.slug) { - toggleNotification({ - type: 'warning', - message: formatMessage( - getTrad('notification.error.item.slug'), - { query, result: res?.slug || "" } - ) - }); - } - - return res; - }); - - const hardReset = () => getDataRef.current(); - - - if (!canAccess && !isLoadingForPermissions) { - return (); - } - - return ( - - {isLoading || isLoadingForPermissions ? : children} - - ); -}; - -DataManagerProvider.propTypes = { - children: PropTypes.node.isRequired, -}; - -export default memo(DataManagerProvider); diff --git a/admin/src/pages/DataManagerProvider/init.js b/admin/src/pages/DataManagerProvider/init.js deleted file mode 100644 index 18c17c07..00000000 --- a/admin/src/pages/DataManagerProvider/init.js +++ /dev/null @@ -1,5 +0,0 @@ -function init(initialState) { - return initialState; -} - -export default init; diff --git a/admin/src/pages/DataManagerProvider/reducer.js b/admin/src/pages/DataManagerProvider/reducer.js deleted file mode 100644 index 4e669f9d..00000000 --- a/admin/src/pages/DataManagerProvider/reducer.js +++ /dev/null @@ -1,150 +0,0 @@ -import produce from 'immer'; - -import { - GET_LIST_DATA, - GET_LIST_DATA_SUCCEEDED, - GET_NAVIGATION_DATA, - GET_NAVIGATION_DATA_SUCCEEDED, - RELOAD_PLUGIN, - RESET_NAVIGATION_DATA, - CHANGE_NAVIGATION_POPUP_VISIBILITY, - CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY, - CHANGE_NAVIGATION_DATA, - GET_CONFIG, - GET_CONFIG_SUCCEEDED, - GET_CONTENT_TYPE_ITEMS, - GET_CONTENT_TYPE_ITEMS_SUCCEEDED, - SUBMIT_NAVIGATION_SUCCEEDED, - SUBMIT_NAVIGATION, - SUBMIT_NAVIGATION_ERROR, - I18N_COPY_NAVIGATION_SUCCESS, - I18N_COPY_NAVIGATION, - CACHE_CLEAR, - CACHE_CLEAR_SUCCEEDED, -} from './actions'; - -const initialState = { - items: [], - activeItem: undefined, - changedActiveItem: undefined, - navigationPopupOpened: false, - navigationItemPopupOpened: false, - config: {}, - isLoading: true, - isLoadingForDataToBeSet: false, - isLoadingForDetailsDataToBeSet: false, - isLoadingForAdditionalDataToBeSet: false, - isLoadingForSubmit: false, - error: undefined, - i18nEnabled: false, - cascadeMenuAttached: true, - availableLocale: [], -}; - -const reducer = (state, action) => produce(state, draftState => { - switch (action.type) { - case GET_CONFIG: { - draftState.isLoadingForDetailsDataToBeSet = true; - draftState.config = {}; - break; - } - case GET_CONFIG_SUCCEEDED: { - draftState.isLoadingForDetailsDataToBeSet = false; - draftState.config = action.config; - break; - } - case GET_LIST_DATA: { - draftState.items = []; - draftState.isLoadingForDataToBeSet = true; - draftState.availableLocale = []; - break; - } - case GET_LIST_DATA_SUCCEEDED: { - draftState.items = action.items; - draftState.isLoading = false; - draftState.isLoadingForDataToBeSet = false; - draftState.availableLocale = [...action.items.reduce((set, item) => set.add(item.localeCode), new Set()).values()]; - break; - } - case GET_NAVIGATION_DATA: { - draftState.activeItem = undefined; - draftState.changedActiveItem = undefined; - draftState.isLoadingForDetailsDataToBeSet = true; - break; - } - case GET_NAVIGATION_DATA_SUCCEEDED: { - const activeItem = action.activeItem || {}; - draftState.activeItem = activeItem; - draftState.changedActiveItem = activeItem; - draftState.isLoadingForDetailsDataToBeSet = false; - break; - } - case CHANGE_NAVIGATION_DATA: { - draftState.changedActiveItem = action.changedActiveItem; - draftState.navigationPopupOpened = action.forceClosePopups ? false : state.navigationPopupOpened; - draftState.navigationItemPopupOpened = action.forceClosePopups ? false : state.navigationItemPopupOpened; - break; - } - case RESET_NAVIGATION_DATA : { - draftState.changedActiveItem = action.activeItem || {}; - break; - } - case GET_CONTENT_TYPE_ITEMS: { - draftState.isLoadingForAdditionalDataToBeSet = true; - break; - } - case GET_CONTENT_TYPE_ITEMS_SUCCEEDED: { - draftState.isLoadingForAdditionalDataToBeSet = false; - draftState.config.contentTypeItems = action.contentTypeItems; - break; - } - case CHANGE_NAVIGATION_POPUP_VISIBILITY: { - draftState.navigationPopupOpened = action.navigationPopupOpened; - break; - } - case CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY: { - draftState.navigationItemPopupOpened = action.navigationItemPopupOpened; - break; - } - case SUBMIT_NAVIGATION: { - draftState.isLoadingForSubmit = true; - draftState.error = undefined; - break; - } - case SUBMIT_NAVIGATION_SUCCEEDED: { - draftState.activeItem = action.navigation || {}; - draftState.changedActiveItem = action.navigation || {}; - draftState.isLoadingForSubmit = false; - break; - } - case SUBMIT_NAVIGATION_ERROR: { - draftState.isLoadingForSubmit = false; - draftState.error = action.error; - break; - } - case RELOAD_PLUGIN: { - return initialState; - } - case I18N_COPY_NAVIGATION: { - draftState.isLoading = true; - break; - } - case I18N_COPY_NAVIGATION_SUCCESS: { - draftState.isLoading = false; - break; - } - case CACHE_CLEAR: { - draftState.isLoading = true; - break; - } - case CACHE_CLEAR_SUCCEEDED: { - draftState.isLoading = false; - break; - } - default: - return draftState; - } -}); - -export default reducer; -export { initialState }; diff --git a/admin/src/pages/HomePage/components/AdditionalFieldInput/index.tsx b/admin/src/pages/HomePage/components/AdditionalFieldInput/index.tsx new file mode 100644 index 00000000..b2161c67 --- /dev/null +++ b/admin/src/pages/HomePage/components/AdditionalFieldInput/index.tsx @@ -0,0 +1,137 @@ +import { + MultiSelect, + MultiSelectOption, + SingleSelect, + SingleSelectOption, + TextInput, +} from '@strapi/design-system'; +import { useNotification, useStrapiApp } from '@strapi/strapi/admin'; +import { isNil } from 'lodash'; +import { useEffect, useMemo } from 'react'; +import { useIntl } from 'react-intl'; + +import { Toggle } from '@strapi/design-system'; +import { NavigationItemCustomField } from '../../../../schemas'; +import { getTrad } from '../../../../translations'; + +export type AdditionalFieldInputProps = { + name?: string; + field: NavigationItemCustomField; + isLoading: boolean; + onChange: (eventOrPath: React.ChangeEvent | string, value?: any) => void; + onChangeEnhancer: (eventOrPath: React.ChangeEvent | string, value?: any, nativeOnChange?: (eventOrPath: React.ChangeEvent | string, value?: any) => void) => void; + value: string | boolean | string[] | object | null; + disabled: boolean; +}; + +const DEFAULT_STRING_VALUE = ''; + +const mediaAttribute = { + type: 'media', + multiple: false, + required: false, + allowedTypes: ['images'], + pluginOptions: { + i18n: { + localized: false, + }, + }, +}; + +export const AdditionalFieldInput: React.FC = ({ + name, + field, + isLoading, + onChange, + onChangeEnhancer, + value, + disabled, +}) => { + const { toggleNotification } = useNotification(); + const { formatMessage } = useIntl(); + + const fields = useStrapiApp('AdditionalFieldInput', (state) => state.fields); + + const MediaLibrary = fields.media as React.ComponentType; + + const defaultInputProps = useMemo( + () => ({ + id: field.name, + name: name || field.name, + disabled: isLoading || disabled, + }), + [field, isLoading] + ); + + useEffect(() => { + if (field.type === 'media') { + onChangeEnhancer(defaultInputProps.name, value, onChange) + } + }, [value]); + + switch (field.type) { + case 'boolean': + return ( + | string) => onChangeEnhancer(eventOrPath, !value, onChange)} + onLabel="true" + offLabel="false" + type="checkbox" + /> + ); + case 'string': + return ( + | string, value?: any) => onChangeEnhancer(eventOrPath, value, onChange)} + value={value || DEFAULT_STRING_VALUE} + /> + ); + case 'select': + return field.multi ? ( + | string) => onChangeEnhancer(defaultInputProps.name, eventOrPath, onChange)} + value={isNil(value) ? (field.multi ? [] : null) : value} + multi={field.multi} + withTags={field.multi} + > + {field.options.map((option, index) => ( + + {option} + + ))} + + ) : ( + | string) => onChangeEnhancer(defaultInputProps.name, eventOrPath, onChange)} + value={isNil(value) ? (field.multi ? [] : null) : value} + multi={field.multi} + withTags={field.multi} + > + {field.options.map((option, index) => ( + + {option} + + ))} + + ); + case 'media': + return ( + + ); + default: + toggleNotification({ + type: 'warning', + message: formatMessage(getTrad('notification.error.customField.type')), + }); + throw new Error(`Type of custom field is unsupported`); + } +}; diff --git a/admin/src/pages/HomePage/components/CollapseButton/index.tsx b/admin/src/pages/HomePage/components/CollapseButton/index.tsx new file mode 100644 index 00000000..b2a3f9a3 --- /dev/null +++ b/admin/src/pages/HomePage/components/CollapseButton/index.tsx @@ -0,0 +1,37 @@ +import { Flex, Typography } from '@strapi/design-system'; +import { CaretDown, CaretUp } from '@strapi/icons'; +import styled from 'styled-components'; + +import { Effect } from '../../../../types'; + +const Wrapper = styled.div` + border-radius: 50%; + background: #dcdce4; + width: 25px; + height: 25px; + display: flex; + justify-content: center; + align-items: center; + margin-right: 8px; +`; + +interface Props { + toggle: Effect; + collapsed?: boolean; + itemsCount?: number; +} + +export const CollapseButton = ({ toggle, collapsed, itemsCount }: Props) => ( + + + {collapsed ? : } + + {itemsCount} nested items + +); diff --git a/admin/src/pages/HomePage/components/DragButton/index.tsx b/admin/src/pages/HomePage/components/DragButton/index.tsx new file mode 100644 index 00000000..e746c8af --- /dev/null +++ b/admin/src/pages/HomePage/components/DragButton/index.tsx @@ -0,0 +1,62 @@ +import { Drag } from '@strapi/icons'; +import React from 'react'; +import styled, { DefaultTheme } from 'styled-components'; + +const DragButtonWrapper = styled.span<{ ref: unknown, isActive?: boolean }>` + display: flex; + align-items: center; + justify-content: center; + + height: 32px; + width: 32px; + padding: ${({ theme }) => theme.spaces[2]}; + + background: ${({ theme, isActive }) => + isActive ? theme.colors.neutral150 : theme.colors.neutral0}; + border: 1px solid ${({ theme }) => theme.colors.neutral200}; + border-radius: ${({ theme }) => theme.borderRadius}; + cursor: pointer; + transition: background-color 0.3s ease-in; + + svg { + height: ${({ theme }) => theme.spaces[3]}; + width: ${({ theme }) => theme.spaces[3]}; + + > g, + path { + fill: ${({ theme }) => theme.colors.neutral500}; + } + } + &:hover { + svg { + > g, + path { + fill: ${({ theme }) => theme.colors.neutral600}; + } + } + } + &:active { + svg { + > g, + path { + fill: ${({ theme }) => theme.colors.neutral400}; + } + } + } + &[aria-disabled='true'] { + background-color: ${({ theme }) => theme.colors.neutral150}; + svg { + path { + fill: ${({ theme }) => theme.colors.neutral600}; + } + } + } +`; + +const DragButton = React.forwardRef((props, ref) => ( + + + +)); + +export default DragButton; diff --git a/admin/src/pages/HomePage/components/I18nCopyNavigationItems/index.tsx b/admin/src/pages/HomePage/components/I18nCopyNavigationItems/index.tsx new file mode 100644 index 00000000..5d43a625 --- /dev/null +++ b/admin/src/pages/HomePage/components/I18nCopyNavigationItems/index.tsx @@ -0,0 +1,38 @@ +import { FC } from 'react'; +import { useIntl } from 'react-intl'; + +import { ConfirmationDialog } from '../../../../components/ConfirmationDialog'; +import { getTrad } from '../../../../translations'; + +export interface ConfirmEffect { + (source: string): void; +} + +export interface CancelEffect { + (): void; +} + +interface Props { + onConfirm: ConfirmEffect; + onCancel: CancelEffect; +} + +const refreshIcon = <>; + +export const I18nCopyNavigationItemsModal: FC = ({ onConfirm, onCancel }) => { + const { formatMessage } = useIntl(); + + return ( + + {formatMessage(getTrad('pages.view.actions.i18nCopyItems.confirmation.content'))} + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationContentHeader/index.tsx b/admin/src/pages/HomePage/components/NavigationContentHeader/index.tsx new file mode 100644 index 00000000..f5e9dc3d --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationContentHeader/index.tsx @@ -0,0 +1,16 @@ +import { Flex } from '@strapi/design-system'; +import { ReactNode } from 'react'; + +interface Props { + startActions: ReactNode; + endActions: ReactNode; +} + +export const NavigationContentHeader = ({ startActions, endActions }: Props) => { + return ( + + {startActions} + {endActions} + + ); +}; diff --git a/admin/src/hooks/useNavigationManager.tsx b/admin/src/pages/HomePage/components/NavigationHeader/hooks.tsx similarity index 65% rename from admin/src/hooks/useNavigationManager.tsx rename to admin/src/pages/HomePage/components/NavigationHeader/hooks.tsx index 789d358c..8ed5ee11 100644 --- a/admin/src/hooks/useNavigationManager.tsx +++ b/admin/src/pages/HomePage/components/NavigationHeader/hooks.tsx @@ -1,5 +1,5 @@ -import React, { useCallback, useMemo, useState } from "react"; -import { NavigationManager } from "../pages/View/components/NavigationManager"; +import { useCallback, useMemo, useState } from 'react'; +import { NavigationManager } from '../NavigationManager'; export const useNavigationManager = () => { const [isOpened, setIsOpened] = useState(false); @@ -9,11 +9,7 @@ export const useNavigationManager = () => { const modal = useMemo( () => isOpened ? ( - + ) : null, [isOpened, close] ); diff --git a/admin/src/pages/HomePage/components/NavigationHeader/index.tsx b/admin/src/pages/HomePage/components/NavigationHeader/index.tsx new file mode 100644 index 00000000..995a170a --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationHeader/index.tsx @@ -0,0 +1,182 @@ +import { + Box, + Button, + Field, + Flex, + Grid, + SingleSelect, + SingleSelectOption, + Tag, +} from '@strapi/design-system'; +import { Check, Information } from '@strapi/icons'; +import { Layouts } from '@strapi/strapi/admin'; +import React from 'react'; +import { useIntl } from 'react-intl'; +import { NavigationSchema } from '../../../../api/validators'; +import { getTrad } from '../../../../translations'; +import { Effect } from '../../../../types'; +import { useConfig } from '../../hooks'; +import { useNavigationManager } from './hooks'; + +const submitIcon = ; + +interface Props { + activeNavigation?: NavigationSchema; + availableNavigations: NavigationSchema[]; + structureHasErrors?: boolean; + structureHasChanged?: boolean; + handleChangeSelection: Effect; + handleLocalizationSelection: Effect; + handleSave: Effect; + handleCachePurge: Effect; + permissions: { canUpdate?: boolean }; + locale: { + defaultLocale: string; + restLocale: string[]; + }; + currentLocale?: string; +} + +export const NavigationHeader: React.FC = ({ + activeNavigation, + availableNavigations, + structureHasErrors, + structureHasChanged, + handleChangeSelection, + handleLocalizationSelection, + handleSave, + handleCachePurge, + permissions = {}, + locale, + currentLocale, +}) => { + const { formatMessage } = useIntl(); + const { openNavigationManagerModal, navigationManagerModal } = useNavigationManager(); + + const hasLocalizations = !!locale.restLocale; + + const { canUpdate } = permissions; + + const configQuery = useConfig(); + + return ( + <> + + + + {!hasLocalizations ? : null} + {canUpdate && ( + + + + )} + + + { + const nextNavigation = availableNavigations.find(({ documentId }) => nextDocumentId === documentId); + + if (nextNavigation) { + handleChangeSelection(nextNavigation); + } + }} + value={activeNavigation?.documentId} + size="S" + style={null} + > + {availableNavigations + .filter(({ locale }) => locale === currentLocale) + .map(({ documentId, name }) => ( + + {name} + + ))} + + + + {hasLocalizations ? ( + + + {[locale.defaultLocale, ...locale.restLocale].map((code) => ( + + {code} + + ))} + + + ) : null} + {canUpdate && ( + + + + )} + {configQuery.data?.isCacheEnabled && ( + + + + )} + + + {canUpdate && navigationManagerModal} + + } + secondaryAction={ + }> + {activeNavigation + ? formatMessage(getTrad('header.meta'), { + id: activeNavigation?.documentId, + key: activeNavigation?.slug, + }) + : null} + + } + /> + + ); +}; diff --git a/admin/src/pages/View/components/NavigationHeader/styles.js b/admin/src/pages/HomePage/components/NavigationHeader/styles.ts similarity index 81% rename from admin/src/pages/View/components/NavigationHeader/styles.js rename to admin/src/pages/HomePage/components/NavigationHeader/styles.ts index 3573cae5..f8005061 100644 --- a/admin/src/pages/View/components/NavigationHeader/styles.js +++ b/admin/src/pages/HomePage/components/NavigationHeader/styles.ts @@ -1,5 +1,5 @@ import styled from 'styled-components'; -import { IconButton } from '@strapi/design-system/IconButton'; +import { IconButton } from '@strapi/design-system'; export const MoreButton = styled(IconButton)` margin: ${({ theme }) => `0 ${theme.spaces[2]}`}; diff --git a/admin/src/pages/HomePage/components/NavigationItemForm/index.tsx b/admin/src/pages/HomePage/components/NavigationItemForm/index.tsx new file mode 100644 index 00000000..12877554 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemForm/index.tsx @@ -0,0 +1,932 @@ +import { AnyEntity, Field } from '@sensinum/strapi-utils'; +import { Form, useNotification } from '@strapi/strapi/admin'; +import { get, isBoolean, isEmpty, isNil, isObject, isString, set, sortBy } from 'lodash'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useIntl } from 'react-intl'; + +import { + Box, + Button, + Divider, + Grid, + Modal, + MultiSelect, + MultiSelectOption, + SingleSelect, + SingleSelectOption, + TextInput, + Toggle, +} from '@strapi/design-system'; + +import { NavigationSchema } from '../../../../api/validators'; +import { NavigationItemAdditionalField } from '../../../../schemas'; +import { getTrad } from '../../../../translations'; +import { + Effect, + FormChangeEvent, + FormItemErrorSchema, + ToBeFixed, + VoidEffect, +} from '../../../../types'; +import { + useConfig, + useContentTypeItems, + useCopyNavigationItemI18n, + useNavigations, +} from '../../hooks'; +import { extractRelatedItemLabel } from '../../utils'; +import { AdditionalFieldInput } from '../AdditionalFieldInput'; +import { NavigationItemPopupFooter } from '../NavigationItemPopup/NavigationItemPopupFooter'; +import { ContentTypeEntity } from './types'; +import { + fallbackDefaultValues, + navigationItemFormSchema, + NavigationItemFormSchema, +} from './utils/form'; +import { useSlug } from './utils/hooks'; +import { generatePreviewPath, generateUiRouterKey } from './utils/properties'; + +export { ContentTypeEntity, GetContentTypeEntitiesPayload } from './types'; +export { NavigationItemFormSchema } from './utils/form'; + +export type SubmitEffect = Effect; + +type NavigationItemFormProps = { + appendLabelPublicationStatus: (label: string, entity: ContentTypeEntity, _: boolean) => string; + current: Partial; + isLoading: boolean; + locale: string; + onCancel: VoidEffect; + onSubmit: SubmitEffect; + availableLocale: string[]; + permissions?: Partial<{ canUpdate: boolean }>; + currentNavigation: Pick; +}; + +const FALLBACK_ADDITIONAL_FIELDS: Array = []; + +export const NavigationItemForm: React.FC = ({ + availableLocale, + isLoading: isPreloading, + current = fallbackDefaultValues, + onSubmit, + onCancel, + appendLabelPublicationStatus = appendLabelPublicationStatusFallback, + locale, + permissions = {}, + currentNavigation, +}) => { + const { formatMessage } = useIntl(); + + const [isLoading, setIsLoading] = useState(isPreloading); + + const { canUpdate } = permissions; + + const [isSingleSelected, setIsSingleSelected] = useState(false); + + const [itemLocaleCopyValue, setItemLocaleCopyValue] = useState(); + + const [formValue, setFormValue] = useState( + {} as NavigationItemFormSchema + ); + + const [formError, setFormError] = useState>(); + + const configQuery = useConfig(); + + const availableAudiences = configQuery.data?.availableAudience ?? []; + + const contentTypes = configQuery.data?.contentTypes ?? []; + + const { toggleNotification } = useNotification(); + + const copyItemFromLocaleMutation = useCopyNavigationItemI18n(); + + const navigationsQuery = useNavigations(); + + const handleChange = ( + eventOrPath: FormChangeEvent, + value?: any, + nativeOnChange?: (eventOrPath: FormChangeEvent, value?: any) => void + ) => { + if (nativeOnChange) { + let fieldName = eventOrPath; + let fieldValue = value; + if (isObject(eventOrPath)) { + const { name: targetName, value: targetValue } = eventOrPath.target; + fieldName = targetName; + fieldValue = isNil(fieldValue) ? targetValue : fieldValue; + } + + if (isString(fieldName)) { + setFormValueItem(fieldName, fieldValue); + } + + return nativeOnChange(eventOrPath, fieldValue); + } + }; + + const setFormValueItem = (path: string, value: any) => { + setFormValue( + set( + { + ...formValue, + additionalFields: { + ...formValue.additionalFields, + }, + updated: true, + }, + path, + value + ) + ); + }; + + const encodePayload = (values: NavigationItemFormSchema): NavigationItemFormSchema => { + return { + ...values, + additionalFields: + configQuery.data?.additionalFields.reduce((acc, field: NavigationItemAdditionalField) => { + const { name, type } = field as ToBeFixed; + + if (name in (values.additionalFields ?? {})) { + let val = values.additionalFields[name]; + + switch (type) { + case 'boolean': + val = isBoolean(val) ? `${val}` : val; + break; + case 'media': + val = val ? JSON.stringify(val) : val; + break; + default: + break; + } + return { + ...acc, + [name]: val, + }; + } + return acc; + }, {}) || {}, + }; + }; + + const decodePayload = (values: NavigationItemFormSchema): NavigationItemFormSchema => { + return { + ...values, + additionalFields: + configQuery.data?.additionalFields.reduce((acc, field: NavigationItemAdditionalField) => { + const { name, type } = field as ToBeFixed; + + if (name in (values.additionalFields ?? {})) { + let val = values.additionalFields[name]; + + switch (type) { + case 'boolean': + val = val === 'true' ? true : false; + break; + case 'media': + val = val ? JSON.parse(val) : val; + break; + default: + break; + } + return { + ...acc, + [name]: val, + }; + } + return acc; + }, {}) || {}, + }; + }; + + const submit = async (e: React.MouseEvent, values: NavigationItemFormSchema) => { + e.preventDefault(); + + const sanitizedValues = encodePayload(values); + const { + success, + data: payload, + error, + } = navigationItemFormSchema({ + isSingleSelected, + additionalFields: configQuery.data?.additionalFields ?? FALLBACK_ADDITIONAL_FIELDS, + }).safeParse(sanitizedValues); + + if (success) { + const title = !!payload.title.trim() + ? payload.title.trim() + : payload.type === 'INTERNAL' + ? getDefaultTitle(payload?.related?.toString(), payload.relatedType, isSingleSelected) + : ''; + + setIsLoading(true); + + const uiRouterKey = await generateUiRouterKey( + payload.type === 'INTERNAL' + ? { + slugify: slugifyMutation.mutateAsync, + title, + related: payload.related, + relatedType: payload.relatedType, + } + : { slugify: slugifyMutation.mutateAsync, title } + ); + + slugifyMutation.reset(); + + setIsLoading(false); + + if (!uiRouterKey) { + toggleNotification({ + type: 'warning', + message: formatMessage(getTrad('popup.item.form.uiRouter.unableToRender')), + }); + return; + } + + onSubmit( + payload.type === 'INTERNAL' + ? { + ...payload, + title, + uiRouterKey, + } + : { + ...payload, + title, + uiRouterKey, + } + ); + } else if (error) { + setFormError( + error.issues.reduce((acc, err) => { + return { + ...acc, + [err.path.join('.')]: err.message, + }; + }, {} as FormItemErrorSchema) + ); + } + }; + + const renderError = (error: string): string | undefined => { + const errorOccurence = get(formError, error); + if (errorOccurence) { + return formatMessage(getTrad(error)); + } + return undefined; + }; + + const initialRelatedTypeSelected = current.type === 'INTERNAL' ? current.relatedType : undefined; + const { + path: currentPath, + type: currentType, + title: currentTitle, + autoSync: autoSyncEnabled, + } = formValue; + + const { relatedType: currentRelatedType, related: currentRelated } = + formValue.type === 'INTERNAL' + ? formValue + : { + related: undefined, + relatedType: undefined, + }; + + const isExternal = currentType === 'EXTERNAL'; + const isInternal = currentType === 'INTERNAL'; + + const pathSourceName = isExternal ? 'externalPath' : 'path'; + + const submitDisabled = (isInternal && !isSingleSelected && isNil(currentRelated)) || isLoading; + + const contentTypeItemsQuery = useContentTypeItems({ + uid: currentRelatedType ?? '', + locale, + }); + + const slugifyMutation = useSlug(); + + const availableLocaleOptions = useMemo( + () => + availableLocale.map((locale, index) => ({ + key: `${locale}-${index}`, + value: locale, + label: locale, + })), + [availableLocale] + ); + + const audienceOptions = useMemo( + () => + availableAudiences.map((item) => ({ + value: item.documentId ?? 0, + label: item.name ?? ' ', + })), + [availableAudiences] + ); + + const getDefaultTitle = useCallback( + (related: string | undefined, relatedType: string | undefined, isSingleSelected: boolean) => { + let selectedEntity; + + if (isSingleSelected) { + selectedEntity = contentTypeItemsQuery.data?.find( + (_) => _.uid === relatedType || _.__collectionUid === relatedType + ); + + if (!selectedEntity) { + return contentTypes.find((_) => _.uid === relatedType)?.contentTypeName; + } + } else { + const entity = contentTypeItemsQuery.data?.find(({ documentId }) => documentId === related); + + selectedEntity = { + ...(entity || { + documentId: null, + }), + __collectionUid: relatedType, + }; + } + return extractRelatedItemLabel(selectedEntity as AnyEntity, configQuery.data); + }, + [contentTypeItemsQuery.data, configQuery.data, contentTypes] + ); + + const navigationItemTypeOptions = (['INTERNAL', 'EXTERNAL', 'WRAPPER'] as const).map((key) => { + return { + key, + value: key, + label: formatMessage(getTrad(`popup.item.form.type.${key.toLowerCase()}.label`)), + }; + }); + + const relatedSelectOptions = sortBy( + contentTypeItemsQuery.data?.map((item) => { + const label = appendLabelPublicationStatus( + extractRelatedItemLabel( + { + ...item, + __collectionUid: currentRelatedType, + }, + configQuery.data + ), + item, + false + ); + + return { + key: item?.documentId?.toString(), + value: item?.documentId?.toString(), + label: label, + }; + }) ?? [], + (item) => item.key + ); + + const relatedTypeSelectOptions = useMemo( + () => + sortBy( + configQuery.data?.contentTypes + ?.filter((contentType) => { + if (contentType.isSingle) { + return !!( + currentRelatedType && + [currentRelatedType, initialRelatedTypeSelected].includes(contentType.uid) + ); + } + + return true; + }) + .map((item) => { + return { + key: item.uid, + value: item.uid, + label: item.contentTypeName, + }; + }), + (item) => item.key + ), + [configQuery.data, currentRelatedType] + ); + + const thereAreNoMoreContentTypes = isEmpty(relatedSelectOptions); + + const onCopyFromLocale = useCallback( + async (event: React.BaseSyntheticEvent) => { + event.preventDefault(); + event.stopPropagation(); + + const source = navigationsQuery.data?.find(({ locale }) => locale === itemLocaleCopyValue); + + if (source) { + setIsLoading(true); + + copyItemFromLocaleMutation.mutate( + { + target: currentNavigation.documentId, + structureId: current.structureId, + source: source.documentId, + }, + { + onSuccess(data) { + copyItemFromLocaleMutation.reset(); + + const { type, externalPath, path, related, title, uiRouterKey } = data; + const { __type, documentId } = related ?? {}; + + setFormValueItem('type', type); + setFormValueItem('externalPath', externalPath ?? undefined); + setFormValueItem('path', path ?? undefined); + setFormValueItem('title', title); + setFormValueItem('uiRouterKey', uiRouterKey); + + if (__type && documentId) { + setFormValueItem('related', documentId); + setFormValueItem('relatedType', __type); + } + }, + onSettled() { + setIsLoading(false); + }, + } + ); + } + }, + [setIsLoading, copyItemFromLocaleMutation, navigationsQuery] + ); + + useEffect(() => { + setFormValue( + decodePayload({ + ...fallbackDefaultValues, + ...current, + } as NavigationItemFormSchema) + ); + }, [current]); + + useEffect(() => { + if (currentRelatedType) { + const relatedType = configQuery.data?.contentTypes.find( + (contentType) => contentType.uid === currentRelatedType + ); + + if (relatedType) { + setIsSingleSelected(relatedType.isSingle); + + if (relatedType.isSingle && contentTypeItemsQuery.data?.length) { + const nextRelated = contentTypeItemsQuery.data[0]; + + if (nextRelated) { + setFormValueItem('related', nextRelated.documentId); + } + } + } + } + }, [currentRelatedType, configQuery.data, contentTypeItemsQuery.data]); + + useEffect(() => { + if ( + autoSyncEnabled && + currentType === 'INTERNAL' && + currentRelated && + currentRelatedType && + configQuery.data + ) { + const relatedItem = contentTypeItemsQuery.data?.find((item) => { + return item.documentId === currentRelated; + }); + + if (relatedItem) { + const { contentTypesNameFields, pathDefaultFields } = configQuery.data; + + const nextPath = pathDefaultFields[currentRelatedType]?.reduce( + (acc, field) => { + return acc ? acc : relatedItem?.[field]; + }, + undefined + ); + + const nextTitle = (contentTypesNameFields[currentRelatedType] ?? []) + .concat(contentTypesNameFields.default ?? []) + .reduce((acc, field) => { + return acc ? acc : relatedItem?.[field]; + }, undefined); + + const batch: Array<{ name: keyof NavigationItemFormSchema; value: string }> = []; + + if (nextPath && nextPath !== currentPath) { + batch.push({ name: 'path', value: nextPath }); + } + + if (nextTitle && nextTitle !== currentTitle) { + batch.push({ name: 'title', value: nextTitle }); + } + + setTimeout(() => { + batch.forEach((next) => { + setFormValueItem(next.name as any, next.value); + }); + }, 100); + } + } + }, [ + currentTitle, + currentPath, + autoSyncEnabled, + currentType, + currentRelated, + currentRelatedType, + configQuery.data, + contentTypeItemsQuery.data, + ]); + + return ( + <> + +
+ {({ values, onChange }) => { + const internalValues = + values.type === 'INTERNAL' + ? values + : { + related: undefined, + relatedType: undefined, + }; + + const pathDefault = generatePreviewPath({ + currentPath: values.path, + isExternal: values.type === 'EXTERNAL', + current, + currentType: values.type, + config: configQuery.data, + contentTypeItems: contentTypeItemsQuery.data, + currentRelated: internalValues.related, + currentRelatedType: internalValues.relatedType, + isSingleSelected, + }); + + return ( + <> + + + + + handleChange(eventOrPath, value, onChange) + } + value={values.title} + /> + + + + + + + handleChange('type', eventOrPath, onChange) + } + value={values.type} + name="type" + disabled={!configQuery.data?.contentTypes.length || !canUpdate} + width="100%" + > + {navigationItemTypeOptions.map(({ key, label, value }) => ( + + {label} + + ))} + + + + + + + + handleChange(eventOrPath, !values.menuAttached, onChange) + } + value={values.menuAttached} + onLabel="true" + offLabel="false" + disabled={ + !canUpdate || + (configQuery.data?.cascadeMenuAttached + ? !(current.isMenuAllowedLevel && current.parentAttachedToMenu) + : false) + } + width="100%" + /> + + + + {values.type === 'INTERNAL' && ( + + + + handleChange(eventOrPath, !values.autoSync, onChange) + } + onLabel="Enabled" + offLabel="Disabled" + /> + + + )} + + + + + handleChange(eventOrPath, value, onChange) + } + // @ts-expect-error + value={values[pathSourceName]} + width="100%" + /> + + + + {values.type === 'INTERNAL' && ( + <> + + + + handleChange('relatedType', eventOrPath, onChange) + } + value={values.relatedType} + disabled={!configQuery.data?.contentTypes.length || !canUpdate} + width="100%" + > + {configQuery.data?.contentTypes.map((contentType) => ( + + {contentType.contentTypeName} + + ))} + + + + + {values.relatedType && !isSingleSelected && ( + + + + handleChange('related', eventOrPath, onChange) + } + value={values.related} + options={relatedSelectOptions} + disabled={isLoading || thereAreNoMoreContentTypes || !canUpdate} + width="100%" + > + {relatedSelectOptions.map(({ key, label, value }) => ( + + {label} + + ))} + + + + )} + + )} + + {!isEmpty(configQuery.data?.additionalFields) && ( + + + + )} + + {configQuery.data?.additionalFields.map( + (additionalField: NavigationItemAdditionalField, index: number) => { + if (additionalField === 'audience') { + return ( + + + + handleChange('audience', eventOrPath, onChange) + } + width="100%" + > + {audienceOptions.map(({ value, label }) => ( + + {label} + + ))} + + + + ); + } else { + return ( + + + + + + ); + } + } + )} + + + {availableLocaleOptions && availableLocaleOptions.length > 1 && ( + <> + + + + + + + {availableLocaleOptions.map(({ key, label, value }) => ( + + {label} + + ))} + + + + + {canUpdate && ( + + + + + + )} + + + )} + + ); + }} + +
+ + submit(e, formValue)} + handleCancel={onCancel} + submitDisabled={submitDisabled} + canUpdate={canUpdate} + /> + + ); +}; + +const appendLabelPublicationStatusFallback = () => ''; diff --git a/admin/src/pages/HomePage/components/NavigationItemForm/types.ts b/admin/src/pages/HomePage/components/NavigationItemForm/types.ts new file mode 100644 index 00000000..2594e63d --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemForm/types.ts @@ -0,0 +1,51 @@ +import { NavigationItemTypeSchema } from '../../../../api/validators'; +import { NavigationItemAdditionalField } from '../../../../schemas'; + +export type GetContentTypeEntitiesPayload = { + modelUID: string; + query: ContentTypeSearchQuery; + locale: string; +}; + +export interface PluginPermissions { + canUpdate?: boolean; + canRead?: boolean; +} + +export type ContentTypeSearchQuery = Record; +export type RawFormPayload = { + type: NavigationItemTypeSchema; + autoSync?: boolean; + related?: string; + relatedType?: string; + audience: number[]; + menuAttached: boolean; + title: string; + externalPath: string | null; + path: string | null; + additionalFields: NavigationItemAdditionalField; + updated: boolean; +}; + +export type SanitizedFormPayload = { + title: string; + type: NavigationItemTypeSchema; + menuAttached: boolean; + path?: string | null; + externalPath?: string | null; + related: string | undefined; + relatedType: string | undefined; + isSingle: boolean; + singleRelatedItem: ContentTypeEntity | undefined; + uiRouterKey: string | undefined; +}; + +export interface ContentTypeEntity { + id: number; + documentId: string; + uid?: string; + __collectionUid?: string; + label?: string; +} + +export type PluginConfigNameFields = Record; diff --git a/admin/src/pages/HomePage/components/NavigationItemForm/utils/form.ts b/admin/src/pages/HomePage/components/NavigationItemForm/utils/form.ts new file mode 100644 index 00000000..c7049f12 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemForm/utils/form.ts @@ -0,0 +1,146 @@ +import { z } from 'zod'; +import { NavigationItemAdditionalField } from '../../../../../schemas'; + +const externalPathRegexps = [ + /^mailto:[\w-\.]+@([\w-]+\.)+[\w-]{2,}$/, + /^tel:(\+\d{1,3})?[\s]?(\(?\d{2,3}\)?)?[\s.-]?(\d{3})?[\s.-]?\d{3,4}$/, + /^#.*/, + /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/, +]; + +interface FormSchemaBuilderInput { + isSingleSelected?: boolean; + additionalFields: Array; +} + +const navigationItemCommon = ({ additionalFields }: FormSchemaBuilderInput) => + z.object({ + title: z.string(), + autoSync: z.boolean().optional(), + removed: z.boolean().optional(), + updated: z.boolean().optional(), + uiRouterKey: z.string(), + levelPath: z.string().optional(), + isMenuAllowedLevel: z.boolean().optional(), + parentAttachedToMenu: z.boolean().optional(), + viewId: z.number().optional(), + structureId: z.string().optional(), + menuAttached: z.boolean().optional(), + collapsed: z.boolean().optional(), + isSearchActive: z.boolean().optional(), + viewParentId: z.number().optional(), + id: z.number().optional(), + documentId: z.string().optional(), + audience: z.string().array().optional(), + order: z.number().optional(), + items: z.any().array().optional(), + additionalFields: z.object( + additionalFields.reduce< + Record< + string, + | z.ZodString + | z.ZodBoolean + | z.ZodAny + | z.ZodArray + | z.ZodOptional + | z.ZodOptional + | z.ZodOptional + | z.ZodOptional> + > + >((acc, field) => { + if (typeof field === 'string') { + return acc; + } + + switch (field.type) { + case 'string': + acc[field.name] = field.required ? z.string() : z.string().optional(); + break; + case 'boolean': + acc[field.name] = field.required ? z.boolean() : z.boolean().optional(); + case 'media': + acc[field.name] = field.required ? z.any() : z.any().optional(); + case 'select': { + if (field.multi) { + acc[field.name] = field.required ? z.string().array() : z.string().array().optional(); + } else { + acc[field.name] = field.required ? z.string() : z.string().optional(); + } + + break; + } + default: + break; + } + + return acc; + }, {}) + ), + }); + +const navigationInternalItemFormSchema = ({ + additionalFields, + isSingleSelected, +}: FormSchemaBuilderInput) => + navigationItemCommon({ + additionalFields, + isSingleSelected, + }).extend({ + type: z.literal('INTERNAL'), + path: z.string(), + externalPath: z.string().optional(), + relatedType: z.string(), + related: isSingleSelected ? z.string().optional() : z.string(), + }); + +const navigationExternalItemFormSchema = ({ + isSingleSelected, + additionalFields, +}: FormSchemaBuilderInput) => + navigationItemCommon({ + additionalFields, + isSingleSelected, + }).extend({ + type: z.literal('EXTERNAL'), + path: z.string().or(z.null()).optional(), + externalPath: z + .string() + .min(1) + .refine((path) => externalPathRegexps.some((re) => re.test(path))), + relatedType: z.string().optional(), + related: z.string().optional(), + }); + +const navigationWrapperItemFormSchema = ({ + isSingleSelected, + additionalFields, +}: FormSchemaBuilderInput) => + navigationItemCommon({ + additionalFields, + isSingleSelected, + }).extend({ + type: z.literal('WRAPPER'), + path: z.string().or(z.null()).optional(), + }); + +export type NavigationItemFormSchema = z.infer>; +export const navigationItemFormSchema = (input: FormSchemaBuilderInput) => + z.discriminatedUnion('type', [ + navigationExternalItemFormSchema(input), + navigationInternalItemFormSchema(input), + navigationWrapperItemFormSchema(input), + ]); + +export const fallbackDefaultValues: NavigationItemFormSchema = { + autoSync: true, + type: 'INTERNAL', + relatedType: '', + menuAttached: false, + title: '', + externalPath: '', + path: '', + additionalFields: {}, + audience: [], + updated: false, + uiRouterKey: '', +}; diff --git a/admin/src/pages/HomePage/components/NavigationItemForm/utils/hooks.ts b/admin/src/pages/HomePage/components/NavigationItemForm/utils/hooks.ts new file mode 100644 index 00000000..5fec0c8d --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemForm/utils/hooks.ts @@ -0,0 +1,15 @@ +import { getFetchClient } from '@strapi/strapi/admin'; +import { useMutation } from '@tanstack/react-query'; + +import { getApiClient } from '../../../../../api'; + +export const useSlug = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useMutation({ + mutationFn(query: string) { + return apiClient.slugify(query); + }, + }); +}; diff --git a/admin/src/pages/HomePage/components/NavigationItemForm/utils/properties.ts b/admin/src/pages/HomePage/components/NavigationItemForm/utils/properties.ts new file mode 100644 index 00000000..834180da --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemForm/utils/properties.ts @@ -0,0 +1,130 @@ +import { first, isEmpty } from 'lodash'; + +import { + ConfigFromServerSchema, + NavigationItemTypeSchema, + StrapiContentTypeItemSchema, +} from '../../../../../api/validators'; +import { extractRelatedItemLabel } from '../../../../HomePage/utils'; +import { NavigationItemFormSchema } from './form'; + +interface GenerateUiRouterKeyInput { + slugify: (s: string) => Promise; + title: string; + related?: number | string; + relatedType?: string; + contentTypeItems?: Array; + config?: ConfigFromServerSchema; +} + +interface GeneratePreviewPathInput { + isExternal?: boolean; + currentPath?: string | null; + current: Partial; + currentType?: NavigationItemTypeSchema; + currentRelatedType?: string; + currentRelated?: number | string; + config?: ConfigFromServerSchema; + isSingleSelected?: boolean; + contentTypeItems?: Array; +} + +interface GetDefaultPathInput { + currentType: NavigationItemTypeSchema; + currentRelatedType?: string; + currentRelated?: number | string; + config?: ConfigFromServerSchema; + isSingleSelected?: boolean; + contentTypeItems?: Array; +} + +export const generateUiRouterKey = async ({ + slugify, + title, + config, + related, + relatedType, + contentTypeItems, +}: GenerateUiRouterKeyInput): Promise => { + if (title) { + return title ? await slugify(title) : undefined; + } else if (related) { + const relationTitle = extractRelatedItemLabel( + { + ...(contentTypeItems?.find((_) => _.documentId === related.toString()) ?? { + documentId: '', + id: 0, + }), + __collectionUid: relatedType, + }, + config + ); + + return relationTitle ? await slugify(relationTitle) : undefined; + } + + return undefined; +}; + +export const getDefaultPath = ({ + currentType, + config, + contentTypeItems, + currentRelated, + currentRelatedType, + isSingleSelected, +}: GetDefaultPathInput): string => { + if (currentType !== 'INTERNAL') return ''; + + if (!currentRelatedType) { + return ''; + } + + const pathDefaultFields = config?.pathDefaultFields[currentRelatedType] ?? []; + + if (isEmpty(currentType) && !isEmpty(pathDefaultFields)) { + const selectedEntity = isSingleSelected + ? first(contentTypeItems ?? []) + : contentTypeItems?.find(({ id }) => id === currentRelated); + + const pathDefaultValues = pathDefaultFields + .map((field: string) => selectedEntity?.[field] ?? '') + .filter((value: string) => !!value.toString().trim()); + + return pathDefaultValues[0] ?? ''; + } + + return ''; +}; + +export const generatePreviewPath = ({ + currentPath, + isExternal, + current, + currentType = 'INTERNAL', + config, + contentTypeItems, + currentRelated, + currentRelatedType, + isSingleSelected, +}: GeneratePreviewPathInput): string | undefined => { + if (!isExternal) { + const itemPath = + isEmpty(currentPath) || currentPath === '/' + ? getDefaultPath({ + currentType, + config, + contentTypeItems, + currentRelated, + currentRelatedType, + isSingleSelected, + }) + : currentPath || ''; + + const result = `${current.levelPath !== '/' ? `${current.levelPath}` : ''}/${itemPath}`; + + return result.replace('//', '/'); + } + + return undefined; +}; diff --git a/admin/src/components/NavigationItemList/Wrapper.js b/admin/src/pages/HomePage/components/NavigationItemList/Wrapper.ts similarity index 75% rename from admin/src/components/NavigationItemList/Wrapper.js rename to admin/src/pages/HomePage/components/NavigationItemList/Wrapper.ts index 5a1ebe59..ac8ea385 100644 --- a/admin/src/components/NavigationItemList/Wrapper.js +++ b/admin/src/pages/HomePage/components/NavigationItemList/Wrapper.ts @@ -1,8 +1,10 @@ import styled from 'styled-components'; -const Wrapper = styled.div` +const Wrapper = styled.div<{ level?: number }>` position: relative; - ${({ level, theme }) => level && ` + ${({ level, theme }) => + level && + ` &::before { content: ""; display: block; @@ -19,4 +21,4 @@ const Wrapper = styled.div` `}; `; -export default Wrapper; \ No newline at end of file +export default Wrapper; diff --git a/admin/src/pages/HomePage/components/NavigationItemList/index.tsx b/admin/src/pages/HomePage/components/NavigationItemList/index.tsx new file mode 100644 index 00000000..225eeaa5 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemList/index.tsx @@ -0,0 +1,75 @@ +import { FC } from 'react'; + +import { NavigationItemSchema } from '../../../../api/validators'; +import { + Item, + OnItemCollapseEffect, + OnItemEditEffect, + OnItemLevelAddEffect, + OnItemRemoveEffect, + OnItemReorderEffect, + OnItemRestoreEffect, +} from '../NavigationItemListItem'; +import Wrapper from './Wrapper'; + +interface Props { + isParentAttachedToMenu?: boolean; + items?: Array; + level?: number; + levelPath?: string; + onItemEdit: OnItemEditEffect; + onItemLevelAdd: OnItemLevelAddEffect; + onItemRemove: OnItemRemoveEffect; + onItemRestore: OnItemRestoreEffect; + onItemReOrder: OnItemReorderEffect; + onItemToggleCollapse: OnItemCollapseEffect; + displayFlat?: boolean; + permissions: { canUpdate: boolean; canAccess: boolean }; + structurePrefix: string; + viewParentId?: number; + locale: string; +} + +export const List: FC = ({ + isParentAttachedToMenu = false, + items, + level = 0, + levelPath = '', + onItemEdit, + onItemLevelAdd, + onItemRemove, + onItemRestore, + onItemReOrder, + onItemToggleCollapse, + displayFlat, + permissions, + structurePrefix, + viewParentId, + locale, +}) => ( + + {items?.map((item, index) => { + return ( + + ); + })} + +); diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardBadge/index.ts b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardBadge/index.ts new file mode 100644 index 00000000..2f2a77c6 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardBadge/index.ts @@ -0,0 +1,22 @@ +import { Badge } from '@strapi/design-system'; +import styled from 'styled-components'; + +export const ItemCardBadge = styled(Badge)` + border: 1px solid ${({ theme, borderColor }) => theme.colors[borderColor]}; + + ${({ small, theme }) => + small && + ` + padding: ${theme.spaces[1]} ${theme.spaces[2]}; + margin: 0px ${theme.spaces[3]}; + vertical-align: middle; + + cursor: default; + + span { + font-size: .65rem; + line-height: 1; + vertical-align: middle; + } + `} +`; diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/Wrapper.tsx b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/Wrapper.tsx new file mode 100644 index 00000000..5f305970 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/Wrapper.tsx @@ -0,0 +1,15 @@ +import { CardTitle } from '@strapi/design-system'; +import styled from 'styled-components'; + +export const CardItemTitle = styled(CardTitle)` + width: 100%; + + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + > div > * { + margin: 0px ${({ theme }) => theme.spaces[1]}; + } +`; diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/icons.tsx b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/icons.tsx new file mode 100644 index 00000000..a306e5ec --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/icons.tsx @@ -0,0 +1,7 @@ +import { ArrowClockwise, Eye, Pencil, Trash, Typhoon } from '@strapi/icons'; + +export const pencilIcon = ; +export const refreshIcon = ; +export const trashIcon = ; +export const eyeIcon = ; +export const arrowClockwise = diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/index.tsx b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/index.tsx new file mode 100644 index 00000000..71cf0a07 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardHeader/index.tsx @@ -0,0 +1,112 @@ +import { IconButton as BaseIconButton, IconButtonGroup, Flex, Typography } from '@strapi/design-system'; +import { FC, MutableRefObject, ReactNode } from 'react'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import { getTrad } from '../../../../../translations'; +import { VoidEffect } from '../../../../../types'; +import DragButton from '../../DragButton'; +import { ItemCardBadge } from '../ItemCardBadge'; +import { CardItemTitle } from './Wrapper'; +import { eyeIcon, pencilIcon, arrowClockwise, trashIcon } from './icons'; + +interface IProps { + title: string; + path?: string; + icon: ReactNode; + removed?: boolean; + canUpdate: boolean; + onItemRemove: VoidEffect; + onItemEdit: VoidEffect; + onItemRestore: VoidEffect; + dragRef: MutableRefObject; + isSearchActive?: boolean; +} + +const wrapperStyle = { zIndex: 2 }; +const pathWrapperStyle = { maxWidth: '425px' }; + +export const ItemCardHeader: FC = ({ + title, + path, + icon, + removed, + canUpdate, + onItemRemove, + onItemEdit, + onItemRestore, + dragRef, + isSearchActive, +}) => { + const { formatMessage } = useIntl(); + + return ( + + + {canUpdate && } + + {title} + + + {path} + + {icon} + + + {removed && ( + + {formatMessage(getTrad('components.navigationItem.badge.removed'))} + + )} + + + {canUpdate && ( + <> + {removed ? ( + + ) : ( + + )} + + )} + + + + ); +}; + +const IconButton = styled(BaseIconButton) <{ isActive?: boolean }>` + transition: background-color 0.3s ease-in; + ${({ isActive, theme }) => (isActive ? `background-color: ${theme.colors.neutral150} ;` : '')} +`; diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardRemovedOverlay/index.ts b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardRemovedOverlay/index.ts new file mode 100644 index 00000000..81bd8e92 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/ItemCardRemovedOverlay/index.ts @@ -0,0 +1,12 @@ +import styled from 'styled-components'; + +export const ItemCardRemovedOverlay = styled.div` + width: 100%; + height: 100%; + position: absolute; + left: 0; + right: 0; + z-index: 1; + + background: rgba(255, 255, 255, 0.75); +`; diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/Wrapper.ts b/admin/src/pages/HomePage/components/NavigationItemListItem/Wrapper.ts new file mode 100644 index 00000000..00b98b55 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/Wrapper.ts @@ -0,0 +1,44 @@ +import styled from 'styled-components'; + +const Wrapper = styled.div<{ + level?: number; + isLast?: boolean; +}>` + position: relative; + margin-top: ${({ theme }) => theme.spaces[2]}; + margin-left: ${({ level }) => level && '54px'}; + + ${({ level, theme, isLast }) => + level && + ` + &::before { + ${!isLast && 'content: "";'} + display: block; + top: ${theme.spaces[1]}; + left: -24px; + position: absolute; + height: calc(100% + ${theme.spaces[2]}); + width: 19px; + border: 0px solid transparent; + border-left: 4px solid ${theme.colors.neutral300}; + } + + &::after { + content: ""; + display: block; + height: 22px; + width: 19px; + position: absolute; + top: ${theme.spaces[1]}; + left: -${theme.spaces[6]}; + + background: transparent; + border: 4px solid ${theme.colors.neutral300}; + border-top: transparent; + border-right: transparent; + border-radius: 0 0 0 100%; + } + `}; +`; + +export default Wrapper; diff --git a/admin/src/pages/HomePage/components/NavigationItemListItem/index.tsx b/admin/src/pages/HomePage/components/NavigationItemListItem/index.tsx new file mode 100644 index 00000000..65bcad86 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemListItem/index.tsx @@ -0,0 +1,442 @@ +import { Card, CardBody, Divider, Flex, Link, TextButton, Typography } from '@strapi/design-system'; +import { ArrowRight, Cog, Earth, Link as LinkIcon, Plus } from '@strapi/icons'; +import { isEmpty, isNumber } from 'lodash'; +import { useCallback, useEffect, useRef } from 'react'; +import { DropTargetMonitor, useDrag, useDrop } from 'react-dnd'; +import { useIntl } from 'react-intl'; +import { useTheme } from 'styled-components'; + +import { NavigationItemSchema, StrapiContentTypeItemSchema } from '../../../../api/validators'; +import { getTrad } from '../../../../translations'; +import { Effect } from '../../../../types'; +import { useConfig, useContentTypeItems, useContentTypes } from '../../hooks'; +import { extractRelatedItemLabel, mapServerNavigationItem } from '../../utils'; +import { CollapseButton } from '../CollapseButton'; +import { NavigationItemFormSchema } from '../NavigationItemForm'; +import { List } from '../NavigationItemList'; +import { ItemCardBadge } from './ItemCardBadge'; +import { ItemCardHeader } from './ItemCardHeader'; +import { ItemCardRemovedOverlay } from './ItemCardRemovedOverlay'; +import Wrapper from './Wrapper'; + +export type OnItemReorderEffect = Effect<{ + item: NavigationItemFormSchema; + newOrder: number; +}>; + +export type OnItemLevelAddEffect = ( + event: MouseEvent, + viewParentId?: number, + isMenuAllowedLevel?: boolean, + levelPath?: string, + parentAttachedToMenu?: boolean, + structureId?: string, + maxOrder?: number +) => void; + +export type OnItemEditEffect = Effect<{ + item: NavigationItemFormSchema & { + isMenuAllowedLevel?: boolean; + isParentAttachedToMenu?: boolean; + }; + levelPath: string; + isParentAttachedToMenu?: boolean; +}>; + +export type OnItemRemoveEffect = Effect; + +export type OnItemRestoreEffect = Effect; + +export type OnItemCollapseEffect = Effect; + +interface Props { + isParentAttachedToMenu?: boolean; + item: NavigationItemSchema; + level?: number; + levelPath?: string; + onItemEdit: OnItemEditEffect; + onItemLevelAdd: OnItemLevelAddEffect; + onItemRemove: OnItemRemoveEffect; + onItemRestore: OnItemRestoreEffect; + onItemReOrder: OnItemReorderEffect; + onItemToggleCollapse: OnItemCollapseEffect; + displayFlat?: boolean; + permissions: { canUpdate: boolean; canAccess: boolean }; + isLast?: boolean; + displayChildren?: boolean; + structureId: string; + viewParentId?: number; + locale: string; +} + +export const Item: React.FC = ({ + item, + isLast = false, + level = 0, + levelPath = '', + isParentAttachedToMenu, + onItemLevelAdd, + onItemRemove, + onItemRestore, + onItemEdit, + onItemReOrder, + onItemToggleCollapse, + displayChildren, + permissions, + structureId, + viewParentId, + locale, +}) => { + const mappedItem = mapServerNavigationItem(item, true); + + const { formatMessage } = useIntl(); + + const configQuery = useConfig(); + + const isExternal = mappedItem.type === 'EXTERNAL'; + const isWrapper = mappedItem.type === 'WRAPPER'; + // TODO: is handled by publish flow + const isHandledByPublishFlow = true; + + const isNextMenuAllowedLevel = isNumber(configQuery.data?.allowedLevels) + ? level < configQuery.data.allowedLevels - 1 + : true; + const isMenuAllowedLevel = isNumber(configQuery.data?.allowedLevels) + ? level < configQuery.data.allowedLevels + : true; + + const hasChildren = !isEmpty(item.items) && !isExternal && !displayChildren; + const absolutePath = isExternal + ? undefined + : `${levelPath === '/' ? '' : levelPath}/${mappedItem.path === '/' ? '' : mappedItem.path}`.replace( + '//', + '/' + ); + + const contentTypeItemsQuery = useContentTypeItems({ + uid: mappedItem.type === 'INTERNAL' ? (mappedItem.relatedType ?? '') : '', + locale, + }); + + const contentTypesQuery = useContentTypes(); + + const contentType = contentTypesQuery.data?.find((_) => + mappedItem.type === 'INTERNAL' ? _.uid === mappedItem.relatedType : false + ); + + const relatedItem = contentTypeItemsQuery.data?.find((contentTypeItem) => + mappedItem.type === 'INTERNAL' ? contentTypeItem.documentId === mappedItem.related : false + ) ?? { documentId: '', id: 0 }; + + const isPublished = !!relatedItem?.publishedAt; + + const relatedItemLabel = !isExternal + ? extractRelatedItemLabel(relatedItem, configQuery.data) + : ''; + + const relatedTypeLabel = contentType?.info.displayName ?? ''; + + const relatedBadgeColor = isPublished ? 'success' : 'secondary'; + + const canUpdate = permissions.canUpdate; + + const dragRef = useRef(null); + const dropRef = useRef(null); + const previewRef = useRef(null); + + const [, drop] = useDrop({ + accept: `navigation-item_${levelPath}`, + hover( + hoveringItem: NavigationItemSchema, + monitor: DropTargetMonitor + ) { + const dragIndex = hoveringItem.order ?? 0; + const dropIndex = item.order ?? 0; + + // Don't replace items with themselves + if (dragIndex === dropIndex) { + return; + } + + const hoverBoundingRect = dropRef.current!.getBoundingClientRect(); + const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; + const clientOffset = monitor.getClientOffset(); + + if (!clientOffset) { + return; + } + + const hoverClientY = clientOffset.y - hoverBoundingRect.top; + + // Place the hovering item before or after the drop target + const isAfter = hoverClientY > hoverMiddleY; + const newOrder = isAfter ? (item.order ?? 0) + 0.5 : (item.order ?? 0) - 0.5; + + if (dragIndex < dropIndex && hoverClientY < hoverMiddleY) { + return; + } + // Dragging upwards + if (dragIndex > dropIndex && hoverClientY > hoverMiddleY) { + return; + } + + onItemReOrder({ + item: mapServerNavigationItem(hoveringItem, true), + newOrder, + }); + }, + collect: (monitor) => ({ + isOverCurrent: monitor.isOver({ shallow: true }), + }), + }); + + const [{ isDragging }, drag, dragPreview] = useDrag({ + type: `navigation-item_${levelPath}`, + item: () => item, + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + }), + }); + + const refs = { + dragRef: drag(dragRef) as any, + dropRef: drop(dropRef) as any, + previewRef: dragPreview(previewRef) as any, + }; + + const generatePreviewUrl = (entity?: StrapiContentTypeItemSchema) => { + const isSingle = contentType?.kind === 'singleType'; + const entityLocale = entity?.locale ? `?plugins[i18n][locale]=${entity?.locale}` : ''; + + return `/admin/content-manager/${isSingle ? 'single-types' : 'collection-types'}/${contentType?.uid}${!isSingle ? '/' + entity?.documentId : ''}${entityLocale}`; + }; + + const onNewItemClick = useCallback( + (event: MouseEvent) => + canUpdate && + onItemLevelAdd( + event, + mappedItem.viewId, + isNextMenuAllowedLevel, + absolutePath, + mappedItem.menuAttached, + `${structureId}.${mappedItem.items?.length ?? 0}`, + Math.max(...(mappedItem.items?.map(({ order }) => order) ?? [])) + ), + [ + mappedItem.viewId, + isNextMenuAllowedLevel, + absolutePath, + mappedItem.menuAttached, + structureId, + mappedItem.items, + canUpdate, + ] + ); + + useEffect(() => { + if (mappedItem.isSearchActive) { + refs.dropRef?.current?.scrollIntoView?.({ + behavior: 'smooth', + block: 'center', + inline: 'center', + }); + } + }, [mappedItem.isSearchActive, refs.dropRef.current]); + + const theme = useTheme(); + + return ( + + + {mappedItem.removed && } +
+ + : isWrapper ? : } + onItemRemove={() => onItemRemove({ ...item, viewParentId })} + onItemEdit={() => { + const { __type: relatedType, documentId: related } = item.related ?? {}; + + if ( + item.type !== 'EXTERNAL' && + item.type !== 'INTERNAL' && + item.type !== 'WRAPPER' + ) { + return; + } + + onItemEdit({ + item: + item.type === 'INTERNAL' + ? { + ...item, + type: 'INTERNAL', + isMenuAllowedLevel, + isParentAttachedToMenu, + isSearchActive: false, + relatedType: relatedType ?? '', + related: related ?? '', + additionalFields: item.additionalFields ?? {}, + items: item.items ?? [], + autoSync: item.autoSync ?? true, + externalPath: undefined, + viewParentId, + audience: item.audience?.map(({ documentId }) => documentId) ?? [], + } + : item.type === 'EXTERNAL' + ? { + ...item, + type: 'EXTERNAL', + isMenuAllowedLevel, + isParentAttachedToMenu, + isSearchActive: false, + relatedType: undefined, + related: undefined, + additionalFields: item.additionalFields ?? {}, + items: item.items ?? [], + autoSync: item.autoSync ?? true, + externalPath: item.externalPath ?? '', + viewParentId, + audience: item.audience?.map(({ documentId }) => documentId) ?? [], + } + : { + ...item, + type: 'WRAPPER', + isMenuAllowedLevel, + isParentAttachedToMenu, + isSearchActive: false, + additionalFields: item.additionalFields ?? {}, + items: item.items ?? [], + autoSync: item.autoSync ?? true, + viewParentId, + audience: item.audience?.map(({ documentId }) => documentId) ?? [], + }, + levelPath, + isParentAttachedToMenu, + }); + }} + onItemRestore={() => onItemRestore({ ...item, viewParentId })} + dragRef={refs.dragRef} + removed={mappedItem.removed} + canUpdate={canUpdate} + isSearchActive={mappedItem.isSearchActive} + /> + + + {!isExternal && ( + + + + {!isEmpty(item.items) && ( + onItemToggleCollapse({ ...item, viewParentId })} + collapsed={mappedItem.collapsed} + itemsCount={item.items?.length ?? 0} + /> + )} + {canUpdate && isNextMenuAllowedLevel && ( + } + onClick={onNewItemClick} + > + + {formatMessage(getTrad('components.navigationItem.action.newItem'))} + + + )} + + {mappedItem.type === 'INTERNAL' && mappedItem.related && !relatedItem.id ? ( + + + {relatedTypeLabel} /  + + + {formatMessage(getTrad('components.navigationItem.related.localeMissing'))} + + + ) : null} + {relatedItemLabel && ( + + {isHandledByPublishFlow && ( + + {formatMessage( + getTrad( + `components.navigationItem.badge.${isPublished ? 'published' : 'draft'}` + ) + )} + + )} + + {relatedTypeLabel} /  + + + {relatedItemLabel} + + } + > +   + + + )} + + + )} +
+
+ {hasChildren && !mappedItem.removed && !mappedItem.collapsed && ( + + )} +
+ ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupFooter.tsx b/admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupFooter.tsx new file mode 100644 index 00000000..2548093f --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupFooter.tsx @@ -0,0 +1,41 @@ +import { FC } from 'react'; + +import { Button, Modal } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../translations'; +import { Effect } from '../../../../types'; + +interface Props { + handleCancel: Effect; + handleSubmit?: Effect; + submitDisabled?: boolean; + canUpdate?: boolean; +} + +export const NavigationItemPopupFooter: FC = ({ + handleCancel, + handleSubmit, + submitDisabled, + canUpdate, +}) => { + const { formatMessage } = useIntl(); + + if (!canUpdate) { + return null; + } + + return ( + + + + + + + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupHeader.tsx b/admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupHeader.tsx new file mode 100644 index 00000000..4f1ae413 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemPopup/NavigationItemPopupHeader.tsx @@ -0,0 +1,34 @@ +import { Modal, Typography } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../translations'; + +export const NavigationItemPopupHeader = ({ + isNewItem, + canUpdate, +}: { + isNewItem?: boolean; + canUpdate?: boolean; +}) => { + const { formatMessage } = useIntl(); + + let modalType = 'view'; + + if (canUpdate) { + modalType = isNewItem ? 'new' : 'edit'; + } + + return ( + + + {formatMessage(getTrad(`popup.item.header.${modalType}`))} + + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationItemPopup/index.tsx b/admin/src/pages/HomePage/components/NavigationItemPopup/index.tsx new file mode 100644 index 00000000..2703f654 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationItemPopup/index.tsx @@ -0,0 +1,91 @@ +import { Modal } from '@strapi/design-system'; +import { FC } from 'react'; +import { useIntl } from 'react-intl'; + +import { NavigationSchema, StrapiContentTypeItemSchema } from '../../../../api/validators'; +import { getTrad } from '../../../../translations'; +import { Effect } from '../../../../types'; +import { isRelationPublished } from '../../utils'; +import { NavigationItemForm, NavigationItemFormSchema, SubmitEffect } from '../NavigationItemForm'; +import { NavigationItemPopupHeader } from './NavigationItemPopupHeader'; + +interface Props { + currentItem?: Partial; + isOpen: boolean; + isLoading: boolean; + onSubmit: SubmitEffect; + onClose: Effect; + availableLocale: Array; + locale: string; + permissions?: { canUpdate?: boolean }; + currentNavigation: Pick; +} + +const NavigationItemPopUp: FC = ({ + availableLocale, + isOpen, + isLoading, + currentItem = {}, + onSubmit, + onClose, + locale, + permissions, + currentNavigation, +}) => { + const { formatMessage } = useIntl(); + + const handleOnSubmit = (payload: NavigationItemFormSchema) => { + onSubmit(payload); + }; + + const appendLabelPublicationStatus = ( + label: string, + item: StrapiContentTypeItemSchema, + isCollection: boolean + ) => { + const appendix = isRelationPublished({ + relatedRef: item, + type: item.isSingle ? 'INTERNAL' : item.type, + isCollection, + }) + ? '' + : `[${formatMessage(getTrad('notification.navigation.item.relation.status.draft'))}] `.toUpperCase(); + + return `${appendix}${label}`; + }; + + const hasViewId = !!currentItem.viewId; + + return ( + { + if (!isOpen) { + onClose({ + preventDefault() {}, + stopPropagation() {}, + target: {}, + }); + } + }} + open={isOpen} + > + + + + + + ); +}; + +export default NavigationItemPopUp; diff --git a/admin/src/pages/View/components/NavigationManager/AllNavigations/icons.tsx b/admin/src/pages/HomePage/components/NavigationManager/AllNavigations/icons.tsx similarity index 50% rename from admin/src/pages/View/components/NavigationManager/AllNavigations/icons.tsx rename to admin/src/pages/HomePage/components/NavigationManager/AllNavigations/icons.tsx index f648e843..44c0e2dd 100644 --- a/admin/src/pages/View/components/NavigationManager/AllNavigations/icons.tsx +++ b/admin/src/pages/HomePage/components/NavigationManager/AllNavigations/icons.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { Pencil, Trash, Brush } from "@strapi/icons"; +import { Pencil, Trash, Feather } from "@strapi/icons"; export const edit = ; export const deleteIcon = ; -export const brushIcon = ; +export const featherIcon = ; diff --git a/admin/src/pages/HomePage/components/NavigationManager/AllNavigations/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/AllNavigations/index.tsx new file mode 100644 index 00000000..6314653d --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/AllNavigations/index.tsx @@ -0,0 +1,264 @@ +import { + Box, + Button, + Checkbox, + Flex, + Grid, + IconButton, + Table, + Tbody, + Td, + Th, + Thead, + Tr, + Typography, +} from '@strapi/design-system'; +import { prop } from 'lodash/fp'; +import { useCallback, useMemo } from 'react'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../../translations'; +import { useConfig, useLocale } from '../../../hooks'; +import { Footer, FooterBase } from '../Footer'; +import { INITIAL_NAVIGATION } from '../NewNavigation'; +import { CommonProps, ListState, Navigation } from '../types'; +import * as icons from './icons'; + +interface Props extends ListState, CommonProps {} + +export const AllNavigations = ({ navigations, selected, setState }: Props) => { + const configQuery = useConfig(); + + const hasAnySelected = !!selected.length; + + const { formatMessage } = useIntl(); + + const localeQuery = useLocale(); + + const toggleSelected = useCallback( + () => + setState({ + navigations, + selected: hasAnySelected ? [] : navigations.map((n) => n), + view: 'LIST', + }), + [setState, navigations, hasAnySelected] + ); + + const currentlySelectedSet = useMemo(() => new Set(selected.map(prop('documentId'))), [selected]); + + const handleSelect = (navigation: Navigation, isSelected: boolean) => () => { + setState({ + navigations, + selected: isSelected + ? selected.filter(({ documentId }) => documentId !== navigation.documentId) + : selected.concat([navigation]), + view: 'LIST', + }); + }; + + const edit = (navigation: Navigation) => () => { + setState({ + view: 'EDIT', + current: navigation, + navigation, + alreadyUsedNames: navigations.reduce( + (acc, { name }) => (name !== navigation.name ? acc.concat([name]) : acc), + [] + ), + }); + }; + + const _delete = (navigations: Array) => () => { + setState({ + view: 'DELETE', + navigations, + }); + }; + + const purgeCache = (navigations: Array) => () => { + setState({ + view: 'CACHE_PURGE', + navigations, + }); + }; + + const deleteSelected = useCallback(_delete(selected), [_delete]); + + const purgeSelected = useCallback(purgeCache(selected), [purgeCache]); + + const getLocalizations = (focused: Navigation) => + [focused].concat( + navigations.filter( + (navigation) => + navigation.documentId === focused.documentId && + navigation.locale !== focused.locale + ) + ); + + return ( + <> + + + {hasAnySelected ? ( + + + {formatMessage(getTrad('popup.navigation.manage.table.hasSelected'), { + count: selected.length, + })} + + + {configQuery.data?.isCacheEnabled ? ( + + ) : null} + + ) : null} + + + + + + + + + + + + + + + {navigations + .filter(({ locale }) => locale === localeQuery.data?.defaultLocale) + .map((navigation) => ( + + + + + + + + + ))} + +
+ + + + {formatMessage(getTrad('popup.navigation.manage.table.id'))} + + + + {formatMessage(getTrad('popup.navigation.manage.table.name'))} + + + + {formatMessage(getTrad('popup.navigation.manage.table.locale'))} + + + + {formatMessage(getTrad('popup.navigation.manage.table.visibility'))} + + + {configQuery.data?.isCacheEnabled ? ( + + + + + + ) : null} +
+ + + {navigation.documentId} + + {navigation.name} + + + {getLocalizations(navigation).map(prop('locale')).join(', ')} + + + + {navigation.visible + ? formatMessage(getTrad('popup.navigation.manage.navigation.visible')) + : formatMessage(getTrad('popup.navigation.manage.navigation.hidden'))} + + + + + + + + + + {configQuery.data?.isCacheEnabled ? ( + + + + ) : null} + +
+ + ); +}; + +export const AllNavigationsFooter: Footer = ({ + onClose, + state, + setState, + navigations, + isLoading, +}) => { + const { formatMessage } = useIntl(); + + return ( + + setState({ + view: 'CREATE', + alreadyUsedNames: navigations.map(({ name }) => name), + current: INITIAL_NAVIGATION, + }), + variant: 'default', + disabled: isLoading, + children: formatMessage(getTrad('popup.navigation.manage.button.create')), + }} + /> + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationManager/DeletionConfirm/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/DeletionConfirm/index.tsx new file mode 100644 index 00000000..ccac3278 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/DeletionConfirm/index.tsx @@ -0,0 +1,53 @@ +import { Flex, Grid, Typography } from '@strapi/design-system'; +import { prop } from 'lodash/fp'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../../translations'; +import { Footer, FooterBase } from '../Footer'; +import { CommonProps, DeleteState, Navigation } from '../types'; + +interface Props extends DeleteState, CommonProps {} + +export const DeletionConfirm = ({ navigations }: Props) => { + const { formatMessage } = useIntl(); + + return ( + + + + + {formatMessage(getTrad('popup.navigation.manage.delete.header'))} + + + + + + {renderItems(navigations)} + + + + ); +}; + +export const DeleteConfirmFooter: Footer = ({ state, onSubmit, onReset, isLoading }) => { + const { formatMessage } = useIntl(); + + return ( + + ); +}; + +const renderItems = (navigations: Array) => navigations.map(prop('name')).join(', '); diff --git a/admin/src/pages/HomePage/components/NavigationManager/ErrorDetails/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/ErrorDetails/index.tsx new file mode 100644 index 00000000..39ae9359 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/ErrorDetails/index.tsx @@ -0,0 +1,48 @@ +import { Grid } from '@strapi/design-system'; +import { useNotification } from '@strapi/strapi/admin'; +import { useEffect } from 'react'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../../translations'; +import { Footer, FooterBase } from '../Footer'; +import { CommonProps, ErrorState } from '../types'; + +interface Props extends ErrorState, CommonProps {} + +export const ErrorDetails = ({ errors }: Props) => { + const { formatMessage } = useIntl(); + + const { toggleNotification } = useNotification(); + + useEffect(() => { + errors.map((error) => { + toggleNotification({ + type: 'warning', + message: formatMessage({ id: '', defaultMessage: error.message }), + }); + console.error(error); + }); + }, []); + + return ( + + + {formatMessage(getTrad('popup.navigation.manage.error.message'))} + + + ); +}; + +export const ErrorDetailsFooter: Footer = ({ onReset }) => { + const { formatMessage } = useIntl(); + + return ( + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationManager/Footer/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/Footer/index.tsx new file mode 100644 index 00000000..e3b51085 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/Footer/index.tsx @@ -0,0 +1,44 @@ +import { Button, Modal } from '@strapi/design-system'; + +import { NavigationSchema } from '../../../../../api/validators'; +import { VoidEffect } from '../../../../../types'; +import { SetState, State } from '../types'; + +interface FooterBaseProps { + end?: ActionProps; + start?: ActionProps; +} + +export type Footer = React.FC<{ + navigations: Array; + onClose?: VoidEffect; + onReset: VoidEffect; + onSubmit: VoidEffect; + setState: SetState; + state: State; + disabled?: boolean; + isLoading: boolean; +}>; + +interface ActionProps { + children: React.ReactNode; + disabled?: boolean; + onClick?: VoidEffect; + variant: 'danger' | 'secondary' | 'tertiary' | 'default'; +} + +export const FooterBase: React.FC = ({ start, end }) => { + return ( + + {renderActions(start)} + {renderActions(end)} + + ); +}; + +const renderActions = (actions: ActionProps | undefined): React.ReactNode => + actions ? ( + + ) : null; diff --git a/admin/src/pages/HomePage/components/NavigationManager/Form/hooks.ts b/admin/src/pages/HomePage/components/NavigationManager/Form/hooks.ts new file mode 100644 index 00000000..52c4af44 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/Form/hooks.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; + +export const formSchema = ({ alreadyUsedNames }: { alreadyUsedNames: string[] }) => + z.object({ + name: z + .string() + .min(2) // TODO: add translation + .and(z.string().refine((name) => !alreadyUsedNames.includes(name), 'Name already used')), // TODO: add translation + visible: z.boolean(), + }); diff --git a/admin/src/pages/HomePage/components/NavigationManager/Form/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/Form/index.tsx new file mode 100644 index 00000000..742961d4 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/Form/index.tsx @@ -0,0 +1,157 @@ +import { Grid, TextInput, Toggle } from '@strapi/design-system'; +import { Form as StrapiForm } from '@strapi/strapi/admin'; +import { get, isEmpty, isNil, isObject, isString, set } from 'lodash'; +import { useEffect, useState } from 'react'; +import { useIntl } from 'react-intl'; +import { Field } from '@sensinum/strapi-utils'; + +import { getTrad } from '../../../../../translations'; +import { Effect, FormChangeEvent, FormItemErrorSchema } from '../../../../../types'; +import { Navigation } from '../types'; +import { formSchema } from './hooks'; + +interface Props> { + navigation: T; + onChange: Effect; + isLoading?: boolean; + alreadyUsedNames?: Array; +} + +export const Form = >({ + navigation, + onChange, + alreadyUsedNames = [], + isLoading, +}: Props) => { + const [formValue, setFormValue] = useState({} as T); + const [formError, setFormError] = useState>(); + + const { formatMessage } = useIntl(); + + const { + name, + visible, + } = formValue; + + const handleChange = (eventOrPath: FormChangeEvent, value?: any, nativeOnChange?: (eventOrPath: FormChangeEvent, value?: any) => void) => { + if (nativeOnChange) { + + let fieldName = eventOrPath; + let fieldValue = value; + + if (isObject(eventOrPath)) { + const { name: targetName, value: targetValue } = eventOrPath.target; + fieldName = targetName; + fieldValue = isNil(fieldValue) ? targetValue : fieldValue; + } + + if (isString(fieldName)) { + setFormValueItem(fieldName, fieldValue); + } + + return nativeOnChange(eventOrPath as FormChangeEvent, fieldValue); + } + }; + + const setFormValueItem = (path: string, value: any) => { + setFormValue(set({ + ...formValue, + }, path, value)); + }; + + const renderError = (error: string): string | undefined => { + const errorOccurence = get(formError, error); + if (errorOccurence) { + return errorOccurence; + } + return undefined; + }; + + useEffect(() => { + if (navigation) { + if (navigation.name) { + setFormValue({ + ...navigation + } as T); + } else { + setFormValue({ + name: 'New navigation', + visible: true, + } as T); + + onChange({ + name: 'New navigation', + visible: true, + disabled: true, + } as unknown as T); + } + } + }, []); + + useEffect(() => { + if ((`${name}-${visible}` !== `${navigation.name}-${navigation.visible}`)) { + const { error } = formSchema({ alreadyUsedNames }).safeParse(formValue); + + onChange({ + ...navigation, + name, + visible, + disabled: !isEmpty(error?.issues), + }); + if (error) { + setFormError(error.issues.reduce((acc, err) => { + return { + ...acc, + [err.path.join('.')]: err.message + } + }, {} as FormItemErrorSchema)); + } else { + setFormError(undefined); + } + } + }, [name, visible]); + + return ( + {({ values, onChange }) => { + return ( + + + handleChange(eventOrPath, value, onChange)} + value={values.name} + disabled={isLoading} + /> + + + + + handleChange(eventOrPath, !values.visible, onChange)} + onLabel={formatMessage(getTrad('popup.navigation.form.visible.toggle.visible'))} + offLabel={formatMessage(getTrad('popup.navigation.form.visible.toggle.hidden'))} + disabled={isLoading} + width="100%" + /> + + + ); + }} + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationManager/NavigationUpdate/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/NavigationUpdate/index.tsx new file mode 100644 index 00000000..ee7286de --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/NavigationUpdate/index.tsx @@ -0,0 +1,63 @@ +import { useCallback, useMemo } from 'react'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../../translations'; +import { Effect } from '../../../../../types'; +import { Footer, FooterBase } from '../Footer'; +import { Form } from '../Form'; +import { CommonProps, EditState, Navigation } from '../types'; + +interface Props extends EditState, CommonProps {} + +export const NavigationUpdate = ({ + alreadyUsedNames, + current, + isLoading, + navigation: initialValue, + setState, +}: Props) => { + const navigation: Navigation = useMemo(() => current ?? initialValue, [current]); + + const onChange: Effect = useCallback( + ({disabled, ...updated}: Navigation & { disabled?: boolean }) => { + setState({ + view: 'EDIT', + alreadyUsedNames, + current: updated, + disabled, + navigation: initialValue, + }); + }, + [setState, initialValue, alreadyUsedNames] + ); + + return ( + + navigation={navigation} + onChange={onChange} + isLoading={isLoading} + alreadyUsedNames={alreadyUsedNames} + /> + ); +}; + +export const NavigationUpdateFooter: Footer = ({ onSubmit, onReset, disabled, isLoading }) => { + const { formatMessage } = useIntl(); + + return ( + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationManager/NewNavigation/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/NewNavigation/index.tsx new file mode 100644 index 00000000..0e63ceed --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/NewNavigation/index.tsx @@ -0,0 +1,59 @@ +import { useCallback } from 'react'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../../translations'; +import { Footer, FooterBase } from '../Footer'; +import { Form } from '../Form'; +import { CommonProps, CreateState, Navigation, NewNavigation as NewNavigationType } from '../types'; + +interface Props extends CreateState, CommonProps {} + +export const INITIAL_NAVIGATION = { + name: '', + items: [], + visible: false, +} as unknown as Navigation; + +export const NewNavigation = ({ setState, current, isLoading, alreadyUsedNames }: Props) => { + const onSubmit = useCallback( + ({disabled, ...updated}: NewNavigationType & { disabled?: boolean }) => { + setState({ + view: 'CREATE', + current: updated, + alreadyUsedNames, + disabled, + }); + }, + [setState] + ); + + return ( + + alreadyUsedNames={alreadyUsedNames} + navigation={current} + onChange={onSubmit} + isLoading={isLoading} + /> + ); +}; + +export const NewNavigationFooter: Footer = ({ onSubmit, onReset, disabled, isLoading }) => { + const { formatMessage } = useIntl(); + + return ( + + ); +}; diff --git a/admin/src/pages/HomePage/components/NavigationManager/PurgeCacheConfirm/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/PurgeCacheConfirm/index.tsx new file mode 100644 index 00000000..eaa03b8e --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/PurgeCacheConfirm/index.tsx @@ -0,0 +1,53 @@ +import { Flex, Grid, Typography } from '@strapi/design-system'; +import { prop } from 'lodash/fp'; +import { useIntl } from 'react-intl'; +import { getTrad } from '../../../../../translations'; + +import { Footer, FooterBase } from '../Footer'; +import { CommonProps, Navigation, PurgeCacheState } from '../types'; + +interface Props extends PurgeCacheState, CommonProps {} + +export const PurgeCacheConfirm = ({ navigations }: Props) => { + const { formatMessage } = useIntl(); + + return ( + + + + + {formatMessage(getTrad('popup.navigation.manage.purge.header'))} + + + + + + {renderItems(navigations)} + + + + ); +}; + +export const PurgeCacheConfirmFooter: Footer = ({ onSubmit, onReset, isLoading }) => { + const { formatMessage } = useIntl(); + + return ( + + ); +}; + +const renderItems = (navigations: Array) => navigations.map(prop('name')).join(', '); diff --git a/admin/src/pages/HomePage/components/NavigationManager/index.tsx b/admin/src/pages/HomePage/components/NavigationManager/index.tsx new file mode 100644 index 00000000..c23fb9c2 --- /dev/null +++ b/admin/src/pages/HomePage/components/NavigationManager/index.tsx @@ -0,0 +1,323 @@ +import { Flex, Loader, Modal } from '@strapi/design-system'; +import { useNotification } from '@strapi/strapi/admin'; +import { sortBy } from 'lodash'; +import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useIntl } from 'react-intl'; +import { getTrad } from '../../../../translations'; +import { VoidEffect } from '../../../../types'; +import { + useCreateNavigation, + useDeleteNavigations, + useHardReset, + useLocale, + useNavigations, + usePurgeNavigation, + useUpdateNavigation, +} from '../../hooks'; +import { getPendingAction } from '../../utils'; +import { AllNavigations, AllNavigationsFooter } from './AllNavigations'; +import { DeleteConfirmFooter, DeletionConfirm } from './DeletionConfirm'; +import { ErrorDetails, ErrorDetailsFooter } from './ErrorDetails'; +import { Footer } from './Footer'; +import { NavigationUpdate, NavigationUpdateFooter } from './NavigationUpdate'; +import { NewNavigation, NewNavigationFooter } from './NewNavigation'; +import { PurgeCacheConfirm, PurgeCacheConfirmFooter } from './PurgeCacheConfirm'; +import { SetState, State } from './types'; +import { Typography } from '@strapi/design-system'; + +interface Props { + initialState: State; + isOpened?: boolean; + onClose?: VoidEffect; +} + +export const NavigationManager = ({ initialState, isOpened, onClose }: Props) => { + const { formatMessage } = useIntl(); + const [state, setState] = useState(initialState); + + const { toggleNotification } = useNotification(); + + const hardReset = useHardReset(); + + const deleteNavigationsMutation = useDeleteNavigations(); + + const createNavigationMutation = useCreateNavigation(); + + const updateNavigationMutation = useUpdateNavigation(); + + const purgeNavigationsMutation = usePurgeNavigation(); + + const navigationsQuery = useNavigations(); + + const localeQuery = useLocale(); + + const navigations = useMemo( + () => sortBy(navigationsQuery.data ?? [], 'id'), + [navigationsQuery.data] + ); + + const pending = getPendingAction([ + deleteNavigationsMutation, + navigationsQuery, + createNavigationMutation, + updateNavigationMutation, + purgeNavigationsMutation, + localeQuery, + ]); + + const onReset = useCallback(() => setState({ view: 'INITIAL' }), [setState]); + + const onSubmit = useCallback(async () => { + const performAction = + state.view === 'DELETE' + ? () => { + deleteNavigationsMutation.mutate( + state.navigations.reduce((acc, navigation) => { + if (navigation.documentId) { + acc.push(navigation.documentId); + } + + return acc; + }, []), + { + onSuccess: hardReset, + } + ); + } + : state.view === 'EDIT' + ? () => { + updateNavigationMutation.mutate(state.current, { + onSuccess() { + hardReset(); + toggleNotification({ + type: 'success', + message: formatMessage(getTrad('notification.navigation.submit')), + }); + }, + onError(error) { + // TODO: handle errors + console.warn(error); + + toggleNotification({ + type: 'warning', + message: formatMessage(getTrad('notification.navigation.error'), { + errorTitles: '', + }), + }); + }, + }); + } + : state.view === 'CREATE' && state.current + ? () => { + createNavigationMutation.mutate(state.current, { + onSuccess() { + hardReset(); + toggleNotification({ + type: 'success', + message: formatMessage(getTrad('notification.navigation.submit')), + }); + }, + onError(error) { + // TODO: handle errors + console.warn(error); + + toggleNotification({ + type: 'warning', + message: formatMessage(getTrad('notification.navigation.error'), { + errorTitles: '', + }), + }); + }, + }); + } + : state.view === 'CACHE_PURGE' + ? () => { + purgeNavigationsMutation.mutate( + state.navigations.reduce((acc, navigation) => { + if (navigation.documentId) { + acc.push(navigation.documentId); + } + + return acc; + }, []), + { + onSuccess: hardReset, + } + ); + } + : () => { }; + + try { + performAction(); + setState({ view: 'INITIAL' }); + } catch (error) { + setState({ + view: 'ERROR', + errors: error instanceof Error ? [error] : [], + }); + } + }, [ + state, + setState, + hardReset, + createNavigationMutation, + purgeNavigationsMutation, + updateNavigationMutation, + deleteNavigationsMutation, + toggleNotification, + formatMessage, + getTrad, + ]); + + useEffect(() => { + if (state.view === 'INITIAL' || state.view === 'LIST') { + setState({ + view: 'LIST', + navigations, + selected: [], + }); + } + }, [state.view, navigations]); + + const header = renderHeader(state, formatMessage, !!pending); + const content = renderContent(state, setState, !!pending); + const footer = renderFooter({ + state, + setState, + onClose, + onSubmit, + onReset, + navigations, + isLoading: !!pending, + }); + + return ( + { + if (!isOpen) { + onClose?.(); + } + }} + open={isOpened} + > + + + + {header} + + + {content} + {footer} + + + ); +}; + +const renderHeader = ( + state: State, + formatMessage: ReturnType['formatMessage'], + isLoading: boolean +) => { + switch (state.view) { + case 'LIST': + case 'CREATE': + case 'ERROR': + case 'CACHE_PURGE': + case 'DELETE': { + return ( + + {isLoading ? : null} + {formatMessage(getTrad(`popup.navigation.manage.header.${state.view}`))} + + ); + } + case 'EDIT': { + return ( + + {isLoading ? : null} + + {formatMessage(getTrad('popup.navigation.manage.header.EDIT'), { + name: state.navigation.name, + })} + + ); + } + case 'INITIAL': { + return null; + } + default: + return handleUnknownState(state); + } +}; + +const renderContent = (state: State, setState: SetState, isLoading: boolean) => { + const commonProps = { + setState, + isLoading, + }; + + switch (state.view) { + case 'LIST': { + return ; + } + case 'EDIT': { + return ; + } + case 'CREATE': { + return ; + } + case 'DELETE': { + return ; + } + case 'CACHE_PURGE': { + return ; + } + case 'INITIAL': { + return ; + } + case 'ERROR': { + return ; + } + default: + return handleUnknownState(state); + } +}; + +const renderFooter: Footer = (props) => { + switch (props.state.view) { + case 'LIST': { + return ; + } + case 'CREATE': { + return ; + } + case 'EDIT': { + return ; + } + case 'DELETE': { + return ; + } + case 'CACHE_PURGE': { + return ; + } + case 'ERROR': { + return ; + } + case 'INITIAL': { + return null; + } + default: + return handleUnknownState(props.state); + } +}; + +const handleUnknownState = (state: undefined | { view: string }) => { + console.warn(`Unknown state "${state?.view}". (${JSON.stringify(state)})`); + + return null; +}; diff --git a/admin/src/pages/View/components/NavigationManager/types.ts b/admin/src/pages/HomePage/components/NavigationManager/types.ts similarity index 63% rename from admin/src/pages/View/components/NavigationManager/types.ts rename to admin/src/pages/HomePage/components/NavigationManager/types.ts index ac5ca4e5..0a383cd0 100644 --- a/admin/src/pages/View/components/NavigationManager/types.ts +++ b/admin/src/pages/HomePage/components/NavigationManager/types.ts @@ -1,11 +1,14 @@ -import { Dispatch, SetStateAction } from "react"; -import { Navigation as FullNavigationEntity } from "../../../../../../types"; +import { Dispatch, SetStateAction } from 'react'; + +import { NavigationSchema } from '../../../../api/validators'; export type Navigation = Pick< - FullNavigationEntity, - "id" | "items" | "name" | "localeCode" | "localizations" | "visible" + NavigationSchema, + 'id' | 'items' | 'name' | 'locale' | 'visible' | 'documentId' | 'slug' >; +export type NewNavigation = Omit; + export type State = | InitialState | ListState @@ -17,48 +20,49 @@ export type State = export type SetState = Dispatch>; -interface CommonState { - isLoading?: boolean; -} +interface CommonState {} export interface CommonProps { setState: SetState; + isLoading: boolean; } export interface InitialState extends CommonState { - view: "INITIAL"; + view: 'INITIAL'; } export interface ListState extends CommonState { - view: "LIST"; + view: 'LIST'; navigations: Array; selected: Array; } export interface EditState extends CommonState { - view: "EDIT"; + view: 'EDIT'; navigation: Navigation; - current?: Navigation; + current: Navigation; + disabled?: boolean; alreadyUsedNames: Array; } export interface CreateState extends CommonState { - view: "CREATE"; - current: Navigation; + view: 'CREATE'; + current: NewNavigation; + disabled?: boolean; alreadyUsedNames: Array; } export interface DeleteState extends CommonState { - view: "DELETE"; + view: 'DELETE'; navigations: Array; } export interface PurgeCacheState extends CommonState { - view: "CACHE_PURGE"; + view: 'CACHE_PURGE'; navigations: Array; } export interface ErrorState extends CommonState { - view: "ERROR"; + view: 'ERROR'; errors: Array; } diff --git a/admin/src/components/Search/index.tsx b/admin/src/pages/HomePage/components/Search/index.tsx similarity index 58% rename from admin/src/components/Search/index.tsx rename to admin/src/pages/HomePage/components/Search/index.tsx index d5168856..d941c849 100644 --- a/admin/src/components/Search/index.tsx +++ b/admin/src/pages/HomePage/components/Search/index.tsx @@ -1,21 +1,10 @@ -import React, { - useRef, - useState, - useEffect, - useCallback, - ChangeEvent, -} from "react"; -import { useIntl } from "react-intl"; -// @ts-ignore -import { IconButton } from "@strapi/design-system/IconButton"; -// @ts-ignore -import { Searchbar } from "@strapi/design-system/Searchbar"; -// @ts-ignore -import { Typography } from "@strapi/design-system/Typography"; -// @ts-ignore -import SearchIcon from "@strapi/icons/Search"; -import { getTradId } from "../../translations"; -import { Effect } from "../../../../types"; +import { IconButton, Searchbar, Typography } from '@strapi/design-system'; +import { Search as SearchIcon } from '@strapi/icons'; +import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react'; +import { useIntl } from 'react-intl'; + +import { getTrad } from '../../../../translations'; +import { Effect } from '../../../../types'; interface Props { value: string; @@ -25,7 +14,7 @@ interface Props { const DEFAULT_INDEX = 0; -const Search = ({ value, setValue, initialIndex = DEFAULT_INDEX }: Props) => { +export const Search = ({ value, setValue, initialIndex = DEFAULT_INDEX }: Props) => { const [currentValue, setCurrentValue] = useState(value); const [previousValue, setPreviousValue] = useState(value); const [currentIndex, setCurrentIndex] = useState(initialIndex); @@ -36,7 +25,7 @@ const Search = ({ value, setValue, initialIndex = DEFAULT_INDEX }: Props) => { useEffect(() => { if (isOpen) { setTimeout(() => { - wrapperRef.current?.querySelector("input")?.focus(); + wrapperRef.current?.querySelector('input')?.focus(); }, 0); } }, [isOpen]); @@ -62,7 +51,7 @@ const Search = ({ value, setValue, initialIndex = DEFAULT_INDEX }: Props) => { }, [currentValue, previousValue]); const onKeyDown = useCallback((e: KeyboardEvent) => { - if (e.code.toLowerCase() === "enter") { + if (e.code.toLowerCase() === 'enter') { setCurrentIndex((current) => current + 1); } }, []); @@ -73,7 +62,7 @@ const Search = ({ value, setValue, initialIndex = DEFAULT_INDEX }: Props) => { [setCurrentValue] ); const onClear = useCallback(() => { - setCurrentValue(""); + setCurrentValue(''); setIsOpen(false); }, [setCurrentValue, setIsOpen]); @@ -87,27 +76,25 @@ const Search = ({ value, setValue, initialIndex = DEFAULT_INDEX }: Props) => { size="S" onChange={onChange} clearLabel="Clearing the search" - placeholder={formatMessage({ - id: getTradId("pages.main.search.placeholder"), - defaultMessage: "Type to start searching...", - })} + placeholder={formatMessage( + getTrad('pages.main.search.placeholder', 'Type to start searching...') + )} onKeyDown={onKeyDown} > Search for navigation items - - {formatMessage({ - id: getTradId("pages.main.search.subLabel"), - defaultMessage: "press ENTER to highlight next item", - })} + + {formatMessage( + getTrad('pages.main.search.subLabel', 'press ENTER to highlight next item') + )}
); } else { - return ( - } onClick={() => setIsOpen(!isOpen)} /> - ); + return } onClick={() => setIsOpen(!isOpen)} />; } }; - -export default Search; diff --git a/admin/src/pages/HomePage/components/index.ts b/admin/src/pages/HomePage/components/index.ts new file mode 100644 index 00000000..e5022e8b --- /dev/null +++ b/admin/src/pages/HomePage/components/index.ts @@ -0,0 +1 @@ +export * from './NavigationHeader'; diff --git a/admin/src/pages/HomePage/hooks/index.tsx b/admin/src/pages/HomePage/hooks/index.tsx new file mode 100644 index 00000000..97e5795f --- /dev/null +++ b/admin/src/pages/HomePage/hooks/index.tsx @@ -0,0 +1,216 @@ +import { getFetchClient } from '@strapi/strapi/admin'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { useCallback, useMemo, useState } from 'react'; + +import { getApiClient } from '../../../api'; +import { NavigationItemSchema, NavigationSchema } from '../../../api/validators'; +import { Effect } from '../../../types'; +import { ConfirmEffect, I18nCopyNavigationItemsModal } from '../components/I18nCopyNavigationItems'; + +export const useLocale = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readLocaleIndex(), + queryFn: apiClient.readLocale, + staleTime: Infinity, + }); +}; + +export interface UseContentTypeItemsInput { + uid: string; + locale?: string; + query?: string; +} + +export const useContentTypeItems = (input: UseContentTypeItemsInput) => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readContentTypeItemsIndex(input), + queryFn: () => apiClient.readContentTypeItems(input), + staleTime: 1000 * 60 * 3, + enabled: !!input.uid, + }); +}; + +export const useContentTypes = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readContentTypeIndex(), + queryFn: () => apiClient.readContentType(), + staleTime: 1000 * 60 * 3, + }); +}; + +export const useNavigations = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readAllIndex(), + queryFn() { + return apiClient.readAll().then((navigations) => + navigations.map( + (navigation): NavigationSchema => ({ + ...navigation, + items: navigation.items.map(appendViewId), + }) + ) + ); + }, + staleTime: 1000 * 60 * 5, + }); +}; + +export const useHardReset = () => { + const client = useQueryClient(); + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useCallback(() => { + client.invalidateQueries({ + queryKey: apiClient.getIndexPrefix(), + }); + }, [client, fetch, apiClient]); +}; + +export const useDeleteNavigations = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useMutation({ + mutationFn(documentIds: Array) { + return Promise.all(documentIds.map(apiClient.delete)); + }, + }); +}; + +export const useCopyNavigationItemI18n = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useMutation({ + mutationFn: apiClient.copyNavigationItemLocale, + }); +}; + +export const useCopyNavigationI18n = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + // TODO: nicer cache update + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: apiClient.copyNavigationLocale, + onSuccess() { + queryClient.invalidateQueries({ + queryKey: apiClient.readAllIndex(), + }); + }, + }); +}; + +export const useCreateNavigation = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + // TODO: nicer cache update + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: apiClient.create, + onSuccess() { + queryClient.invalidateQueries({ + queryKey: apiClient.readAllIndex(), + }); + }, + }); +}; + +export const useUpdateNavigation = (onSuccess?: Effect) => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + // TODO: nicer cache update + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: apiClient.update, + onSuccess() { + queryClient.invalidateQueries({ + queryKey: apiClient.readAllIndex(), + }); + onSuccess?.(); + }, + }); +}; + +export const usePurgeNavigation = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useMutation({ + mutationFn(documentIds?: Array): Promise { + if (!documentIds?.length) { + return apiClient.purge({}); + } + + return Promise.all(documentIds.map((documentId) => apiClient.purge({ documentId, withLangVersions: true }))); + }, + }); +}; + +export const useConfig = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readConfigIndex(), + queryFn: apiClient.readConfig, + }); +}; + +export const useI18nCopyNavigationItemsModal = (onConfirm: ConfirmEffect) => { + const [isOpened, setIsOpened] = useState(false); + const [sourceLocale, setSourceLocale] = useState(undefined); + const onCancel = useCallback(() => { + setIsOpened(false); + }, [setIsOpened]); + const onConfirmWithModalClose = useCallback(() => { + if (!sourceLocale) { + return; + } + + onConfirm(sourceLocale); + setIsOpened(false); + }, [onConfirm, sourceLocale]); + + const modal = useMemo( + () => + isOpened ? ( + + ) : null, + [isOpened, onConfirmWithModalClose, onCancel] + ); + + return useMemo( + () => ({ + setI18nCopyModalOpened: setIsOpened, + setI18nCopySourceLocale: setSourceLocale, + i18nCopyItemsModal: modal, + i18nCopySourceLocale: sourceLocale, + }), + [setSourceLocale, setIsOpened, modal, sourceLocale] + ); +}; + +const appendViewId = (item: NavigationItemSchema): NavigationItemSchema => { + return { + ...item, + viewId: Math.floor(Math.random() * 1520000), + items: item.items?.map(appendViewId), + }; +}; diff --git a/admin/src/pages/HomePage/index.tsx b/admin/src/pages/HomePage/index.tsx new file mode 100644 index 00000000..fbb41094 --- /dev/null +++ b/admin/src/pages/HomePage/index.tsx @@ -0,0 +1,556 @@ +import { Data } from '@strapi/strapi'; +import { + Box, + Button, + DesignSystemProvider, + Flex, + SingleSelect, + SingleSelectOption, + Typography, +} from '@strapi/design-system'; +import { Layouts, Page, useRBAC } from '@strapi/strapi/admin'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { first, isEmpty } from 'lodash'; +import { SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react'; +import { useIntl } from 'react-intl'; + +import { usePluginTheme } from '@sensinum/strapi-utils'; +import { ListPlus, Plus } from '@strapi/icons'; +import { NavigationItemSchema, NavigationSchema } from '../../api/validators'; +import { getTrad } from '../../translations'; +import { ToBeFixed } from '../../types'; +import pluginPermissions from '../../utils/permissions'; +import { NavigationHeader } from './components'; +import { NavigationContentHeader } from './components/NavigationContentHeader'; +import { NavigationItemFormSchema } from './components/NavigationItemForm'; +import { List } from './components/NavigationItemList'; +import NavigationItemPopUp from './components/NavigationItemPopup'; +import { Search } from './components/Search'; +import { + useConfig, + useCopyNavigationI18n, + useI18nCopyNavigationItemsModal, + useLocale, + useNavigations, + usePurgeNavigation, + useUpdateNavigation, +} from './hooks'; +import { + changeCollapseItemDeep, + getPendingAction, + mapServerNavigationItem, + transformItemToViewPayload, +} from './utils'; + +const queryClient = new QueryClient(); + +const Inner = () => { + const { formatMessage } = useIntl(); + + const localeQuery = useLocale(); + + const [recentNavigation, setRecentNavigation] = useState<{ documentId?: string, id?: Data.ID }>(); + const [currentNavigation, setCurrentNavigation] = useState(); + + const [activeNavigationItem, setActiveNavigationItemState] = useState< + Partial | undefined + >(); + + const [isItemPopupVisible, setIsItemPopupVisible] = useState(false); + + const [structureChanged, setStructureChanged] = useState(false); + + const [currentLocale, setCurrentLocale] = useState(); + + const viewPermissions = useMemo( + () => ({ + access: pluginPermissions.access || pluginPermissions.update, + update: pluginPermissions.update, + }), + [] + ); + + const { + isLoading: isLoadingForPermissions, + allowedActions: { canUpdate, canAccess }, + } = useRBAC(viewPermissions); + + const navigationsQuery = useNavigations(); + + const configQuery = useConfig(); + + const purgeMutation = usePurgeNavigation(); + + const pending = getPendingAction([navigationsQuery, { isPending: isLoadingForPermissions }]); + + const copyNavigationI18nMutation = useCopyNavigationI18n(); + + const [{ value: searchValue, index: searchIndex }, setSearchValue] = useState({ + value: '', + index: 0, + }); + const isSearchEmpty = isEmpty(searchValue); + const normalisedSearchValue = (searchValue || '').toLowerCase(); + + const filteredListFactory = ( + items: Array, + doUse: (item: NavigationItemSchema) => boolean, + activeIndex?: number + ): NavigationItemSchema[] => { + const filteredItems = items.reduce>((acc, item) => { + const subItems = !!item.items?.length ? filteredListFactory(item.items ?? [], doUse) : []; + + if (doUse(item)) { + return [item, ...subItems, ...acc]; + } else { + return [...subItems, ...acc]; + } + }, []); + + if (activeIndex !== undefined) { + const index = activeIndex % filteredItems.length; + + return filteredItems.map((item, currentIndex) => { + return index === currentIndex ? { ...item, isSearchActive: true } : item; + }); + } + + return filteredItems; + }; + + const filteredList = !isSearchEmpty + ? filteredListFactory( + currentNavigation?.items.map((_) => ({ ..._ })) ?? [], + (item) => (item?.title || '').toLowerCase().includes(normalisedSearchValue), + normalisedSearchValue ? searchIndex : undefined + ) + : []; + + const changeNavigationItemPopupState = useCallback( + (visible: boolean, editedItem = {}) => { + setActiveNavigationItemState(editedItem); + + setIsItemPopupVisible(visible); + }, + [setIsItemPopupVisible] + ); + + const addNewNavigationItem = useCallback( + ( + event: MouseEvent, + viewParentId?: number, + isMenuAllowedLevel = true, + levelPath = '', + parentAttachedToMenu = true, + structureId = '0', + maxOrder = 0 + ) => { + if (canUpdate) { + event.preventDefault(); + event.stopPropagation(); + + changeNavigationItemPopupState(true, { + viewParentId, + isMenuAllowedLevel, + levelPath, + parentAttachedToMenu, + structureId, + viewId: undefined, + order: maxOrder + 1, + }); + } + }, + [changeNavigationItemPopupState, canUpdate] + ); + + const availableLocale = useMemo( + () => + (localeQuery.data + ? [localeQuery.data.defaultLocale, ...localeQuery.data.restLocale] + : [] + ).filter((locale) => locale !== currentLocale), + [localeQuery.data, currentLocale] + ); + + const { + i18nCopyItemsModal, + i18nCopySourceLocale, + setI18nCopyModalOpened, + setI18nCopySourceLocale, + } = useI18nCopyNavigationItemsModal( + useCallback( + (sourceLocale) => { + const source = navigationsQuery.data?.find( + ({ locale, documentId }) => + locale === sourceLocale && documentId === currentNavigation?.documentId + ); + + if (source) { + if (source.documentId && currentNavigation?.documentId) { + copyNavigationI18nMutation.mutate( + { + source: source.locale, + target: currentNavigation.locale, + documentId: source.documentId, + }, + { + onSuccess(res) { + copyNavigationI18nMutation.reset(); + setCurrentNavigation(res.data); + }, + } + ); + } + } + }, + [currentNavigation] + ) + ); + + const openI18nCopyModalOpened = useCallback(() => { + i18nCopySourceLocale && setI18nCopyModalOpened(true); + }, [setI18nCopyModalOpened, i18nCopySourceLocale]); + + const updateNavigationMutation = useUpdateNavigation(() => { + setRecentNavigation({ + documentId: currentNavigation?.documentId, + id: currentNavigation?.id, + }); + setCurrentNavigation(undefined); + }); + + const submit = () => { + if (currentNavigation) { + updateNavigationMutation.mutate(currentNavigation); + } + }; + + const onPopUpClose = (e: SyntheticEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // Using Strapi design system select components inside a modal causes + // extraneous close events to be fired. It is most likely related to how + // the select component handles onOutsideClick events. In those situations + // the event target element is the root HTML element. + // This is a workaround to prevent the modal from closing in those cases. + if ((e.target as any).tagName !== 'HTML') { + changeNavigationItemPopupState(false); + } + }; + + const handleItemReOrder = ({ + item, + newOrder, + }: { + item: NavigationItemFormSchema; + newOrder: number; + }) => { + handleSubmitNavigationItem({ + ...item, + order: newOrder, + }); + }; + + const handleItemRemove = (item: NavigationItemSchema) => { + handleSubmitNavigationItem( + mapServerNavigationItem( + { + ...item, + removed: true, + }, + true + ) + ); + }; + + const handleItemRestore = (item: NavigationItemSchema) => { + handleSubmitNavigationItem( + mapServerNavigationItem( + { + ...item, + removed: false, + }, + true + ) + ); + }; + + const handleItemToggleCollapse = (item: NavigationItemSchema) => { + handleSubmitNavigationItem( + mapServerNavigationItem( + { + ...item, + collapsed: !item.collapsed, + updated: true, + isSearchActive: false, + }, + true + ) + ); + }; + + const handleItemEdit = ({ + item, + levelPath = '', + parentAttachedToMenu = true, + }: { + item: NavigationItemFormSchema; + levelPath?: string; + parentAttachedToMenu?: boolean; + }) => { + changeNavigationItemPopupState(true, { + ...item, + levelPath, + parentAttachedToMenu, + }); + }; + + const handleSubmitNavigationItem = (payload: NavigationItemFormSchema) => { + if (currentNavigation && configQuery.data) { + const items = transformItemToViewPayload( + payload, + currentNavigation?.items ?? [], + configQuery.data + ); + + setCurrentNavigation({ + ...currentNavigation, + items, + }); + + setStructureChanged(true); + + setIsItemPopupVisible(false); + } + }; + + const listItems = isSearchEmpty ? (currentNavigation?.items ?? []) : filteredList; + + const handleExpandAll = useCallback(() => { + if (currentNavigation) { + setCurrentNavigation({ + ...currentNavigation, + items: currentNavigation.items.map((item) => changeCollapseItemDeep(item, false)), + }); + } + }, [setCurrentNavigation, currentNavigation, changeCollapseItemDeep]); + + const handleCollapseAll = useCallback(() => { + if (currentNavigation) { + setCurrentNavigation({ + ...currentNavigation, + items: currentNavigation.items.map((item) => changeCollapseItemDeep(item, true)), + }); + } + }, [setCurrentNavigation, currentNavigation, changeCollapseItemDeep]); + + const endActions = [ + { + onClick: handleExpandAll, + type: 'submit', + variant: 'tertiary', + tradId: 'header.action.expandAll', + margin: '8px', + }, + { + onClick: handleCollapseAll, + type: 'submit', + variant: 'tertiary', + tradId: 'header.action.collapseAll', + margin: '8px', + }, + ] as Array; + + if (canUpdate) { + endActions.push({ + onClick: addNewNavigationItem as ToBeFixed, + type: 'submit', + variant: 'primary', + tradId: 'header.action.newItem', + startIcon: , + margin: '8px', + }); + } + + useEffect(() => { + if (!currentNavigation && navigationsQuery.data?.[0]) { + + let navigation; + if (recentNavigation?.documentId) { + navigation = navigationsQuery.data.find((nav) => + (nav.documentId === recentNavigation.documentId) && + (nav.id === recentNavigation.id) + ) + } + + setRecentNavigation(undefined); + setCurrentNavigation(navigation ? navigation : first(navigationsQuery.data)); + } + }, [navigationsQuery.data]); + + useEffect(() => { + if (!currentLocale && localeQuery.data?.defaultLocale) { + setCurrentLocale(localeQuery.data?.defaultLocale); + } + }, [navigationsQuery.data]); + + useEffect(() => { + if (currentNavigation && currentLocale !== currentNavigation.locale) { + setRecentNavigation(undefined); + + const nextNavigation = navigationsQuery.data?.find( + (navigation) => + navigation.documentId === currentNavigation.documentId && + navigation.locale === currentLocale + ); + + if ( + nextNavigation && + nextNavigation.documentId === currentNavigation.documentId && + nextNavigation.locale !== currentNavigation.locale + ) { + setCurrentNavigation(nextNavigation); + } + } + }, [currentNavigation, currentLocale, navigationsQuery.data]); + + useEffect(() => { + if (!currentLocale && localeQuery.data?.defaultLocale) { + setCurrentLocale(localeQuery.data.defaultLocale); + } + }, [navigationsQuery.data]); + + if (!navigationsQuery.data || !localeQuery.data || !!pending) { + return ; + } + + return ( + + + + purgeMutation.mutate(undefined)} + handleChangeSelection={setCurrentNavigation} + handleLocalizationSelection={setCurrentLocale} + handleSave={submit} + locale={localeQuery.data} + structureHasChanged={structureChanged} + permissions={{ canUpdate }} + currentLocale={currentLocale} + /> + + + } + endActions={endActions.map(({ tradId, margin, ...item }, i) => ( + + + + ))} + /> + {!currentNavigation?.items.length ? ( + + + + {formatMessage(getTrad('empty.description'))} + + + {canUpdate && ( + + )} + {canUpdate && availableLocale.length ? ( + + + + {formatMessage(getTrad('view.i18n.fill.cta.header'))} + + + + + + {availableLocale.map((locale) => ( + + {formatMessage(getTrad('view.i18n.fill.option'), { locale })} + + ))} + + + + + + + + ) : null} + + ) : ( + + )} + + {isItemPopupVisible && currentLocale && currentNavigation && ( + + )} + + {canUpdate && i18nCopyItemsModal} + + + + ); +}; + +export default function HomePage() { + const theme = usePluginTheme(); + + return ( + + + + + + ); +} + +export { HomePage }; diff --git a/admin/src/pages/HomePage/utils/index.ts b/admin/src/pages/HomePage/utils/index.ts new file mode 100644 index 00000000..c0ed51a4 --- /dev/null +++ b/admin/src/pages/HomePage/utils/index.ts @@ -0,0 +1,27 @@ +import { UseQueryResult } from '@tanstack/react-query'; + +import { NavigationItemSchema } from '../../../api/validators'; + +export * from './parsers'; + +export const getPendingAction = (actions: Array>) => + actions.find(({ isPending }) => isPending); + +export const changeCollapseItemDeep = ( + item: NavigationItemSchema, + isCollapsed: boolean +): NavigationItemSchema => { + if (item.collapsed !== isCollapsed) { + return { + ...item, + collapsed: isCollapsed, + updated: true, + items: item.items?.map((el) => changeCollapseItemDeep(el, isCollapsed)), + }; + } + + return { + ...item, + items: item.items?.map((el) => changeCollapseItemDeep(el, isCollapsed)), + }; +}; diff --git a/admin/src/pages/HomePage/utils/parsers.ts b/admin/src/pages/HomePage/utils/parsers.ts new file mode 100644 index 00000000..3f2fca8b --- /dev/null +++ b/admin/src/pages/HomePage/utils/parsers.ts @@ -0,0 +1,327 @@ +import { capitalize, first, get, isEmpty, orderBy } from 'lodash'; + +import { + ConfigFromServerSchema, + NavigationItemSchema, + NavigationItemTypeSchema, + StrapiContentTypeItemSchema, +} from '../../../api/validators'; +import { NavigationItemFormSchema } from '../components/NavigationItemForm'; + +const reOrderItems = (items: NavigationItemSchema[] = []) => + orderBy(items, ['order'], ['asc']).map((item, n) => { + const order = n + 1; + return { + ...item, + order, + updated: item.updated || order !== item.order, + }; + }); + +const toNavigationItem = ( + payload: NavigationItemFormSchema, + config: ConfigFromServerSchema +): NavigationItemSchema => { + return payload.type === 'INTERNAL' + ? { + type: 'INTERNAL', + collapsed: !!payload.collapsed, + id: payload.id!, + documentId: payload.documentId!, + menuAttached: !!payload.menuAttached, + order: payload.order ?? 0, + path: payload.path, + title: payload.title, + uiRouterKey: payload.uiRouterKey, + additionalFields: payload.additionalFields, + audience: + payload.audience?.map( + (documentId) => + config.availableAudience.find((audience) => audience.documentId === documentId)! + ) ?? [], + autoSync: payload.autoSync, + items: payload.items?.length + ? transformItemToViewPayload(payload, payload.items, config) + : payload.items, + related: { + __type: payload.relatedType, + documentId: payload.related, + }, + viewId: payload.viewId, + viewParentId: payload.viewParentId, + structureId: payload.structureId, + removed: payload.removed, + updated: payload.updated, + } + : payload.type === 'EXTERNAL' + ? { + type: 'EXTERNAL', + collapsed: !!payload.collapsed, + id: payload.id!, + documentId: payload.documentId!, + menuAttached: !!payload.menuAttached, + order: payload.order ?? 0, + title: payload.title, + uiRouterKey: payload.uiRouterKey, + additionalFields: payload.additionalFields, + autoSync: payload.autoSync, + items: payload.items?.length + ? transformItemToViewPayload(payload, payload.items, config) + : payload.items, + path: '', + viewId: payload.viewId, + structureId: payload.structureId, + viewParentId: payload.viewParentId, + removed: payload.removed, + updated: payload.updated, + externalPath: payload.externalPath ?? '', + audience: + payload.audience?.map( + (documentId) => + config.availableAudience.find((audience) => audience.documentId === documentId)! + ) ?? [], + } + : { + type: 'WRAPPER', + collapsed: !!payload.collapsed, + id: payload.id!, + documentId: payload.documentId!, + menuAttached: !!payload.menuAttached, + order: payload.order ?? 0, + path: payload.path ?? '', + title: payload.title, + uiRouterKey: payload.uiRouterKey, + additionalFields: payload.additionalFields, + audience: + payload.audience?.map( + (documentId) => + config.availableAudience.find((audience) => audience.documentId === documentId)! + ) ?? [], + autoSync: payload.autoSync, + items: payload.items?.length + ? transformItemToViewPayload(payload, payload.items, config) + : payload.items, + viewId: payload.viewId, + viewParentId: payload.viewParentId, + structureId: payload.structureId, + removed: payload.removed, + updated: payload.updated, + }; +}; + +export const transformItemToViewPayload = ( + payload: NavigationItemFormSchema, + items: (NavigationItemSchema & { viewId?: number })[] = [], + config: ConfigFromServerSchema +): Array => { + if (!payload.viewParentId) { + if (payload.viewId) { + const updatedRootLevel = items.map((item): NavigationItemSchema => { + if (item.viewId === payload.viewId) { + return toNavigationItem(payload, config); + } + + return { + ...item, + items: item.items?.length + ? transformItemToViewPayload(payload, item.items, config) + : item.items, + }; + }); + + return reOrderItems(updatedRootLevel); + } + + return [ + ...reOrderItems([...items, toNavigationItem({ ...payload, viewId: Date.now() }, config)]), + ]; + } + + const updatedLevel = items.map((item) => { + const branchItems = item.items || []; + + if (payload.viewParentId === item.viewId) { + if (!payload.viewId) { + return { + ...item, + items: [ + ...reOrderItems([ + ...branchItems, + toNavigationItem({ ...payload, viewId: Date.now() }, config), + ]), + ], + }; + } + + const updatedBranchItems = branchItems.map((item) => { + if (item.viewId === payload.viewId) { + return toNavigationItem(payload, config); + } + + return item; + }); + + return { + ...item, + items: reOrderItems(updatedBranchItems), + }; + } + + return { + ...item, + items: item.items?.length + ? transformItemToViewPayload(payload, item.items, config) + : item.items, + }; + }); + + return reOrderItems(updatedLevel); +}; + +export const extractRelatedItemLabel = ( + item: StrapiContentTypeItemSchema, + config?: ConfigFromServerSchema +) => { + const contentTypes = config?.contentTypes ?? []; + const fields = config?.contentTypesNameFields ?? {}; + const defaultFields = fields.default ?? []; + + const { __collectionUid } = item; + + const contentType = contentTypes.find(({ uid }) => uid === __collectionUid); + + if (contentType?.isSingle) { + return contentType.labelSingular; + } + + const defaultFieldsWithCapitalizedOptions = [ + ...defaultFields, + ...defaultFields.map((_) => capitalize(_)), + ]; + const labelFields = get( + fields, + `${contentType ? contentType.uid : __collectionUid}`, + defaultFieldsWithCapitalizedOptions + ); + const itemLabels = (isEmpty(labelFields) ? defaultFieldsWithCapitalizedOptions : labelFields) + .map((_) => item[_]) + .filter((_) => _); + + return first(itemLabels) || ''; +}; + +export const isRelationCorrect = (item: Partial) => { + switch (item.type) { + case 'EXTERNAL': + case 'WRAPPER': + return true; + case 'INTERNAL': + return !!item.related; + } +}; + +export const isRelationPublished = ({ + relatedRef, + relatedType = {}, + type, + isCollection, +}: { + relatedRef: StrapiContentTypeItemSchema; + relatedType?: { available?: boolean }; + type: NavigationItemTypeSchema; + isCollection: boolean; +}) => { + if (isCollection) { + return relatedType.available || relatedRef.available; + } + if (type === 'INTERNAL') { + const isHandledByPublishFlow = relatedRef ? 'publishedAt' in relatedRef : false; + + if (isHandledByPublishFlow) { + return get(relatedRef, 'publishedAt', true); + } + } + return true; +}; + +export const mapServerNavigationItem = ( + item: NavigationItemSchema, + stopAtFirstLevel = false +): NavigationItemFormSchema => { + const { __type: relatedType, documentId: related } = + item.type === 'INTERNAL' && item.related + ? item.related + : { + __type: "", + documentId: "", + }; + + return item.type === 'INTERNAL' + ? { + type: 'INTERNAL', + id: item.id, + documentId: item.documentId, + additionalFields: item.additionalFields ?? {}, + path: item.path ?? '', + relatedType, + related, + title: item.title, + uiRouterKey: item.uiRouterKey, + autoSync: item.autoSync ?? undefined, + collapsed: item.collapsed, + externalPath: undefined, + order: item.order ?? 0, + menuAttached: item.menuAttached, + viewId: item.viewId, + viewParentId: item.viewParentId, + items: stopAtFirstLevel + ? (item.items as unknown as NavigationItemFormSchema[]) + : (item.items?.map((_) => mapServerNavigationItem(_)) ?? undefined), + removed: item.removed, + updated: item.updated, + isSearchActive: item.isSearchActive, + } + : item.type === 'EXTERNAL' + ? { + type: 'EXTERNAL', + id: item.id, + documentId: item.documentId, + additionalFields: item.additionalFields ?? {}, + title: item.title, + uiRouterKey: item.uiRouterKey, + autoSync: item.autoSync ?? undefined, + collapsed: item.collapsed, + externalPath: item.externalPath!, + order: item.order ?? 0, + menuAttached: item.menuAttached, + viewId: item.viewId, + viewParentId: item.viewParentId, + items: stopAtFirstLevel + ? (item.items as unknown as NavigationItemFormSchema[]) + : (item.items?.map((_) => mapServerNavigationItem(_)) ?? undefined), + removed: item.removed, + updated: item.updated, + isSearchActive: item.isSearchActive, + } + : { + type: 'WRAPPER', + id: item.id, + documentId: item.documentId, + additionalFields: item.additionalFields ?? {}, + title: item.title, + uiRouterKey: item.uiRouterKey, + autoSync: item.autoSync ?? undefined, + collapsed: item.collapsed, + order: item.order ?? 0, + menuAttached: item.menuAttached, + viewId: item.viewId, + viewParentId: item.viewParentId, + items: stopAtFirstLevel + ? (item.items as unknown as NavigationItemFormSchema[]) + : (item.items?.map((_) => mapServerNavigationItem(_)) ?? undefined), + removed: item.removed, + updated: item.updated, + isSearchActive: item.isSearchActive, + path: item.path ?? '', + }; +}; diff --git a/admin/src/pages/NoAccessPage/index.tsx b/admin/src/pages/NoAccessPage/index.tsx deleted file mode 100644 index a10d8a15..00000000 --- a/admin/src/pages/NoAccessPage/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/** - * NoAcccessPage - * - * This is the page we show when the user do not have appropriate credentials - * - */ - -// TODO -// @ts-nocheck - -import React from 'react'; -import { useFocusWhenNavigate, LinkButton } from '@strapi/helper-plugin'; -import { Main } from '@strapi/design-system/Main'; -import { ContentLayout, HeaderLayout } from '@strapi/design-system/Layout'; -import { EmptyStateLayout } from '@strapi/design-system/EmptyStateLayout'; -import { EmptyPictures, ArrowRight } from "@strapi/icons"; -import { useIntl } from 'react-intl'; - -const NoAcccessPage = () => { - const { formatMessage } = useIntl(); - useFocusWhenNavigate(); - - return ( -
- - - } to="/"> - {formatMessage({ - id: 'components.notAccessPage.back', - defaultMessage: 'Back to homepage', - })} - - } - content={formatMessage({ - id: 'page.auth.not.allowed', - defaultMessage: "Oops! It seems like You do not have access to this page...", - })} - hasRadius - icon={} - shadow="tableShadow" - /> - -
- ); -}; - -export default NoAcccessPage; diff --git a/admin/src/pages/SettingsPage/common/const.ts b/admin/src/pages/SettingsPage/common/const.ts index 358f9e34..cf2c5db3 100644 --- a/admin/src/pages/SettingsPage/common/const.ts +++ b/admin/src/pages/SettingsPage/common/const.ts @@ -1 +1 @@ -export const customFieldsTypes = ["string", "boolean", "select", "media"]; +export const customFieldsTypes = ["string", "boolean", "select", "media"] as const; diff --git a/admin/src/pages/SettingsPage/components/CustomFieldForm/index.tsx b/admin/src/pages/SettingsPage/components/CustomFieldForm/index.tsx index 117e4f82..df0d78b4 100644 --- a/admin/src/pages/SettingsPage/components/CustomFieldForm/index.tsx +++ b/admin/src/pages/SettingsPage/components/CustomFieldForm/index.tsx @@ -1,180 +1,236 @@ -import React, { useCallback, useMemo } from 'react'; -//@ts-ignore -import { ModalBody, ModalFooter } from '@strapi/design-system/ModalLayout'; -//@ts-ignore -import { Button } from '@strapi/design-system/Button'; -import { GenericInput, GenericInputProps } from '@strapi/helper-plugin'; -//@ts-ignore -import { Grid, GridItem } from '@strapi/design-system/Grid'; -import { useFormik } from 'formik'; -import { Effect, NavigationItemCustomField, VoidEffect } from '../../../../../../types'; -import * as formDefinition from '../../utils/form'; -import { getMessage } from '../../../../utils'; -import { isEmpty, isNil } from 'lodash'; -import { getTrad } from '../../../../translations'; +import React, { useEffect, useState } from 'react'; +import { useIntl } from 'react-intl'; +import { Form } from '@strapi/strapi/admin'; +import { Button, Grid, Modal, SingleSelect, SingleSelectOption, TextInput, Toggle } from '@strapi/design-system'; +import { Field } from "@sensinum/strapi-utils"; + import TextArrayInput from '../../../../components/TextArrayInput'; +import { navigationItemCustomField, NavigationItemCustomField } from '../../../../schemas'; +import { getTrad } from '../../../../translations'; +import { Effect, FormChangeEvent, FormItemErrorSchema, ToBeFixed, VoidEffect } from '../../../../types'; import { customFieldsTypes } from '../../common'; -const tradPrefix = 'pages.settings.form.customFields.popup.' +import { get, isNil, isObject, isString, set } from 'lodash'; + +const tradPrefix = 'pages.settings.form.customFields.popup.'; interface ICustomFieldFormProps { customField: Partial; isEditForm: boolean; onSubmit: Effect; onClose: VoidEffect; - usedCustomFieldNames: string[]; } -const prepareSelectOptions = (options: string[]) => options.map((option, index) => ({ - key: `${option}-${index}`, - metadatas: { - intlLabel: { - id: option, - defaultMessage: option, +const prepareSelectOptions = (options: ReadonlyArray) => + options.map((option, index) => ({ + key: `${option}-${index}`, + metadatas: { + intlLabel: { + id: option, + defaultMessage: option, + }, + hidden: false, + disabled: false, }, - hidden: false, - disabled: false, - }, - value: option, - label: option, -})); - -const CustomFieldForm: React.FC = ({ isEditForm, customField, onSubmit, onClose, usedCustomFieldNames }) => { + value: option, + label: option, + })); + +const CustomFieldForm: React.FC = ({ + isEditForm, + customField, + onSubmit, + onClose, +}) => { const typeSelectOptions = prepareSelectOptions(customFieldsTypes); - const initialValues = useMemo(() => { - if (isNil(customField.type)) { - return formDefinition.defaultValues; - } else if (customField.type === 'select') { - return { - type: customField.type, - name: customField.name || formDefinition.defaultValues.name, - label: customField.label || formDefinition.defaultValues.label, - required: customField.required || formDefinition.defaultValues.required, - options: customField.options || formDefinition.defaultValues.options, - multi: customField.multi || formDefinition.defaultValues.multi, - enabled: customField.enabled, + + const { formatMessage } = useIntl(); + + const [formValue, setFormValue] = useState({} as NavigationItemCustomField); + const [formError, setFormError] = useState>(); + + const { type } = formValue; + + useEffect(() => { + if (customField) { + setFormValue({ + ...customField + } as NavigationItemCustomField); + } + }, [customField]) + + const handleChange = (eventOrPath: FormChangeEvent, value?: any, nativeOnChange?: (eventOrPath: FormChangeEvent, value?: any) => void) => { + if (nativeOnChange) { + + let fieldName = eventOrPath; + let fieldValue = value; + if (isObject(eventOrPath)) { + const { name: targetName, value: targetValue } = eventOrPath.target; + fieldName = targetName; + fieldValue = isNil(fieldValue) ? targetValue : fieldValue; } - } else { - return { - type: customField.type, - name: customField.name || formDefinition.defaultValues.name, - label: customField.label || formDefinition.defaultValues.label, - required: customField.required || formDefinition.defaultValues.required, - options: [], - multi: false, - enabled: customField.enabled, + + if (isString(fieldName)) { + setFormValueItem(fieldName, fieldValue); } + + return nativeOnChange(eventOrPath, fieldValue); + } + }; + + const setFormValueItem = (path: string, value: any) => { + setFormValue(set({ + ...formValue, + }, path, value)); + }; + + const renderError = (error: string): string | undefined => { + const errorOccurence = get(formError, error); + if (errorOccurence) { + return formatMessage(getTrad(error)); + } + return undefined; + }; + + + const submit = (e: React.MouseEvent, values: NavigationItemCustomField) => { + const { success, data, error } = navigationItemCustomField.safeParse(values); + if (success) { + onSubmit(values); + } else if (error) { + setFormError(error.issues.reduce((acc, err) => { + return { + ...acc, + [err.path.join('.')]: err.message + } + }, {} as FormItemErrorSchema)); } - }, [customField]); - - const { - handleChange, - setFieldValue, - values, - errors, - handleSubmit, - isSubmitting, - } = useFormik({ - initialValues, - onSubmit, - validationSchema: formDefinition.schemaFactory(usedCustomFieldNames), - validateOnChange: false, - }); - const defaultProps = useCallback((fieldName: keyof NavigationItemCustomField): Omit => { - const error = mapError(errors[fieldName]); - - return { - intlLabel: getTrad(`${tradPrefix}${fieldName}.label`), - onChange: handleChange, - name: fieldName, - value: values[fieldName], - error, - }; - }, [values, errors, handleChange]); + } return ( -
- - - - - - - - - - - - {values.type === 'select' && ( - <> - - - - - setFieldValue("options", v)} - label={getMessage(`${tradPrefix}options.label`)} - initialValue={values.options} - /> - - - )} - - - - - - + + + {({ values, onChange }) => { + return ( + + + handleChange(eventOrPath, value, onChange)} + placeholder={formatMessage(getTrad(`${tradPrefix}name.placeholder`))} + type="string" + disabled={isEditForm} + width="100%" + /> + + + + + handleChange(eventOrPath, value, onChange)} + placeholder={formatMessage(getTrad(`${tradPrefix}label.placeholder`))} + type="string" + width="100%" + /> + + + + + handleChange('type', eventOrPath, onChange)} + disabled={isEditForm} + width="100%" + > + {typeSelectOptions.map(({ key, label, value }) => ( + + {label} + + ))} + + + + {(type as ToBeFixed) === 'select' && ( + <> + + + handleChange(eventOrPath, !values.multi, onChange)} + onLabel="true" + offLabel="false" + width="100%" + /> + + + + + handleChange('options', value, onChange)} + initialValue={values.options} /> + + + + )} + + + handleChange(eventOrPath, !values.required, onChange)} + onLabel="true" + offLabel="false" + width="100%" + /> + + + ); + }} + + + + - } - endActions={ - - } - /> - + + + + ); -} +}; export default CustomFieldForm; - -const mapError = (err: unknown): GenericInputProps["error"] => { - if (typeof err === "string") { - return err; - } - - if ( - typeof err === "object" && - err && - ((err as any).id || (err as any).description || (err as any).defaultMessage) - ) { - return err; - } -}; diff --git a/admin/src/pages/SettingsPage/components/CustomFieldModal/index.tsx b/admin/src/pages/SettingsPage/components/CustomFieldModal/index.tsx index b2a42b6f..2cd65b4c 100644 --- a/admin/src/pages/SettingsPage/components/CustomFieldModal/index.tsx +++ b/admin/src/pages/SettingsPage/components/CustomFieldModal/index.tsx @@ -1,20 +1,18 @@ +import { Modal, Typography } from '@strapi/design-system'; import React from 'react'; -//@ts-ignore -import { Typography } from '@strapi/design-system/Typography'; -//@ts-ignore -import { ModalLayout, ModalHeader } from '@strapi/design-system/ModalLayout'; -import CustomFieldForm from '../CustomFieldForm'; -import { Effect, NavigationItemCustomField, VoidEffect } from '../../../../../../types'; -import { getMessage } from '../../../../utils'; import { pick } from 'lodash'; +import { useIntl } from 'react-intl'; +import { NavigationItemCustomField } from '../../../../schemas'; +import { getTrad } from '../../../../translations'; +import { Effect, VoidEffect } from '../../../../types'; +import CustomFieldForm from '../CustomFieldForm'; interface ICustomFieldModalProps { data: NavigationItemCustomField | null; isOpen: boolean; onClose: VoidEffect; onSubmit: Effect; - usedCustomFieldNames: string[]; } const CustomFieldModal: React.FC = ({ @@ -22,25 +20,46 @@ const CustomFieldModal: React.FC = ({ onClose, onSubmit, data, - usedCustomFieldNames, }) => { const isEditMode = !!data; + + const { formatMessage } = useIntl(); + return ( - - - - {getMessage(`pages.settings.form.customFields.popup.header.${isEditMode ? 'edit' : 'new'}`)} - - - - + { + if (!isOpen) { + onClose(); + } + }} + open={isOpen} + labelledBy="custom-field-modal" + > + + + + {formatMessage( + getTrad( + `pages.settings.form.customFields.popup.header.${isEditMode ? 'edit' : 'new'}` + ) + )} + + + + + ); -} +}; export default CustomFieldModal; diff --git a/admin/src/pages/SettingsPage/components/CustomFieldTable/index.tsx b/admin/src/pages/SettingsPage/components/CustomFieldTable/index.tsx index f7b84b11..be6d979f 100644 --- a/admin/src/pages/SettingsPage/components/CustomFieldTable/index.tsx +++ b/admin/src/pages/SettingsPage/components/CustomFieldTable/index.tsx @@ -1,53 +1,59 @@ +import { VisuallyHidden } from '@strapi/design-system'; +import { Check, Eye, EyeStriked, Minus, Pencil, Plus, PriceTag, Trash } from '@strapi/icons'; +import { useNotification } from '@strapi/strapi/admin'; import { sortBy } from 'lodash'; -import React, { useCallback, useMemo, useState } from 'react'; -//@ts-ignore -import { useNotification } from "@strapi/helper-plugin"; -//@ts-ignore -import { VisuallyHidden } from '@strapi/design-system/VisuallyHidden'; -//@ts-ignore -import { Table, Thead, Tr, Th, Tbody, Td, TFooter } from '@strapi/design-system/Table'; -//@ts-ignore -import { Plus, Trash, Pencil, Refresh, Check, Minus, EyeStriked, Eye } from '@strapi/icons'; -//@ts-ignore -import { Typography } from '@strapi/design-system/Typography'; -//@ts-ignore -import { Tooltip } from '@strapi/design-system/Tooltip'; -//@ts-ignore -import { Stack } from '@strapi/design-system/Stack'; -//@ts-ignore -import { IconButton } from '@strapi/design-system/IconButton'; +import { useCallback, useMemo, useState } from 'react'; -import { getMessage } from '../../../../utils'; -import { Effect, NavigationItemCustomField } from '../../../../../../types'; -import ConfirmationDialog from '../../../../components/ConfirmationDialog'; -import { getTradId } from '../../../../translations'; +import { + Flex, + IconButton, + TFooter, + Table, + Tbody, + Td, + Th, + Thead, + Tooltip, + Tr, + Typography, +} from '@strapi/design-system'; +import { useIntl } from 'react-intl'; +import { ConfirmationDialog } from '../../../../components/ConfirmationDialog'; +import { NavigationItemCustomField } from '../../../../schemas'; +import { getTrad, getTradId } from '../../../../translations'; +import { Effect } from '../../../../types'; interface ICustomFieldTableProps { - data: NavigationItemCustomField[]; + data: (NavigationItemCustomField | string)[]; onOpenModal: (field: NavigationItemCustomField | null) => void; onRemoveCustomField: Effect; onToggleCustomField: Effect; } -const refreshIcon = ; +const refreshIcon = ; const plusIcon = ; -const tradPrefix = "pages.settings.form.customFields.table."; +const tradPrefix = 'pages.settings.form.customFields.table.'; const CustomFieldTable: React.FC = ({ - data, + data = [], onOpenModal, onRemoveCustomField, onToggleCustomField, }) => { const [confirmationVisible, setIsConfirmationVisible] = useState(false); const [fieldToRemove, setFieldToRemove] = useState(null); - const toggleNotification = useNotification(); - const customFields = useMemo(() => sortBy(data, "name"), [data]); + const { toggleNotification } = useNotification(); + const customFields = useMemo(() => sortBy(data, 'name'), [data]); - const handleRemove = useCallback((field: NavigationItemCustomField) => { - setFieldToRemove(field); - setIsConfirmationVisible(true); - }, [setFieldToRemove, setIsConfirmationVisible]); + const { formatMessage } = useIntl(); + + const handleRemove = useCallback( + (field: NavigationItemCustomField) => { + setFieldToRemove(field); + setIsConfirmationVisible(true); + }, + [setFieldToRemove, setIsConfirmationVisible] + ); const cleanup = useCallback(() => { setFieldToRemove(null); @@ -58,10 +64,7 @@ const CustomFieldTable: React.FC = ({ if (fieldToRemove === null) { toggleNotification({ type: 'warning', - message: { - id: getTradId(`${tradPrefix}confirmation.error`), - defaultMessage: 'Something went wrong', - } + message: formatMessage(getTrad(`${tradPrefix}confirmation.error`)), }); } else { onRemoveCustomField(fieldToRemove); @@ -70,28 +73,31 @@ const CustomFieldTable: React.FC = ({ cleanup(); }, [cleanup, fieldToRemove, getTradId, onRemoveCustomField, toggleNotification]); - return ( <> { e.preventDefault(); onOpenModal(null); }} + onClick={(e: React.FormEvent) => { + e.preventDefault(); + onOpenModal(null); + }} icon={plusIcon} > - {getMessage(`${tradPrefix}footer`)} + {formatMessage(getTrad(`${tradPrefix}footer`))} } > @@ -99,22 +105,22 @@ const CustomFieldTable: React.FC = ({ - {customFields.map(customField => ( - - - - - + - - - ))} + + + + + + + ) : null + )}
- {getMessage(`${tradPrefix}header.name`)} + {formatMessage(getTrad(`${tradPrefix}header.name`))} - {getMessage(`${tradPrefix}header.label`)} + {formatMessage(getTrad(`${tradPrefix}header.label`))} - {getMessage(`${tradPrefix}header.type`)} + {formatMessage(getTrad(`${tradPrefix}header.type`))} - {getMessage(`${tradPrefix}header.required`)} + {formatMessage(getTrad(`${tradPrefix}header.required`))} @@ -123,58 +129,62 @@ const CustomFieldTable: React.FC = ({
- - {customField.name} - - - - {customField.label} - - - - {customField.type} - - - - - {customField.required ? : } + {customFields.map((customField) => + typeof customField !== 'string' ? ( +
+ + {customField.name} - - - - onOpenModal(customField)} - label={getMessage(`${tradPrefix}edit`)} - icon={} - noBorder - /> - onToggleCustomField(customField)} - label={getMessage(`${tradPrefix}${customField.enabled ? 'disable' : 'enable'}`)} - icon={customField.enabled ? : } - noBorder - /> - handleRemove(customField)} - label={getMessage(`${tradPrefix}remove`)} - icon={} - noBorder - /> - -
+ {customField.label} + + {customField.type} + + + + {customField.required ? : } + + + + + onOpenModal(customField)} + label={formatMessage(getTrad(`${tradPrefix}edit`))} + children={} + style={{ minWidth: 50 }} + /> + onToggleCustomField(customField)} + label={formatMessage( + getTrad(`${tradPrefix}${customField.enabled ? 'disable' : 'enable'}`) + )} + children={customField.enabled ? : } + style={{ minWidth: 50 }} + /> + handleRemove(customField)} + label={formatMessage(getTrad(`${tradPrefix}remove`))} + children={} + style={{ minWidth: 50 }} + /> + +
); -} +}; export default CustomFieldTable; diff --git a/admin/src/pages/SettingsPage/components/DisableI18nModal/index.tsx b/admin/src/pages/SettingsPage/components/DisableI18nModal/index.tsx deleted file mode 100644 index 21135e29..00000000 --- a/admin/src/pages/SettingsPage/components/DisableI18nModal/index.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import React, { useCallback, useMemo, useState, FC } from "react"; -import ConfirmationDialog from "../../../../components/ConfirmationDialog"; -import { getMessage } from "../../../../utils"; -// @ts-ignore -import { Formik } from "formik"; -// @ts-ignore -import { Check, Refresh, Play, Information } from "@strapi/icons"; -// @ts-ignore -import { Stack } from "@strapi/design-system/Stack"; -// @ts-ignore -import { Box } from "@strapi/design-system/Box"; -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -// @ts-ignore -import { ToggleInput } from "@strapi/design-system/ToggleInput"; -// @ts-ignore -import { Typography } from "@strapi/design-system/Typography"; -import { ToBeFixed } from "../../../../../../types"; - -interface Form { - pruneNavigations: boolean; - enabled: boolean; -} - -interface FormBooleanItemInput { - target: { checked: boolean }; -} - -interface SubmitEffect { - ({ pruneNavigations }: Form): void; -} - -interface CancelEffect { - (): void; -} - -interface Props { - onSubmit: SubmitEffect; - onCancel: CancelEffect; -} - -const refreshIcon = <>; - -const INITIAL_VALUES: Form = { pruneNavigations: false, enabled: true }; - -export const DisableI18nModal: FC = ({ onSubmit, onCancel }) => { - const [state, setState] = useState(INITIAL_VALUES); - const onConfirm = useCallback(() => { - onSubmit(state); - }, [onSubmit, state]); - - return ( - - - {({ setFieldValue, values }: ToBeFixed) => ( - <> - - - - {getMessage( - "pages.settings.actions.disableI18n.confirmation.description.line1" - )} - - - {getMessage( - "pages.settings.actions.disableI18n.confirmation.description.line2" - )} - - - - {getMessage( - "pages.settings.actions.disableI18n.confirmation.description.line3" - )} - - - - - - - - - { - setFieldValue("pruneNavigations", checked, false); - setState((state) => ({ - ...state, - pruneNavigations: checked, - })); - }} - onLabel={getMessage( - "pages.settings.actions.disableI18n.prune.on" - )} - offLabel={getMessage( - "pages.settings.actions.disableI18n.prune.off" - )} - /> - - - - - - )} - - - ); -}; - -export const useDisableI18nModal = (onSubmit: SubmitEffect) => { - const [isOpened, setIsOpened] = useState(false); - const [onCancel, setOnCancel] = useState(() => () => {}); - const onSubmitWithModalClose = useCallback( - (val) => { - onSubmit(val); - setIsOpened(false); - }, - [onSubmit, setIsOpened] - ); - const onCancelWithModalClose = () => { - onCancel(); - setIsOpened(false); - }; - const modal = useMemo( - () => - isOpened ? ( - - ) : null, - [isOpened, onSubmitWithModalClose, onCancelWithModalClose] - ); - - return useMemo( - () => ({ - setDisableI18nModalOpened: setIsOpened, - setI18nModalOnCancel: setOnCancel, - disableI18nModal: modal, - }), - [setIsOpened, modal, setOnCancel] - ); -}; diff --git a/admin/src/pages/SettingsPage/hooks/index.ts b/admin/src/pages/SettingsPage/hooks/index.ts new file mode 100644 index 00000000..671c75f6 --- /dev/null +++ b/admin/src/pages/SettingsPage/hooks/index.ts @@ -0,0 +1,116 @@ +import { getFetchClient } from '@strapi/strapi/admin'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { z } from 'zod'; + +import { getApiClient } from '../../../api'; +import { configSchema } from '../../../schemas'; +import { resolveGlobalLikeId } from '../utils'; + +export const useConfig = () => { + // TODO: Resolve useQuery issues to use useFetchClient + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readSettingsConfigIndex(), + queryFn() { + return apiClient.readSettingsConfig(); + }, + staleTime: 1000 * 60 * 5, + }); +}; + +export const useRestart = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + const healthCheck = useQuery({ + queryKey: apiClient.healthCheckIndex(), + queryFn: () => apiClient.healthCheck(), + retry: true, + retryDelay: 1000 * 5, + enabled: false, + }); + + return useMutation({ + mutationFn: () => { + return apiClient.restart() + .then(() => healthCheck.refetch()); + }, + }); +}; + +export const useRestoreConfig = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useMutation({ + mutationFn: () => apiClient.restoreConfig(), + }); +}; + +export const useContentTypes = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useQuery({ + queryKey: apiClient.readContentTypeIndex(), + queryFn: () => apiClient.readContentType(), + staleTime: Infinity, + }); +}; + +export const useSaveConfig = () => { + const fetch = getFetchClient(); + const apiClient = getApiClient(fetch); + + return useMutation({ + mutationFn(data: UiFormSchema) { + return apiClient.updateConfig({ + ...data, + contentTypesNameFields: Object.fromEntries( + data.contentTypesNameFields.map(({ key, fields }) => [key, fields]) + ), + contentTypesPopulate: Object.fromEntries( + data.contentTypesPopulate.map(({ key, fields }) => [key, fields]) + ), + pathDefaultFields: Object.fromEntries( + data.pathDefaultFields.map(({ key, fields }) => [key, fields]) + ), + additionalFields: data.audienceFieldChecked + ? [...data.additionalFields, 'audience'] + : data.additionalFields, + gql: { + navigationItemRelated: data.contentTypes.map((uid: string) => { + return resolveGlobalLikeId(uid); + }), + }, + }); + }, + }); +}; + + +export type UiFormSchema = z.infer; + +export const uiFormSchema = configSchema.omit({ contentTypesNameFields: true }).extend({ + audienceFieldChecked: z.boolean(), + contentTypesNameFields: z + .object({ + key: z.string(), + fields: z.string().array(), + }) + .array(), + contentTypesPopulate: z + .object({ + key: z.string(), + fields: z.string().array(), + }) + .array(), + pathDefaultFields: z + .object({ + key: z.string(), + fields: z.string().array(), + }) + .array(), +}); \ No newline at end of file diff --git a/admin/src/pages/SettingsPage/index.tsx b/admin/src/pages/SettingsPage/index.tsx index 4d776bab..6fd71da8 100644 --- a/admin/src/pages/SettingsPage/index.tsx +++ b/admin/src/pages/SettingsPage/index.tsx @@ -1,602 +1,825 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { isEmpty, capitalize, isEqual, orderBy, get, sortBy } from 'lodash'; -import { Formik, Form } from 'formik'; + +import { Field, usePluginTheme } from "@sensinum/strapi-utils"; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { get, isEmpty, isNaN, isNil, isObject, isString, set, sortBy } from 'lodash'; +import { useEffect, useMemo, useState } from 'react'; +import { useIntl } from 'react-intl'; + import { - CheckPermissions, - LoadingIndicatorPage, - useOverlayBlocker, - useAutoReloadOverlayBlocker, - SettingsPageTitle, - useRBAC, - //@ts-ignore -} from '@strapi/helper-plugin'; -//@ts-ignore -import { Main } from '@strapi/design-system/Main'; -//@ts-ignore -import { ContentLayout, HeaderLayout } from '@strapi/design-system/Layout'; -//@ts-ignore -import { Accordion, AccordionToggle, AccordionContent, AccordionGroup } from '@strapi/design-system/Accordion'; -//@ts-ignore -import { Button } from '@strapi/design-system/Button'; -//@ts-ignore -import { Box } from '@strapi/design-system/Box'; -//@ts-ignore -import { Divider } from '@strapi/design-system/Divider'; -//@ts-ignore -import { Stack } from '@strapi/design-system/Stack'; -//@ts-ignore -import { Typography } from '@strapi/design-system/Typography'; -//@ts-ignore -import { Grid, GridItem } from '@strapi/design-system/Grid'; -//@ts-ignore -import { ToggleInput } from '@strapi/design-system/ToggleInput'; -//@ts-ignore -import { NumberInput } from '@strapi/design-system/NumberInput'; -//@ts-ignore -import { Select, Option } from '@strapi/design-system/Select'; -//@ts-ignore -import { Tooltip } from '@strapi/design-system/Tooltip'; -//@ts-ignore -import { Check, Refresh, Play, Information, ExclamationMarkCircle } from '@strapi/icons'; - -import permissions from '../../permissions'; -import useNavigationConfig from '../../hooks/useNavigationConfig'; -import useAllContentTypes from '../../hooks/useAllContentTypes'; -import { navigationItemAdditionalFields, prepareNewValueForRecord } from '../../utils'; -import ConfirmationDialog from '../../components/ConfirmationDialog'; -import RestartAlert from '../../components/RestartAlert'; -import { getMessage } from '../../utils'; -import { isContentTypeEligible, resolveGlobalLikeId } from './utils/functions'; -import { PermanentAlert } from '../../components/Alert/styles'; -import { useDisableI18nModal } from './components/DisableI18nModal'; - -import { NavigationItemAdditionalField, NavigationItemCustomField, ToBeFixed } from '../../../../types'; + Accordion, + Box, + Button, + DesignSystemProvider, + Flex, + Grid, + MultiSelect, + MultiSelectOption, + NumberInput, + Toggle, + Typography, +} from '@strapi/design-system'; + +import { Check, Play, Typhoon } from '@strapi/icons'; +import { Form, Layouts, Page, useAuth } from '@strapi/strapi/admin'; + +import { ConfirmationDialog } from '../../components/ConfirmationDialog'; +import { RestartAlert } from '../../components/RestartAlert'; +import { NavigationItemCustomField } from '../../schemas'; +import { FormChangeEvent, FormItemErrorSchema } from '../../types'; +import { getTrad } from '../../utils/getTranslation'; +import pluginPermissions from '../../utils/permissions'; import CustomFieldModal from './components/CustomFieldModal'; import CustomFieldTable from './components/CustomFieldTable'; -import { HandleSetContentTypeExpanded, OnPopupClose, OnSave, PreparePayload, RawPayload, RestartReasons, RestartStatus, StrapiContentTypeSchema } from './types'; -import pluginPermissions from '../../permissions'; -import NoAcccessPage from '../NoAccessPage'; - -const RESTART_NOT_REQUIRED: RestartStatus = { required: false } -const RESTART_REQUIRED: RestartStatus = { required: true, reasons: [] } -const RELATION_ATTRIBUTE_TYPES = ['relation', 'media', 'component']; -const STRING_ATTRIBUTE_TYPES = ['string', 'uid']; +import { + UiFormSchema, + uiFormSchema, + useConfig, + useContentTypes, + useRestart, + useRestoreConfig, + useSaveConfig, +} from './hooks'; +import { RestartStatus } from './types'; +import { isContentTypeEligible, waitForServerRestart } from './utils'; + const BOX_DEFAULT_PROPS = { - background: "neutral0", + background: 'neutral0', hasRadius: true, - shadow: "filterShadow", + shadow: 'filterShadow', padding: 6, }; -const noopFallback = () => {} +const queryClient = new QueryClient(); + +const Inner = () => { + const configQuery = useConfig(); + const contentTypesQuery = useContentTypes(); + const configSaveMutation = useSaveConfig(); + const restoreMutation = useRestoreConfig(); + const restartMutation = useRestart(); + + const { formatMessage } = useIntl(); + + const [restartStatus, setRestartStatus] = useState({ required: false }); + const [isReloading, setIsReloading] = useState(false); -const SettingsPage = () => { - const { lockApp = noopFallback, unlockApp = noopFallback } = useOverlayBlocker(); - const { lockAppWithAutoreload = noopFallback, unlockAppWithAutoreload = noopFallback } = useAutoReloadOverlayBlocker(); - const [restartStatus, setRestartStatus] = useState(RESTART_NOT_REQUIRED); - const [pruneObsoleteI18nNavigations, setPruneObsoleteI18nNavigations] = useState(false); + const readPermissions = useAuth('SettingsPage', (state) => state.permissions); + const hasSettingsPermissions = useMemo(() => { + return !!readPermissions.find(({ action }) => action === pluginPermissions.settings[0].action); + }, [readPermissions]); + const hasSettingsReadPermissions = useMemo(() => { + return !!readPermissions.find(({ action }) => action === pluginPermissions.access[0].action); + }, [readPermissions]); + + const isLoading = + configQuery.isPending || + contentTypesQuery.isPending || + configSaveMutation.isPending || + restartMutation.isPending || + restoreMutation.isPending; + + const [formValue, setFormValue] = useState({} as UiFormSchema); + const [formError, setFormError] = useState>(); const [isCustomFieldModalOpen, setIsCustomFieldModalOpen] = useState(false); - const [customFieldSelected, setCustomFieldSelected] = useState(null); - const [customFields, setCustomFields] = useState([]); const [isRestorePopupOpen, setIsRestorePopupOpen] = useState(false); - const [contentTypeExpanded, setContentTypeExpanded] = useState(undefined); - const { data: navigationConfigData, isLoading: isConfigLoading, error: configErr, submitMutation, restoreMutation, restartMutation }: ToBeFixed = useNavigationConfig(); - const { data: allContentTypesData, isLoading: isContentTypesLoading, error: contentTypesErr }: ToBeFixed = useAllContentTypes(); - - const viewPermissions: ToBeFixed = useMemo( - () => ({ - settings: pluginPermissions.settings - }), - [], + const [customFieldSelected, setCustomFieldSelected] = useState( + null ); const { - isLoading: isLoadingForPermissions, - allowedActions: { - canSettings: canManageSettings, - }, - } = useRBAC(viewPermissions); - - const isLoading = isConfigLoading || isContentTypesLoading; - const isError = configErr || contentTypesErr; - const configContentTypes: StrapiContentTypeSchema[] = navigationConfigData?.contentTypes || []; - - const formikInitialValues = useMemo(() => ({ - allowedLevels: get(navigationConfigData, "allowedLevels", 2), - audienceFieldChecked: get(navigationConfigData, "additionalFields", []).includes(navigationItemAdditionalFields.AUDIENCE), - cascadeMenuAttachedChecked: get(navigationConfigData, "cascadeMenuAttached", true), - i18nEnabled: get(navigationConfigData, "i18nEnabled", false), - nameFields: get(navigationConfigData, "contentTypesNameFields", {}), - pathDefaultFields: get(navigationConfigData, "pathDefaultFields", {}), - populate: get(navigationConfigData, "contentTypesPopulate", {}), - selectedContentTypes: configContentTypes.map(item => item.uid), - isCacheEnabled: get(navigationConfigData, "isCacheEnabled", false), - preferCustomContentTypes: get(navigationConfigData, "preferCustomContentTypes", true) ?? true, - }), [configContentTypes, navigationConfigData, navigationItemAdditionalFields]); + contentTypesNameFields: contentTypeNameFieldsCurrent, + contentTypes: contentTypesCurrent, + additionalFields, + preferCustomContentTypes, + } = formValue; - const { - disableI18nModal, - setDisableI18nModalOpened, - setI18nModalOnCancel, - } = useDisableI18nModal(({ pruneNavigations }) => { - setPruneObsoleteI18nNavigations(pruneNavigations) - }); + const handleChange = (eventOrPath: FormChangeEvent, value?: any, nativeOnChange?: (eventOrPath: FormChangeEvent, value?: any) => void) => { + if (nativeOnChange) { + let fieldName = eventOrPath; + let fieldValue = value; - useEffect(() => { - const additionalFields = navigationConfigData?.additionalFields - ?.filter((field: NavigationItemAdditionalField) => field !== navigationItemAdditionalFields.AUDIENCE); - setCustomFields(additionalFields || []); - }, [navigationConfigData]); - - const preparePayload = useCallback(({ - form: { - allowedLevels, - audienceFieldChecked, - cascadeMenuAttachedChecked, - i18nEnabled, - nameFields, - pathDefaultFields, - populate, - selectedContentTypes, - isCacheEnabled, - preferCustomContentTypes, - }, - pruneObsoleteI18nNavigations - }) => ({ - additionalFields: audienceFieldChecked ? ['audience', ...customFields] : [...customFields], - allowedLevels, - cascadeMenuAttached: cascadeMenuAttachedChecked, - contentTypes: selectedContentTypes, - contentTypesNameFields: nameFields, - contentTypesPopulate: populate, - i18nEnabled, - pathDefaultFields, - pruneObsoleteI18nNavigations, - gql: { - navigationItemRelated: selectedContentTypes.map((uid: string) => resolveGlobalLikeId(uid)), - }, - isCacheEnabled, - preferCustomContentTypes, - }), [customFields]); - - const onSave: OnSave = async (form) => { - lockApp(); - const payload = preparePayload({ form, pruneObsoleteI18nNavigations }); - await submitMutation({ body: payload }); - const isContentTypesChanged = !isEqual(payload.contentTypes, navigationConfigData.contentTypes); - const isI18nChanged = !isEqual(payload.i18nEnabled, navigationConfigData.i18nEnabled); - const isCacheChanged = !isEqual(payload.isCacheEnabled, navigationConfigData.isCacheEnabled); - const restartReasons: RestartReasons[] = [] - if (isI18nChanged) { - restartReasons.push('I18N'); - } - if (isCacheChanged) { - restartReasons.push('CACHE'); - } - if (isContentTypesChanged && navigationConfigData.isGQLPluginEnabled) { - restartReasons.push('GRAPH_QL'); + if (isObject(eventOrPath)) { + const { name: targetName, value: targetValue } = eventOrPath.target; + fieldName = targetName; + fieldValue = isNil(fieldValue) ? targetValue : fieldValue; + } + + if (isString(fieldName)) { + setFormValueItem(fieldName, fieldValue); + } + + return nativeOnChange(eventOrPath as FormChangeEvent, fieldValue); } - if (pruneObsoleteI18nNavigations) { - restartReasons.push('I18N_NAVIGATIONS_PRUNE') + }; + + const setFormValueItem = (path: string, value: any) => { + setFormValue((current) => + set( + { + ...current, + }, + path, + value + ) + ); + }; + + const renderError = (error: string): string | undefined => { + const errorOccurence = get(formError, error); + if (errorOccurence) { + return formatMessage(getTrad(error)); } - if (restartReasons.length) { - setRestartStatus({ - ...RESTART_REQUIRED, - reasons: restartReasons, + return undefined; + }; + + const handleOpenCustomFieldModal = (field: NavigationItemCustomField | null) => { + setCustomFieldSelected(field); + setIsCustomFieldModalOpen(true); + }; + + const handleRemoveCustomField = (field: NavigationItemCustomField) => { + const filteredFields = additionalFields.filter((f) => + typeof f !== 'string' ? f.name !== field.name : true + ); + + setFormValueItem('additionalFields', filteredFields); + + setCustomFieldSelected(null); + setIsCustomFieldModalOpen(false); + }; + + const handleToggleCustomField = (current: NavigationItemCustomField) => { + const next = { ...current, enabled: !current.enabled }; + + const nextAdditionalFields = additionalFields.map((field) => + typeof field !== 'string' && current.name === field.name ? next : field + ); + + setFormValueItem('additionalFields', nextAdditionalFields); + }; + + const handleSubmitCustomField = (next: NavigationItemCustomField) => { + const hasFieldAlready = !!additionalFields.find((field) => + typeof field !== 'string' ? field.name === next.name : false + ); + const nextAdditionalFields = hasFieldAlready + ? additionalFields.map((field) => + typeof field !== 'string' && next.name === field.name ? next : field + ) + : [...additionalFields, next]; + + setFormValueItem('additionalFields', nextAdditionalFields); + + setCustomFieldSelected(null); + setIsCustomFieldModalOpen(false); + }; + + const allContentTypes = !isLoading + ? sortBy( + Object.values(contentTypesQuery.data ?? []) + .filter(({ uid }) => + isContentTypeEligible(uid, { + allowedContentTypes: configQuery.data?.allowedContentTypes, + restrictedContentTypes: configQuery.data?.restrictedContentTypes, + preferCustomContentTypes, + contentTypes: contentTypesCurrent, + }) + ) + .map((ct) => { + const type = contentTypesQuery.data?.find((_) => _.uid === ct.uid); + + if (type) { + const { isDisplayed: available, kind } = type; + const isSingle = kind === 'singleType'; + + return { + ...ct, + available, + isSingle, + }; + } + return ct; + }), + (ct) => ct.info.displayName + ) + : []; + + const submit = (e: React.MouseEvent, rawData: unknown) => { + const { success, data, error } = uiFormSchema.safeParse(rawData); + + if (success) { + configSaveMutation.mutate(data, { + onSuccess() { + setRestartStatus({ required: true }); + + configSaveMutation.reset(); + }, }); + } else if (error) { + setFormError(error.issues.reduce((acc, err) => { + return { + ...acc, + [err.path.join('.')]: err.message + } + }, {} as FormItemErrorSchema)); + console.warn('Invalid form data', error); } - setDisableI18nModalOpened(false); - setPruneObsoleteI18nNavigations(false); - unlockApp(); - } + }; - const onPopupClose: OnPopupClose = async (isConfirmed) => { + const onPopupClose = async (isConfirmed: boolean) => { setIsRestorePopupOpen(false); + if (isConfirmed) { - lockApp(); - await restoreMutation(); - unlockApp(); - setRestartStatus(RESTART_REQUIRED); + restoreMutation.mutate(); + + setRestartStatus({ required: true }); } - } + }; const handleRestart = async () => { - lockAppWithAutoreload(); - await restartMutation(); - unlockAppWithAutoreload(); - setRestartStatus(RESTART_NOT_REQUIRED); - }; - const handleRestartDiscard = () => setRestartStatus(RESTART_NOT_REQUIRED); - const handleSetContentTypeExpanded: HandleSetContentTypeExpanded = key => setContentTypeExpanded(key === contentTypeExpanded ? undefined : key); + restartMutation.mutate(undefined, { + onSuccess() { + setIsReloading(true); - if (!(isLoadingForPermissions || canManageSettings)) { - return () - } + waitForServerRestart(true).then((isReady) => { + if (isReady) { + window.location.reload(); + } + }); + }, + onError() { + setRestartStatus({ required: false }); + }, + }); - if (isLoading || isError) { - return ( - <> - - - {/* TODO: use translation */} - Fetching plugin config... - - - ) - } - - const isI18NPluginEnabled = navigationConfigData?.isI18NPluginEnabled; - const isCachePluginEnabled = navigationConfigData?.isCachePluginEnabled; - const defaultLocale = navigationConfigData?.defaultLocale; + }; - const handleSubmitCustomField = (field: NavigationItemCustomField) => { - const filteredFields = customFields.filter(f => f.name !== field.name); - setCustomFields([...filteredFields, field]); - setCustomFieldSelected(null); - setIsCustomFieldModalOpen(false); - } + const handleRestartDiscard = () => setRestartStatus({ required: false }); - const handleOpenCustomFieldModal = (field: NavigationItemCustomField | null) => { - setCustomFieldSelected(field); - setIsCustomFieldModalOpen(true); - } + useEffect(() => { + if (configQuery.data) { + setFormValue({ + ...configQuery.data, + additionalFields: configQuery.data.additionalFields.filter((field) => typeof field !== 'string'), + audienceFieldChecked: configQuery.data.additionalFields.includes('audience'), + contentTypesNameFields: Object.entries(configQuery.data.contentTypesNameFields).map( + ([key, fields]) => ({ + key, + fields, + }) + ), + contentTypesPopulate: Object.entries(configQuery.data.contentTypesPopulate).map( + ([key, fields]) => ({ + key, + fields, + }) + ), + pathDefaultFields: Object.entries(configQuery.data.pathDefaultFields).map(([key, fields]) => ({ + key, + fields, + })), + } as UiFormSchema); + } + }, [configQuery.data]); - const handleRemoveCustomField = (field: NavigationItemCustomField) => { - const filteredFields = customFields.filter(f => f.name !== field.name); - setCustomFields(filteredFields); - setCustomFieldSelected(null); - setIsCustomFieldModalOpen(false); + if (!hasSettingsPermissions) { + return ; } - const handleToggleCustomField = (field: NavigationItemCustomField) => { - const updatedField = { ...field, enabled: !get(field, 'enabled', false) } - const filteredFields = customFields.filter(f => f.name !== field.name); - setCustomFields([...filteredFields, updatedField]); + if (isLoading || isReloading) { + return ; } return ( - <> - -
- - {({ handleSubmit, setFieldValue, values }) => { - const allContentTypes: StrapiContentTypeSchema[] = !isLoading ? sortBy(Object.values(allContentTypesData).filter(({ uid }) => isContentTypeEligible(uid, { - allowedContentTypes: navigationConfigData?.allowedContentTypes, - restrictedContentTypes: navigationConfigData?.restrictedContentTypes, - selectedContentTypes: values?.selectedContentTypes, - preferCustomContentTypes: values?.preferCustomContentTypes, - })).map(ct => { - const type = configContentTypes.find(_ => _.uid === ct.uid); - if (type) { - const { available, isSingle } = type; - return { - ...ct, - available, - isSingle, - }; - } - return ct; - }), ct => ct.info.displayName) : []; - - return ( -
- - - - } - /> - - - {restartStatus.required && ( - } - onClose={handleRestartDiscard}> - <> - - {getMessage('pages.settings.actions.restart.alert.description')} - - { - restartStatus.reasons?.map((reason, i) => ) - } - - )} - - - - {getMessage('pages.settings.general.title')} - - - - + + + } + disabled={restartStatus.required} + onClick={(e: React.MouseEvent) => submit(e, formValue)} + > + {formatMessage(getTrad('pages.settings.actions.submit'))} + + ) : null + } + /> + + + + + {({ values, onChange }) => { + + return ( + {restartStatus.required && ( + + + + + } + onClose={handleRestartDiscard} + > + <> + + {formatMessage(getTrad('pages.settings.actions.restart.alert.description'))} + + {restartStatus.reasons?.map((reason, i) => ( + + ))} + + + + )} + + + + {formatMessage(getTrad('pages.settings.general.title'))} + + + + + + + { - setFieldValue('preferCustomContentTypes', checked, true); - }} - onLabel="Enabled" - offLabel="Disabled" - disabled={restartStatus.required} - /> - - - - - - {!isEmpty(values.selectedContentTypes) && ( - - - - }> - {orderBy(values.selectedContentTypes).map(uid => { - const contentType = allContentTypes.find(item => item.uid == uid); - if (!contentType) return; - const { info: { displayName }, available, isSingle } = contentType; - const attributeKeys = Object.keys(contentType.attributes).sort(); - const stringAttributes = attributeKeys.filter(key => STRING_ATTRIBUTE_TYPES.includes(contentType.attributes[key].type)); - const relationAttributes = attributeKeys.filter(key => RELATION_ATTRIBUTE_TYPES.includes(contentType.attributes[key].type)); - const key = `collectionSettings-${uid}`; - return ( handleSetContentTypeExpanded(key)} - key={key} - id={key} - size="S"> - ) : null} /> - - - - {(isSingle && !available) && ( - e.preventDefault()}> - {getMessage('pages.settings.form.contentTypesSettings.initializationWarning.content')} - )} - - - - - - - ); - })} - - )} - - - - - - - {getMessage('pages.settings.additional.title')} - - - - - setFieldValue('allowedLevels', value, false)} - value={values.allowedLevels} + label={formatMessage( + getTrad('pages.settings.form.preferCustomContentTypes.label') + )} + hint={formatMessage( + getTrad('pages.settings.form.preferCustomContentTypes.hint') + )}> + handleChange(eventOrPath, !values.preferCustomContentTypes, onChange)} + onLabel={formatMessage(getTrad('components.toggle.enabled'))} + offLabel={formatMessage(getTrad('components.toggle.disabled'))} disabled={restartStatus.required} + width="100%" /> - - - - { - setFieldValue('cascadeMenuAttachedChecked', checked, true); + + + + + + ) => { + handleChange('contentTypes', value, onChange) + + const { + contentTypesNameFields = [], + contentTypesPopulate = [], + pathDefaultFields = [], + } = values; + + const missingKeys = + value.filter( + (key) => + !contentTypesNameFields.find( + (nameFields) => nameFields.key === key + ) + ) ?? []; + const redundantKeys = + contentTypesNameFields + .filter( + (nameFields) => + !value.includes(nameFields.key) || + nameFields.key === 'default' + ) + .map(({ key }) => key) ?? []; + + setFormValueItem( + 'contentTypesNameFields', + [ + ...(contentTypesNameFields.filter( + ({ key }) => + !redundantKeys.includes(key) || key === 'default' + ) ?? []), + ...missingKeys.map((key) => ({ key, fields: [] })), + ] + ); + + setFormValueItem( + 'contentTypesPopulate', + [ + ...(contentTypesPopulate.filter( + ({ key }) => + !redundantKeys.includes(key) || key === 'default' + ) ?? []), + ...missingKeys.map((key) => ({ key, fields: [] })), + ] + ); + + setFormValueItem( + 'pathDefaultFields', + [ + ...(pathDefaultFields.filter( + ({ key }) => + !redundantKeys.includes(key) || key === 'default' + ) ?? []), + ...missingKeys.map((key) => ({ key, fields: [] })), + ] + ); + }} + disabled={restartStatus.required} + error={renderError('contentTypes')} + withTags + width="100%" + > + {allContentTypes.map((item) => ( + + {item.info.displayName} + + ))} + + + + + + {contentTypesCurrent?.length ? ( + + {contentTypeNameFieldsCurrent.map((nameFields, index) => { + const current = contentTypesQuery.data?.find( + ({ uid }) => uid === nameFields.key + ); + const attributeKeys = Object.keys(current?.attributes ?? {}).sort(); + + return current ? ( + + + + {current?.info.displayName ?? + formatMessage( + getTrad('pages.settings.form.nameField.default') + )} + + + + + + + ) => { + const updated = get(values, 'contentTypesNameFields', []).map((item, i) => { + if (i === index) { + return { + ...item, + fields: value, + } + } + return item; + }); + + return handleChange('contentTypesNameFields', updated, onChange); + }} + disabled={restartStatus.required} + error={renderError(`contentTypesNameFields[${index}]`)} + withTags + > + {attributeKeys.map((attribute) => ( + + {attribute} + + ))} + + + + + + ) => { + const updated = get(values, 'contentTypesPopulate', []).map((item, i) => { + if (i === (index - 1)) { + return { + ...item, + fields: value, + } + } + return item; + }); + + return handleChange('contentTypesPopulate', updated, onChange); + }} + disabled={restartStatus.required} + error={renderError(`contentTypesPopulate[${index - 1}]`)} + withTags + > + {attributeKeys.map((attribute) => ( + + {attribute} + + ))} + + + + + + ) => { + const updated = get(values, 'pathDefaultFields', []).map((item, i) => { + if (i === (index - 1)) { + return { + ...item, + fields: value, + } + } + return item; + }); + + return handleChange('pathDefaultFields', updated, onChange); + }} + disabled={restartStatus.required} + error={renderError(`pathDefaultFields[${index - 1}]`)} + withTags + > + {attributeKeys.map((attribute) => ( + + {attribute} + + ))} + + + + + + + ) : null; + })} + + ) : null} + + + + + + + + + + + {formatMessage(getTrad('pages.settings.additional.title'))} + + + + + + + { + if (isObject(eventOrPath)) { + const parsedVal = parseInt(eventOrPath.target.value); + return handleChange(eventOrPath.target.name, isNaN(parsedVal) ? 0 : parsedVal, onChange); + } + return handleChange(eventOrPath, value, onChange); }} - onLabel="Enabled" - offLabel="Disabled" + value={values.allowedLevels} disabled={restartStatus.required} /> - - - - - setFieldValue('audienceFieldChecked', !values.audienceFieldChecked, false)} - onLabel="Enabled" - offLabel="Disabled" + + + + + + handleChange(eventOrPath, !values.cascadeMenuAttached, onChange)} + onLabel={formatMessage(getTrad('components.toggle.enabled'))} + offLabel={formatMessage(getTrad('components.toggle.disabled'))} + disabled={restartStatus.required} + /> + + + + + handleChange(eventOrPath, !values.audienceFieldChecked, onChange)} + onLabel={formatMessage(getTrad('components.toggle.enabled'))} + offLabel={formatMessage(getTrad('components.toggle.disabled'))} + disabled={restartStatus.required} + width="100%" + /> + + + {configQuery.data?.isCachePluginEnabled && ( + + + handleChange(eventOrPath, !values.isCacheEnabled, onChange)} + onLabel={formatMessage(getTrad('components.toggle.enabled'))} + offLabel={formatMessage(getTrad('components.toggle.disabled'))} disabled={restartStatus.required} + width="100%" /> - - {isI18NPluginEnabled && ( - - { - setFieldValue('i18nEnabled', checked, false); - if (checked) { - setPruneObsoleteI18nNavigations(false); - } else { - setDisableI18nModalOpened(true); - setI18nModalOnCancel(() => () => { - setFieldValue('i18nEnabled', true); - }); - } - }} - onLabel="Enabled" - offLabel="Disabled" - disabled={restartStatus.required || !defaultLocale} - /> - - )} - - {isCachePluginEnabled && ( - - - { - setFieldValue('isCacheEnabled', checked, false); - }} - onLabel="Enabled" - offLabel="Disabled" - disabled={restartStatus.required} - /> - - - )} - - - - - - {getMessage('pages.settings.customFields.title')} - - - - - - - - {getMessage('pages.settings.restoring.title')} + + + )} + + + + + + + {formatMessage(getTrad('pages.settings.customFields.title'))} + + + + + + + + + {formatMessage(getTrad('pages.settings.restoring.title'))} + + + + + {formatMessage(getTrad('pages.settings.actions.restore.description'))} - - - - {getMessage('pages.settings.actions.restore.description')} - - - - - - - } - onConfirm={() => onPopupClose(true)} - onCancel={() => onPopupClose(false)}> - {getMessage('pages.settings.actions.restore.confirmation.description')} - - {disableI18nModal} - - - - - - - - )}} -
-
- {isCustomFieldModalOpen && + + + {hasSettingsReadPermissions ? ( + + ) : null} + } + onConfirm={() => onPopupClose(true)} + onCancel={() => onPopupClose(false)} + > + {formatMessage( + getTrad('pages.settings.actions.restore.confirmation.description') + )} + + + + + + ) + }} + + + + {isCustomFieldModalOpen && ( setIsCustomFieldModalOpen(false)} onSubmit={handleSubmitCustomField} isOpen={isCustomFieldModalOpen} data={customFieldSelected} - usedCustomFieldNames={customFields.filter(f => f.name !== customFieldSelected?.name).map(f => f.name)} /> - } - + )} + ); -} +}; +export default function SettingsPage() { + queryClient.invalidateQueries(); + const theme = usePluginTheme(); -export default SettingsPage; + return ( + + + + + + ); +} diff --git a/admin/src/pages/SettingsPage/types.ts b/admin/src/pages/SettingsPage/types.ts index ef73b738..ee3255f9 100644 --- a/admin/src/pages/SettingsPage/types.ts +++ b/admin/src/pages/SettingsPage/types.ts @@ -1,22 +1,2 @@ -import { StrapiContentTypeFullSchema } from "strapi-typed"; -import { Effect, NavigationPluginConfig } from "../../../../types"; -export type RawPayload = { - allowedLevels: number; - audienceFieldChecked: boolean; - cascadeMenuAttachedChecked: boolean; - i18nEnabled: boolean; - nameFields: Record; - pathDefaultFields: Record; - populate: Record; - selectedContentTypes: string[]; - isCacheEnabled: boolean; - preferCustomContentTypes: boolean; -} -export type StrapiContentTypeSchema = StrapiContentTypeFullSchema & { available: boolean, isSingle: boolean, plugin: string, label: string } - -export type PreparePayload = (payload: { form: RawPayload, pruneObsoleteI18nNavigations: boolean }) => NavigationPluginConfig; -export type OnSave = Effect; -export type OnPopupClose = Effect; -export type HandleSetContentTypeExpanded = Effect; -export type RestartReasons = 'I18N' | 'GRAPH_QL' | 'I18N_NAVIGATIONS_PRUNE' | 'CACHE'; -export type RestartStatus = { required: true, reasons?: RestartReasons[] } | { required: false }; +export type RestartReasons = 'GRAPH_QL'; +export type RestartStatus = { required: true; reasons?: RestartReasons[] } | { required: false }; \ No newline at end of file diff --git a/admin/src/pages/SettingsPage/utils/form.ts b/admin/src/pages/SettingsPage/utils/form.ts deleted file mode 100644 index 35ef2c98..00000000 --- a/admin/src/pages/SettingsPage/utils/form.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { object, string, mixed, bool, array } from "yup"; -import { translatedErrors } from "@strapi/helper-plugin"; -import { getTradId } from "../../../translations"; -import { NavigationItemCustomField, NavigationItemCustomFieldType } from "../../../../../types"; -import { customFieldsTypes } from "../common"; - -export const schemaFactory = (usedCustomFieldNames: string[]) => { - return object({ - name: string().matches(/^\S+$/, "Invalid name string. Name cannot contain spaces").required(translatedErrors.required).notOneOf(usedCustomFieldNames, translatedErrors.unique), - label: string().required(translatedErrors.required), - type: mixed().required(translatedErrors.required).oneOf(customFieldsTypes, getTradId("notification.error.customField.type")), - required: bool().required(translatedErrors.required), - multi: mixed().when( - 'type', { - is: (val: NavigationItemCustomFieldType) => val === 'select', - then: bool().required(translatedErrors.required), - otherwise: bool().notRequired() - }), - options: mixed().when( - 'type', { - is: (val: NavigationItemCustomFieldType) => val === 'select', - then: array().of(string()), - otherwise: mixed().notRequired(), - }), - enabled: bool().notRequired(), - }); -}; - -export const defaultValues: NavigationItemCustomField = { - name: "", - label: "", - type: "string", - required: false, - multi: false, - options: [], - enabled: true, -}; diff --git a/admin/src/pages/SettingsPage/utils/functions.js b/admin/src/pages/SettingsPage/utils/functions.js deleted file mode 100644 index ae0bb51d..00000000 --- a/admin/src/pages/SettingsPage/utils/functions.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const { capitalize } = require("lodash"); - -const UID_REGEX = /^(?[a-z0-9-]+)\:{2}(?[a-z0-9-]+)\.{1}(?[a-z0-9-]+)$/i; - -const splitTypeUid = (uid = '') => { - return uid.split(UID_REGEX).filter((s) => s && s.length > 0); -}; - -module.exports = { - resolveGlobalLikeId(uid = '') { - const parse = (str) => str.split('-') - .map(_ => capitalize(_)) - .join(''); - - const [type, scope, contentTypeName] = splitTypeUid(uid); - if (type === 'api') { - return parse(contentTypeName); - } - return `${parse(scope)}${parse(contentTypeName)}`; - }, - - isContentTypeEligible(uid = '', config = {}) { - const { - allowedContentTypes: baseAllowedContentTypes = [], - restrictedContentTypes = [], - preferCustomContentTypes = false, - selectedContentTypes = [], - } = config; - - const allowedContentTypes = preferCustomContentTypes ? ["api::", ...selectedContentTypes] : baseAllowedContentTypes; - - const isOneOfAllowedType = allowedContentTypes.filter(_ => uid.includes(_) || (uid === _)).length > 0; - const isNoneOfRestricted = restrictedContentTypes.filter(_ => uid.includes(_) || (uid === _)).length === 0; - - return !!uid && isOneOfAllowedType && isNoneOfRestricted; - }, -} \ No newline at end of file diff --git a/admin/src/pages/SettingsPage/utils/index.ts b/admin/src/pages/SettingsPage/utils/index.ts new file mode 100644 index 00000000..f8ae0e53 --- /dev/null +++ b/admin/src/pages/SettingsPage/utils/index.ts @@ -0,0 +1,83 @@ +import { capitalize } from 'lodash'; + +type Config = { + allowedContentTypes?: string[]; + restrictedContentTypes?: string[]; + preferCustomContentTypes?: boolean; + contentTypes?: string[]; +}; + +const UID_REGEX = /^(?[a-z0-9-]+)\:{2}(?[a-z0-9-]+)\.{1}(?[a-z0-9-]+)$/i; + +export const isContentTypeEligible = (uid = '', config: Config = {}) => { + const { + allowedContentTypes: baseAllowedContentTypes = [], + restrictedContentTypes = [], + contentTypes = [], + preferCustomContentTypes = false, + } = config; + + const allowedContentTypes = preferCustomContentTypes + ? ['api::', ...contentTypes] + : baseAllowedContentTypes; + + const isOneOfAllowedType = + allowedContentTypes.filter((_) => uid.includes(_) || uid === _).length > 0; + const isNoneOfRestricted = + restrictedContentTypes.filter((_) => uid.includes(_) || uid === _).length === 0; + + return !!uid && isOneOfAllowedType && isNoneOfRestricted; +}; + +export const resolveGlobalLikeId = (uid = '') => { + const parse = (str: string) => + str + .split('-') + .map((_) => capitalize(_)) + .join(''); + + const [type, scope, contentTypeName] = splitTypeUid(uid); + if (type === 'api') { + return parse(contentTypeName); + } + return `${parse(scope)}${parse(contentTypeName)}`; +}; + +const splitTypeUid = (uid = '') => { + return uid.split(UID_REGEX).filter((s) => s && s.length > 0); +}; + +const SERVER_OFFLINE_MESSAGE = "SERVER OFFLINE"; + +export const waitForServerRestart = (response: any, didShutDownServer?: boolean) => { + return new Promise((resolve) => { + // @ts-ignore + fetch(`${window.strapi.backendURL}/_health`, { + method: 'HEAD', + mode: 'no-cors', + headers: { + 'Content-Type': 'application/json', + 'Keep-Alive': 'false', + }, + }) + .then((res) => { + if (res.status >= 400) { + throw new Error(); + } + + if (!didShutDownServer) { + throw new Error(SERVER_OFFLINE_MESSAGE); + } + + resolve(response); + }) + .catch((err) => { + setTimeout(() => { + return waitForServerRestart( + response, + err.message !== SERVER_OFFLINE_MESSAGE + ).then(resolve); + }, 100); + }); + }); +} diff --git a/admin/src/pages/View/components/I18nCopyNavigationItems/index.tsx b/admin/src/pages/View/components/I18nCopyNavigationItems/index.tsx deleted file mode 100644 index e6028060..00000000 --- a/admin/src/pages/View/components/I18nCopyNavigationItems/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React, { VFC } from "react"; -import ConfirmationDialog from "../../../../components/ConfirmationDialog"; -import { getMessage } from "../../../../utils"; - -export interface ConfirmEffect { - (source: string): void; -} - -export interface CancelEffect { - (): void; -} - -interface Props { - onConfirm: ConfirmEffect; - onCancel: CancelEffect; -} - -const refreshIcon = <>; - -export const I18nCopyNavigationItemsModal: VFC = ({ - onConfirm, - onCancel, -}) => { - return ( - - {getMessage("pages.view.actions.i18nCopyItems.confirmation.content")} - - ); -}; diff --git a/admin/src/pages/View/components/NavigationContentHeader/index.js b/admin/src/pages/View/components/NavigationContentHeader/index.js deleted file mode 100644 index 05e3a302..00000000 --- a/admin/src/pages/View/components/NavigationContentHeader/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; - -import { Flex } from '@strapi/design-system/Flex'; - -const NavigationContentHeader = ({ startActions, endActions }) => { - return ( - - - {startActions} - - - {endActions} - - - ); -} - -export default NavigationContentHeader; diff --git a/admin/src/pages/View/components/NavigationHeader/index.js b/admin/src/pages/View/components/NavigationHeader/index.js deleted file mode 100644 index 33c7379f..00000000 --- a/admin/src/pages/View/components/NavigationHeader/index.js +++ /dev/null @@ -1,157 +0,0 @@ -import React, { useMemo } from 'react'; -import { useIntl } from 'react-intl'; -import { HeaderLayout } from '@strapi/design-system/Layout'; -import { Stack } from '@strapi/design-system/Stack'; -import { Button } from '@strapi/design-system/Button'; -import Check from '@strapi/icons/Check'; -import More from '@strapi/icons/More'; -import Information from '@strapi/icons/Information'; -import { Tag } from '@strapi/design-system/Tag'; -import { getTrad } from '../../../../translations'; -import { MoreButton } from './styles'; -import { Select, Option } from '@strapi/design-system/Select'; -import { Box } from '@strapi/design-system/Box' -import { Grid, GridItem } from "@strapi/design-system/Grid"; -import { uniqBy } from 'lodash'; -import { useNavigationManager } from '../../../../hooks/useNavigationManager'; - -const submitIcon = ; -const pickDefaultLocaleNavigation = ({ activeNavigation, config }) => config.i18nEnabled - ? activeNavigation - ? activeNavigation.localeCode === config.defaultLocale - ? activeNavigation - : activeNavigation?.localizations.find( - ({ localeCode }) => localeCode === config.defaultLocale - ) - : null - : activeNavigation; - -const NavigationHeader = ({ - activeNavigation, - availableNavigations, - structureHasErrors, - structureHasChanged, - handleChangeSelection, - handleLocalizationSelection, - handleSave, - handleCachePurge, - config, - permissions = {}, -}) => { - const { formatMessage } = useIntl(); - const allLocaleVersions = useMemo( - () => - activeNavigation?.localizations.length && config.i18nEnabled - ? uniqBy([activeNavigation, ...(activeNavigation.localizations ?? [])].sort((a, b) => a.localeCode.localeCompare(b.localeCode)), 'id') - : [], - [activeNavigation, config] - ); - const hasLocalizations = config.i18nEnabled && allLocaleVersions.length; - const passedActiveNavigation = pickDefaultLocaleNavigation({ activeNavigation, config }); - const { closeNavigationManagerModal, openNavigationManagerModal, navigationManagerModal } = useNavigationManager(); - const { canUpdate } = permissions; - - return ( - }> - { - activeNavigation - ? formatMessage( - getTrad('header.meta'), - { - id: activeNavigation?.id, - key: activeNavigation?.slug - }) - : null - } - - } - primaryAction={ - - - {/* TODO: Reorganise to use flex */} - - {!hasLocalizations ? () : null} - {canUpdate && ( - - )} - - - - {hasLocalizations - ? - - - : null - } - {canUpdate && ( - - )} - {config.isCacheEnabled && ( - - )} - - - {canUpdate && navigationManagerModal} - - } - title={formatMessage({ - id: getTrad('header.title'), - defaultMessage: 'UI Navigation', - })} - subtitle={formatMessage({ - id: getTrad('header.description'), - defaultMessage: 'Define your portal navigation', - })} - /> - ); -}; - -export default NavigationHeader; diff --git a/admin/src/pages/View/components/NavigationItemForm/index.tsx b/admin/src/pages/View/components/NavigationItemForm/index.tsx deleted file mode 100644 index 4b55d736..00000000 --- a/admin/src/pages/View/components/NavigationItemForm/index.tsx +++ /dev/null @@ -1,686 +0,0 @@ -import { FormikProps, useFormik } from 'formik'; -import { find, first, get, isEmpty, isEqual, isNil, isObject, isString, sortBy } from 'lodash'; -import { prop } from 'lodash/fp'; -import React, { useCallback, useEffect, useMemo, useState } from 'react'; - -//@ts-ignore -import { ModalBody } from '@strapi/design-system/ModalLayout'; -//@ts-ignore -import { Option, Select } from '@strapi/design-system/Select'; -//@ts-ignore -import { Grid, GridItem } from '@strapi/design-system/Grid'; -import { GenericInput } from '@strapi/helper-plugin'; -//@ts-ignore -import { Button } from '@strapi/design-system/Button'; - -import { Id } from 'strapi-typed'; -import { Audience, Effect, NavigationItemAdditionalField, NavigationItemType, ToBeFixed, assertString } from '../../../../../../types'; -import AdditionalFieldInput from '../../../../components/AdditionalFieldInput'; -import { getTrad, getTradId } from '../../../../translations'; -import { ResourceState, getDefaultCustomFields, getMessage, navigationItemType } from '../../../../utils'; -import { checkFormValidity } from '../../utils/form'; -import { extractRelatedItemLabel } from '../../utils/parsers'; -import { GenericInputOnChangeInput } from '../../utils/types'; -import { NavigationItemPopupFooter } from '../NavigationItemPopup/NavigationItemPopupFooter'; -import { ContentTypeSearchQuery, NavigationItemFormData, NavigationItemFormProps, RawFormPayload, SanitizedFormPayload, Slugify } from './types'; -import * as formDefinition from './utils/form'; - -const NavigationItemForm: React.FC = ({ - config, - availableLocale, - isLoading: isPreloading, - inputsPrefix, - data, - contentTypes = [], - contentTypeEntities = [], - usedContentTypeEntities = [], - availableAudience = [], - additionalFields = [], - contentTypesNameFields = {}, - onSubmit, - onCancel, - getContentTypeEntities, - usedContentTypesData, - appendLabelPublicationStatus = appendLabelPublicationStatusFallback, - locale, - readNavigationItemFromLocale, - slugify, - permissions = {}, -}) => { - const [isLoading, setIsLoading] = useState(isPreloading); - const [hasBeenInitialized, setInitializedState] = useState(false); - const [hasChanged, setChangedState] = useState(false); - const [contentTypeSearchQuery, setContentTypeSearchQuery] = useState(undefined); - const { canUpdate } = permissions; - const formik: FormikProps = useFormik({ - initialValues: formDefinition.defaultValues, - onSubmit: loadingAware( - async (payload) => onSubmit( - await sanitizePayload(slugify, payload, data) - ), - setIsLoading - ), - validate: loadingAware( - async (values) => checkFormValidity( - await sanitizePayload(slugify, values, {}), - formDefinition.schemaFactory(isSingleSelected, additionalFields) - ), - setIsLoading - ), - validateOnChange: false, - }); - const initialRelatedTypeSelected = get(data, 'relatedType.value'); - const relatedTypeSelectValue = formik.values.relatedType; - const relatedSelectValue = formik.values.related; - const isI18nBootstrapAvailable = !!(config.i18nEnabled && availableLocale && availableLocale.length); - const availableLocaleOptions = useMemo(() => availableLocale.map((locale, index) => ({ - key: `${locale}-${index}`, - value: locale, - label: locale, - metadatas: { - intlLabel: { - id: `i18n.locale.${locale}`, - defaultMessage: locale, - }, - hidden: false, - disabled: false, - }, - })), [availableLocale]); - - const relatedFieldName = `${inputsPrefix}related`; - - if (!hasBeenInitialized && !isEmpty(data)) { - setInitializedState(true); - formik.setValues({ - autoSync: get(data, "autoSync", formDefinition.defaultValues.autoSync) ?? true, - type: get(data, "type", formDefinition.defaultValues.type), - related: get(data, "related.value", formDefinition.defaultValues.related), - relatedType: get(data, "relatedType.value", formDefinition.defaultValues.relatedType), - audience: get(data, "audience", formDefinition.defaultValues.audience).map((item: Audience | Id) => isObject(item) ? item.id.toString() : item.toString()), - additionalFields: getDefaultCustomFields({ - additionalFields, - customFieldsValues: get(data, "additionalFields", [] as ToBeFixed), - defaultCustomFieldsValues: formDefinition.defaultValues.additionalFields - }), - menuAttached: get(data, "menuAttached", formDefinition.defaultValues.menuAttached), - path: get(data, "path", formDefinition.defaultValues.path), - externalPath: get(data, "externalPath", formDefinition.defaultValues.externalPath), - title: get(data, "title", formDefinition.defaultValues.title), - updated: formDefinition.defaultValues.updated, - }); - } - - const audienceOptions = useMemo(() => availableAudience.map((item) => ({ - value: get(item, 'id', " "), - label: get(item, 'name', " "), - })), [availableAudience]); - - const generatePreviewPath = () => { - if (!isExternal) { - const itemPath = isEmpty(formik.values.path) || formik.values.path === '/' - ? getDefaultPath() - : formik.values.path || ""; - - const value = `${data.levelPath !== '/' ? `${data.levelPath}` : ''}/${itemPath}`; - - return { - id: getTradId('popup.item.form.type.external.description'), - defaultMessage: '', - values: { value } - } - } - - return undefined; - }; - - const getDefaultTitle = - useCallback((related: string | undefined, relatedType: string | undefined, isSingleSelected: boolean) => { - let selectedEntity; - if (isSingleSelected) { - selectedEntity = contentTypeEntities.find(_ => (_.uid === relatedType) || (_.__collectionUid === relatedType)); - if (!selectedEntity) { - return contentTypes.find(_ => _.uid === relatedType)?.label - } - } else { - selectedEntity = { - ...contentTypeEntities.find(_ => _.id === related), - __collectionUid: relatedType - }; - } - return extractRelatedItemLabel(selectedEntity, contentTypesNameFields, { contentTypes }); - }, [contentTypeEntities, contentTypesNameFields, contentTypes]); - - const sanitizePayload = async (slugify: Slugify, payload: RawFormPayload, data: Partial): Promise => { - const { related, relatedType, menuAttached, type, ...purePayload } = payload; - const relatedId = related; - const singleRelatedItem = isSingleSelected ? first(contentTypeEntities) : undefined; - const relatedCollectionType = relatedType; - const title = !!payload.title?.trim() - ? payload.title - : getDefaultTitle(related, relatedType, isSingleSelected) - const uiRouterKey = await generateUiRouterKey(slugify, title, relatedId, relatedCollectionType); - - return { - ...data, - ...purePayload, - title, - type, - menuAttached: isNil(menuAttached) ? false : menuAttached, - path: type !== navigationItemType.EXTERNAL ? purePayload.path || getDefaultPath() : undefined, - externalPath: type === navigationItemType.EXTERNAL ? purePayload.externalPath : undefined, - related: type === navigationItemType.INTERNAL ? relatedId : undefined, - relatedType: type === navigationItemType.INTERNAL ? relatedCollectionType : undefined, - isSingle: isSingleSelected, - singleRelatedItem, - uiRouterKey, - }; - }; - - const onChange = ({ name, value }: { name: string, value: unknown }) => { - formik.setValues(prevState => ({ - ...prevState, - updated: true, - [name]: value, - })); - - if (name === "related" && relatedTypeSelectValue && formik.values.autoSync) { - const { contentTypesNameFields, pathDefaultFields } = config; - const selectedRelated = contentTypeEntities.find(({ id, __collectionUid }) => - `${id}` === `${value}` && __collectionUid === relatedTypeSelectValue - ); - const newPath = pathDefaultFields[relatedTypeSelectValue]?.reduce((acc, field) => { - return acc ? acc : selectedRelated?.[field] as string | null; - }, null); - const newTitle = (contentTypesNameFields[relatedTypeSelectValue] ?? []).concat(contentTypesNameFields.default || []).reduce((acc, field) => { - return acc ? acc : selectedRelated?.[field] as string | null; - }, null); - const batch = []; - - if (newPath) { - batch.push({ name: "path", value: newPath }); - } - - if (newTitle) { - batch.push({ name: "title", value: newTitle }); - } - - batch.forEach((next, i) => { - setTimeout(() => { - onChange(next); - }, i * 100); - }); - } - - if (name === "type") { - formik.setErrors({}); - } - if (!hasChanged) { - setChangedState(true); - } - }; - - const getDefaultPath: () => string = useCallback(() => { - if (formik.values.type !== "INTERNAL") return ""; - assertString(relatedTypeSelectValue); - - const pathDefaultFields = get(config, ["pathDefaultFields", relatedTypeSelectValue], []); - if (isEmpty(formik.values.path) && !isEmpty(pathDefaultFields)) { - const selectedEntity = isSingleSelected - ? first(contentTypeEntities) - : contentTypeEntities.find(i => String(i.id) === relatedSelectValue); - const pathDefaultValues = pathDefaultFields - .map((field) => get(selectedEntity, field, "")) - .filter(value => !isNil(value) && String(value).match(/^\S+$/)); - return String(first(pathDefaultValues) || ""); - } - return ""; - }, [relatedTypeSelectValue, formik, config]); - - const onAudienceChange = useCallback((value: string) => { - onChange({ name: "audience", value }); - }, [onChange]); - - const onAdditionalFieldChange = (name: string, newValue: string | boolean | string[], fieldType: string) => { - const fieldsValue = formik.values.additionalFields; - const value = { - ...fieldsValue, - [name]: fieldType === "media" && newValue ? JSON.stringify(newValue) : newValue - } - onChange({ - name: "additionalFields", - value, - }); - } - - const generateUiRouterKey = async (slugify: Slugify, title: string, related?: string, relatedType?: string): Promise => { - if (title) { - return isString(title) && !isEmpty(title) ? await slugify(title).then(prop("slug")) : undefined; - } else if (related) { - const relationTitle = extractRelatedItemLabel({ - ...contentTypeEntities.find(_ => String(_.id) === String(related)), - __collectionUid: relatedType - }, contentTypesNameFields, { contentTypes }); - return isString(relationTitle) && !isEmpty(relationTitle) ? await slugify(relationTitle).then(prop("slug")) : undefined; - } - return undefined; - }; - - const isSingleSelected = useMemo( - () => relatedTypeSelectValue ? contentTypes.find(_ => _.uid === relatedTypeSelectValue)?.isSingle || false : false, - [relatedTypeSelectValue, contentTypes], - ); - - const navigationItemTypeOptions = (Object.keys(navigationItemType) as NavigationItemType[]).map((key) => { - const value = navigationItemType[key].toLowerCase(); - return { - key, - value: navigationItemType[key], - metadatas: { - intlLabel: { - id: getTradId(`popup.item.form.type.${value}.label`), - defaultMessage: getTradId(`popup.item.form.type.${value}.label`), - }, - hidden: false, - disabled: false, - } - } - }); - - // TODO?: useMemo - const relatedSelectOptions = sortBy(contentTypeEntities - .filter((item) => { - const usedContentTypeEntitiesOfSameType = usedContentTypeEntities - .filter(uctItem => relatedTypeSelectValue === uctItem.__collectionUid); - return !find(usedContentTypeEntitiesOfSameType, uctItem => (item.id === uctItem.id && uctItem.id !== formik.values.related)); - }) - .map((item) => { - const label = appendLabelPublicationStatus( - extractRelatedItemLabel({ - ...item, - __collectionUid: get(relatedTypeSelectValue, 'value', relatedTypeSelectValue), - }, contentTypesNameFields, { contentTypes }), - item - ); - return ({ - key: get(item, 'id').toString(), - metadatas: { - intlLabel: { - id: label || `${item.__collectionUid} ${item.id}`, - defaultMessage: label || `${item.__collectionUid} ${item.id}`, - }, - hidden: false, - disabled: false, - }, - value: item.id.toString(), - label: label, - }) - }), item => item.metadatas.intlLabel.id); - - const isExternal = formik.values.type === navigationItemType.EXTERNAL; - const pathSourceName = isExternal ? 'externalPath' : 'path'; - - const submitDisabled = - (formik.values.type === navigationItemType.INTERNAL && !isSingleSelected && isNil(formik.values.related)) || isLoading; - - const onChangeRelatedType = ({ target: { name, value } }: { target: { name: string, value: unknown } }) => { - const relatedTypeBeingReverted = data.relatedType && (data.relatedType.value === get(value, 'value', value)); - setContentTypeSearchQuery(undefined); - formik.setValues(prevState => ({ - ...prevState, - updated: true, - related: relatedTypeBeingReverted ? data.related?.value : undefined, - [name]: value, - })); - - if (!hasChanged) { - setChangedState(true); - } - }; - - const relatedTypeSelectOptions = useMemo( - () => sortBy(contentTypes - .filter((contentType) => { - if (contentType.isSingle) { - if (relatedTypeSelectValue && [relatedTypeSelectValue, initialRelatedTypeSelected].includes(contentType.uid)) { - return true; - } - return !usedContentTypesData.some((_: ToBeFixed) => _.__collectionUid === contentType.uid && _.__collectionUid !== formik.values.relatedType); - } - return true; - }) - .map((item) => ({ - key: get(item, 'uid'), - metadatas: { - intlLabel: { - id: get(item, 'label', get(item, 'name')), - defaultMessage: get(item, 'label', get(item, 'name')), - }, - disabled: false, - hidden: false, - }, - value: get(item, 'uid'), - label: get(item, 'label', get(item, 'name')), - })), item => item.metadatas.intlLabel.id), - [contentTypes, usedContentTypesData, relatedTypeSelectValue], - ); - - const thereAreNoMoreContentTypes = isEmpty(relatedSelectOptions) && !contentTypeSearchQuery; - - useEffect( - () => { - const value = get(relatedSelectOptions, '0'); - if (isSingleSelected && relatedSelectOptions.length === 1 && !isEqual(value, relatedSelectValue)) { - onChange({ name: "related", value }); - } - }, - [isSingleSelected, relatedSelectOptions], - ); - - useEffect(() => { - const value = formik.values.relatedType; - if (value) { - const item = find( - contentTypes, - (_) => _.uid === value, - ); - if (item) { - getContentTypeEntities({ - modelUID: item.uid, - query: contentTypeSearchQuery, - locale, - }, item.plugin); - } - } - }, [formik.values.relatedType, contentTypeSearchQuery]); - - const resetCopyItemFormErrors = () => { - formik.setErrors({ - ...formik.errors, - [itemLocaleCopyField]: null, - }); - } - const itemLocaleCopyField = `${inputsPrefix}i18n.locale`; - const itemLocaleCopyValue = get(formik.values, itemLocaleCopyField); - const onCopyFromLocale = useCallback(async (event: React.BaseSyntheticEvent) => { - event.preventDefault(); - event.stopPropagation(); - - setIsLoading(true); - resetCopyItemFormErrors(); - - try { - const result = await readNavigationItemFromLocale({ - locale: itemLocaleCopyValue, - structureId: data.structureId - }); - - if (result.type === ResourceState.RESOLVED) { - const { value: { related, ...rest } } = result; - - formik.setValues((prevState) => ({ - ...prevState, - ...rest, - })); - - if (related) { - const relatedType = relatedTypeSelectOptions - .find(({ value }) => value === related.__contentType)?.value; - - formik.setValues((prevState) => ({ - ...prevState, - relatedType, - [relatedFieldName]: related.id, - })); - } - } - - if (result.type === ResourceState.ERROR) { - formik.setErrors({ - ...formik.errors, - [itemLocaleCopyField]: getMessage(result.errors[0]), - }); - } - } catch (error) { - formik.setErrors({ - ...formik.errors, - [itemLocaleCopyField]: getMessage('popup.item.form.i18n.locale.error.generic'), - }); - } - - setIsLoading(false); - }, [setIsLoading, formik.setValues, formik.setErrors]); - - const onChangeLocaleCopy = useCallback(({ target: { value } }: GenericInputOnChangeInput) => { - resetCopyItemFormErrors(); - onChange({ name: itemLocaleCopyField, value }) - }, [onChange, itemLocaleCopyField]); - - const itemCopyProps = useMemo(() => ({ - intlLabel: { - id: getTradId('popup.item.form.i18n.locale.label'), - defaultMessage: 'Copy details from' - }, - placeholder: { - id: getTradId('popup.item.form.i18n.locale.placeholder'), - defaultMessage: 'locale' - }, - }), [getTradId]); - - useEffect(() => { - const value = formik.values.relatedType; - const fetchContentTypeEntities = async () => { - if (value) { - const item = find( - contentTypes, - (_) => _.uid === value, - ); - if (item) { - await getContentTypeEntities({ - modelUID: item.uid, - query: contentTypeSearchQuery, - locale, - }, item.plugin); - } - } - }; - fetchContentTypeEntities(); - }, [formik.values.relatedType, contentTypeSearchQuery]); - - return ( - <> -
- - - - onChange({ name, value })} - value={formik.values.title} - /> - - - onChange({ name, value })} - value={formik.values.type} - /> - - - onChange({ name, value })} - value={formik.values.menuAttached} - disabled={!canUpdate || (config.cascadeMenuAttached ? !(data.isMenuAllowedLevel && data.parentAttachedToMenu) : false)} - /> - - - onChange({ name, value })} - value={formik.values[pathSourceName]} - description={generatePreviewPath()} - /> - - {formik.values.type === navigationItemType.INTERNAL && ( - <> - - onChange({ name, value })} - value={formik.values.autoSync} - /> - - - - - {formik.values.relatedType && !isSingleSelected && ( - - onChange({ name, value })} - options={relatedSelectOptions} - value={formik.values.related} - disabled={isLoading || thereAreNoMoreContentTypes || !canUpdate} - description={ - !isLoading && thereAreNoMoreContentTypes - ? { - id: getTradId('popup.item.form.related.empty'), - defaultMessage: 'There are no more entities', - values: { contentTypeName: relatedTypeSelectValue }, - } - : undefined - } - /> - - )} - - )} - {additionalFields.map((additionalField: NavigationItemAdditionalField) => { - if (additionalField === 'audience') { - return ( - - - - ) - } else { - return ( - - - - ); - } - })} - - { - isI18nBootstrapAvailable ? ( - - - - - {canUpdate && ( - - )} - - ) : null - } - -
- - - ); -}; - -const appendLabelPublicationStatusFallback = () => ""; - -const loadingAware = - (action: (i: T) => U, isLoading: Effect) => - async (input: T) => { - try { - isLoading(true); - - return await action(input); - } catch (_) { - } finally { - isLoading(false); - } - }; - -export default NavigationItemForm; diff --git a/admin/src/pages/View/components/NavigationItemForm/types.ts b/admin/src/pages/View/components/NavigationItemForm/types.ts deleted file mode 100644 index ff86882c..00000000 --- a/admin/src/pages/View/components/NavigationItemForm/types.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { - Audience, - Effect, - ContentTypeEntity, - NavigationItemAdditionalField, - NavigationItemAdditionalFieldValues, - NavigationItemType, - NavigationPluginConfig, - PluginConfigNameFields, - PluginPermissions, - ToBeFixed, - VoidEffect -} from '../../../../../../types'; -import { Id } from 'strapi-typed'; -import { StrapiContentTypeSchema } from '../../../SettingsPage/types'; - -export type FormEventTarget = { - name: string, - value: TValue -} - -type GetContentTypeEntitiesPayload = { - modelUID: string; - query: ContentTypeSearchQuery; - locale: ToBeFixed; -} - -export type NavigationItemFormData = { - isMenuAllowedLevel: boolean; - levelPath: string; - parentAttachedToMenu: boolean; - audience?: Audience[]; - collapsed?: boolean; - externalPath?: string | null; - id?: Id; - isParentAttachedToMenu?: boolean; - items?: ToBeFixed[]; - menuAttached?: boolean; - order?: number; - parent?: ToBeFixed; - path?: string | null; - title?: string; - type?: NavigationItemType; - uiRouterKey?: string; - updated?: boolean; - viewId?: string; - viewParentId: string | null; - related?: { - value: string; - label: string; - }; - relatedType?: { - value: string; - label: string; - }; - relatedRef?: ToBeFixed; - structureId: ToBeFixed; - additionalFields?: ToBeFixed; -} - -export type NavigationItemFormProps = { - additionalFields: NavigationItemAdditionalField[]; - appendLabelPublicationStatus: (label: string, entity: ContentTypeEntity) => string; - availableAudience: string[]; - contentTypeEntities: ContentTypeEntity[]; - contentTypes: StrapiContentTypeSchema[]; - contentTypesNameFields: PluginConfigNameFields; - data: NavigationItemFormData; - getContentTypeEntities: (value: GetContentTypeEntitiesPayload, plugin: string) => ContentTypeEntity; - isLoading: boolean; - locale: string; - onCancel: VoidEffect; - onSubmit: Effect; - usedContentTypeEntities: ToBeFixed[]; - usedContentTypesData: ToBeFixed; - config: NavigationPluginConfig; - availableLocale: string[]; - readNavigationItemFromLocale: ToBeFixed; - inputsPrefix: string; - slugify: (q: string) => Promise<{slug: string}> - permissions: Partial; -} - -export type ContentTypeSearchQuery = ToBeFixed; -export type RawFormPayload = { - type: NavigationItemType; - autoSync?: boolean; - related?: string; - relatedType?: string; - audience: Id[]; - menuAttached: boolean; - title: string; - externalPath: string | null; - path: string | null; - additionalFields: NavigationItemAdditionalFieldValues; // { cf_name: cf_value } - updated: boolean; -} - -export type SanitizedFormPayload = { - title: string; - type: NavigationItemType; - menuAttached: boolean; - path?: string | null; - externalPath?: string | null; - related: Id | undefined; - relatedType: string | undefined; - isSingle: boolean; - singleRelatedItem: ContentTypeEntity | undefined; - uiRouterKey: string | undefined; -} - -export type Slugify = (q: string) => Promise<{ - slug: string; -}>; diff --git a/admin/src/pages/View/components/NavigationItemForm/utils/form.ts b/admin/src/pages/View/components/NavigationItemForm/utils/form.ts deleted file mode 100644 index aca20bc4..00000000 --- a/admin/src/pages/View/components/NavigationItemForm/utils/form.ts +++ /dev/null @@ -1,104 +0,0 @@ -import * as yup from "yup"; -import { isNil } from "lodash"; -import { translatedErrors } from "@strapi/helper-plugin"; -import { navigationItemType } from "../../../../../utils"; -import { NavigationItemAdditionalField, NavigationItemType } from "../../../../../../../types"; -import { RawFormPayload } from "../types"; -import pluginId from "../../../../../pluginId"; - -const externalPathRegexps = [ - /^mailto:[\w-\.]+@([\w-]+\.)+[\w-]{2,}$/, - /^tel:(\+\d{1,3})?[\s]?(\(?\d{2,3}\)?)?[\s.-]?(\d{3})?[\s.-]?\d{3,4}$/, - /^#.*/, - /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/, -]; - -export const schemaFactory = (isSingleSelected: boolean, additionalFields: NavigationItemAdditionalField[]) => { - return yup.object({ - autoSync: yup.bool().optional(), - title: yup.string() - .when('type', { - is: (val: NavigationItemType) => val !== navigationItemType.INTERNAL, - then: yup.string() - .required(translatedErrors.required), - otherwise: yup.string().notRequired(), - }), - uiRouterKey: yup.string().required(translatedErrors.required), - type: yup.string().required(translatedErrors.required), - path: yup.string() - .when('type', { - is: (val: NavigationItemType) => val !== navigationItemType.EXTERNAL || isNil(val), - then: yup.string().matches(/^\S+$/, "Invalid path string").required(translatedErrors.required), - otherwise: yup.string().notRequired(), - }), - externalPath: yup.string() - .when('type', { - is: (val: NavigationItemType) => val === navigationItemType.EXTERNAL, - then: yup.string() - .required(translatedErrors.required) - .test( - `${pluginId}.popup.item.form.externalPath.validation.type`, - externalPath => - externalPath ? externalPathRegexps.some(re => re.test(externalPath)) : true - ), - otherwise: yup.string().notRequired(), - }), - menuAttached: yup.boolean(), - relatedType: yup.mixed() - .when('type', { - is: (val: NavigationItemType) => val === navigationItemType.INTERNAL || isNil(val), - then: yup.string().required(translatedErrors.required).min(1, translatedErrors.required), - otherwise: yup.mixed().notRequired(), - }), - related: yup.mixed() - .when('type', { - is: (val: NavigationItemType) => val === navigationItemType.INTERNAL || isNil(val), - then: isSingleSelected ? yup.mixed().notRequired() : yup.string().required(translatedErrors.required).min(1, translatedErrors.required), - otherwise: yup.mixed().notRequired(), - }), - additionalFields: yup.object({ - ...additionalFields.reduce((acc, current) => { - var value; - if (typeof current === 'string') - return acc; - - if (current.type === 'boolean') - value = yup.bool(); - else if (current.type === 'string') - value = yup.string(); - else if (current.type === 'select' && current.multi) - value = yup.array().of(yup.string()); - else if (current.type === 'select' && !current.multi) - value = yup.string(); - else if (current.type === 'media') - value = yup.mixed(); - else - throw new Error(`Type "${current.type}" is unsupported by custom fields`); - - if (current.required) - value = value.required(translatedErrors.required); - else - value = value.notRequired(); - - return { ...acc, [current.name]: value } - }, {}) - }) - }); -}; - -export const defaultValues: RawFormPayload = { - autoSync: true, - type: "INTERNAL", - related: "", - relatedType: "", - audience: [], - menuAttached: false, - title: "", - externalPath: "", - path: "", - additionalFields: { - boolean: false, - string: "", - }, - updated: false, -} diff --git a/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js b/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js deleted file mode 100644 index e55c44b6..00000000 --- a/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { Button } from '@strapi/design-system/Button'; -import { ModalFooter } from '@strapi/design-system/ModalLayout'; -import { getMessage } from '../../../../utils'; - -export const NavigationItemPopupFooter = ({ handleCancel, handleSubmit, submitDisabled, formViewId, canUpdate }) => { - if (!canUpdate) { - return null; - } - - return ( - - {getMessage('popup.item.form.button.cancel')} - - } - endActions={ - - } - /> - ); -}; - -NavigationItemPopupFooter.defaultProps = { - onValidate: undefined, - submitDisabled: false, - formViewId: undefined, -}; - -NavigationItemPopupFooter.propTypes = { - handleCancel: PropTypes.func.isRequired, - handleSubmit: PropTypes.func, - submitDisabled: PropTypes.bool, - formViewId: PropTypes.object, - canUpdate: PropTypes.bool, -}; diff --git a/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js b/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js deleted file mode 100644 index 3178e7a4..00000000 --- a/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +++ /dev/null @@ -1,20 +0,0 @@ - - -import React from 'react'; -import { Typography } from '@strapi/design-system/Typography'; -import { ModalHeader } from '@strapi/design-system/ModalLayout'; -import { getMessage } from '../../../../utils'; - -export const NavigationItemPopupHeader = ({isNewItem, canUpdate}) => { - let modalType = 'view'; - if (canUpdate) { - modalType = isNewItem ? 'new' : 'edit'; - } - return ( - - - {getMessage(`popup.item.header.${modalType}`)} - - - ); -}; \ No newline at end of file diff --git a/admin/src/pages/View/components/NavigationItemPopup/index.js b/admin/src/pages/View/components/NavigationItemPopup/index.js deleted file mode 100644 index 66d476ba..00000000 --- a/admin/src/pages/View/components/NavigationItemPopup/index.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * - * NavigationItemPopUp - * - */ - -import React, { useMemo } from 'react'; -import PropTypes from 'prop-types'; -import { find } from 'lodash'; - -//Design System -import { ModalLayout } from '@strapi/design-system/ModalLayout'; - -import NavigationItemForm from '../NavigationItemForm'; -import { extractRelatedItemLabel, isRelationCorrect, isRelationPublished } from '../../utils/parsers'; -import { NavigationItemPopupHeader } from './NavigationItemPopupHeader'; -import { getMessage, navigationItemType } from '../../../../utils'; - -const NavigationItemPopUp = ({ - availableLocale, - isOpen, - isLoading, - data, - config = {}, - onSubmit, - onClose, - usedContentTypeItems, - getContentTypeItems, - usedContentTypesData, - locale, - readNavigationItemFromLocale, - slugify, - permissions = {}, -}) => { - const handleOnSubmit = (payload) => { - onSubmit(payload); - }; - - const { related, relatedType } = data; - const { - availableAudience = [], - additionalFields, - contentTypes, - contentTypeItems, - contentTypesNameFields = {}, - } = config; - const { canUpdate } = permissions; - - const appendLabelPublicationStatus = (label = '', item = {}, isCollection = false) => { - const appendix = isRelationPublished({ - relatedRef: item, - type: item.isSingle ? navigationItemType.INTERNAL : item.type, - isCollection, - }) ? '' : `[${getMessage('notification.navigation.item.relation.status.draft')}] `.toUpperCase(); - return `${appendix}${label}`; - }; - - const relatedTypeItem = find(contentTypes, item => item.uid === relatedType); - const prepareFormData = data => { - const relatedItem = find(contentTypeItems, item => item.id === related); - return { - ...data, - type: isRelationCorrect(data) ? data.type : undefined, - related: related && isRelationCorrect(data) ? { - value: related, - label: appendLabelPublicationStatus( - extractRelatedItemLabel({ - ...relatedItem, - __collectionUid: relatedType, - }, contentTypesNameFields, config), - relatedItem, - ), - } : undefined, - relatedType: relatedType && isRelationCorrect(data) ? { - value: relatedType, - label: appendLabelPublicationStatus(relatedTypeItem.label || relatedTypeItem.name, relatedTypeItem, true), - } : undefined, - }; - }; - const preparedData = useMemo(prepareFormData.bind(null, data), [data]); - const hasViewId = !!data.viewId; - - return ( - - - - - - ); -}; - -NavigationItemPopUp.propTypes = { - data: PropTypes.object.isRequired, - config: PropTypes.object.isRequired, - isOpen: PropTypes.bool, - isLoading: PropTypes.bool, - onSubmit: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, - getContentTypeItems: PropTypes.func.isRequired, - locale: PropTypes.string, - readNavigationItemFromLocale: PropTypes.func.isRequired, - slugify: PropTypes.func.isRequired, -}; - -export default NavigationItemPopUp; diff --git a/admin/src/pages/View/components/NavigationManager/AllNavigations/index.tsx b/admin/src/pages/View/components/NavigationManager/AllNavigations/index.tsx deleted file mode 100644 index 3f95110c..00000000 --- a/admin/src/pages/View/components/NavigationManager/AllNavigations/index.tsx +++ /dev/null @@ -1,266 +0,0 @@ -// @ts-ignore -import { BaseCheckbox } from "@strapi/design-system/BaseCheckbox"; -// @ts-ignore -import { Box } from "@strapi/design-system/Box"; -// @ts-ignore -import { Button } from "@strapi/design-system/Button"; -// @ts-ignore -import { Flex } from "@strapi/design-system/Flex"; -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -// @ts-ignore -import { IconButton } from "@strapi/design-system/IconButton"; -// @ts-ignore -import { Table, Tbody, Td, Th, Thead, Tr } from "@strapi/design-system/Table"; -// @ts-ignore -import { Typography } from "@strapi/design-system/Typography"; -import { prop } from "lodash/fp"; -import React, { useCallback, useMemo } from "react"; -import useDataManager from "../../../../../hooks/useDataManager"; -import { getMessage } from "../../../../../utils"; -import { Footer, FooterBase } from "../Footer"; -import { INITIAL_NAVIGATION } from "../NewNavigation"; -import { CommonProps, ListState, Navigation } from "../types"; -import * as icons from "./icons"; - -interface Props extends ListState, CommonProps {} - -export const AllNavigations = ({ navigations, selected, setState }: Props) => { - const { - config: { i18nEnabled, isCacheEnabled }, - } = useDataManager(); - - const hasAnySelected = !!selected.length; - - const toggleSelected = useCallback( - () => - setState({ - navigations, - selected: hasAnySelected ? [] : navigations.map((n) => n), - view: "LIST", - }), - [setState, navigations, hasAnySelected] - ); - - const currentlySelectedSet = useMemo( - () => new Set(selected.map(prop("id"))), - [selected] - ); - - const handleSelect = (navigation: Navigation, isSelected: boolean) => () => { - setState({ - navigations, - selected: isSelected - ? selected.filter(({ id }) => id !== navigation.id) - : selected.concat([navigation]), - view: "LIST", - }); - }; - - const edit = (navigation: Navigation) => () => { - setState({ - view: "EDIT", - navigation, - alreadyUsedNames: navigations.reduce( - (acc, { name }) => - name !== navigation.name ? acc.concat([name]) : acc, - [] - ), - }); - }; - - const _delete = (navigations: Array) => () => { - setState({ - view: "DELETE", - navigations, - }); - }; - - const purgeCache = (navigations: Array) => () => { - setState({ - view: "CACHE_PURGE", - navigations, - }); - }; - - const deleteSelected = useCallback(_delete(selected), [_delete]); - - const purgeSelected = useCallback(purgeCache(selected), [purgeCache]); - - return ( - <> - - - {hasAnySelected ? ( - - - {getMessage({ - id: "popup.navigation.manage.table.hasSelected", - props: { - count: selected.length, - }, - })} - - - {isCacheEnabled ? ( - - ) : null} - - ) : null} - - - - - - - - - {i18nEnabled ? ( - - ) : null} - - - - - - {navigations.map((navigation) => ( - - - - - {i18nEnabled ? ( - - ) : null} - - - - ))} - -
- - - - {getMessage("popup.navigation.manage.table.id")} - - - - {getMessage("popup.navigation.manage.table.name")} - - - - {getMessage("popup.navigation.manage.table.locale")} - - - - {getMessage("popup.navigation.manage.table.visibility")} - - - {isCacheEnabled ? ( - - - - - - ) : null} -
- - - {navigation.id} - - - {navigation.name} - - - - {[navigation.localeCode] - .concat( - navigation.localizations?.map(prop("localeCode")) || [] - ) - .join(", ")} - - - {navigation.visible - ? getMessage("popup.navigation.manage.navigation.visible") - : getMessage("popup.navigation.manage.navigation.hidden")} - - - - - - - - - {isCacheEnabled ? ( - - - - ) : null} - -
- - ); -}; - -export const AllNavigationsFooter: Footer = ({ - onClose, - state, - setState, - navigations, -}) => ( - - setState({ - view: "CREATE", - alreadyUsedNames: navigations.map(({ name }) => name), - current: INITIAL_NAVIGATION, - }), - variant: "default", - disabled: state.isLoading, - children: getMessage("popup.navigation.manage.button.create"), - }} - /> -); diff --git a/admin/src/pages/View/components/NavigationManager/DeletionConfirm/index.tsx b/admin/src/pages/View/components/NavigationManager/DeletionConfirm/index.tsx deleted file mode 100644 index 997ea069..00000000 --- a/admin/src/pages/View/components/NavigationManager/DeletionConfirm/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -// @ts-ignore -import { Button } from "@strapi/design-system/Button"; -// @ts-ignore -import { Flex } from "@strapi/design-system/Flex"; -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -// @ts-ignore -import { Typography } from "@strapi/design-system/Typography"; -import { prop } from "lodash/fp"; -import React from "react"; -import { getMessage } from "../../../../../utils"; -import { Footer, FooterBase } from "../Footer"; -import { CommonProps, DeleteState, Navigation } from "../types"; - -interface Props extends DeleteState, CommonProps {} - -export const DeletionConfirm = ({ navigations }: Props) => ( - - - - - {getMessage("popup.navigation.manage.delete.header")} - - - - - - {renderItems(navigations)} - - - -); - -export const DeleteConfirmFooter: Footer = ({ state, onSubmit, onReset }) => ( - -); - -const renderItems = (navigations: Array) => - navigations.map(prop("name")).join(", "); diff --git a/admin/src/pages/View/components/NavigationManager/ErrorDetails/index.tsx b/admin/src/pages/View/components/NavigationManager/ErrorDetails/index.tsx deleted file mode 100644 index 03dab709..00000000 --- a/admin/src/pages/View/components/NavigationManager/ErrorDetails/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -// @ts-ignore -import { useNotification } from "@strapi/helper-plugin"; -import React, { useEffect } from "react"; -import { getMessage } from "../../../../../utils"; -import { Footer, FooterBase } from "../Footer"; -import { CommonProps, ErrorState } from "../types"; - -interface Props extends ErrorState, CommonProps {} - -export const ErrorDetails = ({ errors }: Props) => { - const toggleNotification = useNotification(); - - useEffect(() => { - errors.map((error) => { - toggleNotification({ - type: "warning", - message: { id: "", defaultMessage: error.message }, - }); - console.error(error); - }); - }, []); - - return ( - - - {getMessage("popup.navigation.manage.error.message")} - - - ); -}; - -export const ErrorDetailsFooter: Footer = ({ onReset }) => ( - -); diff --git a/admin/src/pages/View/components/NavigationManager/Footer/index.tsx b/admin/src/pages/View/components/NavigationManager/Footer/index.tsx deleted file mode 100644 index 7598a604..00000000 --- a/admin/src/pages/View/components/NavigationManager/Footer/index.tsx +++ /dev/null @@ -1,46 +0,0 @@ -// @ts-ignore -import { Button } from "@strapi/design-system/Button"; -// @ts-ignore -import { ModalFooter } from "@strapi/design-system/ModalLayout"; -import React from "react"; -import { VoidEffect } from "../../../../../../../types"; -import { Navigation, SetState, State } from "../types"; - -interface FooterBaseProps { - end?: ActionProps; - start?: ActionProps; -} - -export type Footer = React.FC<{ - navigations: Array; - onClose?: VoidEffect; - onReset: VoidEffect; - onSubmit: VoidEffect; - setState: SetState; - state: State; -}>; - -interface ActionProps { - children: React.ReactNode; - disabled?: boolean; - onClick?: VoidEffect; - variant: "danger" | "secondary" | "tertiary" | "default"; -} - -export const FooterBase: React.FC = ({ start, end }) => ( - -); - -const renderActions = (actions: ActionProps | undefined): React.ReactNode => - actions ? ( - - ) : null; diff --git a/admin/src/pages/View/components/NavigationManager/Form/index.tsx b/admin/src/pages/View/components/NavigationManager/Form/index.tsx deleted file mode 100644 index 14c73231..00000000 --- a/admin/src/pages/View/components/NavigationManager/Form/index.tsx +++ /dev/null @@ -1,144 +0,0 @@ -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -import { Form as BaseForm, GenericInput, GenericInputProps } from "@strapi/helper-plugin"; -// @ts-ignore -import { Formik } from "formik"; -import React, { useCallback, useEffect, useMemo, useState } from "react"; -import { useIntl } from "react-intl"; -import * as yup from "yup"; -import { Effect } from "../../../../../../../types"; -import { getTradId } from "../../../../../translations"; -import { Navigation } from "../types"; -import { get } from "lodash"; -import { GenericInputOnChangeInput } from "../../../utils/types"; - -interface Props { - navigation: Partial; - onChange: Effect; - isLoading?: boolean; - validationSchema: ReturnType; -} - -export const Form = ({ - navigation, - onChange: onChangeBase, - isLoading, - validationSchema, -}: Props) => { - const initialValues: Navigation= { - id: get(navigation, "id", ""), - name: get(navigation, "name", ""), - } - const onChange: GenericInputProps["onChange"] = useCallback( - ({ target: { name, value } }: GenericInputOnChangeInput) => { - onChangeBase({ - ...navigation, - [name]: value, - } as Navigation); - }, - [onChangeBase, navigation] - ); - - const [error, setError] = useState(null); - - const errorProps = useMemo( - () => ({ - name: error?.path === "name" ? error.message : undefined, - visible: error?.path === "visible" ? error.message : undefined, - }), - [error] - ); - - useEffect(() => { - validationSchema - .validate(navigation) - .then(() => setError(null)) - .catch(setError); - }, [navigation, validationSchema, setError]); - - return ( - - - - - - - - - - - - // - ); -}; - -const formProps = { - name: { - intlLabel: { - id: getTradId("popup.navigation.form.name.label"), - defaultMessage: "Name", - }, - placeholder: { - id: getTradId("popup.navigation.form.name.placeholder"), - defaultMessage: "Navigations's name", - }, - }, - visible: { - intlLabel: { - id: getTradId("popup.navigation.form.visible.label"), - defaultMessage: "Visibility", - }, - }, -}; - -export const validationSchemaFactory = ( - alreadyUsedNames: Array, - formatMessage: ReturnType["formatMessage"] -) => - yup.object({ - name: yup - .string() - .notOneOf( - alreadyUsedNames, - formatMessage({ - id: getTradId("popup.navigation.form.validation.name.alreadyUsed"), - }) - ) - .required( - formatMessage({ - id: getTradId("popup.navigation.form.validation.name.required"), - }) - ) - .min( - 2, - formatMessage({ - id: getTradId("popup.navigation.form.validation.name.tooShort"), - }) - ), - visible: yup.boolean().required( - formatMessage({ - id: getTradId("popup.navigation.form.validation.visible.required"), - }) - ), - }); diff --git a/admin/src/pages/View/components/NavigationManager/NavigationUpdate/index.tsx b/admin/src/pages/View/components/NavigationManager/NavigationUpdate/index.tsx deleted file mode 100644 index c9de6322..00000000 --- a/admin/src/pages/View/components/NavigationManager/NavigationUpdate/index.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useCallback, useMemo } from "react"; -import { useIntl } from "react-intl"; -import { Effect } from "../../../../../../../types"; -import { getMessage } from "../../../../../utils"; -import { Footer, FooterBase } from "../Footer"; -import { Form, validationSchemaFactory } from "../Form"; -import { CommonProps, EditState, Navigation } from "../types"; - -interface Props extends EditState, CommonProps {} - -export const NavigationUpdate = ({ - alreadyUsedNames, - current, - isLoading, - navigation: initialValue, - setState, -}: Props) => { - const { formatMessage } = useIntl(); - - const onChange: Effect = useCallback( - (updated) => { - setState({ - view: "EDIT", - alreadyUsedNames, - current: updated, - navigation: initialValue, - }); - }, - [setState, initialValue, alreadyUsedNames] - ); - - const navigation: Partial = useMemo( - () => current ?? initialValue, - [current] - ); - - const validationSchema = useMemo( - () => validationSchemaFactory(alreadyUsedNames, formatMessage), - [alreadyUsedNames] - ); - - return ( -
- ); -}; - -export const NavigationUpdateFooter: Footer = ({ - state, - onSubmit, - onReset, -}) => ( - -); diff --git a/admin/src/pages/View/components/NavigationManager/NewNavigation/index.tsx b/admin/src/pages/View/components/NavigationManager/NewNavigation/index.tsx deleted file mode 100644 index bef0f603..00000000 --- a/admin/src/pages/View/components/NavigationManager/NewNavigation/index.tsx +++ /dev/null @@ -1,75 +0,0 @@ -// @ts-ignore -import { Button } from "@strapi/design-system/Button"; -import React, { useCallback, useMemo } from "react"; -import { useIntl } from "react-intl"; -import { getMessage } from "../../../../../utils"; -import { Footer, FooterBase } from "../Footer"; -import { Form, validationSchemaFactory } from "../Form"; -import { - CommonProps, - CreateState, - Navigation, -} from "../types"; - -interface Props extends CreateState, CommonProps {} - -export const INITIAL_NAVIGATION = { - name: "Navigation", - items: [], - visible: true, -} as unknown as Navigation; - -export const NewNavigation = ({ - setState, - current, - isLoading, - alreadyUsedNames, -}: Props) => { - const { formatMessage } = useIntl(); - - const onSubmit = useCallback( - (updated: Navigation) => { - setState({ - view: "CREATE", - current: updated, - alreadyUsedNames, - }); - }, - [setState] - ); - - const validationSchema = useMemo( - () => validationSchemaFactory(alreadyUsedNames, formatMessage), - [alreadyUsedNames] - ); - - return ( - - ); -}; - -export const NewNavigationFooter: Footer = ({ - state, - onSubmit, - onReset, -}) => ( - -); diff --git a/admin/src/pages/View/components/NavigationManager/PurgeCacheConfirm/index.tsx b/admin/src/pages/View/components/NavigationManager/PurgeCacheConfirm/index.tsx deleted file mode 100644 index fbd63796..00000000 --- a/admin/src/pages/View/components/NavigationManager/PurgeCacheConfirm/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -// @ts-ignore -import { Button } from "@strapi/design-system/Button"; -// @ts-ignore -import { Flex } from "@strapi/design-system/Flex"; -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -// @ts-ignore -import { Typography } from "@strapi/design-system/Typography"; -import { prop } from "lodash/fp"; -import React from "react"; -import { getMessage } from "../../../../../utils"; -import { Footer, FooterBase } from "../Footer"; -import { CommonProps, Navigation, PurgeCacheState } from "../types"; - -interface Props extends PurgeCacheState, CommonProps {} - -export const PurgeCacheConfirm = ({ navigations }: Props) => ( - - - - - {getMessage("popup.navigation.manage.purge.header")} - - - - - - {renderItems(navigations)} - - - -); - -export const PurgeCacheConfirmFooter: Footer = ({ state, onSubmit, onReset }) => ( - -); - -const renderItems = (navigations: Array) => - navigations.map(prop("name")).join(", "); diff --git a/admin/src/pages/View/components/NavigationManager/index.tsx b/admin/src/pages/View/components/NavigationManager/index.tsx deleted file mode 100644 index a9507dcd..00000000 --- a/admin/src/pages/View/components/NavigationManager/index.tsx +++ /dev/null @@ -1,229 +0,0 @@ -// @ts-ignore -import { Flex } from "@strapi/design-system/Flex"; -// @ts-ignore -import { Loader } from "@strapi/design-system/Loader"; -import { - ModalBody, - ModalHeader, - ModalLayout, - // @ts-ignore -} from "@strapi/design-system/ModalLayout"; -import { sortBy } from "lodash"; -import { prop } from "lodash/fp"; -import React, { useCallback, useEffect, useMemo, useState } from "react"; -import { useIntl } from "react-intl"; -import { VoidEffect } from "../../../../../../types"; -import useDataManager from "../../../../hooks/useDataManager"; -import { getMessage } from "../../../../utils"; -import { AllNavigations, AllNavigationsFooter } from "./AllNavigations"; -import { DeleteConfirmFooter, DeletionConfirm } from "./DeletionConfirm"; -import { ErrorDetails, ErrorDetailsFooter } from "./ErrorDetails"; -import { Footer } from "./Footer"; -import { NavigationUpdate, NavigationUpdateFooter } from "./NavigationUpdate"; -import { NewNavigation, NewNavigationFooter } from "./NewNavigation"; -import { SetState, State } from "./types"; -import { - PurgeCacheConfirm, - PurgeCacheConfirmFooter, -} from "./PurgeCacheConfirm"; - -interface Props { - initialState: State; - isOpened?: boolean; - onClose?: VoidEffect; -} - -export const NavigationManager = ({ - initialState, - isOpened, - onClose, -}: Props) => { - const { formatMessage } = useIntl(); - const [state, setState] = useState(initialState); - - const { - items = [], - handleNavigationsDeletion, - handleNavigationsPurge, - handleSubmitNavigation, - hardReset, - } = useDataManager(); - - const navigations = useMemo(() => sortBy(items, "id"), [items]); - - const onReset = useCallback(() => setState({ view: "INITIAL" }), [setState]); - - const onSubmit = useCallback(async () => { - const performAction = - state.view === "DELETE" - ? async () => { - await handleNavigationsDeletion(state.navigations.map(prop("id"))); - await hardReset(); - } - : (state.view === "CREATE" || state.view === "EDIT") && state.current - ? async () => { - await handleSubmitNavigation(formatMessage, state.current); - await hardReset(); - } - : state.view === "CACHE_PURGE" - ? async () => { - await handleNavigationsPurge(state.navigations.map(prop("id")), true, true); - await hardReset(); - } - : () => {}; - - try { - setState({ - ...state, - isLoading: true, - }); - await performAction(); - setState({ view: "INITIAL" }); - } catch (error) { - setState({ - view: "ERROR", - errors: error instanceof Error ? [error] : [], - }); - } - }, [ - state, - setState, - hardReset, - handleSubmitNavigation, - handleNavigationsDeletion, - ]); - - useEffect(() => { - if (state.view === "INITIAL") { - setState({ - view: "LIST", - navigations, - selected: [], - }); - } - }, [state.view]); - - const header = renderHeader(state); - const content = renderContent(state, setState); - const footer = renderFooter({ - state, - setState, - onClose, - onSubmit, - onReset, - navigations, - }); - - return ( - - {header} - {content} - {footer} - - ); -}; - -const renderHeader = (state: State) => { - switch (state.view) { - case "LIST": - case "CREATE": - case "ERROR": - case "CACHE_PURGE": - case "DELETE": { - return ( - - {state.isLoading ? : null} - {getMessage(`popup.navigation.manage.header.${state.view}`)} - - ); - } - case "EDIT": { - return ( - - {state.isLoading ? : null} - {getMessage({ - id: "popup.navigation.manage.header.EDIT", - props: { - name: state.navigation.name, - }, - })} - - ); - } - case "INITIAL": { - return null; - } - default: - return handleUnknownState(state); - } -}; - -const renderContent = (state: State, setState: SetState) => { - const commonProps = { - setState, - }; - - switch (state.view) { - case "LIST": { - return ; - } - case "EDIT": { - return ; - } - case "CREATE": { - return ; - } - case "DELETE": { - return ; - } - case "CACHE_PURGE": { - return ; - } - case "INITIAL": { - return ; - } - case "ERROR": { - return ; - } - default: - return handleUnknownState(state); - } -}; - -const renderFooter: Footer = (props) => { - switch (props.state.view) { - case "LIST": { - return ; - } - case "CREATE": { - return ; - } - case "EDIT": { - return ; - } - case "DELETE": { - return ; - } - case "CACHE_PURGE": { - return ; - } - case "ERROR": { - return ; - } - case "INITIAL": { - return null; - } - default: - return handleUnknownState(props.state); - } -}; - -const handleUnknownState = (state: any) => { - console.warn(`Unknown state "${state?.view}". (${JSON.stringify(state)})`); - - return null; -}; diff --git a/admin/src/pages/View/index.js b/admin/src/pages/View/index.js deleted file mode 100644 index 490bf149..00000000 --- a/admin/src/pages/View/index.js +++ /dev/null @@ -1,417 +0,0 @@ -/* - * - * Navigation View - * - */ - -import React, { memo, useCallback, useMemo, useState, useEffect } from 'react'; -import { useIntl } from "react-intl"; -import { isEmpty, get } from "lodash"; - -// Design System -import { Main } from '@strapi/design-system/Main'; -import { Flex } from '@strapi/design-system/Flex'; -import { ContentLayout } from '@strapi/design-system/Layout'; -import { Typography } from '@strapi/design-system/Typography'; -import { Box } from '@strapi/design-system/Box'; -import { Icon } from '@strapi/design-system/Icon'; -import { Button } from '@strapi/design-system/Button'; -import { Select, Option } from '@strapi/design-system/Select'; -// @ts-ignore -import { Grid, GridItem } from "@strapi/design-system/Grid"; -import { LoadingIndicatorPage, useNotification, useRBAC } from "@strapi/helper-plugin"; -import EmptyDocumentsIcon from '@strapi/icons/EmptyDocuments'; -import PlusIcon from "@strapi/icons/Plus"; - -import pluginPermissions from '../../permissions'; - -// Components -import List from '../../components/NavigationItemList'; -import NavigationContentHeader from './components/NavigationContentHeader'; -import NavigationHeader from './components/NavigationHeader'; -import NavigationItemPopUp from "./components/NavigationItemPopup"; -import { useI18nCopyNavigationItemsModal } from '../../hooks/useI18nCopyNavigationItemsModal'; -import Search from '../../components/Search'; -import useDataManager from "../../hooks/useDataManager"; -import { getTrad } from '../../translations'; -import { - transformItemToViewPayload, - transformToRESTPayload, - usedContentTypes, - validateNavigationStructure, -} from './utils/parsers'; -import NoAcccessPage from '../NoAccessPage'; - -const View = () => { - const toggleNotification = useNotification(); - const { - items: availableNavigations, - activeItem: activeNavigation, - changedActiveItem: changedActiveNavigation, - config, - navigationItemPopupOpened, - isLoading, - isLoadingForAdditionalDataToBeSet, - isLoadingForSubmit, - handleChangeNavigationItemPopupVisibility, - handleChangeSelection, - handleChangeNavigationData, - handleResetNavigationData, - handleSubmitNavigation, - handleLocalizationSelection, - handleI18nCopy, - getContentTypeItems, - error, - availableLocale: allAvailableLocale, - readNavigationItemFromLocale, - slugify, - permissions, - handleNavigationsPurge, - } = useDataManager(); - - const { canAccess, canUpdate } = permissions; - - const availableLocale = useMemo( - () => allAvailableLocale.filter(locale => locale !== changedActiveNavigation?.localeCode), - [changedActiveNavigation, allAvailableLocale] - ); - const { i18nCopyItemsModal, i18nCopySourceLocale, setI18nCopyModalOpened, setI18nCopySourceLocale } = useI18nCopyNavigationItemsModal( - useCallback((sourceLocale) => { - const source = activeNavigation?.localizations?.find(({ localeCode }) => localeCode === sourceLocale); - - if (source) { - handleI18nCopy(source.id, activeNavigation?.id); - } - }, [activeNavigation, handleI18nCopy]) - ); - const openI18nCopyModalOpened = useCallback(() => { i18nCopySourceLocale && setI18nCopyModalOpened(true) }, [setI18nCopyModalOpened, i18nCopySourceLocale]); - - const [activeNavigationItem, setActiveNavigationItemState] = useState({}); - const { formatMessage } = useIntl(); - - const [{ value: searchValue, index: searchIndex }, setSearchValue] = useState({ value: '' }); - const [structureChanged, setStructureChanged] = useState(false); - const isSearchEmpty = isEmpty(searchValue); - const normalisedSearchValue = (searchValue || '').toLowerCase(); - - const structureHasErrors = !validateNavigationStructure((changedActiveNavigation || {}).items); - - useEffect(() => { - if(structureHasErrors) { - toggleNotification({ - type: 'warning', - message: getTrad('notification.error.item.relation'), - }); - } - }, [structureHasErrors]); - - const navigationSelectValue = get(activeNavigation, "id", null); - const handleSave = () => isLoadingForSubmit || structureHasErrors - ? null - : handleSubmitNavigation(formatMessage, transformToRESTPayload(changedActiveNavigation, config)); - const handleCachePurge = () => { - handleNavigationsPurge([navigationSelectValue]); - }; - - const changeNavigationItemPopupState = (visible, editedItem = {}) => { - setActiveNavigationItemState(editedItem); - handleChangeNavigationItemPopupVisibility(visible); - }; - - const addNewNavigationItem = useCallback(( - event, - viewParentId = null, - isMenuAllowedLevel = true, - levelPath = '', - parentAttachedToMenu = true, - structureId = "0", - ) => { - if (canUpdate) { - event.preventDefault(); - event.stopPropagation(); - changeNavigationItemPopupState(true, { - viewParentId, - isMenuAllowedLevel, - levelPath, - parentAttachedToMenu, - structureId, - }); - } - }, [changeNavigationItemPopupState]); - - const usedContentTypesData = useMemo( - () => changedActiveNavigation ? usedContentTypes(changedActiveNavigation.items) : [], - [changedActiveNavigation], - ); - - const pullUsedContentTypeItem = (items = []) => - items.reduce((prev, curr) => - [...prev, curr.relatedRef ? { - __collectionUid: curr.relatedRef.__collectionUid, - id: curr.relatedRef.id - } : undefined, ...pullUsedContentTypeItem(curr.items)].filter(item => item) - , []); - const usedContentTypeItems = pullUsedContentTypeItem(changedActiveNavigation?.items); - const handleSubmitNavigationItem = (payload) => { - const changedStructure = { - ...changedActiveNavigation, - items: transformItemToViewPayload(payload, changedActiveNavigation.items, config), - }; - handleChangeNavigationData(changedStructure, true); - setStructureChanged(true); - }; - - const filteredListFactory = (items, doUse, activeIndex) => { - const filteredItems = items.reduce((acc, item) => { - const subItems = !isEmpty(item.items) ? filteredListFactory(item.items, doUse) : []; - if (doUse(item)) - return [item, ...subItems, ...acc]; - else - return [...subItems, ...acc]; - }, []); - - if (activeIndex !== undefined) { - const index = activeIndex % filteredItems.length; - - return filteredItems.map((item, currentIndex) => { - return index === currentIndex ? ({ ...item, isSearchActive: true }) : item; - }); - } - - return filteredItems; - }; - const filteredList = !isSearchEmpty ? filteredListFactory(changedActiveNavigation.items.map(_ => ({..._})), (item) => (item?.title || '').toLowerCase().includes(normalisedSearchValue), normalisedSearchValue ? searchIndex : undefined) : []; - - const changeCollapseItemDeep = (item, isCollapsed) => { - if (item.collapsed !== isCollapsed) { - return { - ...item, - collapsed: isCollapsed, - updated: true, - items: item.items?.map(el => changeCollapseItemDeep(el, isCollapsed)) - } - } - return { - ...item, - items: item.items?.map(el => changeCollapseItemDeep(el, isCollapsed)) - } - } - - const handleCollapseAll = () => { - handleChangeNavigationData({ - ...changedActiveNavigation, - items: changedActiveNavigation.items.map(item => changeCollapseItemDeep(item, true)) - }, true); - setStructureChanged(true); - } - - const handleExpandAll = () => { - handleChangeNavigationData({ - ...changedActiveNavigation, - items: changedActiveNavigation.items.map(item => changeCollapseItemDeep(item, false)) - }, true); - setStructureChanged(true); - } - - const handleItemReOrder = (item, newOrder) => { - handleSubmitNavigationItem({ - ...item, - order: newOrder, - }) - } - - const handleItemRemove = (item) => { - handleSubmitNavigationItem({ - ...item, - removed: true, - }); - } - - const handleItemRestore = (item) => { - handleSubmitNavigationItem({ - ...item, - removed: false, - }); - }; - - const handleItemToggleCollapse = (item) => { - handleSubmitNavigationItem({ - ...item, - collapsed: !item.collapsed, - updated: true, - isSearchActive: false, - }); - } - - const handleItemEdit = ( - item, - levelPath = '', - parentAttachedToMenu = true, - ) => { - changeNavigationItemPopupState(true, { - ...item, - levelPath, - parentAttachedToMenu, - }); - }; - - const onPopUpClose = (e) => { - e.preventDefault(); - e.stopPropagation(); - - // Using Strapi design system select components inside a modal causes - // extraneous close events to be fired. It is most likely related to how - // the select component handles onOutsideClick events. In those situations - // the event target element is the root HTML element. - // This is a workaround to prevent the modal from closing in those cases. - if (e.target.tagName !== 'HTML') { - changeNavigationItemPopupState(false); - } - }; - - const handleChangeNavigationSelection = (...args) => { - handleChangeSelection(...args); - setSearchValue({ value: '', index: 0 }); - } - - const endActions = [ - { - onClick: handleExpandAll, - disabled: isLoadingForSubmit, - type: "submit", - variant: 'tertiary', - tradId: 'header.action.expandAll', - margin: '8px', - }, - { - onClick: handleCollapseAll, - disabled: isLoadingForSubmit, - type: "submit", - variant: 'tertiary', - tradId: 'header.action.collapseAll', - margin: '8px', - }, - ]; - if (canUpdate) { - endActions.push({ - onClick: addNewNavigationItem, - startIcon: , - disabled: isLoadingForSubmit, - type: "submit", - variant: "default", - tradId: 'header.action.newItem', - margin: '16px', - }); - } - - return ( -
- - - {isLoading && } - {changedActiveNavigation && ( - <> - } - endActions={endActions.map(({ tradId, margin, ...item }, i) => - - - - )} - /> - {isEmpty(changedActiveNavigation.items || []) && ( - - - - {formatMessage(getTrad('empty'))} - - {canUpdate && ()} - { - canUpdate && config.i18nEnabled && availableLocale.length ? ( - - - {formatMessage(getTrad('view.i18n.fill.cta'))} - - - - - - - - - - - ) : null - } - - )} - { - !isEmpty(changedActiveNavigation.items || []) - && - } - - )} - - {navigationItemPopupOpened && } - {canUpdate && i18nCopyItemsModal} -
- ); -}; - -export default memo(View); diff --git a/admin/src/pages/View/utils/form.js b/admin/src/pages/View/utils/form.js deleted file mode 100644 index 45e9a64e..00000000 --- a/admin/src/pages/View/utils/form.js +++ /dev/null @@ -1,13 +0,0 @@ -import { getYupInnerErrors } from '@strapi/helper-plugin'; - -export const checkFormValidity = async (data, schema) => { - let errors = null; - - try { - await schema.validate(data, { abortEarly: false }); - } catch (err) { - errors = getYupInnerErrors(err); - } - - return errors; -}; diff --git a/admin/src/pages/View/utils/index.js b/admin/src/pages/View/utils/index.js deleted file mode 100644 index c3d60a45..00000000 --- a/admin/src/pages/View/utils/index.js +++ /dev/null @@ -1,3 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -export { default as forms } from "./forms"; -export { default as parsers } from "./parsers"; diff --git a/admin/src/pages/View/utils/parsers.js b/admin/src/pages/View/utils/parsers.js deleted file mode 100644 index 8dbe5545..00000000 --- a/admin/src/pages/View/utils/parsers.js +++ /dev/null @@ -1,327 +0,0 @@ -import { v4 as uuid, validate as isUuid } from 'uuid' -import { find, get, isArray, isEmpty, isNil, isNumber, isObject, isString, last, omit, orderBy } from 'lodash'; -import { navigationItemType } from '../../../utils'; - -export const transformItemToRESTPayload = ( - item, - parent = undefined, - master = undefined, - config = {}, - parentAttachedToMenu = true, -) => { - const { - id, - title, - type = navigationItemType.INTERNAL, - updated = false, - removed = false, - uiRouterKey, - menuAttached, - path, - externalPath, - related, - relatedType, - order, - audience = [], - items = [], - collapsed, - isSingle, - additionalFields = {}, - autoSync, - } = item; - const isExternal = type === navigationItemType.EXTERNAL; - const isWrapper = type === navigationItemType.WRAPPER; - const { contentTypes = [] } = config; - - const parsedRelated = Number(related); - const relatedId = isExternal || isWrapper || isNaN(parsedRelated) ? related?.value || related : parsedRelated; - - const relatedContentType = relatedType ? - find(contentTypes, - ct => ct.uid === relatedType) : - undefined; - const itemAttachedToMenu = config.cascadeMenuAttached ? menuAttached && parentAttachedToMenu : menuAttached; - return { - id, - parent, - master, - title, - type, - updated, - removed, - order, - uiRouterKey, - collapsed, - additionalFields, - autoSync, - menuAttached: itemAttachedToMenu, - audience: audience.map((audienceItem) => - isObject(audienceItem) - ? audienceItem.id || audienceItem.value - : audienceItem, - ), - path: isExternal ? undefined : path, - externalPath: isExternal ? externalPath : undefined, - related: isExternal || isWrapper - ? undefined - : [ - { - refId: isSingle && !relatedId ? 1 : relatedId, - ref: relatedContentType ? relatedContentType.uid : relatedType, - field: relatedContentType && relatedContentType.relatedField ? relatedContentType.relatedField : 'navigation', - }, - ], - items: items.map((iItem) => transformItemToRESTPayload(iItem, id, master, config, itemAttachedToMenu)), - }; -}; - -export const transformToRESTPayload = (payload, config = {}) => { - const { id, name, visible, items } = payload; - return { - id, - name, - visible, - items: items.map((item) => transformItemToRESTPayload(item, null, id, config)), - }; -}; - -const linkRelations = (item, config) => { - const { contentTypeItems = [], contentTypes = [] } = config; - const { type, related, relatedType, relatedRef, isSingle } = item; - let relation = { - related: undefined, - relatedRef: undefined, - relatedType: undefined, - }; - - if (isSingle && relatedType) { - const relatedContentType = contentTypes.find(_ => relatedType === _.uid) || {}; - const { singleRelatedItem = {} } = item; - return { - ...item, - relatedType, - relatedRef: { - ...singleRelatedItem, - ...omit(relatedContentType, 'collectionName'), - isSingle, - __collectionUid: relatedContentType.uid, - }, - }; - } - - // we got empty array after remove object in relation - // from API we got related as array but on edit it is primitive type - if ((type !== navigationItemType.INTERNAL) || !related || (isObject(related) && isEmpty(related))) { - return { - ...item, - ...relation, - }; - } - - const relatedItem = isArray(related) ? last(related) : related; - - const parsedRelated = Number(related); - const relatedId = isNaN(parsedRelated) ? related : parsedRelated; - - const relationNotChanged = relatedRef && relatedItem ? relatedRef.id === relatedItem : false; - - if (relationNotChanged) { - return item; - } - - const shouldFindRelated = (isNumber(related) || isUuid(related) || isString(related)) && !relatedRef; - const shouldBuildRelated = !relatedRef || (relatedRef && (relatedRef.id !== relatedId)); - - if (shouldBuildRelated && !shouldFindRelated) { - const relatedContentType = find(contentTypes, - ct => ct.uid === relatedItem.__contentType, {}); - const { uid, labelSingular, isSingle } = relatedContentType; - relation = { - related: relatedItem.id, - relatedRef: { - ...relatedItem, - __collectionUid: uid, - isSingle, - labelSingular, - }, - relatedType: uid, - }; - } else if (shouldFindRelated) { - const relatedRef = find(contentTypeItems, cti => cti.id === relatedId); - const relatedContentType = find(contentTypes, ct => ct.uid === relatedType); - const { uid, contentTypeName, labelSingular, isSingle } = relatedContentType; - - relation = { - relatedRef: { - ...relatedRef, - __collectionUid: uid, - __contentType: contentTypeName, - isSingle, - labelSingular, - }, - }; - } else { - return { - ...item, - }; - } - - return { - ...item, - ...relation, - }; -}; - -const reOrderItems = (items = []) => - orderBy(items, ['order'], ['asc']) - .map((item, n) => { - const order = n + 1; - return { - ...item, - order, - updated: item.updated || order !== item.order, - }; - }); - -export const transformItemToViewPayload = (payload, items = [], config) => { - if (!payload.viewParentId) { - if (payload.viewId) { - const updatedRootLevel = items - .map((item) => { - if (item.viewId === payload.viewId) { - return linkRelations({ - ...payload, - }, config); - } - return { - ...item, - items: transformItemToViewPayload(payload, item.items, config), - }; - }); - return reOrderItems(updatedRootLevel); - } - return [ - ...reOrderItems(items), - linkRelations({ - ...payload, - order: items.length + 1, - viewId: uuid(), - }, config), - ]; - } - - const updatedLevel = items - .map((item) => { - const branchItems = item.items || []; - if (payload.viewParentId === item.viewId) { - if (!payload.viewId) { - return { - ...item, - items: [ - ...reOrderItems(branchItems), - linkRelations({ - ...payload, - order: branchItems.length + 1, - viewId: uuid(), - }, config), - ], - }; - } - const updatedBranchItems = branchItems - .map((iItem) => { - if (iItem.viewId === payload.viewId) { - return linkRelations(payload, config); - } - return { - ...iItem, - }; - }); - return { - ...item, - items: reOrderItems(updatedBranchItems), - }; - } - return { - ...item, - items: transformItemToViewPayload(payload, item.items, config), - }; - }); - return reOrderItems(updatedLevel); -}; - -export const prepareItemToViewPayload = ({ - items = [], - viewParentId = null, - config = {}, - structureIdPrefix = '' -}) => - reOrderItems(items.map((item, n) => { - const viewId = uuid(); - const structureId = structureIdPrefix ? `${structureIdPrefix}.${n}` : n.toString(); - - return { - ...linkRelations({ - viewId, - viewParentId, - ...item, - order: item.order || (n + 1), - structureId, - updated: item.updated || isNil(item.order), - }, config), - items: prepareItemToViewPayload({ - config, - items: item.items, - structureIdPrefix: structureId, - viewId, - }), - }; - })); - -export const extractRelatedItemLabel = (item = {}, fields = {}, config = {}) => { - if (get(item, 'isSingle', false)) { - return get(item, 'labelSingular', ''); - } - const { contentTypes = [] } = config; - const { __collectionUid } = item; - const contentType = contentTypes.find(_ => _.uid === __collectionUid) - const { default: defaultFields = [] } = fields; - return get(fields, `${contentType ? contentType.uid : __collectionUid}`, defaultFields).map((_) => item[_]).filter((_) => _)[0] || ''; -}; - -export const usedContentTypes = (items = []) => items.flatMap( - (item) => { - const used = (item.items ? usedContentTypes(item.items) : []); - if (item.relatedRef) { - return [item.relatedRef, ...used]; - } - return used; - }, -); - -export const isRelationCorrect = ({ related, type }) => { - const isRelationDefined = !isNil(related); - return type !== navigationItemType.INTERNAL || (type === navigationItemType.INTERNAL && isRelationDefined); -}; - -export const isRelationPublished = ({ relatedRef, relatedType = {}, type, isCollection }) => { - if (isCollection) { - return relatedType.available || relatedRef.available; - } - if ((type === navigationItemType.INTERNAL)) { - const isHandledByPublshFlow = relatedRef ? 'published_at' in relatedRef : false; - if (isHandledByPublshFlow) { - return get(relatedRef, 'published_at', true); - } - } - return true; -}; - -export const validateNavigationStructure = (items = []) => - items.map(item => - ( - item.removed || - isRelationCorrect({ related: item.related, type: item.type }) || - (item.isSingle && isRelationCorrect({ related: item.relatedType, type: item.type })) - ) && - validateNavigationStructure(item.items) - ).filter(item => !item).length === 0; diff --git a/admin/src/pages/View/utils/types.ts b/admin/src/pages/View/utils/types.ts deleted file mode 100644 index 0e612016..00000000 --- a/admin/src/pages/View/utils/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { GenericInputProps } from "@strapi/helper-plugin" - -export type GenericInputOnChangeInput = Parameters[0]; diff --git a/admin/src/permissions.js b/admin/src/permissions.js deleted file mode 100644 index 978f6de7..00000000 --- a/admin/src/permissions.js +++ /dev/null @@ -1,9 +0,0 @@ -import permissions from '../../permissions'; - -const pluginPermissions = { - access: [{ action: permissions.render(permissions.navigation.read), subject: null }], - update: [{ action: permissions.render(permissions.navigation.update), subject: null }], - settings: [{ action: permissions.render(permissions.navigation.settings), subject: null }], - }; - -export default pluginPermissions; \ No newline at end of file diff --git a/admin/src/pluginId.js b/admin/src/pluginId.js deleted file mode 100644 index 3c0d7003..00000000 --- a/admin/src/pluginId.js +++ /dev/null @@ -1,5 +0,0 @@ -const pluginPkg = require('../../package.json'); - -const pluginId = pluginPkg.name.replace(/^strapi-plugin-/i, ''); - -module.exports = pluginId; diff --git a/admin/src/pluginId.ts b/admin/src/pluginId.ts new file mode 100644 index 00000000..eac9601d --- /dev/null +++ b/admin/src/pluginId.ts @@ -0,0 +1 @@ +export const PLUGIN_ID = 'navigation'; diff --git a/admin/src/schemas/config.ts b/admin/src/schemas/config.ts new file mode 100644 index 00000000..65b655a2 --- /dev/null +++ b/admin/src/schemas/config.ts @@ -0,0 +1,69 @@ +import { z } from 'zod'; + +export type NavigationItemCustomFieldBase = z.infer; +const navigationCustomFieldBase = z.object({ + // TODO: Proper message translation + name: z.string().refine((current) => !current.includes(' '), { message: 'No space allowed' }), + label: z.string(), + required: z.boolean().optional(), + enabled: z.boolean().optional(), +}); + +export type NavigationItemCustomFieldSelect = z.infer; +const navigationItemCustomFieldSelect = navigationCustomFieldBase.extend({ + type: z.literal('select'), + multi: z.boolean(), + options: z.array(z.string()), +}); + +export type NavigationItemCustomFieldPrimitive = z.infer; +const navigationItemCustomFieldPrimitive = navigationCustomFieldBase.extend({ + type: z.enum(['boolean', 'string']), + multi: z.literal(false).optional(), + options: z.array(z.string()).max(0).optional(), +}); + +export type NavigationItemCustomFieldMedia = z.infer; +const navigationItemCustomFieldMedia = navigationCustomFieldBase.extend({ + type: z.literal('media'), + multi: z.literal(false).optional(), + options: z.array(z.string()).max(0).optional(), +}); + +export type NavigationItemCustomField = z.infer; +export const navigationItemCustomField = z.union([ + navigationItemCustomFieldPrimitive, + navigationItemCustomFieldMedia, + navigationItemCustomFieldSelect, +]); + +export type NavigationItemAdditionalField = z.infer; +export const navigationItemAdditionalField = z.union([ + z.literal('audience'), + navigationItemCustomField, +]); + +export type ConfigSchema = z.infer; +export const configSchema = z.object({ + additionalFields: z.array(navigationItemAdditionalField), + allowedLevels: z.number(), + availableAudience: z + .object({ + id: z.number(), + documentId: z.string(), + name: z.string(), + key: z.string(), + }) + .array(), + contentTypes: z.array(z.string()), + contentTypesNameFields: z.record(z.string(), z.array(z.string())), + contentTypesPopulate: z.record(z.string(), z.array(z.string())), + gql: z.object({ + navigationItemRelated: z.array(z.string()), + }), + pathDefaultFields: z.record(z.string(), z.any()), + cascadeMenuAttached: z.boolean(), + preferCustomContentTypes: z.boolean(), + isCacheEnabled: z.boolean().optional(), + isCachePluginEnabled: z.boolean().optional(), +}); diff --git a/admin/src/schemas/content-type.ts b/admin/src/schemas/content-type.ts new file mode 100644 index 00000000..2bb4e9c5 --- /dev/null +++ b/admin/src/schemas/content-type.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; + +export type StrapiContentTypeSchema = z.infer; +export const strapiContentTypeSchema = z.object({ + uid: z.string(), + isDisplayed: z.boolean(), + apiID: z.string(), + kind: z.enum(['collectionType', 'singleType']), + info: z.object({ + singularName: z.string(), + pluralName: z.string(), + displayName: z.string(), + description: z.string().optional(), + }), + attributes: z.record(z.string(), z.unknown()), +}); diff --git a/admin/src/schemas/index.ts b/admin/src/schemas/index.ts new file mode 100644 index 00000000..eb9eddde --- /dev/null +++ b/admin/src/schemas/index.ts @@ -0,0 +1,2 @@ +export * from './config'; +export * from './content-type'; diff --git a/admin/src/translations/ca.json b/admin/src/translations/ca.json deleted file mode 100644 index abf6575f..00000000 --- a/admin/src/translations/ca.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "components.confirmation.dialog.button.cancel": "Cancel·lar", - "components.confirmation.dialog.button.confirm": "Confirmeu", - "components.confirmation.dialog.description": "Vols continuar?", - "components.confirmation.dialog.header": "Confirmació", - "components.navigationItem.action.newItem": "Afegeix un element fill", - "components.navigationItem.badge.draft": "Esborrany", - "components.navigationItem.badge.published": "Publicat", - "components.navigationItem.badge.removed": "Eliminat", - "empty": "El teu menú està buit", - "empty.cta": "Crea el primer element", - "header.action.collapseAll": "Col·lapsar tot", - "header.action.expandAll": "Amplia-ho tot", - "header.action.manage": "Gestionar", - "header.action.newItem": "Element nou", - "header.description": "Definiu la vostra navegació del lloc web", - "header.meta": "ID: { id }, slug: { key }", - "header.title": "Navegació", - "notification.error": "S'ha produït un error en processar la sol·licitud.", - "notification.error.customField.type": "Tipus de camp personalitzat no compatible", - "notification.error.item.relation": "Les relacions proporcionades en alguns elements són incorrectes", - "notification.error.item.slug": "No es pot crear la clau (slug) vàlida de l'encaminador de la IU des de \"{ query }\". \"{ result }\" rebut", - "notification.navigation.error": "Camí duplicat: { path } al pare: { parentTitle } per a { errorTitles } elements", - "notification.navigation.item.relation": "La relació d'entitat no existeix!", - "notification.navigation.item.relation.status.draft": "esborrany", - "notification.navigation.item.relation.status.published": "publicat", - "notification.navigation.submit": "S'han desat els canvis de navegació", - "pages.main.header.localization.select.placeholder": "Seleccioneu la configuració regional", - "pages.main.search.placeholder": "Escriviu per començar a cercar...", - "pages.main.search.subLabel": "appuyez sur ENTER pour mettre en surbrillance l'élément suivant", - "pages.settings.actions.disableI18n.confirmation.confirm": "entenc", - "pages.settings.actions.disableI18n.confirmation.description.line1": "Esteu desactivant la internacionalització per a la navegació. Les navegacions per a configuracions regionals diferents de les predeterminades no estan disponibles per a la visualització i modificacions mitjançant aquesta extensió.", - "pages.settings.actions.disableI18n.confirmation.description.line2": "Podeu optar per eliminar les navegacions per a altres configuracions regionals.", - "pages.settings.actions.disableI18n.confirmation.description.line3": "Recordeu! L'eliminació és irreversible", - "pages.settings.actions.disableI18n.confirmation.header": "Desactivació de la internacionalització", - "pages.settings.actions.disableI18n.prune.label": "Navegacions obsoletes", - "pages.settings.actions.disableI18n.prune.off": "Mantenir", - "pages.settings.actions.disableI18n.prune.on": "Eliminar", - "pages.settings.actions.restart": "Reinicieu Strapi", - "pages.settings.actions.restart.alert.cancel": "Cancel·lar", - "pages.settings.actions.restart.alert.close": "Descartar", - "pages.settings.actions.restart.alert.description": "Heu fet un canvi de configuració que requereix que la vostra aplicació Strapi es reiniciï perquè tingui efecte. Fes-ho manualment o utilitzant el botó següent.", - "pages.settings.actions.restart.alert.reason.GRAPH_QL": "S'aplicaran els canvis de GraphQL.", - "pages.settings.actions.restart.alert.reason.I18N": "S'aplicaran els canvis d'internacionalització (i18n).", - "pages.settings.actions.restart.alert.reason.I18N_NAVIGATIONS_PRUNE": "Les navegacions locals obsoletes s'eliminaran.", - "pages.settings.actions.restart.alert.title": "Strapi requereix reinici", - "pages.settings.actions.restore": "Restaura la configuració", - "pages.settings.actions.restore.confirmation.confirm": "Restaurar", - "pages.settings.actions.restore.confirmation.description": "La configuració de l'extensió es restaurarà des del fitxer plugins.js.", - "pages.settings.actions.restore.confirmation.header": "Vols continuar?", - "pages.settings.actions.restore.description": "La restauració de la configuració de l'extensió farà que es substitueixi per la configuració desada dins del fitxer \"plugins.js\".", - "pages.settings.actions.submit": "Desa la configuració", - "pages.settings.additional.title": "Configuracions addicionals", - "pages.settings.customFields.title": "Configuració de camps personalitzats", - "pages.settings.form.allowedLevels.hint": "Nivell màxim per al qual podeu marcar l'element com a \"Menú adjunt\"", - "pages.settings.form.allowedLevels.label": "Nivells permesos", - "pages.settings.form.allowedLevels.placeholder": "per exemple. 2", - "pages.settings.form.audience.hint": "Activa el camp de públic", - "pages.settings.form.audience.label": "Públic", - "pages.settings.form.contentTypes.hint": "Si no se selecciona cap, tampoc no s'habilitarà cap dels tipus de contingut", - "pages.settings.form.contentTypes.label": "Habilita la navegació per", - "pages.settings.form.contentTypes.placeholder": "per exemple. Pàgines, publicacions", - "pages.settings.form.contentTypesSettings.initializationWarning.content": "- El tipus de contingut encara no s'ha inicialitzat. Inicialitzeu-lo primer per poder utilitzar-lo en un editor visual.", - "pages.settings.form.contentTypesSettings.initializationWarning.title": "Avís", - "pages.settings.form.contentTypesSettings.label": "Tipus de contingut", - "pages.settings.form.contentTypesSettings.tooltip": "Configuració personalitzada per tipus de contingut", - "pages.settings.form.customFields.popup.header.edit": "Edita el camp personalitzat", - "pages.settings.form.customFields.popup.header.new": "Afegeix un camp personalitzat nou", - "pages.settings.form.customFields.popup.label.description": "Aquesta etiqueta es mostrarà al formulari d'elements de navegació", - "pages.settings.form.customFields.popup.label.label": "Etiqueta de camp personalitzada", - "pages.settings.form.customFields.popup.label.placeholder": "Exemple d'etiqueta", - "pages.settings.form.customFields.popup.multi.label": "Activa l'entrada d'opcions múltiples", - "pages.settings.form.customFields.popup.name.description": "El nom del camp personalitzat ha de ser únic", - "pages.settings.form.customFields.popup.name.label": "Nom del camp personalitzat", - "pages.settings.form.customFields.popup.name.placeholder": "nom_exemple", - "pages.settings.form.customFields.popup.options.description": "Activar aquest camp no canviarà els elements de navegació que ja estan sortint", - "pages.settings.form.customFields.popup.options.label": "Opcions per seleccionar l'entrada", - "pages.settings.form.customFields.popup.required.description": "Activar aquest camp no canviarà els elements de navegació que ja estan sortint", - "pages.settings.form.customFields.popup.required.label": "Camp obligatori", - "pages.settings.form.customFields.popup.type.label": "Tipus de camp personalitzat", - "pages.settings.form.customFields.table.confirmation.confirm": "Continua", - "pages.settings.form.customFields.table.confirmation.error": "S'ha produït un error en eliminar el camp personalitzat", - "pages.settings.form.customFields.table.confirmation.header": "S'està eliminant el camp personalitzat", - "pages.settings.form.customFields.table.confirmation.message": "Aquesta acció farà que s'eliminin tots els valors dels camps personalitzats dels elements de navegació.", - "pages.settings.form.customFields.table.disable": "Desactiva el camp personalitzat", - "pages.settings.form.customFields.table.edit": "Edita el camp personalitzat", - "pages.settings.form.customFields.table.enable": "Activa el camp personalitzat", - "pages.settings.form.customFields.table.footer": "Crea un camp personalitzat nou", - "pages.settings.form.customFields.table.header.label": "Etiqueta", - "pages.settings.form.customFields.table.header.name": "Nom", - "pages.settings.form.customFields.table.header.required": "Obligatori", - "pages.settings.form.customFields.table.header.type": "Tipus", - "pages.settings.form.customFields.table.notRequired": "no obligatori", - "pages.settings.form.customFields.table.remove": "Elimina el camp personalitzat", - "pages.settings.form.customFields.table.required": "obligatori", - "pages.settings.form.i18n.hint": "Habilitar la internacionalització", - "pages.settings.form.i18n.hint.missingDefaultLocale": "Falta la configuració regional predeterminada!", - "pages.settings.form.i18n.label": "i18n", - "pages.settings.form.nameField.empty": "Aquest tipus de contingut no té cap atribut de text", - "pages.settings.form.nameField.hint": "Si es deixa el camp de nom buit, prendrà els següents camps ordenats: \"títol\", \"assumpte\" i \"nom\"", - "pages.settings.form.nameField.label": "Camps de nom", - "pages.settings.form.nameField.placeholder": "Seleccioneu almenys un o deixeu-lo buit per aplicar els valors predeterminats", - "pages.settings.form.pathDefaultFields.empty": "Aquest tipus de contingut no té cap atribut adequat", - "pages.settings.form.pathDefaultFields.hint": "El valor de l'atribut seleccionat serà un valor predeterminat per al camí intern", - "pages.settings.form.pathDefaultFields.label": "Camps predeterminats del camí", - "pages.settings.form.pathDefaultFields.placeholder": "Seleccioneu-ne com a mínim un o deixeu-lo buit per desactivar l'emplenat del camp del camí amb el valor dels atributs", - "pages.settings.form.populate.empty": "Aquest tipus de contingut no té cap camp de relació", - "pages.settings.form.populate.hint": "Els camps de relació seleccionats s'emplenaran dins de les respostes de l'API", - "pages.settings.form.populate.label": "Camps a omplir", - "pages.settings.form.populate.placeholder": "Seleccioneu-ne com a mínim un o deixeu-lo buit per desactivar l'ompliment dels camps de relació", - "pages.settings.general.title": "Configuració general", - "pages.settings.header.description": "Configura el connector de navegació", - "pages.settings.header.title": "Navegació", - "pages.settings.nameField.title": "Configuració dels tipus de contingut", - "pages.settings.notification.fetch.error": "No s'ha pogut obtenir la configuració. S'està tornant a provar...", - "pages.settings.notification.restart.error": "No s'ha pogut reiniciar l'aplicació. Intenta fer-ho manualment.", - "pages.settings.notification.restart.success": "L'aplicació s'ha reiniciat correctament", - "pages.settings.notification.restore.error": "La restauració de la configuració ha fallat", - "pages.settings.notification.restore.success": "La configuració s'ha restaurat correctament", - "pages.settings.notification.submit.error": "L'actualització de la configuració ha fallat", - "pages.settings.notification.submit.success": "La configuració s'ha actualitzat correctament", - "pages.settings.restoring.title": "Restauració", - "pages.settings.section.subtitle": "Configuració", - "pages.settings.section.title": "Extensió de navegació", - "pages.view.actions.i18nCopyItems.confirmation.confirm": "Còpia", - "pages.view.actions.i18nCopyItems.confirmation.content": "Voleu copiar els elements de navegació?", - "pages.view.actions.i18nCopyItems.confirmation.header": "Confirmació", - "plugin.name": "Navegació", - "popup.item.form.audience.empty": "No hi ha més públic", - "popup.item.form.audience.label": "Públic", - "popup.item.form.audience.placeholder": "Selecciona el públic...", - "popup.item.form.button.cancel": "Cancel·lar", - "popup.item.form.button.create": "Crea un element", - "popup.item.form.button.remove": "Eliminar", - "popup.item.form.button.restore": "Restaura l'element", - "popup.item.form.button.save": "Desa", - "popup.item.form.button.update": "Actualitza l'element", - "popup.item.form.externalPath.label": "URL externa", - "popup.item.form.externalPath.placeholder": "Enllaç a la pàgina externa", - "popup.item.form.externalPath.validation.type": "Aquest valor no és una URL adequada.", - "popup.item.form.i18n.locale.button": "Còpia", - "popup.item.form.i18n.locale.error.generic": "No es pot copiar l'element", - "popup.item.form.i18n.locale.error.unavailable": "La versió local no està disponible", - "popup.item.form.i18n.locale.label": "Copia els detalls de", - "popup.item.form.i18n.locale.placeholder": "local", - "popup.item.form.menuAttached.label": "Adjuntar al menú", - "popup.item.form.path.label": "URL", - "popup.item.form.path.placeholder": "La part d'URL única identifica aquest element", - "popup.item.form.path.preview": "Vista prèvia:", - "popup.item.form.related.empty": "No hi ha més entitats de \"{ contentTypeName }\" per seleccionar", - "popup.item.form.related.label": "Entitat", - "popup.item.form.relatedSection.label": "Relació amb", - "popup.item.form.relatedType.empty": "No hi ha tipus de contingut per seleccionar", - "popup.item.form.relatedType.label": "Tipus de contingut", - "popup.item.form.relatedType.placeholder": "Selecciona el tipus de contingut...", - "popup.item.form.title.label": "Títol", - "popup.item.form.title.placeholder": "Introduïu el títol de l'element o deixeu-lo en blanc per extreure'l de l'entitat relacionada", - "popup.item.form.type.external.description": "Camí de sortida: {valor}", - "popup.item.form.type.external.label": "Pàgina externa", - "popup.item.form.type.internal.label": "Contingut intern", - "popup.item.form.type.label": "Tipus d'element de navegació", - "popup.item.form.type.wrapper.label": "Contenidor", - "popup.item.form.uiRouterKey.label": "Clau de l'encaminador de la interfície d'usuari", - "popup.item.form.uiRouterKey.placeholder": "Si està buit, generat automàticament per \"Títol\"", - "popup.item.header.edit": "Edita l'element de navegació", - "popup.item.header.new": "Nou element de navegació", - "popup.navigation.form.name.label": "Nom", - "popup.navigation.form.name.placeholder": "Nom del menú", - "popup.navigation.form.validation.name.alreadyUsed": "El nom ja s'utilitza", - "popup.navigation.form.validation.name.required": "El nom és obligatori", - "popup.navigation.form.validation.name.tooShort": "El nom és massa curt", - "popup.navigation.form.validation.visible.required": "Es requereix visibilitat", - "popup.navigation.form.visible.label": "Visibilitat", - "popup.navigation.manage.button.cancel": "Cancel·lar", - "popup.navigation.manage.button.create": "Crear", - "popup.navigation.manage.button.delete": "Suprimeix", - "popup.navigation.manage.button.edit": "Edita", - "popup.navigation.manage.button.goBack": "Torna", - "popup.navigation.manage.button.save": "Desa", - "popup.navigation.manage.delete.header": "S'eliminaran els menús següents:", - "popup.navigation.manage.error.message": "Ha passat un error :(", - "popup.navigation.manage.header.CREATE": "Nou menú", - "popup.navigation.manage.header.DELETE": "S'està suprimint", - "popup.navigation.manage.header.EDIT": "S'està editant \"{name}\"", - "popup.navigation.manage.header.ERROR": "Error", - "popup.navigation.manage.header.LIST": "Tots els menús", - "popup.navigation.manage.navigation.hidden": "amagat", - "popup.navigation.manage.navigation.visible": "visible", - "popup.navigation.manage.table.hasSelected": "{count} entrades seleccionades", - "popup.navigation.manage.table.id": "Id", - "popup.navigation.manage.table.locale": "Versions locals", - "popup.navigation.manage.table.name": "Nom", - "popup.navigation.manage.table.visibility": "Visibilitat", - "submit.cta.cancel": "Cancel·lar", - "submit.cta.save": "Desa", - "view.i18n.fill.cta": "o copia de", - "view.i18n.fill.cta.button": "còpia", - "view.i18n.fill.option": "{locale} local" -} \ No newline at end of file diff --git a/admin/src/translations/ca.ts b/admin/src/translations/ca.ts new file mode 100644 index 00000000..ee94686e --- /dev/null +++ b/admin/src/translations/ca.ts @@ -0,0 +1,483 @@ +const ca = { + plugin: { + name: "Navigation UI", + section: { + name: "Plugin de navigation", + item: "Configuration", + }, + }, + header: { + title: "Navigation", + description: "Définissez la navigation de votre portail", + meta: "ID: { id }, slug: { key }", + action: { + newItem: "Nouvel élément", + manage: "Gérer", + collapseAll: "Tout réduire", + expandAll: "Tout développer", + }, + }, + submit: { + cta: { + cancel: "Annuler", + save: "Enregistrer", + }, + }, + empty: { + description: "Votre navigation est vide", + cta: "Créer le premier élément", + }, + popup: { + navigation: { + manage: { + header: { + LIST: "Toutes les navigations", + CREATE: "Nouvelle navigation", + DELETE: "Suppression", + ERROR: "Erreur", + EDIT: "Édition de \"{name}\"", + }, + button: { + cancel: "Annuler", + delete: "Supprimer", + save: "Enregistrer", + edit: "Modifier", + create: "Créer", + goBack: "Retourner", + purge: "Effacer le cache de lecture", + }, + table: { + id: "Id", + name: "Nom", + locale: "Versions locales", + visibility: "Visibilité", + hasSelected: "{count} entrées sélectionnées", + }, + footer: { + button: { + purge: "Effacer", + }, + }, + purge: { + header: "Cette action effacera le cache de lecture de l'API. Cela entraînera un ralentissement temporaire des lectures pour les navigations ci-dessous.", + }, + delete: { + header: "Les navigations suivantes seront supprimées :", + }, + error: { + header: "Une erreur est survenue :(", + message: "Une erreur est survenue lors du traitement de la demande.", + }, + navigation: { + visible: "visible", + hidden: "caché", + }, + }, + form: { + name: { + label: "Nom", + placeholder: "Nom de la navigation", + validation: { + name: { + required: "Le nom est requis", + tooShort: "Le nom est trop court", + alreadyUsed: "Le nom est déjà utilisé", + }, + visible: { + required: "La visibilité est requise", + }, + }, + }, + visible: { + label: "Visibilité", + }, + }, + }, + item: { + header: { + view: "Voir l'élément de navigation", + edit: "Modifier l'élément de navigation", + new: "Nouvel élément de navigation", + }, + form: { + title: { + label: "Titre", + autoSync: { + label: "Lire les champs de la relation", + }, + placeholder: "Entrez le titre de l'élément ou laissez vide pour tirer de l'entité liée", + }, + uiRouterKey: { + label: "Clé du routeur UI", + placeholder: "Si vide, généré automatiquement par \"Titre\"", + }, + path: { + label: "URL", + placeholder: "Partie unique de l'URL identifiant cet élément", + preview: "Aperçu :", + }, + externalPath: { + label: "URL externe", + placeholder: "Lien vers la source externe", + validation: { + type: "Cette valeur n'est pas une URL valide.", + }, + }, + menuAttached: { + label: "Attacher au menu", + }, + type: { + label: "Type d'élément de navigation", + internal: { + label: "Source interne", + }, + external: { + label: "Source externe", + description: "Chemin de sortie : {value}", + }, + wrapper: { + label: "Élément wrapper", + }, + }, + audience: { + label: "Audience", + placeholder: "Sélectionner l'audience...", + empty: "Il n'y a plus d'audiences", + }, + relatedSection: { + label: "Relation à", + }, + relatedType: { + label: "Type de contenu", + placeholder: "Sélectionner le type de contenu...", + empty: "Il n'y a pas de types de contenu à sélectionner", + }, + related: { + label: "Entité", + placeholder: "Sélectionner l'entité...", + empty: "Il n'y a plus d'entités de \"{ contentTypeName }\" à sélectionner", + }, + i18n: { + locale: { + label: "Copier les détails de", + placeholder: "locale", + button: "Copier", + error: { + generic: "Impossible de copier l'élément", + unavailable: "Version locale indisponible", + }, + }, + }, + button: { + create: "Créer l'élément", + update: "Mettre à jour l'élément", + restore: "Restaurer l'élément", + remove: "Supprimer", + save: "Enregistrer", + cancel: "Annuler", + }, + }, + }, + }, + notification: { + navigation: { + submit: "Les modifications de navigation ont été enregistrées", + error: "Chemin en double : \"{ path }\" dans le parent : \"{ parentTitle }\" pour { errorTitles } éléments", + item: { + relation: "La relation de l'entité n'existe pas !", + status: { + draft: "brouillon", + published: "publié", + }, + }, + }, + error: { + common: "Erreur lors du traitement de la demande.", + customField: { + type: "Type de champ personnalisé non pris en charge", + media: { + missing: "Le composant d'entrée média est manquant", + }, + }, + item: { + relation: "Les relations fournies dans certains éléments sont incorrectes", + slug: "Impossible de créer une clé de routeur UI valide (slug) à partir de \"{ query }\". \"{ result }\" reçu", + }, + } + }, + pages: { + auth: { + noAccess: "Pas d'accès", + not: { + allowed: "Oups ! Il semble que vous n'ayez pas accès à cette page...", + }, + }, + main: { + search: { + placeholder: "Tapez pour commencer à rechercher...", + subLabel: "appuyez sur ENTRÉE pour mettre en surbrillance l'élément suivant", + }, + header: { + localization: { + select: { + placeholder: "Sélectionner la locale", + }, + }, + }, + }, + settings: { + title: "Paramètres de navigation", + general: { + title: "Paramètres généraux", + }, + additional: { + title: "Paramètres supplémentaires", + }, + customFields: { + title: "Paramètres des champs personnalisés", + }, + nameField: { + title: "Paramètres des types de contenu", + }, + restoring: { + title: "Restauration", + }, + section: { + title: "Plugin de navigation", + subtitle: "Configuration", + }, + header: { + title: "Navigation", + description: "Configurer le plugin de navigation", + }, + form: { + cascadeMenuAttached: { + label: "Cascade du menu attaché", + hint: "Désactiver si vous ne voulez pas que \"Menu attaché\" se propage aux éléments enfants", + }, + preferCustomContentTypes: { + label: "Préférer les types de contenu personnalisés", + hint: "Préférer utiliser uniquement les types de contenu préfixés par api::", + }, + contentTypes: { + label: "Activer la navigation pour", + placeholder: "ex. Pages, Articles", + hint: "Si aucun n'est sélectionné, aucun des types de contenu n'est activé", + }, + i18n: { + label: "i18n", + hint: "Activer l'internationalisation", + hintMissingDefaultLocale: "Locale par défaut manquante !", + }, + allowedLevels: { + label: "Niveaux autorisés", + placeholder: "ex. 2", + hint: "Niveau maximum pour lequel vous pouvez marquer un élément comme \"Menu attaché\"", + }, + audience: { + label: "Audience", + hint: "Activer le champ audience", + }, + nameField: { + default: "Par défaut", + label: "Champs de nom", + placeholder: "Sélectionner au moins un ou laisser vide pour appliquer les valeurs par défaut", + hint: "Si laissé vide, le champ de nom prendra les champs suivants par ordre : \"titre\", \"sujet\" et \"nom\"", + empty: "Ce type de contenu n'a pas d'attributs de chaîne", + }, + populate: { + label: "Champs à remplir", + placeholder: "Sélectionner au moins un ou laisser vide pour désactiver le remplissage des champs de relation", + hint: "Les champs de relation sélectionnés seront remplis dans les réponses de l'API", + empty: "Ce type de contenu n'a pas de champs de relation", + }, + pathDefaultFields: { + label: "Champs par défaut du chemin", + placeholder: "Sélectionner au moins un ou laisser vide pour désactiver le remplissage du champ de chemin avec la valeur des attributs", + hint: "La valeur de l'attribut sélectionné sera la valeur par défaut pour le chemin interne", + empty: "Ce type de contenu n'a pas d'attributs appropriés", + }, + contentTypesSettings: { + label: "Types de contenu", + tooltip: "Configuration personnalisée par type de contenu", + initializationWarning: { + title: "Avertissement", + content: "- Le type de contenu n'a pas encore été initialisé. Initialisez-le d'abord pour pouvoir l'utiliser dans un éditeur visuel.", + }, + }, + customFields: { + table: { + confirmation: { + header: "Suppression du champ personnalisé", + message: "Cette action entraînera la suppression de toutes les valeurs des champs personnalisés des éléments de navigation.", + confirm: "Continuer", + error: "Une erreur est survenue lors de la suppression du champ personnalisé", + }, + header: { + name: "Nom", + label: "Étiquette", + type: "Type", + required: "Requis", + }, + footer: "Créer un nouveau champ personnalisé", + edit: "Modifier le champ personnalisé", + enable: "Activer le champ personnalisé", + disable: "Désactiver le champ personnalisé", + remove: "Supprimer le champ personnalisé", + required: "requis", + notRequired: "non requis", + }, + popup: { + header: { + edit: "Modifier le champ personnalisé", + new: "Ajouter un nouveau champ personnalisé", + }, + name: { + label: "Nom du champ personnalisé", + placeholder: "exemple_nom", + description: "Le nom du champ personnalisé doit être unique", + }, + label: { + label: "Étiquette du champ personnalisé", + placeholder: "Exemple d'étiquette", + description: "Cette étiquette sera affichée sur le formulaire de l'élément de navigation", + }, + type: { + label: "Type de champ personnalisé", + }, + required: { + label: "Champ requis", + description: "Activer ce champ ne changera pas les éléments de navigation déjà existants", + }, + options: { + label: "Options pour l'entrée de sélection", + description: "Activer ce champ ne changera pas les éléments de navigation déjà existants", + }, + multi: { + label: "Activer l'entrée de plusieurs options", + }, + }, + }, + }, + actions: { + submit: "Enregistrer la configuration", + restore: { + label: "Restaurer la configuration", + confirmation: { + header: "Voulez-vous continuer ?", + confirm: "Restaurer", + description: "La configuration du plugin sera restaurée à partir du fichier plugins.js.", + }, + description: "La restauration de la configuration du plugin entraînera son remplacement par la configuration enregistrée dans le fichier 'plugins.js'.", + }, + restart: { + label: "Redémarrer Strapi", + alert: { + title: "Strapi nécessite un redémarrage", + description: "Vous avez apporté des modifications à la configuration qui nécessitent le redémarrage de votre application Strapi pour prendre effet. Faites-le manuellement ou en utilisant le déclencheur ci-dessous.", + close: "Ignorer", + cancel: "Annuler", + reason: { + I18N: "Les modifications de l'internationalisation (i18n) seront appliquées.", + GRAPH_QL: "Les modifications de GraphQL seront appliquées.", + I18N_NAVIGATIONS_PRUNE: "Les navigations de locale obsolètes seront supprimées.", + }, + }, + }, + disableI18n: { + confirmation: { + header: "Désactivation de l'internationalisation", + confirm: "Je comprends", + description: { + line1: "Vous désactivez l'internationalisation pour la navigation. Les navigations pour les locales différentes de la locale par défaut ne sont pas disponibles pour la visualisation et les modifications via ce plugin.", + line2: "Vous pouvez choisir de supprimer les navigations pour d'autres locales.", + line3: "Rappelez-vous ! La suppression est irréversible", + }, + }, + prune: { + label: "Navigations obsolètes", + on: "Supprimer", + off: "Garder", + }, + }, + }, + notification: { + fetch: { + error: "Échec de la récupération de la configuration. Nouvelle tentative...", + }, + submit: { + success: "La configuration a été mise à jour avec succès", + error: "La mise à jour de la configuration a échoué", + }, + restore: { + success: "La configuration a été restaurée avec succès", + error: "La restauration de la configuration a échoué", + }, + restart: { + success: "L'application a été redémarrée avec succès", + error: "Échec du redémarrage de votre application. Essayez de le faire manuellement.", + }, + }, + }, + view: { + actions: { + i18nCopyItems: { + confirmation: { + header: "Confirmation", + confirm: "Copier", + content: "Voulez-vous copier les éléments de navigation ?", + }, + }, + }, + }, + }, + components: { + toggle: { + enabled: "Activé", + disabled: "Désactivé", + }, + navigationItem: { + action: { + newItem: "Ajouter un élément imbriqué", + edit: "Modifier", + view: "Voir", + restore: "Restaurer", + remove: "Supprimer", + }, + badge: { + removed: "Supprimé", + draft: "Brouillon", + published: "Publié", + }, + related: { + localeMissing: "(Falta la versió local)" + }, + }, + confirmation: { + dialog: { + button: { + cancel: "Annuler", + confirm: "Confirmer", + }, + description: "Voulez-vous continuer ?", + header: "Confirmation", + }, + }, + notAccessPage: { + back: "Retour à la page d'accueil", + }, + }, + view: { + i18n: { + fill: { + option: "locale {locale}", + cta: { + header: "ou démarrer", + button: "copier", + }, + }, + }, + }, +}; + +export default ca; diff --git a/admin/src/translations/en.json b/admin/src/translations/en.json deleted file mode 100644 index 95ab4ecc..00000000 --- a/admin/src/translations/en.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "plugin.name": "UI Navigation", - "header.title": "Navigation", - "header.description": "Define your portal navigation", - "header.meta": "ID: { id }, slug: { key }", - "header.action.newItem": "New Item", - "header.action.manage": "Manage", - "header.action.collapseAll": "Collapse All", - "header.action.expandAll": "Expand All", - "submit.cta.cancel": "Cancel", - "submit.cta.save": "Save", - "submit.cta.cache.purge": "Clear cache", - "empty": "Your navigation is empty", - "empty.cta": "Create first item", - "popup.item.header.view": "View navigation item", - "popup.item.header.edit": "Edit navigation item", - "popup.item.header.new": "New navigation item", - "popup.item.form.title.label": "Title", - "popup.item.form.autoSync.label": "Read fields from related", - "popup.item.form.title.placeholder": "Enter the item title or leave blank to pull from related entity", - "popup.item.form.uiRouterKey.label": "UI router key", - "popup.item.form.uiRouterKey.placeholder": "If empty, auto generated by \"Title\"", - "popup.item.form.path.label": "URL", - "popup.item.form.path.placeholder": "Unique url part identifies this item", - "popup.item.form.path.preview": "Preview:", - "popup.item.form.externalPath.label": "External URL", - "popup.item.form.externalPath.placeholder": "Link to the external source", - "popup.item.form.externalPath.validation.type": "This value is not a proper url.", - "popup.item.form.menuAttached.label": "Attach to menu", - "popup.item.form.type.label": "Navigation item type", - "popup.item.form.type.internal.label": "Internal source", - "popup.item.form.type.external.label": "External source", - "popup.item.form.type.wrapper.label": "Wrapper element", - "popup.item.form.type.external.description": "Output path: {value}", - "popup.item.form.audience.label": "Audience", - "popup.item.form.audience.placeholder": "Select audience...", - "popup.item.form.audience.empty": "There are no more audiences", - "popup.item.form.relatedSection.label": "Relation to", - "popup.item.form.relatedType.label": "Content Type", - "popup.item.form.relatedType.placeholder": "Select content type...", - "popup.item.form.relatedType.empty": "There are no content types to select", - "popup.item.form.i18n.locale.label": "Copy details from", - "popup.item.form.i18n.locale.placeholder": "locale", - "popup.item.form.i18n.locale.button": "Copy", - "popup.item.form.i18n.locale.error.generic": "Unable to copy item", - "popup.item.form.i18n.locale.error.unavailable": "Locale version unavailable", - "popup.item.form.related.label": "Entity", - "popup.item.form.related.empty": "There are no more entities of \"{ contentTypeName }\" to select", - "popup.item.form.button.create": "Create item", - "popup.item.form.button.update": "Update item", - "popup.item.form.button.restore": "Restore item", - "popup.item.form.button.remove": "Remove", - "popup.item.form.button.save": "Save", - "popup.item.form.button.cancel": "Cancel", - "popup.navigation.form.name.label": "Name", - "popup.navigation.form.name.placeholder": "Navigations's name", - "popup.navigation.form.visible.label": "Visibility", - "popup.navigation.form.validation.name.alreadyUsed": "Name is already used", - "popup.navigation.form.validation.name.required": "Name is required", - "popup.navigation.form.validation.name.tooShort": "Name is too short", - "popup.navigation.form.validation.visible.required": "Visibility is required", - "popup.navigation.manage.table.hasSelected": "{count} entries selected", - "popup.navigation.manage.table.id": "Id", - "popup.navigation.manage.table.name": "Name", - "popup.navigation.manage.table.locale": "Locale versions", - "popup.navigation.manage.table.visibility": "Visibility", - "popup.navigation.manage.button.goBack": "Go back", - "popup.navigation.manage.button.cancel": "Cancel", - "popup.navigation.manage.button.delete": "Delete", - "popup.navigation.manage.button.purge": "Clear read cache", - "popup.navigation.manage.footer.button.purge": "Clear", - "popup.navigation.manage.purge.header": "This action will clear API read cache. This will result in brief slowdown of reads for navigations below.", - "popup.navigation.manage.button.save": "Save", - "popup.navigation.manage.button.edit": "Edit", - "popup.navigation.manage.button.create": "Create", - "popup.navigation.manage.delete.header": "Following navigations will be removed:", - "popup.navigation.manage.header.CACHE_PURGE": "Read cache clear", - "popup.navigation.manage.header.LIST": "All navigations", - "popup.navigation.manage.header.CREATE": "New navigation", - "popup.navigation.manage.header.DELETE": "Deleting", - "popup.navigation.manage.header.ERROR": "Error", - "popup.navigation.manage.header.EDIT": "Editing \"{name}\"", - "popup.navigation.manage.error.message": "An error happened :(", - "popup.navigation.manage.navigation.visible": "visible", - "popup.navigation.manage.navigation.hidden": "hidden", - "notification.navigation.submit": "Navigation changes has been saved", - "notification.navigation.error": "Duplicate path: \"{ path }\" in parent: \"{ parentTitle }\" for { errorTitles } items", - "notification.navigation.item.relation": "Entity relation does not exist!", - "notification.navigation.item.relation.status.draft": "draft", - "notification.navigation.item.relation.status.published": "published", - "notification.error": "Error while processing request.", - "notification.error.customField.type": "Unsupported type of custom field", - "notification.error.customField.media.missing": "Media input component is missing", - "notification.error.item.relation": "Relations provided in some items are incorrect", - "notification.error.item.slug": "Unable to create valid UI Router Key(slug) from \"{ query }\". \"{ result }\" received", - "page.auth.noAccess": "No access", - "page.auth.not.allowed": "Oops! It seems like You do not have access to this page...", - "pages.main.search.placeholder": "Type to start searching...", - "pages.main.search.subLabel": "press ENTER to highlight next item", - "pages.main.header.localization.select.placeholder": "Select locale", - "pages.settings.general.title": "General settings", - "pages.settings.additional.title": "Additional settings", - "pages.settings.customFields.title": "Custom fields settings", - "pages.settings.nameField.title": "Content types settings", - "pages.settings.restoring.title": "Restoring", - "pages.settings.section.title": "Navigation Plugin", - "pages.settings.section.subtitle": "Configuration", - "pages.settings.header.title": "Navigation", - "pages.settings.header.description": "Configure the navigation plugin", - "pages.settings.actions.restart": "Restart Strapi", - "pages.settings.actions.submit": "Save configuration", - "pages.settings.actions.restore": "Restore configuration", - "pages.settings.actions.restore.confirmation.header": "Do you want to continue?", - "pages.settings.actions.restore.confirmation.confirm": "Restore", - "pages.settings.actions.restore.confirmation.description": "Plugin config will be restored from plugins.js file.", - "pages.settings.actions.restore.description": "Restoring the plugin configuration will cause it to be replaced with configuration saved inside 'plugins.js' file.", - "pages.settings.actions.restart.alert.title": "Strapi requires restart", - "pages.settings.actions.restart.alert.description": "You've made a configuration changes which requires your Strapi application to be restarted to take an effect. Do it manually or by using below trigger.", - "pages.settings.actions.restart.alert.reason.I18N": "Internationalization(i18n) changes will be applied.", - "pages.settings.actions.restart.alert.reason.GRAPH_QL": "GraphQL changes will be applied.", - "pages.settings.actions.restart.alert.reason.I18N_NAVIGATIONS_PRUNE": "Obsolete locale navigations will be removed.", - "pages.settings.actions.disableI18n.confirmation.header": "Disabling Internationalization", - "pages.settings.actions.disableI18n.confirmation.confirm": "I understand", - "pages.settings.actions.disableI18n.confirmation.description.line1": "You are disabling Internationalization for Navigation. Navigations for locales different than default are not available for viewing and modifications via this plugin.", - "pages.settings.actions.disableI18n.confirmation.description.line2": "You can choose to remove navigations for other locales.", - "pages.settings.actions.disableI18n.confirmation.description.line3": "Remember! Removal is irreversible", - "pages.settings.actions.disableI18n.prune.label": "Obsolete navigations", - "pages.settings.actions.disableI18n.prune.on": "Remove", - "pages.settings.actions.disableI18n.prune.off": "Keep", - "pages.settings.actions.restart.alert.close": "Discard", - "pages.settings.actions.restart.alert.cancel": "Cancel", - "pages.settings.notification.fetch.error": "Failed to fetch configuration. Retrying...", - "pages.settings.notification.submit.success": "Config has been updated successfully", - "pages.settings.notification.restore.success": "Config has been restored successfully", - "pages.settings.notification.restart.success": "Application has been restarted successfully", - "pages.settings.notification.submit.error": "Config update has failed", - "pages.settings.notification.restore.error": "Config restore has failed", - "pages.settings.notification.restart.error": "Failed to restart your application. Try to do it manually.", - "pages.settings.form.preferCustomContentTypes.label": "Prefer custom content types", - "pages.settings.form.preferCustomContentTypes.hint": "Prefer if to use only api:: prefixed content types", - "pages.settings.form.cascadeMenuAttached.label": "Cascade menu attached", - "pages.settings.form.cascadeMenuAttached.hint": "Disable if you don't want \"Menu attached\" to cascade on child items", - "pages.settings.form.contentTypes.label": "Enable navigation for", - "pages.settings.form.cache.label": "REST cache", - "pages.settings.form.cache.hint": "Enable caching of client read requests", - "pages.settings.form.i18n.label": "i18n", - "pages.settings.form.i18n.hint": "Enable internationalisation", - "pages.settings.form.i18n.hint.missingDefaultLocale": "Default locale missing!", - "pages.settings.form.contentTypes.placeholder": "eg. Pages, Posts", - "pages.settings.form.contentTypes.hint": "If none is selected, also none of the content types are enabled", - "pages.settings.form.allowedLevels.label": "Allowed levels", - "pages.settings.form.allowedLevels.placeholder": "eg. 2", - "pages.settings.form.allowedLevels.hint": "Maximum level for which you're able to mark item as \"Menu attached\"", - "pages.settings.form.audience.label": "Audience", - "pages.settings.form.audience.hint": "Enable audience field", - "pages.settings.form.nameField.label": "Name fields", - "pages.settings.form.nameField.placeholder": "Select at least one or leave empty to apply defaults", - "pages.settings.form.nameField.hint": "If left empty name field is going to take following ordered fields: \"title\", \"subject\" and \"name\"", - "pages.settings.form.nameField.empty": "This content type doesn't have any string attributes", - "pages.settings.form.populate.label": "Fields to populate", - "pages.settings.form.populate.placeholder": "Select at least one or leave empty to disable populating relation fields", - "pages.settings.form.populate.hint": "Selected relation fields will be populated inside API responses", - "pages.settings.form.populate.empty": "This content type doesn't have any relation fields", - "pages.settings.form.pathDefaultFields.label": "Path default fields", - "pages.settings.form.pathDefaultFields.placeholder": "Select at least one or leave it empty to disable populating path field with attributes value", - "pages.settings.form.pathDefaultFields.hint": "Value of selected attribute will be a default value for internal path", - "pages.settings.form.pathDefaultFields.empty": "This content type doesn't have any suitable attributes", - "pages.settings.form.contentTypesSettings.label": "Content types", - "pages.settings.form.contentTypesSettings.tooltip": "Custom configuration per content type", - "pages.settings.form.contentTypesSettings.initializationWarning.title": "Warning", - "pages.settings.form.contentTypesSettings.initializationWarning.content": "- Content Type hasn't yet been initialized. Initialize it first to be able to use in a Visual Editor.", - "pages.view.actions.i18nCopyItems.confirmation.header": "Confirmation", - "pages.view.actions.i18nCopyItems.confirmation.confirm": "Copy", - "pages.view.actions.i18nCopyItems.confirmation.content": "Do you want to copy navigations items?", - "pages.settings.form.customFields.table.confirmation.header": "Removing custom field", - "pages.settings.form.customFields.table.confirmation.message": "This action will cause removing all custom fields values from navigation items.", - "pages.settings.form.customFields.table.confirmation.confirm": "Continue", - "pages.settings.form.customFields.table.confirmation.error": "An error ocurred while removing custom field", - "pages.settings.form.customFields.table.header.name": "Name", - "pages.settings.form.customFields.table.header.label": "Label", - "pages.settings.form.customFields.table.header.type": "Type", - "pages.settings.form.customFields.table.header.required": "Required", - "pages.settings.form.customFields.table.footer": "Create new custom field", - "pages.settings.form.customFields.table.edit": "Edit custom field", - "pages.settings.form.customFields.table.enable": "Enable custom field", - "pages.settings.form.customFields.table.disable": "Disable custom field", - "pages.settings.form.customFields.table.remove": "Remove custom field", - "pages.settings.form.customFields.table.required": "required", - "pages.settings.form.customFields.table.notRequired": "not required", - "pages.settings.form.customFields.popup.header.edit": "Edit custom field", - "pages.settings.form.customFields.popup.header.new": "Add new custom field", - "pages.settings.form.customFields.popup.name.label": "Custom field name", - "pages.settings.form.customFields.popup.name.placeholder": "example_name", - "pages.settings.form.customFields.popup.name.description": "Name of the custom field must be unique", - "pages.settings.form.customFields.popup.label.label": "Custom field label", - "pages.settings.form.customFields.popup.label.placeholder": "Example label", - "pages.settings.form.customFields.popup.label.description": "This label will be displayed on navigation item form", - "pages.settings.form.customFields.popup.type.label": "Custom field type", - "pages.settings.form.customFields.popup.required.label": "Require field", - "pages.settings.form.customFields.popup.required.description": "Enabling this field will not change already exiting navigation items", - "pages.settings.form.customFields.popup.options.label": "Options for select input", - "pages.settings.form.customFields.popup.options.description": "Enabling this field will not change already exiting navigation items", - "pages.settings.form.customFields.popup.multi.label": "Enable multiple options input", - "components.navigationItem.action.newItem": "Add nested item", - "components.navigationItem.action.edit": "Edit", - "components.navigationItem.action.view": "View", - "components.navigationItem.action.restore": "Restore", - "components.navigationItem.action.remove": "Remove", - "components.navigationItem.badge.removed": "Removed", - "components.navigationItem.badge.draft": "Draft", - "components.navigationItem.badge.published": "Published", - "components.confirmation.dialog.button.cancel": "Cancel", - "components.confirmation.dialog.button.confirm": "Confirm", - "components.confirmation.dialog.description": "Do you want to continue?", - "components.confirmation.dialog.header": "Confirmation", - "components.notAccessPage.back": "Back to homepage", - "view.i18n.fill.cta": "or bootstrap", - "view.i18n.fill.option": "{locale} locale", - "view.i18n.fill.cta.button": "copy" -} diff --git a/admin/src/translations/en.ts b/admin/src/translations/en.ts new file mode 100644 index 00000000..b91d3f48 --- /dev/null +++ b/admin/src/translations/en.ts @@ -0,0 +1,491 @@ +const en = { + plugin: { + name: "UI Navigation", + section: { + name: "Navigation plugin", + item: "Configuration", + }, + }, + header: { + title: "Navigation", + description: "Define your portal navigation", + meta: "ID: { id }, slug: { key }", + action: { + newItem: "New Item", + manage: "Manage", + collapseAll: "Collapse All", + expandAll: "Expand All", + }, + }, + submit: { + cta: { + cancel: "Cancel", + save: "Save", + }, + }, + empty: { + description: "Your navigation is empty", + cta: "Create first item", + }, + popup: { + navigation: { + manage: { + header: { + LIST: "All navigations", + CREATE: "New navigation", + DELETE: "Deleting", + ERROR: "Error", + EDIT: "Editing \"{name}\"", + }, + button: { + cancel: "Cancel", + delete: "Delete", + save: "Save", + edit: "Edit", + create: "Create", + goBack: "Go back", + purge: "Clear read cache", + }, + table: { + id: "Id", + name: "Name", + locale: "Locale versions", + visibility: "Visibility", + hasSelected: "{count} entries selected", + }, + footer: { + button: { + purge: "Clear", + }, + }, + purge: { + header: "This action will clear API read cache. This will result in brief slowdown of reads for navigations below.", + }, + delete: { + header: "Following navigations will be removed:", + }, + error: { + header: "An error happened :(", + message: "An error happened while processing request.", + }, + navigation: { + visible: "visible", + hidden: "hidden", + }, + }, + form: { + name: { + label: "Name", + placeholder: "Navigations's name", + validation: { + name: { + required: "Name is required", + tooShort: "Name is too short", + alreadyUsed: "Name is already used", + }, + visible: { + required: "Visibility is required", + }, + }, + }, + visible: { + label: "Visibility", + toggle: { + visible: "Visible", + hidden: "Hidden", + } + }, + }, + }, + item: { + header: { + view: "View navigation item", + edit: "Edit navigation item", + new: "New navigation item", + }, + form: { + title: { + label: "Title", + autoSync: { + label: "Read fields from related", + }, + placeholder: "Enter the item title or leave blank to pull from related entity", + }, + uiRouterKey: { + label: "UI router key", + placeholder: "If empty, auto generated by \"Title\"", + }, + path: { + label: "URL", + placeholder: "Unique url part identifies this item", + preview: "Preview:", + }, + externalPath: { + label: "External URL", + placeholder: "Link to the external source", + validation: { + type: "This value is not a proper url.", + }, + }, + menuAttached: { + label: "Attach to menu", + }, + type: { + label: "Navigation item type", + internal: { + label: "Internal source", + }, + external: { + label: "External source", + description: "Output path: {value}", + }, + wrapper: { + label: "Wrapper element", + }, + }, + audience: { + label: "Audience", + placeholder: "Select audience...", + empty: "There are no more audiences", + }, + relatedSection: { + label: "Relation to", + }, + relatedType: { + label: "Content Type", + placeholder: "Select content type...", + empty: "There are no content types to select", + }, + related: { + label: "Entity", + placeholder: "Select entity...", + empty: "There are no more entities of \"{ contentTypeName }\" to select", + }, + i18n: { + locale: { + label: "Copy details from", + placeholder: "locale", + button: "Copy", + error: { + generic: "Unable to copy item", + unavailable: "Locale version unavailable", + }, + }, + }, + button: { + create: "Create item", + update: "Update item", + restore: "Restore item", + remove: "Remove", + save: "Save", + cancel: "Cancel", + }, + }, + }, + }, + notification: { + navigation: { + submit: "Navigation changes has been saved", + error: "Duplicate path: \"{ path }\" in parent: \"{ parentTitle }\" for { errorTitles } items", + item: { + relation: "Entity relation does not exist!", + status: { + draft: "draft", + published: "published", + }, + }, + }, + error: { + common: "Error while processing request.", + customField: { + type: "Unsupported type of custom field", + media: { + missing: "Media input component is missing", + }, + }, + item: { + relation: "Relations provided in some items are incorrect", + slug: "Unable to create valid UI Router Key(slug) from \"{ query }\". \"{ result }\" received", + }, + } + }, + pages: { + auth: { + noAccess: "No access", + not: { + allowed: "Oops! It seems like You do not have access to this page...", + }, + }, + main: { + search: { + placeholder: "Type to start searching...", + subLabel: "press ENTER to highlight next item", + }, + header: { + localization: { + select: { + placeholder: "Select locale", + }, + }, + }, + }, + settings: { + title: "Navigation settings", + general: { + title: "General settings", + }, + additional: { + title: "Additional settings", + }, + customFields: { + title: "Custom fields settings", + }, + nameField: { + title: "Content types settings", + }, + restoring: { + title: "Restoring", + }, + section: { + title: "Navigation Plugin", + subtitle: "Configuration", + }, + header: { + title: "Navigation", + description: "Configure the navigation plugin", + }, + form: { + cascadeMenuAttached: { + label: "Cascade menu attached", + hint: "Disable if you don't want \"Menu attached\" to cascade on child items", + }, + preferCustomContentTypes: { + label: "Prefer API Content Types", + hint: "Prefer if to use only api:: prefixed content types", + }, + contentTypes: { + label: "Enable navigation for", + placeholder: "eg. Pages, Posts", + hint: "If none is selected, also none of the content types are enabled", + }, + i18n: { + label: "i18n", + hint: "Enable internationalisation", + hintMissingDefaultLocale: "Default locale missing!", + }, + allowedLevels: { + label: "Allowed levels", + placeholder: "eg. 2", + hint: "Maximum level for which you're able to mark item as \"Menu attached\"", + }, + audience: { + label: "Audience", + hint: "Enable audience field", + }, + nameField: { + default: "Default", + label: "Name fields", + placeholder: "Select at least one or leave empty to apply defaults", + hint: "If left empty name field is going to take following ordered fields: \"title\", \"subject\" and \"name\"", + empty: "This content type doesn't have any string attributes", + }, + populate: { + label: "Fields to populate", + placeholder: "Select at least one or leave empty to disable populating relation fields", + hint: "Selected relation fields will be populated inside API responses", + empty: "This content type doesn't have any relation fields", + }, + pathDefaultFields: { + label: "Path default fields", + placeholder: "Select at least one or leave it empty to disable populating path field with attributes value", + hint: "Value of selected attribute will be a default value for internal path", + empty: "This content type doesn't have any suitable attributes", + }, + contentTypesSettings: { + label: "Content types", + tooltip: "Custom configuration per content type", + initializationWarning: { + title: "Warning", + content: "- Content Type hasn't yet been initialized. Initialize it first to be able to use in a Visual Editor.", + }, + }, + customFields: { + table: { + confirmation: { + header: "Removing custom field", + message: "This action will cause removing all custom fields values from navigation items.", + confirm: "Continue", + error: "An error ocurred while removing custom field", + }, + header: { + name: "Name", + label: "Label", + type: "Type", + required: "Required", + }, + footer: "Create new custom field", + edit: "Edit custom field", + enable: "Enable custom field", + disable: "Disable custom field", + remove: "Remove custom field", + required: "required", + notRequired: "not required", + }, + popup: { + header: { + edit: "Edit custom field", + new: "Add new custom field", + }, + name: { + label: "Custom field name", + placeholder: "example_name", + description: "Name of the custom field must be unique", + }, + label: { + label: "Custom field label", + placeholder: "Example label", + description: "This label will be displayed on navigation item form", + }, + type: { + label: "Custom field type", + description: "Type of the custom field, define how it will be displayed", + }, + required: { + label: "Require field", + description: "Enabling this field will not change already exiting navigation items", + }, + options: { + label: "Options for select input", + description: "Provide options separated by \";\"", + }, + multi: { + label: "Enable multiple options input", + description: "Allow single or multiple options selection", + }, + }, + }, + }, + actions: { + submit: "Save configuration", + restore: { + label: "Restore configuration", + confirmation: { + header: "Do you want to continue?", + confirm: "Restore", + description: "Plugin config will be restored from plugins.js file.", + }, + description: "Restoring the plugin configuration will cause it to be replaced with configuration saved inside 'plugins.js' file.", + }, + restart: { + label: "Restart Strapi", + alert: { + title: "Strapi requires restart", + description: "You've made a configuration changes which requires your Strapi application to be restarted to take an effect. Do it manually or by using below trigger.", + close: "Discard", + cancel: "Cancel", + reason: { + I18N: "Internationalization(i18n) changes will be applied.", + GRAPH_QL: "GraphQL changes will be applied.", + I18N_NAVIGATIONS_PRUNE: "Obsolete locale navigations will be removed.", + }, + }, + }, + disableI18n: { + confirmation: { + header: "Disabling Internationalization", + confirm: "I understand", + description: { + line1: "You are disabling Internationalization for Navigation. Navigations for locales different than default are not available for viewing and modifications via this plugin.", + line2: "You can choose to remove navigations for other locales.", + line3: "Remember! Removal is irreversible", + }, + }, + prune: { + label: "Obsolete navigations", + on: "Remove", + off: "Keep", + }, + }, + }, + notification: { + fetch: { + error: "Failed to fetch configuration. Retrying...", + }, + submit: { + success: "Config has been updated successfully", + error: "Config update has failed", + }, + restore: { + success: "Config has been restored successfully", + error: "Config restore has failed", + }, + restart: { + success: "Application has been restarted successfully", + error: "Failed to restart your application. Try to do it manually.", + }, + }, + }, + view: { + actions: { + i18nCopyItems: { + confirmation: { + header: "Confirmation", + confirm: "Copy", + content: "Do you want to copy navigations items?", + }, + }, + }, + }, + }, + components: { + toggle: { + enabled: "Enabled", + disabled: "Disabled", + }, + navigationItem: { + action: { + newItem: "Add nested item", + edit: "Edit", + view: "View", + restore: "Restore", + remove: "Remove", + }, + badge: { + removed: "Removed", + draft: "Draft", + published: "Published", + }, + related: { + localeMissing: "(Locale version missing)" + }, + }, + confirmation: { + dialog: { + button: { + cancel: "Cancel", + confirm: "Confirm", + }, + description: "Do you want to continue?", + header: "Confirmation", + }, + }, + notAccessPage: { + back: "Back to homepage", + }, + }, + view: { + i18n: { + fill: { + option: "{locale} locale", + cta: { + header: "or bootstrap", + button: "copy", + }, + }, + }, + }, +}; + +export default en; + +export type EN = typeof en; diff --git a/admin/src/translations/fr.json b/admin/src/translations/fr.json deleted file mode 100644 index 2e824c8f..00000000 --- a/admin/src/translations/fr.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "plugin.name": "UI Navigation", - "header.title": "Navigation", - "header.description": "Définisser votre menu de navigation", - "header.meta": "ID: { id }, slug: { key }", - "submit.cta.cancel": "Annuler", - "submit.cta.save": "Sauvegarder", - "empty": "Le menu de navigation est vide", - "empty.cta": "Créer un premier élément", - "popup.item.header": "Modifiez les éléments de navigation", - "popup.item.form.title.label": "Titre", - "popup.item.form.autoSync.label": "Lire les champs associés", - "popup.item.form.title.placeholder": "Saisissez le titre de l'élément ou laissez le champ vide pour utiliser celui de l'entité associée", - "popup.item.form.uiRouterKey.label": "Clé de routeur pour l'interface utilisateur", - "popup.item.form.uiRouterKey.placeholder": "Si vide, généré automatiquement par \"Title\"", - "popup.item.form.path.label": "URL", - "popup.item.form.path.placeholder": "Une partie d'URL unique identifie cet élément", - "popup.item.form.path.preview": "Aperçu:", - "popup.item.form.externalPath.label": "URL externe", - "popup.item.form.externalPath.placeholder": "Lien vers la source externe", - "popup.item.form.externalPath.validation.type": "Cette valeur d'URL n'est pas correcte.", - "popup.item.form.menuAttached.label": "Ajouter au menu", - "popup.item.form.type.label": "Type", - "popup.item.form.type.internal.label": "Interne", - "popup.item.form.type.external.label": "Externe", - "popup.item.form.audience.label": "Audience", - "popup.item.form.audience.placeholder": "Écrivez pour lancer la recherche...", - "popup.item.form.relatedSection.label": "Relation avec", - "popup.item.form.relatedType.label": "Type de contenu", - "popup.item.form.related.label": "Entitée", - "popup.item.form.related.empty": "Il n'y a plus d'entitée \"{ contentTypeName }\", que vous pouvez sélectionner", - "popup.item.form.button.create": "Créer un élément", - "popup.item.form.button.update": "Modifier l'élément", - "popup.item.form.button.restore": "Restaurer l'élément", - "popup.item.form.button.remove": "Supprimer", - "popup.item.form.button.save": "Sauvegarder", - "popup.item.form.button.cancel": "Annuler", - "notification.navigation.submit": "Les modifications de navigation ont été enregistrées", - "notification.navigation.error": "Chemin indisponible: { path } dans le parent: { parentTitle } pour l'élément { errorTitles }", - "notification.navigation.item.relation": "L'entitée n'a pas de relations!", - "notification.navigation.item.relation.status.draft": "brouillon", - "notification.navigation.item.relation.status.published": "publié", - "components.navigationItem.action.newItem": "Nouvel élément imbriqué", - "components.navigationItem.badge.removed": "Supprimé", - "components.navigationItem.badge.draft": "Brouillon", - "components.navigationItem.badge.published": "Publié", - "notification.error.item.slug": "Impossible de créer une clé de routeur d'interface utilisateur valide (slug) à partir de \"{ query }\". \"{ result }\" reçu" -} \ No newline at end of file diff --git a/admin/src/translations/fr.ts b/admin/src/translations/fr.ts new file mode 100644 index 00000000..086ed2ed --- /dev/null +++ b/admin/src/translations/fr.ts @@ -0,0 +1,489 @@ +const fr = { + plugin: { + name: "Navigation UI", + section: { + name: "Plugin de navigation", + item: "Configuration", + }, + }, + header: { + title: "Navigation", + description: "Définissez la navigation de votre portail", + meta: "ID: { id }, slug: { key }", + action: { + newItem: "Nouvel élément", + manage: "Gérer", + collapseAll: "Tout réduire", + expandAll: "Tout développer", + }, + }, + submit: { + cta: { + cancel: "Annuler", + save: "Enregistrer", + }, + }, + empty: { + description: "Votre navigation est vide", + cta: "Créer le premier élément", + }, + popup: { + navigation: { + manage: { + header: { + LIST: "Toutes les navigations", + CREATE: "Nouvelle navigation", + DELETE: "Suppression", + ERROR: "Erreur", + EDIT: "Édition de \"{name}\"", + }, + button: { + cancel: "Annuler", + delete: "Supprimer", + save: "Enregistrer", + edit: "Modifier", + create: "Créer", + goBack: "Retourner", + purge: "Effacer le cache de lecture", + }, + table: { + id: "Id", + name: "Nom", + locale: "Versions locales", + visibility: "Visibilité", + hasSelected: "{count} entrées sélectionnées", + }, + footer: { + button: { + purge: "Effacer", + }, + }, + purge: { + header: "Cette action effacera le cache de lecture de l'API. Cela entraînera un ralentissement temporaire des lectures pour les navigations ci-dessous.", + }, + delete: { + header: "Les navigations suivantes seront supprimées :", + }, + error: { + header: "Une erreur est survenue :(", + message: "Une erreur est survenue lors du traitement de la demande.", + }, + navigation: { + visible: "visible", + hidden: "caché", + }, + }, + form: { + name: { + label: "Nom", + placeholder: "Nom de la navigation", + validation: { + name: { + required: "Le nom est requis", + tooShort: "Le nom est trop court", + alreadyUsed: "Le nom est déjà utilisé", + }, + visible: { + required: "La visibilité est requise", + }, + }, + }, + visible: { + label: "Visibilité", + toggle: { + visible: "Visible", + hidden: "Caché", + } + }, + }, + }, + item: { + header: { + view: "Voir l'élément de navigation", + edit: "Modifier l'élément de navigation", + new: "Nouvel élément de navigation", + }, + form: { + title: { + label: "Titre", + autoSync: { + label: "Lire les champs de la relation", + }, + placeholder: "Entrez le titre de l'élément ou laissez vide pour tirer de l'entité liée", + }, + uiRouterKey: { + label: "Clé du routeur UI", + placeholder: "Si vide, généré automatiquement par \"Titre\"", + }, + path: { + label: "URL", + placeholder: "Partie unique de l'URL identifiant cet élément", + preview: "Aperçu :", + }, + externalPath: { + label: "URL externe", + placeholder: "Lien vers la source externe", + validation: { + type: "Cette valeur n'est pas une URL valide.", + }, + }, + menuAttached: { + label: "Attacher au menu", + }, + type: { + label: "Type d'élément de navigation", + internal: { + label: "Source interne", + }, + external: { + label: "Source externe", + description: "Chemin de sortie : {value}", + }, + wrapper: { + label: "Élément wrapper", + }, + }, + audience: { + label: "Audience", + placeholder: "Sélectionner l'audience...", + empty: "Il n'y a plus d'audiences", + }, + relatedSection: { + label: "Relation à", + }, + relatedType: { + label: "Type de contenu", + placeholder: "Sélectionner le type de contenu...", + empty: "Il n'y a pas de types de contenu à sélectionner", + }, + related: { + label: "Entité", + placeholder: "Sélectionner l'entité...", + empty: "Il n'y a plus d'entités de \"{ contentTypeName }\" à sélectionner", + }, + i18n: { + locale: { + label: "Copier les détails de", + placeholder: "locale", + button: "Copier", + error: { + generic: "Impossible de copier l'élément", + unavailable: "Version locale indisponible", + }, + }, + }, + button: { + create: "Créer l'élément", + update: "Mettre à jour l'élément", + restore: "Restaurer l'élément", + remove: "Supprimer", + save: "Enregistrer", + cancel: "Annuler", + }, + }, + }, + }, + notification: { + navigation: { + submit: "Les modifications de navigation ont été enregistrées", + error: "Chemin en double : \"{ path }\" dans le parent : \"{ parentTitle }\" pour { errorTitles } éléments", + item: { + relation: "La relation de l'entité n'existe pas !", + status: { + draft: "brouillon", + published: "publié", + }, + }, + }, + error: { + common: "Erreur lors du traitement de la demande.", + customField: { + type: "Type de champ personnalisé non pris en charge", + media: { + missing: "Le composant d'entrée média est manquant", + }, + }, + item: { + relation: "Les relations fournies dans certains éléments sont incorrectes", + slug: "Impossible de créer une clé de routeur UI valide (slug) à partir de \"{ query }\". \"{ result }\" reçu", + }, + } + }, + pages: { + auth: { + noAccess: "Pas d'accès", + not: { + allowed: "Oups ! Il semble que vous n'ayez pas accès à cette page...", + }, + }, + main: { + search: { + placeholder: "Tapez pour commencer à rechercher...", + subLabel: "appuyez sur ENTRÉE pour mettre en surbrillance l'élément suivant", + }, + header: { + localization: { + select: { + placeholder: "Sélectionner la locale", + }, + }, + }, + }, + settings: { + title: "Paramètres de navigation", + general: { + title: "Paramètres généraux", + }, + additional: { + title: "Paramètres supplémentaires", + }, + customFields: { + title: "Paramètres des champs personnalisés", + }, + nameField: { + title: "Paramètres des types de contenu", + }, + restoring: { + title: "Restauration", + }, + section: { + title: "Plugin de navigation", + subtitle: "Configuration", + }, + header: { + title: "Navigation", + description: "Configurer le plugin de navigation", + }, + form: { + cascadeMenuAttached: { + label: "Cascade du menu attaché", + hint: "Désactiver si vous ne voulez pas que \"Menu attaché\" se propage aux éléments enfants", + }, + preferCustomContentTypes: { + label: "Préférer les types de contenu API", + hint: "Préférer utiliser uniquement les types de contenu préfixés par api::", + }, + contentTypes: { + label: "Activer la navigation pour", + placeholder: "ex. Pages, Articles", + hint: "Si aucun n'est sélectionné, aucun des types de contenu n'est activé", + }, + i18n: { + label: "i18n", + hint: "Activer l'internationalisation", + hintMissingDefaultLocale: "Locale par défaut manquante !", + }, + allowedLevels: { + label: "Niveaux autorisés", + placeholder: "ex. 2", + hint: "Niveau maximum pour lequel vous pouvez marquer un élément comme \"Menu attaché\"", + }, + audience: { + label: "Audience", + hint: "Activer le champ audience", + }, + nameField: { + default: "Par défaut", + label: "Champs de nom", + placeholder: "Sélectionner au moins un ou laisser vide pour appliquer les valeurs par défaut", + hint: "Si laissé vide, le champ de nom prendra les champs suivants par ordre : \"titre\", \"sujet\" et \"nom\"", + empty: "Ce type de contenu n'a pas d'attributs de chaîne", + }, + populate: { + label: "Champs à remplir", + placeholder: "Sélectionner au moins un ou laisser vide pour désactiver le remplissage des champs de relation", + hint: "Les champs de relation sélectionnés seront remplis dans les réponses de l'API", + empty: "Ce type de contenu n'a pas de champs de relation", + }, + pathDefaultFields: { + label: "Champs par défaut du chemin", + placeholder: "Sélectionner au moins un ou laisser vide pour désactiver le remplissage du champ de chemin avec la valeur des attributs", + hint: "La valeur de l'attribut sélectionné sera la valeur par défaut pour le chemin interne", + empty: "Ce type de contenu n'a pas d'attributs appropriés", + }, + contentTypesSettings: { + label: "Types de contenu", + tooltip: "Configuration personnalisée par type de contenu", + initializationWarning: { + title: "Avertissement", + content: "- Le type de contenu n'a pas encore été initialisé. Initialisez-le d'abord pour pouvoir l'utiliser dans un éditeur visuel.", + }, + }, + customFields: { + table: { + confirmation: { + header: "Suppression du champ personnalisé", + message: "Cette action entraînera la suppression de toutes les valeurs des champs personnalisés des éléments de navigation.", + confirm: "Continuer", + error: "Une erreur est survenue lors de la suppression du champ personnalisé", + }, + header: { + name: "Nom", + label: "Étiquette", + type: "Type", + required: "Requis", + }, + footer: "Créer un nouveau champ personnalisé", + edit: "Modifier le champ personnalisé", + enable: "Activer le champ personnalisé", + disable: "Désactiver le champ personnalisé", + remove: "Supprimer le champ personnalisé", + required: "requis", + notRequired: "non requis", + }, + popup: { + header: { + edit: "Modifier le champ personnalisé", + new: "Ajouter un nouveau champ personnalisé", + }, + name: { + label: "Nom du champ personnalisé", + placeholder: "exemple_nom", + description: "Le nom du champ personnalisé doit être unique", + }, + label: { + label: "Étiquette du champ personnalisé", + placeholder: "Exemple d'étiquette", + description: "Cette étiquette sera affichée sur le formulaire de l'élément de navigation", + }, + type: { + label: "Type de champ personnalisé", + description: "Le type de champ personnalisé détermine le type de données que le champ peut contenir", + }, + required: { + label: "Champ requis", + description: "Activer ce champ ne changera pas les éléments de navigation déjà existants", + }, + options: { + label: "Options pour l'entrée de sélection", + description: "Fournir des options séparées par \";\"", + }, + multi: { + label: "Activer l'entrée de plusieurs options", + description: "Autoriser la sélection simple ou multiple", + }, + }, + }, + }, + actions: { + submit: "Enregistrer la configuration", + restore: { + label: "Restaurer la configuration", + confirmation: { + header: "Voulez-vous continuer ?", + confirm: "Restaurer", + description: "La configuration du plugin sera restaurée à partir du fichier plugins.js.", + }, + description: "La restauration de la configuration du plugin entraînera son remplacement par la configuration enregistrée dans le fichier 'plugins.js'.", + }, + restart: { + label: "Redémarrer Strapi", + alert: { + title: "Strapi nécessite un redémarrage", + description: "Vous avez apporté des modifications à la configuration qui nécessitent le redémarrage de votre application Strapi pour prendre effet. Faites-le manuellement ou en utilisant le déclencheur ci-dessous.", + close: "Ignorer", + cancel: "Annuler", + reason: { + I18N: "Les modifications de l'internationalisation (i18n) seront appliquées.", + GRAPH_QL: "Les modifications de GraphQL seront appliquées.", + I18N_NAVIGATIONS_PRUNE: "Les navigations de locale obsolètes seront supprimées.", + }, + }, + }, + disableI18n: { + confirmation: { + header: "Désactivation de l'internationalisation", + confirm: "Je comprends", + description: { + line1: "Vous désactivez l'internationalisation pour la navigation. Les navigations pour les locales différentes de la locale par défaut ne sont pas disponibles pour la visualisation et les modifications via ce plugin.", + line2: "Vous pouvez choisir de supprimer les navigations pour d'autres locales.", + line3: "Rappelez-vous ! La suppression est irréversible", + }, + }, + prune: { + label: "Navigations obsolètes", + on: "Supprimer", + off: "Garder", + }, + }, + }, + notification: { + fetch: { + error: "Échec de la récupération de la configuration. Nouvelle tentative...", + }, + submit: { + success: "La configuration a été mise à jour avec succès", + error: "La mise à jour de la configuration a échoué", + }, + restore: { + success: "La configuration a été restaurée avec succès", + error: "La restauration de la configuration a échoué", + }, + restart: { + success: "L'application a été redémarrée avec succès", + error: "Échec du redémarrage de votre application. Essayez de le faire manuellement.", + }, + }, + }, + view: { + actions: { + i18nCopyItems: { + confirmation: { + header: "Confirmation", + confirm: "Copier", + content: "Voulez-vous copier les éléments de navigation ?", + }, + }, + }, + }, + }, + components: { + toggle: { + enabled: "Activé", + disabled: "Désactivé", + }, + navigationItem: { + action: { + newItem: "Ajouter un élément imbriqué", + edit: "Modifier", + view: "Voir", + restore: "Restaurer", + remove: "Supprimer", + }, + badge: { + removed: "Supprimé", + draft: "Brouillon", + published: "Publié", + }, + related: { + localeMissing: "(Version locale manquante)" + }, + }, + confirmation: { + dialog: { + button: { + cancel: "Annuler", + confirm: "Confirmer", + }, + description: "Voulez-vous continuer ?", + header: "Confirmation", + }, + }, + notAccessPage: { + back: "Retour à la page d'accueil", + }, + }, + view: { + i18n: { + fill: { + option: "locale {locale}", + cta: { + header: "ou démarrer", + button: "copier", + }, + }, + }, + }, +}; + +export default fr; diff --git a/admin/src/translations/index.js b/admin/src/translations/index.js deleted file mode 100644 index f7c1b3f8..00000000 --- a/admin/src/translations/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import pluginId from "../pluginId"; -import en from "./en.json"; -import fr from "./fr.json"; -import ca from "./ca.json"; - -const trads = { - en, - fr, - ca, -}; - -export const getTradId = (msg) => `${pluginId}.${msg}`; -export const getTrad = (msg, defaultMessage) => ({id: getTradId(msg), defaultMessage: defaultMessage || getTradId(msg)}); - -export default trads; diff --git a/admin/src/translations/index.ts b/admin/src/translations/index.ts new file mode 100644 index 00000000..85bf8a3c --- /dev/null +++ b/admin/src/translations/index.ts @@ -0,0 +1,19 @@ +import { Path } from '@sensinum/strapi-utils'; +import type { EN } from './en'; +import { PLUGIN_ID } from '../pluginId'; + +export type TranslationPath = Path; + +const trads = { + en: () => import('./en'), + fr: () => import('./fr'), + ca: () => import('./ca'), +}; + +export const getTradId = (msg: string) => `${PLUGIN_ID}.${msg}`; +export const getTrad = (msg: string, defaultMessage?: string) => ({ + id: getTradId(msg), + defaultMessage: defaultMessage ?? getTradId(msg), +}); + +export default trads; diff --git a/admin/src/types.ts b/admin/src/types.ts new file mode 100644 index 00000000..7c253cd4 --- /dev/null +++ b/admin/src/types.ts @@ -0,0 +1,6 @@ +export type Effect = (value: T) => void; +export type VoidEffect = Effect; +export type ToBeFixed = any; + +export type FormChangeEvent = React.ChangeEvent | string; +export type FormItemErrorSchema = Record; \ No newline at end of file diff --git a/admin/src/utils/api.ts b/admin/src/utils/api.ts deleted file mode 100644 index e6f2f124..00000000 --- a/admin/src/utils/api.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { request } from '@strapi/helper-plugin'; -import { prop } from 'lodash/fp'; -import { NavigationPluginConfig } from '../../../types'; -import pluginId from '../pluginId'; - -export const fetchNavigationConfig = () => - request(`/${pluginId}/settings/config`, { method: 'GET' }); - -export const updateNavigationConfig = ({ body }: { body: NavigationPluginConfig }) => - request(`/${pluginId}/config`, { method: 'PUT', body: (body as unknown as XMLHttpRequestBodyInit) }, true); - -export const restoreNavigationConfig = () => - request(`/${pluginId}/config`, { method: 'DELETE' }, true); - -export const fetchAllContentTypes = async () => - request('/content-manager/content-types', { method: 'GET' }).then(prop("data")); - -export const restartStrapi = () => - request(`/${pluginId}/settings/restart`); diff --git a/admin/src/utils/constants.ts b/admin/src/utils/constants.ts new file mode 100644 index 00000000..59d1ea54 --- /dev/null +++ b/admin/src/utils/constants.ts @@ -0,0 +1 @@ +export const RELATED_ITEM_SEPARATOR = '$'; diff --git a/admin/src/utils/enums.ts b/admin/src/utils/enums.ts deleted file mode 100644 index 73971ff6..00000000 --- a/admin/src/utils/enums.ts +++ /dev/null @@ -1,29 +0,0 @@ -export const navigationItemType = { - INTERNAL: "INTERNAL", - EXTERNAL: "EXTERNAL", - WRAPPER: "WRAPPER", -}; - -export const navigationItemAdditionalFields = { - AUDIENCE: 'audience', -}; - -export const ItemTypes = { - NAVIGATION_ITEM: 'navigationItem' -}; - -export const ResourceState = { - RESOLVED: 'RESOLVED', - LOADING: 'LOADING', - ERROR: 'ERROR', -}; - -export const resolvedResourceFor = (value: T) => ({ - type: ResourceState.RESOLVED, - value, -}); - -export const errorStatusResourceFor = (errors: Array) => ({ - type: ResourceState.ERROR, - errors, -}); \ No newline at end of file diff --git a/admin/src/utils/functions.ts b/admin/src/utils/functions.ts deleted file mode 100644 index 58976d15..00000000 --- a/admin/src/utils/functions.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { get, isEmpty } from 'lodash'; -import { useIntl } from 'react-intl'; -import { NavigationItemAdditionalField, NavigationItemAdditionalFieldValues, ToBeFixed } from '../../../types'; -import { defaultValues as navigationItemFormDefaults } from '../pages/View/components/NavigationItemForm/utils/form'; -import pluginId from '../pluginId'; - -type MessageInput = { - id: string; - defaultMessage?: string; - props?: Record -} | string; - -type PrepareNewValueForRecord = ( - uid: string, - current: Record, - value: string[] -) => Record; - -export const getMessage = (input: MessageInput, defaultMessage: string = '', inPluginScope: boolean = true): string => { - const { formatMessage } = useIntl(); - let formattedId = ''; - if (typeof input === 'string') { - formattedId = input; - } else { - formattedId = input.id.toString() || formattedId; - } - return formatMessage({ - id: `${inPluginScope ? pluginId : 'app.components'}.${formattedId}`, - defaultMessage, - }, typeof input === 'string' ? undefined : input?.props) -}; - -export const getDefaultCustomFields = (args: { - additionalFields: NavigationItemAdditionalField[], - customFieldsValues: NavigationItemAdditionalFieldValues, - defaultCustomFieldsValues: NavigationItemAdditionalFieldValues -}): NavigationItemAdditionalFieldValues => { - return args.additionalFields.reduce((acc, additionalField) => { - if (typeof additionalField === 'string') { - return acc; - } else { - const value = navigationItemFormDefaults.additionalFields[additionalField.type]; - return { - ...acc, - [additionalField.name]: get(args.customFieldsValues, additionalField.name, value), - }; - } - }, {}); -} - -export const prepareNewValueForRecord: PrepareNewValueForRecord = (uid, current, value) => ({ - ...current, - [uid]: value && !isEmpty(value) ? [...value] : undefined, -}); diff --git a/admin/src/utils/getTranslation.ts b/admin/src/utils/getTranslation.ts new file mode 100644 index 00000000..69296100 --- /dev/null +++ b/admin/src/utils/getTranslation.ts @@ -0,0 +1,7 @@ +import { PLUGIN_ID } from '../pluginId'; + +export { getTrad, getTradId } from '../translations'; + +const getTranslation = (id: string) => `${PLUGIN_ID}.${id}`; + +export { getTranslation }; diff --git a/admin/src/utils/index.ts b/admin/src/utils/index.ts deleted file mode 100644 index e53cba3e..00000000 --- a/admin/src/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './functions'; -export * from './api'; -export * from './enums'; \ No newline at end of file diff --git a/admin/src/utils/permissions.ts b/admin/src/utils/permissions.ts new file mode 100644 index 00000000..d2de5e13 --- /dev/null +++ b/admin/src/utils/permissions.ts @@ -0,0 +1,20 @@ +'use strict'; + +const render = (uid: string) => { + return `plugin::navigation.${uid}`; +}; + +const navigation = { + read: 'read', + update: 'update', + settings: 'settings', +}; + +// This should be equal to admin side. Strapi push to make admin and server independent chunks. +const pluginPermissions = { + access: [{ action: render(navigation.read), subject: null }], + update: [{ action: render(navigation.update), subject: null }], + settings: [{ action: render(navigation.settings), subject: null }], +}; + +export default pluginPermissions; diff --git a/admin/src/utils/prefixPluginTranslations.ts b/admin/src/utils/prefixPluginTranslations.ts new file mode 100644 index 00000000..835fb029 --- /dev/null +++ b/admin/src/utils/prefixPluginTranslations.ts @@ -0,0 +1,5 @@ +export const prefixPluginTranslations = (input: Record, pluginId: string) => { + return Object.fromEntries( + Object.entries(input).map(([key, value]) => [[pluginId, key].join('.'), value] as const) + ); +}; diff --git a/admin/tsconfig.build.json b/admin/tsconfig.build.json new file mode 100644 index 00000000..d033e0ca --- /dev/null +++ b/admin/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig", + "include": ["./src", "./custom.d.ts"], + "exclude": ["**/*.test.ts", "**/*.test.tsx"], + "compilerOptions": { + "rootDir": "../", + "baseUrl": ".", + "outDir": "./dist" + } +} diff --git a/admin/tsconfig.json b/admin/tsconfig.json new file mode 100644 index 00000000..5692e7ac --- /dev/null +++ b/admin/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@strapi/typescript-utils/tsconfigs/admin", + "include": ["./src", "./custom.d.ts", "../@types"], + "compilerOptions": { + "rootDir": "../", + "baseUrl": "." + } +} diff --git a/jest.config.ts b/jest.config.ts index ea1d8503..966d4b55 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,22 +1,25 @@ -import type { Config } from '@jest/types'; -import { defaults as tsjPreset } from 'ts-jest/presets' +import type { JestConfigWithTsJest } from 'ts-jest'; +import type { Core } from '@strapi/strapi'; +import { defaults as tsjPreset } from 'ts-jest/presets'; -const config: Config.InitialOptions = { - testMatch: ['**/__tests__/?(*.)+(spec|test).ts'], +const config: JestConfigWithTsJest = { + testMatch: ['**/tests/**/?(*.)+(spec|test).(t|j)s'], transform: { - // TODO: Resolve packages versions - ...tsjPreset.transform as any, + ...tsjPreset.transform, }, - preset: "ts-jest", - coverageDirectory: "./coverage/", + preset: 'ts-jest', + coverageDirectory: './coverage/', collectCoverage: true, + reporters: ['default', 'jest-junit'], globals: { 'ts-jest': { diagnostics: { - warnOnly: true - } - } - } + warnOnly: true, + }, + }, + strapi: {} as Core.Strapi, + }, + prettierPath: null, }; -export default config; \ No newline at end of file +export default config; diff --git a/migrations/strapi-plugin-navigation-3.0.0-no-1-related-id-to-documentid.js b/migrations/strapi-plugin-navigation-3.0.0-no-1-related-id-to-documentid.js new file mode 100644 index 00000000..d4e9365a --- /dev/null +++ b/migrations/strapi-plugin-navigation-3.0.0-no-1-related-id-to-documentid.js @@ -0,0 +1,40 @@ +const SOURCE_TABLE_NAME = 'navigations_items_related'; +const SOURCE_LINK_TABLE_NAME = 'navigations_items_related_links'; +const TARGET_TABLE_NAME = 'navigations_items'; +const RELATED_ITEM_SEPARATOR = '$'; + + +module.exports = { + async up(knex) { + + console.log("Navigation plugin :: Migrations :: Backup navigation item related table - START"); + + // Get all entries and rewrite directly to the navigation_items table + const all = await knex.from(SOURCE_TABLE_NAME).columns('id', 'related_id', 'related_type').select(); + + await Promise.all( + all.map(async (item) => { + const { related_id, related_type, id: row_id} = item; + + if (related_id && related_type && !isNaN(parseInt(related_id, 10))) { + const newRelatedId = `${related_type}${RELATED_ITEM_SEPARATOR}${related_id}`; + const link = await knex.from(SOURCE_LINK_TABLE_NAME).columns('navigation_item_id', 'navigations_items_related_id').select().where({ navigations_items_related_id: row_id }); + const nav_id = link[0].navigation_item_id; + + await knex.from(TARGET_TABLE_NAME).update({ related: newRelatedId }).where({ id: nav_id }); + } + }) + ); + + // Drop the old tables + // await knex.schema.dropTable(SOURCE_TABLE_NAME); + // await knex.schema.dropTable(SOURCE_LINK_TABLE_NAME); + + console.log("Navigation plugin :: Migrations :: Backup navigation item related table - DONE"); + + await strapi.db.transaction(async () => { + // Run related id to document id migration + await strapi.service('plugin::navigation.navigation').migrateRelatedIdToDocumentId(); + }); + }, +}; \ No newline at end of file diff --git a/migrations/strapi-plugin-navigation-3.0.0-no-2-locale-slug-regular-slug.js b/migrations/strapi-plugin-navigation-3.0.0-no-2-locale-slug-regular-slug.js new file mode 100644 index 00000000..728329aa --- /dev/null +++ b/migrations/strapi-plugin-navigation-3.0.0-no-2-locale-slug-regular-slug.js @@ -0,0 +1,31 @@ +const SOURCE_TABLE_NAME = 'navigations'; + + +module.exports = { + async up(knex) { + // Get all entries and rewrite directly to the navigation_items table + const all = await knex.from(SOURCE_TABLE_NAME).columns('id', 'slug', 'locale').select(); + + const run = async () => { + await Promise.all( + all.map(async (item) => { + const { id, slug, locale } = item; + + if (slug && locale && id) { + const regex = new RegExp(`-${locale}$`); + + await knex + .from(SOURCE_TABLE_NAME) + .update({ slug: slug.replace(regex, '') }) + .where({ id }); + } + }) + ); + }; + + await strapi.db.transaction(async () => { + // Run related id to document id migration + await run(); + }); + }, +}; diff --git a/migrations/strapi-plugin-navigation-3.0.0-no-3-morph-relation.js b/migrations/strapi-plugin-navigation-3.0.0-no-3-morph-relation.js new file mode 100644 index 00000000..a26ecd0c --- /dev/null +++ b/migrations/strapi-plugin-navigation-3.0.0-no-3-morph-relation.js @@ -0,0 +1,85 @@ +const SOURCE_TABLE_NAME = "navigations"; +const SOURCE_TABLE_NAME_NAVIGATION_ITEMS = "navigations_items"; +const TARGET_TABLE_NAME = "navigations_items_related_mph"; +const JOIN_TABLE = "navigations_items_master_lnk"; + +const RELATED_ITEM_SEPARATOR = "$"; + +module.exports = { + async up(knex) { + const run = async () => { + let hasMorphTable = false; + + await knex.schema.hasTable(TARGET_TABLE_NAME).then((exists) => { + hasMorphTable = exists; + }); + + if (hasMorphTable) { + return; + } + + await knex.schema.createTable(TARGET_TABLE_NAME, (table) => { + table.increments("id"); + table.integer("navigation_item_id"); + table.integer("related_id"); + table.string("related_type"); + table.string("field"); + table.float("order"); + }); + + const navigations = await knex + .from(SOURCE_TABLE_NAME) + .columns("id", "locale") + .select(); + + for (const navigation of navigations) { + const items = await knex(SOURCE_TABLE_NAME_NAVIGATION_ITEMS) + .join( + JOIN_TABLE, + `${JOIN_TABLE}.navigation_item_id`, + "=", + `${SOURCE_TABLE_NAME_NAVIGATION_ITEMS}.id` + ) + .where(`${JOIN_TABLE}.navigation_id`, navigation.id) + .select( + `${SOURCE_TABLE_NAME_NAVIGATION_ITEMS}.id`, + `${SOURCE_TABLE_NAME_NAVIGATION_ITEMS}.related` + ); + + for (const item of items) { + if (!item.related) { + continue; + } + + const [uid, documentId] = item.related.split(RELATED_ITEM_SEPARATOR); + const repository = uid ? strapi.documents(uid) : undefined; + const related = + uid && repository + ? documentId + ? await repository.findOne({ + documentId, + locale: navigation.locale, + }) + : await repository.findFirst({ locale: navigation.locale }) + : undefined; + + await knex(TARGET_TABLE_NAME).insert({ + navigation_item_id: item.id, + related_id: related.id, + related_type: uid, + order: 1, + }); + } + } + + knex.schema.alterTable( + SOURCE_TABLE_NAME_NAVIGATION_ITEMS, + function (table) { + table.dropColumn("related"); + } + ); + }; + + await strapi.db.transaction(run); + }, +}; diff --git a/package.json b/package.json index 454cf183..c2a434db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-navigation", - "version": "2.5.4", + "version": "3.0.0", "description": "Strapi - Navigation plugin", "strapi": { "name": "navigation", @@ -12,59 +12,6 @@ "type": "git", "url": "https://github.com/VirtusLab/strapi-plugin-navigation" }, - "scripts": { - "publish:latest": "cd build && npm publish --tag latest", - "prepublish:latest": "npm run clean && npm run build && node build/setup-package.js", - "test:unit": "jest --verbose --coverage", - "test:unit:watch": "jest --watch", - "build": "tsc", - "build:dev": "npm run build && cp ./package.json ./build && cd ./build && yarn", - "clean": "rm -rf build", - "develop": "nodemon --exec \"npm run build:dev\"" - }, - "types": "./types/index.d.ts", - "dependencies": { - "@sindresorhus/slugify": "1.1.0", - "@strapi/utils": "^4.25.11", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router": "^5.3.4", - "react-router-dom": "5.3.4", - "react-intl": "6.4.1", - "uuid": "^8.3.0" - }, - "devDependencies": { - "@jest/types": "29.5.x", - "@strapi/admin": "4.25.11", - "@strapi/helper-plugin": "4.25.11", - "@types/jest": "29.5.1", - "@types/koa__router": "^12.0.4", - "@types/lodash": "^4.14.181", - "@types/pluralize": "^0.0.29", - "@types/uuid": "^8.3.4", - "codecov": "^3.7.2", - "formik": "^2.2.9", - "jest": "29.6.0", - "jest-cli": "^27.5.1", - "jest-styled-components": "^7.0.2", - "koa": "^2.8.0", - "nodemon": "^2.0.15", - "strapi-plugin-rest-cache": "^4.2.9", - "strapi-typed": "1.0.20", - "ts-jest": "29.1.1", - "ts-node": "^10.7.0", - "typescript": "5.2.2" - }, - "peerDependencies": { - "@strapi/data-transfer": "4.25.11", - "@strapi/strapi": "4.x", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^5.2.0", - "styled-components": "^5.2.1" - }, "author": { "name": "VirtusLab", "email": "strapi@virtuslab.com", @@ -92,20 +39,124 @@ "url": "https://virtuslab.com" } ], - "engines": { - "node": ">=18.0.0 <=20.x.x", - "npm": ">=6.0.0" + "dependencies": { + "@faker-js/faker": "^9.0.3", + "@sindresorhus/slugify": "1.1.0", + "@tanstack/react-query": "^5.40.0", + "lodash": "^4.17.21", + "pluralize": "8.0.0", + "react": "^18.2.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.2.0", + "react-intl": "6.6.8", + "react-router-dom": "^6.22.3", + "uuid": "^10.0.0", + "zod": "^3.22.5" + }, + "devDependencies": { + "@jest/types": "29.5.x", + "@koa/router": "^12.0.1", + "@sensinum/strapi-utils": "^1.0.4", + "@strapi/design-system": "2.0.0-rc.14", + "@strapi/icons": "2.0.0-rc.14", + "@strapi/plugin-graphql": "^5.5.1", + "@strapi/sdk-plugin": "^5.2.8", + "@strapi/strapi": "^5.5.1", + "@strapi/types": "^5.5.1", + "@strapi/typescript-utils": "^5.5.1", + "@types/jest": "^29.5.12", + "@types/koa": "^2.15.0", + "@types/koa-bodyparser": "^4.3.12", + "@types/koa__router": "^12.0.4", + "@types/lodash": "^4.17.4", + "@types/node": "^20.12.0", + "@types/pluralize": "0.0.33", + "@types/react": "^18.3.8", + "@types/react-dom": "^18.3.0", + "@types/react-router-dom": "5.3.3", + "@types/styled-components": "5.1.34", + "@types/uuid": "^10.0.0", + "codecov": "^3.7.2", + "formik": "^2.2.9", + "husky": "7.0.4", + "jest": "^29.7.0", + "jest-cli": "^29.7.0", + "jest-junit": "^16.0.0", + "jest-styled-components": "^7.1.1", + "koa": "^2.15.3", + "lodash": "^4.17.21", + "nodemon": "^2.0.15", + "prettier": "^3.3.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-intl": "^6.6.8", + "react-query": "3.39.3", + "react-router-dom": "^6.26.2", + "strapi-plugin-rest-cache": "^4.2.9", + "styled-components": "^6.1.13", + "ts-jest": "^29.1.4", + "ts-node": "^10.9.1", + "typescript": "^5.6.2" + }, + "peerDependencies": { + "@strapi/sdk-plugin": "^5.2.8", + "@strapi/strapi": "^5.5.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2", + "styled-components": "^6.1.13" + }, + "husky": { + "hooks": { + "pre-commit": "yarn format && yarn test:unit" + } + }, + "exports": { + "./package.json": "./package.json", + "./strapi-admin": { + "types": "./dist/admin/src/index.d.ts", + "source": "./admin/src/index.ts", + "import": "./dist/admin/index.mjs", + "require": "./dist/admin/index.js", + "default": "./dist/admin/index.js" + }, + "./strapi-server": { + "types": "./dist/server/src/index.d.ts", + "source": "./server/src/index.ts", + "import": "./dist/server/index.mjs", + "require": "./dist/server/index.js", + "default": "./dist/server/index.js" + } }, - "nodemonConfig": { - "ignore": [ - "./build/**/*" - ], - "ext": "js,json,ts" + "files": [ + "dist" + ], + "scripts": { + "prepare": "husky install", + "publish:latest": "npm publish --tag latest", + "publish:beta": "npm publish --tag beta", + "build": "yarn clean && strapi-plugin build", + "clean": "rm -rf dist", + "lint": "prettier --check .", + "format": "prettier --write .", + "test:ts:back": "run -T tsc -p server/tsconfig.json", + "test:ts:front": "run -T tsc -p admin/tsconfig.json", + "test:unit": "jest --coverage", + "test:unit:watch": "jest --watch", + "test:unit:ci": "CI=true jest --ci --runInBand --verbose --coverage", + "verify": "strapi-plugin verify", + "watch": "strapi-plugin watch", + "watch:link": "strapi-plugin watch:link" }, "keywords": [ "strapi", "plugin", "navigation" ], + "engines": { + "node": ">=18.0.0 <=22.x.x", + "npm": ">=6.0.0" + }, "license": "MIT" } diff --git a/server/bootstrap/index.ts b/server/bootstrap/index.ts deleted file mode 100755 index cdd427bf..00000000 --- a/server/bootstrap/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import permissions from "../../permissions"; -import { - IConfigSetupStrategy, - IGraphQLSetupStrategy, - INavigationSetupStrategy, - IRestCacheSetupStrategy, -} from "../../types"; -import { graphQLSetupStrategy } from "../graphql"; -import { navigationSetupStrategy } from "../navigation"; -import { configSetupStrategy } from "../config"; -import { setupCacheStrategy } from "../cache"; - -export = async ({ strapi }: StrapiContext) => { - assertUserPermissionsAvailability({ strapi }); - - await setupPermissions({ strapi }); - await setupConfig({ strapi }); - await setupGraphQL({ strapi }); - await setupNavigation({ strapi }); - await setupCache({ strapi }); -}; - -const assertUserPermissionsAvailability = ({ strapi }: StrapiContext) => { - if (!strapi.plugin("users-permissions")) { - throw new Error( - "In order to make the navigation plugin work the users-permissions plugin is required" - ); - } -}; -const setupGraphQL: IGraphQLSetupStrategy = graphQLSetupStrategy; -const setupNavigation: INavigationSetupStrategy = navigationSetupStrategy; -const setupConfig: IConfigSetupStrategy = configSetupStrategy; -const setupCache: IRestCacheSetupStrategy = setupCacheStrategy; -const setupPermissions = async ({ strapi }: StrapiContext) => { - // Add permissions - const actions = [ - { - section: "plugins", - displayName: "Read", - uid: permissions.navigation.read, - pluginName: "navigation", - }, - { - section: "plugins", - displayName: "Update", - uid: permissions.navigation.update, - pluginName: "navigation", - }, - { - section: "plugins", - displayName: "Settings", - uid: permissions.navigation.settings, - pluginName: "navigation", - }, - ]; - await strapi.admin.services.permission.actionProvider.registerMany(actions); -}; diff --git a/server/cache/__tests__/serviceEnhancers.test.ts b/server/cache/__tests__/serviceEnhancers.test.ts deleted file mode 100644 index 91a4e29c..00000000 --- a/server/cache/__tests__/serviceEnhancers.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { IStrapi } from "strapi-typed"; -import { addCacheConfigFields } from "../serviceEnhancers"; - -describe("Cache", () => { - describe("Enhancers", () => { - describe("addCacheConfigFields()", () => { - it("should return config fields", async () => { - // Given - const cachePlugin = {}; - const pluginStore = { get: jest.fn() }; - const strapi = { - plugin() { - return cachePlugin; - }, - store() { - return pluginStore; - }, - } as unknown as IStrapi; - const previousConfig = { - foo: "bar", - }; - - pluginStore.get.mockReturnValue({ isCacheEnabled: true }); - - // When - const result = await addCacheConfigFields({ strapi, previousConfig }); - - // Then - expect(result).toMatchInlineSnapshot(` - Object { - "foo": "bar", - "isCacheEnabled": true, - "isCachePluginEnabled": true, - } - `); - }); - }); - }); -}); diff --git a/server/cache/__tests__/utils.test.ts b/server/cache/__tests__/utils.test.ts deleted file mode 100644 index b6685bce..00000000 --- a/server/cache/__tests__/utils.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { IStrapi } from "strapi-typed"; -import { getCacheStatus } from "../utils"; - -describe("Cache", () => { - describe("Utils", () => { - describe("getCacheStatus()", () => { - it("should mark cache as disabled if plugin is not installed", async () => { - // Given - const cachePlugin = null; - const pluginStore = { get: jest.fn() }; - const strapi = { - plugin() { - return cachePlugin; - }, - store() { - return pluginStore; - }, - } as unknown as IStrapi; - - // When - const result = await getCacheStatus({ strapi }); - - // Then - expect(result).toMatchInlineSnapshot(` - Object { - "enabled": false, - "hasCachePlugin": false, - } - `); - }); - - it("should mark cache as enabled if it is enabled in config", async () => { - // Given - const cachePlugin = {}; - const pluginStore = { get: jest.fn() }; - const strapi = { - plugin() { - return cachePlugin; - }, - store() { - return pluginStore; - }, - } as unknown as IStrapi; - - pluginStore.get.mockReturnValue({ isCacheEnabled: true }); - - // When - const result = await getCacheStatus({ strapi }); - - // Then - expect(result).toMatchInlineSnapshot(` - Object { - "enabled": true, - "hasCachePlugin": true, - } - `); - }); - - it("should mark cache as enabled if it is enabled in config", async () => { - // Given - const cachePlugin = {}; - const pluginStore = { get: jest.fn() }; - const strapi = { - plugin() { - return cachePlugin; - }, - store() { - return pluginStore; - }, - } as unknown as IStrapi; - - pluginStore.get.mockReturnValue({ isCacheEnabled: false }); - - // When - const result = await getCacheStatus({ strapi }); - - // Then - expect(result).toMatchInlineSnapshot(` - Object { - "enabled": false, - "hasCachePlugin": true, - } - `); - }); - }); - }); -}); diff --git a/server/cache/index.ts b/server/cache/index.ts deleted file mode 100644 index 871478ea..00000000 --- a/server/cache/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./setupStrategy"; diff --git a/server/cache/serviceEnhancers.ts b/server/cache/serviceEnhancers.ts deleted file mode 100644 index 0767e924..00000000 --- a/server/cache/serviceEnhancers.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AddCacheConfigFieldsInput, CacheConfigFields } from "./types"; -import { getCacheStatus } from "./utils"; - -export const addCacheConfigFields = async ({ - previousConfig, - strapi, -}: AddCacheConfigFieldsInput): Promise => { - const { enabled, hasCachePlugin } = await getCacheStatus({ - strapi, - }); - - return { - ...previousConfig, - isCacheEnabled: enabled, - isCachePluginEnabled: hasCachePlugin, - }; -}; diff --git a/server/cache/setupStrategy.ts b/server/cache/setupStrategy.ts deleted file mode 100644 index 3360f7b8..00000000 --- a/server/cache/setupStrategy.ts +++ /dev/null @@ -1,46 +0,0 @@ -import Router from "@koa/router"; -import { IRestCacheSetupStrategy, ToBeFixed } from "../../types"; -import clientRoutes from "../routes/client"; -import { getCacheStatus } from "./utils"; - -export const setupCacheStrategy: IRestCacheSetupStrategy = async ({ - strapi, -}) => { - const { enabled, hasCachePlugin } = await getCacheStatus({ strapi }); - if (hasCachePlugin && enabled) { - const cachePlugin: ToBeFixed = strapi.plugin("rest-cache"); - const createCacheMiddleware = cachePlugin?.middleware("recv"); - - if (!createCacheMiddleware) { - console.warn("Cache middleware not present in cache plugin. Stopping"); - console.warn("Notify strapi-navigation-plugin-team"); - return; - } - - const pluginOption: ToBeFixed = strapi.config.get("plugin.rest-cache"); - const router = new Router(); - - const buildPathFrom = (route: ToBeFixed) => - `/api/${route.info.pluginName}${route.path}`; - const buildFrom = (route: ToBeFixed) => ({ - maxAge: pluginOption.strategy?.maxAge ?? 6 * 60 * 1000, - path: buildPathFrom(route), - method: "GET", - paramNames: ["idOrSlug", "childUIKey"], - keys: { useHeaders: [], useQueryParams: true }, - hitpass: false, - }); - - clientRoutes.routes.forEach((route) => { - router.get( - buildPathFrom(route), - createCacheMiddleware( - { cacheRouteConfig: buildFrom(route) }, - { strapi } - ) - ); - }); - - (strapi as ToBeFixed).server.router.use(router.routes()); - } -}; diff --git a/server/cache/types.ts b/server/cache/types.ts deleted file mode 100644 index f19a6f20..00000000 --- a/server/cache/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IStrapi } from "strapi-typed"; - -export type AddCacheConfigFieldsInput = { - previousConfig: T; - strapi: IStrapi; - viaSettingsPage?: boolean; -}; - -export type CacheConfigFields = { - isCacheEnabled: boolean; - isCachePluginEnabled: boolean; -}; diff --git a/server/cache/utils.ts b/server/cache/utils.ts deleted file mode 100644 index 00d20538..00000000 --- a/server/cache/utils.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { IStrapi } from "strapi-typed"; -import { NavigationPluginConfig } from "../../types/config"; -import { ToBeFixed } from "../../types"; - -type GetCacheStatusInput = { - strapi: IStrapi; -}; - -type CacheStatus = { - hasCachePlugin: boolean; - enabled: boolean; -}; - -export const getCacheStatus = async ({ - strapi, -}: GetCacheStatusInput): Promise => { - const cachePlugin: null | ToBeFixed = strapi.plugin("rest-cache"); - const hasCachePlugin = !!cachePlugin; - const pluginStore = strapi.store({ - type: "plugin", - name: "navigation", - }); - - const config: NavigationPluginConfig = await pluginStore.get({ - key: "config", - }); - - return hasCachePlugin - ? { hasCachePlugin, enabled: config.isCacheEnabled } - : { hasCachePlugin, enabled: false }; -}; diff --git a/server/config/setupStrategy.ts b/server/config/setupStrategy.ts deleted file mode 100644 index 14582504..00000000 --- a/server/config/setupStrategy.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import { - assertNotEmpty, - IConfigSetupStrategy, - NavigationItemAdditionalField, - NavigationPluginConfig, - PluginConfigGraphQL, - PluginConfigKeys, - PluginConfigNameFields, - PluginConfigPathDefaultFields, - PluginConfigPopulate, - PluginDefaultConfigGetter, -} from "../../types"; -import { resolveGlobalLikeId, validateAdditionalFields } from "../utils"; - -export const configSetupStrategy: IConfigSetupStrategy = async ({ strapi }) => { - const pluginStore = strapi.store({ - type: "plugin", - name: "navigation", - }); - const getFromPluginDefaults: PluginDefaultConfigGetter = await strapi.plugin( - "navigation" - ).config; - const hasI18nPlugin: boolean = !!strapi.plugin("i18n"); - // TODO: Mark config from store as Partial - let config: NavigationPluginConfig = await pluginStore.get({ - key: "config", - }); - const getWithFallback = getWithFallbackFactory(config, getFromPluginDefaults); - - config = { - additionalFields: - getWithFallback("additionalFields"), - contentTypes: getWithFallback("contentTypes"), - contentTypesNameFields: getWithFallback( - "contentTypesNameFields" - ), - contentTypesPopulate: getWithFallback( - "contentTypesPopulate" - ), - allowedLevels: getWithFallback("allowedLevels"), - gql: getWithFallback("gql"), - i18nEnabled: hasI18nPlugin && getWithFallback("i18nEnabled"), - pruneObsoleteI18nNavigations: false, - pathDefaultFields: - getWithFallback("pathDefaultFields"), - cascadeMenuAttached: getWithFallback("cascadeMenuAttached"), - isCacheEnabled: getWithFallback("isCacheEnabled"), - preferCustomContentTypes: getWithFallback("isCacheEnabled"), - }; - - handleDeletedContentTypes(config, { strapi }); - - validateAdditionalFields(config.additionalFields); - - await pluginStore.set({ - key: "config", - value: config, - }); - - return config; -}; - -const getWithFallbackFactory = - (config: NavigationPluginConfig, fallback: PluginDefaultConfigGetter) => - >(key: PluginConfigKeys) => { - const value = config?.[key] ?? fallback(key); - - assertNotEmpty( - value, - new Error(`[Navigation] Config "${key}" is undefined`) - ); - - return value as T; - }; - -const handleDeletedContentTypes = ( - config: NavigationPluginConfig, - { strapi }: StrapiContext -): void => { - const notAvailableContentTypes = config.contentTypes.filter( - (contentType) => !strapi.contentTypes[contentType] - ); - - if (notAvailableContentTypes.length === 0) { - return; - } - - const notAvailableContentTypesGraphQL = - notAvailableContentTypes.map(resolveGlobalLikeId); - - config.contentTypes = config.contentTypes.filter( - (contentType) => !notAvailableContentTypes.includes(contentType) - ); - - config.contentTypesNameFields = Object.fromEntries( - Object.entries(config.contentTypesNameFields).filter( - ([contentType]) => !notAvailableContentTypes.includes(contentType) - ) - ); - - config.gql.navigationItemRelated = config.gql.navigationItemRelated.filter( - (contentType) => !notAvailableContentTypesGraphQL.includes(contentType) - ); -}; diff --git a/server/content-types/index.ts b/server/content-types/index.ts deleted file mode 100644 index 37677297..00000000 --- a/server/content-types/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -"use strict" - -import navigationsItemsRelated from "./navigations-items-related"; -import navigationItem from "./navigation-item"; -import navigation from "./navigation"; -import audience from "./audience"; - -export default { - audience, - navigation, - "navigation-item": navigationItem, - "navigations-items-related": navigationsItemsRelated -}; diff --git a/server/content-types/navigation-item/lifecycles.ts b/server/content-types/navigation-item/lifecycles.ts deleted file mode 100644 index 21197517..00000000 --- a/server/content-types/navigation-item/lifecycles.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import { buildAllHookListeners } from "../../utils"; - -export default buildAllHookListeners("navigation-item", { - strapi, -} as unknown as StrapiContext); diff --git a/server/content-types/navigation-item/schema.ts b/server/content-types/navigation-item/schema.ts deleted file mode 100644 index abb44e38..00000000 --- a/server/content-types/navigation-item/schema.ts +++ /dev/null @@ -1,110 +0,0 @@ -export default { - collectionName: "navigations_items", - info: { - singularName: "navigation-item", - pluralName: "navigation-items", - displayName: "Navigation Item", - name: "navigation-item" - }, - options: { - increments: true, - timestamps: true, - comment: "Navigation Item" - }, - pluginOptions: { - "content-manager": { - visible: false - }, - "content-type-builder": { - visible: false - }, - i18n: { - localized: false - } - }, - attributes: { - title: { - type: "text", - configurable: false, - required: true, - pluginOptions: { - i18n: { - localized: false - } - } - }, - type: { - type: "enumeration", - enum: [ - "INTERNAL", - "EXTERNAL", - "WRAPPER" - ], - default: "INTERNAL", - configurable: false - }, - path: { - type: "text", - targetField: "title", - configurable: false - }, - externalPath: { - type: "text", - configurable: false - }, - uiRouterKey: { - type: "string", - configurable: false - }, - menuAttached: { - type: "boolean", - default: false, - configurable: false - }, - order: { - type: "integer", - default: 0, - configurable: false - }, - collapsed: { - type: "boolean", - default: false, - configurable: false - }, - autoSync: { - type: "boolean", - default: true, - configurable: false - }, - related: { - type: "relation", - relation: "oneToOne", - target: "plugin::navigation.navigations-items-related", - configurable: false - }, - parent: { - type: "relation", - relation: "oneToOne", - target: "plugin::navigation.navigation-item", - configurable: false, - default: null - }, - master: { - type: "relation", - relation: "manyToOne", - target: "plugin::navigation.navigation", - configurable: false, - inversedBy: "items", - }, - audience: { - type: "relation", - relation: "oneToMany", - target: "plugin::navigation.audience" - }, - additionalFields: { - type: "json", - require: false, - default: {}, - } - } -} diff --git a/server/content-types/navigation/lifecycles.ts b/server/content-types/navigation/lifecycles.ts deleted file mode 100644 index ef8d9fdf..00000000 --- a/server/content-types/navigation/lifecycles.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import { buildAllHookListeners } from "../../utils"; - -export default buildAllHookListeners("navigation", { - strapi, -} as unknown as StrapiContext); diff --git a/server/content-types/navigation/schema.ts b/server/content-types/navigation/schema.ts deleted file mode 100644 index b96b38bc..00000000 --- a/server/content-types/navigation/schema.ts +++ /dev/null @@ -1,54 +0,0 @@ -export default { - collectionName: "navigations", - info: { - singularName: "navigation", - pluralName: "navigations", - displayName: "Navigation", - name: "navigation" - }, - options: { - increments: true, - comment: "" - }, - pluginOptions: { - "content-manager": { - visible: false - }, - "content-type-builder": { - visible: false - } - }, - attributes: { - name: { - type: "text", - configurable: false, - required: true - }, - slug: { - type: "uid", - target: "name", - configurable: false, - required: true - }, - visible: { - type: "boolean", - default: false, - configurable: false - }, - items: { - type: "relation", - relation: "oneToMany", - target: "plugin::navigation.navigation-item", - configurable: false, - mappedBy: "master" - }, - localizations: { - type: "relation", - relation: "oneToMany", - target: "plugin::navigation.navigation", - }, - localeCode: { - type: "string" - } - } -} diff --git a/server/content-types/navigations-items-related/index.ts b/server/content-types/navigations-items-related/index.ts deleted file mode 100644 index a59ffbe4..00000000 --- a/server/content-types/navigations-items-related/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -"use strict" - -import schema from "./schema"; - -export default { - schema -}; diff --git a/server/content-types/navigations-items-related/schema.ts b/server/content-types/navigations-items-related/schema.ts deleted file mode 100644 index 44929155..00000000 --- a/server/content-types/navigations-items-related/schema.ts +++ /dev/null @@ -1,47 +0,0 @@ -export default { - collectionName: "navigations_items_related", - info: { - singularName: "navigations-items-related", - pluralName: "navigations-items-relateds", - displayName: "Navigations Items Related", - name: "navigations_items_related" - }, - options: { - increments: true, - timestamps: false, - populateCreatorFields: false - }, - pluginOptions: { - "content-manager": { - visible: false - }, - "content-type-builder": { - visible: false - }, - i18n: { - localized: false - } - }, - attributes: { - related_id: { - type: "string", - required: true - }, - related_type: { - type: "string", - required: true - }, - field: { - type: "string", - required: true - }, - order: { - type: "integer", - required: true - }, - master: { - type: "string", - required: true - } - } -} diff --git a/server/controllers/admin.ts b/server/controllers/admin.ts deleted file mode 100644 index 8c693039..00000000 --- a/server/controllers/admin.ts +++ /dev/null @@ -1,209 +0,0 @@ -// @ts-ignore -import { errors } from "@strapi/utils" -import { - assertIsNumber, - assertNotEmpty, - ToBeFixed, -} from "../../types"; -import { getPluginService, parseParams } from "../utils"; -import { errorHandler } from "../utils"; -import { IAdminController } from "../../types"; -import { Id, IStrapi, StringMap } from "strapi-typed"; -import { InvalidParamNavigationError } from "../../utils/InvalidParamNavigationError"; -import { NavigationError } from "../../utils/NavigationError"; -import { getCacheStatus } from "../cache/utils"; - -const adminControllers: IAdminController = { - getAdminService() { - return getPluginService("admin"); - }, - getCommonService() { - return getPluginService("common"); - }, - async get() { - return await this.getAdminService().get(); - }, - post(ctx) { - const { auditLog } = ctx; - const { body = {} } = ctx.request; - return this.getAdminService().post(body, auditLog); - }, - put(ctx) { - const { params, auditLog } = ctx; - const { id } = parseParams, { id: Id }>(params); - const { body = {} } = ctx.request; - return this.getAdminService().put(id, body, auditLog).catch(errorHandler(ctx)); - }, - async delete(ctx) { - const { params, auditLog } = ctx; - const { id } = parseParams, { id: Id }>(params); - - try { - assertNotEmpty(id, new InvalidParamNavigationError("Navigation's id is not a id")); - - await this.getAdminService().delete(id, auditLog); - - return {}; - } catch (error) { - console.error(error); - - if (error instanceof NavigationError) { - return errorHandler(ctx)(error) - } - - throw error; - } - }, - async config() { - return this.getAdminService().config(); - }, - - async updateConfig(ctx) { - try { - await this.getAdminService().updateConfig(ctx.request.body); - } catch (e: ToBeFixed) { - errorHandler(ctx)(e); - } - return ctx.send({ status: 200 }); - }, - - async restoreConfig(ctx) { - try { - await this.getAdminService().restoreConfig(); - } catch (e: ToBeFixed) { - errorHandler(ctx)(e); - } - return ctx.send({ status: 200 }); - }, - - async settingsConfig() { - return this.getAdminService().config(true); - }, - - async settingsRestart(ctx) { - try { - await this.getAdminService().restart(); - return ctx.send({ status: 200 }); - } catch (e: ToBeFixed) { - errorHandler(ctx)(e); - } - }, - async getById(ctx) { - const { params } = ctx; - const { id } = parseParams, { id: Id }>(params); - return this.getAdminService().getById(id); - }, - async getContentTypeItems(ctx) { - const { params, query = {} } = ctx; - const { model } = parseParams, { model: string }>(params); - return this.getCommonService().getContentTypeItems( - model, - query - ); - }, - - fillFromOtherLocale(ctx) { - const { params, auditLog } = ctx; - const { source, target } = parseParams< - StringMap, - { source: number; target: number } - >(params); - - try { - assertCopyParams(source, target); - - return this.getAdminService().fillFromOtherLocale({ source, target, auditLog }); - } catch (error) { - if (error instanceof Error) { - return ctx.badRequest(error.message) - } - - throw error - } - }, - - async readNavigationItemFromLocale(ctx) { - const { params, query: { path } } = ctx; - const { source, target } = parseParams, { source: number, target: number }>( - params - ); - - try { - assertCopyParams(source, target); - assertNotEmpty( - path, - new InvalidParamNavigationError("Path is missing") - ) - - return await this.getAdminService().readNavigationItemFromLocale({ - path, - source, - target, - }); - } catch (error: any) { - if (error instanceof errors.NotFoundError) { - return ctx.notFound((error as Error).message, { - messageKey: "popup.item.form.i18n.locale.error.unavailable" - }); - } - - if (error instanceof Error) { - return ctx.badRequest(error.message) - } - - throw error - } - }, - - getSlug(ctx) { - const { query: { q } } = ctx; - - try { - assertNotEmpty(q); - - return this.getCommonService().getSlug(q).then((slug) => ({ slug })); - } catch (error) { - if (error instanceof Error) { - return ctx.badRequest(error.message) - } - - throw error - } - }, - - async purgeNavigationsCache() { - const mappedStrapi = strapi as unknown as IStrapi; - const { enabled } = await getCacheStatus({ strapi: mappedStrapi }); - - if (!enabled) { - return { success: false }; - } - - return await this.getAdminService().purgeNavigationsCache(); - }, - - async purgeNavigationCache(ctx) { - const { params: { id }, query: { clearLocalisations = 'false' } } = ctx; - const mappedStrapi = strapi as unknown as IStrapi; - const { enabled } = await getCacheStatus({ strapi: mappedStrapi }); - - if (!enabled) { - return { success: false }; - } - - return await this.getAdminService().purgeNavigationCache(id, JSON.parse(clearLocalisations)); - } -}; - -const assertCopyParams = (source: unknown, target: unknown) => { - assertIsNumber( - source, - new InvalidParamNavigationError("Source's id is not a number") - ); - assertIsNumber( - target, - new InvalidParamNavigationError("Target's id is not a number") - ); -} - -export default adminControllers; diff --git a/server/controllers/client.ts b/server/controllers/client.ts deleted file mode 100644 index 0e712279..00000000 --- a/server/controllers/client.ts +++ /dev/null @@ -1,87 +0,0 @@ -//@ts-ignore -import { errors, sanitize } from "@strapi/utils"; -import { Id, StringMap } from "strapi-typed"; -import { IClientController, ToBeFixed } from "../../types"; -import { getPluginService, parseParams, sanitizePopulateField } from "../utils"; - -const clientControllers: IClientController = { - getService() { - return getPluginService("client"); - }, - - async readAll(ctx) { - const { query = {} } = ctx; - const { locale, orderBy, orderDirection } = query; - - try { - return await this.getService().readAll({ - locale, - orderBy, - orderDirection, - }); - } catch (error: unknown) { - if (error instanceof Error) { - return ctx.badRequest(error.message); - } - - throw error; - } - }, - - async render(ctx) { - const { params, query = {} } = ctx; - const { type, menu: menuOnly, path: rootPath, locale, populate } = query; - const { idOrSlug } = parseParams, { idOrSlug: Id }>( - params - ); - try { - return await this.getService().render({ - idOrSlug, - type, - menuOnly, - rootPath, - locale, - populate: sanitizePopulateField(populate) as ToBeFixed, - }); - } catch (error: unknown) { - if (error instanceof errors.NotFoundError) { - return ctx.notFound((error as ToBeFixed).message); - } - - if (error instanceof Error) { - return ctx.badRequest(error.message); - } - - throw error; - } - }, - async renderChild(ctx) { - const { params, query = {} } = ctx; - const { type, menu: menuOnly, locale } = query; - const { idOrSlug, childUIKey } = parseParams< - StringMap, - { idOrSlug: Id; childUIKey: string } - >(params); - try { - return await this.getService().renderChildren({ - idOrSlug, - childUIKey, - type, - menuOnly, - locale, - }); - } catch (error: unknown) { - if (error instanceof errors.NotFoundError) { - return ctx.notFound((error as ToBeFixed).message); - } - - if (error instanceof Error) { - return ctx.badRequest(error.message); - } - - throw error; - } - }, -}; - -export default clientControllers; diff --git a/server/controllers/index.ts b/server/controllers/index.ts deleted file mode 100644 index efdc803f..00000000 --- a/server/controllers/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NavigationController } from '../../types'; - -import admin from './admin'; -import client from './client'; - -const controllers: NavigationController = { - admin, - client, -} - -export default controllers; diff --git a/server/destroy.ts b/server/destroy.ts deleted file mode 100644 index 2a6ddd91..00000000 --- a/server/destroy.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default () => { - // Destroy function for strapi-plugin-navigation -}; diff --git a/server/graphql/config.ts b/server/graphql/config.ts deleted file mode 100644 index 0c1e7c4c..00000000 --- a/server/graphql/config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import { getPluginService } from "../utils"; - -const getTypes = require("./types"); -const getQueries = require("./queries"); -const getResolversConfig = require("./resolvers-config"); - -export default async ({ strapi }: StrapiContext) => { - const extensionService = strapi.plugin("graphql").service("extension"); - - extensionService.shadowCRUD("plugin::navigation.audience").disable(); - extensionService.shadowCRUD("plugin::navigation.navigation").disable(); - extensionService.shadowCRUD("plugin::navigation.navigation-item").disable(); - extensionService - .shadowCRUD("plugin::navigation.navigations-items-related") - .disable(); - const commonService = getPluginService('common'); - const pluginStore = await commonService.getPluginStore() - const config = await pluginStore.get({ key: 'config' }); - - extensionService.use(({ strapi, nexus }: any) => { - const types = getTypes({ strapi, nexus, config }); - const queries = getQueries({ strapi, nexus }); - const resolversConfig = getResolversConfig({ strapi }); - - return { - types: [types, queries], - resolversConfig, - }; - }); -}; diff --git a/server/graphql/index.js b/server/graphql/index.js deleted file mode 100644 index 871478ea..00000000 --- a/server/graphql/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./setupStrategy"; diff --git a/server/graphql/queries/index.js b/server/graphql/queries/index.js deleted file mode 100644 index a678bca8..00000000 --- a/server/graphql/queries/index.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = (context) => { - const queries = { - renderNavigationChild: require('./render-navigation-child'), - renderNavigation: require('./render-navigation'), - } - - return context.nexus.extendType({ - type: 'Query', - definition(t) { - for (const [name, configFactory] of Object.entries(queries)) { - const config = configFactory(context); - - t.field(name, config); - } - }, - }); -}; diff --git a/server/graphql/queries/render-navigation-child.js b/server/graphql/queries/render-navigation-child.js deleted file mode 100644 index 0592008c..00000000 --- a/server/graphql/queries/render-navigation-child.js +++ /dev/null @@ -1,24 +0,0 @@ -const { getPluginService } = require("../../utils"); - -module.exports = ({ strapi, nexus }) => { - const { nonNull, list, stringArg, booleanArg } = nexus; - return { - type: nonNull(list("NavigationItem")), - args: { - id: nonNull(stringArg()), - childUiKey: nonNull(stringArg()), - type: "NavigationRenderType", - menuOnly: booleanArg(), - }, - resolve(obj, args) { - const { id, childUIKey, type, menuOnly } = args; - return getPluginService('client').renderChildren({ - idOrSlug: id, - childUIKey, - type, - menuOnly, - wrapRelated: true, - }); - }, - }; -} diff --git a/server/graphql/queries/render-navigation.js b/server/graphql/queries/render-navigation.js deleted file mode 100644 index 3e29b0ca..00000000 --- a/server/graphql/queries/render-navigation.js +++ /dev/null @@ -1,35 +0,0 @@ -const { addI18NRenderNavigationArgs } = require("../../i18n"); -const { getPluginService } = require("../../utils"); - -module.exports = ({ strapi, nexus }) => { - const { nonNull, list, stringArg, booleanArg } = nexus; - const defaultArgs = { - navigationIdOrSlug: nonNull(stringArg()), - type: "NavigationRenderType", - menuOnly: booleanArg(), - path: stringArg(), - }; - const hasI18nPlugin = !!strapi.plugin("i18n"); - const args = hasI18nPlugin ? addI18NRenderNavigationArgs({ - previousArgs: defaultArgs, - nexus, - }) : defaultArgs; - - return { - args, - type: nonNull(list("NavigationItem")), - resolve( - obj, - { navigationIdOrSlug: idOrSlug, type, menuOnly, path: rootPath, locale } - ) { - return getPluginService('client').render({ - idOrSlug, - type, - rootPath, - locale, - menuOnly, - wrapRelated: true - }) - }, - }; -}; diff --git a/server/graphql/resolvers-config.js b/server/graphql/resolvers-config.js deleted file mode 100644 index 53522db0..00000000 --- a/server/graphql/resolvers-config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = ({ }) => ({ - 'Query.renderNavigationChild': { auth: false }, - 'Query.renderNavigation': { auth: false }, -}); diff --git a/server/graphql/setupStrategy.ts b/server/graphql/setupStrategy.ts deleted file mode 100644 index 45f0d7af..00000000 --- a/server/graphql/setupStrategy.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IGraphQLSetupStrategy } from "../../types"; -import handleConfig from "./config"; - -export const graphQLSetupStrategy: IGraphQLSetupStrategy = async ({ - strapi, -}) => { - const hasGraphQLPlugin = !!strapi.plugin("graphql"); - - if (hasGraphQLPlugin) { - await handleConfig({ strapi }); - } -}; diff --git a/server/graphql/types/content-types-name-fields.js b/server/graphql/types/content-types-name-fields.js deleted file mode 100644 index 1e26da0e..00000000 --- a/server/graphql/types/content-types-name-fields.js +++ /dev/null @@ -1,13 +0,0 @@ -const { getPluginService } = require("../../utils"); - -module.exports = ({ nexus, strapi }) => nexus.objectType({ - name: "ContentTypesNameFields", - async definition(t) { - t.nonNull.list.nonNull.string("default"); - const commonService = getPluginService('common'); - const pluginStore = await commonService.getPluginStore(); - const config = await pluginStore.get({ key: 'config' }); - const contentTypesNameFields = config.contentTypesNameFields; - Object.keys(contentTypesNameFields || {}).forEach(key => t.nonNull.list.string(key)) - } -}) \ No newline at end of file diff --git a/server/graphql/types/content-types.js b/server/graphql/types/content-types.js deleted file mode 100644 index e39506d4..00000000 --- a/server/graphql/types/content-types.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = ({ nexus }) => nexus.objectType({ - name: "ContentTypes", - definition(t) { - t.nonNull.string("uid") - t.nonNull.string("name") - t.nonNull.boolean("isSingle") - t.nonNull.string("collectionName") - t.nonNull.string("contentTypeName") - t.nonNull.string("label") - t.nonNull.string("relatedField") - t.nonNull.string("labelSingular") - t.nonNull.string("endpoint") - t.nonNull.boolean("available") - t.nonNull.boolean("visible") - } -}) \ No newline at end of file diff --git a/server/graphql/types/create-navigation-item.js b/server/graphql/types/create-navigation-item.js deleted file mode 100644 index 95b298cb..00000000 --- a/server/graphql/types/create-navigation-item.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = ({ nexus }) => nexus.inputObjectType({ - name: "CreateNavigationItem", - definition(t) { - t.nonNull.string("title") - t.nonNull.string("type") - t.string("path") - t.string("externalPath") - t.nonNull.string("uiRouterKey") - t.nonNull.boolean("menuAttached") - t.nonNull.int("order") - t.int("parent") - t.int("master") - t.list.field("items", { type: 'CreateNavigationItem' }) - t.list.string("audience") - t.field("related", { type: 'CreateNavigationRelated' }) - } -}); \ No newline at end of file diff --git a/server/graphql/types/create-navigation-related.js b/server/graphql/types/create-navigation-related.js deleted file mode 100644 index 3cf37e66..00000000 --- a/server/graphql/types/create-navigation-related.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = ({ nexus }) => nexus.inputObjectType({ - name: "CreateNavigationRelated", - definition(t) { - t.nonNull.string("ref") - t.nonNull.string("field") - t.nonNull.string("refId") - } -}); \ No newline at end of file diff --git a/server/graphql/types/create-navigation.js b/server/graphql/types/create-navigation.js deleted file mode 100644 index 4b7a2c9c..00000000 --- a/server/graphql/types/create-navigation.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = ({ nexus }) => nexus.inputObjectType({ - name: "CreateNavigation", - definition(t) { - t.nonNull.string("name") - t.nonNull.list.field("items", { type: 'CreateNavigationItem' }) - } -}); \ No newline at end of file diff --git a/server/graphql/types/index.js b/server/graphql/types/index.js deleted file mode 100644 index ecef3c46..00000000 --- a/server/graphql/types/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const typesFactories = [ - require('./navigation-item-additional-field-media'), - require('./navigation-item-related'), - require('./navigation-item-related-data'), - require('./navigation-item'), - require('./navigation-render-type'), - require('./navigation'), - require('./navigation-details'), - require('./content-types-name-fields'), - require('./content-types'), - require('./navigation-config'), - require('./create-navigation-related'), - require('./create-navigation-item'), - require('./create-navigation'), -]; - -module.exports = context => typesFactories.map(factory => factory(context)); \ No newline at end of file diff --git a/server/graphql/types/navigation-config.js b/server/graphql/types/navigation-config.js deleted file mode 100644 index aa8272d8..00000000 --- a/server/graphql/types/navigation-config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = ({ nexus }) => nexus.objectType({ - name: "NavigationConfig", - definition(t) { - t.int("allowedLevels"); - t.nonNull.list.string("additionalFields"); - t.field("contentTypesNameFields", { type: 'ContentTypesNameFields' }); - t.list.field("contentTypes", { type: 'ContentTypes' }); - } -}) \ No newline at end of file diff --git a/server/graphql/types/navigation-item-additional-field-media.js b/server/graphql/types/navigation-item-additional-field-media.js deleted file mode 100644 index cdcac3a5..00000000 --- a/server/graphql/types/navigation-item-additional-field-media.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = ({ nexus }) => nexus.objectType({ - name: "NavigationItemAdditionalFieldMedia", - definition(t) { - t.nonNull.string("name") - t.nonNull.string("url") - t.nonNull.string("mime") - t.nonNull.int("width") - t.nonNull.int("height") - t.string("previewUrl") - } -}); \ No newline at end of file diff --git a/server/graphql/types/navigation-item-related-data.js b/server/graphql/types/navigation-item-related-data.js deleted file mode 100644 index f104cd2f..00000000 --- a/server/graphql/types/navigation-item-related-data.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = ({ nexus }) => - nexus.objectType({ - name: "NavigationItemRelatedData", - definition(t) { - t.nonNull.int("id") - t.field("attributes", { type: 'NavigationItemRelated' }) - } - }); \ No newline at end of file diff --git a/server/graphql/types/navigation-item.js b/server/graphql/types/navigation-item.js deleted file mode 100644 index 462f02a7..00000000 --- a/server/graphql/types/navigation-item.js +++ /dev/null @@ -1,58 +0,0 @@ -module.exports = ({ nexus, config }) => - nexus.objectType({ - name: "NavigationItem", - definition(t) { - t.nonNull.int("id"); - t.nonNull.string("title"); - t.nonNull.string("type"); - t.string("path"); - t.string("externalPath"); - t.nonNull.string("uiRouterKey"); - t.nonNull.boolean("menuAttached"); - t.nonNull.int("order"); - t.field("parent", { type: "NavigationItem" }) - t.int("master"); - t.list.field("items", { type: 'NavigationItem' }); - t.field("related", { type: 'NavigationItemRelatedData' }); - - // SQL - t.string("created_at"); - t.string("updated_at"); - t.string("created_by"); - t.string("updated_by"); - // MONGO - t.string("createdAt"); - t.string("updatedAt"); - t.string("createdBy"); - t.string("updatedBy"); - - // Additional Fields - config.additionalFields.forEach(field => { - if (field !== 'audience') { - if (field.enabled) { - switch (field.type) { - case 'media': - t.field(field.name, { type: "NavigationItemAdditionalFieldMedia" }); - break; - case 'string': - t.string(field.name); - break; - case 'boolean': - t.boolean(field.name); - break; - case 'select': - if (field.multi) - t.list.string(field.name); - else - t.string(field.name); - break; - default: - throw new Error(`Type "${JSON.stringify(field.type)}" is unsupported by custom fields`); - } - } - } else { - t.list.string("audience"); - } - }); - } - }); diff --git a/server/graphql/types/navigation-render-type.js b/server/graphql/types/navigation-render-type.js deleted file mode 100644 index feb6d3aa..00000000 --- a/server/graphql/types/navigation-render-type.js +++ /dev/null @@ -1,6 +0,0 @@ -const { RENDER_TYPES } = require("../../utils"); - -module.exports = ({nexus}) => nexus.enumType({ - name: "NavigationRenderType", - members: Object.values(RENDER_TYPES), -}); \ No newline at end of file diff --git a/server/graphql/types/navigation.js b/server/graphql/types/navigation.js deleted file mode 100644 index 268e71e6..00000000 --- a/server/graphql/types/navigation.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = ({ nexus }) => nexus.objectType({ - name: "Navigation", - definition(t) { - t.nonNull.string("id") - t.nonNull.string("name") - t.nonNull.string("slug") - t.nonNull.boolean("visible") - } -}) \ No newline at end of file diff --git a/server/i18n/__tests__/utils.test.ts b/server/i18n/__tests__/utils.test.ts deleted file mode 100644 index 6ce23bc5..00000000 --- a/server/i18n/__tests__/utils.test.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import { ToBeFixed } from "../../../types"; -import { getI18nStatus } from "../utils"; - -describe("i18n", () => { - describe("Utils", () => { - describe("getI18nStatus()", () => { - it("should check if i18n plugin is installed", async () => { - // Given - const store: ToBeFixed = () => ({ - get() { - return {}; - }, - }); - const strapi: Partial = { - store, - plugin() { - return null as ToBeFixed; - }, - }; - - // When - const result = await getI18nStatus({ - strapi: strapi as StrapiContext["strapi"], - }); - - // Given - expect(result).toMatchInlineSnapshot(` - Object { - "defaultLocale": undefined, - "enabled": false, - "hasI18NPlugin": false, - "locales": undefined, - } - `); - }); - - it("should check if i18n is enabled in navigation plugin config", async () => { - // Given - const enabled = Math.floor(Math.random() * 10) % 2 ? true : false; - const store: ToBeFixed = () => ({ - get() { - return { i18nEnabled: enabled }; - }, - }); - const strapi: Partial = { - store, - plugin() { - return { - service() { - return { - async getDefaultLocale() { - return "en"; - }, - async find() { - return [{ code: "en" }]; - }, - }; - }, - } as ToBeFixed; - }, - }; - - // When - const result = await getI18nStatus({ - strapi: strapi as StrapiContext["strapi"], - }); - - // Given - expect(result).toHaveProperty("enabled", enabled); - }); - - it("should read default locale", async () => { - // Given - const enabled = Math.floor(Math.random() * 10) % 2 ? true : false; - const store: ToBeFixed = () => ({ - get() { - return { i18nEnabled: enabled }; - }, - }); - const locale = "fr"; - const strapi: Partial = { - store, - plugin() { - return { - service() { - return { - async getDefaultLocale() { - return locale; - }, - async find() { - return [{ code: locale }]; - }, - }; - }, - } as ToBeFixed; - }, - }; - - // When - const result = await getI18nStatus({ - strapi: strapi as StrapiContext["strapi"], - }); - - // Given - expect(result).toHaveProperty("defaultLocale", locale); - }); - - it("should read current locale", async () => { - // Given - const enabled = Math.floor(Math.random() * 10) % 2 ? true : false; - const store: ToBeFixed = () => ({ - get() { - return { i18nEnabled: enabled }; - }, - }); - const locale = "fr"; - const strapi: Partial = { - store, - plugin() { - return { - service() { - return { - async getDefaultLocale() { - return locale; - }, - async find() { - return [{ code: locale }]; - }, - }; - }, - } as ToBeFixed; - }, - }; - - // When - const result = await getI18nStatus({ - strapi: strapi as StrapiContext["strapi"], - }); - - // Given - expect(result).toHaveProperty("locales", [locale]); - }); - }); - }); -}); diff --git a/server/i18n/constant.ts b/server/i18n/constant.ts deleted file mode 100644 index 0ceabf84..00000000 --- a/server/i18n/constant.ts +++ /dev/null @@ -1 +0,0 @@ -export const I18N_DEFAULT_POPULATE = ["localizations"] as ["localizations"]; diff --git a/server/i18n/errors.ts b/server/i18n/errors.ts deleted file mode 100644 index 3b897f3b..00000000 --- a/server/i18n/errors.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NavigationError } from "../../utils/NavigationError"; - -export class DefaultLocaleMissingError extends NavigationError { - constructor(message = "Default locale is required.") { - super(message); - } -} - -export class FillNavigationError extends NavigationError {} diff --git a/server/i18n/graphQLEnhancers.ts b/server/i18n/graphQLEnhancers.ts deleted file mode 100644 index 2bd1cb12..00000000 --- a/server/i18n/graphQLEnhancers.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Nexus } from "../../types"; - -// TODO: Find a way to get this key from the source plugin -const LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode'; - -type RenderNavigationArgsEnhancer = { - previousArgs: T; - nexus: Nexus; -}; - -export const addI18NRenderNavigationArgs = ({ - previousArgs, - nexus, -}: RenderNavigationArgsEnhancer) => ({ - ...previousArgs, - locale: nexus.arg({ type: LOCALE_SCALAR_TYPENAME }), -}); diff --git a/server/i18n/index.ts b/server/i18n/index.ts deleted file mode 100644 index 7703d6d4..00000000 --- a/server/i18n/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./constant"; -export * from "./graphQLEnhancers"; -export * from "./navigationSetupStrategy"; -export * from "./serviceEnhancers"; -export * from "./utils"; -export * from "./errors"; -export { I18NConfigFields } from "./types" diff --git a/server/i18n/navigationSetupStrategy.ts b/server/i18n/navigationSetupStrategy.ts deleted file mode 100644 index c0980a92..00000000 --- a/server/i18n/navigationSetupStrategy.ts +++ /dev/null @@ -1,255 +0,0 @@ -import { IStrapi, OnlyStrings, StrapiDBBulkActionResponse } from "strapi-typed"; -import { - assertEntity, - assertNotEmpty, - I18nLocale, - INavigationSetupStrategy, - Navigation, - NavigationPluginConfig, -} from "../../types"; -import { DEFAULT_NAVIGATION_ITEM, DEFAULT_POPULATE } from "../utils"; -import { DefaultLocaleMissingError } from "./errors"; -import { prop } from "lodash/fp"; - -export const i18nNavigationSetupStrategy: INavigationSetupStrategy = async ({ - strapi, -}) => { - const pluginStore = strapi.store({ - type: "plugin", - name: "navigation", - }); - const config: NavigationPluginConfig = await pluginStore.get({ - key: "config", - }); - let currentNavigations = await getCurrentNavigations(strapi); - const localeService = strapi.plugin("i18n").service("locales"); - const defaultLocale: string | null = await localeService.getDefaultLocale(); - const allLocale: string[] = (await localeService.find({})).map( - ({ code }: I18nLocale) => code - ); - - assertNotEmpty(defaultLocale, new DefaultLocaleMissingError()); - - if (config.i18nEnabled) { - const hasNotAnyLocale = ({ localeCode }: Navigation) => !localeCode; - - if (currentNavigations.length === 0) { - currentNavigations = [ - await createDefaultI18nNavigation({ strapi, defaultLocale }), - ]; - } - - const noLocaleNavigations = currentNavigations.filter(hasNotAnyLocale); - - if (noLocaleNavigations.length) { - await updateNavigations({ - strapi, - ids: noLocaleNavigations.map(prop("id")).reduce((acc, id) => { - if (id && Number(id)) { - acc.push(Number(id)); - } - - return acc; - }, [] as Array), - payload: { - localeCode: defaultLocale, - }, - populate: DEFAULT_POPULATE, - }); - - currentNavigations = await getCurrentNavigations(strapi); - } - - const navigationsToProcess = currentNavigations.filter( - ({ localeCode }) => defaultLocale === localeCode - ); - - for (const rootNavigation of navigationsToProcess) { - let localizations = [ - ...(rootNavigation.localizations ?? []).map( - (localization) => assertEntity(localization, "Navigation") - ), - ]; - - const connectOrphans = currentNavigations.filter((navigation) => { - return ( - navigation.slug.startsWith(rootNavigation.slug) && - navigation.id !== rootNavigation.id && - !localizations.find(({ id }) => navigation.id === id) - ); - }); - - localizations = localizations - .concat([rootNavigation]) - .concat(connectOrphans) - // hiding not supported locale versions - .filter( - ({ localeCode }) => !!localeCode && allLocale.includes(localeCode) - ); - - const missingLocale = allLocale.filter( - (locale) => - !localizations.some(({ localeCode }) => localeCode === locale) - ); - - if (missingLocale.length) { - const { ids } = await createNavigations({ - strapi, - payloads: missingLocale.map((locale) => ({ - localeCode: locale, - slug: `${rootNavigation.slug}-${locale}`, - name: rootNavigation.name, - visible: true, - })), - }); - - localizations = [...(await getCurrentNavigations(strapi, ids))].concat([ - rootNavigation, - ]); - } - - // TODO: Update to bulk operation when strapi - // allows to update `oneToMany` relations on bulk update - for (const current of localizations) { - await updateNavigation({ - strapi, - current, - payload: { - localizations: localizations.filter( - (localization) => localization.id !== current.id - ), - }, - }); - } - } - } else { - if (config.pruneObsoleteI18nNavigations) { - await deleteNavigations({ - strapi, - where: { localeCode: { $not: defaultLocale } as any }, - }); - await pluginStore.set({ - key: "config", - value: { - ...config, - pruneObsoleteI18nNavigations: false, - }, - }); - } - - const remainingNavigations = await getCurrentNavigations(strapi); - if (!remainingNavigations.length) { - await createDefaultI18nNavigation({ strapi, defaultLocale }); - } - } - - return getCurrentNavigations(strapi); -}; - -const getCurrentNavigations = ( - strapi: IStrapi, - ids?: Array -): Promise => - strapi.plugin("navigation").service("admin").get(ids, true); - -// TODO: Move to service -const createNavigation = ({ - strapi, - payload, - populate, -}: { - strapi: IStrapi; - payload: Partial; - populate?: Array; -}): Promise => - strapi.query("plugin::navigation.navigation").create({ - data: { - ...payload, - }, - populate, - }); - -// TODO: update strapi-typed -const createNavigations = ({ - strapi, - payloads, - populate, -}: { - strapi: IStrapi; - payloads: Array>; - populate?: Array; -}): Promise => - strapi.query("plugin::navigation.navigation").createMany({ - data: payloads, - populate, - }); - -const updateNavigation = ({ - strapi, - current, - payload, - populate, -}: { - strapi: IStrapi; - payload: Partial; - current: Navigation; - populate?: Array>; -}): Promise => - strapi.query("plugin::navigation.navigation").update({ - data: { - ...payload, - }, - populate, - where: { - id: current.id, - }, - }); - -const updateNavigations = ({ - strapi, - ids, - payload, - populate, -}: { - strapi: IStrapi; - payload: Partial; - ids: Array; - populate?: Array>; -}): Promise => - strapi.query("plugin::navigation.navigation").updateMany({ - data: payload, - populate, - where: { - id: { - $in: ids, - }, - }, - }); - -// TODO: Move to service -const deleteNavigations = ({ - strapi, - where, -}: { - strapi: IStrapi; - where: { localeCode?: string | { $in: string[] } | { $not: string } }; -}) => - strapi.query("plugin::navigation.navigation").deleteMany({ - where, - }); - -const createDefaultI18nNavigation = ({ - strapi, - defaultLocale, -}: { - strapi: IStrapi; - defaultLocale: string; -}): Promise => - createNavigation({ - strapi, - payload: { - ...DEFAULT_NAVIGATION_ITEM, - localeCode: defaultLocale, - }, - populate: DEFAULT_POPULATE, - }); diff --git a/server/i18n/serviceEnhancers.ts b/server/i18n/serviceEnhancers.ts deleted file mode 100644 index a56a098d..00000000 --- a/server/i18n/serviceEnhancers.ts +++ /dev/null @@ -1,257 +0,0 @@ -// @ts-ignore -import { errors } from "@strapi/utils" -import { get, toString } from "lodash"; -import { pick } from "lodash/fp"; -import { OnlyStrings } from "strapi-typed"; -import { - assertIsNumber, - assertNotEmpty, - RelatedRef, - RelatedRefBase, - ToBeFixed, -} from "../../types"; -import { InvalidParamNavigationError } from "../../utils/InvalidParamNavigationError"; -import { intercalate } from "../utils"; -import { I18N_DEFAULT_POPULATE } from "./constant"; -import { DefaultLocaleMissingError, FillNavigationError } from "./errors"; -import { - AddI18NConfigFieldsInput, - AddI18nWhereClause, - FillCopyContext, - HandleLocaleParamInput, - I18nAwareEntityReadHandlerInput, - I18NConfigFields, - I18nNavigationContentsCopyInput, - MinimalEntityWithI18n, - ResultNavigationItem, - SourceNavigationItem, - I18nNavigationItemReadInput, -} from "./types"; -import { getI18nStatus } from "./utils"; - -export const addI18NConfigFields = async ({ - previousConfig, - strapi, - viaSettingsPage = false, -}: AddI18NConfigFieldsInput): Promise => { - const { enabled, hasI18NPlugin, defaultLocale } = await getI18nStatus({ - strapi, - }); - - return { - ...previousConfig, - defaultLocale, - i18nEnabled: enabled, - isI18NPluginEnabled: viaSettingsPage ? hasI18NPlugin : undefined, - pruneObsoleteI18nNavigations: false, - }; -}; - -export const handleLocaleQueryParam = async ({ - locale, - strapi, -}: HandleLocaleParamInput) => { - const { enabled } = await getI18nStatus({ strapi }); - - if (locale) { - return locale; - } - - const localeService = strapi.plugin("i18n").service("locales"); - const defaultLocale: string | null = await localeService.getDefaultLocale(); - - assertNotEmpty(defaultLocale, new DefaultLocaleMissingError()); - - return enabled ? defaultLocale : undefined; -}; - -export const i18nAwareEntityReadHandler = async < - T extends { localeCode?: string | null; localizations?: T[] | null } ->({ - entity, - entityUid, - localeCode, - populate = [], - strapi, - whereClause, -}: I18nAwareEntityReadHandlerInput): Promise => { - const { defaultLocale, enabled } = await getI18nStatus({ strapi }); - - if (!enabled) { - return entity; - } - - if (entity && (!localeCode || entity.localeCode === localeCode)) { - return entity; - } - - const locale = localeCode || defaultLocale; - - const rerun = await strapi.query(entityUid).findOne({ - where: whereClause, - populate: [...populate, ...I18N_DEFAULT_POPULATE] as Array< - OnlyStrings - >, - }); - - if (rerun) { - if (rerun.localeCode === locale) { - return rerun; - } - - return rerun.localizations?.find( - (localization) => localization.localeCode === locale - ); - } -}; - -export const addI18nWhereClause = async ({ - modelUid, - previousWhere, - query, - strapi, -}: AddI18nWhereClause): Promise => { - const { enabled } = await getI18nStatus({ strapi }); - const modelSchema = strapi.getModel(modelUid); - - if (enabled && query.localeCode && modelSchema.attributes.locale) { - return { - ...previousWhere, - locale: query.localeCode, - }; - } - - return previousWhere as T & { locale?: string }; -}; - -export const i18nNavigationContentsCopy = async ({ - target, - source, - strapi, - service, -}: I18nNavigationContentsCopyInput): Promise => { - const sourceItems = source.items ?? []; - - if (target.items?.length) { - throw new FillNavigationError("Current navigation is non-empty"); - } - - if (!target.localeCode) { - throw new FillNavigationError( - "Current navigation does not have specified locale" - ); - } - - if (!sourceItems.length) { - throw new FillNavigationError("Source navigation is empty"); - } - - const newItems = await Promise.all( - sourceItems.map( - processItems({ - master: target, - localeCode: target.localeCode, - strapi, - }) - ) - ); - - await service.createBranch(newItems, target, null, { create: true }); -}; - -export const i18nNavigationItemRead = async ({ - target, - source, - path, - strapi -}: I18nNavigationItemReadInput) => { - const pickFields = pick(['path', 'related', 'type', 'uiRouterKey', 'title', 'externalPath']); - const structurePath = path.split('.').map(p => parseInt(p, 10)); - - if (!structurePath.some(Number.isNaN) || !structurePath.length) { - new InvalidParamNavigationError("Path is invalid"); - } - - let result = get(source.items, intercalate("items", structurePath.map(toString))) - - if (!result) { - throw new errors.NotFoundError("Unable to find navigation item"); - } - - let { related } = result; - - if (related) { - const fullRelated = await strapi.query(related.__contentType).findOne({ - where: { - id: related.id, - }, - populate: I18N_DEFAULT_POPULATE, - }) - if (fullRelated.localizations?.length) { - const localeVersion = fullRelated.localizations.find(({ locale }) => locale === target.localeCode); - - if (localeVersion) { - related = { - ...localeVersion, - __contentType: related.__contentType - } - } - } - } - - return pickFields({ - ...result, - related - }); -} - -const processItems = - (context: FillCopyContext) => - async (item: SourceNavigationItem): Promise => ({ - title: item.title, - path: item.path, - audience: item.audience as ToBeFixed, - type: item.type, - uiRouterKey: item.uiRouterKey, - order: item.order, - collapsed: item.collapsed, - menuAttached: item.menuAttached, - removed: false, - updated: true, - externalPath: item.externalPath ?? undefined, - items: item.items - ? await Promise.all(item.items.map(processItems(context))) - : [], - master: parseInt(context.master.id.toString(), 10), - parent: null, - related: item.related ? [await processRelated(item.related, context)] : [], - }); - -const processRelated = async ( - related: RelatedRef, - { localeCode, strapi }: FillCopyContext -): Promise => { - const { __contentType, id } = related; - - assertNotEmpty( - __contentType, - new FillNavigationError("Related item's content type is missing") - ); - assertIsNumber( - id, - new FillNavigationError("Related item's id is not a number") - ); - - const relatedItemWithLocalizations = await strapi - .query(__contentType) - .findOne({ where: { id }, populate: I18N_DEFAULT_POPULATE }); - const localization = relatedItemWithLocalizations.localizations?.find( - ({ locale }) => locale === localeCode - ); - - return { - refId: localization?.id ?? id, - ref: __contentType, - field: related.field, - }; -}; diff --git a/server/i18n/types.ts b/server/i18n/types.ts deleted file mode 100644 index c488d0d9..00000000 --- a/server/i18n/types.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { IStrapi, OnlyStrings, StringMap, WhereClause } from "strapi-typed"; -import { - ICommonService, - Navigation, - NavigationItemInput, - NestedStructure, - NotVoid, -} from "../../types"; - -export type AddI18NConfigFieldsInput = { - previousConfig: T; - strapi: IStrapi; - viaSettingsPage?: boolean; -}; - -export type HandleLocaleParamInput = { - locale?: string; - strapi: IStrapi; -}; - -export type I18nAwareEntityReadHandlerInput = { - entity: T | undefined | null; - entityUid: string; - whereClause: WhereClause>; - localeCode?: string; - strapi: IStrapi; - populate?: string[]; -}; - -export type I18NConfigFields = { - i18nEnabled: boolean; - isI18NPluginEnabled: boolean | undefined; - pruneObsoleteI18nNavigations: boolean; - defaultLocale?: string | null; -}; - -export type AddI18nWhereClause = { - previousWhere: T; - strapi: IStrapi; - query: StringMap & { localeCode?: string }; - modelUid: string; -}; - -export type I18nNavigationContentsCopyInput = { - target: Navigation; - source: Navigation; - service: ICommonService; - strapi: IStrapi; -}; - -export type I18nNavigationItemReadInput = { - path: string; - source: Navigation; - strapi: IStrapi; - target: Navigation; -}; - -export type SourceNavigationItem = NestedStructure< - NotVoid[0] ->; - -export type ResultNavigationItem = NestedStructure; - -export type FillCopyContext = { - master: Navigation; - strapi: IStrapi; - localeCode: string; -}; - -export type MinimalEntityWithI18n = { - id: number; - localizations?: Array<{ - id: number; - locale?: string; - }>; -}; diff --git a/server/i18n/utils.ts b/server/i18n/utils.ts deleted file mode 100644 index 4f270103..00000000 --- a/server/i18n/utils.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { IStrapi } from "strapi-typed"; -import { NavigationPluginConfig } from "../../types"; -import { prop } from "lodash/fp"; - -type GetI18nStatusInput = { - strapi: IStrapi; -}; - -type I18NStatus = { - hasI18NPlugin: boolean; - enabled: boolean; - defaultLocale?: string | null; - locales?: string[] | undefined -}; - -export const getI18nStatus = async ({ - strapi, -}: GetI18nStatusInput): Promise => { - const i18nPlugin: null | any = strapi.plugin("i18n") - const hasI18NPlugin = !!i18nPlugin; - const pluginStore = strapi.store({ - type: "plugin", - name: "navigation", - }); - - const config: NavigationPluginConfig = await pluginStore.get({ - key: "config", - }); - const localeService = i18nPlugin ? i18nPlugin.service("locales") : null; - const defaultLocale: string | undefined = await localeService?.getDefaultLocale(); - const locales: string[] | undefined = (await localeService?.find({}))?.map(prop("code")); - - return hasI18NPlugin - ? { - hasI18NPlugin, - enabled: config.i18nEnabled, - defaultLocale, - locales, - } - : { - hasI18NPlugin, - enabled: false, - defaultLocale: undefined, - locales: undefined - }; -}; diff --git a/server/navigation/index.ts b/server/navigation/index.ts deleted file mode 100644 index 871478ea..00000000 --- a/server/navigation/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./setupStrategy"; diff --git a/server/navigation/setupStrategy.ts b/server/navigation/setupStrategy.ts deleted file mode 100644 index b997396a..00000000 --- a/server/navigation/setupStrategy.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { IStrapi, StrapiPlugin } from "strapi-typed"; -import { INavigationSetupStrategy, Navigation } from "../../types"; -import { i18nNavigationSetupStrategy } from "../i18n"; -import { DEFAULT_NAVIGATION_ITEM, DEFAULT_POPULATE, getPluginService } from "../utils"; - -export const navigationSetupStrategy: INavigationSetupStrategy = async ( - context -) => { - const i18nPlugin: StrapiPlugin | undefined = context.strapi.plugin("i18n"); - const defaultLocale: string | null = i18nPlugin ? await i18nPlugin.service("locales").getDefaultLocale() : null; - - if (defaultLocale) { - return await i18nNavigationSetupStrategy(context); - } else { - return await regularNavigationSetupStrategy(context); - } -}; - -const regularNavigationSetupStrategy: INavigationSetupStrategy = async ({ - strapi, -}) => { - const navigations = await getCurrentNavigations(); - - if (!navigations.length) { - return [ - await createNavigation({ - strapi, - payload: { - ...DEFAULT_NAVIGATION_ITEM, - }, - populate: DEFAULT_POPULATE - }), - ]; - } - - return navigations; -}; - -// TODO: Move to service -const createNavigation = ({ - strapi, - payload, - populate -}: { - strapi: IStrapi; - payload: Partial; - populate?: (keyof Navigation)[] -}): Promise => - strapi.query("plugin::navigation.navigation").create({ - data: { - ...payload, - }, - populate, - }); - -const getCurrentNavigations = (): Promise => - getPluginService('admin').get(); diff --git a/server/register/index.ts b/server/register/index.ts deleted file mode 100644 index 18554e89..00000000 --- a/server/register/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default async () => {}; diff --git a/server/routes/admin.ts b/server/routes/admin.ts deleted file mode 100644 index d925645d..00000000 --- a/server/routes/admin.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { StrapiRoutes } from "../../types"; -import pluginPermissions from "../../permissions"; - -const routes: StrapiRoutes = { - type: 'admin', - routes: [ - { - method: 'GET', - path: '/', - handler: 'admin.get', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('read')], - }, - }] - } - }, - { - method: 'POST', - path: '/', - handler: 'admin.post', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('update')], - }, - }] - } - }, - { - method: 'GET', - path: '/config', - handler: 'admin.config', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('read')], - }, - }] - } - }, - { - method: 'PUT', - path: '/config', - handler: 'admin.updateConfig', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('settings')], - }, - }] - } - }, - { - method: 'DELETE', - path: '/config', - handler: 'admin.restoreConfig', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('settings')], - }, - }] - } - }, - { - method: 'DELETE', - path: '/cache/purge/:id', - handler: 'admin.purgeNavigationCache', - config: { - policies: [ - 'admin::isAuthenticatedAdmin' - ] - } - }, - { - method: 'DELETE', - path: '/cache/purge', - handler: 'admin.purgeNavigationsCache', - config: { - policies: [ - 'admin::isAuthenticatedAdmin' - ] - } - }, - { - method: 'GET', - path: '/slug', - handler: 'admin.getSlug', - config: { - policies: [ - 'admin::isAuthenticatedAdmin' - ] - } - }, - { - method: 'GET', - path: '/:id', - handler: 'admin.getById', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('read')], - }, - }] - } - }, - { - method: 'PUT', - path: '/:id', - handler: 'admin.put', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('update')], - }, - }] - } - }, - { - method: 'DELETE', - path: '/:id', - handler: 'admin.delete', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('update')], - }, - }] - } - }, - { - method: 'GET', - path: '/content-type-items/:model', - handler: 'admin.getContentTypeItems', - config: { - policies: [ - 'admin::isAuthenticatedAdmin' - ] - } - }, - { - method: 'GET', - path: '/settings/config', - handler: 'admin.settingsConfig', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('settings')], - }, - }] - } - }, - { - method: 'GET', - path: '/settings/restart', - handler: 'admin.settingsRestart', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('settings')], - }, - }] - } - }, - { - method: 'PUT', - path: '/i18n/copy/:source/:target', - handler: 'admin.fillFromOtherLocale', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('update')], - }, - }] - } - }, - { - method: 'GET', - path: '/i18n/item/read/:source/:target', - handler: 'admin.readNavigationItemFromLocale', - config: { - policies: [{ - name: "admin::hasPermissions", - config: { - actions: [pluginPermissions.render('read')], - }, - }] - } - }, - ] -} - -export default routes; diff --git a/server/services/__tests__/service.test.ts b/server/services/__tests__/service.test.ts deleted file mode 100644 index 9344b20e..00000000 --- a/server/services/__tests__/service.test.ts +++ /dev/null @@ -1,1568 +0,0 @@ -import { IStrapi, StrapiContext, StrapiStore } from "strapi-typed"; -import { - ICommonService, - Navigation, - NavigationItem, - ToBeFixed, -} from "../../../types"; - -import setupStrapi from "../../../__mocks__/strapi"; -import { allLifecycleHooks, getPluginService, RENDER_TYPES } from "../../utils"; -import adminService from "../admin"; -import clientService from "../client"; - -declare var strapi: IStrapi; - -describe("Navigation services", () => { - beforeAll(async () => { - setupStrapi(); - }); - - describe("Correct config", () => { - it("Declares Strapi instance", () => { - expect(strapi).toBeDefined(); - expect(strapi.plugin("navigation").service("admin")).toBeDefined(); - expect(strapi.plugin("navigation").service("client")).toBeDefined(); - expect(strapi.plugin("navigation").service("common")).toBeDefined(); - }); - - it("Defines proper content types", () => { - expect(strapi.contentTypes).toBeDefined(); - expect(strapi.plugin("navigation").contentTypes).toBeDefined(); - }); - - it("Can read and return plugins config", () => { - expect( - strapi.plugin("navigation").config("additionalFields") - ).toBeDefined(); - expect(strapi.plugin("navigation").config("contentTypes")).toBeDefined(); - expect( - strapi.plugin("navigation").config("contentTypesNameFields") - ).toBeDefined(); - expect( - strapi.plugin("navigation").config("contentTypesPopulate") - ).toBeDefined(); - expect(strapi.plugin("navigation").config("allowedLevels")).toBeDefined(); - expect(strapi.plugin("navigation").config("gql")).toBeDefined(); - expect(strapi.plugin("navigation").config("preferCustomContentTypes")).toBeDefined(); - }); - }); - - describe("Render navigation", () => { - it("Can render branch in flat format", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ idOrSlug: 1 }); - - expect(result).toBeDefined(); - expect(result.length).toBe(2); - expect(result).toHaveProperty([0, "related", "id"], 1); - expect(result).toHaveProperty([0, "related", "title"], "Page nr 1"); - expect(result).toHaveProperty( - [0, "string_test_field"], - "Custom field value" - ); - }); - - it("Can render branch in flat format for GraphQL", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - wrapRelated: true, - }); - - expect(result).toBeDefined(); - expect(result.length).toBe(2); - expect(result).toHaveProperty([0, "related", "id"], 1); - expect(result).toHaveProperty( - [0, "related", "attributes", "title"], - "Page nr 1" - ); - expect(result).toHaveProperty( - [0, "string_test_field"], - "Custom field value" - ); - }); - - it("Can render branch in tree format", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - type: RENDER_TYPES.TREE, - }); - - expect(result).toBeDefined(); - expect(result.length).toBeGreaterThan(0); - expect(result[0].items).toBeDefined(); - expect(result[0].items.length).toBeGreaterThan(0); - expect(result).toHaveProperty( - [0, "items", 0, "string_test_field"], - "Custom field value" - ); - }); - - it("Can render branch in tree format for GraphQL", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - type: RENDER_TYPES.TREE, - wrapRelated: true, - }); - - expect(result).toBeDefined(); - expect(result.length).toBeGreaterThan(0); - expect(result).toHaveProperty([0, "related", "id"], 1); - expect(result).toHaveProperty( - [0, "related", "attributes", "title"], - "Page nr 1" - ); - expect(result).toHaveProperty([0, "items", 0, "related", "id"], 2); - expect(result).toHaveProperty( - [0, "items", 0, "related", "attributes", "title"], - "Page nr 2" - ); - expect(result).toHaveProperty( - [0, "string_test_field"], - "Custom field value" - ); - }); - - it("Can render branch in rfr format", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - type: RENDER_TYPES.RFR, - }); - - expect(result).toBeDefined(); - expect(result.pages).toBeDefined(); - expect(result.nav).toBeDefined(); - }); - - it("Can render branch in rfr format for GraphQL", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - type: RENDER_TYPES.RFR, - wrapRelated: true, - }); - - expect(result).toBeDefined(); - expect(result.pages).toBeDefined(); - expect(result.nav).toBeDefined(); - expect(result).toHaveProperty(["pages", "home", "related", "id"], 1); - }); - - it("Can render only menu attached elements", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - type: RENDER_TYPES.FLAT, - menuOnly: true, - }); - - expect(result).toBeDefined(); - expect(result.length).toBe(1); - }); - - it("Can render branch by path", async () => { - const clientService = getPluginService("client"); - const result = await clientService.render({ - idOrSlug: 1, - type: RENDER_TYPES.FLAT, - menuOnly: false, - rootPath: "/home/side", - }); - - expect(result).toBeDefined(); - expect(result.length).toBe(1); - }); - }); - - describe("Render child", () => { - it("Can render child", async () => { - const clientService = getPluginService("client"); - const result = await clientService.renderChildren({ - idOrSlug: 1, - childUIKey: "home", - }); - - expect(result).toBeDefined(); - expect(result.length).toBe(1); - }); - }); - - describe("Lifecycle hooks", () => { - it.each(allLifecycleHooks)( - "should trigger for %s hook listener", - async (hookName: ToBeFixed) => { - // Given - const commonService = getPluginService("common"); - const listenerA = jest.fn().mockResolvedValue("ABC"); - const listenerB = jest.fn(); - const event = {} as ToBeFixed; - - commonService.registerLifecycleHook({ - callback: listenerA, - contentTypeName: "navigation", - hookName, - }); - commonService.registerLifecycleHook({ - callback: listenerB, - contentTypeName: "navigation", - hookName, - }); - - // When - await commonService.runLifecycleHook({ - contentTypeName: "navigation", - event, - hookName, - }); - - // Then - expect(listenerA).toHaveBeenCalledTimes(1); - expect(listenerB).toHaveBeenCalledTimes(1); - } - ); - }); - describe("ClientService", () => { - let index = 0; - const generateNavigation = ( - rest: Partial = {} - ): Partial => ({ - name: `Navigation-${++index}`, - id: ++index, - ...rest, - }); - - describe("readAll()", () => { - it("should read results", async () => { - // Given - const allLocale = ["en", "pl", "ff", "fr"]; - const activeLocale = allLocale.filter((locale) => locale != "fr"); - const locale = allLocale[0]; - const findMany = jest.fn(); - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: false }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const navigations = allLocale.map((localeCode) => - generateNavigation({ - localeCode, - localizations: allLocale - .filter((locale) => locale !== localeCode) - .map((_localeCode) => - generateNavigation({ localeCode: _localeCode }) - ) as ToBeFixed, - }) - ); - const service = clientService({ - strapi: strapi as StrapiContext["strapi"], - }); - const orderBy = "name"; - const orderDirection = "ASC"; - - findMany.mockResolvedValue(navigations); - - // When - const result = await service.readAll({ - orderBy, - locale, - orderDirection, - }); - - // Then - expect(findMany.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "orderBy": Object { - "name": "ASC", - }, - "populate": false, - "where": Object { - "localeCode": "en", - }, - }, - ], - ] - `); - expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "id": 8, - "localeCode": "en", - "localizations": Array [ - Object { - "id": 2, - "localeCode": "pl", - "name": "Navigation-1", - }, - Object { - "id": 4, - "localeCode": "ff", - "name": "Navigation-3", - }, - Object { - "id": 6, - "localeCode": "fr", - "name": "Navigation-5", - }, - ], - "name": "Navigation-7", - }, - Object { - "id": 16, - "localeCode": "pl", - "localizations": Array [ - Object { - "id": 10, - "localeCode": "en", - "name": "Navigation-9", - }, - Object { - "id": 12, - "localeCode": "ff", - "name": "Navigation-11", - }, - Object { - "id": 14, - "localeCode": "fr", - "name": "Navigation-13", - }, - ], - "name": "Navigation-15", - }, - Object { - "id": 24, - "localeCode": "ff", - "localizations": Array [ - Object { - "id": 18, - "localeCode": "en", - "name": "Navigation-17", - }, - Object { - "id": 20, - "localeCode": "pl", - "name": "Navigation-19", - }, - Object { - "id": 22, - "localeCode": "fr", - "name": "Navigation-21", - }, - ], - "name": "Navigation-23", - }, - Object { - "id": 32, - "localeCode": "fr", - "localizations": Array [ - Object { - "id": 26, - "localeCode": "en", - "name": "Navigation-25", - }, - Object { - "id": 28, - "localeCode": "pl", - "name": "Navigation-27", - }, - Object { - "id": 30, - "localeCode": "ff", - "name": "Navigation-29", - }, - ], - "name": "Navigation-31", - }, - ] - `); - }); - it("should read locale aware results", async () => { - // Given - const allLocale = ["en", "pl", "ff", "fr"]; - const activeLocale = allLocale.filter((locale) => locale != "fr"); - const locale = allLocale[0]; - const findMany = jest.fn(); - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: true }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const navigations = allLocale.map((localeCode) => - generateNavigation({ - localeCode, - localizations: allLocale - .filter((locale) => locale !== localeCode) - .map((_localeCode) => - generateNavigation({ localeCode: _localeCode }) - ) as ToBeFixed, - }) - ); - const service = clientService({ - strapi: strapi as StrapiContext["strapi"], - }); - const orderBy = "name"; - const orderDirection = "ASC"; - - findMany.mockResolvedValue(navigations); - - // When - const result = await service.readAll({ - orderBy, - locale, - orderDirection, - }); - - // Then - expect(findMany.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "orderBy": Object { - "name": "ASC", - }, - "populate": false, - "where": Object { - "localeCode": "en", - }, - }, - ], - ] - `); - expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "id": 40, - "localeCode": "en", - "localizations": Array [ - Object { - "id": 34, - "localeCode": "pl", - "name": "Navigation-33", - }, - Object { - "id": 36, - "localeCode": "ff", - "name": "Navigation-35", - }, - ], - "name": "Navigation-39", - }, - Object { - "id": 48, - "localeCode": "pl", - "localizations": Array [ - Object { - "id": 42, - "localeCode": "en", - "name": "Navigation-41", - }, - Object { - "id": 44, - "localeCode": "ff", - "name": "Navigation-43", - }, - ], - "name": "Navigation-47", - }, - Object { - "id": 56, - "localeCode": "ff", - "localizations": Array [ - Object { - "id": 50, - "localeCode": "en", - "name": "Navigation-49", - }, - Object { - "id": 52, - "localeCode": "pl", - "name": "Navigation-51", - }, - ], - "name": "Navigation-55", - }, - ] - `); - }); - }); - }); - - describe("AdminService", () => { - let navigationIndex = 0; - let itemIndex = 0; - const generateNavigation = ( - rest: Partial = {} - ): Partial => ({ - name: `Navigation-${++navigationIndex}`, - id: ++navigationIndex, - ...rest, - }); - - beforeEach(() => { - navigationIndex = 0; - }); - const generateNavigationItem = ( - rest: Partial = {} - ): Partial => ({ - path: `/navigation-item-${++itemIndex}`, - id: ++itemIndex, - ...rest, - }); - - describe("get()", () => { - it("should ignore i18n when required", async () => { - // Given - const locale = "en"; - const allLocale = [locale, "fr", "ff", "de"]; - const findMany = jest.fn(); - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return allLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: true }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - const navigations = allLocale - .map((localeCode) => - generateNavigation({ - localeCode, - localizations: allLocale - .filter((locale) => locale !== localeCode) - .map((_localeCode) => - generateNavigation({ localeCode: _localeCode }) - ) as ToBeFixed, - }) - ) - .concat([generateNavigation({ localeCode: null })]); - - findMany.mockResolvedValue(navigations); - - // When - const result = await adminServiceBuilt.get(undefined, true); - - // Then - expect(findMany.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "populate": Array [ - "localizations", - ], - "where": Object {}, - }, - ], - ] - `); - expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "id": 8, - "localeCode": "en", - "localizations": Array [ - Object { - "id": 2, - "localeCode": "fr", - "name": "Navigation-1", - }, - Object { - "id": 4, - "localeCode": "ff", - "name": "Navigation-3", - }, - Object { - "id": 6, - "localeCode": "de", - "name": "Navigation-5", - }, - ], - "name": "Navigation-7", - }, - Object { - "id": 16, - "localeCode": "fr", - "localizations": Array [ - Object { - "id": 10, - "localeCode": "en", - "name": "Navigation-9", - }, - Object { - "id": 12, - "localeCode": "ff", - "name": "Navigation-11", - }, - Object { - "id": 14, - "localeCode": "de", - "name": "Navigation-13", - }, - ], - "name": "Navigation-15", - }, - Object { - "id": 24, - "localeCode": "ff", - "localizations": Array [ - Object { - "id": 18, - "localeCode": "en", - "name": "Navigation-17", - }, - Object { - "id": 20, - "localeCode": "fr", - "name": "Navigation-19", - }, - Object { - "id": 22, - "localeCode": "de", - "name": "Navigation-21", - }, - ], - "name": "Navigation-23", - }, - Object { - "id": 32, - "localeCode": "de", - "localizations": Array [ - Object { - "id": 26, - "localeCode": "en", - "name": "Navigation-25", - }, - Object { - "id": 28, - "localeCode": "fr", - "name": "Navigation-27", - }, - Object { - "id": 30, - "localeCode": "ff", - "name": "Navigation-29", - }, - ], - "name": "Navigation-31", - }, - Object { - "id": 34, - "localeCode": null, - "name": "Navigation-33", - }, - ] - `); - }); - it("should read all navigations", async () => { - // Given - const ids = [1, 2, 3, 4, 5, 6, 7]; - const navigations = ids.map((id) => generateNavigation({ id })); - const locale = "en"; - const activeLocale = [locale]; - const findMany = jest.fn(); - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: false }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - findMany.mockResolvedValue(navigations); - - // When - const result = await adminServiceBuilt.get(); - - // Then - expect(findMany.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "populate": Array [ - "localizations", - ], - "where": Object {}, - }, - ], - ] - `); - expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "id": 1, - "name": "Navigation-1", - }, - Object { - "id": 2, - "name": "Navigation-3", - }, - Object { - "id": 3, - "name": "Navigation-5", - }, - Object { - "id": 4, - "name": "Navigation-7", - }, - Object { - "id": 5, - "name": "Navigation-9", - }, - Object { - "id": 6, - "name": "Navigation-11", - }, - Object { - "id": 7, - "name": "Navigation-13", - }, - ] - `); - }); - - it("should read navigations only for specified ids", async () => { - // Given - const ids = [1, 2, 3, 4, 5, 6, 7]; - const navigations = ids.map((id) => generateNavigation({ id })); - const locale = "en"; - const activeLocale = [locale]; - const findMany = jest.fn(); - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: false }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - const selectedIds = [3, 4, 7]; - findMany.mockResolvedValue( - navigations.filter(({ id }) => selectedIds.includes(Number(id))) - ); - - // When - const result = await adminServiceBuilt.get([3, 4, 7]); - - // Then - expect(findMany.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "populate": Array [ - "localizations", - ], - "where": Object { - "id": Object { - "$in": Array [ - 3, - 4, - 7, - ], - }, - }, - }, - ], - ] - `); - expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "id": 3, - "name": "Navigation-5", - }, - Object { - "id": 4, - "name": "Navigation-7", - }, - Object { - "id": 7, - "name": "Navigation-13", - }, - ] - `); - }); - - it("should be internationalisation aware", async () => { - // Given - const locale = "en"; - const activeLocale = [locale, "fr", "ff"]; - const allLocale = [locale, "fr", "ff", "de"]; - const findMany = jest.fn(); - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: true }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - const navigations = allLocale.map((localeCode) => - generateNavigation({ - localeCode, - localizations: allLocale - .filter((locale) => locale !== localeCode) - .map((_localeCode) => - generateNavigation({ localeCode: _localeCode }) - ) as ToBeFixed, - }) - ); - const ids = navigations - .map(({ id }) => id) - .slice(1, 3) - .map(Number); - - findMany.mockResolvedValue( - navigations.filter(({ id }) => ids.includes(Number(id))) - ); - - // When - const result = await adminServiceBuilt.get(ids); - - // Then - expect(findMany.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "populate": Array [ - "localizations", - ], - "where": Object { - "id": Object { - "$in": Array [ - 16, - 24, - ], - }, - }, - }, - ], - ] - `); - expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "id": 16, - "localeCode": "fr", - "localizations": Array [ - Object { - "id": 10, - "localeCode": "en", - "name": "Navigation-9", - }, - Object { - "id": 12, - "localeCode": "ff", - "name": "Navigation-11", - }, - ], - "name": "Navigation-15", - }, - Object { - "id": 24, - "localeCode": "ff", - "localizations": Array [ - Object { - "id": 18, - "localeCode": "en", - "name": "Navigation-17", - }, - Object { - "id": 20, - "localeCode": "fr", - "name": "Navigation-19", - }, - ], - "name": "Navigation-23", - }, - ] - `); - }); - }); - - describe("delete()", () => { - it("should delete navigation with items", async () => { - // Given - const auditLogMock = jest.fn(); - const ids = [1]; - const navigations = ids.map((id) => generateNavigation({ id })); - const locale = "en"; - const activeLocale = [locale]; - const findManyNavigation = jest.fn(); - const findManyNavigationItem = jest.fn(); - const deleteNavigation = jest.fn(); - const deleteManyNavigation = jest.fn(); - const deleteManyNavigationItem = jest.fn(); - const query = (uid: string): any => { - if (uid === "plugin::navigation.navigation") { - return { - findMany: findManyNavigation, - delete: deleteNavigation, - deleteMany: deleteManyNavigation, - }; - } - - return { - findMany: findManyNavigationItem, - deleteMany: deleteManyNavigationItem, - }; - }; - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: false }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - findManyNavigation.mockResolvedValue(navigations); - findManyNavigationItem.mockResolvedValueOnce([ - generateNavigationItem({}), - generateNavigationItem({}), - ]); - - adminServiceBuilt.getById = jest.fn(); - - (adminServiceBuilt.getById as jest.Mock).mockReturnValue( - navigations[0] - ); - - // When - await adminServiceBuilt.delete(1, { emit: auditLogMock }); - - // Then - expect(findManyNavigation.mock.calls).toMatchInlineSnapshot(`Array []`); - expect(findManyNavigationItem.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "where": Object { - "$or": Array [ - Object { - "master": 1, - }, - ], - }, - }, - ], - ] - `); - expect(deleteManyNavigation.mock.calls).toMatchInlineSnapshot( - `Array []` - ); - expect(deleteManyNavigationItem.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "where": Object { - "id": Array [ - 2, - 4, - ], - }, - }, - ], - ] - `); - expect(deleteNavigation.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "where": Object { - "id": 1, - }, - }, - ], - ] - `); - expect(auditLogMock.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - "onNavigationDeletion", - Object { - "actionType": "DELETE", - "entity": Object { - "id": 1, - "name": "Navigation-1", - }, - }, - ], - ] - `); - }); - - it("should delete navigation with localisations", async () => { - // Given - const auditLogMock = jest.fn(); - const allLocale = ["en", "pl"]; - const activeLocale = allLocale.filter((locale) => locale != "fr"); - const locale = allLocale[0]; - const navigations = allLocale.map((localeCode) => - generateNavigation({ - localeCode, - localizations: allLocale - .filter((locale) => locale !== localeCode) - .map((_localeCode) => - generateNavigation({ localeCode: _localeCode }) - ) as ToBeFixed, - }) - ); - const findManyNavigation = jest.fn(); - const findManyNavigationItem = jest.fn(); - const deleteNavigation = jest.fn(); - const deleteManyNavigation = jest.fn(); - const deleteManyNavigationItem = jest.fn(); - const query = (uid: string): any => { - if (uid === "plugin::navigation.navigation") { - return { - findMany: findManyNavigation, - delete: deleteNavigation, - deleteMany: deleteManyNavigation, - }; - } - - return { - findMany: findManyNavigationItem, - deleteMany: deleteManyNavigationItem, - }; - }; - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return activeLocale.map((code) => ({ code })); - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const store = () => - ({ - get() { - return { i18nEnabled: true }; - }, - } as ToBeFixed); - const strapi: Partial = { - query, - plugin(name): any { - return name === "i18n" ? i18nPlugin : null; - }, - store, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - const id = navigations[0].id; - - findManyNavigation.mockResolvedValue(navigations); - - [1, 2, 3, 4, 5].forEach(() => { - findManyNavigationItem.mockResolvedValueOnce([ - generateNavigationItem({}), - generateNavigationItem({}), - ]); - }); - - adminServiceBuilt.getById = jest.fn(); - - (adminServiceBuilt.getById as jest.Mock).mockReturnValue( - navigations[0] - ); - - // When - await adminServiceBuilt.delete(id!, { emit: auditLogMock }); - - // Then - expect(findManyNavigation.mock.calls).toMatchInlineSnapshot(`Array []`); - expect(findManyNavigationItem.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "limit": 9007199254740991, - "where": Object { - "$or": Array [ - Object { - "master": 4, - }, - ], - }, - }, - ], - Array [ - Object { - "limit": 9007199254740991, - "where": Object { - "$or": Array [ - Object { - "master": 2, - }, - ], - }, - }, - ], - ] - `); - expect(deleteManyNavigation.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "where": Object { - "id": Object { - "$in": Array [ - 2, - ], - }, - }, - }, - ], - ] - `); - expect(deleteManyNavigationItem.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "where": Object { - "id": Array [ - 6, - 8, - ], - }, - }, - ], - Array [ - Object { - "where": Object { - "id": Array [ - 10, - 12, - ], - }, - }, - ], - ] - `); - expect(deleteNavigation.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "where": Object { - "id": 4, - }, - }, - ], - ] - `); - expect(auditLogMock.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - "onNavigationDeletion", - Object { - "actionType": "DELETE", - "entity": Object { - "id": 4, - "localeCode": "en", - "localizations": Array [ - Object { - "id": 2, - "localeCode": "pl", - "name": "Navigation-1", - }, - ], - "name": "Navigation-3", - }, - }, - ], - ] - `); - }); - }); - - describe("purgeNavigationsCache()", () => { - it("should clear all navigations", async () => { - // Given - const cacheCacheStore = { clearByRegexp: jest.fn() }; - const cachePlugin = { - service() { - return cacheCacheStore; - }, - } as ToBeFixed; - const strapi = { - plugin() { - return cachePlugin; - }, - } as ToBeFixed as IStrapi; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - // When - await adminServiceBuilt.purgeNavigationsCache(); - - // Then - expect(cacheCacheStore.clearByRegexp).toHaveBeenCalled(); - expect(cacheCacheStore.clearByRegexp.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Array [ - /\\\\/api\\\\/navigation\\\\/render\\(\\.\\*\\)/, - ], - ], - ] - `); - }); - }); - - describe("purgeNavigationCache()", () => { - it("should purge a single navigation's cache", async () => { - // Given - const cacheCacheStore = { clearByRegexp: jest.fn() }; - const cachePlugin = { - service() { - return cacheCacheStore; - }, - } as ToBeFixed; - const strapi = { - plugin() { - return cachePlugin; - }, - } as ToBeFixed as IStrapi; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - adminServiceBuilt.getById = jest.fn(); - - (adminServiceBuilt.getById as jest.Mock).mockResolvedValue({ - id: 1, - localizations: [{ id: 2 }, { id: 3 }], - }); - - // When - await adminServiceBuilt.purgeNavigationCache(1, false); - - // Then - expect(cacheCacheStore.clearByRegexp).toHaveBeenCalled(); - expect(cacheCacheStore.clearByRegexp.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Array [ - /\\\\/api\\\\/navigation\\\\/render\\\\/1/, - ], - ], - ] - `); - }); - - it("should purge a single navigation's cache and localisation when requested (if i18n enabled)", async () => { - // Given - const cacheCacheStore = { clearByRegexp: jest.fn() }; - const findMany = jest.fn(); - const locale = "en"; - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return [locale]; - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const cachePlugin = { - service() { - return cacheCacheStore; - }, - } as ToBeFixed; - const store = () => - ({ - get() { - return { i18nEnabled: true }; - }, - } as ToBeFixed); - const strapi = { - query, - plugin(name: string): any { - return name === "i18n" ? i18nPlugin : cachePlugin; - }, - store, - } as ToBeFixed as IStrapi; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - adminServiceBuilt.getById = jest.fn(); - - (adminServiceBuilt.getById as jest.Mock).mockResolvedValue({ - id: 1, - localizations: [{ id: 2 }, { id: 3 }], - }); - - // When - await adminServiceBuilt.purgeNavigationCache(1, true); - - // Then - expect(cacheCacheStore.clearByRegexp).toHaveBeenCalled(); - expect(cacheCacheStore.clearByRegexp.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Array [ - /\\\\/api\\\\/navigation\\\\/render\\\\/2/, - /\\\\/api\\\\/navigation\\\\/render\\\\/3/, - /\\\\/api\\\\/navigation\\\\/render\\\\/1/, - ], - ], - ] - `); - }); - - it("should purge a single navigation's cache only when requested to clear localisations (if i18n disabled)", async () => { - // Given - const cacheCacheStore = { clearByRegexp: jest.fn() }; - const findMany = jest.fn(); - const locale = "en"; - const query = (): any => ({ findMany }); - const i18nPluginService = { - getDefaultLocale() { - return locale; - }, - find() { - return [locale]; - }, - } as ToBeFixed; - const i18nPlugin = { - service() { - return i18nPluginService; - }, - }; - const cachePlugin = { - service() { - return cacheCacheStore; - }, - } as ToBeFixed; - const store = () => - ({ - get() { - return { i18nEnabled: false }; - }, - } as ToBeFixed); - const strapi = { - query, - plugin(name: string): any { - return name === "i18n" ? i18nPlugin : cachePlugin; - }, - store, - } as ToBeFixed as IStrapi; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - adminServiceBuilt.getById = jest.fn(); - - (adminServiceBuilt.getById as jest.Mock).mockResolvedValue({ - id: 1, - localizations: [{ id: 2 }, { id: 3 }], - }); - - // When - await adminServiceBuilt.purgeNavigationCache(1, true); - - // Then - expect(cacheCacheStore.clearByRegexp).toHaveBeenCalled(); - expect(cacheCacheStore.clearByRegexp.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - Array [ - /\\\\/api\\\\/navigation\\\\/render\\\\/1/, - ], - ], - ] - `); - }); - }); - - describe("restoreConfig()", () => { - it("should restore config", async () => { - // Given - const pluginStore: Partial = { - delete: jest.fn().mockResolvedValue(undefined), - }; - const commonService: Partial = { - async getPluginStore() { - return pluginStore as StrapiStore; - }, - setDefaultConfig: jest.fn().mockResolvedValue(undefined), - }; - const strapi: Partial = { - plugin() { - return { - service() { - return commonService; - }, - } as any; - }, - }; - const adminServiceBuilt = adminService({ strapi } as StrapiContext); - - // When - await adminServiceBuilt.restoreConfig(); - - // Then - expect(pluginStore.delete).toHaveBeenCalled(); - expect(commonService.setDefaultConfig).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/server/services/admin.ts b/server/services/admin.ts deleted file mode 100644 index 12e4c661..00000000 --- a/server/services/admin.ts +++ /dev/null @@ -1,468 +0,0 @@ -// @ts-ignore -import { errors } from "@strapi/utils"; -import { differenceBy, get, isEmpty, isNil, isObject } from "lodash"; -import { Id, StrapiContext, StrapiDBQueryArgs } from "strapi-typed"; -import { - Audience, - AuditLogContext, - IAdminService, - Navigation, - NavigationItem, - NavigationItemCustomField, - NavigationItemEntity, - NavigationPluginConfig, - ToBeFixed, -} from "../../types"; -import { - ALLOWED_CONTENT_TYPES, - buildNestedStructure, - CONTENT_TYPES_NAME_FIELDS_DEFAULTS, - DEFAULT_POPULATE, - getPluginModels, - getPluginService, - prepareAuditLog, - RESTRICTED_CONTENT_TYPES, - sendAuditLog, - validateAdditionalFields, -} from "../utils"; -import { - addI18NConfigFields, - getI18nStatus, - I18NConfigFields, - i18nNavigationContentsCopy, - i18nNavigationSetupStrategy, - i18nNavigationItemRead, -} from "../i18n"; -import { NavigationError } from "../../utils/NavigationError"; -import { addCacheConfigFields } from "../cache/serviceEnhancers"; -import { CacheConfigFields } from "../cache/types"; - -type SettingsPageConfig = NavigationPluginConfig & I18NConfigFields & CacheConfigFields; - -const adminService: (context: StrapiContext) => IAdminService = ({ - strapi, -}) => ({ - async config(viaSettingsPage = false): Promise { - const commonService = getPluginService("common"); - const { audienceModel } = getPluginModels(); - const pluginStore = await commonService.getPluginStore(); - const config = await pluginStore.get({ - key: "config", - }); - - const additionalFields = config.additionalFields; - const cascadeMenuAttached = config.cascadeMenuAttached; - const contentTypesNameFields = config.contentTypesNameFields; - const contentTypesPopulate = config.contentTypesPopulate; - const pathDefaultFields = config.pathDefaultFields; - const allowedLevels = config.allowedLevels; - const preferCustomContentTypes = config.preferCustomContentTypes; - const isGQLPluginEnabled = !isNil(strapi.plugin("graphql")); - - let extendedResult: Record = { - allowedContentTypes: ALLOWED_CONTENT_TYPES, - restrictedContentTypes: RESTRICTED_CONTENT_TYPES, - }; - const configContentTypes = await commonService.configContentTypes(); - const result = { - contentTypes: await commonService.configContentTypes(viaSettingsPage), - contentTypesNameFields: { - default: CONTENT_TYPES_NAME_FIELDS_DEFAULTS, - ...(isObject(contentTypesNameFields) ? contentTypesNameFields : {}), - }, - contentTypesPopulate: isObject(contentTypesPopulate) - ? contentTypesPopulate - : {}, - pathDefaultFields: isObject(pathDefaultFields) ? pathDefaultFields : {}, - allowedLevels, - additionalFields: viaSettingsPage - ? additionalFields - : additionalFields.filter( - (field) => typeof field === "string" || get(field, "enabled", false) - ), - gql: { - navigationItemRelated: configContentTypes.map(({ labelSingular }) => - labelSingular.replace(/\s+/g, "") - ), - }, - isGQLPluginEnabled: viaSettingsPage ? isGQLPluginEnabled : undefined, - cascadeMenuAttached, - preferCustomContentTypes, - }; - const i18nConfig = await addI18NConfigFields({ - strapi, - viaSettingsPage, - previousConfig: {}, - }); - const cacheConfig = await addCacheConfigFields({ strapi, previousConfig: {} }) - - if (additionalFields.includes("audience")) { - const audienceItems = await strapi - .query(audienceModel.uid) - .findMany({ - limit: Number.MAX_SAFE_INTEGER, - }); - extendedResult = { - ...extendedResult, - availableAudience: audienceItems, - }; - } - return { - ...result, - ...extendedResult, - ...i18nConfig, - ...cacheConfig, - }; - }, - - async get(ids, ignoreLocale = false): Promise { - const { masterModel } = getPluginModels(); - const { enabled: i18nEnabled, locales } = await getI18nStatus({ strapi }); - const whereClause: StrapiDBQueryArgs['where'] = {}; - - if (ids) { - whereClause.id = { $in: ids }; - } - - let entities = await strapi.query(masterModel.uid).findMany({ - limit: Number.MAX_SAFE_INTEGER, - populate: DEFAULT_POPULATE, - where: whereClause, - }); - - if (i18nEnabled && !ignoreLocale) { - entities = entities.reduce((acc, entity) => { - if (entity.localeCode && locales?.includes(entity.localeCode)) { - acc.push({ - ...entity, - localizations: entity.localizations?.filter(({ localeCode }) => localeCode && locales?.includes(localeCode)), - }); - } - - return acc; - }, [] as Navigation[]); - } - - return entities; - }, - - async getById(id: Id): Promise { - const commonService = getPluginService("common"); - - const { masterModel, itemModel } = getPluginModels(); - const entity = await strapi - .query(masterModel.uid) - .findOne({ where: { id }, populate: DEFAULT_POPULATE }); - - const entityItems = await strapi - .query(itemModel.uid) - .findMany({ - where: { - master: id, - }, - limit: Number.MAX_SAFE_INTEGER, - orderBy: [{ order: "asc" }], - populate: ["related", "parent", "audience"], - }); - const entities = await commonService.getRelatedItems(entityItems); - return { - ...entity, - items: buildNestedStructure(entities), - }; - }, - - async post(payload: ToBeFixed, auditLog: AuditLogContext) { - const commonService = getPluginService("common"); - const adminService = getPluginService("admin"); - const { enabled: i18nEnabled, defaultLocale } = await getI18nStatus({ - strapi, - }); - - const { masterModel } = getPluginModels(); - const { name, visible } = payload; - const data = { - name, - slug: await commonService.getSlug(name), - visible, - localeCode: i18nEnabled && defaultLocale ? defaultLocale : null - }; - - const existingEntity = await strapi - .query(masterModel.uid) - .create({ data }); - - const result = await commonService - .createBranch(payload.items, existingEntity, null, {}) - .then(() => adminService.getById(existingEntity.id)) - .then((newEntity: Navigation) => { - sendAuditLog(auditLog, "onChangeNavigation", { - actionType: "CREATE", - oldEntity: existingEntity, - newEntity, - }); - return newEntity; - }); - - await commonService.emitEvent( - masterModel.uid, - "entry.create", - existingEntity - ); - - if (i18nEnabled && defaultLocale) { - await i18nNavigationSetupStrategy({ strapi }); - } - - return result; - }, - - async put( - id: Id, - payload: Navigation & { items: ToBeFixed }, - auditLog: AuditLogContext - ) { - const adminService = getPluginService("admin"); - const commonService = getPluginService("common"); - const { enabled: i18nEnabled } = await getI18nStatus({ strapi }); - - const { masterModel } = getPluginModels(); - const { name, visible } = payload; - - const existingEntity = await adminService.getById(id); - const detailsHaveChanged = - existingEntity.name !== name || existingEntity.visible !== visible; - - if (detailsHaveChanged) { - const newName = detailsHaveChanged ? name : existingEntity.name; - const newSlug = detailsHaveChanged - ? await commonService.getSlug(name) - : existingEntity.slug; - - await strapi.query(masterModel.uid).update({ - where: { id }, - data: { - name: newName, - slug: newSlug, - visible, - }, - }); - - if (i18nEnabled && existingEntity.localizations) { - for (const locale of existingEntity.localizations) { - await strapi.query(masterModel.uid).update({ - where: { - id: locale.id, - }, - data: { - name: newName, - slug: `${newSlug}-${locale.localeCode}`, - visible, - }, - }); - } - } - } - const result = await commonService - .analyzeBranch(payload.items, existingEntity) - .then((auditLogsOperations: ToBeFixed) => - Promise.all([ - auditLog - ? prepareAuditLog( - (auditLogsOperations || []).flat(Number.MAX_SAFE_INTEGER) - ) - : [], - adminService.getById(existingEntity.id), - ]) - ) - .then(([actionType, newEntity]: ToBeFixed) => { - sendAuditLog(auditLog, "onChangeNavigation", { - actionType, - oldEntity: existingEntity, - newEntity, - }); - return newEntity; - }); - - const navigationEntity = await strapi - .query(masterModel.uid) - .findOne({ where: { id } }); - await commonService.emitEvent( - masterModel.uid, - "entry.update", - navigationEntity - ); - return result; - }, - - async delete(id, auditLog) { - const { masterModel, itemModel } = getPluginModels(); - const entity = await this.getById(id); - const { enabled: i18nEnabled } = await getI18nStatus({ strapi }); - // TODO: remove when cascade deletion is present - // NOTE: Delete many with relation `where` crashes ORM - const cleanNavigationItems = async (masterIds: Array) => { - if (masterIds.length < 1) { - return; - } - - const navigationItems = await strapi.query(itemModel.uid).findMany({ - where: { - $or: masterIds.map((id) => ({ master: id })), - }, - limit: Number.MAX_SAFE_INTEGER, - }); - - await strapi.query(itemModel.uid).deleteMany({ - where: { - id: navigationItems.map(({ id }) => (id)), - }, - }); - }; - - await cleanNavigationItems([id]); - await strapi.query(masterModel.uid).delete({ - where: { - id, - }, - }); - - if (i18nEnabled && entity.localizations) { - await cleanNavigationItems(entity.localizations.map(_ => _.id)); - await strapi.query(masterModel.uid).deleteMany({ - where: { - id: { - $in: entity.localizations.map((_) => _.id), - }, - }, - }); - } - - sendAuditLog(auditLog, "onNavigationDeletion", { - entity, - actionType: "DELETE", - }); - }, - - async restart(): Promise { - setImmediate(() => strapi.reload()); - }, - - async restoreConfig(): Promise { - const commonService = getPluginService("common", strapi); - const pluginStore = await commonService.getPluginStore(); - await pluginStore.delete({ key: "config" }); - await commonService.setDefaultConfig(); - }, - - async updateConfig(newConfig: NavigationPluginConfig): Promise { - const commonService = getPluginService("common"); - const pluginStore = await commonService.getPluginStore(); - const config = await pluginStore.get({ - key: "config", - }); - validateAdditionalFields(newConfig.additionalFields); - await pluginStore.set({ key: "config", value: newConfig }); - - const removedFields = differenceBy( - config.additionalFields, - newConfig.additionalFields, - "name" - ).filter((i) => i !== "audience") as NavigationItemCustomField[]; - if (!isEmpty(removedFields)) { - await commonService.pruneCustomFields(removedFields); - } - }, - - async fillFromOtherLocale({ target, source, auditLog }) { - const { enabled } = await getI18nStatus({ strapi }); - - if (!enabled) { - throw new NavigationError("Not yet implemented."); - } - - const adminService = getPluginService("admin"); - const commonService = getPluginService("common"); - const targetEntity = await adminService.getById(target); - - return await i18nNavigationContentsCopy({ - source: await adminService.getById(source), - target: targetEntity, - service: commonService, - strapi, - }) - .then(() => adminService.getById(target)) - .then((updated) => { - sendAuditLog(auditLog, "onChangeNavigation", { - actionType: "UPDATE", - oldEntity: targetEntity, - newEntity: updated, - }); - return updated; - }); - }, - async readNavigationItemFromLocale({ source, target, path }) { - const sourceNavigation = await this.getById(source); - const targetNavigation = await this.getById(target); - - if (!sourceNavigation) { - throw new errors.NotFoundError( - "Unable to find source navigation for specified query" - ); - } - - if (!targetNavigation) { - throw new errors.NotFoundError( - "Unable to find target navigation for specified query" - ); - } - - return await i18nNavigationItemRead({ - path, - source: sourceNavigation, - target: targetNavigation, - strapi, - }); - }, - - async purgeNavigationCache(id, clearLocalisations) { - const entity = await this.getById(id); - const regexps = []; - const mapToRegExp = (id: Id) => new RegExp(`/api/navigation/render/${id}`); - - if (!entity) { - throw new errors.NotFoundError("Navigation is not defined"); - } - - if (clearLocalisations) { - const { enabled: isI18nEnabled } = await getI18nStatus({ strapi }); - - if (isI18nEnabled) { - entity.localizations?.forEach((navigation) => { - regexps.push(mapToRegExp(navigation.id)); - }); - } - } - - const restCachePlugin = strapi.plugin("rest-cache"); - const cacheStore = restCachePlugin.service("cacheStore"); - - regexps.push(mapToRegExp(id)); - - await cacheStore.clearByRegexp(regexps); - - return { success: true }; - }, - - async purgeNavigationsCache() { - const restCachePlugin = strapi.plugin("rest-cache"); - const cacheStore = restCachePlugin.service("cacheStore"); - - const regex = new RegExp("/api/navigation/render(.*)"); - - await cacheStore.clearByRegexp([regex]); - - return { success: true }; - } -}); - -export default adminService; diff --git a/server/services/client.ts b/server/services/client.ts deleted file mode 100644 index 50382ecb..00000000 --- a/server/services/client.ts +++ /dev/null @@ -1,452 +0,0 @@ -import { first, get, isEmpty, isNil, isString, isArray, last, toNumber } from "lodash"; -import { Id, StrapiContext } from "strapi-typed"; -import { validate } from "uuid"; -import { assertNotEmpty, ContentTypeEntity, IClientService, Navigation, NavigationItem, NavigationItemCustomField, NavigationItemEntity, RFRNavItem, ToBeFixed } from "../../types" -import { composeItemTitle, getPluginModels, filterByPath, filterOutUnpublished, getPluginService, templateNameFactory, RENDER_TYPES, compareArraysOfNumbers, getCustomFields } from "../utils"; -//@ts-ignore -import { errors } from '@strapi/utils'; -import { getI18nStatus, i18nAwareEntityReadHandler } from "../i18n"; -import { NavigationError } from "../../utils/NavigationError"; -import { identity, pick } from "lodash/fp"; - -const clientService: (context: StrapiContext) => IClientService = ({ strapi }) => ({ - async readAll({ locale, orderBy = 'createdAt', orderDirection = "DESC" }) { - const { masterModel } = getPluginModels(); - const { enabled: i18nEnabled, locales } = await getI18nStatus({ strapi }); - - let navigations = await strapi - .query(masterModel.uid) - .findMany({ - where: locale - ? { - localeCode: locale, - } - : undefined, - orderBy: { [orderBy]: orderDirection } as ToBeFixed, - limit: Number.MAX_SAFE_INTEGER, - populate: false - }); - - if (i18nEnabled) { - navigations = navigations.reduce((acc, navigation) => { - if (navigation.localeCode && locales?.includes(navigation.localeCode)) { - acc.push({ - ...navigation, - localizations: navigation.localizations?.filter(({ localeCode }) => localeCode && locales?.includes(localeCode)), - }); - } - - return acc; - }, [] as Navigation[]); - } - - return navigations; - }, - - async render({ - idOrSlug, - type = RENDER_TYPES.FLAT, - menuOnly = false, - rootPath = null, - wrapRelated = false, - locale, - populate, - }) { - const clientService = getPluginService('client'); - - const findById = !isNaN(toNumber(idOrSlug)) || validate(idOrSlug as string); - const criteria = findById ? { id: idOrSlug } : { slug: idOrSlug }; - const itemCriteria = menuOnly ? { menuAttached: true } : {}; - return await clientService.renderType({ - type, criteria, itemCriteria, filter: null, rootPath, wrapRelated, locale, populate - }); - }, - - async renderChildren({ - idOrSlug, - childUIKey, - type = RENDER_TYPES.FLAT, - menuOnly = false, - wrapRelated = false, - locale, - }) { - const clientService = getPluginService('client'); - const findById = !isNaN(toNumber(idOrSlug)) || validate(idOrSlug as string); - const criteria = findById ? { id: idOrSlug } : { slug: idOrSlug }; - const filter = type === RENDER_TYPES.FLAT ? null : childUIKey; - - const itemCriteria = { - ...(menuOnly && { menuAttached: true }), - ...(type === RENDER_TYPES.FLAT ? { uiRouterKey: childUIKey } : {}), - }; - - return clientService.renderType({ type, criteria, itemCriteria, filter, rootPath: null, wrapRelated, locale }); - }, - - renderRFR({ - items, - parent = null, - parentNavItem = null, - contentTypes = [], - enabledCustomFieldsNames, - }) { - const clientService = getPluginService('client'); - let pages = {}; - let nav = {}; - let navItems: RFRNavItem[] = []; - - items.forEach(item => { - const { items: itemChilds, ...itemProps } = item; - const itemNav = clientService.renderRFRNav(itemProps); - const itemPage = clientService.renderRFRPage( - itemProps, - parent, - enabledCustomFieldsNames, - ); - - if (item.type !== "EXTERNAL") { - pages = { - ...pages, - [itemPage.id]: { - ...itemPage, - }, - }; - } - - if (item.menuAttached) { - navItems.push(itemNav); - } - - if (!parent) { - nav = { - ...nav, - root: navItems, - }; - } else { - const navLevel = navItems - .filter(navItem => navItem.type !== "EXTERNAL"); - if (!isEmpty(navLevel)) - nav = { - ...nav, - [parent]: navLevel.concat(parentNavItem ? parentNavItem : []), - }; - } - - if (!isEmpty(itemChilds)) { - const { nav: nestedNavs } = clientService.renderRFR({ - items: itemChilds, - parent: itemPage.id, - parentNavItem: itemNav, - contentTypes, - enabledCustomFieldsNames, - }); - const { pages: nestedPages } = clientService.renderRFR({ - items: (itemChilds).filter(child => child.type !== "EXTERNAL"), - parent: itemPage.id, - parentNavItem: itemNav, - contentTypes, - enabledCustomFieldsNames, - }); - pages = { - ...pages, - ...nestedPages, - }; - nav = { - ...nav, - ...nestedNavs, - }; - } - }); - - return { - pages, - nav, - }; - }, - - renderRFRNav(item): RFRNavItem { - const { uiRouterKey, title, path, type, audience } = item; - const itemCommon = { - label: title, - type: type, - audience, - } - - if (type === "EXTERNAL") { - assertNotEmpty(path, new NavigationError("External navigation item's path is undefined", item)); - return { - ...itemCommon, - url: path - }; - } - - if (type === "INTERNAL") { - return { - ...itemCommon, - page: uiRouterKey, - }; - } - - if (type === "WRAPPER") { - return { - ...itemCommon, - } - } - - throw new NavigationError("Unknown item type", item); - }, - - renderRFRPage( - item, - parent, - enabledCustomFieldsNames, - ) { - const { uiRouterKey, title, path, slug, related, type, audience, menuAttached } = item; - const { __contentType, id, __templateName } = related || {}; - const contentType = __contentType || ''; - return { - id: uiRouterKey, - title, - templateName: __templateName, - related: type === "INTERNAL" ? { - contentType, - id, - } : undefined, - path, - slug, - parent, - audience, - menuAttached, - ...enabledCustomFieldsNames.reduce((acc, field) => ({ ...acc, [field]: get(item, field) }), {}) - }; - }, - - async renderTree( - items = [], - id = null, - field = 'parent', - path = '', - itemParser = (i: ToBeFixed) => i, - ) { - return (await Promise.all( - items - .filter( - (item) => { - if (item[field] === null && id === null) { - return true; - } - let data = item[field]; - if (data && typeof id === 'string') { - data = data.toString(); - } - if (!!data && typeof data === 'object' && 'id' in data) { - return data.id === id - } - - return (data && data === id); - }, - ) - .filter(filterOutUnpublished) - .map(async (item) => itemParser( - { - ...item, - }, - path, - field - ) - ) - ) - ) - .sort((x, y) => { - if (x.order !== undefined && y.order !== undefined) - return x.order - y.order; - else - return 0; - }); - }, - - async renderType({ - type = RENDER_TYPES.FLAT, - criteria = {}, - itemCriteria = {}, - filter = null, - rootPath = null, - wrapRelated = false, - locale, - populate, - }) { - const clientService = getPluginService('client'); - const adminService = getPluginService('admin'); - const commonService = getPluginService('common'); - const entityWhereClause = { - ...criteria, - visible: true, - } - - const { masterModel, itemModel } = getPluginModels(); - - const entity = await i18nAwareEntityReadHandler({ - entity: await strapi - .query(masterModel.uid) - .findOne({ - where: entityWhereClause, - }), - entityUid: masterModel.uid, - strapi, - whereClause: entityWhereClause, - localeCode: locale, - }); - - if (entity && entity.id) { - const entities = await strapi.query(itemModel.uid).findMany({ - where: { - master: entity.id, - ...itemCriteria, - }, - limit: Number.MAX_SAFE_INTEGER, - orderBy: [{ order: 'asc', }], - populate: ['related', 'audience', 'parent'], - }); - - if (!entities) { - return []; - } - const items = await commonService.getRelatedItems(entities, populate); - const { contentTypes, contentTypesNameFields, additionalFields } = await adminService.config(false); - const enabledCustomFieldsNames = getCustomFields(additionalFields) - .reduce((acc, curr) => curr.enabled ? [...acc, curr.name] : acc, []); - - const wrapContentType = (itemContentType: ToBeFixed) => wrapRelated && itemContentType ? { - id: itemContentType.id, - attributes: { ...itemContentType } - } : itemContentType; - const pickMediaFields = pick(["name", "url", "mime", "width", "height", "previewUrl"]); - const customFieldsDefinitions = additionalFields.filter(_ => typeof _ !== "string") as NavigationItemCustomField[]; - - - switch (type) { - case RENDER_TYPES.TREE: - case RENDER_TYPES.RFR: - const getTemplateName = await templateNameFactory(items, strapi, contentTypes); - const itemParser = async (item: NavigationItemEntity, path = '', field: keyof NavigationItemEntity) => { - const isExternal = item.type === "EXTERNAL"; - const parentPath = isExternal ? undefined : `${path === '/' ? '' : path}/${first(item.path) === '/' - ? item.path!.substring(1) - : item.path}`; - const slug = isString(parentPath) ? await commonService.getSlug( - (first(parentPath) === '/' ? parentPath.substring(1) : parentPath).replace(/\//g, '-')) : undefined; - const lastRelated = isArray(item.related) ? last(item.related) : item.related; - const relatedContentType = wrapContentType(lastRelated); - const customFields = enabledCustomFieldsNames.reduce((acc, field) => { - const mapper = customFieldsDefinitions.find(({ name }) => name === field)?.type === "media" - ? (_: string) => pickMediaFields(JSON.parse(_)) - : identity; - const content = get(item, `additionalFields.${field}`); - - return { ...acc, [field]: content ? mapper(content) : content } - }, {}); - - return { - id: item.id, - title: composeItemTitle(item, contentTypesNameFields, contentTypes), - menuAttached: item.menuAttached, - order: item.order, - path: isExternal ? item.externalPath : parentPath, - type: item.type, - uiRouterKey: item.uiRouterKey, - slug: !slug && item.uiRouterKey ? commonService.getSlug(item.uiRouterKey) : slug, - external: isExternal, - related: isExternal || !lastRelated ? undefined : { - ...relatedContentType, - __templateName: getTemplateName((lastRelated.relatedType || lastRelated.__contentType), lastRelated.id), - }, - audience: !isEmpty(item.audience) ? item.audience!.map(({ key }) => key) : undefined, - items: isExternal ? undefined : await clientService.renderTree( - items, - item.id, - field, - parentPath, - itemParser, - ), - ...customFields - }; - }; - - const { - items: itemsFilteredByPath, - root: rootElement, - } = filterByPath(items, rootPath); - - const treeStructure = await clientService.renderTree( - isNil(rootPath) ? items : itemsFilteredByPath, - get(rootElement, 'parent.id') ?? null, - 'parent', - get(rootElement, 'parent.path'), - itemParser, - ); - - const filteredStructure = filter - ? treeStructure.filter((item: NavigationItem) => item.uiRouterKey === filter) - : treeStructure; - - if (type === RENDER_TYPES.RFR) { - return clientService.renderRFR({ - items: filteredStructure, - contentTypes, - enabledCustomFieldsNames, - }); - } - return filteredStructure; - default: - const publishedItems = items.filter(filterOutUnpublished); - const result = isNil(rootPath) ? items : filterByPath(publishedItems, rootPath).items; - - const defaultCache = new Map>(); - const getNestedOrders = (id: Id, cache: Map> = defaultCache): Array => { - const cached = cache.get(id); - if (!isNil(cached)) - return cached; - - const item = result.find(item => item.id === id); - - if (isNil(item)) - return [0]; - - const { order, parent } = item; - - const nestedOrders = parent - ? getNestedOrders(parent.id, cache).concat(order) - : [order]; - - cache.set(id, nestedOrders); - - return nestedOrders; - } - - return result - .map(({ additionalFields, autoSync: _, ...item }: NavigationItemEntity) => { - const customFields = enabledCustomFieldsNames.reduce((acc, field) => { - const mapper = customFieldsDefinitions.find(({ name }) => name === field)?.type === "media" - ? (_: string | boolean) => pickMediaFields(JSON.parse(_.toString())) - : identity; - const content = get(additionalFields, field); - - return { ...acc, [field]: content ? mapper(content) : content } - }, {}); - - return ({ - ...item, - audience: item.audience?.map(_ => (_).key), - title: composeItemTitle({ ...item, additionalFields }, contentTypesNameFields, contentTypes) || '', - related: wrapContentType(item.related),//omit(item.related, 'localizations'), - items: null, - ...customFields, - })}) - .sort((a, b) => compareArraysOfNumbers(getNestedOrders(a.id), getNestedOrders(b.id))); - } - } - throw new errors.NotFoundError(); - }, -}); - -export default clientService; diff --git a/server/services/common.ts b/server/services/common.ts deleted file mode 100644 index 70cef9ca..00000000 --- a/server/services/common.ts +++ /dev/null @@ -1,492 +0,0 @@ -import { find, get, isEmpty, isNil, last, map, omit, upperFirst } from "lodash"; -import pluralize from "pluralize"; -import { Id, StrapiContentType, StrapiContext, StrapiStore, StringMap } from "strapi-typed"; -//@ts-ignore -import { sanitize } from '@strapi/utils'; -import { ContentTypeEntity, Effect, ICommonService, LifeCycleHookName, Navigation, NavigationActions, NavigationActionsPerItem, NavigationItem, NavigationItemCustomField, NavigationItemEntity, NavigationItemRelated, NavigationPluginConfig, NestedStructure, RelatedRef, ToBeFixed } from "../../types"; -import { configSetupStrategy } from "../config"; -import { addI18nWhereClause } from "../i18n"; -import { checkDuplicatePath, ContentType, getPluginModels, getPluginService, isContentTypeEligible, KIND_TYPES, parsePopulateQuery, purgeSensitiveData, singularize } from "../utils"; -import slugify from "@sindresorhus/slugify"; - -type LifecycleHookRecord = Partial>>>; - -const lifecycleHookListeners: Record = { - navigation: {}, - "navigation-item": {} -} - -const commonService: (context: StrapiContext) => ICommonService = ({ strapi }) => ({ - analyzeBranch( - items: NestedStructure[] = [], - masterEntity: Navigation | null = null, - parentItem: NavigationItemEntity | null = null, - prevOperations: NavigationActions = {}, - ): Promise { - const commonService = getPluginService('common'); - const { toCreate, toRemove, toUpdate } = items - .reduce((acc: NavigationActionsPerItem, _) => { - const branchName: keyof NavigationActionsPerItem | void = commonService.getBranchName(_); - if (branchName) { - return { ...acc, [branchName]: [...acc[branchName], _] }; - } - return acc; - }, - { toRemove: [], toCreate: [], toUpdate: [] }, - ); - const operations = { - create: prevOperations.create || !!toCreate.length, - update: prevOperations.update || !!toUpdate.length, - remove: prevOperations.remove || !!toRemove.length, - }; - return checkDuplicatePath(parentItem || masterEntity, toCreate.concat(toUpdate)) - .then(() => Promise.all( - [ - commonService.createBranch(toCreate, masterEntity, parentItem, operations), - commonService.removeBranch(toRemove, operations), - commonService.updateBranch(toUpdate, masterEntity, parentItem, operations), - ], - )); - }, - - async configContentTypes(viaSettingsPage: boolean = false): Promise[]> { - const commonService = getPluginService('common'); - const pluginStore = await commonService.getPluginStore() - const config: NavigationPluginConfig = await pluginStore.get({ key: 'config' }); - const eligibleContentTypes = - await Promise.all( - config.contentTypes - .filter(contentType => !!strapi.contentTypes[contentType] && isContentTypeEligible(contentType)) - .map( - async (key) => { - const item = strapi.contentTypes[key]; - - const { kind, options, uid } = item; - const { draftAndPublish } = options; - - const isSingleType = kind === KIND_TYPES.SINGLE; - const isSingleTypeWithPublishFlow = isSingleType && draftAndPublish; - - const returnType = (available: boolean) => ({ - key, - available, - }); - - if (isSingleType) { - if (isSingleTypeWithPublishFlow) { - const itemsCountOrBypass = isSingleTypeWithPublishFlow ? - await strapi.query>(uid).count({ - where: { - published_at: { $notNull: true }, - }, - }) : - true; - return returnType(itemsCountOrBypass !== 0); - } - const isAvailable = await strapi.query>(uid).count({}); - return isAvailable !== 0 ? - returnType(true) : - (viaSettingsPage ? returnType(false) : undefined); - } - return returnType(true); - }, - ), - ) - - return eligibleContentTypes - .filter(key => key) - .map((value) => { - if (value === undefined) return; - const { key, available } = value; - const item = strapi.contentTypes[key]; - const relatedField = (item.associations || []).find((_: ToBeFixed) => _.model === 'navigationitem'); - const { uid, options, info, collectionName, modelName, apiName, plugin, kind, pluginOptions = {} } = item; - const { visible = true } = pluginOptions['content-manager'] || {}; - const { name, description } = info; - const { hidden, templateName, draftAndPublish } = options; - const findRouteConfig = find(get(strapi.api, `[${modelName}].config.routes`, []), - route => route.handler.includes('.find')); - const findRoutePath = findRouteConfig && findRouteConfig.path.split('/')[1]; - const apiPath = findRoutePath && (findRoutePath !== apiName) ? findRoutePath : apiName || modelName; - const isSingle = kind === KIND_TYPES.SINGLE; - const endpoint = isSingle ? apiPath : pluralize(apiPath); - const relationName = singularize(modelName); - const relationNameParts = typeof uid === 'string' ? last((uid).split('.'))!.split('-') : []; - const contentTypeName = relationNameParts.length > 1 ? relationNameParts.reduce( - (prev, curr) => `${prev}${upperFirst(curr)}`, '') : upperFirst(modelName); - const labelSingular = name || - (upperFirst(relationNameParts.length > 1 ? relationNameParts.join(' ') : relationName)); - return { - uid, - name: relationName, - draftAndPublish, - isSingle, - description, - collectionName, - contentTypeName, - label: isSingle ? labelSingular : pluralize(name || labelSingular), - relatedField: relatedField ? relatedField.alias : undefined, - labelSingular: singularize(labelSingular), - endpoint, - plugin, - available: available && !hidden, - visible, - templateName, - }; - }) - .filter((item) => viaSettingsPage || (item && item.available)); - }, - - async createBranch( - items, - masterEntity, - parentItem, - operations, - ) { - const commonService = getPluginService('common'); - const { itemModel } = getPluginModels(); - return await Promise.all( - items.map(async (item) => { - operations.create = true; - const { parent, master, related, ...params } = item; - const relatedItems = await this.getIdsRelated(related, master); - const data = { - ...params, - related: relatedItems, - master: masterEntity, - parent: parentItem ? { ...parentItem, _id: parentItem.id } : null, - } - const navigationItem = await strapi - .query(itemModel.uid) - .create({ data, populate: ['related'] }); - return !isEmpty(item.items) - ? commonService.createBranch( - item.items, - masterEntity, - navigationItem, - operations, - ) - : operations; - }), - ); - }, - - getBranchName( - item: NavigationItem - ): keyof NavigationActionsPerItem | void { - const hasId = !isNil(item.id); - const toRemove = item.removed; - if (hasId && !toRemove) { - return 'toUpdate'; - } - if (hasId && toRemove) { - return 'toRemove'; - } - if (!hasId && !toRemove) { - return 'toCreate'; - } - }, - - async getContentTypeItems(uid: string, query: StringMap): Promise { - const commonService = getPluginService('common'); - const pluginStore = await commonService.getPluginStore(); - const config: NavigationPluginConfig = await pluginStore.get({ key: 'config' }); - const where = await addI18nWhereClause({ - strapi, - previousWhere: {}, - query, - modelUid: uid, - }) - try { - const contentTypeItems = await strapi.query>(uid).findMany({ - populate: config.contentTypesPopulate[uid] || [], - where, - }); - return contentTypeItems; - } catch (err) { - return []; - } - }, - - async getIdsRelated(relatedItems, master): Promise { - if (relatedItems) { - return ( - await Promise.all( - relatedItems.map(async (relatedItem) => { - try { - const model = strapi.query( - "plugin::navigation.navigations-items-related" - ); - const entity = await model.findOne({ - where: { - related_id: relatedItem.refId, - related_type: relatedItem.ref, - field: relatedItem.field, - master, - }, - }); - if (!entity) { - const newEntity = { - master, - order: 1, - field: relatedItem.field, - related_id: relatedItem.refId, - related_type: relatedItem.ref, - }; - return model.create({ data: newEntity }).then(({ id }) => id); - } - return entity.id; - } catch (e) { - console.error(e); - } - }) - ) - ).reduce( - (acc, id) => (id ? acc.concat([id]) : acc), - [] - ); - } - }, - - async getPluginStore(): Promise { - return await strapi.store({ type: 'plugin', name: 'navigation' }); - }, - - async getRelatedItems(entityItems, populate): Promise[]> { - const commonService = getPluginService('common'); - const pluginStore = await commonService.getPluginStore(); - const config: NavigationPluginConfig = await pluginStore.get({ key: 'config' }); - const relatedTypes: Set = new Set(entityItems.flatMap((item) => get(item.related, 'related_type', ''))); - const groupedItems = Array.from(relatedTypes).filter((relatedType) => relatedType).reduce(( - acc: { [uid: string]: NavigationItemRelated[] }, - relatedType - ) => Object.assign(acc, { - [relatedType]: [ - ...(acc[relatedType] || []), - ...entityItems - .filter((item => get(item.related, 'related_type') === relatedType)) - .flatMap((item) => Object.assign(item.related || {}, { navigationItemId: item.id })), - ], - }), {}); - - const data: Map = new Map( - ( - await Promise.all( - Object.entries(groupedItems) - .map(async ([model, related]) => { - let relationData = []; - - try { - relationData = await strapi - .query>(model) - .findMany({ - where: { - id: { $in: map(related, 'related_id') }, - }, - populate: isNil(populate) ? config.contentTypesPopulate[model] || [] : parsePopulateQuery(populate) - }); - } catch (e: unknown) { - console.log("Related content type was removed. See details below."); - console.error(e); - } - - return relationData - .flatMap(_ => - Object.assign( - _, - { - __contentType: model, - navigationItemId: related.find( - ({ related_id }) => related_id === _.id!.toString())?.navigationItemId - }, - ), - ); - }), - ) - ) - .flat(1) - .map(_ => [_.navigationItemId, _]), - ); - return entityItems - .map(({ related, ...item }) => { - const relatedData = data.get(item.id); - - if (relatedData) { - return Object.assign(item, { - related: purgeSensitiveData(relatedData), - }); - } - return { ...item, related: null }; - }); - }, - - removeBranch( - items: NestedStructure[] = [], - operations: NavigationActions = {} - ) { - const commonService = getPluginService('common'); - const { itemModel } = getPluginModels(); - return Promise.all( - items - .filter(item => item.id) - .map(async (item) => { - operations.remove = true; - const { id, related, master } = item; - await Promise.all([ - strapi - .query(itemModel.uid) - .delete({ where: { id } }), - this.removeRelated(related, master), - ]); - return !isEmpty(item.items) - ? commonService.removeBranch( - item.items, - operations, - ) - : operations; - }), - ); - }, - - removeRelated( - relatedItems: RelatedRef[], - master: number, - ): ToBeFixed { - return Promise.all((relatedItems || []).map(relatedItem => { - const model = strapi.query('plugin::navigation.navigations-items-related'); - const entityToRemove = { - master, - field: relatedItem.field, - related_id: relatedItem.refId, - related_type: relatedItem.ref, - }; - return model.delete({ where: entityToRemove }); - })); - }, - - setDefaultConfig(): Promise { - return configSetupStrategy({ strapi }); - }, - - async updateBranch( - toUpdate: NestedStructure[], - masterEntity: Navigation | null, - parentItem: NavigationItemEntity | null, - operations: NavigationActions - ) { - const commonService = getPluginService('common'); - const { itemModel } = getPluginModels(); - const databaseModel = strapi.query(itemModel.uid); - return Promise.all( - toUpdate.map(async (item) => { - operations.update = true; - const { id, updated, parent, master, related, items, ...params } = item; - let currentItem; - if (updated) { - const relatedItems = await this.getIdsRelated(related, master); - currentItem = await databaseModel - .update({ - where: { id }, - data: { - ...params, - related: relatedItems, - master: masterEntity, - parent: parentItem ? { ...parentItem, _id: parentItem.id } : null, - }, - }); - } else { - currentItem = item; - } - return !isEmpty(items) - ? await commonService.analyzeBranch( - items, - masterEntity, - currentItem, - operations, - ) - : operations; - }), - ); - }, - - async emitEvent(uid, event, entity) { - // TODO: This could be enhanced by reacting not only with webhook but by firing all listeners in Navigation Event Hub - // Any developer could register new listener for any event in Navigation Plugin - // For now there is only one event 'navigation.update' so implementing Event hub is not valid. - const model: ToBeFixed = strapi.getModel(uid); - const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput(model, entity); - - strapi.webhookRunner.eventHub.emit(event, { - model: model.modelName, - entry: sanitizedEntity, - }); - }, - - async pruneCustomFields(removedFields: NavigationItemCustomField[]) { - const { itemModel } = getPluginModels(); - const databaseModel = strapi.query(itemModel.uid); - const removedFieldsNames = removedFields.map(({ name }) => name); - const navigationItems = await databaseModel.findMany({ - where: { - additionalFields: { - $contains: [removedFieldsNames] - } - } - }); - const navigationItemsToUpdate = removedFields.reduce((acc, curr) => { - return acc.map((item) => omit(item, [`additionalFields.${curr.name}`]) as NavigationItemEntity); - }, navigationItems); - - for (const item of navigationItemsToUpdate) { - await databaseModel.update({ - where: { id: item.id }, - data: { additionalFields: item.additionalFields }, - }) - } - }, - - async getSlug(query) { - let slug = slugify(query); - - if (slug) { - const { itemModel } = getPluginModels(); - const existingItems = await strapi - .query(itemModel.uid) - .count({ - where: { - $or: [ - { - uiRouterKey: { - $startsWith: slug - } - }, - { uiRouterKey: slug } - ] - }, - limit: Number.MAX_SAFE_INTEGER, - }); - - if (existingItems) { - slug = `${slug}-${existingItems}` - } - } - - return slug.toLowerCase(); - }, - registerLifecycleHook({ callback, contentTypeName, hookName }) { - if (!lifecycleHookListeners[contentTypeName][hookName]) { - lifecycleHookListeners[contentTypeName][hookName] = []; - } - - lifecycleHookListeners[contentTypeName][hookName]?.push(callback); - }, - async runLifecycleHook({ contentTypeName, event, hookName }) { - const hookListeners = lifecycleHookListeners[contentTypeName][hookName] ?? []; - - for (const listener of hookListeners) { - await listener(event); - } - }, -}); - -export default commonService; diff --git a/server/services/index.ts b/server/services/index.ts deleted file mode 100644 index 7a89474e..00000000 --- a/server/services/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -import common from './common'; -import admin from './admin'; -import client from './client'; - -const navigationService = { - common, - admin, - client, -}; - -export default navigationService; \ No newline at end of file diff --git a/server/src/app-errors.ts b/server/src/app-errors.ts new file mode 100644 index 00000000..3e7a2817 --- /dev/null +++ b/server/src/app-errors.ts @@ -0,0 +1,17 @@ +export class NavigationError extends Error { + public type = 'NavigationError'; + + constructor( + message: string, + public additionalInfo?: T + ) { + super(message); + } +} +export class FillNavigationError extends NavigationError { + public type = 'FillNavigationError'; +} + +export class InvalidParamNavigationError extends NavigationError { + public type = 'InvalidParamNavigationError'; +} diff --git a/server/src/bootstrap.ts b/server/src/bootstrap.ts new file mode 100644 index 00000000..07c3d804 --- /dev/null +++ b/server/src/bootstrap.ts @@ -0,0 +1,14 @@ +import type { Core } from '@strapi/strapi'; + +import { configSetup } from './config'; +import { navigationSetup } from './i18n'; +import { setupPermissions } from './permissions'; +import { graphQLSetup } from './graphql'; + +const bootstrap = async (context: { strapi: Core.Strapi }) => { + await configSetup(context); + await navigationSetup(context); + await setupPermissions(context); + await graphQLSetup(context); +}; +export default bootstrap; diff --git a/server/src/cache/index.ts b/server/src/cache/index.ts new file mode 100644 index 00000000..76f61015 --- /dev/null +++ b/server/src/cache/index.ts @@ -0,0 +1,42 @@ +import Router from '@koa/router'; +import { Core } from '@strapi/strapi'; +import clientRoutes, { NavigationServerRoute } from '../routes/client'; +import { getCacheStatus } from '../services/admin/utils'; + +export const setupCacheStrategy = async ({ strapi }: { strapi: Core.Strapi }) => { + const { enabled, hasCachePlugin } = await getCacheStatus({ strapi }); + + if (hasCachePlugin && enabled) { + const cachePlugin: any = strapi.plugin('rest-cache'); + const createCacheMiddleware = cachePlugin?.middleware('recv'); + + if (!createCacheMiddleware) { + console.warn('Cache middleware not present in cache plugin. Stopping'); + console.warn('Notify strapi-navigation-plugin-team'); + return; + } + + const pluginOption: any = strapi.config.get('plugin::rest-cache'); + const router = new Router(); + + const buildPathFrom = (route: NavigationServerRoute) => + `/api/${route.info?.pluginName ?? 'navigation'}${route.path}`; + const buildFrom = (route: NavigationServerRoute) => ({ + maxAge: pluginOption.strategy?.maxAge ?? 6 * 60 * 1000, + path: buildPathFrom(route), + method: 'GET', + paramNames: ['idOrSlug', 'childUIKey'], + keys: { useHeaders: [], useQueryParams: true }, + hitpass: false, + }); + + clientRoutes.routes.forEach((route) => { + router.get( + buildPathFrom(route), + createCacheMiddleware({ cacheRouteConfig: buildFrom(route) }, { strapi }) + ); + }); + + (strapi as any).server.router.use(router.routes()); + } +}; diff --git a/server/config/index.ts b/server/src/config/index.ts similarity index 68% rename from server/config/index.ts rename to server/src/config/index.ts index 3757dc2a..e0e10ab8 100644 --- a/server/config/index.ts +++ b/server/src/config/index.ts @@ -1,8 +1,6 @@ -import { NavigationPluginConfig, StrapiConfig } from "../../types"; +export * from './setup'; -export * from "./setupStrategy"; - -const config: StrapiConfig = { +export default { default: { additionalFields: [], allowedLevels: 2, @@ -16,9 +14,7 @@ const config: StrapiConfig = { pathDefaultFields: {}, pruneObsoleteI18nNavigations: false, cascadeMenuAttached: true, - isCacheEnabled: false, preferCustomContentTypes: false, + isCacheEnabled: false, }, }; - -export default config; diff --git a/server/src/config/setup.ts b/server/src/config/setup.ts new file mode 100644 index 00000000..c6624ccc --- /dev/null +++ b/server/src/config/setup.ts @@ -0,0 +1,101 @@ +import { Core } from '@strapi/strapi'; + +import configBase from '.'; +import { + NavigationItemAdditionalField, + NavigationPluginConfigDBSchema, + PluginConfigKeys, + configSchema, +} from '../schemas'; +import { + PluginConfigGraphQL, + PluginConfigNameFields, + PluginConfigPathDefaultFields, + PluginConfigPopulate, +} from '../types'; +import { assertNotEmpty, resolveGlobalLikeId, validateAdditionalFields } from '../utils'; + +type PluginDefaultConfigGetter = ( + key: PluginConfigKeys +) => NavigationPluginConfigDBSchema[PluginConfigKeys]; + +export const configSetup = async ({ strapi }: { strapi: Core.Strapi }) => { + const pluginStore = strapi.store({ + type: 'plugin', + name: 'navigation', + }); + const getFromPluginDefaults: PluginDefaultConfigGetter = await strapi.plugin('navigation').config; + const configRaw = { + ...configBase.default, + ...((await pluginStore.get({ + key: 'config', + })) ?? configBase.default), + }; + + let config = configSchema.parse(configRaw); + + const getWithFallback = getWithFallbackFactory(config, getFromPluginDefaults); + + config = { + additionalFields: getWithFallback('additionalFields'), + contentTypes: getWithFallback('contentTypes'), + contentTypesNameFields: getWithFallback('contentTypesNameFields'), + contentTypesPopulate: getWithFallback('contentTypesPopulate'), + allowedLevels: getWithFallback('allowedLevels'), + gql: getWithFallback('gql'), + pathDefaultFields: getWithFallback('pathDefaultFields'), + cascadeMenuAttached: getWithFallback('cascadeMenuAttached'), + preferCustomContentTypes: getWithFallback('preferCustomContentTypes'), + isCacheEnabled: getWithFallback('isCacheEnabled'), + }; + + handleDeletedContentTypes(config, { strapi }); + + validateAdditionalFields(config.additionalFields); + + await pluginStore.set({ + key: 'config', + value: config, + }); + + return config; +}; + +const getWithFallbackFactory = + (config: NavigationPluginConfigDBSchema, fallback: PluginDefaultConfigGetter) => + >(key: PluginConfigKeys) => { + const value = config?.[key] ?? fallback(key); + + assertNotEmpty(value, new Error(`[Navigation] Config "${key}" is undefined`)); + + return value as T; + }; + +const handleDeletedContentTypes = ( + config: NavigationPluginConfigDBSchema, + { strapi }: { strapi: Core.Strapi } +): void => { + const notAvailableContentTypes = config.contentTypes.filter( + (contentType) => !strapi.contentTypes[contentType as any] + ); + + if (notAvailableContentTypes.length === 0) { + return; + } + + const notAvailableContentTypesGraphQL = notAvailableContentTypes.map(resolveGlobalLikeId); + + config.contentTypes = config.contentTypes.filter( + (contentType) => !notAvailableContentTypes.includes(contentType) + ); + + config.contentTypesNameFields = Object.fromEntries( + Object.entries(config.contentTypesNameFields).filter( + ([contentType]) => !notAvailableContentTypes.includes(contentType) + ) + ); + + config.gql.navigationItemRelated = config.gql.navigationItemRelated.filter( + (contentType) => !notAvailableContentTypesGraphQL.includes(contentType) + ); +}; diff --git a/server/content-types/audience/index.ts b/server/src/content-types/audience/index.ts similarity index 100% rename from server/content-types/audience/index.ts rename to server/src/content-types/audience/index.ts diff --git a/server/content-types/audience/schema.ts b/server/src/content-types/audience/schema.ts similarity index 100% rename from server/content-types/audience/schema.ts rename to server/src/content-types/audience/schema.ts diff --git a/server/src/content-types/index.ts b/server/src/content-types/index.ts new file mode 100644 index 00000000..df2a1236 --- /dev/null +++ b/server/src/content-types/index.ts @@ -0,0 +1,11 @@ +'use strict'; + +import audience from './audience'; +import navigation from './navigation'; +import navigationItem from './navigation-item'; + +export default { + audience, + navigation, + 'navigation-item': navigationItem, +}; diff --git a/server/content-types/navigation-item/index.ts b/server/src/content-types/navigation-item/index.ts similarity index 100% rename from server/content-types/navigation-item/index.ts rename to server/src/content-types/navigation-item/index.ts diff --git a/server/src/content-types/navigation-item/lifecycles.ts b/server/src/content-types/navigation-item/lifecycles.ts new file mode 100644 index 00000000..64114aba --- /dev/null +++ b/server/src/content-types/navigation-item/lifecycles.ts @@ -0,0 +1,5 @@ +import { buildAllHookListeners } from '../../utils'; + +export default buildAllHookListeners('navigation-item', { + strapi, +}); diff --git a/server/src/content-types/navigation-item/schema.ts b/server/src/content-types/navigation-item/schema.ts new file mode 100644 index 00000000..81834295 --- /dev/null +++ b/server/src/content-types/navigation-item/schema.ts @@ -0,0 +1,106 @@ +export default { + collectionName: 'navigations_items', + info: { + singularName: 'navigation-item', + pluralName: 'navigation-items', + displayName: 'Navigation Item', + name: 'navigation-item', + }, + options: { + increments: true, + timestamps: true, + comment: 'Navigation Item', + }, + pluginOptions: { + 'content-manager': { + visible: false, + }, + 'content-type-builder': { + visible: false, + }, + i18n: { + localized: false, + }, + }, + attributes: { + title: { + type: 'text', + configurable: false, + required: true, + pluginOptions: { + i18n: { + localized: false, + }, + }, + }, + type: { + type: 'enumeration', + enum: ['INTERNAL', 'EXTERNAL', 'WRAPPER'], + default: 'INTERNAL', + configurable: false, + }, + path: { + type: 'text', + targetField: 'title', + configurable: false, + }, + externalPath: { + type: 'text', + configurable: false, + }, + uiRouterKey: { + type: 'string', + configurable: false, + }, + menuAttached: { + type: 'boolean', + default: false, + configurable: false, + }, + order: { + type: 'integer', + default: 0, + configurable: false, + }, + collapsed: { + type: 'boolean', + default: false, + configurable: false, + }, + autoSync: { + type: 'boolean', + default: true, + configurable: false, + }, + related: { + type: 'relation', + relation: 'morphToMany', + required: true, + configurable: false, + }, + parent: { + type: 'relation', + relation: 'oneToOne', + target: 'plugin::navigation.navigation-item', + configurable: false, + default: null, + }, + master: { + type: 'relation', + relation: 'manyToOne', + target: 'plugin::navigation.navigation', + configurable: false, + inversedBy: 'items', + }, + audience: { + type: 'relation', + relation: 'oneToMany', + target: 'plugin::navigation.audience', + }, + additionalFields: { + type: 'json', + require: false, + default: {}, + }, + }, +}; diff --git a/server/content-types/navigation/index.ts b/server/src/content-types/navigation/index.ts similarity index 100% rename from server/content-types/navigation/index.ts rename to server/src/content-types/navigation/index.ts diff --git a/server/src/content-types/navigation/lifecycles.ts b/server/src/content-types/navigation/lifecycles.ts new file mode 100644 index 00000000..e1780209 --- /dev/null +++ b/server/src/content-types/navigation/lifecycles.ts @@ -0,0 +1,5 @@ +import { buildAllHookListeners } from '../../utils'; + +export default buildAllHookListeners('navigation', { + strapi, +}); diff --git a/server/src/content-types/navigation/schema.ts b/server/src/content-types/navigation/schema.ts new file mode 100644 index 00000000..64e3785a --- /dev/null +++ b/server/src/content-types/navigation/schema.ts @@ -0,0 +1,48 @@ +export default { + collectionName: 'navigations', + info: { + singularName: 'navigation', + pluralName: 'navigations', + displayName: 'Navigation', + name: 'navigation', + }, + options: { + comment: '', + }, + pluginOptions: { + 'content-manager': { + visible: false, + }, + 'content-type-builder': { + visible: false, + }, + i18n: { + localized: true, + }, + }, + attributes: { + name: { + type: 'text', + configurable: false, + required: true, + }, + slug: { + type: 'uid', + target: 'name', + configurable: false, + required: true, + }, + visible: { + type: 'boolean', + default: false, + configurable: false, + }, + items: { + type: 'relation', + relation: 'oneToMany', + target: 'plugin::navigation.navigation-item', + configurable: false, + mappedBy: 'master', + }, + }, +}; diff --git a/server/src/controllers/admin.ts b/server/src/controllers/admin.ts new file mode 100644 index 00000000..10ecec72 --- /dev/null +++ b/server/src/controllers/admin.ts @@ -0,0 +1,154 @@ +import { Core } from '@strapi/strapi'; +import { Context as KoaContext } from 'koa'; +import * as z from 'zod'; +import { configSchema, createNavigationSchema, updateNavigationSchema } from '../schemas'; +import { getPluginService } from '../utils'; +import { fillFromOtherLocaleParams, idSchema } from './validators'; + +export type KoaContextExtension = { + request: KoaContext['request'] & { + body: unknown; + }; +}; + +export default function adminController(context: { strapi: Core.Strapi }) { + return { + getAdminService() { + return getPluginService(context, 'admin'); + }, + + getCommonService() { + return getPluginService(context, 'common'); + }, + + async get() { + return await this.getAdminService().get({}); + }, + + post(ctx: KoaContext & KoaContextExtension) { + const { auditLog } = ctx; + + return this.getAdminService().post({ + payload: createNavigationSchema.parse(ctx.request.body), + auditLog, + }); + }, + + put(ctx: KoaContext & KoaContextExtension) { + const { + params: { documentId }, + auditLog, + } = ctx; + const body = z.record(z.string(), z.unknown()).parse(ctx.request.body); + + return this.getAdminService().put({ + auditLog, + payload: updateNavigationSchema.parse({ + ...body, + documentId, + }), + }); + }, + + async delete(ctx: KoaContext) { + const { + auditLog, + params: { documentId }, + } = ctx; + + await this.getAdminService().delete({ + documentId: idSchema.parse(documentId), + auditLog, + }); + + return {}; + }, + + config() { + return this.getAdminService().config({ viaSettingsPage: false }); + }, + + async updateConfig(ctx: KoaContext & KoaContextExtension) { + await this.getAdminService().updateConfig({ + config: configSchema.parse(ctx.request.body), + }); + + return {}; + }, + + async restoreConfig() { + await this.getAdminService().restoreConfig(); + + return {}; + }, + + settingsConfig() { + return this.getAdminService().config({ viaSettingsPage: true }); + }, + + async settingsRestart() { + await this.getAdminService().restart(); + + return {}; + }, + + getById(ctx: KoaContext) { + const { + params: { documentId }, + } = ctx; + + return this.getAdminService().getById({ documentId: idSchema.parse(documentId) }); + }, + + getContentTypeItems(ctx: KoaContext) { + const { + params: { model }, + query = {}, + } = ctx; + + return this.getAdminService().getContentTypeItems({ + query: z.record(z.string(), z.unknown()).parse(query), + uid: z.string().parse(model), + }); + }, + + async fillFromOtherLocale(ctx: KoaContext) { + const { params, auditLog } = ctx; + const { source, target, documentId } = fillFromOtherLocaleParams.parse(params); + + return await this.getAdminService().fillFromOtherLocale({ + source, + target, + documentId, + auditLog, + }); + }, + + readNavigationItemFromLocale(ctx: KoaContext) { + const { + params: { source, target }, + query: { path }, + } = ctx; + + return this.getAdminService().readNavigationItemFromLocale({ + path: z.string().parse(path), + source: idSchema.parse(source), + target: idSchema.parse(target), + }); + }, + + getSlug(ctx: KoaContext) { + const { + query: { q }, + } = ctx; + + return this.getCommonService() + .getSlug({ query: z.string().parse(q) }) + .then((slug) => ({ slug })); + }, + + settingsLocale() { + return this.getCommonService().readLocale(); + }, + }; +} diff --git a/server/src/controllers/client.ts b/server/src/controllers/client.ts new file mode 100644 index 00000000..20469b4b --- /dev/null +++ b/server/src/controllers/client.ts @@ -0,0 +1,85 @@ +import { Core } from '@strapi/strapi'; +import { Context as KoaContext } from 'koa'; +import * as z from 'zod'; +import { getPluginService } from '../utils'; +import { sanitizePopulateField } from './utils'; +import { + populateSchema, + readAllQuerySchema, + renderChildQueryParams, + renderQuerySchema, +} from './validators'; + +export default function clientController(context: { strapi: Core.Strapi }) { + return { + getService() { + return getPluginService(context, 'client'); + }, + + async readAll(ctx: KoaContext) { + try { + const { query = {} } = ctx; + const { locale, orderBy, orderDirection } = readAllQuerySchema.parse(query); + + return await this.getService().readAll({ + locale, + orderBy, + orderDirection, + }); + } catch (error: unknown) { + if (error instanceof Error) { + return ctx.badRequest(error.message); + } + + throw error; + } + }, + + async render(ctx: KoaContext) { + const { params, query = {} } = ctx; + const { + type, + menu: menuOnly, + path: rootPath, + locale, + populate, + } = renderQuerySchema.parse(query); + const idOrSlug = z.string().parse(params.idOrSlug); + + return await this.getService().render({ + idOrSlug, + type, + menuOnly: menuOnly === 'true', + rootPath, + locale, + populate: sanitizePopulateField( + populateSchema.parse( + populate === 'true' + ? true + : populate === 'false' + ? false + : Array.isArray(populate) + ? populate.map((x) => (x === 'true' ? true : x === 'false' ? false : populate)) + : populate + ) + ), + }); + }, + + async renderChild(ctx: KoaContext) { + const { params, query = {} } = ctx; + const { type, menu: menuOnly, locale } = renderChildQueryParams.parse(query); + + const idOrSlug = z.string().parse(params.documentId); + const childUIKey = z.string().parse(params.childUIKey); + + return await this.getService().renderChildren({ + idOrSlug, + childUIKey, + type, + menuOnly: menuOnly === 'true', + locale, + }); + }, + }; +} diff --git a/server/src/controllers/index.ts b/server/src/controllers/index.ts new file mode 100644 index 00000000..3f196e25 --- /dev/null +++ b/server/src/controllers/index.ts @@ -0,0 +1,7 @@ +import adminController from './admin'; +import clientController from './client'; + +export default { + admin: adminController, + client: clientController, +}; diff --git a/server/src/controllers/utils.ts b/server/src/controllers/utils.ts new file mode 100644 index 00000000..6a9233dc --- /dev/null +++ b/server/src/controllers/utils.ts @@ -0,0 +1,24 @@ +import { z } from "zod"; +import { idSchema } from "./validators"; + +type Populate = string | boolean | string[] | undefined; + +export const sanitizePopulateField = (populate: Populate): Populate => { + if (!populate || populate === true || populate === '*') { + return undefined; + } + + if ('object' === typeof populate) { + return undefined; + } + + if (Array.isArray(populate)) { + return populate; + } + + return populate; +}; + +export const parseId = (id: string) => { + return Number.isNaN(parseInt(id)) ? z.string().parse(id) : idSchema.parse(parseInt(id)); +}; diff --git a/server/src/controllers/validators.ts b/server/src/controllers/validators.ts new file mode 100644 index 00000000..d261bfd8 --- /dev/null +++ b/server/src/controllers/validators.ts @@ -0,0 +1,35 @@ +import * as z from 'zod'; + +const booleanStringSchema = z.enum(['true', 'false']); + +export const idSchema = z.string(); + +export const readAllQuerySchema = z.object({ + locale: z.string().optional(), + orderBy: z.string().optional(), + orderDirection: z.enum(['DESC', 'ASC']).optional(), +}); + +export const renderTypeSchema = z.enum(['FLAT', 'TREE', 'RFR']); + +export const populateSchema = z.union([z.boolean(), z.string(), z.string().array(), z.undefined()]); + +export const renderQuerySchema = z.object({ + type: renderTypeSchema.optional(), + menu: booleanStringSchema.optional(), + path: z.string().optional(), + locale: z.string().optional(), + populate: populateSchema.optional(), +}); + +export const renderChildQueryParams = z.object({ + type: renderTypeSchema.optional(), + menu: booleanStringSchema.optional(), + locale: z.string().optional(), +}); + +export const fillFromOtherLocaleParams = z.object({ + source: z.string().min(1), + target: z.string().min(1), + documentId: z.string().min(1), +}); diff --git a/server/src/destroy.ts b/server/src/destroy.ts new file mode 100644 index 00000000..d33d272b --- /dev/null +++ b/server/src/destroy.ts @@ -0,0 +1,7 @@ +import type { Core } from '@strapi/strapi'; + +const destroy = ({ strapi }: { strapi: Core.Strapi }) => { + // destroy phase +}; + +export default destroy; diff --git a/server/src/dtos/config.ts b/server/src/dtos/config.ts new file mode 100644 index 00000000..660ab95a --- /dev/null +++ b/server/src/dtos/config.ts @@ -0,0 +1,40 @@ +import { NavigationPluginConfigDBSchema } from '../schemas'; +import { CONTENT_TYPES_NAME_FIELDS_DEFAULTS } from '../utils'; + +export type ConfigContentTypeDTO = { + uid: string; + name: string; + draftAndPublish: boolean | undefined; + isSingle: boolean; + description: string; + collectionName: string; + contentTypeName: string; + label: string; + relatedField: string | undefined; + templateName: string | undefined; + available: boolean | undefined; + labelSingular: string; + endpoint: string; + plugin: string | undefined; + visible: boolean; +}; + +export type NavigationPluginConfigDTO = Pick< + NavigationPluginConfigDBSchema, + | 'additionalFields' + | 'allowedLevels' + | 'cascadeMenuAttached' + | 'preferCustomContentTypes' + | 'contentTypesNameFields' + | 'contentTypesPopulate' + | 'gql' + | 'pathDefaultFields' +> & { + contentTypes: ConfigContentTypeDTO[]; + contentTypesNameFields: { + default: typeof CONTENT_TYPES_NAME_FIELDS_DEFAULTS; + } & Record; + isGQLPluginEnabled: boolean | undefined; + isCachePluginEnabled: boolean | undefined; + isCacheEnabled: boolean | undefined; +}; diff --git a/server/src/dtos/index.ts b/server/src/dtos/index.ts new file mode 100644 index 00000000..de70244e --- /dev/null +++ b/server/src/dtos/index.ts @@ -0,0 +1,4 @@ +export * from './config'; +export * from './navigation-item'; +export * from './navigation'; + diff --git a/server/src/dtos/navigation-item.ts b/server/src/dtos/navigation-item.ts new file mode 100644 index 00000000..213ff913 --- /dev/null +++ b/server/src/dtos/navigation-item.ts @@ -0,0 +1,61 @@ +import { NavigationItemDBSchema, NavigationItemType } from '../schemas'; +import { NavigationDTO } from './navigation'; + +export type NavigationItemDTO = Omit< + NavigationItemDBSchema, + 'related' | 'items' | 'master' | 'parent' +> & { + related?: { __type: string; documentId: string } | null; + items?: NavigationItemDTO[]; + master?: NavigationDTO; + parent?: NavigationItemDTO | null; + order?: number; +}; + +export type CreateBranchNavigationItemDTO = Omit & { + id?: number; + documentId?: string; + items?: CreateBranchNavigationItemDTO[]; + removed?: boolean; + updated?: boolean; +}; + +export type RFRNavigationItemDTO = + | { + label: string; + type: NavigationItemType; + audience?: string[]; + } + | { + label: string; + type: NavigationItemType; + audience?: string[]; + url: string; + } + | { + label: string; + type: NavigationItemType; + audience?: string[]; + page: string; + }; + +export type RFRPageDTO = Pick< + NavigationItemDTO, + 'title' | 'path' | 'audience' | 'menuAttached' +> & { + id: NavigationItemDTO['uiRouterKey']; + documentId: string; + templateName?: string; + related?: { + contentType: string; + documentId?: string; + }; + parent?: string; +} & Record; + +export type RFRRenderDTO = { + nav: { + root: RFRNavigationItemDTO[]; + } & Record; + pages: Record; +}; diff --git a/server/src/dtos/navigation.ts b/server/src/dtos/navigation.ts new file mode 100644 index 00000000..52cceb3f --- /dev/null +++ b/server/src/dtos/navigation.ts @@ -0,0 +1,6 @@ +import { NavigationDBSchema } from '../schemas'; +import { NavigationItemDTO } from './navigation-item'; + +export type NavigationDTO = Omit & { + items?: NavigationItemDTO[]; +}; diff --git a/server/src/graphql/config.ts b/server/src/graphql/config.ts new file mode 100644 index 00000000..db08cc9c --- /dev/null +++ b/server/src/graphql/config.ts @@ -0,0 +1,32 @@ +import { Core } from '@strapi/strapi'; + + +import { configSchema } from '../schemas'; +import { getPluginService } from '../utils'; +import { getTypes } from './types'; +import { getQueries } from './queries'; +import { getResolversConfig } from './resolvers-config'; + +export default async ({ strapi }: { strapi: Core.Strapi }) => { + const extensionService = strapi.plugin('graphql').service('extension'); + + extensionService.shadowCRUD('plugin::navigation.audience').disable(); + extensionService.shadowCRUD('plugin::navigation.navigation').disable(); + extensionService.shadowCRUD('plugin::navigation.navigation-item').disable(); + extensionService.shadowCRUD('plugin::navigation.navigations-items-related').disable(); + + const commonService = getPluginService({ strapi }, 'common'); + const pluginStore = await commonService.getPluginStore(); + const config = configSchema.parse(await pluginStore.get({ key: 'config' })); + + extensionService.use(({ strapi, nexus }: any) => { + const types = getTypes({ strapi, nexus, config }); + const queries = getQueries({ strapi, nexus }); + const resolversConfig = getResolversConfig(); + + return { + types: [types, queries], + resolversConfig, + }; + }); +}; diff --git a/server/src/graphql/index.ts b/server/src/graphql/index.ts new file mode 100644 index 00000000..dcdc3e6c --- /dev/null +++ b/server/src/graphql/index.ts @@ -0,0 +1 @@ +export * from "./setup"; diff --git a/server/src/graphql/queries/index.ts b/server/src/graphql/queries/index.ts new file mode 100644 index 00000000..b3a9b747 --- /dev/null +++ b/server/src/graphql/queries/index.ts @@ -0,0 +1,20 @@ +import { renderNavigation } from './render-navigation'; +import { renderNavigationChild } from './render-navigation-child'; + +export const getQueries = (context: any) => { + const queries = { + renderNavigationChild, + renderNavigation, + }; + + return context.nexus.extendType({ + type: 'Query', + definition(t: any) { + for (const [name, configFactory] of Object.entries(queries)) { + const config = configFactory(context); + + t.field(name, config); + } + }, + }); +}; diff --git a/server/src/graphql/queries/render-navigation-child.ts b/server/src/graphql/queries/render-navigation-child.ts new file mode 100644 index 00000000..9a1e9086 --- /dev/null +++ b/server/src/graphql/queries/render-navigation-child.ts @@ -0,0 +1,30 @@ +import { z } from 'zod'; + +import { getPluginService } from '../../utils'; + +export const renderNavigationChild = ({ strapi, nexus }: any) => { + const { nonNull, list, stringArg, booleanArg } = nexus; + return { + type: nonNull(list('NavigationItem')), + + args: { + documentId: nonNull(stringArg()), + childUiKey: nonNull(stringArg()), + type: 'NavigationRenderType', + menuOnly: booleanArg(), + }, + + resolve(_: any, args: any) { + const { documentId, childUIKey, type, menuOnly } = args; + const idOrSlug = z.string().parse(documentId); + + return getPluginService({ strapi }, 'client').renderChildren({ + idOrSlug, + childUIKey, + type, + menuOnly, + wrapRelated: true, + }); + }, + }; +}; diff --git a/server/src/graphql/queries/render-navigation.ts b/server/src/graphql/queries/render-navigation.ts new file mode 100644 index 00000000..95b60d5e --- /dev/null +++ b/server/src/graphql/queries/render-navigation.ts @@ -0,0 +1,35 @@ +import { z } from 'zod'; + +import { getPluginService } from '../../utils'; + +const LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode'; + +export const renderNavigation = ({ strapi, nexus }: any) => { + const { nonNull, list, stringArg, booleanArg } = nexus; + const defaultArgs = { + navigationIdOrSlug: nonNull(stringArg()), + type: 'NavigationRenderType', + menuOnly: booleanArg(), + path: stringArg(), + locale: nexus.arg({ type: LOCALE_SCALAR_TYPENAME }), + }; + const args = defaultArgs; + + return { + args, + type: nonNull(list('NavigationItem')), + resolve(_: unknown, { navigationIdOrSlug, type, menuOnly, path: rootPath, locale }: any) { + const idOrSlug =z.string().parse(navigationIdOrSlug); + + return getPluginService({ strapi }, 'client') + .render({ + idOrSlug, + type, + rootPath, + locale, + menuOnly, + wrapRelated: true, + }); + }, + }; +}; diff --git a/server/src/graphql/resolvers-config.ts b/server/src/graphql/resolvers-config.ts new file mode 100644 index 00000000..6673c70e --- /dev/null +++ b/server/src/graphql/resolvers-config.ts @@ -0,0 +1,4 @@ +export const getResolversConfig = () => ({ + 'Query.renderNavigationChild': { auth: false }, + 'Query.renderNavigation': { auth: false }, +}); diff --git a/server/src/graphql/setup.ts b/server/src/graphql/setup.ts new file mode 100644 index 00000000..a913f26b --- /dev/null +++ b/server/src/graphql/setup.ts @@ -0,0 +1,11 @@ +import { Core } from '@strapi/strapi'; + +import handleConfig from './config'; + +export const graphQLSetup = async ({ strapi }: { strapi: Core.Strapi }) => { + const hasGraphQLPlugin = !!strapi.plugin('graphql'); + + if (hasGraphQLPlugin) { + await handleConfig({ strapi }); + } +}; diff --git a/server/src/graphql/types/content-types-name-fields.ts b/server/src/graphql/types/content-types-name-fields.ts new file mode 100644 index 00000000..4c13aa3d --- /dev/null +++ b/server/src/graphql/types/content-types-name-fields.ts @@ -0,0 +1,17 @@ +import { configSchema } from '../../schemas'; +import { getPluginService } from '../../utils'; + +export default ({ nexus, strapi }: any) => + nexus.objectType({ + name: 'ContentTypesNameFields', + async definition(t: any) { + t.nonNull.list.nonNull.string('default'); + + const commonService = getPluginService({ strapi }, 'common'); + const pluginStore = await commonService.getPluginStore(); + const config = configSchema.parse(await pluginStore.get({ key: 'config' })); + const contentTypesNameFields = config.contentTypesNameFields; + + Object.keys(contentTypesNameFields || {}).forEach((key) => t.nonNull.list.string(key)); + }, + }); diff --git a/server/src/graphql/types/content-types.ts b/server/src/graphql/types/content-types.ts new file mode 100644 index 00000000..1a320ad3 --- /dev/null +++ b/server/src/graphql/types/content-types.ts @@ -0,0 +1,17 @@ +export default ({ nexus }: any) => + nexus.objectType({ + name: 'ContentTypes', + definition(t: any) { + t.nonNull.string('uid'); + t.nonNull.string('name'); + t.nonNull.boolean('isSingle'); + t.nonNull.string('collectionName'); + t.nonNull.string('contentTypeName'); + t.nonNull.string('label'); + t.nonNull.string('relatedField'); + t.nonNull.string('labelSingular'); + t.nonNull.string('endpoint'); + t.nonNull.boolean('available'); + t.nonNull.boolean('visible'); + }, + }); diff --git a/server/src/graphql/types/create-navigation-item.ts b/server/src/graphql/types/create-navigation-item.ts new file mode 100644 index 00000000..a8c62135 --- /dev/null +++ b/server/src/graphql/types/create-navigation-item.ts @@ -0,0 +1,18 @@ +export default ({ nexus }: any) => + nexus.inputObjectType({ + name: 'CreateNavigationItem', + definition(t: any) { + t.nonNull.string('title'); + t.nonNull.string('type'); + t.string('path'); + t.string('externalPath'); + t.nonNull.string('uiRouterKey'); + t.nonNull.boolean('menuAttached'); + t.nonNull.int('order'); + t.string('parent'); + t.string('master'); + t.list.field('items', { type: 'CreateNavigationItem' }); + t.list.string('audience'); + t.field('related', { type: 'CreateNavigationRelated' }); + }, + }); diff --git a/server/src/graphql/types/create-navigation-related.ts b/server/src/graphql/types/create-navigation-related.ts new file mode 100644 index 00000000..1e4e8d7a --- /dev/null +++ b/server/src/graphql/types/create-navigation-related.ts @@ -0,0 +1,9 @@ +export default ({ nexus }: any) => + nexus.inputObjectType({ + name: 'CreateNavigationRelated', + definition(t: any) { + t.nonNull.string('ref'); + t.nonNull.string('field'); + t.nonNull.string('refId'); + }, + }); diff --git a/server/src/graphql/types/create-navigation.ts b/server/src/graphql/types/create-navigation.ts new file mode 100644 index 00000000..cbf132f3 --- /dev/null +++ b/server/src/graphql/types/create-navigation.ts @@ -0,0 +1,8 @@ +export default ({ nexus }: any) => + nexus.inputObjectType({ + name: 'CreateNavigation', + definition(t: any) { + t.nonNull.string('name'); + t.nonNull.list.field('items', { type: 'CreateNavigationItem' }); + }, + }); diff --git a/server/src/graphql/types/index.ts b/server/src/graphql/types/index.ts new file mode 100644 index 00000000..6bd0ab8b --- /dev/null +++ b/server/src/graphql/types/index.ts @@ -0,0 +1,35 @@ +import contentTypes from './content-types'; +import contentTypesNameFields from './content-types-name-fields'; +import createNavigations from './create-navigation'; +import createNavigationItem from './create-navigation-item'; +import createNavigationRelated from './create-navigation-related'; +import navigation from './navigation'; +import navigationConfig from './navigation-config'; +import navigationDetails from './navigation-details'; +import navigationItem from './navigation-item'; +import navigationItemAdditionalFields from './navigation-item-additional-fields'; +import navigationItemAdditionalFieldMedia from './navigation-item-additional-field-media'; +import navigationItemRelated from './navigation-item-related'; +import navigationItemRelatedData from './navigation-item-related-data'; +import renderType from './navigation-render-type'; + +const typesFactories = [ + navigationItemAdditionalFieldMedia, + navigationItemAdditionalFields, + navigationItemRelated, + navigationItemRelatedData, + navigationItem, + renderType, + navigation, + navigationDetails, + contentTypesNameFields, + contentTypes, + navigationConfig, + createNavigationRelated, + createNavigationItem, + createNavigations, +]; + +export const getTypes = (context: any) => { + return typesFactories.map((factory) => factory(context)); +} diff --git a/server/src/graphql/types/navigation-config.ts b/server/src/graphql/types/navigation-config.ts new file mode 100644 index 00000000..74b00ca5 --- /dev/null +++ b/server/src/graphql/types/navigation-config.ts @@ -0,0 +1,10 @@ +export default ({ nexus }: any) => + nexus.objectType({ + name: 'NavigationConfig', + definition(t: any) { + t.int('allowedLevels'); + t.nonNull.list.string('additionalFields'); + t.field('contentTypesNameFields', { type: 'ContentTypesNameFields' }); + t.list.field('contentTypes', { type: 'ContentTypes' }); + }, + }); diff --git a/server/graphql/types/navigation-details.js b/server/src/graphql/types/navigation-details.ts similarity index 65% rename from server/graphql/types/navigation-details.js rename to server/src/graphql/types/navigation-details.ts index 4ec65549..7049d5e4 100644 --- a/server/graphql/types/navigation-details.js +++ b/server/src/graphql/types/navigation-details.ts @@ -1,7 +1,8 @@ -module.exports = ({ nexus }) => nexus.objectType({ +export default ({ nexus }: any) => nexus.objectType({ name: "NavigationDetails", - definition(t) { + definition(t: any) { t.nonNull.string("id") + t.nonNull.string("documentId") t.nonNull.string("name") t.nonNull.string("slug") t.nonNull.boolean("visible") diff --git a/server/src/graphql/types/navigation-item-additional-field-media.ts b/server/src/graphql/types/navigation-item-additional-field-media.ts new file mode 100644 index 00000000..65006b1d --- /dev/null +++ b/server/src/graphql/types/navigation-item-additional-field-media.ts @@ -0,0 +1,12 @@ +export default ({ nexus }: any) => + nexus.objectType({ + name: 'NavigationItemAdditionalFieldMedia', + definition(t: any) { + t.nonNull.string('name'); + t.nonNull.string('url'); + t.nonNull.string('mime'); + t.nonNull.int('width'); + t.nonNull.int('height'); + t.string('previewUrl'); + }, + }); diff --git a/server/src/graphql/types/navigation-item-additional-fields.ts b/server/src/graphql/types/navigation-item-additional-fields.ts new file mode 100644 index 00000000..6adbe338 --- /dev/null +++ b/server/src/graphql/types/navigation-item-additional-fields.ts @@ -0,0 +1,34 @@ +import { NavigationItemAdditionalField } from '../../schemas'; + +export default ({ nexus, config }: any) => + nexus.objectType({ + name: 'NavigationItemAdditionalFields', + definition(t: any) { + // Additional Fields + config.additionalFields.forEach((field: NavigationItemAdditionalField) => { + if (field !== 'audience') { + if (field.enabled) { + switch (field.type) { + case 'media': + t.field(field.name, { type: 'NavigationItemAdditionalFieldMedia' }); + break; + case 'string': + t.string(field.name); + break; + case 'boolean': + t.boolean(field.name); + break; + case 'select': + if (field.multi) t.list.string(field.name); + else t.string(field.name); + break; + default: + throw new Error( + `Type "${JSON.stringify((field as any).type)}" is unsupported by custom fields` + ); + } + } + } + }); + }, + }); diff --git a/server/src/graphql/types/navigation-item-related-data.ts b/server/src/graphql/types/navigation-item-related-data.ts new file mode 100644 index 00000000..5c855410 --- /dev/null +++ b/server/src/graphql/types/navigation-item-related-data.ts @@ -0,0 +1,9 @@ +export default ({ nexus }: any) => + nexus.objectType({ + name: 'NavigationItemRelatedData', + definition(t: any) { + t.int('id'); + t.nonNull.string('documentId'); + t.field('attributes', { type: 'NavigationItemRelated' }); + }, + }); diff --git a/server/graphql/types/navigation-item-related.js b/server/src/graphql/types/navigation-item-related.ts similarity index 57% rename from server/graphql/types/navigation-item-related.js rename to server/src/graphql/types/navigation-item-related.ts index ebe44954..680e9f5d 100644 --- a/server/graphql/types/navigation-item-related.js +++ b/server/src/graphql/types/navigation-item-related.ts @@ -1,23 +1,24 @@ -module.exports = ({ strapi, nexus, config }) => { +export default ({ strapi, nexus, config }: any) => { const related = config.gql?.navigationItemRelated; const name = "NavigationItemRelated"; if (related?.length) { return nexus.unionType({ name, - definition(t) { + definition(t: any) { t.members(...related) }, - resolveType: (item) => { - return strapi.contentTypes[item.__contentType]?.globalId + resolveType: (item: { uid: string }) => { + return strapi.contentTypes[item.uid]?.globalId } }); } return nexus.objectType({ name, - definition(t) { + definition(t: any) { t.int("id") + t.string("documentId") t.string("title") t.string("name") } diff --git a/server/src/graphql/types/navigation-item.ts b/server/src/graphql/types/navigation-item.ts new file mode 100644 index 00000000..6a9753ee --- /dev/null +++ b/server/src/graphql/types/navigation-item.ts @@ -0,0 +1,38 @@ +import { NavigationItemAdditionalField } from '../../schemas'; + +export default ({ nexus, config }: any) => + nexus.objectType({ + name: 'NavigationItem', + definition(t: any) { + t.nonNull.int('id'); + t.nonNull.string('documentId'); + t.nonNull.string('title'); + t.nonNull.string('type'); + t.string('path'); + t.string('externalPath'); + t.nonNull.string('uiRouterKey'); + t.nonNull.boolean('menuAttached'); + t.nonNull.int('order'); + t.field('parent', { type: 'NavigationItem' }); + t.string('master'); + t.list.field('items', { type: 'NavigationItem' }); + t.field('related', { type: 'NavigationItemRelatedData' }); + + if (config.additionalFields.find((field: NavigationItemAdditionalField) => field === 'audience')) { + t.list.string('audience'); + } + + t.field('additionalFields', { type: 'NavigationItemAdditionalFields' }); + + // SQL + t.string('created_at'); + t.string('updated_at'); + t.string('created_by'); + t.string('updated_by'); + // MONGO + t.string('createdAt'); + t.string('updatedAt'); + t.string('createdBy'); + t.string('updatedBy'); + }, + }); diff --git a/server/src/graphql/types/navigation-render-type.ts b/server/src/graphql/types/navigation-render-type.ts new file mode 100644 index 00000000..40843144 --- /dev/null +++ b/server/src/graphql/types/navigation-render-type.ts @@ -0,0 +1,5 @@ +export default ({ nexus }: any) => + nexus.enumType({ + name: 'NavigationRenderType', + members: ['FLAT', 'TREE'], + }); diff --git a/server/src/graphql/types/navigation.ts b/server/src/graphql/types/navigation.ts new file mode 100644 index 00000000..e8a0def0 --- /dev/null +++ b/server/src/graphql/types/navigation.ts @@ -0,0 +1,11 @@ +export default ({ nexus }: any) => + nexus.objectType({ + name: 'Navigation', + definition(t: any) { + t.nonNull.string('id'); + t.nonNull.string('documentId'); + t.nonNull.string('name'); + t.nonNull.string('slug'); + t.nonNull.boolean('visible'); + }, + }); diff --git a/server/src/i18n/index.ts b/server/src/i18n/index.ts new file mode 100644 index 00000000..48e8ecc1 --- /dev/null +++ b/server/src/i18n/index.ts @@ -0,0 +1,52 @@ +import { Core } from '@strapi/strapi'; +import { getNavigationRepository } from '../repositories'; +import { getPluginService } from '../utils'; + +const DEFAULT_NAVIGATION_NAME = 'Navigation'; +const DEFAULT_NAVIGATION_SLUG = 'navigation'; + +export const navigationSetup = async (context: { strapi: Core.Strapi }) => { + const commonService = getPluginService(context, 'common'); + + const { defaultLocale, restLocale = [] } = await commonService.readLocale(); + + const navigationRepository = getNavigationRepository(context); + + const navigations = await navigationRepository.find({ + limit: Number.MAX_SAFE_INTEGER, + filters: {}, + locale: '*', + }); + + if (navigations.length === 0) { + navigations.push( + await navigationRepository.save({ + name: DEFAULT_NAVIGATION_NAME, + visible: true, + locale: defaultLocale, + slug: DEFAULT_NAVIGATION_SLUG, + }) + ); + } + + const defaultLocaleNavigations = navigations.filter(({ locale }) => locale === defaultLocale); + + for (const defaultLocaleNavigation of defaultLocaleNavigations) { + for (const otherLocale of restLocale) { + const otherLocaleMissing = !navigations.find( + ({ locale, documentId }) => + documentId === defaultLocaleNavigation.documentId && otherLocale === locale + ); + + if (otherLocaleMissing) { + await navigationRepository.save({ + documentId: defaultLocaleNavigation.documentId, + name: defaultLocaleNavigation.name, + locale: otherLocale, + visible: defaultLocaleNavigation.visible, + slug: defaultLocaleNavigation.slug, + }); + } + } + } +}; diff --git a/server/index.ts b/server/src/index.ts similarity index 70% rename from server/index.ts rename to server/src/index.ts index 1f0f5fcb..38205c86 100644 --- a/server/index.ts +++ b/server/src/index.ts @@ -1,21 +1,31 @@ +/** + * Application methods + */ import bootstrap from './bootstrap'; +import destroy from './destroy'; +import register from './register'; + +/** + * Plugin server methods + */ import config from './config'; import contentTypes from './content-types'; import controllers from './controllers'; -import destroy from './destroy'; -import register from './register'; +import middlewares from './middlewares'; +import policies from './policies'; import routes from './routes'; import services from './services'; export default { bootstrap, - config, - contentTypes, - controllers, destroy, - middlewares: {}, - policies: {}, register, + + config, + controllers, + contentTypes, + middlewares, + policies, routes, services, }; diff --git a/server/src/middlewares/index.ts b/server/src/middlewares/index.ts new file mode 100644 index 00000000..ff8b4c56 --- /dev/null +++ b/server/src/middlewares/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/server/src/permissions.ts b/server/src/permissions.ts new file mode 100644 index 00000000..3123ec8f --- /dev/null +++ b/server/src/permissions.ts @@ -0,0 +1,41 @@ +'use strict'; + +import { Core } from '@strapi/strapi'; + +const permissions = { + render: function (uid: string) { + return `plugin::navigation.${uid}`; + }, + navigation: { + read: 'read', + update: 'update', + settings: 'settings', + }, +}; + +export const setupPermissions = async ({ strapi }: { strapi: Core.Strapi }) => { + // Add permissions + const actions = [ + { + section: 'plugins', + displayName: 'Read', + uid: permissions.navigation.read, + pluginName: 'navigation', + }, + { + section: 'plugins', + displayName: 'Update', + uid: permissions.navigation.update, + pluginName: 'navigation', + }, + { + section: 'plugins', + displayName: 'Settings', + uid: permissions.navigation.settings, + pluginName: 'navigation', + }, + ]; + await strapi.admin.services.permission.actionProvider.registerMany(actions); +}; + +export default permissions; diff --git a/server/src/permissions/index.ts b/server/src/permissions/index.ts new file mode 100644 index 00000000..bff057fb --- /dev/null +++ b/server/src/permissions/index.ts @@ -0,0 +1,5 @@ +import permissions from './permissions'; + +export { setupPermissions } from './setup'; + +export default permissions; diff --git a/server/src/permissions/permissions.ts b/server/src/permissions/permissions.ts new file mode 100644 index 00000000..d76275bf --- /dev/null +++ b/server/src/permissions/permissions.ts @@ -0,0 +1,12 @@ +'use strict'; + +export default { + render: function (uid: string) { + return `plugin::navigation.${uid}`; + }, + navigation: { + read: 'read', + update: 'update', + settings: 'settings', + }, +}; \ No newline at end of file diff --git a/server/src/permissions/setup.ts b/server/src/permissions/setup.ts new file mode 100644 index 00000000..fcde9d95 --- /dev/null +++ b/server/src/permissions/setup.ts @@ -0,0 +1,27 @@ +import { Core } from '@strapi/strapi'; +import permissions from './permissions'; + +export const setupPermissions = async ({ strapi }: { strapi: Core.Strapi }) => { + // Add permissions + const actions = [ + { + section: 'plugins', + displayName: 'Read', + uid: permissions.navigation.read, + pluginName: 'navigation', + }, + { + section: 'plugins', + displayName: 'Update', + uid: permissions.navigation.update, + pluginName: 'navigation', + }, + { + section: 'plugins', + displayName: 'Settings', + uid: permissions.navigation.settings, + pluginName: 'navigation', + }, + ]; + await strapi.admin.services.permission.actionProvider.registerMany(actions); +}; diff --git a/server/src/policies/index.ts b/server/src/policies/index.ts new file mode 100644 index 00000000..ff8b4c56 --- /dev/null +++ b/server/src/policies/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/server/src/register.ts b/server/src/register.ts new file mode 100644 index 00000000..5be4c6eb --- /dev/null +++ b/server/src/register.ts @@ -0,0 +1,7 @@ +import type { Core } from '@strapi/types'; + +const register = ({ strapi }: { strapi: Core.Strapi }) => { + // register phase +}; + +export default register; diff --git a/server/src/repositories/audience.ts b/server/src/repositories/audience.ts new file mode 100644 index 00000000..aa087029 --- /dev/null +++ b/server/src/repositories/audience.ts @@ -0,0 +1,14 @@ +import { Core } from '@strapi/strapi'; +import { once } from 'lodash'; +import { audienceDBSchema } from '../schemas'; +import { getPluginModels } from '../utils'; + +export const getAudienceRepository = once((context: { strapi: Core.Strapi }) => ({ + find(where: Record, limit?: number) { + const { + audienceModel: { uid }, + } = getPluginModels(context); + + return context.strapi.query(uid).findMany({ where, limit }).then(audienceDBSchema.array().parse); + }, +})); diff --git a/server/src/repositories/generic.ts b/server/src/repositories/generic.ts new file mode 100644 index 00000000..bee42627 --- /dev/null +++ b/server/src/repositories/generic.ts @@ -0,0 +1,39 @@ +import { Core, UID } from '@strapi/strapi'; +import { parsePopulateQuery } from '../utils'; + +type PublicationStatus = 'published' | 'draft'; + +export const getGenericRepository = (context: { strapi: Core.Strapi }, uid: UID.ContentType) => ({ + findFirst(populate: any, status?: PublicationStatus, extra: any = {}) { + return context.strapi + .documents(uid) + .findFirst({ populate: parsePopulateQuery(populate), status, ...extra }); + }, + + findById(documentId: string, populate: any, status?: PublicationStatus, extra: any = {}) { + return context.strapi + .documents(uid) + .findOne({ documentId, populate: parsePopulateQuery(populate), status, ...extra }); + }, + + findManyById(documentIds: string[], populate: any, status?: PublicationStatus) { + return context.strapi.documents(uid).findMany({ + where: { documentId: { $in: documentIds } }, + populate: parsePopulateQuery(populate), + status, + }); + }, + + findMany(where: any, populate: any, status?: PublicationStatus, locale?: string) { + return context.strapi + .documents(uid) + .findMany({ where, populate: parsePopulateQuery(populate), status, locale }); + }, + + count(where: Record, status?: PublicationStatus) { + return context.strapi.documents(uid).count({ + where, + status, + }); + }, +}); diff --git a/server/src/repositories/index.ts b/server/src/repositories/index.ts new file mode 100644 index 00000000..12cd9474 --- /dev/null +++ b/server/src/repositories/index.ts @@ -0,0 +1,4 @@ +export { getAudienceRepository } from './audience'; +export { getGenericRepository } from './generic'; +export { getNavigationItemRepository } from './navigation-item'; +export { getNavigationRepository } from './navigation'; diff --git a/server/src/repositories/navigation-item.ts b/server/src/repositories/navigation-item.ts new file mode 100644 index 00000000..ba1ac005 --- /dev/null +++ b/server/src/repositories/navigation-item.ts @@ -0,0 +1,130 @@ +import { Core, UID } from '@strapi/strapi'; + +import { omit, once } from 'lodash'; +import { NavigationItemDBSchema, navigationItemsDBSchema } from '../schemas'; +import { getPluginModels } from '../utils'; +import { getGenericRepository } from './generic'; + +type NavigationItemRemoveMinimal = Partial & + Pick; + +interface FindInput { + filters: any; + locale?: string; + limit?: number; + populate?: any; + order?: Record[]; +} + +interface SaveInput { + item: + | (Partial & { + documentId: undefined; + }) + | ({ + documentId: string; + } & Partial>); + locale?: string; +} + +export const getNavigationItemRepository = once((context: { strapi: Core.Strapi }) => ({ + async save({ item, locale }: SaveInput) { + const { itemModel } = getPluginModels(context); + + const { __type, documentId } = item?.related ?? {}; + const repository = __type + ? getGenericRepository(context, __type as UID.ContentType) + : undefined; + const related = + __type && repository + ? documentId + ? await repository.findById(documentId, undefined, undefined, { locale }) + : await repository.findFirst(undefined, undefined, { locale }) + : undefined; + + if (typeof item.documentId === 'string') { + const { documentId, ...rest } = item; + + return context.strapi.documents(itemModel.uid).update({ + documentId: item.documentId, + data: { + ...rest, + related: related ? { ...related, __type } : undefined, + }, + locale, + }); + } else { + return context.strapi.documents(itemModel.uid).create({ + data: { + ...item, + related: related ? { ...related, __type } : undefined, + }, + locale, + }); + } + }, + + find({ filters, locale, limit, order, populate }: FindInput) { + const { itemModel } = getPluginModels(context); + + return context.strapi + .documents(itemModel.uid) + .findMany({ filters, locale, limit, populate, orderBy: order }) + .then((items) => items.map(flattenRelated)) + .then(navigationItemsDBSchema.parse) + .then((items) => items.map(removeSensitiveFields)); + }, + + count(where: any) { + const { itemModel } = getPluginModels(context); + + return context.strapi.query(itemModel.uid).count({ where }); + }, + + remove(item: NavigationItemRemoveMinimal) { + const { itemModel } = getPluginModels(context); + + return context.strapi.query(itemModel.uid).delete({ where: { documentId: item.documentId } }); + }, + + removeForIds(ids: string[]) { + const { itemModel } = getPluginModels(context); + + return context.strapi.query(itemModel.uid).deleteMany({ + where: { documentId: ids }, + }); + }, + + findForMasterIds(ids: string[]) { + const { itemModel } = getPluginModels(context); + + return context.strapi + .query(itemModel.uid) + .findMany({ + where: { + $or: ids.map((documentId) => ({ master: documentId })), + }, + limit: Number.MAX_SAFE_INTEGER, + }) + .then(navigationItemsDBSchema.parse); + }, +})); + +const sensitiveFields = ['id', 'publishedAt', 'createdAt', 'updatedAt', 'locale']; + +export const removeSensitiveFields = ({ + related, + items = [], + ...item +}: NavigationItemDBSchema): NavigationItemDBSchema => ({ + ...item, + items: items.map(removeSensitiveFields), + related: related + ? (omit(related, sensitiveFields) as NavigationItemDBSchema['related']) + : undefined, +}); + +export const flattenRelated = ({ related, ...item }: any) => ({ + ...item, + related: related?.[0], +}); diff --git a/server/src/repositories/navigation.ts b/server/src/repositories/navigation.ts new file mode 100644 index 00000000..475ce518 --- /dev/null +++ b/server/src/repositories/navigation.ts @@ -0,0 +1,113 @@ +import { Core } from '@strapi/strapi'; +import { omit, once } from 'lodash'; + +import { NavigationError } from '../app-errors'; +import { + CreateNavigationSchema, + NavigationDBSchema, + UpdateNavigationSchema, + navigationDBSchema, +} from '../schemas'; +import { getPluginModels } from '../utils'; +import { flattenRelated, removeSensitiveFields } from './navigation-item'; + +interface FindInput { + filters?: any; + limit?: number; + locale?: string; + populate?: any; + orderBy?: Record; +} + +interface FindOneInput { + filters?: any; + locale?: string; + populate?: any; +} + +const calculateItemsRequirement = (populate: any) => { + return populate === true ? true : Array.isArray(populate) ? populate.includes('items') : false; +}; + +export const getNavigationRepository = once((context: { strapi: Core.Strapi }) => ({ + find({ filters, locale, limit, orderBy, populate }: FindInput) { + const { masterModel } = getPluginModels(context); + + return context.strapi + .documents(masterModel.uid) + .findMany({ filters, locale, limit, populate, orderBy }) + .then((data) => + data.map(({ items, ...navigation }) => ({ + ...navigation, + items: items?.map(flattenRelated), + })) + ) + .then((data) => + data.map(({ items, ...navigation }) => ({ + ...navigation, + items: items?.map(removeSensitiveFields), + })) + ) + .then((data) => { + return navigationDBSchema(calculateItemsRequirement(populate)).array().parse(data); + }); + }, + + findOne({ locale, filters, populate }: FindOneInput) { + const { masterModel } = getPluginModels(context); + + return context.strapi + .documents(masterModel.uid) + .findOne({ documentId: filters.documentId, locale, populate }) + .then((data) => (data ? { ...data, items: data.items?.map(flattenRelated) } : data)) + .then((data) => { + return navigationDBSchema(calculateItemsRequirement(populate)).parse(data); + }) + .then((navigation) => ({ + ...navigation, + items: navigation.items?.map(removeSensitiveFields), + })); + }, + + async save( + navigation: + | (CreateNavigationSchema & { locale?: string, items?: unknown }) + | (Omit & { items?: never }) + ) { + const { masterModel } = getPluginModels(context); + const { documentId, locale, ...rest } = navigation; + + if (documentId) { + return context.strapi + .documents(masterModel.uid) + .update({ + locale, + documentId: documentId, + data: omit(rest, ['id', 'documentId']), + populate: ['items'], + }) + .then(navigationDBSchema(false).parse); + } else { + return context.strapi + .documents(masterModel.uid) + .create({ + locale, + data: { + ...rest, + populate: ['items'], + }, + }) + .then(navigationDBSchema(false).parse); + } + }, + + remove(navigation: Partial>) { + const { masterModel } = getPluginModels(context); + + if (!navigation.documentId && !navigation.id) { + throw new NavigationError('Some kind of id required. None given.'); + } + + return context.strapi.query(masterModel.uid).deleteMany({ where: navigation }); + }, +})); diff --git a/server/src/routes/admin.ts b/server/src/routes/admin.ts new file mode 100644 index 00000000..2a1638d8 --- /dev/null +++ b/server/src/routes/admin.ts @@ -0,0 +1,213 @@ +import pluginPermissions from '../permissions'; + +const routes = { + type: 'admin', + routes: [ + { + method: 'GET', + path: '/', + handler: 'admin.get', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('read')], + }, + }, + ], + }, + }, + { + method: 'POST', + path: '/', + handler: 'admin.post', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('update')], + }, + }, + ], + }, + }, + { + method: 'GET', + path: '/config', + handler: 'admin.config', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('read')], + }, + }, + ], + }, + }, + { + method: 'PUT', + path: '/config', + handler: 'admin.updateConfig', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('settings')], + }, + }, + ], + }, + }, + { + method: 'DELETE', + path: '/config', + handler: 'admin.restoreConfig', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('settings')], + }, + }, + ], + }, + }, + { + method: 'GET', + path: '/slug', + handler: 'admin.getSlug', + config: { + policies: ['admin::isAuthenticatedAdmin'], + }, + }, + { + method: 'GET', + path: '/:documentId', + handler: 'admin.getById', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('read')], + }, + }, + ], + }, + }, + { + method: 'PUT', + path: '/:documentId', + handler: 'admin.put', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('update')], + }, + }, + ], + }, + }, + { + method: 'DELETE', + path: '/:documentId', + handler: 'admin.delete', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('update')], + }, + }, + ], + }, + }, + { + method: 'GET', + path: '/content-type-items/:model', + handler: 'admin.getContentTypeItems', + config: { + policies: ['admin::isAuthenticatedAdmin'], + }, + }, + { + method: 'GET', + path: '/settings/locale', + handler: 'admin.settingsLocale', + config: { + policies: ['admin::isAuthenticatedAdmin'], + }, + }, + { + method: 'GET', + path: '/settings/config', + handler: 'admin.settingsConfig', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('settings')], + }, + }, + ], + }, + }, + { + method: 'GET', + path: '/settings/restart', + handler: 'admin.settingsRestart', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('settings')], + }, + }, + ], + }, + }, + { + method: 'PUT', + path: '/i18n/copy/:documentId/:source/:target', + handler: 'admin.fillFromOtherLocale', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('update')], + }, + }, + ], + }, + }, + { + method: 'GET', + path: '/i18n/item/read/:source/:target', + handler: 'admin.readNavigationItemFromLocale', + config: { + policies: [ + { + name: 'admin::hasPermissions', + config: { + actions: [pluginPermissions.render('read')], + }, + }, + ], + }, + }, + ], +}; + +export default routes; diff --git a/server/routes/client.ts b/server/src/routes/client.ts similarity index 79% rename from server/routes/client.ts rename to server/src/routes/client.ts index 2fcdd65e..c92a8647 100644 --- a/server/routes/client.ts +++ b/server/src/routes/client.ts @@ -1,6 +1,10 @@ -import { StrapiRoutes } from "../../types"; +export type NavigationServerRoute = (typeof routes.routes)[number] & { + info?: { + pluginName: string + } +} -const routes: StrapiRoutes = { +const routes = { type: 'content-api', routes: [ { diff --git a/server/routes/index.ts b/server/src/routes/index.ts similarity index 83% rename from server/routes/index.ts rename to server/src/routes/index.ts index 52e73ac0..66d67308 100644 --- a/server/routes/index.ts +++ b/server/src/routes/index.ts @@ -6,4 +6,4 @@ const routes = { 'content-api': client, }; -export default routes; \ No newline at end of file +export default routes; diff --git a/server/src/schemas/config.ts b/server/src/schemas/config.ts new file mode 100644 index 00000000..476a5773 --- /dev/null +++ b/server/src/schemas/config.ts @@ -0,0 +1,63 @@ +import * as z from 'zod'; + +export type PluginConfigKeys = keyof NavigationPluginConfigDBSchema; +export type NavigationPluginConfigDBSchema = z.infer; + +export type NavigationItemCustomFieldBase = z.infer; +const navigationCustomFieldBase = z.object({ + // TODO: Proper message translation + name: z.string().refine((current) => !current.includes(' '), { message: 'No space allowed' }), + label: z.string(), + required: z.boolean().optional(), + enabled: z.boolean().optional(), +}); + +export type NavigationItemCustomFieldSelect = z.infer; +const navigationItemCustomFieldSelect = navigationCustomFieldBase.extend({ + type: z.literal('select'), + multi: z.boolean(), + options: z.array(z.string()), +}); + +export type NavigationItemCustomFieldPrimitive = z.infer; +const navigationItemCustomFieldPrimitive = navigationCustomFieldBase.extend({ + type: z.enum(['boolean', 'string']), + multi: z.literal(false).optional(), + options: z.array(z.string()).max(0).optional(), +}); + +export type NavigationItemCustomFieldMedia = z.infer; +const navigationItemCustomFieldMedia = navigationCustomFieldBase.extend({ + type: z.literal('media'), + multi: z.literal(false).optional(), + options: z.array(z.string()).max(0).optional(), +}); + +export type NavigationItemCustomField = z.infer; +export const navigationItemCustomField = z.union([ + navigationItemCustomFieldPrimitive, + navigationItemCustomFieldMedia, + navigationItemCustomFieldSelect, +]); + +export type NavigationItemAdditionalField = z.infer; +export const navigationItemAdditionalField = z.union([ + z.literal('audience'), + navigationItemCustomField, +]); + +export type ConfigSchema = z.infer; +export const configSchema = z.object({ + additionalFields: z.array(navigationItemAdditionalField), + allowedLevels: z.number(), + contentTypes: z.array(z.string()), + contentTypesNameFields: z.record(z.string(), z.array(z.string())), + contentTypesPopulate: z.record(z.string(), z.array(z.string())), + gql: z.object({ + navigationItemRelated: z.array(z.string()), + }), + pathDefaultFields: z.record(z.string(), z.any()), + cascadeMenuAttached: z.boolean(), + preferCustomContentTypes: z.boolean(), + isCacheEnabled: z.boolean().optional(), +}); diff --git a/server/src/schemas/content-type.ts b/server/src/schemas/content-type.ts new file mode 100644 index 00000000..f4bc0485 --- /dev/null +++ b/server/src/schemas/content-type.ts @@ -0,0 +1,149 @@ +import * as z from 'zod'; + +export type ContentType = z.infer; +export const contentType = z.enum(['collectionType', 'singleType']); + +export type ContentTypeInfo = z.infer; +export const contentTypeInfo = z.object({ + singularName: z.string(), + pluralName: z.string(), + displayName: z.string(), + description: z.string().optional(), + name: z.string().optional(), +}); + +export type ContentTypeAttributeValidator = z.infer; +export const contentTypeAttributeValidator = z.object({ + required: z.boolean().optional(), + max: z.number().optional(), + min: z.number().optional(), + minLength: z.number().optional(), + maxLength: z.number().optional(), + private: z.boolean().optional(), + configurable: z.boolean().optional(), + default: z.any().optional(), +}); + +export type contentTypeFieldTypeSchema = z.infer; +export const contentTypeFieldTypeSchema = z.enum([ + 'string', + 'text', + 'richtext', + 'blocks', + 'email', + 'password', + 'date', + 'time', + 'datetime', + 'timestamp', + 'boolean', + 'integer', + 'biginteger', + 'float', + 'decimal', + 'json', + 'relation', +]); + +export type SimpleContentTypeAttribute = z.infer; +export const simpleContentTypeAttribute = contentTypeAttributeValidator.extend({ + type: contentTypeFieldTypeSchema, +}); + +export type ContentTypeEnumerationAttribute = z.infer; +export const contentTypeEnumerationAttribute = contentTypeAttributeValidator.extend({ + type: z.literal('enumeration'), + enum: z.string().array(), +}); + +export type ContentTypeComponentAttribute = z.infer; +export const contentTypeComponentAttribute = z.object({ + type: z.literal('component'), + component: z.string(), + repeatable: z.boolean().optional(), +}); + +export type ContentTypeDynamicZoneAttribute = z.infer; +export const contentTypeDynamicZoneAttribute = z.object({ + type: z.literal('dynamiczone'), + components: z.string().array(), +}); + +export type ContentTypeUidAttribute = z.infer; +export const contentTypeUidAttribute = z.object({ + type: z.literal('uid'), +}); + + +export type ContentTypeMediaAttribute = z.infer; +export const contentTypeMediaAttribute = z.object({ + type: z.literal('media'), + allowedTypes: z.enum(['images', 'videos', 'files']).array(), + required: z.boolean().optional(), +}); + +export type ContentTypeRelationType = z.infer; +export const contentTypeRelationType = z.enum(['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany', 'morphToMany', 'manyToMorph']); + +export type ContentTypeRelationAttribute = z.infer; +export const contentTypeRelationAttribute = z.object({ + type: z.literal('relation'), + relation: contentTypeRelationType, + target: z.string(), + mappedBy: z.string().optional(), + inversedBy: z.string().optional(), +}); + +export type ContentTypeAttributes = z.infer; +export const contentTypeAttributes = z.record( + z.string(), + z.union([ + simpleContentTypeAttribute, + contentTypeEnumerationAttribute, + contentTypeComponentAttribute, + contentTypeDynamicZoneAttribute, + contentTypeRelationAttribute, + contentTypeMediaAttribute, + contentTypeUidAttribute, + ]) +); + +export type ContentTypeFullSchema = z.infer; +export const contentTypeFullSchema = z.object({ + kind: contentType, + collectionName: z.string(), + info: contentTypeInfo, + options: z + .object({ + draftAndPublish: z.boolean().optional(), + hidden: z.boolean().optional(), + templateName: z.string().optional(), + }) + .optional(), + attributes: contentTypeAttributes, + actions: z.record(z.string(), z.any()).optional(), + lifecycles: z.record(z.string(), z.any()).optional(), + uid: z.string(), + apiName: z.string().optional(), + + // TODO?: remove + associations: z + .object({ + model: z.string(), + alias: z.string(), + }) + .array() + .optional(), + modelName: z.string().optional(), + plugin: z.string().optional(), + pluginOptions: z.record(z.string(), z.any()).optional(), + isSingle: z.boolean().optional(), +}); + +export type ContentTypeSchema = z.infer; +export const contentTypeSchema = contentTypeFullSchema.pick({ + info: true, + kind: true, + attributes: true, + options: true, +}); diff --git a/server/src/schemas/index.ts b/server/src/schemas/index.ts new file mode 100644 index 00000000..fc0869b6 --- /dev/null +++ b/server/src/schemas/index.ts @@ -0,0 +1,3 @@ +export * from './config'; +export * from './content-type'; +export * from './navigation'; diff --git a/server/src/schemas/navigation.ts b/server/src/schemas/navigation.ts new file mode 100644 index 00000000..5974441c --- /dev/null +++ b/server/src/schemas/navigation.ts @@ -0,0 +1,125 @@ +import * as z from 'zod'; + +export type AudienceDBSchema = z.infer; +export const audienceDBSchema = z.object({ + id: z.number(), + documentId: z.string(), + name: z.string(), + key: z.string(), +}); + +export type NavigationItemType = z.infer; +export const navigationItemType = z.enum(['INTERNAL', 'EXTERNAL', 'WRAPPER']); + +const navigationItemDBBaseSchema = z.object({ + id: z.number(), + documentId: z.string(), + title: z.string(), + type: navigationItemType, + path: z.string().or(z.null()).optional(), + slug: z.string().or(z.null()).optional(), + externalPath: z.string().or(z.null()).optional(), + uiRouterKey: z.string(), + menuAttached: z.boolean(), + order: z.number().int(), + collapsed: z.boolean(), + related: z + .object({ documentId: z.string().optional(), __type: z.string() }) + .catchall(z.unknown()) + .nullish(), + additionalFields: z.record(z.string(), z.unknown()).or(z.null()).optional(), + audience: z.array(audienceDBSchema).or(z.null()).optional(), + autoSync: z.boolean().or(z.null()).optional(), +}); + +export type ReadNavigationItemFromLocaleSchema = z.infer; +export const readNavigationItemFromLocaleSchema = navigationItemDBBaseSchema + .omit({ + related: true, + }) + .pick({ + path: true, + type: true, + uiRouterKey: true, + title: true, + externalPath: true, + }) + .extend({ related: z.unknown() }); + +export type NavigationItemDBSchema = z.infer & { + parent?: NavigationItemDBSchema | null; + items?: NavigationItemsDBSchema; + master?: NavigationDBSchema; +}; + +export const navigationItemDBSchema: z.ZodType = + navigationItemDBBaseSchema.extend({ + parent: z.lazy(() => navigationItemDBSchema.or(z.null())).optional(), + items: z.lazy(() => navigationItemDBSchema.array()).optional(), + master: z.lazy(() => navigationDBSchema(false)).optional(), + }); + +export type NavigationItemsDBSchema = z.infer; +export const navigationItemsDBSchema = z.array(navigationItemDBSchema); + +export type NavigationDBSchema = z.infer>; +export const navigationDBSchema = (withItems: boolean) => + z.object({ + id: z.number(), + documentId: z.string(), + name: z.string(), + slug: z.string(), + locale: z.string(), + visible: z.boolean(), + items: withItems ? z.array(navigationItemDBSchema) : navigationItemDBSchema.array().optional(), + }); + +export type CreateNavigationSchema = z.infer; +export const createNavigationSchema = navigationDBSchema(false) + .omit({ + items: true, + id: true, + documentId: true, + slug: true, + locale: true, + }) + .extend({ + documentId: z.string().optional(), + id: z.undefined().optional(), + }); + +export type UpdateNavigationItemSchema = z.ZodType< + Omit, 'id' | 'documentId' | 'parent' | 'items'> +> & { + items?: UpdateNavigationItemsSchema | null; + id?: number; + documentId?: string; + updated?: boolean; + removed?: boolean; +}; +export const updateNavigationItemSchema: UpdateNavigationItemSchema = navigationItemDBBaseSchema + .omit({ id: true, documentId: true }) + .extend({ + id: z.number().optional(), + documentId: z.string().optional(), + items: z + .lazy(() => updateNavigationItemsSchema) + .or(z.null()) + .optional(), + updated: z.boolean().optional(), + removed: z.boolean().optional(), + }); + +export type UpdateNavigationItemsSchema = z.infer; +export const updateNavigationItemsSchema = z.array(updateNavigationItemSchema); + +export type UpdateNavigationSchema = z.infer; +export const updateNavigationSchema = navigationDBSchema(false) + .extend({ + items: updateNavigationItemsSchema, + }) + .partial() + .required({ + id: true, + documentId: true, + }); diff --git a/server/src/services/admin/admin.ts b/server/src/services/admin/admin.ts new file mode 100644 index 00000000..5f8901f2 --- /dev/null +++ b/server/src/services/admin/admin.ts @@ -0,0 +1,764 @@ +import { Core, UID } from '@strapi/strapi'; +import { errors } from '@strapi/utils'; +import { + differenceBy, + find, + get, + isEmpty, + isObject, + last, + pick, + toString, + upperFirst, +} from 'lodash'; +import pluralize from 'pluralize'; +import { FillNavigationError, InvalidParamNavigationError } from '../../app-errors'; +import { ConfigContentTypeDTO, NavigationDTO, NavigationPluginConfigDTO } from '../../dtos'; +import { + getAudienceRepository, + getGenericRepository, + getNavigationItemRepository, + getNavigationRepository, +} from '../../repositories'; +import { + NavigationDBSchema, + NavigationItemCustomField, + NavigationItemDBSchema, + ReadNavigationItemFromLocaleSchema, + configSchema, + contentTypeFullSchema, + readNavigationItemFromLocaleSchema, +} from '../../schemas'; +import { + ALLOWED_CONTENT_TYPES, + CONTENT_TYPES_NAME_FIELDS_DEFAULTS, + KIND_TYPES, + RESTRICTED_CONTENT_TYPES, + getPluginModels, + getPluginService, + isContentTypeEligible, + singularize, + validateAdditionalFields, +} from '../../utils'; +import { + ConfigInput, + DeleteInput, + FillFromOtherLocaleInput, + GetByIdInput, + GetContentTypeItemsInput, + GetInput, + I18nNavigationContentsCopyInput, + PostInput, + PutInput, + ReadNavigationItemFromLocaleInput, + UpdateConfigInput, +} from './types'; +import { getCacheStatus, intercalate, prepareAuditLog, processItems, sendAuditLog } from './utils'; + +export type AdminService = ReturnType; + +const adminService = (context: { strapi: Core.Strapi }) => ({ + async config({ viaSettingsPage = false }: ConfigInput): Promise { + const commonService = getPluginService(context, 'common'); + const cacheStatus = await getCacheStatus(context); + + const pluginStore = await commonService.getPluginStore(); + const config = await pluginStore + .get({ + key: 'config', + }) + .then(configSchema.parse); + + const { + additionalFields, + cascadeMenuAttached, + contentTypesPopulate, + contentTypesNameFields, + pathDefaultFields, + allowedLevels, + preferCustomContentTypes, + } = config; + + const isGQLPluginEnabled = !!strapi.plugin('graphql'); + + let extendedResult: Record = { + allowedContentTypes: ALLOWED_CONTENT_TYPES, + restrictedContentTypes: RESTRICTED_CONTENT_TYPES, + availableAudience: [], + }; + const configContentTypes = await this.configContentTypes({}); + + const result = { + contentTypes: await this.configContentTypes({ viaSettingsPage }), + contentTypesNameFields: { + default: CONTENT_TYPES_NAME_FIELDS_DEFAULTS, + ...(isObject(contentTypesNameFields) ? contentTypesNameFields : {}), + }, + contentTypesPopulate: isObject(contentTypesPopulate) ? contentTypesPopulate : {}, + pathDefaultFields: isObject(pathDefaultFields) ? pathDefaultFields : {}, + allowedLevels, + additionalFields: viaSettingsPage + ? additionalFields + : additionalFields.filter((field) => typeof field === 'string' || !!field.enabled), + gql: { + navigationItemRelated: configContentTypes.map(({ labelSingular }) => + labelSingular.replace(/\s+/g, '') + ), + }, + isGQLPluginEnabled: viaSettingsPage ? isGQLPluginEnabled : undefined, + cascadeMenuAttached, + preferCustomContentTypes, + }; + + if (additionalFields.includes('audience')) { + const audienceItems = await getAudienceRepository(context).find({}, Number.MAX_SAFE_INTEGER); + + extendedResult = { + ...extendedResult, + availableAudience: audienceItems, + }; + } + + return { + ...result, + ...extendedResult, + isCacheEnabled: cacheStatus.enabled, + isCachePluginEnabled: cacheStatus.hasCachePlugin, + }; + }, + + async configContentTypes({ + viaSettingsPage = false, + }: ConfigInput): Promise { + const commonService = getPluginService(context, 'common'); + + const pluginStore = await commonService.getPluginStore(); + + const config = await pluginStore.get({ key: 'config' }).then(configSchema.parse); + + const eligibleContentTypes = await Promise.all( + config.contentTypes + .filter( + (contentType) => + !!context.strapi.contentTypes[contentType as any] && isContentTypeEligible(contentType) + ) + .map(async (key) => { + const item = contentTypeFullSchema.parse(strapi.contentTypes[key as any]); + + const { kind, options, uid } = item; + const draftAndPublish = options?.draftAndPublish; + + const isSingleType = kind === KIND_TYPES.SINGLE; + const isSingleTypeWithPublishFlow = isSingleType && draftAndPublish; + + const returnType = (available: boolean) => ({ + key, + available, + }); + + if (isSingleType) { + const repository = getGenericRepository(context, uid as UID.ContentType); + + if (isSingleTypeWithPublishFlow) { + const itemsCountOrBypass = isSingleTypeWithPublishFlow + ? await repository.count({}, 'published') + : true; + + return returnType(itemsCountOrBypass !== 0); + } + + const isAvailable = await repository.count({}); + + return isAvailable !== 0 + ? returnType(true) + : viaSettingsPage + ? returnType(false) + : undefined; + } + + return returnType(true); + }) + ); + + return eligibleContentTypes.reduce((acc, current) => { + if (!current?.key) { + return acc; + } + + const { key, available } = current; + const item = contentTypeFullSchema.parse(context.strapi.contentTypes[key as any]); + + const relatedField = (item.associations || []).find( + ({ model }) => model === 'navigationitem' + ); + + const { + uid, + options, + info, + collectionName, + modelName, + apiName, + plugin, + kind, + pluginOptions = {}, + } = item; + + const isAvailable = available && !options?.hidden; + + if (!isAvailable) { + return acc; + } + + const { visible = true } = pluginOptions['content-manager'] || {}; + const { name = '', description = '' } = info; + + const findRouteConfig = find( + get(context.strapi.api, `[${modelName}].config.routes`, []), + (route: T) => route.handler.includes('.find') + ); + + const findRoutePath = findRouteConfig && findRouteConfig.path.split('/')[1]; + + const apiPath = + findRoutePath && findRoutePath !== apiName ? findRoutePath : apiName || modelName; + const isSingle = kind === KIND_TYPES.SINGLE; + const endpoint = isSingle ? apiPath : pluralize(apiPath!); + const relationName = singularize(modelName); + const relationNameParts = typeof uid === 'string' ? last(uid.split('.'))!.split('-') : []; + const contentTypeName = + relationNameParts.length > 1 + ? relationNameParts.reduce((prev, curr) => `${prev}${upperFirst(curr)}`, '') + : upperFirst(modelName); + const labelSingular = + name || + upperFirst(relationNameParts.length > 1 ? relationNameParts.join(' ') : relationName); + + acc.push({ + uid, + name: relationName, + draftAndPublish: options?.draftAndPublish, + isSingle, + description, + collectionName, + contentTypeName, + label: isSingle ? labelSingular : pluralize(name || labelSingular), + relatedField: relatedField ? relatedField.alias : undefined, + labelSingular: singularize(labelSingular), + endpoint: endpoint!, + plugin, + available: isAvailable, + visible, + templateName: options?.templateName, + }); + + return acc; + }, [] as ConfigContentTypeDTO[]); + }, + + async get({ ids, locale }: GetInput): Promise { + let filters: Record = {}; + + if (ids && ids.length) { + filters.id = { $in: ids }; + } + + const dbResults = await getNavigationRepository(context).find({ + filters, + locale: locale || '*', + limit: Number.MAX_SAFE_INTEGER, + populate: ['items', 'items.parent', 'items.audience', 'items.related'], + }); + + const buildItemsStructure = ({ + allItems, + item, + parent, + }: { + item: NavigationItemDBSchema; + parent?: NavigationItemDBSchema; + allItems: Array; + }): NavigationItemDBSchema => { + const children = allItems.filter((child) => child.parent?.documentId === item.documentId); + + return { + ...item, + parent, + items: children + .map((child) => + buildItemsStructure({ + parent: item, + item: child, + allItems, + }) + ) + .sort((a, b) => a.order - b.order), + }; + }; + + return dbResults.map((navigation: NavigationDBSchema) => ({ + ...navigation, + items: navigation.items + ?.filter((item) => !item.parent) + .map((item) => + buildItemsStructure({ + allItems: navigation.items ?? [], + item, + }) + ) + .sort((a, b) => a.order - b.order), + })); + }, + + async getById({ documentId, locale }: GetByIdInput): Promise { + const commonService = getPluginService(context, 'common'); + const { defaultLocale } = await commonService.readLocale(); + const filters: Record = { + documentId, + }; + + const navigation = await getNavigationRepository(context).findOne({ + filters, + locale: locale || defaultLocale, + }); + + const dbNavigationItems = await getNavigationItemRepository(context).find({ + filters: { master: navigation.id }, + locale: locale || defaultLocale, + limit: Number.MAX_SAFE_INTEGER, + order: [{ order: 'asc' }], + populate: ['parent', 'audience'], + }); + + return { + ...navigation, + items: commonService + .buildNestedStructure({ + navigationItems: dbNavigationItems, + }) + .filter(({ parent }) => !parent), + }; + }, + + async post({ auditLog, payload }: PostInput): Promise { + const { masterModel } = getPluginModels(context); + + const commonService = getPluginService(context, 'common'); + + const { defaultLocale, restLocale } = await commonService.readLocale(); + + const repository = getNavigationRepository(context); + + const navigationSummary: NavigationDBSchema[] = []; + + const { name, visible } = payload; + const slug = await commonService.getSlug({ query: name }); + + const mainNavigation = await repository.save({ + name, + visible, + locale: defaultLocale, + slug, + }); + + navigationSummary.push(await this.getById({ documentId: mainNavigation.documentId })); + + for (const localeCode of restLocale) { + const newLocaleNavigation = await repository.save({ + name, + visible, + locale: localeCode, + slug, + documentId: mainNavigation.documentId, + }); + + navigationSummary.push(await this.getById({ documentId: newLocaleNavigation.documentId })); + } + + navigationSummary.map((navigation) => { + sendAuditLog(auditLog, 'onChangeNavigation', { + actionType: 'CREATE', + oldEntity: navigation, + newEntity: navigation, + }); + }); + + await commonService.emitEvent({ + entity: mainNavigation, + event: 'entry.create', + uid: masterModel.uid, + }); + + return { + ...mainNavigation, + items: [], + }; + }, + + async put({ auditLog, payload }: PutInput): Promise { + const { masterModel } = getPluginModels(context); + + const commonService = getPluginService(context, 'common'); + const { defaultLocale, restLocale } = await commonService.readLocale(); + + const repository = getNavigationRepository(context); + + const { name, visible, items } = payload; + + const currentNavigation = await repository.findOne({ + filters: { documentId: payload.documentId }, + locale: payload.locale, + populate: '*', + }); + const currentNavigationAsDTO = await this.getById({ + documentId: payload.documentId, + locale: payload.locale, + }); + + const detailsHaveChanged = + currentNavigation.name !== name || currentNavigation.visible !== visible; + + if (detailsHaveChanged) { + const newSlug = name + ? await commonService.getSlug({ + query: name, + }) + : currentNavigation.slug; + + const allNavigations = await Promise.all( + [defaultLocale, ...restLocale].map((locale) => + repository.findOne({ + filters: { documentId: currentNavigation.documentId }, + locale, + }) + ) + ); + + for (const navigation of allNavigations) { + await repository.save({ + documentId: navigation.documentId, + id: navigation.id, + slug: newSlug, + locale: navigation.locale, + name, + visible, + }); + } + } + + const updatedNavigationAsDTO = await commonService + .analyzeBranch({ + navigationItems: items ?? [], + masterEntity: currentNavigation, + prevAction: {}, + }) + .then(prepareAuditLog) + .then(async (actionType) => { + const newEntity = await this.getById({ documentId: currentNavigation.documentId }); + + sendAuditLog(auditLog, 'onChangeNavigation', { + actionType, + oldEntity: currentNavigationAsDTO, + newEntity, + }); + + return newEntity; + }); + + await commonService.emitEvent({ + entity: await repository.findOne({ + filters: { documentId: payload.documentId }, + populate: '*', + }), + event: 'entry.update', + uid: masterModel.uid, + }); + + return updatedNavigationAsDTO; + }, + + async delete({ auditLog, documentId }: DeleteInput): Promise { + const navigationRepository = getNavigationRepository(context); + const navigationItemRepository = getNavigationItemRepository(context); + + const navigationAsDTO = await this.getById({ documentId }); + + // TODO: remove when cascade deletion is present + // NOTE: Delete many with relation `where` crashes ORM + const cleanNavigationItems = async (masterIds: Array) => { + if (masterIds.length < 1) { + return; + } + + await navigationItemRepository.removeForIds( + await navigationItemRepository + .findForMasterIds(masterIds) + .then((_: Array) => + _.reduce>((acc, { documentId }) => { + if (documentId) { + acc.push(documentId); + } + + return acc; + }, []) + ) + ); + }; + + const navigation = await navigationRepository.findOne({ + filters: { documentId }, + populate: '*', + }); + const allNavigations = await navigationRepository.find({ + filters: { documentId: navigation.documentId }, + populate: '*', + }); + + await cleanNavigationItems( + allNavigations.map(({ documentId }: NavigationDBSchema) => documentId) + ); + await navigationRepository.remove({ documentId: navigation.documentId }); + + sendAuditLog(auditLog, 'onNavigationDeletion', { + entity: navigationAsDTO, + actionType: 'DELETE', + }); + }, + + async restart(): Promise { + context.strapi.reload.isWatching = false; + + setImmediate(() => context.strapi.reload()); + }, + + async restoreConfig(): Promise { + const commonService = getPluginService(context, 'common'); + + const pluginStore = await commonService.getPluginStore(); + await pluginStore.delete({ key: 'config' }); + await commonService.setDefaultConfig(); + }, + + async updateConfig({ config: newConfig }: UpdateConfigInput): Promise { + const commonService = getPluginService(context, 'common'); + + const pluginStore = await commonService.getPluginStore(); + + const config = await pluginStore + .get({ + key: 'config', + }) + .then(configSchema.parse); + + validateAdditionalFields(newConfig.additionalFields); + + await pluginStore.set({ key: 'config', value: newConfig }); + + const removedFields = differenceBy( + config.additionalFields, + newConfig.additionalFields, + 'name' + ).reduce((acc, field) => { + if (typeof field === 'string') { + return acc; + } + + acc.push(field); + + return acc; + }, []); + + if (!isEmpty(removedFields)) { + await commonService.pruneCustomFields({ removedFields }); + } + }, + + async fillFromOtherLocale({ + auditLog, + source, + target, + documentId, + }: FillFromOtherLocaleInput): Promise { + const targetEntity = await this.getById({ documentId, locale: target }); + + return await this.i18nNavigationContentsCopy({ + source: await this.getById({ documentId, locale: source }), + target: targetEntity, + }) + .then(() => this.getById({ documentId, locale: target })) + .then((newEntity) => { + sendAuditLog(auditLog, 'onChangeNavigation', { + actionType: 'UPDATE', + oldEntity: targetEntity, + newEntity, + }); + + return newEntity; + }); + }, + + async i18nNavigationContentsCopy({ + source, + target, + }: I18nNavigationContentsCopyInput): Promise { + const commonService = getPluginService(context, 'common'); + const sourceItems = source.items ?? []; + const navigationRepository = getNavigationRepository(context); + + if (target.items?.length) { + throw new FillNavigationError('Current navigation is non-empty'); + } + + if (!target.locale) { + throw new FillNavigationError('Current navigation does not have specified locale'); + } + + if (!sourceItems.length) { + throw new FillNavigationError('Source navigation is empty'); + } + + const entities = new Map(); + + const itemProcessor = processItems({ + master: target, + locale: target.locale, + strapi, + entities, + }); + + await commonService.createBranch({ + action: { create: true }, + masterEntity: await navigationRepository.findOne({ + filters: { documentId: target.documentId }, + locale: target.locale, + populate: '*', + }), + navigationItems: await Promise.all(sourceItems.map(itemProcessor)), + parentItem: undefined, + }); + }, + + async readNavigationItemFromLocale({ + path, + source, + target, + }: ReadNavigationItemFromLocaleInput): Promise { + const sourceNavigation = await this.getById({ documentId: source }); + const targetNavigation = await this.getById({ documentId: target }); + + if (!sourceNavigation) { + throw new errors.NotFoundError('Unable to find source navigation for specified query'); + } + + if (!targetNavigation) { + throw new errors.NotFoundError('Unable to find target navigation for specified query'); + } + + const requiredFields = [ + 'path', + 'related', + 'type', + 'uiRouterKey', + 'title', + 'externalPath', + ] as const; + const structurePath = path.split('.').map((p) => parseInt(p, 10)); + + if (!structurePath.some(Number.isNaN) || !structurePath.length) { + new InvalidParamNavigationError('Path is invalid'); + } + + let result = get( + sourceNavigation.items, + intercalate('items', structurePath.map(toString)) + ); + + if (!result) { + throw new errors.NotFoundError('Unable to find navigation item'); + } + + return readNavigationItemFromLocaleSchema.parse(pick(result, requiredFields)); + }, + + async getContentTypeItems({ + query, + uid, + }: GetContentTypeItemsInput): Promise<{ documentId: string }[]> { + const commonService = getPluginService(context, 'common'); + const pluginStore = await commonService.getPluginStore(); + const config = await pluginStore.get({ key: 'config' }).then(configSchema.parse); + const where: Record = { + publishedAt: { + $notNull: true, + }, + }; + const contentType = get(context.strapi.contentTypes, uid); + const { draftAndPublish } = contentType.options; + const { localized = false } = contentType?.pluginOptions?.i18n || {}; + + if (localized && query.locale) { + where.locale = query.locale; + } + + const repository = getGenericRepository(context, uid as UID.ContentType); + + try { + const contentTypeItems = await repository.findMany( + where, + config.contentTypesPopulate[uid] || [], + draftAndPublish ? 'published' : undefined + ); + + return contentTypeItems; + } catch (err) { + console.error(err); + + return []; + } + }, + + async purgeNavigationCache(documentId: string, clearLocalisations?: boolean) { + const navigationRepository = getNavigationRepository(context); + const entity = await navigationRepository.findOne({ filters: { documentId } }); + + if (!entity) { + throw new errors.NotFoundError('Navigation is not defined'); + } + + const mapToRegExp = (documentId: string) => new RegExp(`/api/navigation/render/${documentId}`); + + let regexps = [mapToRegExp(entity.documentId)]; + + if (clearLocalisations) { + const navigations = await navigationRepository.find({ + filters: { + documentId: entity.documentId, + }, + }); + + regexps = navigations.map(({ documentId }: NavigationDBSchema) => mapToRegExp(documentId)); + } + + const restCachePlugin = strapi.plugin('rest-cache'); + const cacheStore = restCachePlugin.service('cacheStore'); + + regexps.push(mapToRegExp(documentId)); + + await cacheStore.clearByRegexp(regexps); + + return { success: true }; + }, + + async purgeNavigationsCache() { + const restCachePlugin = strapi.plugin('rest-cache'); + const cacheStore = restCachePlugin.service('cacheStore'); + + const regex = new RegExp('/api/navigation/render(.*)'); + + await cacheStore.clearByRegexp([regex]); + + return { success: true }; + }, +}); + +export default adminService; diff --git a/server/src/services/admin/index.ts b/server/src/services/admin/index.ts new file mode 100644 index 00000000..42d8fff5 --- /dev/null +++ b/server/src/services/admin/index.ts @@ -0,0 +1,5 @@ +import adminService from './admin'; + +export type { AdminService } from './admin'; + +export default adminService; diff --git a/server/src/services/admin/types.ts b/server/src/services/admin/types.ts new file mode 100644 index 00000000..1d62aeb3 --- /dev/null +++ b/server/src/services/admin/types.ts @@ -0,0 +1,63 @@ +import { + CreateNavigationSchema, + NavigationDBSchema, + NavigationPluginConfigDBSchema, + UpdateNavigationSchema, +} from '../../schemas'; +import { AuditLogContext } from './utils'; + +export interface ConfigInput { + viaSettingsPage?: boolean; +} + +export interface GetInput { + ids?: string[]; + locale?: string; +} + +export interface GetByIdInput { + documentId: string; + locale?: string; +} + +export interface PostInput { + payload: CreateNavigationSchema; + auditLog: AuditLogContext; +} + +export interface PutInput { + payload: UpdateNavigationSchema; + auditLog: AuditLogContext; +} + +export interface DeleteInput { + documentId: string; + auditLog: AuditLogContext; +} + +export interface UpdateConfigInput { + config: NavigationPluginConfigDBSchema; +} + +export interface FillFromOtherLocaleInput { + source: string; + target: string; + documentId: string; + auditLog: AuditLogContext; +} + +export interface I18nNavigationContentsCopyInput { + target: NavigationDBSchema; + source: NavigationDBSchema; +} + +export interface ReadNavigationItemFromLocaleInput { + source: string; + target: string; + path: string; +} + +export interface GetContentTypeItemsInput { + uid: string; + query: Record; +} diff --git a/server/src/services/admin/utils.ts b/server/src/services/admin/utils.ts new file mode 100644 index 00000000..ce0d53c2 --- /dev/null +++ b/server/src/services/admin/utils.ts @@ -0,0 +1,97 @@ +import { Core } from '@strapi/strapi'; +import { CreateBranchNavigationItemDTO, NavigationItemDTO } from '../../dtos'; +import { NavigationDBSchema, configSchema } from '../../schemas'; +import { NavigationAction } from '../../types'; + +export type AuditLogContext = { emit: (e: string, d: AuditLogParams) => void }; +export type AuditLogParams = + | { + actionType: string; + oldEntity: NavigationDBSchema; + newEntity: NavigationDBSchema; + } + | { + actionType: 'DELETE'; + entity: NavigationDBSchema; + }; + +export const sendAuditLog = ( + auditLogInstance: AuditLogContext, + event: string, + data: AuditLogParams +): void => { + if (auditLogInstance && auditLogInstance.emit) { + auditLogInstance.emit(event, data); + } +}; + +export const prepareAuditLog = (actions: NavigationAction[]): string => { + return [ + ...new Set( + actions + .filter((_: unknown) => !!_) + .flatMap(({ remove, create, update }) => { + return [create ? 'CREATE' : '', update ? 'UPDATE' : '', remove ? 'REMOVE' : ''].filter( + (_) => !!_ + ); + }) + ), + ].join('_'); +}; + +type FillCopyContext = { + master: NavigationDBSchema; + strapi: Core.Strapi; + locale: string; + entities: Map; +}; + +export const processItems = + (context: FillCopyContext) => + async (item: CreateBranchNavigationItemDTO): Promise => { + return { + title: item.title, + path: item.path, + audience: item.audience, + type: item.type, + uiRouterKey: item.uiRouterKey, + order: item.order, + collapsed: item.collapsed, + menuAttached: item.menuAttached, + removed: false, + updated: true, + externalPath: item.externalPath, + items: item.items + ? await Promise.all(item.items.map(processItems(context))) + : ([] as CreateBranchNavigationItemDTO[]), + master: context.master, + parent: undefined, + related: item.related, + }; + }; + +export const intercalate = (glue: T, arr: U[]) => + arr.slice(1).reduce>((acc, element) => acc.concat([glue, element]), arr.slice(0, 1)); + +export const getCacheStatus = async ({ + strapi, +}: { + strapi: Core.Strapi; +}): Promise<{ hasCachePlugin: boolean; enabled: boolean }> => { + const cachePlugin: null | any = strapi.plugin('rest-cache'); + const hasCachePlugin = !!cachePlugin; + const pluginStore = strapi.store({ + type: 'plugin', + name: 'navigation', + }); + + const config = configSchema.parse( + await pluginStore.get({ + key: 'config', + }) + ); + + return hasCachePlugin + ? { hasCachePlugin, enabled: !!config.isCacheEnabled } + : { hasCachePlugin, enabled: false }; +}; diff --git a/server/src/services/client/client.ts b/server/src/services/client/client.ts new file mode 100644 index 00000000..045ff2e9 --- /dev/null +++ b/server/src/services/client/client.ts @@ -0,0 +1,510 @@ +import { Core } from '@strapi/strapi'; +import { errors } from '@strapi/utils'; +import { cloneDeep, first, get, isArray, isEmpty, isNil, last, pick } from 'lodash'; +import { NavigationError } from '../../app-errors'; +import { NavigationItemDTO, RFRNavigationItemDTO, RFRPageDTO } from '../../dtos'; +import { getNavigationItemRepository, getNavigationRepository } from '../../repositories'; +import { NavigationItemAdditionalField, NavigationItemCustomField } from '../../schemas'; +import { assertNotEmpty, getPluginService } from '../../utils'; +import { + ReadAllInput, + RenderChildrenInput, + RenderInput, + RenderRFRInput, + RenderRFRNavInput, + RenderRFRPageInput, + RenderTreeInput, + RenderTypeInput, +} from './types'; +import { compareArraysOfNumbers, composeItemTitle, filterByPath } from './utils'; + +export type ClientService = ReturnType; + +const clientService = (context: { strapi: Core.Strapi }) => ({ + async readAll({ locale, orderBy = 'createdAt', orderDirection = 'DESC' }: ReadAllInput) { + const repository = getNavigationRepository(context); + + const navigations = repository.find({ + locale, + orderBy: { [orderBy]: orderDirection }, + }); + + return navigations; + }, + + renderRFRNavigationItem({ item }: RenderRFRNavInput): RFRNavigationItemDTO { + const { uiRouterKey, title, path, type, audience } = item; + + const itemCommon = { + label: title, + type: type, + audience: audience?.map(({ key }) => key), + }; + + if (type === 'WRAPPER') { + return { ...itemCommon }; + } + + if (type === 'EXTERNAL') { + assertNotEmpty( + path, + new NavigationError("External navigation item's path is undefined", item) + ); + + return { + ...itemCommon, + url: path, + }; + } + + if (type === 'INTERNAL') { + return { + ...itemCommon, + page: uiRouterKey, + }; + } + + if (type === 'WRAPPER') { + return { + ...itemCommon, + }; + } + + throw new NavigationError('Unknown item type', item); + }, + + renderRFRPage({ item, parent, enabledCustomFieldsNames }: RenderRFRPageInput): RFRPageDTO { + const { documentId, uiRouterKey, title, path, related, type, audience, menuAttached } = item; + + return { + id: uiRouterKey, + documentId, + title, + related: + type === 'INTERNAL' && related?.documentId && related?.__type + ? { + contentType: related.__type, + documentId: related.documentId, + } + : undefined, + path, + parent, + audience, + menuAttached, + ...enabledCustomFieldsNames.reduce( + (acc, field) => ({ ...acc, [field]: get(item, field) }), + {} + ), + }; + }, + + renderRFR({ + items, + parent, + parentNavItem, + contentTypes = [], + enabledCustomFieldsNames, + }: RenderRFRInput) { + const navItems: RFRNavigationItemDTO[] = []; + + let nav = {}; + let pages = {}; + + items.forEach((item) => { + const { items: itemChildren, ...restOfItem } = item; + + const itemNav = this.renderRFRNavigationItem({ + item: restOfItem, + }); + const itemPage = this.renderRFRPage({ + item: restOfItem, + parent, + enabledCustomFieldsNames, + }); + + if (item.type !== 'EXTERNAL') { + pages = { + ...pages, + [itemPage.documentId]: { + ...itemPage, + }, + }; + } + + if (item.menuAttached) { + navItems.push(itemNav); + } + + if (!parent) { + nav = { + ...nav, + root: navItems, + }; + } else { + const navigationLevel = navItems.filter((navItem) => navItem.type !== 'EXTERNAL'); + + if (!isEmpty(navigationLevel)) + nav = { + ...nav, + [parent]: navigationLevel.concat(parentNavItem ? parentNavItem : []), + }; + } + + if (!isEmpty(itemChildren)) { + const { nav: nestedNavs } = this.renderRFR({ + items: itemChildren ?? [], + parent: itemPage.documentId, + parentNavItem: itemNav, + contentTypes, + enabledCustomFieldsNames, + }); + const { pages: nestedPages } = this.renderRFR({ + items: itemChildren?.filter((child) => child.type !== 'EXTERNAL') || [], + parent: itemPage.documentId, + parentNavItem: itemNav, + contentTypes, + enabledCustomFieldsNames, + }); + pages = { + ...pages, + ...nestedPages, + }; + nav = { + ...nav, + ...nestedNavs, + }; + } + }); + + return { + pages, + nav, + }; + }, + + renderTree({ + items = [], + documentId, + path = '', + itemParser = (i: NavigationItemDTO) => Promise.resolve(i), + }: RenderTreeInput): Promise { + return Promise.all( + items.reduce((acc, item) => { + if (item.parent?.documentId === documentId) { + acc.push(itemParser(cloneDeep(item), path)); + } + + return acc; + }, [] as Promise[]) + ).then((result) => + result.sort((x, y) => { + if (x.order !== undefined && y.order !== undefined) { + return x.order - y.order; + } + + return 0; + }) + ); + }, + + getCustomFields(additionalFields: NavigationItemAdditionalField[]): NavigationItemCustomField[] { + return additionalFields.reduce((acc, field) => { + if (field !== 'audience') { + acc.push(field); + } + + return acc; + }, []); + }, + + async renderType({ + criteria = {}, + filter, + itemCriteria = {}, + locale, + populate, + rootPath, + type = 'FLAT', + wrapRelated, + }: RenderTypeInput) { + const adminService = getPluginService(context, 'admin'); + const commonService = getPluginService(context, 'common'); + const entityWhereClause = { + ...criteria, + visible: true, + }; + + const navigationRepository = getNavigationRepository(context); + const navigationItemRepository = getNavigationItemRepository(context); + + let navigation; + + if (locale) { + navigation = await navigationRepository.find({ + filters: { + ...entityWhereClause, + }, + locale, + limit: 1, + }); + } else { + navigation = await navigationRepository.find({ + filters: entityWhereClause, + limit: 1, + }); + } + + if (isArray(navigation)) { + navigation = first(navigation); + } + + if (navigation && navigation.documentId) { + const navigationItems = await navigationItemRepository.find({ + filters: { + master: pick(navigation, ['slug', 'id']), + ...itemCriteria, + }, + locale, + limit: Number.MAX_SAFE_INTEGER, + order: [{ order: 'asc' }], + populate: ['audience', 'parent', 'related'], + }); + + const mappedItems = await commonService.mapToNavigationItemDTO({ + navigationItems, + populate, + master: navigation, + }); + + const { contentTypes, contentTypesNameFields, additionalFields } = await adminService.config({ + viaSettingsPage: false, + }); + + const enabledCustomFieldsNames = this.getCustomFields(additionalFields).reduce( + (acc, curr) => (curr.enabled ? [...acc, curr.name] : acc), + [] + ); + + const wrapContentType = (itemContentType: any) => + wrapRelated && itemContentType + ? { + documentId: itemContentType.documentId, + ...itemContentType, + } + : itemContentType; + + const mediaFields = ['name', 'url', 'mime', 'width', 'height', 'previewUrl'] as const; + const customFieldsDefinitions = additionalFields.filter( + (_) => typeof _ !== 'string' + ) as NavigationItemCustomField[]; + + const additionalFieldsMapper = (item: NavigationItemDTO) => (acc: {}, field: string) => { + const fieldDefinition = customFieldsDefinitions.find(({ name }) => name === field); + let content = get(item, `additionalFields.${field}`); + + if (content) { + switch (fieldDefinition?.type) { + case 'media': + content = pick(JSON.parse(content as string), mediaFields); + break; + case 'boolean': + content = content === 'true'; + break; + default: + break; + } + } + + return { ...acc, [field]: content }; + }; + + switch (type) { + case 'TREE': + case 'RFR': + const itemParser = async ( + item: NavigationItemDTO, + path = '' + ): Promise => { + const isExternal = item.type === 'EXTERNAL'; + const parentPath = isExternal + ? undefined + : `${path === '/' ? '' : path}/${ + first(item.path) === '/' ? item.path!.substring(1) : item.path + }`; + const slug = + typeof parentPath === 'string' + ? await commonService.getSlug({ + query: (first(parentPath) === '/' + ? parentPath.substring(1) + : parentPath + ).replace(/\//g, '-'), + }) + : undefined; + const lastRelated = isArray(item.related) ? last(item.related) : item.related; + const relatedContentType = wrapContentType(lastRelated); + const customFields = enabledCustomFieldsNames.reduce(additionalFieldsMapper(item), {}); + + return { + id: item.id, + documentId: item.documentId, + title: + composeItemTitle(item, contentTypesNameFields, contentTypes) ?? 'Title missing', + menuAttached: item.menuAttached, + order: item.order, + path: (isExternal ? item.externalPath : parentPath) ?? 'Path is missing', + type: item.type, + uiRouterKey: item.uiRouterKey, + slug: + !slug && item.uiRouterKey + ? await commonService.getSlug({ query: item.uiRouterKey }) + : slug, + related: + isExternal || !lastRelated + ? undefined + : { + ...relatedContentType, + }, + audience: !isEmpty(item.audience) ? item.audience : undefined, + items: isExternal + ? [] + : await this.renderTree({ + itemParser, + path: parentPath, + documentId: item.documentId, + items: mappedItems, + }), + collapsed: item.collapsed, + additionalFields: customFields || {}, + }; + }; + + const { items: itemsFilteredByPath, root: rootElement } = filterByPath( + mappedItems, + rootPath + ); + + const treeStructure = (await this.renderTree({ + itemParser, + items: isNil(rootPath) ? mappedItems : itemsFilteredByPath, + path: rootElement?.parent?.path, + documentId: rootElement?.parent?.documentId, + })) as NavigationItemDTO[]; + + const filteredStructure = filter + ? treeStructure.filter((item: NavigationItemDTO) => item.uiRouterKey === filter) + : treeStructure; + + if (type === 'RFR') { + return this.renderRFR({ + items: filteredStructure, + contentTypes: contentTypes.map((_) => _.contentTypeName), + enabledCustomFieldsNames, + }); + } + return filteredStructure; + default: + const result = isNil(rootPath) ? mappedItems : filterByPath(mappedItems, rootPath).items; + + const defaultCache = new Map>(); + const getNestedOrders = ( + documentId: string, + cache: Map> = defaultCache + ): Array => { + const cached = cache.get(documentId); + if (!isNil(cached)) return cached; + + const item = result.find((item) => item.documentId === documentId); + + if (isNil(item)) return []; + + const { order, parent } = item; + + const nestedOrders = parent + ? getNestedOrders(parent.documentId, cache).concat(order) + : [order]; + + cache.set(documentId, nestedOrders); + + return nestedOrders; + }; + + return result + .map(({ additionalFields, ...item }: NavigationItemDTO) => { + const customFields = enabledCustomFieldsNames.reduce( + additionalFieldsMapper(item), + {} + ); + + return { + ...item, + audience: item.audience?.map((_) => _.key), + title: + composeItemTitle( + { ...item, additionalFields }, + contentTypesNameFields, + contentTypes + ) || '', + related: wrapContentType(item.related), + items: null, + ...customFields, + }; + }) + .sort((a, b) => + compareArraysOfNumbers(getNestedOrders(a.documentId), getNestedOrders(b.documentId)) + ); + } + } + + throw new errors.NotFoundError(); + }, + + renderChildren({ + childUIKey, + idOrSlug, + locale, + menuOnly, + type = 'FLAT', + wrapRelated, + }: RenderChildrenInput) { + const criteria = { $or: [{ documentId: idOrSlug }, { slug: idOrSlug }] }; + const filter = type === 'FLAT' ? undefined : childUIKey; + const itemCriteria = { + ...(menuOnly && { menuAttached: true }), + ...(type === 'FLAT' ? { uiRouterKey: childUIKey } : {}), + }; + + return this.renderType({ + type, + criteria, + itemCriteria, + filter, + wrapRelated, + locale, + }); + }, + + render({ + idOrSlug, + locale, + menuOnly, + populate, + rootPath, + type = 'FLAT', + wrapRelated, + }: RenderInput) { + const criteria = { $or: [{ documentId: idOrSlug }, { slug: idOrSlug }] }; + const itemCriteria = menuOnly ? { menuAttached: true } : {}; + + return this.renderType({ + type, + criteria, + itemCriteria, + rootPath, + wrapRelated, + locale, + populate, + }); + }, +}); + +export default clientService; diff --git a/server/src/services/client/index.ts b/server/src/services/client/index.ts new file mode 100644 index 00000000..2c683177 --- /dev/null +++ b/server/src/services/client/index.ts @@ -0,0 +1,5 @@ +import clientService from './client'; + +export type { ClientService } from './client'; + +export default clientService; diff --git a/server/src/services/client/types.ts b/server/src/services/client/types.ts new file mode 100644 index 00000000..4632329f --- /dev/null +++ b/server/src/services/client/types.ts @@ -0,0 +1,77 @@ +import { NavigationItemDTO, RFRNavigationItemDTO } from '../../dtos'; + +export type RenderType = 'FLAT' | 'TREE' | 'RFR'; + +export type PopulateQueryParam = string | boolean | string[]; + +export type NestedPath = { + id?: number; + documentId?: string; + parent?: { + id: number; + documentId: string; + path: string; + }; + path: string; +}; + +export interface ReadAllInput { + orderBy?: string; + orderDirection?: 'DESC' | 'ASC'; + locale?: string; +} + +export interface RenderRFRInput { + items: NavigationItemDTO[]; + parent?: string; + parentNavItem?: RFRNavigationItemDTO; + contentTypes: string[]; + enabledCustomFieldsNames: string[]; +} + +export interface RenderRFRNavInput { + item: Pick; +} + +export interface RenderRFRPageInput { + item: Omit; + parent?: string; + enabledCustomFieldsNames: string[]; +} + +export interface RenderTreeInput { + items?: NavigationItemDTO[]; + documentId?: string; + path: string | undefined; + itemParser: (_: NavigationItemDTO, path: string) => Promise; +} + +export interface RenderTypeInput { + type?: RenderType; + criteria?: Record; + itemCriteria?: Record; + filter?: string; + rootPath?: string; + wrapRelated?: boolean; + populate?: PopulateQueryParam; + locale?: string; +} + +export interface RenderChildrenInput { + idOrSlug: number | string; + childUIKey: string; + type?: RenderType; + menuOnly?: boolean; + wrapRelated?: boolean; + locale?: string; +} + +export interface RenderInput { + idOrSlug: string | number; + type?: RenderType; + menuOnly?: boolean; + rootPath?: string; + wrapRelated?: boolean; + populate?: PopulateQueryParam; + locale?: string; +} diff --git a/server/src/services/client/utils.ts b/server/src/services/client/utils.ts new file mode 100644 index 00000000..21bf6d54 --- /dev/null +++ b/server/src/services/client/utils.ts @@ -0,0 +1,98 @@ +import { find, get, isArray, isEmpty, isNil, isString, last, zipWith } from 'lodash'; +import { NavigationItemDTO } from '../../dtos'; +import { StrapiContentTypeFullSchema } from '../../types'; +import { NestedPath } from './types'; + +export const composeItemTitle = ( + item: NavigationItemDTO, + fields: Record = {}, + contentTypes: StrapiContentTypeFullSchema[] = [] +): string | undefined => { + const { title, related } = item; + const lastRelated = isArray(related) ? last(related) : related; + + if (title) { + return isString(title) && !isEmpty(title) ? title : undefined; + } else if (lastRelated) { + const relationTitle = extractItemRelationTitle(lastRelated, fields, contentTypes); + return isString(relationTitle) && !isEmpty(relationTitle) ? relationTitle : undefined; + } + return undefined; +}; + +export const extractItemRelationTitle = ( + relatedItem: any, + fields: Record = {}, + contentTypes: StrapiContentTypeFullSchema[] = [] +) => { + const { __contentType } = relatedItem; + const contentType = find(contentTypes, (_) => _.contentTypeName === __contentType); + const { default: defaultFields = [] } = fields; + + return ( + get(fields, `${contentType ? contentType.collectionName : ''}`, defaultFields) + .map((_) => relatedItem[_]) + .filter((_) => _)[0] || '' + ); +}; + +export const filterByPath = >( + items: T[], + path?: string +): { root?: NestedPath; items: T[] } => { + const parsedItems = buildNestedPaths(items); + const itemsWithPaths = path + ? parsedItems.filter(({ path: itemPath }) => itemPath.includes(path)) + : parsedItems; + const root = itemsWithPaths.find(({ path: itemPath }) => itemPath === path); + + return { + root, + items: isNil(root) ? [] : items.filter(({ documentId }) => itemsWithPaths.find((v) => v.documentId === documentId)), + }; +}; + +export const buildNestedPaths = >( + items: T[], + documentId?: string, + parentPath: string | null = null +): NestedPath[] => { + return items + .filter((entity) => { + let data: NavigationItemDTO | undefined | null = entity.parent; + + if (!data == null && !documentId) { + return true; + } + + return entity.parent?.documentId === documentId; + }) + .reduce((acc, entity): NestedPath[] => { + const path = `${parentPath || ''}/${entity.path}`.replace('//', '/'); + + return [ + { + documentId: entity.documentId, + parent: parentPath && entity.parent?.documentId + ? { + id: entity.parent?.id, + documentId: entity.parent?.documentId, + path: parentPath, + } + : undefined, + path, + }, + ...buildNestedPaths(items, entity.documentId, path), + ...acc, + ]; + }, []); +}; + +export const compareArraysOfNumbers = (arrA: number[], arrB: number[]) => { + const diff = zipWith(arrA, arrB, (a, b) => { + if (isNil(a)) return -1; + if (isNil(b)) return 1; + return a - b; + }); + return find(diff, (a) => a !== 0) || 0; +}; diff --git a/server/src/services/common/common.ts b/server/src/services/common/common.ts new file mode 100644 index 00000000..5e601399 --- /dev/null +++ b/server/src/services/common/common.ts @@ -0,0 +1,415 @@ +import type { Core } from '@strapi/strapi'; + +import { sanitize } from '@strapi/utils'; + +import slugify from '@sindresorhus/slugify'; + +import { omit } from 'lodash'; + +import { configSetup } from '../../config'; +import { CreateBranchNavigationItemDTO, NavigationItemDTO } from '../../dtos'; +import { getNavigationItemRepository } from '../../repositories'; +import { + NavigationItemCustomField, + NavigationItemDBSchema, + NavigationItemsDBSchema, + NavigationPluginConfigDBSchema, +} from '../../schemas'; +import { + ContentType, + NavigationAction, + NavigationActionsCategories, + NavigationActionsPerItem, +} from '../../types'; +import { + AnalyzeBranchInput, + BuildNestedStructureInput, + CreateBranchInput, + EmitEventInput, + GetBranchNameInput, + GetSlugInput, + LifecycleHookRecord, + MapToNavigationItemDTOInput, + RegisterLifeCycleHookInput, + RemoveBranchInput, + RunLifeCycleHookInput, + UpdateBranchInput, +} from './types'; +import { DuplicateCheckItem, checkDuplicatePath } from './utils'; + +export type CommonService = ReturnType; + +const lifecycleHookListeners: Record = { + navigation: {}, + 'navigation-item': {}, +}; + +const commonService = (context: { strapi: Core.Strapi }) => ({ + async getPluginStore(): Promise> { + return await strapi.store({ type: 'plugin', name: 'navigation' }); + }, + + async mapToNavigationItemDTO({ + navigationItems, + populate, + master, + parent, + }: MapToNavigationItemDTOInput): Promise { + const result: NavigationItemDTO[] = []; + + for (const navigationItem of navigationItems) { + const { items = [], ...base } = navigationItem; + + result.push({ + ...base, + parent: parent ?? base.parent, + items: await this.mapToNavigationItemDTO({ + navigationItems: items, + populate, + master, + parent: base as NavigationItemDTO, + }), + } as NavigationItemDTO); + } + + return result; + }, + + setDefaultConfig(): Promise { + return configSetup({ strapi }); + }, + + getBranchName({ item }: GetBranchNameInput): NavigationActionsCategories | void { + const hasId = !!item.documentId; + const toRemove = item.removed; + + if (hasId && !toRemove) { + return 'toUpdate'; + } + + if (hasId && toRemove) { + return 'toRemove'; + } + + if (!hasId && !toRemove) { + return 'toCreate'; + } + }, + + async analyzeBranch({ + masterEntity, + navigationItems = [], + parentItem, + prevAction = {}, + }: AnalyzeBranchInput): Promise { + const { toCreate, toRemove, toUpdate } = navigationItems.reduce( + (acc, navigationItem) => { + const branchName: keyof NavigationActionsPerItem | void = this.getBranchName({ + item: navigationItem, + }); + + return branchName ? { ...acc, [branchName]: [...acc[branchName], navigationItem] } : acc; + }, + { + toRemove: [] as NavigationItemsDBSchema, + toCreate: [] as CreateBranchNavigationItemDTO[], + toUpdate: [] as NavigationItemsDBSchema, + } + ); + + const action = { + create: prevAction.create || toCreate.length > 0, + update: prevAction.update || toUpdate.length > 0, + remove: prevAction.remove || toRemove.length > 0, + }; + + const checkData: DuplicateCheckItem[] = [...toCreate, ...toUpdate]; + + await checkDuplicatePath({ + checkData, + parentItem, + }); + + return Promise.all([ + this.createBranch({ + action, + masterEntity, + navigationItems: toCreate, + parentItem, + }), + this.removeBranch({ + navigationItems: toRemove, + action, + }), + this.updateBranch({ + action, + masterEntity, + navigationItems: toUpdate, + parentItem, + }), + ]).then(([a, b, c]) => [...a, ...b, ...c]); + }, + + async removeBranch({ + navigationItems = [], + action = {}, + }: RemoveBranchInput): Promise { + const navigationActions: NavigationAction[] = []; + + for (const navigationItem of navigationItems) { + if (!navigationItem.documentId) { + continue; + } + action.remove = true; + + await getNavigationItemRepository(context).remove(navigationItem); + + navigationActions.push(action); + + if (!!navigationItem.items?.length) { + const innerResult = await this.removeBranch({ + navigationItems: navigationItem.items, + }); + + innerResult.forEach((_) => { + navigationActions.push(_); + }); + } + } + + return navigationActions; + }, + + async createBranch({ + action, + masterEntity, + navigationItems, + parentItem, + }: CreateBranchInput): Promise { + let navigationActions: NavigationAction[] = []; + + for (const navigationItem of navigationItems) { + action.create = true; + + const { parent, master, items, documentId, id, ...params } = navigationItem; + + const insertDetails = + documentId && id + ? { + ...params, + documentId, + id, + master: masterEntity ? masterEntity.id : undefined, + parent: parentItem ? parentItem.id : undefined, + } + : { + ...params, + documentId: undefined, + id: undefined, + master: masterEntity ? masterEntity.id : undefined, + parent: parentItem ? parentItem.id : undefined, + }; + + const nextParentItem = await getNavigationItemRepository(context).save({ + item: insertDetails as any, + locale: masterEntity?.locale, + }); + + if (!!navigationItem.items?.length) { + const innerActions = await this.createBranch({ + action: {}, + masterEntity, + navigationItems: navigationItem.items, + parentItem: nextParentItem as NavigationItemDBSchema, + }); + + navigationActions = navigationActions.concat(innerActions).concat([action]); + } else { + navigationActions.push(action); + } + } + + return navigationActions; + }, + + async updateBranch({ + masterEntity, + navigationItems, + action, + parentItem, + }: UpdateBranchInput): Promise { + const result: NavigationAction[] = []; + + for (const updateDetails of navigationItems) { + action.update = true; + + const { documentId, updated, parent, master, items, ...params } = updateDetails; + + let currentItem; + + if (updated) { + currentItem = await getNavigationItemRepository(context).save({ + item: { + documentId, + ...params, + }, + locale: masterEntity?.locale, + }); + } else { + currentItem = updateDetails; + } + + if (!!items?.length) { + const innerResult = await this.analyzeBranch({ + navigationItems: items, + prevAction: {}, + masterEntity, + parentItem: currentItem as NavigationItemDBSchema, + }); + + innerResult.forEach((_) => { + result.push(_); + }); + } else { + result.push(action); + } + } + + return result; + }, + + async emitEvent({ entity, event, uid }: EmitEventInput) { + // TODO: This could be enhanced by reacting not only with webhook but by firing all listeners in Navigation Event Hub + // Any developer could register new listener for any event in Navigation Plugin + // For now there is only one event 'navigation.update' so implementing Event hub is not valid. + const model: any = strapi.getModel(uid); + const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput( + { + ...model, + schema: model.__schema__, + getModel: () => model, + }, + entity + ); + + if ((strapi as any).webhookRunner) { + (strapi as any).webhookRunner.eventHub.emit(event, { + model: model.modelName, + entry: sanitizedEntity, + }); + } else { + console.warn('Webhook runner not present. Contact with Strapi Navigation Plugin team.'); + } + }, + + async pruneCustomFields({ removedFields }: { removedFields: NavigationItemCustomField[] }) { + const removedFieldsKeys = removedFields.map(({ name }) => `additionalFields.${name}`); + const removedFieldsNames = removedFields.map(({ name }) => name); + + const navigationItems = await getNavigationItemRepository(context).find({ + filters: { + additionalFields: { + $contains: [removedFieldsNames], + }, + }, + }); + + const navigationItemsToUpdate = navigationItems.map( + (navigationItem) => + omit(navigationItem, removedFieldsKeys) as unknown as NavigationItemDBSchema + ); + + for (const item of navigationItemsToUpdate) { + await getNavigationItemRepository(context).save({ + item: { + documentId: item.documentId, + additionalFields: item.additionalFields, + }, + }); + } + }, + + async getSlug({ query }: GetSlugInput) { + let slug = slugify(query); + + if (slug) { + const existingItems = await getNavigationItemRepository(context).count({ + $or: [ + { + uiRouterKey: { + $startsWith: slug, + }, + }, + { uiRouterKey: slug }, + ], + }); + + if (existingItems) { + slug = `${slug}-${existingItems}`; + } + } + + return slug.toLowerCase(); + }, + + registerLifeCycleHook({ callback, contentTypeName, hookName }: RegisterLifeCycleHookInput) { + if (!lifecycleHookListeners[contentTypeName][hookName]) { + lifecycleHookListeners[contentTypeName][hookName] = []; + } + + lifecycleHookListeners[contentTypeName][hookName]?.push(callback); + }, + + async runLifeCycleHook({ contentTypeName, event, hookName }: RunLifeCycleHookInput) { + const hookListeners = lifecycleHookListeners[contentTypeName][hookName] ?? []; + + for (const listener of hookListeners) { + await listener(event); + } + }, + + buildNestedStructure({ + navigationItems, + id, + }: BuildNestedStructureInput): NavigationItemDBSchema[] { + return ( + navigationItems?.reduce((acc, navigationItem) => { + if (id && navigationItem.parent?.id !== id) { + return acc; + } + + acc.push({ + ...omit(navigationItem, ['related', 'items']), + related: navigationItem.related, + items: this.buildNestedStructure({ + navigationItems, + id: navigationItem.id, + }), + }); + + return acc; + }, [] as NavigationItemDBSchema[]) ?? [] + ); + }, + + async readLocale() { + const localeService = strapi.plugin('i18n').service('locales'); + + let defaultLocale: string = await localeService.getDefaultLocale(); + let restLocale: string[] = (await localeService.find({})) + .map(({ code }: { code: string }) => code) + .filter((code: string) => code !== defaultLocale); + + if (!defaultLocale) { + defaultLocale = restLocale[0]; + restLocale = restLocale.slice(1); + } + + return { + defaultLocale, + restLocale, + }; + }, +}); + +export default commonService; diff --git a/server/src/services/common/index.ts b/server/src/services/common/index.ts new file mode 100644 index 00000000..02e92a10 --- /dev/null +++ b/server/src/services/common/index.ts @@ -0,0 +1,5 @@ +import commonService from './common'; + +export type { CommonService } from './common'; + +export default commonService; diff --git a/server/src/services/common/types.ts b/server/src/services/common/types.ts new file mode 100644 index 00000000..459c75ef --- /dev/null +++ b/server/src/services/common/types.ts @@ -0,0 +1,87 @@ +import { UID } from '@strapi/strapi'; +import { CreateBranchNavigationItemDTO, NavigationDTO, NavigationItemDTO } from '../../dtos'; +import { NavigationDBSchema, NavigationItemDBSchema, NavigationItemsDBSchema } from '../../schemas'; +import { + ContentType, + Effect, + LifeCycleEvent, + LifeCycleHookName, + NavigationAction, +} from '../../types'; + +export type LifecycleHookRecord = Partial>>>; + +export interface RegisterLifeCycleHookInput { + hookName: LifeCycleHookName; + callback: Effect; + contentTypeName: ContentType; +} + +export interface RunLifeCycleHookInput { + contentTypeName: ContentType; + event: LifeCycleEvent; + hookName: LifeCycleHookName; +} + +export interface MapToNavigationItemDTOInput { + navigationItems: NavigationItemDBSchema[]; + populate: unknown; + master?: Omit; + parent?: NavigationItemDTO; +} + +export interface CreateBranchInput { + navigationItems: CreateBranchNavigationItemDTO[]; + masterEntity: NavigationDBSchema | undefined; + parentItem: NavigationItemDBSchema | undefined; + action: NavigationAction; +} + +export interface RemoveBranchInput { + navigationItems?: NavigationItemsDBSchema; + action?: NavigationAction; +} + +export interface UpdateBranchInput { + navigationItems: NavigationItemsDBSchema & + { + updated?: boolean; + }[]; + masterEntity: NavigationDBSchema | undefined; + parentItem: NavigationItemDBSchema | undefined; + action: NavigationAction; +} + +export interface AnalyzeBranchInput { + navigationItems: (Omit & { + removed?: boolean; + id?: number; + documentId?: string; + })[]; + masterEntity?: NavigationDBSchema; + parentItem?: NavigationItemDBSchema; + prevAction: NavigationAction; +} + +export interface EmitEventInput { + uid: UID.Schema; + event: TEvent; + entity: TEntity; +} + +export interface GetBranchNameInput { + item: Omit & { + removed?: boolean; + documentId?: string; + id?: number; + }; +} + +export interface BuildNestedStructureInput { + navigationItems?: NavigationItemDBSchema[]; + id?: number; +} + +export interface GetSlugInput { + query: string; +} diff --git a/server/src/services/common/utils.ts b/server/src/services/common/utils.ts new file mode 100644 index 00000000..91a7f87d --- /dev/null +++ b/server/src/services/common/utils.ts @@ -0,0 +1,42 @@ +import { NavigationError } from '../../app-errors'; +import { NavigationItemType } from '../../schemas'; + +export interface DuplicateCheckItem { + items?: DuplicateCheckItem[]; + id?: number; + title: string; + path?: string | null; + type: NavigationItemType; +} + +export const checkDuplicatePath = ({ + checkData, + parentItem, +}: { + parentItem?: DuplicateCheckItem; + checkData: DuplicateCheckItem[]; +}): Promise => { + return new Promise((resolve, reject) => { + if (parentItem && parentItem.items) { + for (let item of checkData) { + for (let _ of parentItem.items) { + if (_.path === item.path && _.id !== item.id && item.type === 'INTERNAL') { + return reject( + new NavigationError( + `Duplicate path:${item.path} in parent: ${parentItem.title || 'root'} for ${item.title} and ${_.title} items`, + { + parentTitle: parentItem.title, + parentId: parentItem.id, + path: item.path, + errorTitles: [item.title, _.title], + } + ) + ); + } + } + } + } + + return resolve(); + }); +}; diff --git a/server/src/services/index.ts b/server/src/services/index.ts new file mode 100644 index 00000000..fee5d0a5 --- /dev/null +++ b/server/src/services/index.ts @@ -0,0 +1,16 @@ +import admin from './admin'; +import client from './client'; +import common from './common'; +import migrate from './migration'; + +export type { AdminService } from './admin'; +export type { ClientService } from './client'; +export type { CommonService } from './common'; +export type { MigrationService } from './migration'; + +export default { + admin, + common, + client, + migrate, +}; diff --git a/server/src/services/migration/index.ts b/server/src/services/migration/index.ts new file mode 100644 index 00000000..e8c49c92 --- /dev/null +++ b/server/src/services/migration/index.ts @@ -0,0 +1,5 @@ +import migrationService from './migration'; + +export type { MigrationService } from './migration'; + +export default migrationService; diff --git a/server/src/services/migration/migration.ts b/server/src/services/migration/migration.ts new file mode 100644 index 00000000..6fdf621d --- /dev/null +++ b/server/src/services/migration/migration.ts @@ -0,0 +1,47 @@ +import { Core, UID } from '@strapi/strapi'; +import { isNaN } from 'lodash'; +import { getNavigationItemRepository } from '../../repositories'; +import { RELATED_ITEM_SEPARATOR } from '../../utils'; + +export type MigrationService = ReturnType; + +const migrationService = (context: { strapi: Core.Strapi }) => ({ + async migrateRelatedIdToDocumentId(): Promise { + console.log('Navigation plugin :: Migrations :: Relared id to document id - START'); + + const navigationItemRepository = getNavigationItemRepository(context); + const all = await navigationItemRepository.find({ + filters: {}, + limit: Number.MAX_SAFE_INTEGER, + }); + + await Promise.all( + all.map(async (item) => { + const related: string | unknown = item.related; + + if (related && typeof related === 'string') { + const [__type, id] = related.split(RELATED_ITEM_SEPARATOR); + + if (!isNaN(parseInt(id, 10))) { + const relatedItem = await context.strapi + .query(__type as UID.Schema) + .findOne({ where: { id } }); + + if (relatedItem) { + await navigationItemRepository.save({ + item: { + documentId: item.documentId, + related: { __type, documentId: relatedItem.documentId }, + }, + }); + } + } + } + }) + ); + + console.log('Navigation plugin :: Migrations :: Relared id to document id - DONE'); + }, +}); + +export default migrationService; diff --git a/server/src/types.ts b/server/src/types.ts new file mode 100644 index 00000000..bc0a006a --- /dev/null +++ b/server/src/types.ts @@ -0,0 +1,73 @@ +import { NavigationItemDBSchema } from './schemas'; + +export type PluginConfigNameFields = Record; +export type PluginConfigPopulate = Record; +export type PluginConfigPathDefaultFields = Record; + +export type NavigationItemCustomFieldType = 'boolean' | 'string' | 'select' | 'media'; +export type NavigationItemAdditionalFieldValues = Record; + +export type PluginConfigGraphQL = { + navigationItemRelated: string[]; +}; + +export type ContentType = 'navigation' | 'navigation-item'; + +export type LifeCycleHookName = + | 'beforeCreate' + | 'beforeCreateMany' + | 'afterCreate' + | 'afterCreateMany' + | 'beforeUpdate' + | 'beforeUpdateMany' + | 'afterUpdate' + | 'afterUpdateMany' + | 'beforeDelete' + | 'beforeDeleteMany' + | 'afterDelete' + | 'afterDeleteMany' + | 'beforeCount' + | 'afterCount' + | 'beforeFindOne' + | 'afterFindOne' + | 'beforeFindMany' + | 'afterFindMany'; + +export interface LifeCycleEvent< + THookName extends LifeCycleHookName = LifeCycleHookName, + TResult = unknown, + TParams = Record, +> { + action: THookName; + model: { + singularName: string; + uid: string; + tableName: string; + attributes: Record; + lifecycles: Partial>>; + indexes: Array<{ + type?: string; + name: string; + columns: string[]; + }>; + columnToAttribute: Record; + }; + state: Record; + params: TParams; + result?: TResult | TResult[]; +} + +export type Effect = (value: T) => void; +export type VoidEffect = Effect; + +export type StrapiContentTypeFullSchema = any; + +export type NavigationAction = { + create?: boolean; + update?: boolean; + remove?: boolean; +}; + +export type NavigationActionsCategories = 'toCreate' | 'toUpdate' | 'toRemove'; + +export type NavigationActionsPerItem = Record; diff --git a/server/src/utils/constants.ts b/server/src/utils/constants.ts new file mode 100644 index 00000000..ff46df9f --- /dev/null +++ b/server/src/utils/constants.ts @@ -0,0 +1,59 @@ +import { LifeCycleHookName } from '../types'; + +export const UID_REGEX = + /^(?[a-z0-9-]+)\:{2}(?[a-z0-9-]+)\.{1}(?[a-z0-9-]+)$/i; + +export const allLifecycleHooks: ReadonlyArray = [ + 'beforeCreate', + 'beforeCreateMany', + 'afterCreate', + 'afterCreateMany', + 'beforeUpdate', + 'beforeUpdateMany', + 'afterUpdate', + 'afterUpdateMany', + 'beforeDelete', + 'beforeDeleteMany', + 'afterDelete', + 'afterDeleteMany', + 'beforeCount', + 'afterCount', + 'beforeFindOne', + 'afterFindOne', + 'beforeFindMany', + 'afterFindMany', +] as const; + +export const RELATED_ITEM_SEPARATOR = '$'; + +export const ALLOWED_CONTENT_TYPES = ['api::', 'plugin::'] as const; +export const RESTRICTED_CONTENT_TYPES = [ + 'admin::', + 'plugin::content-releases', + 'plugin::i18n.locale', + 'plugin::navigation', + 'plugin::review-workflows', + 'plugin::users-permissions', + 'plugin::upload.folder' +] as const; +export const CONTENT_TYPES_NAME_FIELDS_DEFAULTS = ['title', 'subject', 'name']; + +export const KIND_TYPES = { SINGLE: 'singleType', COLLECTION: 'collectionType' } as const; + +export const DEFAULT_POPULATE = []; + +export const FORBIDDEN_CUSTOM_FIELD_NAMES = [ + 'title', + 'type', + 'path', + 'externalPath', + 'uiRouterKey', + 'menuAttached', + 'order', + 'collapsed', + 'related', + 'parent', + 'master', + 'audience', + 'additionalFields', +]; diff --git a/server/src/utils/functions.ts b/server/src/utils/functions.ts new file mode 100644 index 00000000..e93af67c --- /dev/null +++ b/server/src/utils/functions.ts @@ -0,0 +1,164 @@ +import { Core } from '@strapi/strapi'; +import { capitalize, find, includes, isNil, last, uniqBy } from 'lodash'; +import { + NavigationItemAdditionalField, + NavigationPluginConfigDBSchema, + configSchema, +} from '../schemas'; +import { AdminService, ClientService, CommonService } from '../services'; +import { + ContentType, + Effect, + LifeCycleEvent, + LifeCycleHookName, + StrapiContentTypeFullSchema, +} from '../types'; +import { + ALLOWED_CONTENT_TYPES, + FORBIDDEN_CUSTOM_FIELD_NAMES, + RESTRICTED_CONTENT_TYPES, + UID_REGEX, + allLifecycleHooks, +} from './constants'; + +type ServiceTypeMap = { + common: CommonService; + admin: AdminService; + client: ClientService; +}; + +export const getCustomFields = ( + additionalFields: NavigationItemAdditionalField[] +): NavigationItemAdditionalField[] => additionalFields.filter((field) => field !== 'audience'); + +export const validateAdditionalFields = (additionalFields: NavigationItemAdditionalField[]) => { + const customFields = getCustomFields(additionalFields); + + if (customFields.length !== uniqBy(customFields, 'name').length) { + throw new Error('All names of custom fields must be unique.'); + } + + if ( + !isNil( + find( + customFields, + (field) => typeof field === 'object' && includes(FORBIDDEN_CUSTOM_FIELD_NAMES, field.name) + ) + ) + ) { + throw new Error( + `Name of custom field cannot be one of: ${FORBIDDEN_CUSTOM_FIELD_NAMES.join(', ')}` + ); + } +}; + +export const assertNotEmpty: ( + value: T | null | undefined, + customError?: Error +) => asserts value is T = (value, customError) => { + if (value !== undefined && value !== null) { + return; + } + + throw customError ?? new Error('Non-empty value expected, empty given'); +}; + +export const resolveGlobalLikeId = (uid = '') => { + const parse = (str: string) => + str + .split('-') + .map((_) => capitalize(_)) + .join(''); + + const [type, scope, contentTypeName] = splitTypeUid(uid); + + if (type === 'api') { + return parse(contentTypeName); + } + + return `${parse(scope)}${parse(contentTypeName)}`; +}; + +const splitTypeUid = (uid = '') => { + return uid.split(UID_REGEX).filter((s) => s && s.length > 0); +}; + +export function assertConfig(config: unknown): asserts config is NavigationPluginConfigDBSchema { + if (configSchema.safeParse(config).success) { + return; + } + + throw new Error('Navigation plugin schema invalid'); +} + +export const buildHookListener = + (contentTypeName: ContentType, context: { strapi: Core.Strapi }) => + (hookName: LifeCycleHookName): [LifeCycleHookName, Effect] => [ + hookName, + async (event) => { + await getPluginService(context, 'common').runLifeCycleHook({ + contentTypeName, + hookName, + event, + }); + }, + ]; + +export const buildAllHookListeners = ( + contentTypeName: ContentType, + context: { strapi: Core.Strapi } +): Record> => + Object.fromEntries(allLifecycleHooks.map(buildHookListener(contentTypeName, context))); + +export const getPluginModels = ({ + strapi, +}: { + strapi: Core.Strapi; +}): Record< + 'masterModel' | 'itemModel' | 'relatedModel' | 'audienceModel', + StrapiContentTypeFullSchema +> => { + const plugin = strapi.plugin('navigation'); + + return { + masterModel: plugin.contentType('navigation'), + itemModel: plugin.contentType('navigation-item'), + relatedModel: plugin.contentType('navigations-items-related'), + audienceModel: plugin.contentType('audience'), + }; +}; + +export function getPluginService( + { strapi }: { strapi: Core.Strapi }, + name: TName +) { + return strapi.plugin('navigation').service(name) as TName extends infer TKey extends + keyof ServiceTypeMap + ? ServiceTypeMap[TKey] + : never; +} + +export const parsePopulateQuery = (populate: any) => { + if (populate === '*') { + return '*'; + } else if (typeof populate === 'string') { + return [populate]; + } else if (populate === false) { + return []; + } else if (populate === true) { + return '*'; + } else { + return populate; + } +}; + +export const isContentTypeEligible = (uid = '') => { + const isOneOfAllowedType = !!ALLOWED_CONTENT_TYPES.find((_) => uid.includes(_)); + const isNoneOfRestricted = !RESTRICTED_CONTENT_TYPES.find((_) => uid.includes(_) || uid === _); + + return !!uid && isOneOfAllowedType && isNoneOfRestricted; +}; + +export const singularize = (value = '') => { + return last(value) === 's' ? value.substr(0, value.length - 1) : value; +}; diff --git a/server/utils/index.ts b/server/src/utils/index.ts similarity index 50% rename from server/utils/index.ts rename to server/src/utils/index.ts index e2b2212b..f203a170 100644 --- a/server/utils/index.ts +++ b/server/src/utils/index.ts @@ -1,2 +1,2 @@ +export * from './constants'; export * from './functions'; -export * from './constant'; diff --git a/server/tests/config/setup.test.ts b/server/tests/config/setup.test.ts new file mode 100644 index 00000000..fd459dca --- /dev/null +++ b/server/tests/config/setup.test.ts @@ -0,0 +1,169 @@ +import { faker } from '@faker-js/faker'; +import { Core } from '@strapi/strapi'; +import { ZodError } from 'zod'; + +import { configSetup } from '../../src/config'; + +describe('Navigation', () => { + describe('Server', () => { + describe('Config', () => { + describe('setup()', () => { + // Given + const setStore = jest.fn(); + const getStore = jest.fn(); + const getFromConfig = jest.fn(); + const getContentTypes = jest.fn(); + const strapi: Core.Strapi = { + get contentTypes() { + return getContentTypes(); + }, + store() { + return { + get: getStore, + set: setStore, + }; + }, + plugin() { + return { + config: getFromConfig, + }; + }, + } as unknown as Core.Strapi; + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should read all from default plugin config when nothing is present in database', async () => { + // Given + getStore.mockReturnValue({}); + getFromConfig.mockReturnValue({}); + getContentTypes.mockReturnValue({}); + + // When + const result = await configSetup({ strapi }); + + // Then + expect(result).toEqual({ + additionalFields: expect.any(Array), + allowedLevels: expect.any(Number), + cascadeMenuAttached: expect.any(Boolean), + contentTypes: expect.any(Array), + contentTypesNameFields: expect.any(Object), + contentTypesPopulate: expect.any(Object), + gql: expect.objectContaining({ + navigationItemRelated: expect.any(Array), + }), + isCacheEnabled: expect.any(Boolean), + pathDefaultFields: expect.any(Object), + preferCustomContentTypes: false, + }); + }); + + it('should provide schema validation', async () => { + // Given + getStore.mockReturnValue({ + allowedLevels: faker.string.alphanumeric(), + }); + getFromConfig.mockReturnValue({}); + getContentTypes.mockReturnValue({}); + + // Then + await expect(async () => { + await configSetup({ strapi }); + }).rejects.toThrow(ZodError); + }); + + it('should should use values from database over default ones', async () => { + // Given + const allowedLevels = faker.number.int({ + min: 99, + max: 200, + }); + + getStore.mockReturnValue({ + allowedLevels, + }); + getFromConfig.mockReturnValue({}); + getContentTypes.mockReturnValue({}); + + // When + const result = await configSetup({ strapi }); + + // Then + expect(result).toHaveProperty('allowedLevels', allowedLevels); + }); + + // TODO: check validity of this test + it.todo('should alert where no value is available in either of sources'); + + it('should cleanup deleted content types', async () => { + // Given + const allContentTypes = [ + faker.string.alpha({ + length: 10, + }), + faker.string.alpha({ + length: 10, + }), + faker.string.alpha({ + length: 10, + }), + ].map((contentType) => `api::${contentType}.${contentType}`); + const deletedContentType = faker.helpers.arrayElement(allContentTypes); + + getContentTypes.mockReturnValue( + Object.fromEntries( + allContentTypes + .filter((contentType) => contentType !== deletedContentType) + .map((contentType) => [contentType, {}]) + ) + ); + + getStore.mockReturnValue({ + contentTypes: allContentTypes, + }); + getFromConfig.mockReturnValue({}); + + // When + const result = await configSetup({ strapi }); + + // Then + expect(result.contentTypes).not.toContain(deletedContentType); + }); + + // TODO: test `validateAdditionalFields` + it.todo('should check if custom fields config is valid'); + + it('should save configuration details in database', async () => { + // Given + const allowedLevels = faker.number.int({ + min: 99, + max: 200, + }); + const cascadeMenuAttached = faker.datatype.boolean(); + const preferCustomContentTypes = faker.datatype.boolean(); + const isCacheEnabled = faker.datatype.boolean(); + + getStore.mockReturnValue({ + allowedLevels, + cascadeMenuAttached, + preferCustomContentTypes, + isCacheEnabled, + }); + getFromConfig.mockReturnValue({}); + getContentTypes.mockReturnValue({}); + + // When + const result = await configSetup({ strapi }); + + // Then + expect(setStore).toHaveBeenCalledWith({ + key: 'config', + value: result, + }); + }); + }); + }); + }); +}); diff --git a/server/tests/content-types/audience.test.ts b/server/tests/content-types/audience.test.ts new file mode 100644 index 00000000..5935ad83 --- /dev/null +++ b/server/tests/content-types/audience.test.ts @@ -0,0 +1,38 @@ +import audience from '../../src/content-types/audience/schema'; + +describe('Navigation', () => { + describe('Server', () => { + describe('Content types', () => { + describe('Audience', () => { + it('should provide valid content type', () => { + // Then + expect(audience).toMatchInlineSnapshot(` +{ + "attributes": { + "key": { + "targetField": "name", + "type": "uid", + }, + "name": { + "required": true, + "type": "string", + }, + }, + "collectionName": "audience", + "info": { + "displayName": "Audience", + "name": "audience", + "pluralName": "audiences", + "singularName": "audience", + }, + "options": { + "comment": "Audience", + "increments": true, + }, +} +`); + }); + }); + }); + }); +}); diff --git a/server/tests/content-types/navigation-item.test.ts b/server/tests/content-types/navigation-item.test.ts new file mode 100644 index 00000000..2f271bdf --- /dev/null +++ b/server/tests/content-types/navigation-item.test.ts @@ -0,0 +1,152 @@ +import navigationItemLifecycles from '../../src/content-types/navigation-item/lifecycles'; +import navigationItem from '../../src/content-types/navigation-item/schema'; + +describe('Navigation', () => { + describe('Server', () => { + describe('Content types', () => { + describe('Navigation', () => { + it('should provide valid content type', () => { + // Then + expect(navigationItem).toMatchInlineSnapshot(` +{ + "attributes": { + "additionalFields": { + "default": {}, + "require": false, + "type": "json", + }, + "audience": { + "relation": "oneToMany", + "target": "plugin::navigation.audience", + "type": "relation", + }, + "autoSync": { + "configurable": false, + "default": true, + "type": "boolean", + }, + "collapsed": { + "configurable": false, + "default": false, + "type": "boolean", + }, + "externalPath": { + "configurable": false, + "type": "text", + }, + "master": { + "configurable": false, + "inversedBy": "items", + "relation": "manyToOne", + "target": "plugin::navigation.navigation", + "type": "relation", + }, + "menuAttached": { + "configurable": false, + "default": false, + "type": "boolean", + }, + "order": { + "configurable": false, + "default": 0, + "type": "integer", + }, + "parent": { + "configurable": false, + "default": null, + "relation": "oneToOne", + "target": "plugin::navigation.navigation-item", + "type": "relation", + }, + "path": { + "configurable": false, + "targetField": "title", + "type": "text", + }, + "related": { + "configurable": false, + "relation": "morphToMany", + "required": true, + "type": "relation", + }, + "title": { + "configurable": false, + "pluginOptions": { + "i18n": { + "localized": false, + }, + }, + "required": true, + "type": "text", + }, + "type": { + "configurable": false, + "default": "INTERNAL", + "enum": [ + "INTERNAL", + "EXTERNAL", + "WRAPPER", + ], + "type": "enumeration", + }, + "uiRouterKey": { + "configurable": false, + "type": "string", + }, + }, + "collectionName": "navigations_items", + "info": { + "displayName": "Navigation Item", + "name": "navigation-item", + "pluralName": "navigation-items", + "singularName": "navigation-item", + }, + "options": { + "comment": "Navigation Item", + "increments": true, + "timestamps": true, + }, + "pluginOptions": { + "content-manager": { + "visible": false, + }, + "content-type-builder": { + "visible": false, + }, + "i18n": { + "localized": false, + }, + }, +} +`); + }); + + it('should provide valid lifecycle hooks', () => { + // Then + expect(navigationItemLifecycles).toMatchInlineSnapshot(` +{ + "afterCount": [Function], + "afterCreate": [Function], + "afterCreateMany": [Function], + "afterDelete": [Function], + "afterDeleteMany": [Function], + "afterFindMany": [Function], + "afterFindOne": [Function], + "afterUpdate": [Function], + "afterUpdateMany": [Function], + "beforeCount": [Function], + "beforeCreate": [Function], + "beforeCreateMany": [Function], + "beforeDelete": [Function], + "beforeDeleteMany": [Function], + "beforeFindMany": [Function], + "beforeFindOne": [Function], + "beforeUpdate": [Function], + "beforeUpdateMany": [Function], +} +`); + }); + }); + }); + }); +}); diff --git a/server/tests/content-types/navigation.test.ts b/server/tests/content-types/navigation.test.ts new file mode 100644 index 00000000..fa5f168b --- /dev/null +++ b/server/tests/content-types/navigation.test.ts @@ -0,0 +1,90 @@ +import navigationLifecycles from '../../src/content-types/navigation/lifecycles'; +import navigation from '../../src/content-types/navigation/schema'; + +describe('Navigation', () => { + describe('Server', () => { + describe('Content types', () => { + describe('Navigation', () => { + it('should provide valid content type', () => { + // Then + expect(navigation).toMatchInlineSnapshot(` +{ + "attributes": { + "items": { + "configurable": false, + "mappedBy": "master", + "relation": "oneToMany", + "target": "plugin::navigation.navigation-item", + "type": "relation", + }, + "name": { + "configurable": false, + "required": true, + "type": "text", + }, + "slug": { + "configurable": false, + "required": true, + "target": "name", + "type": "uid", + }, + "visible": { + "configurable": false, + "default": false, + "type": "boolean", + }, + }, + "collectionName": "navigations", + "info": { + "displayName": "Navigation", + "name": "navigation", + "pluralName": "navigations", + "singularName": "navigation", + }, + "options": { + "comment": "", + }, + "pluginOptions": { + "content-manager": { + "visible": false, + }, + "content-type-builder": { + "visible": false, + }, + "i18n": { + "localized": true, + }, + }, +} +`); + }); + + it('should provide valid lifecycle hooks', () => { + // Then + expect(navigationLifecycles).toMatchInlineSnapshot(` +{ + "afterCount": [Function], + "afterCreate": [Function], + "afterCreateMany": [Function], + "afterDelete": [Function], + "afterDeleteMany": [Function], + "afterFindMany": [Function], + "afterFindOne": [Function], + "afterUpdate": [Function], + "afterUpdateMany": [Function], + "beforeCount": [Function], + "beforeCreate": [Function], + "beforeCreateMany": [Function], + "beforeDelete": [Function], + "beforeDeleteMany": [Function], + "beforeFindMany": [Function], + "beforeFindOne": [Function], + "beforeUpdate": [Function], + "beforeUpdateMany": [Function], +} +`); + }); + }); + }); + }); +}); diff --git a/server/tests/controllers/admin.test.ts b/server/tests/controllers/admin.test.ts new file mode 100644 index 00000000..096776e9 --- /dev/null +++ b/server/tests/controllers/admin.test.ts @@ -0,0 +1,747 @@ +import { faker } from '@faker-js/faker'; +import { Core } from '@strapi/strapi'; +import { Context as KoaContext } from 'koa'; +import { omit } from 'lodash'; + +import buildAdminController, { KoaContextExtension } from '../../src/controllers/admin'; +import { NavigationDTO, NavigationPluginConfigDTO } from '../../src/dtos'; +import { NavigationItemDBSchema } from '../../src/schemas'; +import { ConfigSchema } from '../../src/schemas/config'; +import { AdminService, CommonService } from '../../src/services'; +import { getPluginService } from '../../src/utils'; +import { asProxy } from '../utils'; + +jest.mock('../../src/utils'); + +describe('Navigation', () => { + describe('Server', () => { + describe('Controller', () => { + // Given + const getMockNavigation = (extend: Partial = {}): NavigationDTO => ({ + documentId: faker.string.uuid(), + id: faker.number.int(), + locale: 'en', + name: faker.internet.domainWord(), + slug: faker.internet.domainWord(), + visible: faker.datatype.boolean(), + items: [], + ...extend, + }); + const strapi = asProxy({}); + + describe('get()', () => { + it('should read all navigations', async () => { + // Given + const navigations = Array.from({ + length: faker.number.int({ min: 2, max: 5 }), + }).map(() => getMockNavigation()); + const get = jest.fn(); + const mockAdminService = asProxy({ get }); + + get.mockReturnValue(navigations); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.get(); + + // Then + expect(result).toEqual(navigations); + }); + }); + + describe('post()', () => { + it('should create a navigation', () => { + // Given + const auditLogMock = jest.fn(); + const mockAdminService = asProxy({ + post: jest.fn(), + }); + const mockNavigation = getMockNavigation(); + const body = { + name: mockNavigation.name, + visible: mockNavigation.visible, + }; + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + adminController.post( + asProxy({ + auditLog: auditLogMock, + request: asProxy({ + body, + }), + }) + ); + + // Then + expect(mockAdminService.post).toHaveBeenCalledWith({ + payload: body, + auditLog: auditLogMock, + }); + }); + + it('should validate input', () => { + // Given + const auditLogMock = jest.fn(); + const mockAdminService = asProxy({ + post: jest.fn(), + }); + const mockNavigation = getMockNavigation(); + const body = omit( + { + name: mockNavigation.name, + visible: mockNavigation.visible, + }, + faker.helpers.arrayElements(['name', 'visible'], { min: 1, max: 2 }) + ); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // Then + expect(() => { + adminController.post( + asProxy({ + auditLog: auditLogMock, + request: asProxy({ + body, + }), + }) + ); + }).toThrow(); + expect(mockAdminService.post).not.toHaveBeenCalled(); + }); + }); + + describe('put()', () => { + it('should update navigation', () => { + // Given + const auditLogMock = jest.fn(); + const mockAdminService = asProxy({ + put: jest.fn(), + }); + const mockNavigation = getMockNavigation(); + const documentId = faker.string.uuid(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + adminController.put( + asProxy({ + auditLog: auditLogMock, + params: { documentId }, + request: asProxy({ + body: mockNavigation, + }), + }) + ); + + // Then + expect(mockAdminService.put).toHaveBeenCalledWith({ + payload: { + ...mockNavigation, + documentId, + }, + auditLog: auditLogMock, + }); + }); + + it('should validate input', () => { + // Given + const auditLogMock = jest.fn(); + const mockAdminService = asProxy({ + put: jest.fn(), + }); + const mockNavigation = getMockNavigation(); + const body = omit( + mockNavigation, + faker.helpers.arrayElements(Object.keys(mockNavigation), { min: 1, max: 4 }) + ); + const documentId = faker.string.uuid(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // Then + expect(() => { + adminController.put( + asProxy({ + auditLog: auditLogMock, + params: { documentId }, + request: asProxy({ + body, + }), + }) + ); + }); + expect(mockAdminService.put).not.toHaveBeenCalled(); + }); + }); + + describe('delete()', () => { + it('should remove navigation', async () => { + // Given + const auditLogMock = jest.fn(); + const mockAdminService = asProxy({ + delete: jest.fn(), + }); + const documentId = faker.string.uuid(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.delete( + asProxy({ + auditLog: auditLogMock, + params: { documentId }, + }) + ); + + // Then + expect(mockAdminService.delete).toHaveBeenCalledWith({ + documentId, + auditLog: auditLogMock, + }); + expect(result).toEqual({}); + }); + + it('should validate input', async () => { + // Given + const auditLogMock = jest.fn(); + const mockAdminService = asProxy({ + delete: jest.fn(), + }); + const id = faker.string.fromCharacters('fake-id-$', 30); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.delete( + asProxy({ + auditLog: auditLogMock, + params: { id }, + }) + ); + }).rejects.toThrow(); + expect(mockAdminService.delete).not.toHaveBeenCalled(); + }); + }); + + describe('config()', () => { + it('should read config', async () => { + // Given + const mockConfig = asProxy({ + allowedLevels: faker.number.int(), + preferCustomContentTypes: faker.datatype.boolean(), + }); + + const mockAdminService = asProxy({ + config: jest.fn(), + }); + + (mockAdminService.config as jest.Mock).mockReturnValue(mockConfig); + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.config(); + + // Then + expect(mockAdminService.config).toHaveBeenCalledWith({ viaSettingsPage: false }); + expect(result).toEqual(mockConfig); + }); + }); + + describe('settingsConfig()', () => { + it('should read config', async () => { + // Given + const mockConfig = asProxy({ + allowedLevels: faker.number.int(), + preferCustomContentTypes: faker.datatype.boolean(), + }); + + const mockAdminService = asProxy({ + config: jest.fn(), + }); + + (mockAdminService.config as jest.Mock).mockReturnValue(mockConfig); + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.settingsConfig(); + + // Then + expect(mockAdminService.config).toHaveBeenCalledWith({ viaSettingsPage: true }); + expect(result).toEqual(mockConfig); + }); + }); + + describe('updateConfig()', () => { + it('should update config', async () => { + // Given + const nextConfig: ConfigSchema = { + additionalFields: ['audience'], + allowedLevels: faker.number.int(), + cascadeMenuAttached: faker.datatype.boolean(), + contentTypes: [], + contentTypesNameFields: { + default: [faker.string.alphanumeric({ length: 15 })], + }, + contentTypesPopulate: {}, + gql: { navigationItemRelated: [] }, + isCacheEnabled: faker.datatype.boolean(), + pathDefaultFields: {}, + preferCustomContentTypes: faker.datatype.boolean(), + }; + const mockAdminService = asProxy({ + updateConfig: jest.fn(), + }); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.updateConfig( + asProxy({ + request: asProxy({ + body: nextConfig, + }), + }) + ); + + // Then + expect(mockAdminService.updateConfig).toHaveBeenCalledWith({ config: nextConfig }); + expect(result).toEqual({}); + }); + + it('should validate input', async () => { + // Given + const nextConfig = asProxy({ + cascadeMenuAttached: faker.datatype.boolean(), + contentTypes: [], + contentTypesNameFields: { + default: [faker.string.alphanumeric({ length: 15 })], + }, + contentTypesPopulate: {}, + gql: { navigationItemRelated: [] }, + isCacheEnabled: faker.datatype.boolean(), + pathDefaultFields: {}, + preferCustomContentTypes: faker.datatype.boolean(), + }); + const mockAdminService = asProxy({ + updateConfig: jest.fn(), + }); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.updateConfig( + asProxy({ + request: asProxy({ + body: nextConfig, + }), + }) + ); + }).rejects.toThrow(); + expect(mockAdminService.updateConfig).not.toHaveBeenCalled(); + }); + }); + + describe('restoreConfig()', () => { + it('should restore config', async () => { + // Given + const mockAdminService = asProxy({ + restoreConfig: jest.fn(), + }); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.restoreConfig(); + + // Then + expect(mockAdminService.restoreConfig).toHaveBeenCalled(); + expect(result).toEqual({}); + }); + }); + + describe('settingsRestart()', () => { + it('should start system restart', async () => { + // Given + const mockAdminService = asProxy({ + restart: jest.fn(), + }); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.settingsRestart(); + + // Then + expect(mockAdminService.restart).toHaveBeenCalled(); + expect(result).toEqual({}); + }); + }); + + describe('getId()', () => { + it('should read a navigation', async () => { + // Given + const getById = jest.fn(); + const mockAdminService = asProxy({ + getById, + }); + const documentId = faker.string.uuid(); + const navigationMock = getMockNavigation(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + getById.mockReturnValue(navigationMock); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.getById( + asProxy({ + params: { documentId }, + }) + ); + + // Then + expect(result).toEqual(result); + }); + + it('should validate input', async () => { + // Given + const getById = jest.fn(); + const mockAdminService = asProxy({ + getById, + }); + const documentId = faker.number.int(); + const navigationMock = getMockNavigation(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + getById.mockReturnValue(navigationMock); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.getById( + asProxy({ + params: { documentId }, + }) + ); + }).rejects.toThrow(); + }); + }); + + describe('getContentTypeItems()', () => { + it('should return content types of a content type', async () => { + // Given + const items = [ + { documentId: faker.string.uuid() }, + { documentId: faker.string.uuid() }, + { documentId: faker.string.uuid() }, + { documentId: faker.string.uuid() }, + ]; + const getContentTypeItems = jest.fn(); + const mockAdminService = asProxy({ + getContentTypeItems, + }); + const model = faker.string.sample(10); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + getContentTypeItems.mockReturnValue(items); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.getContentTypeItems( + asProxy({ + params: { model }, + }) + ); + + // Then + expect(result).toEqual(items); + }); + + it('should validate input', async () => { + // Given + const getContentTypeItems = jest.fn(); + const mockAdminService = asProxy({ + getContentTypeItems, + }); + const model = undefined; + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.getContentTypeItems( + asProxy({ + params: { model }, + }) + ); + }).rejects.toThrow(); + }); + }); + + describe('fillFromOtherLocale()', () => { + it('should copy navigation details from navigation to navigation', async () => { + // Given + const navigation = getMockNavigation(); + const fillFromOtherLocale = jest.fn(); + const mockAdminService = asProxy({ + fillFromOtherLocale, + }); + const source = faker.string.uuid(); + const target = faker.string.uuid(); + const documentId = faker.string.uuid(); + const auditLog = jest.fn(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + fillFromOtherLocale.mockReturnValue(navigation); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.fillFromOtherLocale( + asProxy({ + params: { source, target, documentId }, + auditLog, + }) + ); + + // Then + expect(result).toEqual(navigation); + expect(mockAdminService.fillFromOtherLocale).toHaveBeenCalledWith({ + documentId, + source, + target, + auditLog, + }); + }); + + it.each([ + [faker.string.sample(), undefined, faker.string.sample()], + [undefined, faker.string.sample(), faker.string.sample()], + [faker.string.sample(), faker.string.sample(), undefined], + ])('should validate input %s', async (documentId, source, target) => { + // Given + const navigationItem = getMockNavigation(); + const fillFromOtherLocale = jest.fn(); + const mockAdminService = asProxy({ + fillFromOtherLocale, + }); + const auditLog = jest.fn(); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + fillFromOtherLocale.mockReturnValue(navigationItem); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.fillFromOtherLocale( + asProxy({ + params: { source, target, documentId }, + auditLog, + }) + ); + }).rejects.toThrow(); + }); + }); + + describe('readNavigationItemFromLocale()', () => { + it('should copy navigation item from navigation to navigation', async () => { + // Given + const navigationItem = asProxy({ + autoSync: faker.datatype.boolean(), + path: faker.string.sample(10), + title: faker.lorem.words(3), + }); + const readNavigationItemFromLocale = jest.fn(); + const mockAdminService = asProxy({ + readNavigationItemFromLocale, + }); + const source = faker.string.uuid(); + const target = faker.string.uuid(); + const path = faker.string.sample(10); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + readNavigationItemFromLocale.mockReturnValue(navigationItem); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.readNavigationItemFromLocale( + asProxy({ + params: { source, target }, + query: { path }, + }) + ); + + // Then + expect(result).toEqual(navigationItem); + }); + + it('should validate input', async () => { + // Given + const navigationItem = asProxy({ + autoSync: faker.datatype.boolean(), + path: faker.string.sample(10), + title: faker.lorem.words(3), + }); + const readNavigationItemFromLocale = jest.fn(); + const mockAdminService = asProxy({ + readNavigationItemFromLocale, + }); + let [source, target] = faker.helpers.shuffle([faker.string.uuid(), undefined]); + let path: unknown = faker.string.sample(10); + + (getPluginService as jest.Mock).mockReturnValue(mockAdminService); + readNavigationItemFromLocale.mockReturnValue(navigationItem); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.readNavigationItemFromLocale( + asProxy({ + params: { source, target }, + query: { path }, + }) + ); + }).rejects.toThrow(); + + // Given + source = faker.string.uuid(); + target = faker.string.uuid(); + path = faker.helpers.arrayElement([undefined, undefined, {}]); + + // Then + await expect(async () => { + await adminController.readNavigationItemFromLocale( + asProxy({ + params: { source, target }, + query: { path }, + }) + ); + }).rejects.toThrow(); + }); + }); + + describe('getSlug()', () => { + it('should map a string to a slug', async () => { + // Given + const slug = faker.string.sample(10); + const getSlug = jest.fn(); + const mockCommonService = asProxy({ + getSlug, + }); + const query = faker.string.sample(10); + + (getPluginService as jest.Mock).mockReturnValue(mockCommonService); + getSlug.mockResolvedValue(slug); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.getSlug( + asProxy({ + query: { q: query }, + }) + ); + + // Then + expect(result).toEqual({ slug }); + }); + + it('should validate input', async () => { + // Given + const slug = faker.string.sample(10); + const getSlug = jest.fn(); + const mockCommonService = asProxy({ + getSlug, + }); + const query: unknown = faker.helpers.arrayElement([undefined, null, {}, []]); + + (getPluginService as jest.Mock).mockReturnValue(mockCommonService); + getSlug.mockResolvedValue(slug); + + const adminController = buildAdminController({ strapi }); + + // Then + await expect(async () => { + await adminController.getSlug( + asProxy({ + query: { q: query }, + }) + ); + }).rejects.toThrow(); + }); + }); + + describe('settingsLocale()', () => { + it('should return current locale settings', async () => { + // Given + const defaultLocale = faker.string.sample(10); + const restLocale = [ + faker.string.sample(10), + faker.string.sample(10), + faker.string.sample(10), + ]; + const readLocale = jest.fn(); + const mockCommonService = asProxy({ + readLocale, + }); + + (getPluginService as jest.Mock).mockReturnValue(mockCommonService); + readLocale.mockResolvedValue({ + defaultLocale, + restLocale, + }); + + const adminController = buildAdminController({ strapi }); + + // When + const result = await adminController.settingsLocale(); + + // Then + expect(result).toEqual({ + defaultLocale, + restLocale, + }); + }); + }); + }); + }); +}); diff --git a/server/tests/controllers/client.test.ts b/server/tests/controllers/client.test.ts new file mode 100644 index 00000000..b52fd01b --- /dev/null +++ b/server/tests/controllers/client.test.ts @@ -0,0 +1,265 @@ +import { faker } from '@faker-js/faker'; +import { Core } from '@strapi/strapi'; +import { Context as KoaContext } from 'koa'; + +import buildClientController from '../../src/controllers/client'; +import { NavigationDTO, NavigationItemDTO } from '../../src/dtos'; +import { ClientService } from '../../src/services'; +import { getPluginService } from '../../src/utils'; +import { asProxy } from '../utils'; + +jest.mock('../../src/utils'); + +describe('Navigation', () => { + describe('Server', () => { + describe('Controller', () => { + // Given + const getMockNavigationItem = ( + extend: Partial = {} + ): NavigationItemDTO => ({ + additionalFields: {}, + collapsed: faker.datatype.boolean(), + id: faker.number.int(), + documentId: faker.string.uuid(), + menuAttached: faker.datatype.boolean(), + order: faker.number.int(), + title: faker.string.sample(10), + type: 'INTERNAL', + uiRouterKey: faker.string.sample(10), + path: faker.string.sample(10), + ...extend, + }); + const getMockNavigation = (extend: Partial = {}): NavigationDTO => ({ + documentId: faker.string.uuid(), + id: faker.number.int(), + locale: 'en', + name: faker.internet.domainWord(), + slug: faker.internet.domainWord(), + visible: faker.datatype.boolean(), + items: [], + ...extend, + }); + const strapi = asProxy({}); + + describe('readAll()', () => { + it('should return details', async () => { + // Given + const navigations = Array.from({ + length: faker.number.int({ min: 2, max: 5 }), + }).map(() => getMockNavigation()); + const readAll = jest.fn(); + const mockClientService = asProxy({ readAll }); + + readAll.mockResolvedValue(navigations); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // When + const result = await clientController.readAll( + asProxy({ + query: { + locale: faker.location.countryCode(), + orderBy: faker.string.sample(10), + orderDirection: faker.helpers.arrayElement(['DESC', 'ASC']), + }, + }) + ); + + // Then + expect(result).toEqual(navigations); + }); + + it('should NOT contain unhandled errors', async () => { + // Given + const readAll = jest.fn(); + const mockClientService = asProxy({ readAll }); + const someError = { type: 'UNKNOWN' }; + + readAll.mockRejectedValue(someError); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // Then + await expect(async () => { + await clientController.readAll( + asProxy({ + query: { + locale: faker.location.countryCode(), + orderBy: faker.string.sample(10), + orderDirection: faker.helpers.arrayElement(['DESC', 'ASC']), + }, + }) + ); + }).rejects.toEqual(someError); + }); + + it('should validate input', async () => { + // Given + const navigations = Array.from({ + length: faker.number.int({ min: 2, max: 5 }), + }).map(() => getMockNavigation()); + const readAll = jest.fn(); + const badRequest = jest.fn(); + const mockClientService = asProxy({ readAll }); + + readAll.mockResolvedValue(navigations); + badRequest.mockImplementation((message: string) => ({ + context: 'BAD_REQUEST', + message, + })); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // Then + const result = await clientController.readAll( + asProxy({ + query: { + locale: faker.location.countryCode(), + orderBy: faker.string.sample(10), + orderDirection: faker.string.sample(10), + }, + badRequest, + }) + ); + + expect(result).toEqual({ + context: 'BAD_REQUEST', + message: expect.any(String), + }); + }); + }); + + describe('render()', () => { + it('should return details', async () => { + // Given + const navigation = getMockNavigation(); + const render = jest.fn(); + const mockClientService = asProxy({ render }); + const idOrSlug = faker.string.uuid(); + const type = faker.helpers.arrayElement(['FLAT', 'TREE', 'RFR']); + const menuOnly = faker.datatype.boolean(); + + render.mockResolvedValue(navigation); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // When + const result = await clientController.render( + asProxy({ + params: { idOrSlug }, + query: { + type, + menuOnly, + }, + }) + ); + + // Then + expect(result).toEqual(navigation); + }); + + it('should validate input', async () => { + // Given + const navigation = getMockNavigation(); + const render = jest.fn(); + const mockClientService = asProxy({ render }); + const idOrSlug = faker.string.uuid(); + const type = faker.helpers.arrayElement(['FLAT', 'TREE', 'RFR']); + const menu = faker.datatype.boolean().toString(); + const query = faker.helpers.arrayElement([ + { type, menu: faker.string.sample() }, + { type: faker.string.sample(), menu }, + ]); + + render.mockResolvedValue(navigation); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // Then + await expect(async () => { + await clientController.render( + asProxy({ + params: { idOrSlug }, + query, + }) + ); + }).rejects.toThrow(); + }); + }); + + describe('renderChild()', () => { + it('should return details', async () => { + // Given + const navigationItem = getMockNavigationItem(); + const renderChildren = jest.fn(); + const mockClientService = asProxy({ renderChildren }); + const documentId = faker.string.uuid(); + const childUIKey = faker.string.sample(10); + const type = faker.helpers.arrayElement(['FLAT', 'TREE', 'RFR']); + const menu = faker.datatype.boolean().toString(); + + renderChildren.mockResolvedValue([navigationItem]); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // When + const result = await clientController.renderChild( + asProxy({ + params: { documentId, childUIKey }, + query: { + type, + menu, + }, + }) + ); + + // Then + expect(result).toEqual([navigationItem]); + }); + + it('should validate input', async () => { + // Given + const navigation = getMockNavigation(); + const render = jest.fn(); + const mockClientService = asProxy({ render }); + const documentId = faker.string.uuid(); + const childUIKey = faker.string.sample(10); + const type = faker.helpers.arrayElement(['FLAT', 'TREE', 'RFR']); + const menuOnly = faker.datatype.boolean(); + const query = faker.helpers.arrayElement([ + { type, menuOnly: faker.string.sample() }, + { type: faker.string.sample(), menuOnly }, + ]); + + render.mockResolvedValue(navigation); + + (getPluginService as jest.Mock).mockReturnValue(mockClientService); + + const clientController = buildClientController({ strapi }); + + // Then + await expect(async () => { + await clientController.renderChild( + asProxy({ + params: { documentId, childUIKey }, + query, + }) + ); + }).rejects.toThrow(); + }); + }); + }); + }); +}); diff --git a/server/tests/utils.ts b/server/tests/utils.ts new file mode 100644 index 00000000..d1b4ba29 --- /dev/null +++ b/server/tests/utils.ts @@ -0,0 +1,16 @@ +const ignoredProps = new Set(['asymmetricMatch']); + +export const asProxy = (base: Partial): T => + new Proxy(base as any, { + get(target: any, property) { + if ( + typeof property === 'string' && + target[property] === undefined && + !ignoredProps.has(property) + ) { + console.warn(`Property "${property}" unavailable at ${JSON.stringify(target)}`); + } + + return target[property]; + }, + }) as T; diff --git a/server/tests/utils/functions.test.ts b/server/tests/utils/functions.test.ts new file mode 100644 index 00000000..0c2e6277 --- /dev/null +++ b/server/tests/utils/functions.test.ts @@ -0,0 +1,248 @@ +import { faker } from '@faker-js/faker'; +import { Core } from '@strapi/strapi'; +import { ConfigSchema, NavigationItemAdditionalField } from '../../src/schemas'; +import { + assertConfig, + assertNotEmpty, + FORBIDDEN_CUSTOM_FIELD_NAMES, + getCustomFields, + getPluginModels, + isContentTypeEligible, + resolveGlobalLikeId, + RESTRICTED_CONTENT_TYPES, + singularize, + validateAdditionalFields, +} from '../../src/utils'; +import { asProxy } from '../utils'; + +describe('Navigation', () => { + describe('Server', () => { + describe('Utils', () => { + describe('Functions', () => { + describe('getCustomFields()', () => { + it('should filter out audience', () => { + // Given + const additionalFields: Array = [ + 'audience', + asProxy({ + label: faker.string.sample(10), + }), + asProxy({ + label: faker.string.sample(10), + }), + asProxy({ + label: faker.string.sample(10), + }), + ]; + + // When + const result = getCustomFields(additionalFields); + + // Then + expect(result).not.toContain('audience'); + }); + }); + + describe('validateAdditionalFields()', () => { + // Given + const getAdditionalField = () => + asProxy({ + label: faker.string.sample(10), + name: faker.string.sample(10), + }); + + it('should pass valid fields', () => { + // Given + const additionalFields: Array = [ + 'audience', + getAdditionalField(), + getAdditionalField(), + getAdditionalField(), + ]; + + // Then + expect(() => { + validateAdditionalFields(additionalFields); + }).not.toThrow(); + }); + + it('should check for unique items', () => { + // Given + const additionalField = getAdditionalField(); + const additionalFields: Array = [ + 'audience', + additionalField, + additionalField, + getAdditionalField(), + ]; + + // Then + expect(() => { + validateAdditionalFields(additionalFields); + }).toThrow(); + }); + + it.each(FORBIDDEN_CUSTOM_FIELD_NAMES)('%s name should not be allowed', (name: string) => { + const additionalField = asProxy({ + label: faker.string.sample(), + name, + }); + // Given + const additionalFields: Array = [ + 'audience', + additionalField, + getAdditionalField(), + getAdditionalField(), + ]; + + // Then + expect(() => { + validateAdditionalFields(additionalFields); + }).toThrow(); + }); + }); + + describe('assertNotEmpty()', () => { + it.each([null, undefined])('%s should throw', (value) => { + // Then + expect(() => { + assertNotEmpty(value); + }).toThrow(); + }); + + it.each([ + faker.number.int(), + faker.string.sample(10), + faker.date.anytime(), + faker.datatype.boolean(), + {}, + ])('%s should pass', (value) => { + // Then + expect(() => assertNotEmpty(value)).not.toThrow(); + }); + + it('should allow passing of custom error', () => { + // Given + const error = new (class extends Error { + type = 'CUSTOM_ERROR'; + })(); + + // Then + expect(() => assertNotEmpty(null, error)).toThrow(error); + }); + }); + + describe('resolveGlobalLikeId', () => { + it('should handle api ids', () => { + // Then + expect(resolveGlobalLikeId('api::blog-post.blog-post')).toMatchInlineSnapshot( + `"BlogPost"` + ); + }); + + it('should handle other ids', () => { + // Then + expect(resolveGlobalLikeId('plugin::navigation.navigation-item')).toMatchInlineSnapshot( + `"NavigationNavigationItem"` + ); + }); + }); + + describe('assertConfig()', () => { + it('should typecast valid config', () => { + // Given + const config: ConfigSchema = { + additionalFields: ['audience'], + allowedLevels: faker.number.int(), + cascadeMenuAttached: faker.datatype.boolean(), + contentTypes: ['api::blog-post.blog-post'], + contentTypesNameFields: {}, + contentTypesPopulate: {}, + gql: { + navigationItemRelated: [], + }, + pathDefaultFields: {}, + preferCustomContentTypes: faker.datatype.boolean(), + isCacheEnabled: faker.datatype.boolean(), + }; + + // Then + expect(() => assertConfig(config)).not.toThrow(); + }); + + it.each([ + null, + undefined, + faker.datatype.boolean(), + faker.date.anytime(), + faker.number.int(), + faker.string.sample(10), + asProxy({ + additionalFields: ['audience'], + allowedLevels: faker.number.int(), + cascadeMenuAttached: faker.datatype.boolean(), + }), + ])('%s should throw', (value) => { + // Then + expect(() => assertConfig(value)).toThrow(); + }); + }); + + describe('singularize()', () => { + it('should singularize plural string', () => { + // Then + expect(singularize('blogs')).toEqual('blog'); + }); + + it('should leave singular string as is', () => { + // Then + expect(singularize('blog')).toEqual('blog'); + }); + }); + + describe('isContentTypeEligible()', () => { + it.each(RESTRICTED_CONTENT_TYPES)('%s should be disallowed', (contentType) => { + // Then + expect(isContentTypeEligible(contentType)).toBe(false); + }); + + it.each(['api::article.article', 'api::blog.blog', 'plugin::upload.file'])( + '%s should be allowed', + (contentType) => { + // Then + expect(isContentTypeEligible(contentType)).toBe(true); + } + ); + }); + + describe('getPluginModels()', () => { + it("should return plugin's models", () => { + // Given + const plugin = jest.fn(); + const contentType = jest.fn(); + const strapi = asProxy({ + plugin, + }); + + plugin.mockReturnValue({ contentType }); + contentType.mockReturnValueOnce(faker.string.sample(10)); + contentType.mockReturnValueOnce(faker.string.sample(10)); + contentType.mockReturnValueOnce(faker.string.sample(10)); + contentType.mockReturnValueOnce(faker.string.sample(10)); + + // When + const result = getPluginModels({ strapi }); + + // Then + expect(result).toEqual({ + masterModel: expect.any(String), + itemModel: expect.any(String), + relatedModel: expect.any(String), + audienceModel: expect.any(String), + }); + }); + }); + }); + }); + }); +}); diff --git a/server/tsconfig.build.json b/server/tsconfig.build.json new file mode 100644 index 00000000..bdee44cb --- /dev/null +++ b/server/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig", + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "compilerOptions": { + "rootDir": "../", + "baseUrl": ".", + "outDir": "./dist" + } +} diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 00000000..6b79e8cf --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@strapi/typescript-utils/tsconfigs/server", + "include": ["./src", "tests"], + "compilerOptions": { + "rootDir": "../", + "baseUrl": ".", + "strict": true + } +} diff --git a/server/utils/__tests__/functions.test.ts b/server/utils/__tests__/functions.test.ts deleted file mode 100644 index 9e4154d4..00000000 --- a/server/utils/__tests__/functions.test.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { IStrapi, StrapiContext } from "strapi-typed"; -import { - ICommonService, - LifeCycleEvent, - LifeCycleHookName, - NavigationItemEntity, - ToBeFixed, -} from "../../../types"; - -import setupStrapi from "../../../__mocks__/strapi"; -import { - buildAllHookListeners, - buildHookListener, - buildNestedPaths, - filterByPath, - getPluginModels, - purgeSensitiveData, - purgeSensitiveDataFromUser, - sanitizePopulateField, -} from "../functions"; -import { ContentType } from "../constant"; - -declare var strapi: IStrapi; - -describe("Utilities functions", () => { - beforeAll(async () => { - setupStrapi(); - }); - - describe("Path rendering functions", () => { - it("Can build nested path structure", async () => { - const { itemModel } = getPluginModels(); - const rootPath = "/home/side"; - const entities = await strapi - .query(itemModel.uid) - .findMany({ - where: { - master: 1, - }, - }); - const nested = buildNestedPaths(entities); - - expect(nested.length).toBe(2); - expect(nested[1].path).toBe(rootPath); - }); - - it("Can filter items by path", async () => { - const { itemModel } = getPluginModels(); - const rootPath = "/home/side"; - const entities = await strapi - .query(itemModel.uid) - .findMany({ - where: { - master: 1, - }, - }); - const { root, items } = filterByPath(entities, rootPath); - - expect(root).toBeDefined(); - expect(root?.path).toBe(rootPath); - expect(items.length).toBe(1); - }); - - it("Filter out sensitive information from related entities", () => { - const sensitiveDataModel = { - username: "Amy", - password: "test-password", - accessToken: "token", - reset_token: "token", - renewtoken: "token", - secret: "secret", - }; - const result = purgeSensitiveDataFromUser(sensitiveDataModel); - - expect(result).toMatchInlineSnapshot(` - Object { - "username": "Amy", - } - `); - }); - - describe("purgeSensitiveData()", () => { - it("should clear user sensitive data from returned entity", () => { - const user = { - firstname: "Amy", - lastname: "Bishop", - username: "Amy", - password: "test-password", - accessToken: "token", - reset_token: "token", - renewtoken: "token", - secret: "secret", - }; - const timestamp = "Thu Dec 21 2023 13:36:46 GMT+0100"; - const source = { - createdBy: user, - updatedBy: user, - createdAt: timestamp, - updatedAt: timestamp, - content: "Lorem ipsum dolor sit amet", - mainImage: { - createdBy: user, - updatedBy: user, - createdAt: timestamp, - updatedAt: timestamp, - url: "https://lorempixel.com/60x60", - }, - }; - - expect(purgeSensitiveData(source)).toMatchInlineSnapshot(` - Object { - "content": "Lorem ipsum dolor sit amet", - "createdAt": "Thu Dec 21 2023 13:36:46 GMT+0100", - "createdBy": Object { - "firstname": "Amy", - "lastname": "Bishop", - "username": "Amy", - }, - "mainImage": Object { - "createdAt": "Thu Dec 21 2023 13:36:46 GMT+0100", - "createdBy": Object { - "firstname": "Amy", - "lastname": "Bishop", - "username": "Amy", - }, - "updatedAt": "Thu Dec 21 2023 13:36:46 GMT+0100", - "updatedBy": Object { - "firstname": "Amy", - "lastname": "Bishop", - "username": "Amy", - }, - "url": "https://lorempixel.com/60x60", - }, - "updatedAt": "Thu Dec 21 2023 13:36:46 GMT+0100", - "updatedBy": Object { - "firstname": "Amy", - "lastname": "Bishop", - "username": "Amy", - }, - } - `); - }); - }); - - describe("sanitizePopulateField()", () => { - it.each(["*", true, null, undefined])( - 'should filter out "%s"', - (populate: any) => { - expect(sanitizePopulateField(populate)).toBe(undefined); - } - ); - - it("should support mapping an array", () => { - const populate = ["*", true, null, undefined, "bar"] as any; - - expect(sanitizePopulateField(populate)).toMatchInlineSnapshot(` - Array [ - undefined, - undefined, - undefined, - undefined, - "bar", - ] - `); - }); - - it("should support an object", () => { - const populate: any = Object.fromEntries( - ["*", true, null, undefined, "bar"].map((value, index) => [ - `key-${index + 1}`, - value, - ]) - ); - - expect(sanitizePopulateField(populate)).toMatchInlineSnapshot(` - Object { - "key-1": undefined, - "key-2": undefined, - "key-3": undefined, - "key-4": undefined, - "key-5": "bar", - } - `); - }); - }); - - describe("buildAllHookListeners()", () => { - it("should define a listener for each available model lifecycle hook", () => { - // Then - expect(buildAllHookListeners("navigation", {} as StrapiContext)) - .toMatchInlineSnapshot(` - Object { - "afterCount": [Function], - "afterCreate": [Function], - "afterCreateMany": [Function], - "afterDelete": [Function], - "afterDeleteMany": [Function], - "afterFindMany": [Function], - "afterFindOne": [Function], - "afterUpdate": [Function], - "afterUpdateMany": [Function], - "beforeCount": [Function], - "beforeCreate": [Function], - "beforeCreateMany": [Function], - "beforeDelete": [Function], - "beforeDeleteMany": [Function], - "beforeFindMany": [Function], - "beforeFindOne": [Function], - "beforeUpdate": [Function], - "beforeUpdateMany": [Function], - } - `); - }); - }); - - describe("buildHookListener()", () => { - it("should delegate lifecycle hook event to defined listeners", async () => { - // Given - const contentTypeName: ContentType = "navigation"; - const service: Partial = { - runLifecycleHook: jest.fn(), - }; - const plugin: ToBeFixed = { - service() { return service; } - }; - const context: StrapiContext = { - strapi: { - plugin() { - return plugin; - }, - } as unknown as StrapiContext["strapi"], - }; - const hookName: LifeCycleHookName = "afterCreate"; - const event: Partial = { - action: hookName, - model: { - attributes: { - name: "name", - }, - } as unknown as LifeCycleEvent["model"], - }; - const [, listener] = buildHookListener( - contentTypeName, - context - )(hookName); - - // When - await listener(event as LifeCycleEvent); - - // Then - expect(service.runLifecycleHook).toHaveBeenCalledWith({ - contentTypeName, - hookName, - event, - }); - }); - }); - }); -}); diff --git a/server/utils/constant.ts b/server/utils/constant.ts deleted file mode 100644 index a2831fc5..00000000 --- a/server/utils/constant.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { LifeCycleHookName, RenderTypeOptions } from "../../types"; -import { I18N_DEFAULT_POPULATE } from "../i18n"; - -export const TEMPLATE_DEFAULT = 'Generic' as const; -export const MODEL_TYPES = { CONTENT_TYPE: 'contentType' } as const; -export const KIND_TYPES = { SINGLE: 'singleType', COLLECTION: 'collectionType' } as const; -export const ALLOWED_CONTENT_TYPES = ['api::', 'plugin::'] as const; -export const RESTRICTED_CONTENT_TYPES = ['plugin::users-permissions', 'plugin::i18n.locale', 'plugin::navigation'] as const; -export const EXCLUDED_CONTENT_TYPES = ['strapi::']; -export const CONTENT_TYPES_NAME_FIELDS_DEFAULTS = ['title', 'subject', 'name']; -export const DEFAULT_POPULATE = [...I18N_DEFAULT_POPULATE] -export const DEFAULT_NAVIGATION_ITEM = { - name: "Main navigation", - slug: "main-navigation", - visible: true, -} as const; -export const RENDER_TYPES = { - FLAT: 'FLAT', - TREE: 'TREE', - RFR: 'RFR' -} as RenderTypeOptions; - - -export type ContentType = "navigation" | "navigation-item"; - -export const allLifecycleHooks: ReadonlyArray = [ - "beforeCreate", - "beforeCreateMany", - "afterCreate", - "afterCreateMany", - "beforeUpdate", - "beforeUpdateMany", - "afterUpdate", - "afterUpdateMany", - "beforeDelete", - "beforeDeleteMany", - "afterDelete", - "afterDeleteMany", - "beforeCount", - "afterCount", - "beforeFindOne", - "afterFindOne", - "beforeFindMany", - "afterFindMany", -] as const; diff --git a/server/utils/functions.ts b/server/utils/functions.ts deleted file mode 100644 index ee66fbd7..00000000 --- a/server/utils/functions.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { - capitalize, - find, - first, - flatten, - get, - includes, - isArray, - isEmpty, - isNil, - isObject, - isString, - last, - uniqBy, - zipWith, -} from 'lodash'; -import { PopulateClause, StrapiContext } from 'strapi-typed'; -import { Id, IStrapi, Primitive, StrapiContentType, StringMap, StrapiContentTypeFullSchema } from "strapi-typed"; - -import { - assertNotEmpty, - AuditLogContext, - AuditLogParams, - ContentTypeEntity, - Effect, - IAdminService, - IClientService, - ICommonService, - LifeCycleEvent, - LifeCycleHookName, - NavigationActions, - NavigationItem, - NavigationItemAdditionalField, - NavigationItemCustomField, - NavigationItemEntity, - NavigationServiceName, - NestedPath, - NestedStructure, - PluginConfigNameFields, - PopulateQueryParam, - ToBeFixed, -} from "../../types"; -import { NavigationError } from '../../utils/NavigationError'; -import { TEMPLATE_DEFAULT, ALLOWED_CONTENT_TYPES, RESTRICTED_CONTENT_TYPES, ContentType, allLifecycleHooks } from './constant'; -declare var strapi: IStrapi; - -type Populate = - | string - | undefined - | boolean - | Array - | Record; - -const UID_REGEX = /^(?[a-z0-9-]+)\:{2}(?[a-z0-9-]+)\.{1}(?[a-z0-9-]+)$/i; - -type TypeMap = { - client: IClientService, - admin: IAdminService, - common: ICommonService -} - -export function getPluginService(name: T, strapiInstance = strapi): T extends infer R extends NavigationServiceName - ? TypeMap[R] - : never { - return strapiInstance.plugin("navigation").service(name) -} - -export const errorHandler = (ctx: ToBeFixed) => (error: NavigationError | string) => { - if (error instanceof NavigationError) { - return ctx.badRequest(error.message, error.additionalInfo); - } - throw error; -}; - -export const getCustomFields = (additionalFields: NavigationItemAdditionalField[]): NavigationItemCustomField[] => - additionalFields.filter(field => typeof field !== 'string') as NavigationItemCustomField[]; - -export const parseParams = < - TParams extends StringMap = StringMap, - TResult extends StringMap = StringMap ->(params: TParams): TResult => - Object.keys(params).reduce((prev, curr) => { - const value = params[curr]; - const parsedValue = isNaN(Number(value)) ? value : parseInt(value, 10); - return { - ...prev, - [curr]: parsedValue, - }; - }, {} as TResult); - -export const templateNameFactory = async ( - items: NavigationItemEntity[] = [], - strapi: IStrapi, - contentTypes: StrapiContentType[] = [], -) => { - const flatRelated = flatten(items.map(i => i.related)).filter(_ => !!_); - const relatedMap = (flatRelated).reduce((acc: { [key: string]: Id[] }, curr) => { - if (isNil(curr) || typeof curr.__contentType !== "string") return acc; - - const index = curr.__contentType; - if (isNil(acc[index])) acc[index] = []; - - return {...acc, [index]: [...acc[index], curr.id]}; - }, {}); - const responses = await Promise.all( - Object.entries(relatedMap) - .map( - ([contentType, ids]) => { - assertNotEmpty(find(contentTypes, cnt => cnt.uid === contentType)); - return strapi.query(contentType) - .findMany({ - where: { id: { $in: ids } }, - limit: Number.MAX_SAFE_INTEGER, - populate: ["template"], - }) - .then(res => ({ [contentType]: res })); - }), - ); - const relatedResponseMap = responses.reduce((acc, curr) => ({ ...acc, ...curr }), {}); - const singleTypes = new Map( - contentTypes - .filter(x => x.isSingle) - .map(({ contentTypeName, templateName }) => [contentTypeName, templateName || contentTypeName]) - ); - - return (contentType: ToBeFixed, id: Id) => { - const template = get(relatedResponseMap[contentType].find(data => data.id === id), 'template'); - - if (template && template instanceof Array) { - const templateComponent = getTemplateComponentFromTemplate(strapi, template); - return get(templateComponent, 'options.templateName', TEMPLATE_DEFAULT); - } - - if (singleTypes.get(contentType)) { - return singleTypes.get(contentType); - } - - return TEMPLATE_DEFAULT; - }; -}; - -export const getTemplateComponentFromTemplate = ( - strapi: IStrapi, - template: ToBeFixed[] = [], -) => { - const componentName = get(first(template), '__component'); - return !!componentName ? strapi.components[componentName] : null; -}; - -export const prepareAuditLog = ( - actions: NavigationActions[] -): string => { - return [ - ...new Set( - actions - .filter((_: ToBeFixed) => !!_) - .flatMap(({ remove, create, update }) => { - return [create ? 'CREATE' : '', update ? 'UPDATE' : '', remove ? 'REMOVE' : ''] - .filter(_ => !!_); - }), - ), - ].join('_'); -}; - -export const sendAuditLog = ( - auditLogInstance: AuditLogContext, - event: string, - data: AuditLogParams, -): void => { - if (auditLogInstance && auditLogInstance.emit) { - auditLogInstance.emit(event, data); - } -}; - -export const composeItemTitle = ( - item: NavigationItemEntity, - fields: PluginConfigNameFields = {}, - contentTypes: StrapiContentType[] = [] -): string | undefined => { - const { title, related } = item; - const lastRelated = isArray(related) ? last(related) : related; - - if (title) { - return isString(title) && !isEmpty(title) ? title : undefined; - } else if (lastRelated) { - const relationTitle = extractItemRelationTitle(lastRelated, fields, contentTypes); - return isString(relationTitle) && !isEmpty(relationTitle) ? relationTitle : undefined; - } - return undefined; -}; - -export const extractItemRelationTitle = ( - relatedItem: ContentTypeEntity, - fields: PluginConfigNameFields = {}, - contentTypes: StrapiContentType[] = [] -) => { - const { __contentType } = relatedItem; - const contentType = find(contentTypes, _ => _.contentTypeName === __contentType); - const { default: defaultFields = [] } = fields; - return get(fields, `${contentType ? contentType.collectionName : ''}`, defaultFields).map((_) => relatedItem[_]).filter((_) => _)[0] || ''; -}; - -export const filterOutUnpublished = ( - item: NavigationItemEntity -) => { - const relatedItem = item.related && (isArray(item.related) ? last(item.related) : item.related); - const isHandledByPublishFlow = relatedItem ? 'published_at' in relatedItem : false; - - if (isHandledByPublishFlow) { - const isRelatedDefinedAndPublished = relatedItem ? - isHandledByPublishFlow && get(relatedItem, 'published_at') : - false; - return item.type === "INTERNAL" ? isRelatedDefinedAndPublished : true; - } - return (item.type !== "INTERNAL") || relatedItem; -}; - -export const checkDuplicatePath = ( - parentItem: ToBeFixed | null, - checkData: NavigationItem[], -): Promise => { - return new Promise((resolve, reject) => { - if (parentItem && parentItem.items) { - for (let item of checkData) { - for (let _ of parentItem.items) { - if (_.path === item.path && (_.id !== item.id) && (item.type === "INTERNAL")) { - return reject( - new NavigationError( - `Duplicate path:${item.path} in parent: ${parentItem.title || 'root'} for ${item.title} and ${_.title} items`, - { - parentTitle: parentItem.title, - parentId: parentItem.id, - path: item.path, - errorTitles: [item.title, _.title], - }, - ), - ); - } - } - } - } - return resolve(); - }); -}; - -export const singularize = ( - value = '', -) => { - return last(value) === 's' ? value.substr(0, value.length - 1) : value; -}; - -export const buildNestedStructure = ( - entities: NavigationItemEntity[], - id: Id | null = null, - field: keyof NavigationItemEntity = 'parent', -): NestedStructure>[] => { - return entities - .filter(entity => { - let data = entity[field]; - if (data == null && id === null) { - return true; - } - if (data && typeof id === 'string') { - data = data.toString(); - } - if (!!data && typeof data === 'object' && 'id' in data) { - return (data).id === id - } - return (data && data === id) - }) - .map(entity => { - return ({ - ...entity, - related: entity.related, - items: buildNestedStructure(entities, entity.id, field), - }); - }); -}; - -export const buildNestedPaths = >( - items: T[], - id: Id | null = null, - parentPath: string | null = null -): NestedPath[] => { - return items - .filter(entity => { - let data: NavigationItemEntity | string | null = entity.parent; - if (data == null && id === null) { - return true; - } - if (data && typeof id === 'string') { - data = data.toString(); - } - return (data && data === id) || (isObject(entity.parent) && ((entity.parent).id === id)); - }) - .reduce((acc: NestedPath[], entity): NestedPath[] => { - const path = `${parentPath || ''}/${entity.path}`.replace("//", "/") - - return [ - { - id: entity.id, - parent: parentPath ? { - id: get(entity, ['parent', 'id']), - path: parentPath, - } : undefined, - path, - }, - ...buildNestedPaths(items, entity.id, path), - ...acc, - ]; - }, [] as NestedPath[]);}; - -export const filterByPath = >( - items: T[], - path: string | null, -): { root?: NestedPath, items: T[] } => { - const itemsWithPaths = path ? buildNestedPaths(items).filter(({ path: itemPath }) => itemPath.includes(path)) : []; - const root = itemsWithPaths.find(({ path: itemPath }) => itemPath === path); - - return { - root, - items: isNil(root) ? [] : items.filter(({ id }) => (itemsWithPaths.find(v => v.id === id))), - } -}; - -export const isContentTypeEligible = ( - uid = '' -) => { - const isOneOfAllowedType = ALLOWED_CONTENT_TYPES.filter(_ => uid.includes(_)).length > 0; - const isNoneOfRestricted = RESTRICTED_CONTENT_TYPES.filter(_ => uid.includes(_) || (uid === _)).length === 0; - return uid && isOneOfAllowedType && isNoneOfRestricted; -} - -export const intercalate = (glue: T, arr: U[]) => - arr.slice(1).reduce>((acc, element) => acc.concat([glue, element]), arr.slice(0, 1)); - -export const compareArraysOfNumbers = (arrA: number[], arrB: number[]) => { - const diff = zipWith(arrA, arrB, (a, b) => { - if (isNil(a)) - return -1; - if (isNil(b)) - return 1; - return a - b - }); - return find(diff, a => a !== 0) || 0; -} - -export const getPluginModels = (): Record<'masterModel' | 'itemModel' | 'relatedModel' | 'audienceModel', StrapiContentTypeFullSchema> => { - const plugin = strapi.plugin('navigation'); - return { - masterModel: plugin.contentType('navigation'), - itemModel: plugin.contentType('navigation-item'), - relatedModel: plugin.contentType('navigations-items-related'), - audienceModel: plugin.contentType('audience'), - } -}; - -export const validateAdditionalFields = (additionalFields: NavigationItemAdditionalField[]) => { - const forbiddenNames = [ - 'title', 'type', 'path', - 'externalPath', 'uiRouterKey', 'menuAttached', - 'order', 'collapsed', 'related', - 'parent', 'master', 'audience', - 'additionalFields', - ]; - const customFields = getCustomFields(additionalFields); - - if (customFields.length !== uniqBy(customFields, 'name').length) { - throw new Error('All names of custom fields must be unique.'); - } - - if (!isNil(find(customFields, item => includes(forbiddenNames, item.name)))) { - throw new Error(`Name of custom field cannot be one of: ${forbiddenNames.join(', ')}`); - } -}; - -export const parsePopulateQuery = (populate: PopulateQueryParam): PopulateClause => { - if (populate === "*") { - return true; - } else if (typeof populate === "string") { - return [populate]; - } else { - return populate; - } -} - -export const purgeSensitiveData = (data: ToBeFixed): ToBeFixed => { - if (!data || !(typeof data === "object") || !Object.keys(data).length) { - return data; - } - - const { createdBy = undefined, updatedBy = undefined, ...rest } = data; - - if (!createdBy && !updatedBy) { - return data; - } - - return { - ...Object.fromEntries( - Object.entries(rest).map(([key, value]) => [key, purgeSensitiveData(value)]) - ), - ...(createdBy ? { createdBy: purgeSensitiveDataFromUser(createdBy) } : {}), - ...(updatedBy ? { updatedBy: purgeSensitiveDataFromUser(updatedBy) } : {}), - } -} - -export const purgeSensitiveDataFromUser = (data: any = {}) => { - if (!data) { - return undefined; - } - - const allowedFields = ['username', 'firstname', 'lastname', 'email']; - - return Object.keys(data) - .filter((key: string) => allowedFields.includes(key.toLowerCase())) - .reduce((prev, curr) => ({ - ...prev, - [curr]: data[curr], - }), {}); -}; - -export const resolveGlobalLikeId = (uid = '') => { - const parse = (str: string) => str.split('-') - .map(_ => capitalize(_)) - .join(''); - - const [type, scope, contentTypeName] = splitTypeUid(uid); - - if (type === 'api') { - return parse(contentTypeName); - } - return `${parse(scope)}${parse(contentTypeName)}`; -}; - -const splitTypeUid = (uid = '') => { - return uid.split(UID_REGEX).filter((s) => s && s.length > 0); -}; - -export const sanitizePopulateField = (populate: Populate): Populate => { - if (!populate || populate === true || populate === "*") { - return undefined; - } - - if (Array.isArray(populate)) { - return populate - .map((item): Populate => sanitizePopulateField(item)); - } - - if ("object" === typeof populate) { - return Object.fromEntries( - Object.entries(populate).map( - ([key, value]) => [key, sanitizePopulateField(value)] as const - ) - ) as Record; - } - - return populate; -}; - -export const buildHookListener = - (contentTypeName: ContentType, { strapi }: StrapiContext) => - (hookName: LifeCycleHookName): [LifeCycleHookName, Effect] => - [ - hookName, - async (event) => { - const commonService: ICommonService = strapi - .plugin("navigation") - .service("common"); - - await commonService.runLifecycleHook({ - contentTypeName, - hookName, - event, - }); - }, - ]; - -export const buildAllHookListeners = ( - contentTypeName: ContentType, - context: StrapiContext, -): Record> => - Object.fromEntries( - allLifecycleHooks.map(buildHookListener(contentTypeName, context)) - ) as ToBeFixed; \ No newline at end of file diff --git a/setup-package.ts b/setup-package.ts index dbd02855..fbb5b900 100644 --- a/setup-package.ts +++ b/setup-package.ts @@ -10,19 +10,33 @@ import fs from 'fs'; // This script is called from within the build folder. It is important to include it in .npmignore, so it will not get published. -const sourceDirectory = __dirname + "/.."; -const destinationDirectory = __dirname; +const sourceDirectory = "."; +const destinationDirectory = "./build"; function main() { // Generate publish-ready package.json - const source = fs.readFileSync(__dirname + "/../package.json").toString("utf-8"); + const source = fs.readFileSync(__dirname + "/package.json").toString("utf-8"); const sourceObj = JSON.parse(source); sourceObj.scripts = {}; sourceObj.devDependencies = {}; fs.writeFileSync(`${destinationDirectory}/package.json`, Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8")); + // Copy additional files from source to destination - const filesToCopy = ["README.md", "LICENSE.md", ".npmignore"]; + const filesToOverwrite = ["strapi-admin.js", "strapi-server.js"]; + const filesToCopy = ["README.md", "LICENSE.md", ".npmignore", ...filesToOverwrite]; filesToCopy.forEach(file => fs.copyFileSync(`${sourceDirectory}/${file}`, `${destinationDirectory}/${file}`)); + + // Replace imports in core files in build folder + filesToOverwrite.forEach(file => fs.readFile(`${destinationDirectory}/${file}`, 'utf8', function (err,data) { + if (err) { + return console.log(err); + } + var result = data.replace(/build\//g, ''); + + fs.writeFile(`${destinationDirectory}/${file}`, result, 'utf8', function (err) { + if (err) return console.log(err); + }); + })); } main(); diff --git a/strapi-admin.ts b/strapi-admin.ts deleted file mode 100644 index 1b2d6bee..00000000 --- a/strapi-admin.ts +++ /dev/null @@ -1,3 +0,0 @@ -import admin from './admin/src'; - -export default admin; \ No newline at end of file diff --git a/strapi-server.ts b/strapi-server.ts deleted file mode 100644 index addb7f60..00000000 --- a/strapi-server.ts +++ /dev/null @@ -1,3 +0,0 @@ -import server from './server'; - -export = () => server; diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index e5991e2a..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "compilerOptions": { - "rootDir": "./", - "outDir": "build", - "target": "esnext", - "module": "commonjs", - "jsx": "react", - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "removeComments": true, - "sourceMap": true, - "declaration": true, - "declarationMap": true, - "downlevelIteration": true, - "incremental": true, - "allowJs": true, - "skipLibCheck": true, - "resolveJsonModule": true - }, - "include": [ - "./server/**/*", - "./admin/**/*", - "./types/**/*", - "./strapi-server.*", - "./strapi-admin.*", - "./setup-package.ts", - "./permissions.*" - ], - "exclude": [ - "**/node_modules/**/*", - "**/build/**/*" - ] -} \ No newline at end of file diff --git a/types/bootstrap.ts b/types/bootstrap.ts deleted file mode 100644 index b6a02366..00000000 --- a/types/bootstrap.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { StrapiContext } from "strapi-typed"; -import { NavigationPluginConfig } from "./config"; -import { Navigation } from "./contentTypes"; - -export interface IConfigSetupStrategy { - (context: StrapiContext): Promise; -} - -export interface INavigationSetupStrategy { - (context: StrapiContext): Promise; -} - -export interface IGraphQLSetupStrategy { - (context: StrapiContext): Promise; -} - -export interface IRestCacheSetupStrategy { - (context: StrapiContext): Promise; -} diff --git a/types/config.ts b/types/config.ts deleted file mode 100644 index 2e71c1e4..00000000 --- a/types/config.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NavigationItemAdditionalField } from "./contentTypes"; - -export type PluginConfigNameFields = Record; -export type PluginConfigPopulate = Record; -export type PluginConfigPathDefaultFields = Record; - -export type PluginConfigGraphQL = { - navigationItemRelated: string[]; -}; - -export type NavigationPluginConfig = { - additionalFields: NavigationItemAdditionalField[]; - contentTypes: string[]; - preferCustomContentTypes: boolean; - contentTypesNameFields: PluginConfigNameFields; - contentTypesPopulate: PluginConfigPopulate; - allowedLevels: number; - gql: PluginConfigGraphQL; - i18nEnabled: boolean; - pruneObsoleteI18nNavigations: boolean; - pathDefaultFields: PluginConfigPathDefaultFields; - cascadeMenuAttached: boolean; - isCacheEnabled: boolean; -}; - -export type StrapiConfig = { - default: T; -}; - -export type PluginConfigKeys = keyof NavigationPluginConfig; - -export type PluginDefaultConfigGetter = ( - key: PluginConfigKeys -) => NavigationPluginConfig[PluginConfigKeys]; diff --git a/types/contentTypes.ts b/types/contentTypes.ts deleted file mode 100644 index 02fefa9e..00000000 --- a/types/contentTypes.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Id, StringMap, TypeResult } from "strapi-typed"; -import { DateString, ToBeFixed } from "./utils"; - -export type Navigation = { - id: Id; - name: string; - slug: string; - visible?: boolean; - items?: NestedStructure>[]; - createdAt: string; - updatedAt: string; - localeCode?: string | null; - localizations?: Navigation[] | null -} - -export type NavigationItem = NavigationItemPartial & { - id?: number; - master: number; - parent: number | null; - audience: string[]; - externalPath?: string; - related: RelatedRef[]; - removed: boolean; - updated: boolean; - slug?: string -} -export type NavigationItemInput = NavigationItemPartial - & Omit - & { - related: RelatedRefBase[] - } - -export type NavigationItemEntity = TypeResult; - autoSync?: boolean -}> - -type NavigationItemPartial = { - path: string | null; - title: string; - type: NavigationItemType; - collapsed: boolean; - menuAttached: boolean; - order: number; - uiRouterKey: string; -} - -export type NestedStructure = T & { - items: NestedStructure[] -} - -export type RelatedRefBase = { - refId: number; - ref: string; - field: string; -} -export type RelatedRef = RelatedRefBase & { - id: Id; - __templateName?: string; - __contentType?: string; -} - -export type Audience = { - id: Id; - name: string; - key: string; -}; - -export type NavigationItemRelated = { - id: Id; - related_id: string; - related_type: string; - relatedType: string; - field: string; - order: number; - master: string; - __contentType?: string; - __templateName?: string; - navigationItemId?: Id; - localizations?: ToBeFixed; - refId?: Id; - ref?: string; -}; - -export type NavigationItemType = "INTERNAL" | "EXTERNAL" | "WRAPPER"; - -type EntityDatePartial = { - createdAt: DateString; - updatedAt: DateString; -} - -export type NotVoid = T extends undefined ? never : T; - -export type NavigationItemCustomFieldType = 'boolean' | 'string' | 'select' | 'media'; -type NavigationItemCustomFieldBase = { - name: string; - label: string; - required: boolean; - enabled?: boolean; -} -type NavigationItemCustomFieldSelect = NavigationItemCustomFieldBase & { - type: 'select'; - multi: boolean; - options: string[]; -} - -type NavigationItemCustomFieldPrimitive = NavigationItemCustomFieldBase & { - type: 'boolean' | 'string'; - multi: false; - options: []; -} - -type NavigationItemCustomFieldMedia = NavigationItemCustomFieldBase & { - type: 'media'; - multi: false; - options: []; -} - -export type NavigationItemCustomField = NavigationItemCustomFieldPrimitive | NavigationItemCustomFieldSelect | NavigationItemCustomFieldMedia; - -export type NavigationItemAdditionalField = NavigationItemCustomField | 'audience'; -export type NavigationItemAdditionalFieldValues = Record; diff --git a/types/controllers.ts b/types/controllers.ts deleted file mode 100644 index 4798ed0f..00000000 --- a/types/controllers.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { StrapiController } from "strapi-typed"; -import { Navigation, NotVoid } from "./contentTypes"; -import { IAdminService, IClientService, ICommonService } from "./services"; -import { AuditLogContext, StrapiControllerContext, ToBeFixed } from "./utils"; - -type ControllerCommonContext = { - auditLog: AuditLogContext; -}; - -export interface IAdminController { - getAdminService(): IAdminService; - getCommonService(): ICommonService; - config: () => ToBeFixed; - get: StrapiController>>; - getById: StrapiController, never, never, { id: string }>; - getContentTypeItems: (ctx: StrapiControllerContext) => ToBeFixed; - post: StrapiController, Navigation, never, never, ControllerCommonContext>; - put: StrapiController, Navigation, never, { id: string }, ControllerCommonContext>; - delete: StrapiController, never, never, { id: string }, ControllerCommonContext>; - restoreConfig: (ctx: StrapiControllerContext) => ToBeFixed; - settingsConfig: () => ToBeFixed; - settingsRestart: (ctx: StrapiControllerContext) => ToBeFixed; - updateConfig: (ctx: StrapiControllerContext) => ToBeFixed; - fillFromOtherLocale: StrapiController, never, never, { source: string, target: string }, ControllerCommonContext>, - readNavigationItemFromLocale: StrapiController[number], 'path' | 'related' | 'type' | 'uiRouterKey' | 'title' | 'externalPath'> - > - >, never, { path?: string }, { source: string, target: string }, ControllerCommonContext>; - getSlug: StrapiController, never, { q: string }>; - purgeNavigationsCache: StrapiController>; - purgeNavigationCache: StrapiController, never, { clearLocalisations?: 'true' | 'false' }, { id: string }>; -}; - -export interface IClientController { - getService: () => IClientService; - - render: (ctx: StrapiControllerContext) => ToBeFixed; - renderChild: (ctx: StrapiControllerContext) => ToBeFixed; - readAll: (ctx: StrapiControllerContext) => ToBeFixed; -}; - -export type NavigationController = { - admin: IAdminController; - client: IClientController; -}; diff --git a/types/graphQL.ts b/types/graphQL.ts deleted file mode 100644 index b6c7d8b8..00000000 --- a/types/graphQL.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ToBeFixed } from "./utils"; - -export type Nexus = ToBeFixed; diff --git a/types/i18n.ts b/types/i18n.ts deleted file mode 100644 index f74b6a69..00000000 --- a/types/i18n.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type I18nLocale = { - id: number; - name: string; - code: string; -}; - -export type I18nQueryParams = { - locale?: string -} \ No newline at end of file diff --git a/types/index.ts b/types/index.ts deleted file mode 100644 index d99a09eb..00000000 --- a/types/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './config'; -export * from './contentTypes'; -export * from './controllers'; -export * from './i18n'; -export * from './services'; -export * from './utils'; -export * from './bootstrap'; -export * from './graphQL'; -export * from './lifecycle'; diff --git a/types/lifecycle.ts b/types/lifecycle.ts deleted file mode 100644 index 00919f21..00000000 --- a/types/lifecycle.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Effect } from "./utils"; - -export type LifeCycleHookName = - | "beforeCreate" - | "beforeCreateMany" - | "afterCreate" - | "afterCreateMany" - | "beforeUpdate" - | "beforeUpdateMany" - | "afterUpdate" - | "afterUpdateMany" - | "beforeDelete" - | "beforeDeleteMany" - | "afterDelete" - | "afterDeleteMany" - | "beforeCount" - | "afterCount" - | "beforeFindOne" - | "afterFindOne" - | "beforeFindMany" - | "afterFindMany"; - -export interface LifeCycleEvent< - THookName extends LifeCycleHookName = LifeCycleHookName, - TResult = unknown, - TParams = Record -> { - action: THookName; - model: { - singularName: string; - uid: string; - tableName: string; - attributes: Record; - lifecycles: Partial>>; - indexes: Array<{ - type?: string; - name: string; - columns: string[]; - }>; - columnToAttribute: Record; - }; - state: Record; - params: TParams; - result?: TResult | TResult[]; -} diff --git a/types/services.ts b/types/services.ts deleted file mode 100644 index 50099d22..00000000 --- a/types/services.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Id, StrapiContentType, StrapiEvents, StrapiStore, StringMap } from "strapi-typed"; -import { NavigationPluginConfig } from "./config"; -import { Navigation, NavigationItem, NavigationItemCustomField, NavigationItemEntity, NavigationItemInput, NestedStructure, NotVoid, RelatedRef, RelatedRefBase } from "./contentTypes"; -import { I18nQueryParams } from "./i18n"; -import { AuditLogContext, ContentTypeEntity, Effect, NavigationActions, NavigationActionsPerItem, PopulateQueryParam, RenderType, RFRNavItem, ToBeFixed } from "./utils"; -import { ContentType } from "../server/utils"; -import { LifeCycleEvent, LifeCycleHookName } from "./lifecycle"; - -export type NavigationServiceName = "common" | "admin" | "client" -export type NavigationService = ICommonService | IAdminService | IClientService - -export interface IAdminService { - config: (viaSettingsPage?: boolean) => Promise, - get: (ids?: Array, ignoreLocale?: boolean) => Promise, - getById: (id: Id) => Promise, - post: (payload: ToBeFixed, auditLog: AuditLogContext) => ToBeFixed, - put: (id: Id, payload: ToBeFixed, auditLog: AuditLogContext) => ToBeFixed, - delete: (id: Id, auditLog: AuditLogContext) => Promise, - restart: () => Promise, - restoreConfig: () => Promise, - updateConfig: (newConfig: NavigationPluginConfig) => Promise, - fillFromOtherLocale(payload: { source: number; target: number; auditLog: AuditLogContext }): Promise; - readNavigationItemFromLocale(payload: { source: number; target: number; path: string; }): Promise< - Partial< - Pick[number], 'path' | 'related' | 'type' | 'uiRouterKey' | 'title' | 'externalPath'> - > - >; - purgeNavigationsCache: () => Promise<{ success: boolean }>; - purgeNavigationCache: (id: Id, clearLocalisations?: boolean) => Promise<{ success: boolean }>; -} - -export interface ICommonService { - analyzeBranch: (items: NestedStructure[], masterEntity: Navigation | null, parentItem?: ToBeFixed, prevOperations?: NavigationActions) => Promise, - configContentTypes: (viaSettingsPage?: boolean) => Promise[]>, - createBranch: (items: NestedStructure[], masterEntity: Navigation | null, parentItem: NavigationItemEntity | null, operations: NavigationActions) => ToBeFixed, - emitEvent: (uid: string, event: StrapiEvents, entity: ToBeFixed) => Promise, - getBranchName: (item: NavigationItem) => keyof NavigationActionsPerItem | void, - getContentTypeItems: (uid: string, query: StringMap) => Promise, - getIdsRelated: (relatedItems: RelatedRefBase[] | RelatedRef[] | null, master: number) => Promise, - getPluginStore: () => Promise, - getRelatedItems: (entityItems: NavigationItemEntity[], populate?: PopulateQueryParam) => Promise[]>, - pruneCustomFields: (removedFields: NavigationItemCustomField[]) => Promise, - removeBranch: (items: NestedStructure[], operations: NavigationActions) => ToBeFixed, - removeRelated: (relatedItems: RelatedRef[], master: number) => ToBeFixed - setDefaultConfig: () => Promise, - updateBranch: (toUpdate: NestedStructure[], masterEntity: Navigation | null, parentItem: NavigationItemEntity | null, operations: NavigationActions) => ToBeFixed, - getSlug(query: string): Promise; - registerLifecycleHook(input: { hookName: LifeCycleHookName, callback: Effect, contentTypeName: ContentType }): void; - runLifecycleHook(input: { hookName: LifeCycleHookName, event: LifeCycleEvent, contentTypeName: ContentType }): Promise; -} - -export interface IClientService { - readAll: (input: { orderBy?: string, orderDirection?: string } & I18nQueryParams) => Promise, - render: (input: { idOrSlug: Id, type?: RenderType, menuOnly?: boolean, rootPath?: string, wrapRelated?: boolean, populate?: PopulateQueryParam } & I18nQueryParams) => Promise, - renderChildren: (input: { idOrSlug: Id, childUIKey: string, type?: RenderType, menuOnly?: boolean, wrapRelated?: boolean } & I18nQueryParams) => Promise, - renderRFR: (input: { items: NestedStructure[], parent?: Id | null, parentNavItem?: RFRNavItem | null, contentTypes: string[], enabledCustomFieldsNames: string[] }) => ToBeFixed, - renderRFRNav: (item: NavigationItem) => RFRNavItem, - renderRFRPage: (item: NavigationItem & { related: ToBeFixed }, parent: Id | null, enabledCustomFieldsNames: string[]) => ToBeFixed, - renderTree(items: NavigationItemEntity[], id: Id | null, field: keyof NavigationItemEntity, path: string | undefined, itemParser: ToBeFixed): ToBeFixed, - renderType: (input: { type: RenderType, criteria: ToBeFixed, itemCriteria: ToBeFixed, filter: ToBeFixed, rootPath: string | null, wrapRelated?: boolean, populate?: PopulateQueryParam } & I18nQueryParams) => ToBeFixed, -} diff --git a/types/utils.ts b/types/utils.ts deleted file mode 100644 index ed15d59a..00000000 --- a/types/utils.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Id, PopulateClause } from "strapi-typed"; -import { Navigation, NavigationItem, NavigationItemType, NestedStructure } from "./contentTypes" - -export type Effect = (value: T) => void -export type VoidEffect = Effect -export type NavigationActionsCategories = 'toCreate' | 'toUpdate' | 'toRemove'; -export type RenderTypeOptions = Readonly<{ - FLAT: 'FLAT' - TREE: 'TREE' - RFR: 'RFR' -}>; -export type RenderType = keyof RenderTypeOptions; -export type StrapiRoutesTypes = 'admin' | 'content-api'; -export type ToBeFixed = any; -export type DateString = string; -export type PopulateQueryParam = string | PopulateClause; - -export type PluginPermissions = { - canAccess: boolean; - canUpdate?: boolean; - canUpdateSettings?: boolean; -}; - -export type NavigationActions = { - create?: boolean; - update?: boolean; - remove?: boolean; -}; - -export type NavigationActionsPerItem = Record< - NavigationActionsCategories, - NestedStructure[] ->; - -export type AuditLogContext = any; -export type AuditLogParams = { - actionType: string; - oldEntity: Navigation; - newEntity: Navigation; -} | { - actionType: "DELETE"; - entity: Navigation; -}; - -export type ContentTypeEntity = { - id: Id; -} & Record; - -export type NestedPath = { - id: Id; - parent?: { - id: Id; - path: string; - }; - path: string; -}; - -export type RFRNavItem = { - label?: string; - type: NavigationItemType; - page?: string; - url?: string; - audience?: string[]; -}; - -export type StrapiRoute = { - method: string; - path: string; - handler: string; - config?: ToBeFixed; -}; - -export type StrapiRoutes = { - type: StrapiRoutesTypes; - routes: StrapiRoute[]; -}; - -export type StrapiControllerContext = any; -export type StrapiControllerContextParams = any; - -export const assertNotEmpty: ( - value: T | null | undefined, - customError?: Error -) => asserts value is T = (value, customError) => { - if (value !== undefined && value !== null) { - return; - } - - throw customError ?? new Error("Non-empty value expected, empty given"); -}; - -export const isNumber = (x: unknown) => - typeof x === "number" && !Number.isNaN(x); - -export const assertIsNumber: ( - n: unknown, - customError?: Error -) => asserts n is number = (n: unknown, customError?: Error) => { - if (isNumber(n)) { - return; - } - - throw customError ?? new Error(`Number is expected. "${typeof n}" given`); -}; - -export const assertEntity = (entity: unknown, name = "Entity"): T => { - if (entity instanceof Object && entity.hasOwnProperty("id")) { - return entity as T; - } - - throw new Error(`${name} instance expected. ${typeof entity} given.`); -}; - -export function assertBoolean(value: unknown): asserts value is boolean { - if (typeof value === "boolean") { - return; - } - - throw new Error("Value is not of type boolean"); -} - -export function assertString(value: unknown): asserts value is string { - if (typeof value === "string") { - return; - } - - throw new Error("Value is not of type string"); -} diff --git a/yarn.lock b/yarn.lock index a3cf8f8f..e9fa0ccd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,9973 +1,18190 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@apollo/protobufjs@1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.4.tgz#d913e7627210ec5efd758ceeb751c776c68ba133" - integrity sha512-npVJ9NVU/pynj+SCU+fambvTneJDyCnif738DnZ7pCxdDtzeEz7WkpSIq5wNUmWm5Td55N+S2xfqZ+WP4hDLng== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" - long "^4.0.0" - -"@apollo/protobufjs@1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.6.tgz#d601e65211e06ae1432bf5993a1a0105f2862f27" - integrity sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" - long "^4.0.0" - -"@apollo/utils.dropunuseddefinitions@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" - integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== - -"@apollo/utils.keyvaluecache@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz#46f310f859067efe9fa126156c6954f8381080d2" - integrity sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA== - dependencies: - "@apollo/utils.logger" "^1.0.0" - lru-cache "^7.10.1" - -"@apollo/utils.logger@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-1.0.0.tgz#6e3460a2250c2ef7c2c3b0be6b5e148a1596f12b" - integrity sha512-dx9XrjyisD2pOa+KsB5RcDbWIAdgC91gJfeyLCgy0ctJMjQe7yZK5kdWaWlaOoCeX0z6YI9iYlg7vMPyMpQF3Q== - -"@apollo/utils.printwithreducedwhitespace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz#c466299a4766eef8577a2a64c8f27712e8bd7e30" - integrity sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q== - -"@apollo/utils.removealiases@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz#75f6d83098af1fcae2d3beb4f515ad4a8452a8c1" - integrity sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A== - -"@apollo/utils.sortast@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz#93218c7008daf3e2a0725196085a33f5aab5ad07" - integrity sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA== - dependencies: - lodash.sortby "^4.7.0" - -"@apollo/utils.stripsensitiveliterals@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz#4920651f36beee8e260e12031a0c5863ad0c7b28" - integrity sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w== - -"@apollo/utils.usagereporting@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.0.tgz#b81df180f4ca78b91a22cb49105174a7f070db1e" - integrity sha512-5PL7hJMkTPmdo3oxPtigRrIyPxDk/ddrUryHPDaezL1lSFExpNzsDd2f1j0XJoHOg350GRd3LyD64caLA2PU1w== - dependencies: - "@apollo/utils.dropunuseddefinitions" "^1.1.0" - "@apollo/utils.printwithreducedwhitespace" "^1.1.0" - "@apollo/utils.removealiases" "1.0.0" - "@apollo/utils.sortast" "^1.1.0" - "@apollo/utils.stripsensitiveliterals" "^1.2.0" - apollo-reporting-protobuf "^3.3.1" - -"@apollographql/apollo-tools@^0.5.3": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz#cb3998c6cf12e494b90c733f44dd9935e2d8196c" - integrity sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw== - -"@apollographql/graphql-playground-html@1.6.29": - version "1.6.29" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" - integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== - dependencies: - xss "^1.0.8" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.16.7", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== - -"@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/core@^7.11.6": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.18.9", "@babel/generator@^7.7.2": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" - integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== - dependencies: - "@babel/types" "^7.18.9" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== - dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.16.7": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== - dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.9.2": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" - integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.13": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.21.0": - version "7.22.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.0.tgz#b7ca53ae391c404037540724186038afd83e26f9" - integrity sha512-TT6NB0oszYQ4oxLNUdG+FNHIc3MohXVCKA2BeyQ4WeM2VCSC6wBZ6P0Yfkdzxv+87D8Xk0LJyHeCKlWMvpZt0g== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" - integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.18.6", "@babel/template@^7.3.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@babel/types@^7.23.6", "@babel/types@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@casl/ability@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@casl/ability/-/ability-6.5.0.tgz#a151a7637886099b8ffe52a96601225004a5c157" - integrity sha512-3guc94ugr5ylZQIpJTLz0CDfwNi0mxKVECj1vJUPAvs+Lwunh/dcuUjwzc4MHM9D8JOYX0XUZMEPedpB3vIbOw== - dependencies: - "@ucast/mongo2js" "^1.3.0" - -"@codemirror/autocomplete@^6.0.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.4.2.tgz#938b25223bd21f97b2a6d85474643355f98b505b" - integrity sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.6.0" - "@lezer/common" "^1.0.0" - -"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.1.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.2.2.tgz#437d9ba275107dbc629f0bfa3b150e0e43f2a218" - integrity sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.2.0" - "@codemirror/view" "^6.0.0" - "@lezer/common" "^1.0.0" - -"@codemirror/lang-json@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.1.tgz#0a0be701a5619c4b0f8991f9b5e95fe33f462330" - integrity sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ== - dependencies: - "@codemirror/language" "^6.0.0" - "@lezer/json" "^1.0.0" - -"@codemirror/language@^6.0.0": - version "6.6.0" - resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.6.0.tgz#2204407174a38a68053715c19e28ad61f491779f" - integrity sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg== - dependencies: - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - "@lezer/common" "^1.0.0" - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - style-mod "^4.0.0" - -"@codemirror/lint@^6.0.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.2.0.tgz#25cdab7425fcda1b38a9d63f230f833c8b6b369f" - integrity sha512-KVCECmR2fFeYBr1ZXDVue7x3q5PMI0PzcIbA+zKufnkniMBo1325t0h1jM85AKp8l3tj67LRxVpZfgDxEXlQkg== - dependencies: - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - crelt "^1.0.5" - -"@codemirror/search@^6.0.0": - version "6.3.0" - resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.3.0.tgz#d48b2d636fc7474613e240ba8e56c4c5e6e51822" - integrity sha512-rBhZxzT34CarfhgCZGhaLBScABDN3iqJxixzNuINp9lrb3lzm0nTpR77G1VrxGO3HOGK7j62jcJftQM7eCOIuw== - dependencies: - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - crelt "^1.0.5" - -"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.1", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.2.0.tgz#a0fb08403ced8c2a68d1d0acee926bd20be922f2" - integrity sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA== - -"@codemirror/theme-one-dark@^6.0.0": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.1.tgz#76600555cbb314c495216f018f75b0c28daff158" - integrity sha512-+CfzmScfJuD6uDF5bHJkAjWTQ2QAAHxODCPxUEgcImDYcJLT+4l5vLnBHmDVv46kCC5uUJGMrBJct2Z6JbvqyQ== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - "@lezer/highlight" "^1.0.0" - -"@codemirror/view@^6.0.0", "@codemirror/view@^6.6.0": - version "6.9.3" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.9.3.tgz#4475dc0ff5d9a55f8144ad7484e7e17416861cce" - integrity sha512-BJ5mvEIhFM+SrNwc5X8pLIvMM9ffjkviVbxpg84Xk2OE8ZyKaEbId8kX+nAYEEso7+qnbwsXe1bkAHsasebMow== - dependencies: - "@codemirror/state" "^6.1.4" - style-mod "^4.0.0" - w3c-keyname "^2.2.4" - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@colors/colors@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@emotion/babel-plugin@^11.10.6": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" - integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.1.3" - -"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" - integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== - dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" - -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== - -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== - -"@emotion/react@^11.8.1": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== - dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== - -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== - -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== - -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== - -"@esbuild/aix-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" - integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/android-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" - integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== - -"@esbuild/android-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" - integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" - integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== - -"@esbuild/android-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" - integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" - integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== - -"@esbuild/android-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" - integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/darwin-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" - integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== - -"@esbuild/darwin-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" - integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" - integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== - -"@esbuild/darwin-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" - integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/freebsd-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" - integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== - -"@esbuild/freebsd-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" - integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" - integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== - -"@esbuild/freebsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" - integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/linux-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" - integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== - -"@esbuild/linux-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" - integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" - integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== - -"@esbuild/linux-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" - integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" - integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== - -"@esbuild/linux-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" - integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-loong64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" - integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== - -"@esbuild/linux-loong64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" - integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-mips64el@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" - integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== - -"@esbuild/linux-mips64el@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" - integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-ppc64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" - integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== - -"@esbuild/linux-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" - integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-riscv64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" - integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== - -"@esbuild/linux-riscv64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" - integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-s390x@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" - integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== - -"@esbuild/linux-s390x@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" - integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" - integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== - -"@esbuild/linux-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" - integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/netbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" - integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== - -"@esbuild/netbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" - integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/openbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" - integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== - -"@esbuild/openbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" - integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/sunos-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" - integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== - -"@esbuild/sunos-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" - integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/win32-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" - integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== - -"@esbuild/win32-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" - integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" - integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== - -"@esbuild/win32-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" - integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" - integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== - -"@esbuild/win32-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" - integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@floating-ui/core@^1.2.4": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.5.tgz#612f0d203e6f647490d572c7b798eebac9e3cf54" - integrity sha512-qrcbyfnRVziRlB6IYwjCopYhO7Vud750JlJyuljruIXcPxr22y8zdckcJGsuOdnQ639uVD1tTXddrcH3t3QYIQ== - -"@floating-ui/core@^1.4.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.2.tgz#53a0f7a98c550e63134d504f26804f6b83dbc071" - integrity sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A== - dependencies: - "@floating-ui/utils" "^0.1.3" - -"@floating-ui/core@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== - dependencies: - "@floating-ui/utils" "^0.2.1" - -"@floating-ui/dom@^1.0.1": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.5.tgz#c9ec259a24ce0958b1ea29674df4eee4455361a9" - integrity sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ== - dependencies: - "@floating-ui/core" "^1.2.4" - -"@floating-ui/dom@^1.5.1": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" - integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== - dependencies: - "@floating-ui/core" "^1.4.2" - "@floating-ui/utils" "^0.1.3" - -"@floating-ui/dom@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.1.tgz#d552e8444f77f2d88534372369b3771dc3a2fa5d" - integrity sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ== - dependencies: - "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.1" - -"@floating-ui/react-dom@^2.0.0": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec" - integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ== - dependencies: - "@floating-ui/dom" "^1.5.1" - -"@floating-ui/react-dom@^2.0.8": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d" - integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== - dependencies: - "@floating-ui/dom" "^1.6.1" - -"@floating-ui/utils@^0.1.3": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" - integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== - -"@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== - -"@formatjs/ecma402-abstract@1.14.3": - version "1.14.3" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz#6428f243538a11126180d121ce8d4b2f17465738" - integrity sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg== - dependencies: - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - -"@formatjs/fast-memoize@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" - integrity sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA== - dependencies: - tslib "^2.4.0" - -"@formatjs/icu-messageformat-parser@2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.3.0.tgz#8e8fd577c3e39454ef14bba4963f2e1d5f2cc46c" - integrity sha512-xqtlqYAbfJDF4b6e4O828LBNOWXrFcuYadqAbYORlDRwhyJ2bH+xpUBPldZbzRGUN2mxlZ4Ykhm7jvERtmI8NQ== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/icu-skeleton-parser" "1.3.18" - tslib "^2.4.0" - -"@formatjs/icu-messageformat-parser@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.3.1.tgz#953080ea5c053bc73bdf55d0a524a3c3c133ae6b" - integrity sha512-knF2AkAKN4Upv4oIiKY4Wd/dLH68TNMPgV/tJMu/T6FP9aQwbv8fpj7U3lkyniPaNVxvia56Gxax8MKOjtxLSQ== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/icu-skeleton-parser" "1.3.18" - tslib "^2.4.0" - -"@formatjs/icu-skeleton-parser@1.3.18": - version "1.3.18" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz#7aed3d60e718c8ad6b0e64820be44daa1e29eeeb" - integrity sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - tslib "^2.4.0" - -"@formatjs/intl-displaynames@6.2.6": - version "6.2.6" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.2.6.tgz#6bc02fe0bf6571391aac0e01e74ecbf38542ff32" - integrity sha512-scf5AQTk9EjpvPhboo5sizVOvidTdMOnajv9z+0cejvl7JNl9bl/aMrNBgC72UH+bP3l45usPUKAGskV6sNIrA== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - -"@formatjs/intl-displaynames@6.3.1": - version "6.3.1" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.3.1.tgz#6dcea7cb801460e2a8fa63eb38c54aa1b24f92c0" - integrity sha512-TlxguMDUbnFrJ4NA8fSyqXC62M7czvlRJ5mrJgtB91JVA+QPjjNdcRm1qPIC/DcU/pGUDcEzThn/x5A+jp15gg== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - -"@formatjs/intl-listformat@7.1.9": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.9.tgz#0c2ce67b610054f215dd2635a6da7da308cfbe3d" - integrity sha512-5YikxwRqRXTVWVujhswDOTCq6gs+m9IcNbNZLa6FLtyBStAjEsuE2vAU+lPsbz9ZTST57D5fodjIh2JXT6sMWQ== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - -"@formatjs/intl-listformat@7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.2.1.tgz#874eddc7d53ba2e3fd911bf30efc459fc99f08db" - integrity sha512-fRJFWLrGa7d25I4JSxNjKX29oXGcIXx8fJjgURnvs2C3ijS4gurUgFrUwLbv/2KfPfyJ5g567pz2INelNJZBdw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - -"@formatjs/intl-localematcher@0.2.32": - version "0.2.32" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz#00d4d307cd7d514b298e15a11a369b86c8933ec1" - integrity sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ== - dependencies: - tslib "^2.4.0" - -"@formatjs/intl@2.6.9": - version "2.6.9" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.6.9.tgz#d4bdd8c21888f579a95341580141d0aafe761610" - integrity sha512-EtcMZ9O24YSASu/jGOaTQtArx7XROjlKiO4KmkxJ/3EyAQLCr5hrS+KKvNud0a7GIwBucOb3IFrZ7WiSm2A/Cw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.3.0" - "@formatjs/intl-displaynames" "6.2.6" - "@formatjs/intl-listformat" "7.1.9" - intl-messageformat "10.3.3" - tslib "^2.4.0" - -"@formatjs/intl@2.7.1": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.7.1.tgz#f7e052ff09e9fe019ad83d4139af0de40084a2ae" - integrity sha512-se6vxidsN3PCmzqTsDd3YDT4IX9ZySPy39LYhF7x2ssNvlGMOuW3umkrIhKkXB7ZskqsJGY53LVCdiHsSwhGng== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.3.1" - "@formatjs/intl-displaynames" "6.3.1" - "@formatjs/intl-listformat" "7.2.1" - intl-messageformat "10.3.4" - tslib "^2.4.0" - -"@graphql-tools/merge@8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.0.tgz#d3a8ba10942f8598788c3e03f97cc1d0c0b055f8" - integrity sha512-xRa7RAQok/0DD2YnjuqikMrr7dUAxTpdGtZ7BkvUUGhYs3B3p7reCAfvOVr1DJAqVToP7hdlMk+S5+Ylk+AaqA== - dependencies: - "@graphql-tools/utils" "8.8.0" - tslib "^2.4.0" - -"@graphql-tools/merge@8.3.1": - version "8.3.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" - integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== - dependencies: - "@graphql-tools/utils" "8.9.0" - tslib "^2.4.0" - -"@graphql-tools/mock@^8.1.2": - version "8.7.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.0.tgz#da286596ef05b84165e76cf6f608eeea4109a60c" - integrity sha512-K/hqP442mXAvW36v/3TmqFpNzRw14P86xlsJZod88OXwpDfb97X09z1QsaMcvSe8E7ijcKWLlTRk15/vDQSL2Q== - dependencies: - "@graphql-tools/schema" "8.5.0" - "@graphql-tools/utils" "8.8.0" - fast-json-stable-stringify "^2.1.0" - tslib "^2.4.0" - -"@graphql-tools/schema@8.5.0", "@graphql-tools/schema@^8.0.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.0.tgz#0332b3a2e674d16e9bf8a58dfd47432449ce2368" - integrity sha512-VeFtKjM3SA9/hCJJfr95aEdC3G0xIKM9z0Qdz4i+eC1g2fdZYnfWFt2ucW4IME+2TDd0enHlKzaV0qk2SLVUww== - dependencies: - "@graphql-tools/merge" "8.3.0" - "@graphql-tools/utils" "8.8.0" - tslib "^2.4.0" - value-or-promise "1.0.11" - -"@graphql-tools/schema@8.5.1": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" - integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== - dependencies: - "@graphql-tools/merge" "8.3.1" - "@graphql-tools/utils" "8.9.0" - tslib "^2.4.0" - value-or-promise "1.0.11" - -"@graphql-tools/utils@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.8.0.tgz#8332ff80a1da9204ccf514750dd6f5c5cccf17dc" - integrity sha512-KJrtx05uSM/cPYFdTnGAS1doL5bftJLAiFCDMZ8Vkifztz3BFn3gpFiy/o4wDtM8s39G46mxmt2Km/RmeltfGw== - dependencies: - tslib "^2.4.0" - -"@graphql-tools/utils@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" - integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== - dependencies: - tslib "^2.4.0" - -"@graphql-tools/utils@^8.13.1": - version "8.13.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.1.tgz#b247607e400365c2cd87ff54654d4ad25a7ac491" - integrity sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw== - dependencies: - tslib "^2.4.0" - -"@internationalized/date@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.2.tgz#d760ace32bb47e869b8c607a4a786c8b208aacc2" - integrity sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ== - dependencies: - "@swc/helpers" "^0.5.0" - -"@internationalized/number@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.5.1.tgz#8e3359b498aec6bb865be668ef7e794a424067a7" - integrity sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg== - dependencies: - "@swc/helpers" "^0.5.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/core@^29.6.0", "@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3", "@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@29.5.x": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^29.6.0", "@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@josephg/resolvable@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" - integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@juggle/resize-observer@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" - integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== - -"@koa/cors@5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-5.0.0.tgz#0029b5f057fa0d0ae0e37dd2c89ece315a0daffd" - integrity sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw== - dependencies: - vary "^1.1.2" - -"@koa/cors@^3.1.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-3.3.0.tgz#b4c1c7ee303b7c968c8727f2a638a74675b50bb2" - integrity sha512-lzlkqLlL5Ond8jb6JLnVVDmD2OPym0r5kvZlMgAWiS9xle+Q5ulw1T358oW+RVguxUkANquZQz82i/STIRmsqQ== - dependencies: - vary "^1.1.2" - -"@koa/router@10.1.1", "@koa/router@^10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@koa/router/-/router-10.1.1.tgz#8e5a85c9b243e0bc776802c0de564561e57a5f78" - integrity sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw== - dependencies: - debug "^4.1.1" - http-errors "^1.7.3" - koa-compose "^4.1.0" - methods "^1.1.2" - path-to-regexp "^6.1.0" - -"@lezer/common@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.0.2.tgz#8fb9b86bdaa2ece57e7d59e5ffbcb37d71815087" - integrity sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng== - -"@lezer/highlight@^1.0.0": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.1.4.tgz#98ed821e89f72981b7ba590474e6ee86c8185619" - integrity sha512-IECkFmw2l7sFcYXrV8iT9GeY4W0fU4CxX0WMwhmhMIVjoDdD1Hr6q3G2NqVtLg/yVe5n7i4menG3tJ2r4eCrPQ== - dependencies: - "@lezer/common" "^1.0.0" - -"@lezer/json@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@lezer/json/-/json-1.0.0.tgz#848ad9c2c3e812518eb02897edd5a7f649e9c160" - integrity sha512-zbAuUY09RBzCoCA3lJ1+ypKw5WSNvLqGMtasdW6HvVOqZoCpPr8eWrsGnOVWGKGn8Rh21FnrKRVlJXrGAVUqRw== - dependencies: - "@lezer/highlight" "^1.0.0" - "@lezer/lr" "^1.0.0" - -"@lezer/lr@^1.0.0": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.3.3.tgz#0ac6c889f1235874f33c45a1b9785d7054f60708" - integrity sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w== - dependencies: - "@lezer/common" "^1.0.0" - -"@pmmmwh/react-refresh-webpack-plugin@0.5.11": - version "0.5.11" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" - integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== - dependencies: - ansi-html-community "^0.0.8" - common-path-prefix "^3.0.0" - core-js-pure "^3.23.3" - error-stack-parser "^2.0.6" - find-up "^5.0.0" - html-entities "^2.1.0" - loader-utils "^2.0.4" - schema-utils "^3.0.0" - source-map "^0.7.3" - -"@polka/url@^1.0.0-next.24": - version "1.0.0-next.24" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3" - integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@radix-ui/number@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" - integrity sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/primitive@1.0.1", "@radix-ui/primitive@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" - integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-arrow@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" - integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.3" - -"@radix-ui/react-collection@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" - integrity sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-slot" "1.0.2" - -"@radix-ui/react-compose-refs@1.0.1", "@radix-ui/react-compose-refs@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" - integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-context@1.0.1", "@radix-ui/react-context@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" - integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-direction@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" - integrity sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-dismissable-layer@1.0.5", "@radix-ui/react-dismissable-layer@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" - integrity sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-escape-keydown" "1.0.3" - -"@radix-ui/react-dropdown-menu@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz#cdf13c956c5e263afe4e5f3587b3071a25755b63" - integrity sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-id" "1.0.1" - "@radix-ui/react-menu" "2.0.6" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-controllable-state" "1.0.1" - -"@radix-ui/react-focus-guards@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" - integrity sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-focus-scope@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" - integrity sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - -"@radix-ui/react-id@1.0.1", "@radix-ui/react-id@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" - integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.1" - -"@radix-ui/react-menu@2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.0.6.tgz#2c9e093c1a5d5daa87304b2a2f884e32288ae79e" - integrity sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-collection" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-dismissable-layer" "1.0.5" - "@radix-ui/react-focus-guards" "1.0.1" - "@radix-ui/react-focus-scope" "1.0.4" - "@radix-ui/react-id" "1.0.1" - "@radix-ui/react-popper" "1.1.3" - "@radix-ui/react-portal" "1.0.4" - "@radix-ui/react-presence" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-roving-focus" "1.0.4" - "@radix-ui/react-slot" "1.0.2" - "@radix-ui/react-use-callback-ref" "1.0.1" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.5" - -"@radix-ui/react-popper@1.1.3", "@radix-ui/react-popper@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.3.tgz#24c03f527e7ac348fabf18c89795d85d21b00b42" - integrity sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w== - dependencies: - "@babel/runtime" "^7.13.10" - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - "@radix-ui/react-use-rect" "1.0.1" - "@radix-ui/react-use-size" "1.0.1" - "@radix-ui/rect" "1.0.1" - -"@radix-ui/react-portal@1.0.4", "@radix-ui/react-portal@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" - integrity sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.3" - -"@radix-ui/react-presence@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" - integrity sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - -"@radix-ui/react-primitive@1.0.3", "@radix-ui/react-primitive@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" - integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-slot" "1.0.2" - -"@radix-ui/react-roving-focus@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" - integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-collection" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-id" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-controllable-state" "1.0.1" - -"@radix-ui/react-separator@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.0.3.tgz#be5a931a543d5726336b112f465f58585c04c8aa" - integrity sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.3" - -"@radix-ui/react-slot@1.0.2", "@radix-ui/react-slot@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" - integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.1" - -"@radix-ui/react-toggle-group@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz#f5b5c8c477831b013bec3580c55e20a68179d6ec" - integrity sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-roving-focus" "1.0.4" - "@radix-ui/react-toggle" "1.0.3" - "@radix-ui/react-use-controllable-state" "1.0.1" - -"@radix-ui/react-toggle@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz#aecb2945630d1dc5c512997556c57aba894e539e" - integrity sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-controllable-state" "1.0.1" - -"@radix-ui/react-toolbar@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz#3211a105567fa016e89921b5b514877f833de559" - integrity sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-roving-focus" "1.0.4" - "@radix-ui/react-separator" "1.0.3" - "@radix-ui/react-toggle-group" "1.0.4" - -"@radix-ui/react-use-callback-ref@1.0.1", "@radix-ui/react-use-callback-ref@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" - integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-use-controllable-state@1.0.1", "@radix-ui/react-use-controllable-state@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" - integrity sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.1" - -"@radix-ui/react-use-escape-keydown@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" - integrity sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-callback-ref" "1.0.1" - -"@radix-ui/react-use-layout-effect@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" - integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-use-previous@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz#b595c087b07317a4f143696c6a01de43b0d0ec66" - integrity sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-use-rect@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" - integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/rect" "1.0.1" - -"@radix-ui/react-use-size@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" - integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-use-layout-effect" "1.0.1" - -"@radix-ui/react-visually-hidden@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" - integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.3" - -"@radix-ui/rect@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" - integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== - dependencies: - "@babel/runtime" "^7.13.10" - -"@react-dnd/asap@^5.0.1": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-5.0.2.tgz#1f81f124c1cd6f39511c11a881cfb0f715343488" - integrity sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A== - -"@react-dnd/invariant@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-4.0.2.tgz#b92edffca10a26466643349fac7cdfb8799769df" - integrity sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw== - -"@react-dnd/shallowequal@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz#d1b4befa423f692fa4abf1c79209702e7d8ae4b4" - integrity sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA== - -"@reduxjs/toolkit@1.9.7": - version "1.9.7" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.7.tgz#7fc07c0b0ebec52043f8cb43510cf346405f78a6" - integrity sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ== - dependencies: - immer "^9.0.21" - redux "^4.2.1" - redux-thunk "^2.4.2" - reselect "^4.1.8" - -"@rollup/rollup-android-arm-eabi@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496" - integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg== - -"@rollup/rollup-android-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d" - integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw== - -"@rollup/rollup-darwin-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz#166987224d2f8b1e2fd28ee90c447d52271d5e90" - integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw== - -"@rollup/rollup-darwin-x64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274" - integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515" - integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ== - -"@rollup/rollup-linux-arm64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9" - integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ== - -"@rollup/rollup-linux-arm64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850" - integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ== - -"@rollup/rollup-linux-riscv64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880" - integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA== - -"@rollup/rollup-linux-x64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98" - integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw== - -"@rollup/rollup-linux-x64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d" - integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ== - -"@rollup/rollup-win32-arm64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e" - integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA== - -"@rollup/rollup-win32-ia32-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461" - integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ== - -"@rollup/rollup-win32-x64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6" - integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ== - -"@rushstack/ts-command-line@^4.12.2": - version "4.17.1" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz#c78db928ce5b93f2e98fd9e14c24f3f3876e57f1" - integrity sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sindresorhus/slugify@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-1.1.0.tgz#2f195365d9b953384305b62664b44b4036c49430" - integrity sha512-ujZRbmmizX26yS/HnB3P9QNlNa4+UvHh+rIse3RbOXLp8yl6n1TxB4t7NHggtVgS8QmmOtzXo48kCxZGACpkPw== - dependencies: - "@sindresorhus/transliterate" "^0.1.1" - escape-string-regexp "^4.0.0" - -"@sindresorhus/transliterate@^0.1.1": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz#ffce368271d153550e87de81486004f2637425af" - integrity sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w== - dependencies: - escape-string-regexp "^2.0.0" - lodash.deburr "^4.1.0" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@strapi/admin@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/admin/-/admin-4.25.11.tgz#064ddc36bdb4a88e7f7c7c9a27565a7f54be9e21" - integrity sha512-5SGM2qv4HWpivoGdh0lcklwmcsPEFoteDwLJQsDYmb4vAUoAuDHvkKNMIItzo8NtvZsDMq8/rrraUko3XaQfQg== - dependencies: - "@casl/ability" "6.5.0" - "@pmmmwh/react-refresh-webpack-plugin" "0.5.11" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-toolbar" "1.0.4" - "@reduxjs/toolkit" "1.9.7" - "@strapi/design-system" "1.19.0" - "@strapi/helper-plugin" "4.25.11" - "@strapi/icons" "1.19.0" - "@strapi/permissions" "4.25.11" - "@strapi/provider-audit-logs-local" "4.25.11" - "@strapi/types" "4.25.11" - "@strapi/typescript-utils" "4.25.11" - "@strapi/utils" "4.25.11" - "@vitejs/plugin-react-swc" "3.5.0" - axios "1.7.4" - bcryptjs "2.4.3" - boxen "5.1.2" - browserslist "^4.22.2" - browserslist-to-esbuild "1.2.0" - chalk "^4.1.2" - chokidar "3.5.3" - codemirror5 "npm:codemirror@^5.65.11" - cross-env "^7.0.3" - css-loader "^6.9.0" - date-fns "2.30.0" - dotenv "14.2.0" - esbuild "0.19.11" - esbuild-loader "^2.21.0" - esbuild-register "3.5.0" - execa "5.1.1" - fast-deep-equal "3.1.3" - find-root "1.1.0" - fork-ts-checker-webpack-plugin "9.0.2" - formik "2.4.0" - fractional-indexing "3.2.0" - fs-extra "10.0.0" - highlight.js "^10.4.1" - history "^4.9.0" - html-webpack-plugin "5.6.0" - immer "9.0.19" - inquirer "8.2.5" - invariant "^2.2.4" - is-localhost-ip "2.0.0" - js-cookie "2.2.1" - jsonwebtoken "9.0.0" - koa "2.13.4" - koa-bodyparser "4.4.1" - koa-compose "4.1.0" - koa-passport "5.0.0" - koa-static "5.0.0" - koa2-ratelimit "^1.1.2" - lodash "4.17.21" - markdown-it "^12.3.2" - markdown-it-abbr "^1.0.4" - markdown-it-container "^3.0.0" - markdown-it-deflist "^2.1.0" - markdown-it-emoji "^2.0.0" - markdown-it-footnote "^3.0.3" - markdown-it-ins "^3.0.1" - markdown-it-mark "^3.0.1" - markdown-it-sub "^1.0.0" - markdown-it-sup "1.0.0" - mini-css-extract-plugin "2.7.7" - node-schedule "2.1.1" - ora "5.4.1" - outdent "0.8.0" - p-map "4.0.0" - passport-local "1.0.0" - pluralize "8.0.0" - prettier "2.8.4" - prop-types "^15.8.1" - punycode "2.3.1" - qs "6.11.1" - react-dnd "16.0.1" - react-dnd-html5-backend "16.0.1" - react-error-boundary "3.1.4" - react-helmet "^6.1.0" - react-intl "6.4.1" - react-is "^18.2.0" - react-query "3.39.3" - react-redux "8.1.1" - react-refresh "0.14.0" - react-select "5.7.0" - react-window "1.8.8" - read-pkg-up "7.0.1" - resolve-from "5.0.0" - rimraf "3.0.2" - sanitize-html "2.13.0" - semver "7.5.4" - sift "16.0.1" - slate "0.94.1" - slate-history "0.93.0" - slate-react "0.98.3" - style-loader "3.3.4" - typescript "5.2.2" - vite "5.0.13" - webpack "^5.89.0" - webpack-bundle-analyzer "^4.10.1" - webpack-dev-middleware "6.1.2" - webpack-hot-middleware "2.26.0" - yup "0.32.9" - -"@strapi/database@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/database/-/database-4.25.11.tgz#32993c7695466d95703c79d25558263354fadacc" - integrity sha512-h2JPKW2AD1KPm4MAxiUgmEGDfXxvxESCzNd7wyG+j2ky+pnJnvEQ4vlGoJZ1DkFg5OFQT9JtuqondPAkfApSag== - dependencies: - "@strapi/utils" "4.25.11" - date-fns "2.30.0" - debug "4.3.4" - fs-extra "10.0.0" - knex "2.5.0" - lodash "4.17.21" - semver "7.5.4" - umzug "3.2.1" - -"@strapi/design-system@1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@strapi/design-system/-/design-system-1.19.0.tgz#1b0ca923c22f167baa6d35663e7f47c971df474c" - integrity sha512-kEQNaRztIcr6I5Zh6mxtE/Nmkk1mylCS5s56ySKDdqOjWZw2BCbS72/J9k6r1RF1TLIDSXJN9r5dHR0ZKtWvBQ== - dependencies: - "@codemirror/lang-json" "^6.0.1" - "@floating-ui/react-dom" "^2.0.8" - "@internationalized/date" "^3.5.2" - "@internationalized/number" "^3.5.1" - "@radix-ui/react-dismissable-layer" "^1.0.5" - "@radix-ui/react-dropdown-menu" "^2.0.6" - "@radix-ui/react-focus-scope" "1.0.4" - "@strapi/ui-primitives" "^1.19.0" - "@uiw/react-codemirror" "^4.21.25" - aria-hidden "^1.2.4" - compute-scroll-into-view "^3.1.0" - prop-types "^15.8.1" - react-remove-scroll "^2.5.9" - -"@strapi/helper-plugin@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/helper-plugin/-/helper-plugin-4.25.11.tgz#c3f2db2b512a80832ef36391c38352be427d8c87" - integrity sha512-9NKVVJTBHiRW7DyrZA6UZXNhTkfX1C90xAqVUwGQrlQRkU5wGOvtEsHMksL+pyfqz19Pm9Bg+gBwiP246dXRJg== - dependencies: - axios "1.7.4" - date-fns "2.30.0" - formik "2.4.0" - immer "9.0.19" - lodash "4.17.21" - qs "6.11.1" - react-helmet "6.1.0" - react-intl "6.4.1" - react-query "3.39.3" - react-select "5.7.0" - -"@strapi/helper-plugin@4.25.8": - version "4.25.8" - resolved "https://registry.yarnpkg.com/@strapi/helper-plugin/-/helper-plugin-4.25.8.tgz#068d6cc28f7e98291320c5758cb7d4e436965e16" - integrity sha512-Fz6wO1vl2U1AzPVhuj35nQjUFPHQSFc1xmDv0pbjqpLIXNLHDJ6K7rIXuyLu9CqDIyUYnL3NjEdo+G0UOK52Tw== - dependencies: - axios "1.6.0" - date-fns "2.30.0" - formik "2.4.0" - immer "9.0.19" - lodash "4.17.21" - qs "6.11.1" - react-helmet "6.1.0" - react-intl "6.4.1" - react-query "3.39.3" - react-select "5.7.0" - -"@strapi/icons@1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@strapi/icons/-/icons-1.19.0.tgz#efa6b553a7de437171512e3549859faa141a145f" - integrity sha512-jcS7n3Ps+73fYGadxdaD6owazoDJKN1fHSG9dp8RX4RqkP6BfoHOX5j3aodVLmDX57Ksg6gy5JXf9xEml7nMpQ== - -"@strapi/logger@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/logger/-/logger-4.25.11.tgz#7de71e3fad917b6eb5813eb517b3385b4483c63f" - integrity sha512-Xp6MBpixWXy4NoWi0dgbNPfOE9IHqtX0VVJjxcr51b6wyC9Tfvn8oM8HnzhX4eml/w4ekSeq/Kx8YgSaAGRBZw== - dependencies: - lodash "4.17.21" - winston "3.10.0" - -"@strapi/permissions@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/permissions/-/permissions-4.25.11.tgz#b78b963c1849a51b7d4a78e39376b99e5bb77025" - integrity sha512-4MIWgrdqDrfKGbwlVnf4ihTdWAMC7cnlL9wiqKSsCaqXnXurkQX9g4znUWsQDeGo0lEKrhedsFAKfJwxwSOeCg== - dependencies: - "@casl/ability" "6.5.0" - "@strapi/utils" "4.25.11" - lodash "4.17.21" - qs "6.11.1" - sift "16.0.1" - -"@strapi/plugin-graphql@^4.25.8": - version "4.25.8" - resolved "https://registry.yarnpkg.com/@strapi/plugin-graphql/-/plugin-graphql-4.25.8.tgz#1aa7b5ead22a3d85dc45ff163e4648ca37d87c82" - integrity sha512-xYWN4hlHyTEBvlmKsg1GdMVygv0Fwiz5lhOe3YOPV0f0Kqy4GP6mcJtrq/9FHEi4sgvmzBR31URGZFJPsFObbw== - dependencies: - "@graphql-tools/schema" "8.5.1" - "@graphql-tools/utils" "^8.13.1" - "@strapi/design-system" "1.19.0" - "@strapi/helper-plugin" "4.25.8" - "@strapi/icons" "1.19.0" - "@strapi/utils" "4.25.8" - apollo-server-core "3.12.1" - apollo-server-koa "3.10.0" - graphql "^15.5.1" - graphql-depth-limit "^1.1.0" - graphql-playground-middleware-koa "^1.6.21" - graphql-scalars "1.22.2" - graphql-upload "^13.0.0" - koa-compose "^4.1.0" - lodash "4.17.21" - nexus "1.3.0" - pluralize "8.0.0" - -"@strapi/provider-audit-logs-local@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/provider-audit-logs-local/-/provider-audit-logs-local-4.25.11.tgz#902b387ba832a42d94856d53abbc2fe1a552b60f" - integrity sha512-aF8/XwMSIZ9JjqjKUJhFl89ts7iRmS6S5qY45ywzNH3p7XBmzwMy05+xs1eu2p9FRz1Dqat+JxXB0MN5kYUhOg== - -"@strapi/types@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/types/-/types-4.25.11.tgz#489d6d86ce91f7dc598c864b2044096fdffe19bc" - integrity sha512-ZwEsOex2282W7FYwI0xN+4YnmcyXMWnFQ1W3xCii/4WDb9XaKClI1jU6gW2gejbcig9OPXDPXWpu3Mwc7prP2Q== - dependencies: - "@casl/ability" "6.5.0" - "@koa/cors" "5.0.0" - "@koa/router" "10.1.1" - "@strapi/database" "4.25.11" - "@strapi/logger" "4.25.11" - "@strapi/permissions" "4.25.11" - "@strapi/utils" "4.25.11" - commander "8.3.0" - https-proxy-agent "5.0.1" - koa "2.13.4" - node-fetch "2.7.0" - node-schedule "2.1.1" - -"@strapi/typescript-utils@4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/typescript-utils/-/typescript-utils-4.25.11.tgz#b5876f75abc9788be762e8e8b031b419e25fa8f3" - integrity sha512-Kv39horR3DLOtCSCg9yH/yxsSY8fY5z2GXOFaDWIZl22pNVoKY8LXPWeTsOXvAjGAeMDsqT8tLAHU8/Ioekn+A== - dependencies: - chalk "4.1.2" - cli-table3 "0.6.5" - fs-extra "10.0.0" - lodash "4.17.21" - prettier "2.8.4" - typescript "5.2.2" - -"@strapi/ui-primitives@^1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@strapi/ui-primitives/-/ui-primitives-1.19.0.tgz#01e2709d64bbde1f6810c49898da216934f76479" - integrity sha512-dEpmI0PpSH6VWuP/bBvRKI5lUpazdDAcxOpukoq2QDwUFbuZWywgW7a6O5nMnD4bLQtyNeYwd52J8Jqr9pNoQA== - dependencies: - "@radix-ui/number" "^1.0.1" - "@radix-ui/primitive" "^1.0.1" - "@radix-ui/react-collection" "1.0.3" - "@radix-ui/react-compose-refs" "^1.0.1" - "@radix-ui/react-context" "^1.0.1" - "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-dismissable-layer" "^1.0.5" - "@radix-ui/react-focus-guards" "1.0.1" - "@radix-ui/react-focus-scope" "1.0.4" - "@radix-ui/react-id" "^1.0.1" - "@radix-ui/react-popper" "^1.1.3" - "@radix-ui/react-portal" "^1.0.4" - "@radix-ui/react-primitive" "^1.0.3" - "@radix-ui/react-slot" "^1.0.2" - "@radix-ui/react-use-callback-ref" "^1.0.1" - "@radix-ui/react-use-controllable-state" "^1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - "@radix-ui/react-use-previous" "^1.0.1" - "@radix-ui/react-visually-hidden" "^1.0.3" - aria-hidden "^1.2.4" - react-remove-scroll "^2.5.9" - -"@strapi/utils@4.25.11", "@strapi/utils@^4.25.11": - version "4.25.11" - resolved "https://registry.yarnpkg.com/@strapi/utils/-/utils-4.25.11.tgz#e72e54f7b6040b745725329efcf618bc7a851fbf" - integrity sha512-rY0fRho4qK9WP7s7rNT8Yn8evUT7WcjlVpVEjkRVSKm2sOMVkleqVjnUb361lP0x7InI4G0mPsNaS2TM6YCEPQ== - dependencies: - "@sindresorhus/slugify" "1.1.0" - date-fns "2.30.0" - http-errors "1.8.1" - lodash "4.17.21" - p-map "4.0.0" - yup "0.32.9" - -"@strapi/utils@4.25.8", "@strapi/utils@^4.25.8": - version "4.25.8" - resolved "https://registry.yarnpkg.com/@strapi/utils/-/utils-4.25.8.tgz#49f15d853387f2080ba2a91c41c31c469e36bb5d" - integrity sha512-cyz18XLqhHKLIdEbwkL+7emCu3tViDUyRittGEFaOPfMnxSmlJ1dDVmZ8BJ7HFhx1KXcylrYju8I/5/NG3S6SQ== - dependencies: - "@sindresorhus/slugify" "1.1.0" - date-fns "2.30.0" - http-errors "1.8.1" - lodash "4.17.21" - p-map "4.0.0" - yup "0.32.9" - -"@swc/core-darwin-arm64@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.0.tgz#11abf23b884929a467ba270cf6789b9c50c4248b" - integrity sha512-UTJ/Vz+s7Pagef6HmufWt6Rs0aUu+EJF4Pzuwvr7JQQ5b1DZeAAUeUtkUTFx/PvCbM8Xfw4XdKBUZfrIKCfW8A== - -"@swc/core-darwin-x64@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.0.tgz#f044ddaca60c5081e907b148721ad7461f6f6dfe" - integrity sha512-f8v58u2GsGak8EtZFN9guXqE0Ep10Suny6xriaW2d8FGqESPyNrnBzli3aqkSeQk5gGqu2zJ7WiiKp3XoUOidA== - -"@swc/core-linux-arm-gnueabihf@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.0.tgz#52ceea673fc76692c0bd6d58e1863125c3e6173b" - integrity sha512-q2KAkBzmPcTnRij/Y1fgHCKAGevUX/H4uUESrw1J5gmUg9Qip6onKV80lTumA1/aooGJ18LOsB31qdbwmZk9OA== - -"@swc/core-linux-arm64-gnu@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.0.tgz#7f3ff1ab824ec48acdb39d231cbcb4096a4f9dd0" - integrity sha512-SknGu96W0mzHtLHWm+62fk5+Omp9fMPFO7AWyGFmz2tr8EgRRXtTSrBUnWhAbgcalnhen48GsvtMdxf1KNputg== - -"@swc/core-linux-arm64-musl@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.0.tgz#26c3b1f7947c19ef725997af716f230957d586f8" - integrity sha512-/k3TDvpBRMDNskHooNN1KqwUhcwkfBlIYxRTnJvsfT2C7My4pffR+4KXmt0IKynlTTbCdlU/4jgX4801FSuliw== - -"@swc/core-linux-x64-gnu@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.0.tgz#2c7d03a04a7d045394cfed7d46419ff8816ec22e" - integrity sha512-GYsTMvNt5+WTVlwwQzOOWsPMw6P/F41u5PGHWmfev8Nd4QJ1h3rWPySKk4mV42IJwH9MgQCVSl3ygwNqwl6kFg== - -"@swc/core-linux-x64-musl@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.0.tgz#0e76442dfb6d5026d8d6e7db6b2f4922b7692d0f" - integrity sha512-jGVPdM/VwF7kK/uYRW5N6FwzKf/FnDjGIR3RPvQokjYJy7Auk+3Oj21C0Jev7sIT9RYnO/TrFEoEozKeD/z2Qw== - -"@swc/core-win32-arm64-msvc@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.0.tgz#0177bebf312eb251d6749ab76259c0e08088e837" - integrity sha512-biHYm1AronEKlt47O/H8sSOBM2BKXMmWT+ApvlxUw50m1RGNnVnE0bgY7tylFuuSiWyXsQPJbmUV708JqORXVg== - -"@swc/core-win32-ia32-msvc@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.0.tgz#27fa650280e5651aa42129eaf03e02787b866417" - integrity sha512-TL5L2tFQb19kJwv6+elToGBj74QXCn9j+hZfwQatvZEJRA5rDK16eH6oAE751dGUArhnWlW3Vj65hViPvTuycw== - -"@swc/core-win32-x64-msvc@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.0.tgz#bd575c599bd6847bddc4863a3babd85e3db5e11e" - integrity sha512-e2xVezU7XZ2Stzn4i7TOQe2Kn84oYdG0M3A7XI7oTdcpsKCcKwgiMoroiAhqCv+iN20KNqhnWwJiUiTj/qN5AA== - -"@swc/core@^1.3.96": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.0.tgz#3a0ceeea5b889173f4592955fe1da4d071d86a76" - integrity sha512-wc5DMI5BJftnK0Fyx9SNJKkA0+BZSJQx8430yutWmsILkHMBD3Yd9GhlMaxasab9RhgKqZp7Ht30hUYO5ZDvQg== - dependencies: - "@swc/counter" "^0.1.1" - "@swc/types" "^0.1.5" - optionalDependencies: - "@swc/core-darwin-arm64" "1.4.0" - "@swc/core-darwin-x64" "1.4.0" - "@swc/core-linux-arm-gnueabihf" "1.4.0" - "@swc/core-linux-arm64-gnu" "1.4.0" - "@swc/core-linux-arm64-musl" "1.4.0" - "@swc/core-linux-x64-gnu" "1.4.0" - "@swc/core-linux-x64-musl" "1.4.0" - "@swc/core-win32-arm64-msvc" "1.4.0" - "@swc/core-win32-ia32-msvc" "1.4.0" - "@swc/core-win32-x64-msvc" "1.4.0" - -"@swc/counter@^0.1.1": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@^0.5.0": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" - integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== - dependencies: - tslib "^2.4.0" - -"@swc/types@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" - integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw== - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/accepts@*", "@types/accepts@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - -"@types/argparse@1.0.38": - version "1.0.38" - resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" - integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/content-disposition@*": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" - integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== - -"@types/cookies@*": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" - integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - -"@types/estree@1.0.5", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/express-serve-static-core@^4.17.18": - version "4.17.29" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" - integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hoist-non-react-statics@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-assert@*": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" - integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== - -"@types/http-errors@*": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" - integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== - -"@types/is-hotkey@^0.1.1": - version "0.1.10" - resolved "https://registry.yarnpkg.com/@types/is-hotkey/-/is-hotkey-0.1.10.tgz#cf440fab9bf75ffba4e1a16e8df28938de0778c9" - integrity sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@29.5.1": - version "29.5.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" - integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - -"@types/koa-bodyparser@^4.3.0": - version "4.3.7" - resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.7.tgz#3ac41f2dec9d97db7a6f798bbb2e2368be762714" - integrity sha512-21NhEp7LjZm4zbNV5alHHmrNY4J+S7B8lYTO6CzRL8ShTMnl20Gd14dRgVhAxraLaW5iZMofox+BycbuiDvj2Q== - dependencies: - "@types/koa" "*" - -"@types/koa-compose@*", "@types/koa-compose@^3.2.5": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa@*", "@types/koa@^2.11.6": - version "2.13.5" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61" - integrity sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/koa__cors@^3.0.1": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-3.3.0.tgz#2986b320d3d7ddf05c4e2e472b25a321cb16bd3b" - integrity sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA== - dependencies: - "@types/koa" "*" - -"@types/koa__router@^12.0.4": - version "12.0.4" - resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-12.0.4.tgz#a1f9afec9dc7e7d9fa1252d1938c44b403e19a28" - integrity sha512-Y7YBbSmfXZpa/m5UGGzb7XadJIRBRnwNY9cdAojZGp65Cpe5MAP3mOZE7e3bImt8dfKS4UFcR16SLH8L/z7PBw== - dependencies: - "@types/koa" "*" - -"@types/lodash@^4.14.149": - version "4.14.202" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" - integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== - -"@types/lodash@^4.14.165", "@types/lodash@^4.14.181": - version "4.14.182" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" - integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== - -"@types/long@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/node@*": - version "18.6.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.6.1.tgz#828e4785ccca13f44e2fb6852ae0ef11e3e20ba5" - integrity sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg== - -"@types/node@^10.1.0": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/pluralize@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c" - integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== - -"@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-intl@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/react-intl/-/react-intl-3.0.0.tgz#a2cce0024b6cfe403be28ccf67f49d720fa810ec" - integrity sha512-k8F3d05XQGEqSWIfK97bBjZe4z9RruXU9Wa7OZ2iUC5pdeIpzuQDZe/9C2J3Xir5//ZtAkhcv08Wfx3n5TBTQg== - dependencies: - react-intl "*" - -"@types/react-transition-group@^4.4.0": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "18.0.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" - integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@16 || 17 || 18", "@types/react@^18.0.28": - version "18.0.33" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.33.tgz#a1575160cb4376787c2f5fe0312302f824baa61e" - integrity sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== - -"@types/use-sync-external-store@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" - integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== - -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== - dependencies: - "@types/yargs-parser" "*" - -"@ucast/core@^1.0.0", "@ucast/core@^1.4.1", "@ucast/core@^1.6.1": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@ucast/core/-/core-1.10.2.tgz#30b6b893479823265368e528b61b042f752f2c92" - integrity sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g== - -"@ucast/js@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@ucast/js/-/js-3.0.4.tgz#c57ec2182505c9ad63a5b08ff5911f89ac605262" - integrity sha512-TgG1aIaCMdcaEyckOZKQozn1hazE0w90SVdlpIJ/er8xVumE11gYAtSbw/LBeUnA4fFnFWTcw3t6reqseeH/4Q== - dependencies: - "@ucast/core" "^1.0.0" - -"@ucast/mongo2js@^1.3.0": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@ucast/mongo2js/-/mongo2js-1.3.4.tgz#579f9e5eb074cba54640d5c70c71c500580f3af3" - integrity sha512-ahazOr1HtelA5AC1KZ9x0UwPMqqimvfmtSm/PRRSeKKeE5G2SCqTgwiNzO7i9jS8zA3dzXpKVPpXMkcYLnyItA== - dependencies: - "@ucast/core" "^1.6.1" - "@ucast/js" "^3.0.0" - "@ucast/mongo" "^2.4.0" - -"@ucast/mongo@^2.4.0": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@ucast/mongo/-/mongo-2.4.3.tgz#92b1dd7c0ab06a907f2ab1422aa3027518ccc05e" - integrity sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA== - dependencies: - "@ucast/core" "^1.4.1" - -"@uiw/codemirror-extensions-basic-setup@4.21.25": - version "4.21.25" - resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.21.25.tgz#eb0605ac16b18a4d673cf475d81c4d960eaa6ef1" - integrity sha512-eeUKlmEE8aSoSgelS8OR2elcPGntpRo669XinAqPCLa0eKorT2B0d3ts+AE+njAeGk744tiyAEbHb2n+6OQmJw== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/commands" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/lint" "^6.0.0" - "@codemirror/search" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - -"@uiw/react-codemirror@^4.21.25": - version "4.21.25" - resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.21.25.tgz#1efb7737b907fde6f8f7552b5f43b33eec0b7a86" - integrity sha512-mBrCoiffQ+hbTqV1JoixFEcH7BHXkS3PjTyNH7dE8Gzf3GSBRazhtSM5HrAFIiQ5FIRGFs8Gznc4UAdhtevMmw== - dependencies: - "@babel/runtime" "^7.18.6" - "@codemirror/commands" "^6.1.0" - "@codemirror/state" "^6.1.1" - "@codemirror/theme-one-dark" "^6.0.0" - "@uiw/codemirror-extensions-basic-setup" "4.21.25" - codemirror "^6.0.0" - -"@vitejs/plugin-react-swc@3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz#1fadff5148003e8091168c431e44c850f9a39e74" - integrity sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig== - dependencies: - "@swc/core" "^1.3.96" - -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@^1.3.5, accepts@^1.3.7: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.0.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -acorn@^8.2.4, acorn@^8.4.1: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-html-community@0.0.8, ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -apollo-datasource@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" - integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - apollo-server-env "^4.2.1" - -apollo-reporting-protobuf@^3.3.1, apollo-reporting-protobuf@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.2.tgz#2078c53d3140bc6221c6040c5326623e0c21c8d4" - integrity sha512-j1tx9tmkVdsLt1UPzBrvz90PdjAeKW157WxGn+aXlnnGfVjZLIRXX3x5t1NWtXvB7rVaAsLLILLtDHW382TSoQ== - dependencies: - "@apollo/protobufjs" "1.2.4" - -apollo-reporting-protobuf@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.4.0.tgz#6edd31f09d4a3704d9e808d1db30eca2229ded26" - integrity sha512-h0u3EbC/9RpihWOmcSsvTW2O6RXVaD/mPEjfrPkxRPTEPWqncsgOoRJw+wih4OqfH3PvTJvoEIf4LwKrUaqWog== - dependencies: - "@apollo/protobufjs" "1.2.6" - -apollo-server-core@3.12.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.12.1.tgz#ba255c37345db29c48a2e0c064c519a8d62eb5af" - integrity sha512-9SF5WAkkV0FZQ2HVUWI9Jada1U0jg7e8NCN9EklbtvaCeUlOLyXyM+KCWuZ7+dqHxjshbtcwylPHutt3uzoNkw== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - "@apollo/utils.usagereporting" "^1.0.0" - "@apollographql/apollo-tools" "^0.5.3" - "@apollographql/graphql-playground-html" "1.6.29" - "@graphql-tools/mock" "^8.1.2" - "@graphql-tools/schema" "^8.0.0" - "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.3.2" - apollo-reporting-protobuf "^3.4.0" - apollo-server-env "^4.2.1" - apollo-server-errors "^3.3.1" - apollo-server-plugin-base "^3.7.2" - apollo-server-types "^3.8.0" - async-retry "^1.2.1" - fast-json-stable-stringify "^2.1.0" - graphql-tag "^2.11.0" - loglevel "^1.6.8" - lru-cache "^6.0.0" - node-abort-controller "^3.0.1" - sha.js "^2.4.11" - uuid "^9.0.0" - whatwg-mimetype "^3.0.0" - -apollo-server-core@^3.10.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.13.0.tgz#ad6601fbb34cc97eedca27a9fb0b5738d11cd27d" - integrity sha512-v/g6DR6KuHn9DYSdtQijz8dLOkP78I5JSVJzPkARhDbhpH74QNwrQ2PP2URAPPEDJ2EeZNQDX8PvbYkAKqg+kg== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - "@apollo/utils.usagereporting" "^1.0.0" - "@apollographql/apollo-tools" "^0.5.3" - "@apollographql/graphql-playground-html" "1.6.29" - "@graphql-tools/mock" "^8.1.2" - "@graphql-tools/schema" "^8.0.0" - "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.3.2" - apollo-reporting-protobuf "^3.4.0" - apollo-server-env "^4.2.1" - apollo-server-errors "^3.3.1" - apollo-server-plugin-base "^3.7.2" - apollo-server-types "^3.8.0" - async-retry "^1.2.1" - fast-json-stable-stringify "^2.1.0" - graphql-tag "^2.11.0" - loglevel "^1.6.8" - lru-cache "^6.0.0" - node-abort-controller "^3.0.1" - sha.js "^2.4.11" - uuid "^9.0.0" - whatwg-mimetype "^3.0.0" - -apollo-server-env@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" - integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== - dependencies: - node-fetch "^2.6.7" - -apollo-server-errors@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" - integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== - -apollo-server-koa@3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/apollo-server-koa/-/apollo-server-koa-3.10.0.tgz#6f5cf0d23ca9dc6d6c020322ded5ea213747889d" - integrity sha512-OHaQRz0vvsALT2q+j4uWnCLRrUl1sM0H6JZvB2PfQwANsjTdwm2Eo6FO5etVByvrU4K1iXD6wBWid0Fjk0/OMQ== - dependencies: - "@koa/cors" "^3.1.0" - "@types/accepts" "^1.3.5" - "@types/koa" "^2.11.6" - "@types/koa-bodyparser" "^4.3.0" - "@types/koa-compose" "^3.2.5" - "@types/koa__cors" "^3.0.1" - accepts "^1.3.7" - apollo-server-core "^3.10.0" - apollo-server-types "^3.6.2" - koa-bodyparser "^4.3.0" - koa-compose "^4.1.0" - -apollo-server-plugin-base@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.2.tgz#c19cd137bc4c993ba2490ba2b571b0f3ce60a0cd" - integrity sha512-wE8dwGDvBOGehSsPTRZ8P/33Jan6/PmL0y0aN/1Z5a5GcbFhDaaJCjK5cav6npbbGL2DPKK0r6MPXi3k3N45aw== - dependencies: - apollo-server-types "^3.8.0" - -apollo-server-types@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.6.2.tgz#34bb0c335fcce3057cbdf72b3b63da182de6fc84" - integrity sha512-9Z54S7NB+qW1VV+kmiqwU2Q6jxWfX89HlSGCGOo3zrkrperh85LrzABgN9S92+qyeHYd72noMDg2aI039sF3dg== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - apollo-reporting-protobuf "^3.3.2" - apollo-server-env "^4.2.1" - -apollo-server-types@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.8.0.tgz#d976b6967878681f715fe2b9e4dad9ba86b1346f" - integrity sha512-ZI/8rTE4ww8BHktsVpb91Sdq7Cb71rdSkXELSwdSR0eXu600/sY+1UXhTWdiJvk+Eq5ljqoHLwLbY2+Clq2b9A== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - apollo-reporting-protobuf "^3.4.0" - apollo-server-env "^4.2.1" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7, argparse@~1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -argv@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" - integrity sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw== - -aria-hidden@^1.1.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" - integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== - dependencies: - tslib "^2.0.0" - -aria-hidden@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" - integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== - dependencies: - tslib "^2.0.0" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -async-retry@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - -async@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== - -async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -axios@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" - integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axios@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" - integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcryptjs@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== - -big-integer@^1.6.16: - version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist-to-esbuild@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserslist-to-esbuild/-/browserslist-to-esbuild-1.2.0.tgz#5c5b9ca73106da02e0168007396c4ec4c1e6d643" - integrity sha512-ftrrbI/VHBgEnmnSyhkqvQVMp6jAKybfs0qMIlm7SLBrQTGMsdCIP4q3BoKeLsZTBQllIQtY9kbxgRYV2WU47g== - dependencies: - browserslist "^4.17.3" - -browserslist@^4.17.3, browserslist@^4.21.10, browserslist@^4.22.2: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== - dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -browserslist@^4.20.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== - dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" - node-releases "^2.0.6" - update-browserslist-db "^1.0.4" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -busboy@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" - integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== - dependencies: - dicer "0.3.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cache-content-type@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" - integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== - dependencies: - mime-types "^2.1.18" - ylru "^1.2.0" - -cache-manager@^3.6.0: - version "3.6.3" - resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-3.6.3.tgz#48052f3cf9ee4bac1cbb6adeedd69faf9da4ec04" - integrity sha512-dS4DnV6c6cQcVH5OxzIU1XZaACXwvVIiUPkFytnRmLOACuBGv3GQgRQ1RJGRRw4/9DF14ZK2RFlZu1TUgDniMg== - dependencies: - async "3.2.3" - lodash.clonedeep "^4.5.0" - lru-cache "6.0.0" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001366: - version "1.0.30001370" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz#0a30d4f20d38b9e108cc5ae7cc62df9fe66cd5ba" - integrity sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g== - -caniuse-lite@^1.0.30001580: - version "1.0.30001585" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz#0b4e848d84919c783b2a41c13f7de8ce96744401" - integrity sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q== - -chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@3.5.3, chokidar@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -clean-css@^5.2.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" - integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-table3@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -co-body@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" - integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== - dependencies: - inflation "^2.0.0" - qs "^6.5.2" - raw-body "^2.3.3" - type-is "^1.6.16" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -codecov@^3.7.2: - version "3.8.3" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.8.3.tgz#9c3e364b8a700c597346ae98418d09880a3fdbe7" - integrity sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA== - dependencies: - argv "0.0.2" - ignore-walk "3.0.4" - js-yaml "3.14.1" - teeny-request "7.1.1" - urlgrey "1.0.0" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@adobe/css-tools@npm:^4.0.1": + version: 4.4.1 + resolution: "@adobe/css-tools@npm:4.4.1" + checksum: 10c0/1a68ad9af490f45fce7b6e50dd2d8ac0c546d74431649c0d42ee4ceb1a9fa057fae0a7ef1e148effa12d84ec00ed71869ebfe0fb1dcdcc80bfcb6048c12abcc0 + languageName: node + linkType: hard + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@apollo/cache-control-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@apollo/cache-control-types@npm:1.0.3" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/b49a9e99c7d5af6dfe12b775eb6374c8a54894e17ffa882b3d85f4501ca19ee413bdcc1a787a4b44dcc2903ce2c28f19b69116f338f88670c4f6f2e10a0bc498 + languageName: node + linkType: hard + +"@apollo/protobufjs@npm:1.2.7": + version: 1.2.7 + resolution: "@apollo/protobufjs@npm:1.2.7" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/long": "npm:^4.0.0" + long: "npm:^4.0.0" + bin: + apollo-pbjs: bin/pbjs + apollo-pbts: bin/pbts + checksum: 10c0/24b08929c5216f75e3bf457cf7e132d957d6774b0feebb104e98d9b0c06e801ef3919ee23d6a63a6297fb4aa41da3491b8e9acc3481fea0909c90f41f1e5a0f6 + languageName: node + linkType: hard + +"@apollo/server-gateway-interface@npm:^1.1.1": + version: 1.1.1 + resolution: "@apollo/server-gateway-interface@npm:1.1.1" + dependencies: + "@apollo/usage-reporting-protobuf": "npm:^4.1.1" + "@apollo/utils.fetcher": "npm:^2.0.0" + "@apollo/utils.keyvaluecache": "npm:^2.1.0" + "@apollo/utils.logger": "npm:^2.0.0" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/2787b2954028f5aff55846df98b3967f38f40df4c5e4c9df0da56ac16d4323ba0aeabd76d4b134fedc9f6fe7d63e6fd9e9a133eb5d209408eac34c0e25cbe7dd + languageName: node + linkType: hard + +"@apollo/server@npm:4.11.0": + version: 4.11.0 + resolution: "@apollo/server@npm:4.11.0" + dependencies: + "@apollo/cache-control-types": "npm:^1.0.3" + "@apollo/server-gateway-interface": "npm:^1.1.1" + "@apollo/usage-reporting-protobuf": "npm:^4.1.1" + "@apollo/utils.createhash": "npm:^2.0.0" + "@apollo/utils.fetcher": "npm:^2.0.0" + "@apollo/utils.isnodelike": "npm:^2.0.0" + "@apollo/utils.keyvaluecache": "npm:^2.1.0" + "@apollo/utils.logger": "npm:^2.0.0" + "@apollo/utils.usagereporting": "npm:^2.1.0" + "@apollo/utils.withrequired": "npm:^2.0.0" + "@graphql-tools/schema": "npm:^9.0.0" + "@types/express": "npm:^4.17.13" + "@types/express-serve-static-core": "npm:^4.17.30" + "@types/node-fetch": "npm:^2.6.1" + async-retry: "npm:^1.2.1" + cors: "npm:^2.8.5" + express: "npm:^4.17.1" + loglevel: "npm:^1.6.8" + lru-cache: "npm:^7.10.1" + negotiator: "npm:^0.6.3" + node-abort-controller: "npm:^3.1.1" + node-fetch: "npm:^2.6.7" + uuid: "npm:^9.0.0" + whatwg-mimetype: "npm:^3.0.0" + peerDependencies: + graphql: ^16.6.0 + checksum: 10c0/5c07f818ba2a943c176a3e3d50115c6fba2dc1b6e818635202cf22f0dacc6e2b39e0c53315399d1e46357072db438bbcd4ebc13afeb0f18bb5378134c100f8f5 + languageName: node + linkType: hard + +"@apollo/usage-reporting-protobuf@npm:^4.1.0, @apollo/usage-reporting-protobuf@npm:^4.1.1": + version: 4.1.1 + resolution: "@apollo/usage-reporting-protobuf@npm:4.1.1" + dependencies: + "@apollo/protobufjs": "npm:1.2.7" + checksum: 10c0/45f0167a87d4ae8a12124831ebb29905122d28afdbfa23a4f25f4570189d5ddaa6f2829ef97923f5909b9753e39dbd28f810ca2a93ad9fcd60b2baf5669f5223 + languageName: node + linkType: hard + +"@apollo/utils.createhash@npm:^2.0.0": + version: 2.0.1 + resolution: "@apollo/utils.createhash@npm:2.0.1" + dependencies: + "@apollo/utils.isnodelike": "npm:^2.0.1" + sha.js: "npm:^2.4.11" + checksum: 10c0/0b1b2ca52d7d803c45d61584e3925962ff807695d411e1388e41203fa91d44c4f2772013b5f9760e27c60a1e26a143f1a86f3813921bdf8acf9af0d7366c504f + languageName: node + linkType: hard + +"@apollo/utils.dropunuseddefinitions@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.1" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/4f646ac18219c16b77ffacf25cd18be4f0dfe7b4bd1fa4d57de7e0105c6f2daa71e30a9ba3266a322d4adb6fbbb2494b053748f3fbe7ed035683cf490b6abf38 + languageName: node + linkType: hard + +"@apollo/utils.fetcher@npm:^2.0.0": + version: 2.0.1 + resolution: "@apollo/utils.fetcher@npm:2.0.1" + checksum: 10c0/6634468a8f65e32935de65ca1729fae1434d53b6bf48b1b3097a47241f7b802643aa5b2c76cd0e1a67fd17ddd0bb3e58b4290f6b2121535f69e891125c372e8e + languageName: node + linkType: hard + +"@apollo/utils.isnodelike@npm:^2.0.0, @apollo/utils.isnodelike@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.isnodelike@npm:2.0.1" + checksum: 10c0/05b41bf608d6232cc859204b59766131196d24d5fcf2a9588c4631a2ec87c833dd7f39b0fe016ee3d2c22bb4561ed1801ae39f9adb5d7cc3cbe544adb2d3de44 + languageName: node + linkType: hard + +"@apollo/utils.keyvaluecache@npm:^2.1.0": + version: 2.1.1 + resolution: "@apollo/utils.keyvaluecache@npm:2.1.1" + dependencies: + "@apollo/utils.logger": "npm:^2.0.1" + lru-cache: "npm:^7.14.1" + checksum: 10c0/393a66ccae32d0f0d346f796b9196c983abd9300e340ecdefa7edb5acd577693ef31ab72de73ef0acee689856a80f977938aab57d3eb9d8cbd3ce494cc4c0233 + languageName: node + linkType: hard + +"@apollo/utils.logger@npm:^2.0.0, @apollo/utils.logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.logger@npm:2.0.1" + checksum: 10c0/7fcf72fdce95540907647ed99b878e2b84f82b963ab00e3bcfea082597d51a5b825411659e378c1497485f858e4e0bb7eb55369c502d96a0b87375d5036a92ba + languageName: node + linkType: hard + +"@apollo/utils.printwithreducedwhitespace@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.1" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/e4af07f8608bff93970574f891c98cb34c960faa3036d467180bb8964684c5d89357311269f78113e1871fc670a2be7672096f6de06180eb170a3219571a7881 + languageName: node + linkType: hard + +"@apollo/utils.removealiases@npm:2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.removealiases@npm:2.0.1" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/8783fc0cfc04a3127d6537bef950c500c2ddf50206847e691b630dde9e7f3a402ed540800e19e69405e7421bdcc05fba84ce45cba9a824e550b405900efffcae + languageName: node + linkType: hard + +"@apollo/utils.sortast@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.sortast@npm:2.0.1" + dependencies: + lodash.sortby: "npm:^4.7.0" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/5b8ccabfa4e86c31ab5108f72bcea8968fdc63f1a9306707365ddf77f7d8bd406dea494b269e4dee210c97a681ee031c60f9a34368dcee4692ec462d076a0bd9 + languageName: node + linkType: hard + +"@apollo/utils.stripsensitiveliterals@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.1" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/eb6b22e5a140be574e526da044a48ac0f8949b6f87dccb0c4224c02a5a3df4db82873ab128177476765f1091edde4f3dcae5cb73077827b2cb91489c1c7a8130 + languageName: node + linkType: hard + +"@apollo/utils.usagereporting@npm:^2.1.0": + version: 2.1.0 + resolution: "@apollo/utils.usagereporting@npm:2.1.0" + dependencies: + "@apollo/usage-reporting-protobuf": "npm:^4.1.0" + "@apollo/utils.dropunuseddefinitions": "npm:^2.0.1" + "@apollo/utils.printwithreducedwhitespace": "npm:^2.0.1" + "@apollo/utils.removealiases": "npm:2.0.1" + "@apollo/utils.sortast": "npm:^2.0.1" + "@apollo/utils.stripsensitiveliterals": "npm:^2.0.1" + peerDependencies: + graphql: 14.x || 15.x || 16.x + checksum: 10c0/5c2b06a14c5094d0ee8eab7ff78449da1efff3bb4c82ef311b2bb90190437c6c59f2783702a428775f394f12455a53a9723e625e53e18e47b423df8cb9eb26d8 + languageName: node + linkType: hard + +"@apollo/utils.withrequired@npm:^2.0.0": + version: 2.0.1 + resolution: "@apollo/utils.withrequired@npm:2.0.1" + checksum: 10c0/04d871f5934e3b9cacc28bc36ae44f640bfbfd147ad83088e26013f7444377449f1dde8d4bee665e86342a49cd4698e8d0c9aba46a532a5fab41b98e39fb1f9a + languageName: node + linkType: hard + +"@as-integrations/koa@npm:1.1.1": + version: 1.1.1 + resolution: "@as-integrations/koa@npm:1.1.1" + peerDependencies: + "@apollo/server": ^4.0.0 + koa: ^2.0.0 + checksum: 10c0/ffabb8d3e3073fa39cfb00493ee6e2a0bc5076e003db720341b33805f247ee9eae8987e727cd7d39fa00b1efbcda19a661e93bfc99c8f80bb07dbcddc1ce223c + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/compat-data@npm:7.26.3" + checksum: 10c0/d63e71845c34dfad8d7ff8c15b562e620dbf60e68e3abfa35681d24d612594e8e5ec9790d831a287ecd79ce00f48e7ffddc85c5ce94af7242d45917b9c1a5f90 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.3, @babel/generator@npm:^7.7.2": + version: 7.26.3 + resolution: "@babel/generator@npm:7.26.3" + dependencies: + "@babel/parser": "npm:^7.26.3" + "@babel/types": "npm:^7.26.3" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/54f260558e3e4ec8942da3cde607c35349bb983c3a7c5121243f96893fba3e8cd62e1f1773b2051f936f8c8a10987b758d5c7d76dbf2784e95bb63ab4843fa00 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" + dependencies: + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10c0/483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" + dependencies: + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" + dependencies: + "@babel/types": "npm:^7.26.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/48f736374e61cfd10ddbf7b80678514ae1f16d0e88bc793d2b505d73d9b987ea786fc8c2f7ee8f8b8c467df062030eb07fd0eb2168f0f541ca1f542775852cad + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + languageName: node + linkType: hard + +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + languageName: node + linkType: hard + +"@babel/runtime-corejs3@npm:^7.9.2": + version: 7.26.0 + resolution: "@babel/runtime-corejs3@npm:7.26.0" + dependencies: + core-js-pure: "npm:^3.30.2" + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/921fa27c004cf2b92f0d49efc2006cfc1a72d2a35c7374da8ec88d8b63543963e6ef29d4820e068a7892a7d553dc2bac7208aef8fef30642bc843b63255b650b + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.5, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.25.9": + version: 7.26.4 + resolution: "@babel/traverse@npm:7.26.4" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.3" + "@babel/parser": "npm:^7.26.3" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.3" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/cf25d0eda9505daa0f0832ad786b9e28c9d967e823aaf7fbe425250ab198c656085495aa6bed678b27929e095c84eea9fd778b851a31803da94c9bc4bf4eaef7 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3, @babel/types@npm:^7.3.3": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/966c5242c5e55c8704bf7a7418e7be2703a0afa4d19a8480999d5a4ef13d095dd60686615fe5983cb7593b4b06ba3a7de8d6ca501c1d78bdd233a10d90be787b + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 + languageName: node + linkType: hard + +"@casl/ability@npm:6.5.0": + version: 6.5.0 + resolution: "@casl/ability@npm:6.5.0" + dependencies: + "@ucast/mongo2js": "npm:^1.3.0" + checksum: 10c0/e94bdd0951508fc26f1db775867de37ef58777686b78854c8a755e1ec4462f92709a292e141aa0a185422d2503f8103c8538bed0782dce391e0b4794f774d441 + languageName: node + linkType: hard + +"@codemirror/autocomplete@npm:^6.0.0": + version: 6.18.3 + resolution: "@codemirror/autocomplete@npm:6.18.3" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.17.0" + "@lezer/common": "npm:^1.0.0" + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: 10c0/6d953d50ca264d2892f3d341efe2fa6a5220e9ef66d725fa315aa194813df5a0a133dc75f1eb5115c741aa22d5ba399dcc90356bb26ccfcad5b368d7e330eed8 + languageName: node + linkType: hard + +"@codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.1.0": + version: 6.7.1 + resolution: "@codemirror/commands@npm:6.7.1" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@codemirror/state": "npm:^6.4.0" + "@codemirror/view": "npm:^6.27.0" + "@lezer/common": "npm:^1.1.0" + checksum: 10c0/287a50eebc50b316bd5a69c66005c14107f3be571e65812bc0811f5f0d187ca0670ba0be54b0266433450330600ceef569fa52d0678a1c2a17f73b10b0df2356 + languageName: node + linkType: hard + +"@codemirror/lang-json@npm:6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-json@npm:6.0.1" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@lezer/json": "npm:^1.0.0" + checksum: 10c0/c70301ba43d44dbd1ff0ccab6ec6e3fb9825d61d4854b4839441a8144a9c96997acdad16d93199d157308dd80088a5e9f14b66f395c7e79f4dadc6b4e70ce8a8 + languageName: node + linkType: hard + +"@codemirror/language@npm:^6.0.0": + version: 6.10.6 + resolution: "@codemirror/language@npm:6.10.6" + dependencies: + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.23.0" + "@lezer/common": "npm:^1.1.0" + "@lezer/highlight": "npm:^1.0.0" + "@lezer/lr": "npm:^1.0.0" + style-mod: "npm:^4.0.0" + checksum: 10c0/8d6812165970303696d7b8e20236278ff2df0407c76e784a4d5be42b2219a5ca868d15ccbe59f43445dc62968e4ab784ed9e738db02e3a7b1be11a8eba59756d + languageName: node + linkType: hard + +"@codemirror/lint@npm:^6.0.0": + version: 6.8.4 + resolution: "@codemirror/lint@npm:6.8.4" + dependencies: + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.35.0" + crelt: "npm:^1.0.5" + checksum: 10c0/2614f25c50061b8bea4a430d19b25dca03e3d3059ade0bbc5768d2a1ac1dbc2e653ccc810d951860e6bd9e37031c850f439054c6df6522d533d93984df68bc79 + languageName: node + linkType: hard + +"@codemirror/search@npm:^6.0.0": + version: 6.5.8 + resolution: "@codemirror/search@npm:6.5.8" + dependencies: + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + crelt: "npm:^1.0.5" + checksum: 10c0/67a36fb0781427b23c39e223ecd9729b170a2e28874825b2d63b551761e620f2523707d7e593426b5cc4d5ea520ffb9026408de02a0aacfe55453e70e2d9b7a2 + languageName: node + linkType: hard + +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.5.0": + version: 6.5.0 + resolution: "@codemirror/state@npm:6.5.0" + dependencies: + "@marijn/find-cluster-break": "npm:^1.0.0" + checksum: 10c0/740425d605d7b12524e3abef242a8ca0ea1a17bab97f7583221f89c56b8f2eb236f8a227885e2bb472662b328d2a32b972fbf8543096224711679dfc3a28b492 + languageName: node + linkType: hard + +"@codemirror/theme-one-dark@npm:^6.0.0": + version: 6.1.2 + resolution: "@codemirror/theme-one-dark@npm:6.1.2" + dependencies: + "@codemirror/language": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + "@lezer/highlight": "npm:^1.0.0" + checksum: 10c0/d0d70ce1e03fa7e5d51cc72d8bdef043f30e14a5aee88f4dd71b64e176c3d68629c82390b9cfdab8cc1ac20d35703b65fe9160051fddc873aa67c613d9525a3d + languageName: node + linkType: hard + +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.35.0": + version: 6.35.3 + resolution: "@codemirror/view@npm:6.35.3" + dependencies: + "@codemirror/state": "npm:^6.5.0" + style-mod: "npm:^4.1.0" + w3c-keyname: "npm:^2.2.4" + checksum: 10c0/aa12c86756360f0ab2cf4b09fca16e5bfb3d32cc99a94a18a12aec84dd3a20f15277fb36d42fc78f803caaa7b93f3fa7382ba47e1d3495fad7166317c60090d8 + languageName: node + linkType: hard + +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: "npm:1.1.x" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10c0/a5133df8492802465ed01f2f0a5784585241a1030c362d54a602ed1839816d6c93d71dde05cf2ddb4fd0796238c19774406bd62fa2564b637907b495f52425fe + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:0.5.7": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c + languageName: node + linkType: hard + +"@emotion/babel-plugin@npm:^11.13.5": + version: 11.13.5 + resolution: "@emotion/babel-plugin@npm:11.13.5" + dependencies: + "@babel/helper-module-imports": "npm:^7.16.7" + "@babel/runtime": "npm:^7.18.3" + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/serialize": "npm:^1.3.3" + babel-plugin-macros: "npm:^3.1.0" + convert-source-map: "npm:^1.5.0" + escape-string-regexp: "npm:^4.0.0" + find-root: "npm:^1.1.0" + source-map: "npm:^0.5.7" + stylis: "npm:4.2.0" + checksum: 10c0/8ccbfec7defd0e513cb8a1568fa179eac1e20c35fda18aed767f6c59ea7314363ebf2de3e9d2df66c8ad78928dc3dceeded84e6fa8059087cae5c280090aeeeb + languageName: node + linkType: hard + +"@emotion/cache@npm:^11.14.0, @emotion/cache@npm:^11.4.0": + version: 11.14.0 + resolution: "@emotion/cache@npm:11.14.0" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + "@emotion/sheet": "npm:^1.4.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" + stylis: "npm:4.2.0" + checksum: 10c0/3fa3e7a431ab6f8a47c67132a00ac8358f428c1b6c8421d4b20de9df7c18e95eec04a5a6ff5a68908f98d3280044f247b4965ac63df8302d2c94dba718769724 + languageName: node + linkType: hard + +"@emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 + languageName: node + linkType: hard + +"@emotion/is-prop-valid@npm:1.2.2": + version: 1.2.2 + resolution: "@emotion/is-prop-valid@npm:1.2.2" + dependencies: + "@emotion/memoize": "npm:^0.8.1" + checksum: 10c0/bb1530dcb4e0e5a4fabb219279f2d0bc35796baf66f6241f98b0d03db1985c890a8cafbea268e0edefd5eeda143dbd5c09a54b5fba74cee8c69b98b13194af50 + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.8.1": + version: 0.8.1 + resolution: "@emotion/memoize@npm:0.8.1" + checksum: 10c0/dffed372fc3b9fa2ba411e76af22b6bb686fb0cb07694fdfaa6dd2baeb0d5e4968c1a7caa472bfcf06a5997d5e7c7d16b90e993f9a6ffae79a2c3dbdc76dfe78 + languageName: node + linkType: hard + +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 10c0/13f474a9201c7f88b543e6ea42f55c04fb2fdc05e6c5a3108aced2f7e7aa7eda7794c56bba02985a46d8aaa914fcdde238727a98341a96e2aec750d372dadd15 + languageName: node + linkType: hard + +"@emotion/react@npm:^11.8.1": + version: 11.14.0 + resolution: "@emotion/react@npm:11.14.0" + dependencies: + "@babel/runtime": "npm:^7.18.3" + "@emotion/babel-plugin": "npm:^11.13.5" + "@emotion/cache": "npm:^11.14.0" + "@emotion/serialize": "npm:^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" + "@emotion/utils": "npm:^1.4.2" + "@emotion/weak-memoize": "npm:^0.4.0" + hoist-non-react-statics: "npm:^3.3.1" + peerDependencies: + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/d0864f571a9f99ec643420ef31fde09e2006d3943a6aba079980e4d5f6e9f9fecbcc54b8f617fe003c00092ff9d5241179149ffff2810cb05cf72b4620cfc031 + languageName: node + linkType: hard + +"@emotion/serialize@npm:^1.3.3": + version: 1.3.3 + resolution: "@emotion/serialize@npm:1.3.3" + dependencies: + "@emotion/hash": "npm:^0.9.2" + "@emotion/memoize": "npm:^0.9.0" + "@emotion/unitless": "npm:^0.10.0" + "@emotion/utils": "npm:^1.4.2" + csstype: "npm:^3.0.2" + checksum: 10c0/b28cb7de59de382021de2b26c0c94ebbfb16967a1b969a56fdb6408465a8993df243bfbd66430badaa6800e1834724e84895f5a6a9d97d0d224de3d77852acb4 + languageName: node + linkType: hard + +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: 10c0/3ca72d1650a07d2fbb7e382761b130b4a887dcd04e6574b2d51ce578791240150d7072a9bcb4161933abbcd1e38b243a6fb4464a7fe991d700c17aa66bb5acc7 + languageName: node + linkType: hard + +"@emotion/unitless@npm:0.8.1": + version: 0.8.1 + resolution: "@emotion/unitless@npm:0.8.1" + checksum: 10c0/a1ed508628288f40bfe6dd17d431ed899c067a899fa293a13afe3aed1d70fac0412b8a215fafab0b42829360db687fecd763e5f01a64ddc4a4b58ec3112ff548 + languageName: node + linkType: hard + +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: 10c0/150943192727b7650eb9a6851a98034ddb58a8b6958b37546080f794696141c3760966ac695ab9af97efe10178690987aee4791f9f0ad1ff76783cdca83c1d49 + languageName: node + linkType: hard + +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.2.0": + version: 1.2.0 + resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.2.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/074dbc92b96bdc09209871070076e3b0351b6b47efefa849a7d9c37ab142130767609ca1831da0055988974e3b895c1de7606e4c421fecaa27c3e56a2afd3b08 + languageName: node + linkType: hard + +"@emotion/utils@npm:^1.4.2": + version: 1.4.2 + resolution: "@emotion/utils@npm:1.4.2" + checksum: 10c0/7d0010bf60a2a8c1a033b6431469de4c80e47aeb8fd856a17c1d1f76bbc3a03161a34aeaa78803566e29681ca551e7bf9994b68e9c5f5c796159923e44f78d9a + languageName: node + linkType: hard + +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: 10c0/64376af11f1266042d03b3305c30b7502e6084868e33327e944b539091a472f089db307af69240f7188f8bc6b319276fd7b141a36613f1160d73d12a60f6ca1a + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/aix-ppc64@npm:0.20.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/aix-ppc64@npm:0.21.3" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/android-arm64@npm:0.16.17" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm64@npm:0.20.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/android-arm64@npm:0.21.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/android-arm@npm:0.16.17" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm@npm:0.20.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/android-arm@npm:0.21.3" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/android-x64@npm:0.16.17" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-x64@npm:0.20.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/android-x64@npm:0.21.3" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/darwin-arm64@npm:0.16.17" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-arm64@npm:0.20.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/darwin-arm64@npm:0.21.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/darwin-x64@npm:0.16.17" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-x64@npm:0.20.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/darwin-x64@npm:0.21.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/freebsd-arm64@npm:0.16.17" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-arm64@npm:0.20.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/freebsd-arm64@npm:0.21.3" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/freebsd-x64@npm:0.16.17" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-x64@npm:0.20.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/freebsd-x64@npm:0.21.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-arm64@npm:0.16.17" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm64@npm:0.20.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-arm64@npm:0.21.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-arm@npm:0.16.17" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm@npm:0.20.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-arm@npm:0.21.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-ia32@npm:0.16.17" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ia32@npm:0.20.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-ia32@npm:0.21.3" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-loong64@npm:0.16.17" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-loong64@npm:0.20.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-loong64@npm:0.21.3" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-mips64el@npm:0.16.17" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-mips64el@npm:0.20.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-mips64el@npm:0.21.3" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-ppc64@npm:0.16.17" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ppc64@npm:0.20.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-ppc64@npm:0.21.3" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-riscv64@npm:0.16.17" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-riscv64@npm:0.20.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-riscv64@npm:0.21.3" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-s390x@npm:0.16.17" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-s390x@npm:0.20.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-s390x@npm:0.21.3" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/linux-x64@npm:0.16.17" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-x64@npm:0.20.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/linux-x64@npm:0.21.3" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/netbsd-x64@npm:0.16.17" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/netbsd-x64@npm:0.20.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/netbsd-x64@npm:0.21.3" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/openbsd-x64@npm:0.16.17" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/openbsd-x64@npm:0.20.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/openbsd-x64@npm:0.21.3" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/sunos-x64@npm:0.16.17" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/sunos-x64@npm:0.20.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/sunos-x64@npm:0.21.3" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/win32-arm64@npm:0.16.17" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-arm64@npm:0.20.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/win32-arm64@npm:0.21.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/win32-ia32@npm:0.16.17" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-ia32@npm:0.20.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/win32-ia32@npm:0.21.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.16.17": + version: 0.16.17 + resolution: "@esbuild/win32-x64@npm:0.16.17" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-x64@npm:0.20.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.3": + version: 0.21.3 + resolution: "@esbuild/win32-x64@npm:0.21.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@faker-js/faker@npm:^9.0.3": + version: 9.3.0 + resolution: "@faker-js/faker@npm:9.3.0" + checksum: 10c0/6528e2f0bf0abc315780024534074a449e01e7f581f1a50a20ee7103d29d842e1c4d7dd6b27aa173f668308bf55a1d64c2547286c0c4e5a8e08d0b8269aaedc7 + languageName: node + linkType: hard + +"@floating-ui/core@npm:^1.6.0": + version: 1.6.8 + resolution: "@floating-ui/core@npm:1.6.8" + dependencies: + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10c0/d6985462aeccae7b55a2d3f40571551c8c42bf820ae0a477fc40ef462e33edc4f3f5b7f11b100de77c9b58ecb581670c5c3f46d0af82b5e30aa185c735257eb9 + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.0.1": + version: 1.6.12 + resolution: "@floating-ui/dom@npm:1.6.12" + dependencies: + "@floating-ui/core": "npm:^1.6.0" + "@floating-ui/utils": "npm:^0.2.8" + checksum: 10c0/c67b39862175b175c6ac299ea970f17a22c7482cfdf3b1bc79313407bf0880188b022b878953fa69d3ce166ff2bd9ae57c86043e5dd800c262b470d877591b7d + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:2.1.0": + version: 2.1.0 + resolution: "@floating-ui/react-dom@npm:2.1.0" + dependencies: + "@floating-ui/dom": "npm:^1.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/9ee44dfeb27f585fb1e0114cbe37c72ff5d34149900f4f3013f6b0abf8c3365eab13286c360f97fbe0c44bb91a745e7a4c18b82d111990b45a7a7796dc55e461 + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0": + version: 2.1.2 + resolution: "@floating-ui/react-dom@npm:2.1.2" + dependencies: + "@floating-ui/dom": "npm:^1.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60 + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.8": + version: 0.2.8 + resolution: "@floating-ui/utils@npm:0.2.8" + checksum: 10c0/a8cee5f17406c900e1c3ef63e3ca89b35e7a2ed645418459a73627b93b7377477fc888081011c6cd177cac45ec2b92a6cab018c14ea140519465498dddd2d3f9 + languageName: node + linkType: hard + +"@formatjs/ecma402-abstract@npm:1.18.2": + version: 1.18.2 + resolution: "@formatjs/ecma402-abstract@npm:1.18.2" + dependencies: + "@formatjs/intl-localematcher": "npm:0.5.4" + tslib: "npm:^2.4.0" + checksum: 10c0/87afb37dd937555e712ca85d5142a9083d617c491d1dddf8d660fdfb6186272d2bc75b78809b076388d26f016200c8bddbce73281fd707eb899da2bf3bc9b7ca + languageName: node + linkType: hard + +"@formatjs/ecma402-abstract@npm:2.2.4": + version: 2.2.4 + resolution: "@formatjs/ecma402-abstract@npm:2.2.4" + dependencies: + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/intl-localematcher": "npm:0.5.8" + tslib: "npm:2" + checksum: 10c0/3f262533fa704ea7a1a7a8107deee2609774a242c621f8cb5dd4bf4c97abf2fc12f5aeda3f4ce85be18147c484a0ca87303dca6abef53290717e685c55eabd2d + languageName: node + linkType: hard + +"@formatjs/fast-memoize@npm:2.2.0": + version: 2.2.0 + resolution: "@formatjs/fast-memoize@npm:2.2.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/ae88c5a93b96235aba4bd9b947d0310d2ec013687a99133413361b24122b5cdea8c9bf2e04a4a2a8b61f1f4ee5419ef6416ca4796554226b5050e05a9ce6ef49 + languageName: node + linkType: hard + +"@formatjs/fast-memoize@npm:2.2.3": + version: 2.2.3 + resolution: "@formatjs/fast-memoize@npm:2.2.3" + dependencies: + tslib: "npm:2" + checksum: 10c0/f1004c3b280de7e362bd37c5f48ff34c2ba1d6271d4a7b695fed561d1201a3379397824d8bffbf15fecee344d1e70398393bbb04297f242692310a305f12e75b + languageName: node + linkType: hard + +"@formatjs/icu-messageformat-parser@npm:2.7.6": + version: 2.7.6 + resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/icu-skeleton-parser": "npm:1.8.0" + tslib: "npm:^2.4.0" + checksum: 10c0/9fc72c2075333a969601e2be4260638940b1abefd1a5fc15b93b0b10d2319c9df5778aa51fc2a173ce66ca5e8a47b4b64caca85a32d0eb6095e16e8d65cb4b00 + languageName: node + linkType: hard + +"@formatjs/icu-messageformat-parser@npm:2.9.4": + version: 2.9.4 + resolution: "@formatjs/icu-messageformat-parser@npm:2.9.4" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/icu-skeleton-parser": "npm:1.8.8" + tslib: "npm:2" + checksum: 10c0/f1ed14ece7ef0abc9fb62e323b78c994fc772d346801ad5aaa9555e1a7d5c0fda791345f4f2e53a3223f0b82c1a4eaf9a83544c1c20cb39349d1a39bedcf1648 + languageName: node + linkType: hard + +"@formatjs/icu-skeleton-parser@npm:1.8.0": + version: 1.8.0 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + tslib: "npm:^2.4.0" + checksum: 10c0/10956732d70cc67049d216410b5dc3ef048935d1ea2ae76f5755bb9d0243af37ddeabd5d140ddbf5f6c7047068c3d02a05f93c68a89cedfaf7488d5062885ea4 + languageName: node + linkType: hard + +"@formatjs/icu-skeleton-parser@npm:1.8.8": + version: 1.8.8 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.8" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + tslib: "npm:2" + checksum: 10c0/5ad78a5682e83b973e6fed4fca68660b944c41d1e941f0c84d69ff3d10ae835330062dc0a2cf0d237d2675ad3463405061a3963c14c2b9d8d1c1911f892b1a8d + languageName: node + linkType: hard + +"@formatjs/intl-displaynames@npm:6.6.6": + version: 6.6.6 + resolution: "@formatjs/intl-displaynames@npm:6.6.6" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/intl-localematcher": "npm:0.5.4" + tslib: "npm:^2.4.0" + checksum: 10c0/4ba40057cfafaabf04485137bc96705d5ed7ac48f17ed7dfe8dbd7f71119667b6c0b7fa75469e32b70c9bada2c5d03af37a5261d655a37b81c63ba907edbb2e8 + languageName: node + linkType: hard + +"@formatjs/intl-displaynames@npm:6.8.5": + version: 6.8.5 + resolution: "@formatjs/intl-displaynames@npm:6.8.5" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/intl-localematcher": "npm:0.5.8" + tslib: "npm:2" + checksum: 10c0/1092d6bac9ba7ee22470b85c9af16802244aa8a54f07e6cd560d15b96e8a08fc359f20dee88a064fe4c9ca8860f439abb109cbb7977b9ccceb846e28aacdf29c + languageName: node + linkType: hard + +"@formatjs/intl-listformat@npm:7.5.5": + version: 7.5.5 + resolution: "@formatjs/intl-listformat@npm:7.5.5" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/intl-localematcher": "npm:0.5.4" + tslib: "npm:^2.4.0" + checksum: 10c0/bc9d8cbe42bd9513db0b2b221c0b1a752892005a90fa629b4cf7df1cbd3b96997cddbf420e562ebdfdc691a28d9b759ccae9633d5987aa0bceed5aef77a07ca4 + languageName: node + linkType: hard + +"@formatjs/intl-listformat@npm:7.7.5": + version: 7.7.5 + resolution: "@formatjs/intl-listformat@npm:7.7.5" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/intl-localematcher": "npm:0.5.8" + tslib: "npm:2" + checksum: 10c0/f514397f6b05ac29171fffbbd15636fbec086080058c79c159f24edd2038747c22579d46ebf339cbb672f8505ea408e5d960d6751064c16e02d18445cf4e7e61 + languageName: node + linkType: hard + +"@formatjs/intl-localematcher@npm:0.5.4": + version: 0.5.4 + resolution: "@formatjs/intl-localematcher@npm:0.5.4" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/c9ff5d34ca8b6fe59f8f303a3cc31a92d343e095a6987e273e5cc23f0fe99feb557a392a05da95931c7d24106acb6988e588d00ddd05b0934005aafd7fdbafe6 + languageName: node + linkType: hard + +"@formatjs/intl-localematcher@npm:0.5.8": + version: 0.5.8 + resolution: "@formatjs/intl-localematcher@npm:0.5.8" + dependencies: + tslib: "npm:2" + checksum: 10c0/7a660263986326b662d4cb537e8386331c34fda61fb830b105e6c62d49be58ace40728dae614883b27a41cec7b1df8b44f72f79e16e6028bfca65d398dc04f3b + languageName: node + linkType: hard + +"@formatjs/intl@npm:2.10.0": + version: 2.10.0 + resolution: "@formatjs/intl@npm:2.10.0" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/fast-memoize": "npm:2.2.0" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/intl-displaynames": "npm:6.6.6" + "@formatjs/intl-listformat": "npm:7.5.5" + intl-messageformat: "npm:10.5.11" + tslib: "npm:^2.4.0" + peerDependencies: + typescript: ^4.7 || 5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/7566038b011116cee7069165a25836b3fb687948e61b041809a9d978ac6c0882ae8d81a624a415cfb8e43852d097cd1cbc3c6707e717928e39b75c252491a712 + languageName: node + linkType: hard + +"@formatjs/intl@npm:2.10.15": + version: 2.10.15 + resolution: "@formatjs/intl@npm:2.10.15" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/icu-messageformat-parser": "npm:2.9.4" + "@formatjs/intl-displaynames": "npm:6.8.5" + "@formatjs/intl-listformat": "npm:7.7.5" + intl-messageformat: "npm:10.7.7" + tslib: "npm:2" + peerDependencies: + typescript: ^4.7 || 5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/5d51fd0785d5547f375991d7df2d6303479b0083eeb35c42c30c9633aab77101895498f1eace419fd34fdb5c84aea19037c5280c3a9d85f9c3ffe6eef76b6f39 + languageName: node + linkType: hard + +"@graphql-tools/merge@npm:^8.4.1": + version: 8.4.2 + resolution: "@graphql-tools/merge@npm:8.4.2" + dependencies: + "@graphql-tools/utils": "npm:^9.2.1" + tslib: "npm:^2.4.0" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/2df55222b48e010e683572f456cf265aabae5748c59f7c1260c66dec9794b7a076d3706f04da969b77f0a32c7ccb4551fee30125931d3fe9c98a8806aae9a3f4 + languageName: node + linkType: hard + +"@graphql-tools/merge@npm:^9.0.3": + version: 9.0.12 + resolution: "@graphql-tools/merge@npm:9.0.12" + dependencies: + "@graphql-tools/utils": "npm:^10.6.2" + tslib: "npm:^2.4.0" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/997ba41a1c5afd5ab271859be2ffa4b28a5785fc187a73b5869c60490cfb6d164754cfd1bcc63e7b49821c5a62c6cdb830587d20280e9a18a10b02d2423adde7 + languageName: node + linkType: hard + +"@graphql-tools/schema@npm:10.0.3": + version: 10.0.3 + resolution: "@graphql-tools/schema@npm:10.0.3" + dependencies: + "@graphql-tools/merge": "npm:^9.0.3" + "@graphql-tools/utils": "npm:^10.0.13" + tslib: "npm:^2.4.0" + value-or-promise: "npm:^1.0.12" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/420bfa29d00927da085a3e521d7d6de5694f3abcdf5ba18655cc2a6b6145816d74503b13ba3ea15c7c65411023c9d81cfb73e7d49aa35ccfb91943f16ab9db8f + languageName: node + linkType: hard + +"@graphql-tools/schema@npm:^9.0.0": + version: 9.0.19 + resolution: "@graphql-tools/schema@npm:9.0.19" + dependencies: + "@graphql-tools/merge": "npm:^8.4.1" + "@graphql-tools/utils": "npm:^9.2.1" + tslib: "npm:^2.4.0" + value-or-promise: "npm:^1.0.12" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/42fd8ca8d3c8d60b583077c201980518482ff0cd5ed0c1f14bd9b835a2689ad41d02cbd3478f7d7dea7aec1227f7639fd5deb5e6360852a2e542b96b44bfb7a4 + languageName: node + linkType: hard + +"@graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.1.3, @graphql-tools/utils@npm:^10.6.2": + version: 10.6.2 + resolution: "@graphql-tools/utils@npm:10.6.2" + dependencies: + "@graphql-typed-document-node/core": "npm:^3.1.1" + cross-inspect: "npm:1.0.1" + dset: "npm:^3.1.2" + tslib: "npm:^2.4.0" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/354d1e2c5db63302665de34a3e7a0d3fa6ea169525a943867054e29dc7bfd3dea96710b3e90869fbc5815a5e25444c09501181d7453c6e2adbb708fdcd320759 + languageName: node + linkType: hard + +"@graphql-tools/utils@npm:^9.2.1": + version: 9.2.1 + resolution: "@graphql-tools/utils@npm:9.2.1" + dependencies: + "@graphql-typed-document-node/core": "npm:^3.1.1" + tslib: "npm:^2.4.0" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/37a7bd7e14d28ff1bacc007dca84bc6cef2d7d7af9a547b5dbe52fcd134afddd6d4a7b2148cfbaff5ddba91a868453d597da77bd0457fb0be15928f916901606 + languageName: node + linkType: hard + +"@graphql-typed-document-node/core@npm:^3.1.1": + version: 3.2.0 + resolution: "@graphql-typed-document-node/core@npm:3.2.0" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 10c0/94e9d75c1f178bbae8d874f5a9361708a3350c8def7eaeb6920f2c820e82403b7d4f55b3735856d68e145e86c85cbfe2adc444fdc25519cd51f108697e99346c + languageName: node + linkType: hard + +"@hapi/bourne@npm:^3.0.0": + version: 3.0.0 + resolution: "@hapi/bourne@npm:3.0.0" + checksum: 10c0/2e2df62f6bc6f32b980ba5bbdc09200c93c55c8306399ec0f2781da088a82aab699498c89fe94fec4acf770210f9aee28c75bfc2f04044849ac01b034134e717 + languageName: node + linkType: hard + +"@inquirer/figures@npm:^1.0.3": + version: 1.0.8 + resolution: "@inquirer/figures@npm:1.0.8" + checksum: 10c0/34d287ff1fd16476c58bbd5b169db315f8319b5ffb09f81a1bb9aabd4165114e7406b1f418d021fd9cd48923008446e3eec274bb818f378ea132a0450bbc91d4 + languageName: node + linkType: hard + +"@internationalized/date@npm:3.5.4": + version: 3.5.4 + resolution: "@internationalized/date@npm:3.5.4" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10c0/4e1fe3e2ad1719390e9b859ee23e8b7e9315ddfc2a0fcf446d8954a5b41147a4bed025f9d9718e0d4a6f097407af87ac0bdea3879d23d2a84757dd5aa5b9edf8 + languageName: node + linkType: hard + +"@internationalized/number@npm:3.5.3": + version: 3.5.3 + resolution: "@internationalized/number@npm:3.5.3" + dependencies: + "@swc/helpers": "npm:^0.5.0" + checksum: 10c0/dd1bb4e89c6468b97e8357e1ba0a60234bd2c8226f3241c4c7499e5b1791ba0574127ea6de0fd6c4158e2ceef564bba6531a8f5589e58b820df669e312500f99 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.4.3, @jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 + languageName: node + linkType: hard + +"@jest/types@npm:29.5.x": + version: 29.5.0 + resolution: "@jest/types@npm:29.5.0" + dependencies: + "@jest/schemas": "npm:^29.4.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/f1cccd2e9b00a985bfdac03517f906cdf7a481be3606c335f8ec08a7272b7cf700b23484ce323a912b374defb90d3ab88c643cf2a2f47635c1c4feacfa1c1b2d + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@juggle/resize-observer@npm:^3.4.0": + version: 3.4.0 + resolution: "@juggle/resize-observer@npm:3.4.0" + checksum: 10c0/12930242357298c6f2ad5d4ec7cf631dfb344ca7c8c830ab7f64e6ac11eb1aae486901d8d880fd08fb1b257800c160a0da3aee1e7ed9adac0ccbb9b7c5d93347 + languageName: node + linkType: hard + +"@koa/cors@npm:5.0.0": + version: 5.0.0 + resolution: "@koa/cors@npm:5.0.0" + dependencies: + vary: "npm:^1.1.2" + checksum: 10c0/49e5f3b861590bd81aa3663a2f0658234a9b378840bb54a2947b3c5f2067f9d966b6fa2e9049fdc7c74c787456d1885bacd0b7ee1f134274d28282c7df99c3fd + languageName: node + linkType: hard + +"@koa/router@npm:12.0.2, @koa/router@npm:^12.0.1": + version: 12.0.2 + resolution: "@koa/router@npm:12.0.2" + dependencies: + debug: "npm:^4.3.4" + http-errors: "npm:^2.0.0" + koa-compose: "npm:^4.1.0" + methods: "npm:^1.1.2" + path-to-regexp: "npm:^6.3.0" + checksum: 10c0/9d33af8b5cb7e80cf2a17e156fe1821ad31ad672ff8e9df62a3af2d2e4a6f49abbbb7038edaea45ef078cabdd8a1ce595ad7da810e96b17c5b954ee46f7e554d + languageName: node + linkType: hard + +"@koa/router@npm:^10.1.1": + version: 10.1.1 + resolution: "@koa/router@npm:10.1.1" + dependencies: + debug: "npm:^4.1.1" + http-errors: "npm:^1.7.3" + koa-compose: "npm:^4.1.0" + methods: "npm:^1.1.2" + path-to-regexp: "npm:^6.1.0" + checksum: 10c0/a34a742df2b8b8640b21dca3b119303bd931d0ca29b6fc7375f5eb2a69636d88814b7ff5a9f94b0c63d9ae41fd5997fc5f31b8e431684cd92e84e3e9c1b45b51 + languageName: node + linkType: hard + +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.0": + version: 1.2.3 + resolution: "@lezer/common@npm:1.2.3" + checksum: 10c0/fe9f8e111080ef94037a34ca2af1221c8d01c1763ba5ecf708a286185c76119509a5d19d924c8842172716716ddce22d7834394670c4a9432f0ba9f3b7c0f50d + languageName: node + linkType: hard + +"@lezer/highlight@npm:^1.0.0": + version: 1.2.1 + resolution: "@lezer/highlight@npm:1.2.1" + dependencies: + "@lezer/common": "npm:^1.0.0" + checksum: 10c0/51b4c08596a0dfeec6a7b7ed90a7f2743ab42e7e8ff8b89707fd042860e4e133dbd8243639fcaf077305ae6c303aa74e69794015eb16cb34741f5ac6721f283c + languageName: node + linkType: hard + +"@lezer/json@npm:^1.0.0": + version: 1.0.2 + resolution: "@lezer/json@npm:1.0.2" + dependencies: + "@lezer/common": "npm:^1.2.0" + "@lezer/highlight": "npm:^1.0.0" + "@lezer/lr": "npm:^1.0.0" + checksum: 10c0/a84283b4e4ded682b5e90a068c52155deaeac79e8dc16da0e9904e72633be029a00ad2da26daa259e503ae3b116722985c3e15d9448336e5f0fde59f79b716ad + languageName: node + linkType: hard + +"@lezer/lr@npm:^1.0.0": + version: 1.4.2 + resolution: "@lezer/lr@npm:1.4.2" + dependencies: + "@lezer/common": "npm:^1.0.0" + checksum: 10c0/22bb5d0d4b33d0de5eb0706b7e5b5f2d20f570e112d9110009bd35b62ff10f2eb4eff8da4cf373dd4ddf5e06a304120b8f039add7ed9997c981c13945d5329cd + languageName: node + linkType: hard + +"@marijn/find-cluster-break@npm:^1.0.0": + version: 1.0.2 + resolution: "@marijn/find-cluster-break@npm:1.0.2" + checksum: 10c0/1a17a60b16083cc5f7ce89d7b7d8aa87ce4099723e3e9e34e229ef2cd8a980e69d481ca8ee90ffedfec5119af1aed581642fb60ed0365e7e90634c81ea6b630f + languageName: node + linkType: hard + +"@mux/mux-player-react@npm:3.1.0": + version: 3.1.0 + resolution: "@mux/mux-player-react@npm:3.1.0" + dependencies: + "@mux/mux-player": "npm:3.1.0" + "@mux/playback-core": "npm:0.27.0" + prop-types: "npm:^15.7.2" + peerDependencies: + "@types/react": ^17.0.0 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 + react: ^17.0.2 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 + react-dom: ^17.0.2 || ^17.0.2-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/14b7a1de1a5d6712fc69aea675a87ac5771e79840f8cee378cce7e187728567b328a32669d6159b69617c859dba48b91024d8cd2de7b66f980b03b1f5209a6b7 + languageName: node + linkType: hard + +"@mux/mux-player@npm:3.1.0": + version: 3.1.0 + resolution: "@mux/mux-player@npm:3.1.0" + dependencies: + "@mux/mux-video": "npm:0.22.0" + "@mux/playback-core": "npm:0.27.0" + media-chrome: "npm:~4.2.1" + player.style: "npm:^0.0.8" + checksum: 10c0/0c2cad39060a587c035d1fe2c33bfd035471208262f953190ddb61565adc8620210b587ca599821c0208b5a4251a59fbc47da33d21b17bc57e3b4e07036384eb + languageName: node + linkType: hard + +"@mux/mux-video@npm:0.22.0": + version: 0.22.0 + resolution: "@mux/mux-video@npm:0.22.0" + dependencies: + "@mux/playback-core": "npm:0.27.0" + castable-video: "npm:~1.1.0" + custom-media-element: "npm:~1.3.1" + media-tracks: "npm:~0.3.2" + checksum: 10c0/bd9ed43090afaa0683675ee76adcda658c299d030085ee4bd03be2f1c562af745285d213829cd1c88747c84f606bdbfb3b22ec0564d532c3d6aed45df3f4dd5b + languageName: node + linkType: hard + +"@mux/playback-core@npm:0.27.0": + version: 0.27.0 + resolution: "@mux/playback-core@npm:0.27.0" + dependencies: + hls.js: "npm:~1.5.11" + mux-embed: "npm:^5.3.1" + checksum: 10c0/af2056f110415557b4d19c7139e104a178f287e1c892d6818645d5953c3b61da0b5e6f1063ea6aa943af0becc54d7a9f5e7005ff2b2254a3f3a40f89b92f126a + languageName: node + linkType: hard + +"@noble/hashes@npm:^1.1.5": + version: 1.6.1 + resolution: "@noble/hashes@npm:1.6.1" + checksum: 10c0/27643cd8b551bc933b57cc29aa8c8763d586552fc4c3e06ecf7897f55be3463c0c9dff7f6ebacd88e5ce6d0cdb5415ca4874d0cf4359b5ea4a85be21ada03aab + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@paralleldrive/cuid2@npm:2.2.2": + version: 2.2.2 + resolution: "@paralleldrive/cuid2@npm:2.2.2" + dependencies: + "@noble/hashes": "npm:^1.1.5" + checksum: 10c0/af5826df93de437121308f4f4ce0b2eeb89b60bb57a1a6592fb89c0d40d311ad1d9f3f6a4db2cce6f2bcf572de1aa3f85704254e89b18ce61c41ebb06564c4ee + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 10c0/3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 + languageName: node + linkType: hard + +"@pmmmwh/react-refresh-webpack-plugin@npm:0.5.15": + version: 0.5.15 + resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.15" + dependencies: + ansi-html: "npm:^0.0.9" + core-js-pure: "npm:^3.23.3" + error-stack-parser: "npm:^2.0.6" + html-entities: "npm:^2.1.0" + loader-utils: "npm:^2.0.4" + schema-utils: "npm:^4.2.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@types/webpack": 4.x || 5.x + react-refresh: ">=0.10.0 <1.0.0" + sockjs-client: ^1.4.0 + type-fest: ">=0.17.0 <5.0.0" + webpack: ">=4.43.0 <6.0.0" + webpack-dev-server: 3.x || 4.x || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + "@types/webpack": + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + checksum: 10c0/ba310aa4d53070f59c8a374d1d256c5965c044c0c3fb1ff6b55353fb5e86de08a490a7bd59a31f0d4951f8f29f81864c7df224fe1342543a95d048b7413ff171 + languageName: node + linkType: hard + +"@pnpm/config.env-replace@npm:^1.1.0": + version: 1.1.0 + resolution: "@pnpm/config.env-replace@npm:1.1.0" + checksum: 10c0/4cfc4a5c49ab3d0c6a1f196cfd4146374768b0243d441c7de8fa7bd28eaab6290f514b98490472cc65dbd080d34369447b3e9302585e1d5c099befd7c8b5e55f + languageName: node + linkType: hard + +"@pnpm/network.ca-file@npm:^1.0.1": + version: 1.0.2 + resolution: "@pnpm/network.ca-file@npm:1.0.2" + dependencies: + graceful-fs: "npm:4.2.10" + checksum: 10c0/95f6e0e38d047aca3283550719155ce7304ac00d98911e4ab026daedaf640a63bd83e3d13e17c623fa41ac72f3801382ba21260bcce431c14fbbc06430ecb776 + languageName: node + linkType: hard + +"@pnpm/npm-conf@npm:^2.1.0": + version: 2.3.1 + resolution: "@pnpm/npm-conf@npm:2.3.1" + dependencies: + "@pnpm/config.env-replace": "npm:^1.1.0" + "@pnpm/network.ca-file": "npm:^1.0.1" + config-chain: "npm:^1.1.11" + checksum: 10c0/778a3a34ff7d6000a2594d2a9821f873f737bc56367865718b2cf0ba5d366e49689efe7975148316d7afd8e6f1dcef7d736fbb6ea7ef55caadd1dc93a36bb302 + languageName: node + linkType: hard + +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.28 + resolution: "@polka/url@npm:1.0.0-next.28" + checksum: 10c0/acc5ea62597e4da2fb42dbee02749d07f102ae7d6d2c966bf7e423c79cd65d1621da305af567e6e7c232f3b565e242d1ec932cbb3dcc0db1508d02e9a2cafa2e + languageName: node + linkType: hard + +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10c0/26ae337c5659e41f091606d16465bbcc1df1f37cc1ed462438b1f67be0c1e28dfb2ca9f294f39100c52161aef82edf758c95d6d75650a1ddf31f7ddee1440b43 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10c0/1eb0a75180e5206d1033e4138212a8c7089a3d418c6dfa5a6ce42e593a4ae2e5892c4ef7421f38092badba4040ea6a45f0928869989411001d8c1018ea9a6e70 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10c0/cda6a3dc2d50a182c5865b160f72077aac197046600091dbb005dd0a66db9cce3c5eaed6d470ac8ed49d7bcbeef6ee5f0bc288db5ff9a70cbd003e5909065233 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10c0/64372482efcba1fb4d166a2664a6395fa978b557803857c9c03500e0ac1013eb4b1aacc9ed851dd5fc22f81583670b4f4431bae186f3373fedcfde863ef5921a + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10c0/a3fe31fe3fa29aa3349e2e04ee13dc170cc6af7c23d92ad49e3eeaf79b9766264544d3da824dba93b7855bd6a2982fb40032ef40693da98a136d835752beb487 + languageName: node + linkType: hard + +"@radix-ui/number@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/number@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10c0/42e4870cd14459da6da03e43c7507dc4c807ed787a87bda52912a0d1d6d5013326b697c18c9625fc6a2cf0af2b45d9c86747985b45358fd92ab646b983978e3c + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/primitive@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10c0/912216455537db3ca77f3e7f70174fb2b454fbd4a37a0acb7cfadad9ab6131abdfb787472242574460a3c301edf45738340cc84f6717982710082840fde7d916 + languageName: node + linkType: hard + +"@radix-ui/react-accordion@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-accordion@npm:1.1.2" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-collapsible": "npm:1.0.3" + "@radix-ui/react-collection": "npm:1.0.3" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/54fe3642306d62f68ac4d534c6bec1998d00d441663b16119fe267cb085e48761acf3c02b9466245d42b8ab419632a573d35d79d3a5d328906bde121dd1816db + languageName: node + linkType: hard + +"@radix-ui/react-alert-dialog@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-alert-dialog@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dialog": "npm:1.0.5" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/73854a1011b07a50261a12ce33c4b9d6585603e731a2ceffc7a4d2b8c795631716fda8b8006a813648e247d17abbaf290a419a935ae4cd70c83c3c70a34ce9f4 + languageName: node + linkType: hard + +"@radix-ui/react-arrow@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-arrow@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/c931f6d7e0bac50fd1654a0303a303aff74a68a13a33a851a43a7c88677b53a92ca6557920b9105144a3002f899ce888437d20ddd7803a5c716edac99587626d + languageName: node + linkType: hard + +"@radix-ui/react-avatar@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-avatar@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/608494c53968085bfcf9b987d80c3ec6720bdb65f78591d53e8bba3b360e86366d48a7dee11405dd443f5a3565432184b95bb9d4954bca1922cc9385a942caaf + languageName: node + linkType: hard + +"@radix-ui/react-checkbox@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-checkbox@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + "@radix-ui/react-use-previous": "npm:1.0.1" + "@radix-ui/react-use-size": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/a4bd259a7e15ad88f72524190ddcc2db0688d439aad954e06d0adf6038b2e17397ed8ae0ea26ab09bf6981f1b9dd883904b2b7e74b307b5c6b1a3765d27fe737 + languageName: node + linkType: hard + +"@radix-ui/react-collapsible@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-collapsible@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/7bc3e601e3fa84991bdf46ea1bdb725760942f8facadf42f05808abc7a1399c6ab90a00c70699367026afbd8afba0254ff9634f9d1e05b24ae452d9e0524d328 + languageName: node + linkType: hard + +"@radix-ui/react-collection@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-collection@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/cefa56383d7451ca79e4bd5a29aaeef6c205a04297213efd149aaead82fc8cde4fb8298e20e6b3613e5696e43f814fb4489805428f6604834fb31f73c6725fa8 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-compose-refs@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/be06f8dab35b5a1bffa7a5982fb26218ddade1acb751288333e3b89d7b4a7dfb5a6371be83876dac0ec2ebe0866d295e8618b778608e1965342986ea448040ec + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-context@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/3de5761b32cc70cd61715527f29d8c699c01ab28c195ced972ccbc7025763a373a68f18c9f948c7a7b922e469fd2df7fee5f7536e3f7bad44ffc06d959359333 + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dialog@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/c5b3069397379e79857a3203f3ead4d12d87736b59899f02a63e620a07dd1e6704e15523926cdf8e39afe1c945a7ff0f2533c5ea5be1e17c3114820300a51133 + languageName: node + linkType: hard + +"@radix-ui/react-direction@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-direction@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/b1a45b4d1d5070ca3b5864b920f6c6210c962bdb519abb62b38b1baef9d06737dc3d8ecdb61860b7504a735235a539652f5977c7299ec021da84e6b0f64d988a + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-escape-keydown": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/7e4308867aecfb07b506330c1964d94a52247ab9453725613cd326762aa13e483423c250f107219c131b0449600eb8d1576ce3159c2b96e8c978f75e46062cb2 + languageName: node + linkType: hard + +"@radix-ui/react-dropdown-menu@npm:2.0.6": + version: 2.0.6 + resolution: "@radix-ui/react-dropdown-menu@npm:2.0.6" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-menu": "npm:2.0.6" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/525cab53547d2ce2904518b1f66b62179d656c57c8d6dd7dbe863cc05025d8bad535f44011e2735b07fc500579c3d64d89a9a39593d4c8f91f31052d75b729e1 + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-focus-guards@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/d5fd4e5aa9d9a87c8ad490b3b4992d6f1d9eddf18e56df2a2bcf8744c4332b275d73377fd193df3e6ba0ad9608dc497709beca5c64de2b834d5f5350b3c9a272 + languageName: node + linkType: hard + +"@radix-ui/react-focus-scope@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-focus-scope@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/2fce0bafcab4e16cf4ed7560bda40654223f3d0add6b231e1c607433030c14e6249818b444b7b58ee7a6ff6bbf8e192c9c81d22c3a5c88c2daade9d1f881b5be + languageName: node + linkType: hard + +"@radix-ui/react-id@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-id@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/e2859ca58bea171c956098ace7ecf615cf9432f58a118b779a14720746b3adcf0351c36c75de131548672d3cd290ca238198acbd33b88dc4706f98312e9317ad + languageName: node + linkType: hard + +"@radix-ui/react-menu@npm:2.0.6": + version: 2.0.6 + resolution: "@radix-ui/react-menu@npm:2.0.6" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-collection": "npm:1.0.3" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-popper": "npm:1.1.3" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-roving-focus": "npm:1.0.4" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/06926fa59cb8f5614f2e1a085ea1cbf09631ae28fb6e5d6e6d2a0a84d24979e3aca311cdb19dfdb254c1823ff85fd5250c29d4463f8f7622dd523e35df3fce1d + languageName: node + linkType: hard + +"@radix-ui/react-popover@npm:1.0.7": + version: 1.0.7 + resolution: "@radix-ui/react-popover@npm:1.0.7" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-popper": "npm:1.1.3" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + aria-hidden: "npm:^1.1.1" + react-remove-scroll: "npm:2.5.5" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/ed7abbd61df1e15d62072e214fafbdc4e31942e0ce49665f2045d8279944a0a37762bcd70a36389ed9e43c95797d5acb57f6f5ca5a15b688b1928cfc2b9ce196 + languageName: node + linkType: hard + +"@radix-ui/react-popper@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-popper@npm:1.1.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@floating-ui/react-dom": "npm:^2.0.0" + "@radix-ui/react-arrow": "npm:1.0.3" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + "@radix-ui/react-use-rect": "npm:1.0.1" + "@radix-ui/react-use-size": "npm:1.0.1" + "@radix-ui/rect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/a38c374ec65dd8d7c604af7151e96faec1743828d859dc4892e720c1803a7e1562add26aec2ddf2091defae4e15d989c028032ea481419e38c4693b3f12545c3 + languageName: node + linkType: hard + +"@radix-ui/react-portal@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-portal@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/fed32f8148b833fe852fb5e2f859979ffdf2fb9a9ef46583b9b52915d764ad36ba5c958a64e61d23395628ccc09d678229ee94cd112941e8fe2575021f820c29 + languageName: node + linkType: hard + +"@radix-ui/react-presence@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-presence@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/90780618b265fe794a8f1ddaa5bfd3c71a1127fa79330a14d32722e6265b44452a9dd36efe4e769129d33e57f979f6b8713e2cbf2e2755326aa3b0f337185b6e + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-primitive@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-slot": "npm:1.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/67a66ff8898a5e7739eda228ab6f5ce808858da1dce967014138d87e72b6bbfc93dc1467c706d98d1a2b93bf0b6e09233d1a24d31c78227b078444c1a69c42be + languageName: node + linkType: hard + +"@radix-ui/react-progress@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-progress@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/ccb383ad06f8b2bcc8053c618009e775dc41674d5e2d51e8ab8460a60ea154488a03ccc07f72efbe28d7b182ca424bc223f304686edd002c7cd9be34199881b9 + languageName: node + linkType: hard + +"@radix-ui/react-radio-group@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-radio-group@npm:1.1.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-roving-focus": "npm:1.0.4" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + "@radix-ui/react-use-previous": "npm:1.0.1" + "@radix-ui/react-use-size": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/a23264cc9e8cb3738db8edf50ae27b82f79093f57c2e9a4d319fdece280147f5615643ad6df480383dcd53f39078e321c25be5e18992ffda36b2c73ebfcad9c4 + languageName: node + linkType: hard + +"@radix-ui/react-roving-focus@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-roving-focus@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-collection": "npm:1.0.3" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/61e3ddfd1647e64fba855434ff41e8e7ba707244fe8841f78c450fbdce525383b64259279475615d030dbf1625cbffd8eeebee72d91bf6978794f5dbcf887fc0 + languageName: node + linkType: hard + +"@radix-ui/react-scroll-area@npm:1.0.5": + version: 1.0.5 + resolution: "@radix-ui/react-scroll-area@npm:1.0.5" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/number": "npm:1.0.1" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/a08818aeeb15920a02e708699a8bdc85c26eab0579ab741129b464a799b5d9a04f81810a2d200f1cf4aef03452067770e87b0f81593a689350fcd7e51819e4cb + languageName: node + linkType: hard + +"@radix-ui/react-separator@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-separator@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/87bcde47343f2bc4439a0dc34381f557905d9b3c1e8c5a0d32ceea62a8ef84f3abf671c5cb29309fc87759ad41d39af619ba546cf54109d64c8746e3ca683de3 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.0.2": + version: 1.0.2 + resolution: "@radix-ui/react-slot@npm:1.0.2" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-compose-refs": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/3af6ea4891e6fa8091e666802adffe7718b3cd390a10fa9229a5f40f8efded9f3918ea01b046103d93923d41cc32119505ebb6bde76cad07a87b6cf4f2119347 + languageName: node + linkType: hard + +"@radix-ui/react-switch@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-switch@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + "@radix-ui/react-use-previous": "npm:1.0.1" + "@radix-ui/react-use-size": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/e7c65aeedf9d3cd47320fd3759b8c7f3777619cd847a96f2c52841488ad1745fa35335e2877a4f839902942410a7ffe9baf05ec1c249a0401a2b1b9363dbf343 + languageName: node + linkType: hard + +"@radix-ui/react-tabs@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-tabs@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-roving-focus": "npm:1.0.4" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/79699a921f5c2e890e0e496a751d9c2a7c4017eff8e52f094389e993263332881353bdd27b8cc123c906b36743e803eec7f32fdbb4d413328cba0a37d6413339 + languageName: node + linkType: hard + +"@radix-ui/react-toggle-group@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-toggle-group@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-roving-focus": "npm:1.0.4" + "@radix-ui/react-toggle": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/4f4761965022759ac0950ac026029b64049e1f18ef07a01ddde788b7606efcb262c9ae3a418de0c0756bf7285182ed0d268502c6f17ba86d2ff27eee5507bbf7 + languageName: node + linkType: hard + +"@radix-ui/react-toggle@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-toggle@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/9b487dad213ea7e70b0aa205e7c6f790a6f2bf394c39912e22dbe003403fd0d24a41c2efd31695fc31ab7bac286f28253dbb2fc5202cacd572ebf909f1fdc86c + languageName: node + linkType: hard + +"@radix-ui/react-toolbar@npm:1.0.4": + version: 1.0.4 + resolution: "@radix-ui/react-toolbar@npm:1.0.4" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-roving-focus": "npm:1.0.4" + "@radix-ui/react-separator": "npm:1.0.3" + "@radix-ui/react-toggle-group": "npm:1.0.4" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/3ed7ebe22ef2e8369e08bb59776671a7b8c413628249c338b8db86b4b9ac40127b4201d5bd4a9c23ea1fd21464769b4fa427d3ebcda3a7fcdbd45b256b5a753a + languageName: node + linkType: hard + +"@radix-ui/react-tooltip@npm:1.0.7": + version: 1.0.7 + resolution: "@radix-ui/react-tooltip@npm:1.0.7" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-popper": "npm:1.1.3" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-presence": "npm:1.0.1" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + "@radix-ui/react-visually-hidden": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/915524ea9d102eb26e656c550a084ca460219041c0e7cec0e72b522ee52a43b4d725f4ad3352212f4ae88b3672ef7b23bad07844275cafea075ada590678d873 + languageName: node + linkType: hard + +"@radix-ui/react-use-callback-ref@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/331b432be1edc960ca148637ae6087220873ee828ceb13bd155926ef8f49e862812de5b379129f6aaefcd11be53715f3237e6caa9a33d9c0abfff43f3ba58938 + languageName: node + linkType: hard + +"@radix-ui/react-use-controllable-state@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/29b069dbf09e48bca321af6272574ad0fc7283174e7d092731a10663fe00c0e6b4bde5e1b5ea67725fe48dcbe8026e7ff0d69d42891c62cbb9ca408498171fbe + languageName: node + linkType: hard + +"@radix-ui/react-use-escape-keydown@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/3c94c78902dcb40b60083ee2184614f45c95a189178f52d89323b467bd04bcf5fdb1bc4d43debecd7f0b572c3843c7e04edbcb56f40a4b4b43936fb2770fb8ad + languageName: node + linkType: hard + +"@radix-ui/react-use-layout-effect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/13cd0c38395c5838bc9a18238020d3bcf67fb340039e6d1cbf438be1b91d64cf6900b78121f3dc9219faeb40dcc7b523ce0f17e4a41631655690e5a30a40886a + languageName: node + linkType: hard + +"@radix-ui/react-use-previous@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-previous@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f5fbc602108668484a4ed506b7842482222d1d03094362e26abb7fdd593eee8794fc47d85b3524fb9d00884801c89a6eefd0bed0971eba1ec189c637b6afd398 + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-rect@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/rect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/94c5ab31dfd3678c0cb77a30025e82b3a287577c1a8674b0d703a36d27434bc9c59790e0bebf57ed153f0b8e0d8c3b9675fc9787b9eac525a09abcda8fa9e7eb + languageName: node + linkType: hard + +"@radix-ui/react-use-size@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/react-use-size@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/b109a4b3781781c4dc641a1173f0a6fcb0b0f7b2d7cdba5848a46070c9fb4e518909a46c20a3c2efbc78737c64859c59ead837f2940e8c8394d1c503ef58773b + languageName: node + linkType: hard + +"@radix-ui/react-visually-hidden@npm:1.0.3": + version: 1.0.3 + resolution: "@radix-ui/react-visually-hidden@npm:1.0.3" + dependencies: + "@babel/runtime": "npm:^7.13.10" + "@radix-ui/react-primitive": "npm:1.0.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/0cbc12c2156b3fa0e40090cafd8525ce84c16a6b5a038a8e8fc7cbb16ed6da9ab369593962c57a18c41a16ec8713e0195c68ea34072ef1ca254ed4d4c0770bb4 + languageName: node + linkType: hard + +"@radix-ui/rect@npm:1.0.1": + version: 1.0.1 + resolution: "@radix-ui/rect@npm:1.0.1" + dependencies: + "@babel/runtime": "npm:^7.13.10" + checksum: 10c0/4c5159661340acc31b11e1f2ebd87a1521d39bfa287544dd2cd75b399539a4b625d38a1501c90ceae21fcca18ed164b0c3735817ff140ae334098192c110e571 + languageName: node + linkType: hard + +"@react-dnd/asap@npm:^5.0.1": + version: 5.0.2 + resolution: "@react-dnd/asap@npm:5.0.2" + checksum: 10c0/0063db616db9801c9be18f11a912c3e214f87e714b1e4bf9462952af7ead65cba0b43e1f7c34bc8748811b6926e74d929e5e126f85ebb91b870faf809ceb5177 + languageName: node + linkType: hard + +"@react-dnd/invariant@npm:^4.0.1": + version: 4.0.2 + resolution: "@react-dnd/invariant@npm:4.0.2" + checksum: 10c0/b303cc53fc5074cefb2a76b45b9c73ebb5d35630b18f5dc282ed9a9ac9b0287b9da1f6ac63acfdea2341b8f8187f615afc12d5eb14ec6015964f5c1b167332e2 + languageName: node + linkType: hard + +"@react-dnd/shallowequal@npm:^4.0.1": + version: 4.0.2 + resolution: "@react-dnd/shallowequal@npm:4.0.2" + checksum: 10c0/9a352fd176752e5d9c2797d598aca034b7829111ae0c992d80f40d5f068fcd6a039b1841c741dfa1ab67a36a00664310aec4f0ce216e4112f80875c9fe6fd8dc + languageName: node + linkType: hard + +"@reduxjs/toolkit@npm:1.9.7": + version: 1.9.7 + resolution: "@reduxjs/toolkit@npm:1.9.7" + dependencies: + immer: "npm:^9.0.21" + redux: "npm:^4.2.1" + redux-thunk: "npm:^2.4.2" + reselect: "npm:^4.1.8" + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + checksum: 10c0/fa0aa4b7c6973ac87ce0ac7e45faa02c73b66c4ee0bc950d178494539a42a1bb908d109297102458b7ea14d5e7dae356e7a7ce9a1b9849b0e8451e6dd70fca9c + languageName: node + linkType: hard + +"@remix-run/router@npm:1.21.0": + version: 1.21.0 + resolution: "@remix-run/router@npm:1.21.0" + checksum: 10c0/570792211c083a1c7146613b79cbb8e0d1e14f34e974052e060e7f9dcad38c800d80fe0a18bf42811bc278ab12c0e8fd62cfce649e905046c4e55bd5a09eafdc + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.28.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-android-arm64@npm:4.28.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.28.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.28.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.28.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.28.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.28.1" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.28.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.28.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.28.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.28.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.28.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.28.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.28.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.28.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.28.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rushstack/node-core-library@npm:5.10.0": + version: 5.10.0 + resolution: "@rushstack/node-core-library@npm:5.10.0" + dependencies: + ajv: "npm:~8.13.0" + ajv-draft-04: "npm:~1.0.0" + ajv-formats: "npm:~3.0.1" + fs-extra: "npm:~7.0.1" + import-lazy: "npm:~4.0.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/ef379432f1aeea1b19047a3e347e90b03e04331012e5df9cc8233fd6400bdcf801ed4e50ab3e36c211cd3266bbe4c3224205645b5909872a1f29a04a8d8ff3fd + languageName: node + linkType: hard + +"@rushstack/terminal@npm:0.14.3": + version: 0.14.3 + resolution: "@rushstack/terminal@npm:0.14.3" + dependencies: + "@rushstack/node-core-library": "npm:5.10.0" + supports-color: "npm:~8.1.1" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/0eba093d22c6a4d43b3ed9088ee8c354b63f5f28c059f5872251009231bf521ef1a415d33fed0a6572f52a450264de7d73313b0a41c65ab3b5e8c7baf5a82c1e + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:^4.12.2": + version: 4.23.1 + resolution: "@rushstack/ts-command-line@npm:4.23.1" + dependencies: + "@rushstack/terminal": "npm:0.14.3" + "@types/argparse": "npm:1.0.38" + argparse: "npm:~1.0.9" + string-argv: "npm:~0.3.1" + checksum: 10c0/dc69f502cd3ffbce190e5d6a9a1b85054680d3622933aecd9ef0e81de0aeabb44adcf193586b305733950afa6c36a84a9bacf4382adafd42ba48cb0f003687e7 + languageName: node + linkType: hard + +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + +"@sensinum/strapi-utils@npm:^1.0.4": + version: 1.0.5 + resolution: "@sensinum/strapi-utils@npm:1.0.5" + dependencies: + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + styled-components: "npm:^6.1.13" + typescript: "npm:^5.5.4" + peerDependencies: + "@strapi/sdk-plugin": ^5.2.7 + "@strapi/strapi": ^5.5.1 + react: ^18.3.1 + react-dom: ^18.3.1 + styled-components: ^6.1.13 + checksum: 10c0/01ab26e778f7630f1335737e3213e0c3e5af6bd373ec307c63612d126bcea4bfe420429aa86103238e5a71061c99f238d93644f078bc73764ae62d87a5bdb848 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b + languageName: node + linkType: hard + +"@sindresorhus/slugify@npm:1.1.0": + version: 1.1.0 + resolution: "@sindresorhus/slugify@npm:1.1.0" + dependencies: + "@sindresorhus/transliterate": "npm:^0.1.1" + escape-string-regexp: "npm:^4.0.0" + checksum: 10c0/3af19819c6b2c880a3629f0ed4386383b46d05a8efa7a71d647990a005480f8d6dd3f0348dbf4d37083278de7fb73151aba5fa0ad877b29e77233bb2cdd4e177 + languageName: node + linkType: hard + +"@sindresorhus/transliterate@npm:^0.1.1": + version: 0.1.2 + resolution: "@sindresorhus/transliterate@npm:0.1.2" + dependencies: + escape-string-regexp: "npm:^2.0.0" + lodash.deburr: "npm:^4.1.0" + checksum: 10c0/cc5afdcc0eab23c784d5383b3ddf2d15c736f48a404d5fbed6f1db78784e8429f41d1db664f6e68cc81eb73bf769a15ba6afeb176bc4f845b9a5186a40519491 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 + languageName: node + linkType: hard + +"@strapi/admin@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/admin@npm:5.5.1" + dependencies: + "@casl/ability": "npm:6.5.0" + "@internationalized/date": "npm:3.5.4" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-toolbar": "npm:1.0.4" + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/permissions": "npm:5.5.1" + "@strapi/types": "npm:5.5.1" + "@strapi/typescript-utils": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + "@testing-library/dom": "npm:10.1.0" + "@testing-library/react": "npm:15.0.7" + "@testing-library/user-event": "npm:14.5.2" + axios: "npm:1.7.4" + bcryptjs: "npm:2.4.3" + boxen: "npm:5.1.2" + chalk: "npm:^4.1.2" + codemirror5: "npm:codemirror@^5.65.11" + cross-env: "npm:^7.0.3" + date-fns: "npm:2.30.0" + execa: "npm:5.1.1" + fast-deep-equal: "npm:3.1.3" + formik: "npm:2.4.5" + fractional-indexing: "npm:3.2.0" + fs-extra: "npm:11.2.0" + highlight.js: "npm:^10.4.1" + immer: "npm:9.0.21" + inquirer: "npm:8.2.5" + invariant: "npm:^2.2.4" + is-localhost-ip: "npm:2.0.0" + jsonwebtoken: "npm:9.0.0" + koa: "npm:2.15.2" + koa-compose: "npm:4.1.0" + koa-passport: "npm:6.0.0" + koa-static: "npm:5.0.0" + koa2-ratelimit: "npm:^1.1.3" + lodash: "npm:4.17.21" + node-schedule: "npm:2.1.1" + ora: "npm:5.4.1" + p-map: "npm:4.0.0" + passport-local: "npm:1.0.0" + pluralize: "npm:8.0.0" + punycode: "npm:2.3.1" + qs: "npm:6.11.1" + react-dnd: "npm:16.0.1" + react-dnd-html5-backend: "npm:16.0.1" + react-intl: "npm:6.6.2" + react-is: "npm:^18.2.0" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + react-select: "npm:5.8.0" + react-window: "npm:1.8.10" + rimraf: "npm:5.0.5" + sanitize-html: "npm:2.13.0" + scheduler: "npm:0.23.0" + semver: "npm:7.5.4" + sift: "npm:16.0.1" + typescript: "npm:5.3.2" + use-context-selector: "npm:1.4.1" + yup: "npm:0.32.9" + zod: "npm:^3.22.4" + peerDependencies: + "@strapi/data-transfer": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/e0340da8569ce0dbec2dc83b8e1880075e7f26b733d6e8955ad199b76238c18fa9e41995ad3bfb19b243379d04a6819dca8511ee3663308685ba4a39a07df4b0 + languageName: node + linkType: hard + +"@strapi/cloud-cli@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/cloud-cli@npm:5.5.1" + dependencies: + "@strapi/utils": "npm:5.5.1" + axios: "npm:1.7.4" + boxen: "npm:5.1.2" + chalk: "npm:4.1.2" + cli-progress: "npm:3.12.0" + commander: "npm:8.3.0" + eventsource: "npm:2.0.2" + fast-safe-stringify: "npm:2.1.1" + fs-extra: "npm:11.2.0" + inquirer: "npm:8.2.5" + jsonwebtoken: "npm:9.0.0" + jwks-rsa: "npm:3.1.0" + lodash: "npm:4.17.21" + minimatch: "npm:9.0.3" + open: "npm:8.4.0" + ora: "npm:5.4.1" + pkg-up: "npm:3.1.0" + tar: "npm:6.2.1" + xdg-app-paths: "npm:8.3.0" + yup: "npm:0.32.9" + bin: + cloud-cli: bin/index.js + checksum: 10c0/8a4353ff11386866b1f3c2dd3f9174f888c22d6946958021952f44d4c7d1f3b86e8e4dd0c9c5cc6b1cbbd0fca20949e1d7cfaccdcd95cf5ab0b03d19a2b8adb5 + languageName: node + linkType: hard + +"@strapi/content-manager@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/content-manager@npm:5.5.1" + dependencies: + "@radix-ui/react-toolbar": "npm:1.0.4" + "@reduxjs/toolkit": "npm:1.9.7" + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/types": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + codemirror5: "npm:codemirror@^5.65.11" + date-fns: "npm:2.30.0" + fractional-indexing: "npm:3.2.0" + highlight.js: "npm:^10.4.1" + immer: "npm:9.0.21" + koa: "npm:2.15.2" + lodash: "npm:4.17.21" + markdown-it: "npm:^12.3.2" + markdown-it-abbr: "npm:^1.0.4" + markdown-it-container: "npm:^3.0.0" + markdown-it-deflist: "npm:^2.1.0" + markdown-it-emoji: "npm:^2.0.0" + markdown-it-footnote: "npm:^3.0.3" + markdown-it-ins: "npm:^3.0.1" + markdown-it-mark: "npm:^3.0.1" + markdown-it-sub: "npm:^1.0.0" + markdown-it-sup: "npm:1.0.0" + node-schedule: "npm:2.1.1" + qs: "npm:6.11.1" + react-dnd: "npm:16.0.1" + react-dnd-html5-backend: "npm:16.0.1" + react-helmet: "npm:^6.1.0" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + react-window: "npm:1.8.10" + sanitize-html: "npm:2.13.0" + slate: "npm:0.94.1" + slate-history: "npm:0.93.0" + slate-react: "npm:0.98.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/d935f5e97d3b6979a6c52a2efbd8daa2ab6c1d969014b4a177dcb81a7579a9bc5c2d5a55e6d8cdfb41ca4994464283a879efe49d3ae165eb28fe499f29d47021 + languageName: node + linkType: hard + +"@strapi/content-releases@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/content-releases@npm:5.5.1" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/database": "npm:5.5.1" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/types": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + date-fns: "npm:2.30.0" + date-fns-tz: "npm:2.0.1" + formik: "npm:2.4.5" + lodash: "npm:4.17.21" + node-schedule: "npm:2.1.1" + qs: "npm:6.11.1" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + "@strapi/content-manager": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/78c7a90ecfba9b4c9f95053f7dd18f6a0a354031bb23bf2780d2884947b8148984420265fa2296c3c5c56eae74dc08d0a45b0bb44b967f1a7f2e980b2ea46e13 + languageName: node + linkType: hard + +"@strapi/content-type-builder@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/content-type-builder@npm:5.5.1" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/generators": "npm:5.5.1" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/utils": "npm:5.5.1" + date-fns: "npm:2.30.0" + fs-extra: "npm:11.2.0" + immer: "npm:9.0.21" + lodash: "npm:4.17.21" + pluralize: "npm:8.0.0" + qs: "npm:6.11.1" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/c3494b92ac1535fe00339260ab37a0744e85302205afa7a119bff5d892597d18d712694672b7717fb08ccbd1e59ac031395f734324256a6434df42e42c6cec04 + languageName: node + linkType: hard + +"@strapi/core@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/core@npm:5.5.1" + dependencies: + "@koa/cors": "npm:5.0.0" + "@koa/router": "npm:12.0.2" + "@paralleldrive/cuid2": "npm:2.2.2" + "@strapi/admin": "npm:5.5.1" + "@strapi/database": "npm:5.5.1" + "@strapi/generators": "npm:5.5.1" + "@strapi/logger": "npm:5.5.1" + "@strapi/pack-up": "npm:5.0.2" + "@strapi/permissions": "npm:5.5.1" + "@strapi/types": "npm:5.5.1" + "@strapi/typescript-utils": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + bcryptjs: "npm:2.4.3" + boxen: "npm:5.1.2" + chalk: "npm:4.1.2" + ci-info: "npm:4.0.0" + cli-table3: "npm:0.6.2" + commander: "npm:8.3.0" + configstore: "npm:5.0.1" + copyfiles: "npm:2.4.1" + debug: "npm:4.3.4" + delegates: "npm:1.0.0" + dotenv: "npm:16.4.5" + execa: "npm:5.1.1" + fs-extra: "npm:11.2.0" + glob: "npm:10.3.10" + global-agent: "npm:3.0.0" + http-errors: "npm:2.0.0" + inquirer: "npm:8.2.5" + is-docker: "npm:2.2.1" + koa: "npm:2.15.2" + koa-body: "npm:6.0.1" + koa-compose: "npm:4.1.0" + koa-compress: "npm:5.1.1" + koa-favicon: "npm:2.1.0" + koa-helmet: "npm:7.0.2" + koa-ip: "npm:^2.1.3" + koa-session: "npm:6.4.0" + koa-static: "npm:5.0.0" + lodash: "npm:4.17.21" + mime-types: "npm:2.1.35" + node-schedule: "npm:2.1.1" + open: "npm:8.4.0" + ora: "npm:5.4.1" + package-json: "npm:7.0.0" + pkg-up: "npm:3.1.0" + qs: "npm:6.11.1" + resolve.exports: "npm:2.0.2" + semver: "npm:7.5.4" + statuses: "npm:2.0.1" + typescript: "npm:5.3.2" + undici: "npm:6.19.2" + yup: "npm:0.32.9" + checksum: 10c0/e9badbada2ee359bedeaa23f140d557a5bef0766a6594e46923e89e9e00ca99020c5d4b39aaffd25732ba5a23b8d013a357be187da59d917ab61bbc30f4b78ef + languageName: node + linkType: hard + +"@strapi/data-transfer@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/data-transfer@npm:5.5.1" + dependencies: + "@strapi/logger": "npm:5.5.1" + "@strapi/types": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + chalk: "npm:4.1.2" + cli-table3: "npm:0.6.5" + commander: "npm:8.3.0" + fs-extra: "npm:11.2.0" + inquirer: "npm:8.2.5" + lodash: "npm:4.17.21" + ora: "npm:5.4.1" + resolve-cwd: "npm:3.0.0" + semver: "npm:7.5.4" + stream-chain: "npm:2.2.5" + stream-json: "npm:1.8.0" + tar: "npm:6.2.1" + tar-stream: "npm:2.2.0" + ws: "npm:8.17.1" + checksum: 10c0/15150cf893c641e912ea1662c1803f94e13c00501fa82eb5982e017e391aaa2f9076f39d48081aa3785ba140ab0b5bedca6744f767cec3ce10db3f7c640233dc + languageName: node + linkType: hard + +"@strapi/database@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/database@npm:5.5.1" + dependencies: + "@paralleldrive/cuid2": "npm:2.2.2" + "@strapi/utils": "npm:5.5.1" + ajv: "npm:8.16.0" + date-fns: "npm:2.30.0" + debug: "npm:4.3.4" + fs-extra: "npm:11.2.0" + knex: "npm:3.0.1" + lodash: "npm:4.17.21" + semver: "npm:7.5.4" + umzug: "npm:3.8.1" + checksum: 10c0/5ba0bee11393c829e1ba489b634c8bdf3acc3c42a75cc7a79bfaceacc322b595d3bcb5b62b662a34cf8d35a96f1a6717cdd44e1df177fcd6eaae62755345d712 + languageName: node + linkType: hard + +"@strapi/design-system@npm:2.0.0-rc.14": + version: 2.0.0-rc.14 + resolution: "@strapi/design-system@npm:2.0.0-rc.14" + dependencies: + "@codemirror/lang-json": "npm:6.0.1" + "@floating-ui/react-dom": "npm:2.1.0" + "@internationalized/date": "npm:3.5.4" + "@internationalized/number": "npm:3.5.3" + "@radix-ui/react-accordion": "npm:1.1.2" + "@radix-ui/react-alert-dialog": "npm:1.0.5" + "@radix-ui/react-avatar": "npm:1.0.4" + "@radix-ui/react-checkbox": "npm:1.0.4" + "@radix-ui/react-dialog": "npm:1.0.5" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-dropdown-menu": "npm:2.0.6" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-popover": "npm:1.0.7" + "@radix-ui/react-progress": "npm:1.0.3" + "@radix-ui/react-radio-group": "npm:1.1.3" + "@radix-ui/react-scroll-area": "npm:1.0.5" + "@radix-ui/react-switch": "npm:1.0.3" + "@radix-ui/react-tabs": "npm:1.0.4" + "@radix-ui/react-tooltip": "npm:1.0.7" + "@strapi/ui-primitives": "npm:2.0.0-rc.14" + "@uiw/react-codemirror": "npm:4.22.2" + react-remove-scroll: "npm:2.5.10" + peerDependencies: + "@strapi/icons": ^2.0.0 || ^2.0.0-beta || ^2.0.0-alpha + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + styled-components: ^6.0.0 + checksum: 10c0/db6290c2ee6617f81e4dc2f85e4d44902e79a7ad683c122cfa5f50e96d25b78ecfe5d0f3ad566cb8e54efb6082f3fca41311000cd466eaf8169047b9547e68cb + languageName: node + linkType: hard + +"@strapi/email@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/email@npm:5.5.1" + dependencies: + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/provider-email-sendmail": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + lodash: "npm:4.17.21" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + koa: ^2.15.2 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/c5a802f0b518d303e3359585e3a8705dcb603a6cfe361aaf96cf811979ee6b6889c9e2f95598ec1149fd5cd49dfcab300bc4b77c48d5264e65efe41610f87563 + languageName: node + linkType: hard + +"@strapi/generators@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/generators@npm:5.5.1" + dependencies: + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/typescript-utils": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + chalk: "npm:4.1.2" + copyfiles: "npm:2.4.1" + fs-extra: "npm:11.2.0" + node-plop: "npm:0.26.3" + plop: "npm:4.0.1" + pluralize: "npm:8.0.0" + checksum: 10c0/f7516730512c8a0464f106d772d94de047224c0ce362dae76895900372cf7a03d81954c853505b8dabf2966fddffa0dd15d7bb741484ef90d356ec5fd45fd39d + languageName: node + linkType: hard + +"@strapi/i18n@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/i18n@npm:5.5.1" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/utils": "npm:5.5.1" + lodash: "npm:4.17.21" + qs: "npm:6.11.1" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + "@strapi/content-manager": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/7b7839715fd46ccc83d852f33cc10ac9044f5dad7f7412331ba8d2221169bbd4221364569337b7434fb01e727b4784a4c7ada6c461efee1398c99ac65a31ee2d + languageName: node + linkType: hard + +"@strapi/icons@npm:2.0.0-rc.14": + version: 2.0.0-rc.14 + resolution: "@strapi/icons@npm:2.0.0-rc.14" + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + styled-components: ^6.0.0 + checksum: 10c0/8acf78236bbd75947d5017cea447cc0f5a515add0c8d08d6313a9634ee1e2bd479733f63bcc1e67a23d50e2c87fa05d7c873344842652a5d98bc0b338b145be5 + languageName: node + linkType: hard + +"@strapi/logger@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/logger@npm:5.5.1" + dependencies: + lodash: "npm:4.17.21" + winston: "npm:3.10.0" + checksum: 10c0/f86aeed6988470c01dfa991808e507570e0aaa6000b13a713f48ebcd407737d133a4cec77c0c87196c349fcfd204af785fd4701c3fe767ba6be5c8b026140639 + languageName: node + linkType: hard + +"@strapi/pack-up@npm:5.0.2, @strapi/pack-up@npm:^5.0.1": + version: 5.0.2 + resolution: "@strapi/pack-up@npm:5.0.2" + dependencies: + "@vitejs/plugin-react-swc": "npm:3.7.0" + boxen: "npm:5.1.2" + browserslist-to-esbuild: "npm:1.2.0" + chalk: "npm:4.1.2" + chokidar: "npm:4.0.1" + commander: "npm:8.3.0" + esbuild: "npm:0.20.2" + esbuild-register: "npm:3.5.0" + get-latest-version: "npm:5.1.0" + git-url-parse: "npm:13.1.1" + ini: "npm:4.1.2" + ora: "npm:5.4.1" + outdent: "npm:0.8.0" + pkg-up: "npm:3.1.0" + prettier: "npm:3.3.3" + prettier-plugin-packagejson: "npm:2.5.2" + prompts: "npm:2.4.2" + rxjs: "npm:7.8.1" + typescript: "npm:5.4.4" + vite: "npm:5.4.8" + yup: "npm:0.32.9" + bin: + pack-up: bin/pack-up.js + checksum: 10c0/f1ac9f4d3947bdecc1dd762520b350ac7f9113bede4370d81ff8051085e2ffb16e12d37862727d1dbaab010535347852971eb16206a8655e5779f1dcfdb7feac + languageName: node + linkType: hard + +"@strapi/permissions@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/permissions@npm:5.5.1" + dependencies: + "@casl/ability": "npm:6.5.0" + "@strapi/utils": "npm:5.5.1" + lodash: "npm:4.17.21" + qs: "npm:6.11.1" + sift: "npm:16.0.1" + checksum: 10c0/658d078625050c13276116fd682a37fc226f8280e2303d500e6ae8551c0dacea3edc8695b9c2d92fb2324de1bdced655b158c2041f936c58f76dd2ef643cf63f + languageName: node + linkType: hard + +"@strapi/plugin-graphql@npm:^5.5.1": + version: 5.5.1 + resolution: "@strapi/plugin-graphql@npm:5.5.1" + dependencies: + "@apollo/server": "npm:4.11.0" + "@as-integrations/koa": "npm:1.1.1" + "@graphql-tools/schema": "npm:10.0.3" + "@graphql-tools/utils": "npm:^10.1.3" + "@koa/cors": "npm:5.0.0" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/utils": "npm:5.5.1" + graphql: "npm:^16.8.1" + graphql-depth-limit: "npm:^1.1.0" + graphql-playground-middleware-koa: "npm:^1.6.21" + graphql-scalars: "npm:1.22.2" + koa-bodyparser: "npm:4.4.1" + koa-compose: "npm:^4.1.0" + lodash: "npm:4.17.21" + nexus: "npm:1.3.0" + pluralize: "npm:8.0.0" + peerDependencies: + "@strapi/strapi": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/84a71a7aaece7b737056d2a356deec9a005313bf08a614d6294a71da99de73f83b7399c4899ff34af60540b4bc50bf470824e7f628fba4c61c64ae1d8c434d6d + languageName: node + linkType: hard + +"@strapi/provider-email-sendmail@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/provider-email-sendmail@npm:5.5.1" + dependencies: + "@strapi/utils": "npm:5.5.1" + sendmail: "npm:^1.6.1" + checksum: 10c0/63ad1d7e0dc2ba5ec4a7cb0cd87ac58f20de1c4cd07ae611ca4266b51a6312cc39e325b31ff86d572ec534e9d7b5876e2e7d642348ba2fdd6e3c4ef8b78db7dd + languageName: node + linkType: hard + +"@strapi/provider-upload-local@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/provider-upload-local@npm:5.5.1" + dependencies: + "@strapi/utils": "npm:5.5.1" + fs-extra: "npm:11.2.0" + checksum: 10c0/c6e67edb909e4a615621dc814a11886ae75da2584dca14393eb37a9a409fc4845cfbb826eee346ba6a8dab1d33a336e3d406834b5ef4e9830753b9f66a3c6efd + languageName: node + linkType: hard + +"@strapi/review-workflows@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/review-workflows@npm:5.5.1" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/utils": "npm:5.5.1" + fractional-indexing: "npm:3.2.0" + react-dnd: "npm:16.0.1" + react-dnd-html5-backend: "npm:16.0.1" + react-helmet: "npm:^6.1.0" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + "@strapi/content-manager": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/72b4bf514c24db0c42d0aca9ab5270d84051f7b2883265aa2383cf06cd1ce204788a79a27dc5b8daceb66e5beda75c6c15622956a90cff0c64cdce982aa632ec + languageName: node + linkType: hard + +"@strapi/sdk-plugin@npm:^5.2.8": + version: 5.2.8 + resolution: "@strapi/sdk-plugin@npm:5.2.8" + dependencies: + "@strapi/pack-up": "npm:^5.0.1" + "@types/prompts": "npm:2.4.9" + boxen: "npm:5.1.2" + chalk: "npm:4.1.2" + commander: "npm:12.1.0" + concurrently: "npm:^8.2.2" + execa: "npm:^9.3.1" + get-latest-version: "npm:5.1.0" + git-url-parse: "npm:13.1.1" + nodemon: "npm:^3.1.0" + ora: "npm:5.4.1" + outdent: "npm:0.8.0" + pkg-up: "npm:3.1.0" + prettier: "npm:2.8.8" + typescript: "npm:5.4.4" + yup: "npm:0.32.9" + bin: + strapi-plugin: bin/strapi-plugin.js + checksum: 10c0/d32a68c020e83e816d1336d6c3e00ee3346df1696d498b24b571382bfcba5c88be34b84489002fb35b0635ea678ff11bfc0119f3cd467a9b20b608f7cf3aa003 + languageName: node + linkType: hard + +"@strapi/strapi@npm:^5.5.1": + version: 5.5.1 + resolution: "@strapi/strapi@npm:5.5.1" + dependencies: + "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.15" + "@strapi/admin": "npm:5.5.1" + "@strapi/cloud-cli": "npm:5.5.1" + "@strapi/content-manager": "npm:5.5.1" + "@strapi/content-releases": "npm:5.5.1" + "@strapi/content-type-builder": "npm:5.5.1" + "@strapi/core": "npm:5.5.1" + "@strapi/data-transfer": "npm:5.5.1" + "@strapi/database": "npm:5.5.1" + "@strapi/email": "npm:5.5.1" + "@strapi/generators": "npm:5.5.1" + "@strapi/i18n": "npm:5.5.1" + "@strapi/logger": "npm:5.5.1" + "@strapi/pack-up": "npm:5.0.2" + "@strapi/permissions": "npm:5.5.1" + "@strapi/review-workflows": "npm:5.5.1" + "@strapi/types": "npm:5.5.1" + "@strapi/typescript-utils": "npm:5.5.1" + "@strapi/upload": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + "@types/nodemon": "npm:1.19.6" + "@vitejs/plugin-react-swc": "npm:3.6.0" + boxen: "npm:5.1.2" + browserslist: "npm:^4.23.0" + browserslist-to-esbuild: "npm:1.2.0" + chalk: "npm:4.1.2" + chokidar: "npm:3.6.0" + ci-info: "npm:3.8.0" + cli-progress: "npm:3.12.0" + cli-table3: "npm:0.6.5" + commander: "npm:8.3.0" + concurrently: "npm:8.2.2" + copyfiles: "npm:2.4.1" + css-loader: "npm:^6.10.0" + dotenv: "npm:16.4.5" + esbuild: "npm:0.21.3" + esbuild-loader: "npm:^2.21.0" + esbuild-register: "npm:3.5.0" + execa: "npm:5.1.1" + fork-ts-checker-webpack-plugin: "npm:8.0.0" + fs-extra: "npm:11.2.0" + get-latest-version: "npm:5.1.0" + git-url-parse: "npm:14.0.0" + html-webpack-plugin: "npm:5.6.0" + inquirer: "npm:8.2.5" + lodash: "npm:4.17.21" + mini-css-extract-plugin: "npm:2.7.7" + nodemon: "npm:3.0.2" + ora: "npm:5.4.1" + outdent: "npm:0.8.0" + pkg-up: "npm:3.1.0" + prettier: "npm:3.3.3" + react-refresh: "npm:0.14.0" + read-pkg-up: "npm:7.0.1" + resolve-from: "npm:5.0.0" + semver: "npm:7.5.4" + style-loader: "npm:3.3.4" + typescript: "npm:5.3.2" + vite: "npm:5.2.14" + webpack: "npm:^5.90.3" + webpack-bundle-analyzer: "npm:^4.10.1" + webpack-dev-middleware: "npm:6.1.2" + webpack-hot-middleware: "npm:2.26.1" + yalc: "npm:1.0.0-pre.53" + yup: "npm:0.32.9" + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + bin: + strapi: bin/strapi.js + checksum: 10c0/f13a05c5f066150c8356ff9e164147d28e662a4cf62b79fa0e74654e04e9f096417ed16d3d22c7b27a7b8528ff00f8a3faa58650ad4a89085a7a4c494689f048 + languageName: node + linkType: hard + +"@strapi/types@npm:5.5.1, @strapi/types@npm:^5.5.1": + version: 5.5.1 + resolution: "@strapi/types@npm:5.5.1" + dependencies: + "@casl/ability": "npm:6.5.0" + "@koa/cors": "npm:5.0.0" + "@koa/router": "npm:12.0.2" + "@strapi/database": "npm:5.5.1" + "@strapi/logger": "npm:5.5.1" + "@strapi/permissions": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + commander: "npm:8.3.0" + koa: "npm:2.15.2" + koa-body: "npm:6.0.1" + node-schedule: "npm:2.1.1" + typedoc: "npm:0.25.10" + typedoc-github-wiki-theme: "npm:1.1.0" + typedoc-plugin-markdown: "npm:3.17.1" + checksum: 10c0/855ad4e742b6e498d798206fce327c8c982e8692f0ceac67c6889a4118cc7f453996b2d4ddf474769eb9f76cee717de53a877a94b303657ad3829802b4b33d60 + languageName: node + linkType: hard + +"@strapi/typescript-utils@npm:5.5.1, @strapi/typescript-utils@npm:^5.5.1": + version: 5.5.1 + resolution: "@strapi/typescript-utils@npm:5.5.1" + dependencies: + chalk: "npm:4.1.2" + cli-table3: "npm:0.6.5" + fs-extra: "npm:11.2.0" + lodash: "npm:4.17.21" + prettier: "npm:3.3.3" + typescript: "npm:5.3.2" + checksum: 10c0/e6668cbc3916290097cf39b656cffc80b1b1966e285476075996847f9df3d1fec4dcff19e5233dcf2fc53deb73d323e77fea55514c19844c48041cbd658d2ca7 + languageName: node + linkType: hard + +"@strapi/ui-primitives@npm:2.0.0-rc.14": + version: 2.0.0-rc.14 + resolution: "@strapi/ui-primitives@npm:2.0.0-rc.14" + dependencies: + "@radix-ui/number": "npm:1.0.1" + "@radix-ui/primitive": "npm:1.0.1" + "@radix-ui/react-collection": "npm:1.0.3" + "@radix-ui/react-compose-refs": "npm:1.0.1" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-direction": "npm:1.0.1" + "@radix-ui/react-dismissable-layer": "npm:1.0.5" + "@radix-ui/react-focus-guards": "npm:1.0.1" + "@radix-ui/react-focus-scope": "npm:1.0.4" + "@radix-ui/react-id": "npm:1.0.1" + "@radix-ui/react-popper": "npm:1.1.3" + "@radix-ui/react-portal": "npm:1.0.4" + "@radix-ui/react-primitive": "npm:1.0.3" + "@radix-ui/react-slot": "npm:1.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.0.1" + "@radix-ui/react-use-controllable-state": "npm:1.0.1" + "@radix-ui/react-use-layout-effect": "npm:1.0.1" + "@radix-ui/react-use-previous": "npm:1.0.1" + "@radix-ui/react-visually-hidden": "npm:1.0.3" + aria-hidden: "npm:1.2.4" + react-remove-scroll: "npm:2.5.10" + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + checksum: 10c0/9062bc6e13fb05e90dd42d7eeea88ebfe38e73affc077c3e08b9c68cd6c0a7d741da071020bc32a7c9e47d607476078647dba3b396990232823d33b0326feb39 + languageName: node + linkType: hard + +"@strapi/upload@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/upload@npm:5.5.1" + dependencies: + "@mux/mux-player-react": "npm:3.1.0" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/provider-upload-local": "npm:5.5.1" + "@strapi/utils": "npm:5.5.1" + byte-size: "npm:8.1.1" + cropperjs: "npm:1.6.1" + date-fns: "npm:2.30.0" + formik: "npm:2.4.5" + fs-extra: "npm:11.2.0" + immer: "npm:9.0.21" + koa-range: "npm:0.3.0" + koa-static: "npm:5.0.0" + lodash: "npm:4.17.21" + mime-types: "npm:2.1.35" + prop-types: "npm:^15.8.1" + qs: "npm:6.11.1" + react-dnd: "npm:16.0.1" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + react-select: "npm:5.8.0" + sharp: "npm:0.32.6" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 10c0/e972eebc0b9e86632ce92b13b0359c3ae6db7bf411de532408461958ca2a95701975c7b411be3e5c27b615601d14955323c39b3b64709a66915ccad566ec465d + languageName: node + linkType: hard + +"@strapi/utils@npm:5.5.1": + version: 5.5.1 + resolution: "@strapi/utils@npm:5.5.1" + dependencies: + "@sindresorhus/slugify": "npm:1.1.0" + date-fns: "npm:2.30.0" + execa: "npm:5.1.1" + http-errors: "npm:2.0.0" + lodash: "npm:4.17.21" + node-machine-id: "npm:1.1.12" + p-map: "npm:4.0.0" + preferred-pm: "npm:3.1.2" + yup: "npm:0.32.9" + zod: "npm:^3.22.4" + checksum: 10c0/40d03ca8ae8509233deffb63bd54b26400570ef19540df8faa11312d70e4ea79133dc748dbc502905af335f7c8931cb861e188a13d45d5ba3257b94df4afa078 + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-darwin-arm64@npm:1.10.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-darwin-x64@npm:1.10.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-linux-x64-musl@npm:1.10.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.10.1": + version: 1.10.1 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:^1.3.107, @swc/core@npm:^1.5.7": + version: 1.10.1 + resolution: "@swc/core@npm:1.10.1" + dependencies: + "@swc/core-darwin-arm64": "npm:1.10.1" + "@swc/core-darwin-x64": "npm:1.10.1" + "@swc/core-linux-arm-gnueabihf": "npm:1.10.1" + "@swc/core-linux-arm64-gnu": "npm:1.10.1" + "@swc/core-linux-arm64-musl": "npm:1.10.1" + "@swc/core-linux-x64-gnu": "npm:1.10.1" + "@swc/core-linux-x64-musl": "npm:1.10.1" + "@swc/core-win32-arm64-msvc": "npm:1.10.1" + "@swc/core-win32-ia32-msvc": "npm:1.10.1" + "@swc/core-win32-x64-msvc": "npm:1.10.1" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.17" + peerDependencies: + "@swc/helpers": "*" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10c0/a3d3b17c1abc8f32a7cc5dfaa006fc314e71cc0beb43e71b8b1c6c3d3841412a7e55d9e72009debd48159881e8a045ecd0ea56036e022f1bc87213fe29cd9015 + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 + languageName: node + linkType: hard + +"@swc/helpers@npm:^0.5.0": + version: 0.5.15 + resolution: "@swc/helpers@npm:0.5.15" + dependencies: + tslib: "npm:^2.8.0" + checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4 + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.17": + version: 0.1.17 + resolution: "@swc/types@npm:0.1.17" + dependencies: + "@swc/counter": "npm:^0.1.3" + checksum: 10c0/29f5c8933a16042956f1adb7383e836ed7646cbf679826e78b53fdd0c08e8572cb42152e527b6b530a9bd1052d33d0972f90f589761ccd252c12652c9b7a72fc + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + +"@tanstack/query-core@npm:5.62.7": + version: 5.62.7 + resolution: "@tanstack/query-core@npm:5.62.7" + checksum: 10c0/d7aa83571b56e7bf1b608b8f56c90a9e9e759ba5a8899686182e8961c94432d1b6437b066a228765250498a3009623a30c5ca17b2714ddb30e2d727adea9aa0c + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.40.0": + version: 5.62.7 + resolution: "@tanstack/react-query@npm:5.62.7" + dependencies: + "@tanstack/query-core": "npm:5.62.7" + peerDependencies: + react: ^18 || ^19 + checksum: 10c0/4a99bf3f3cdce6a24b6356377697e4b8cc31b0b160942a32d0619b928aec44c42dad61070d9d127512e6139bc4e62e7fe0722054f8152e21a1b8743a1dbd39e0 + languageName: node + linkType: hard + +"@testing-library/dom@npm:10.1.0": + version: 10.1.0 + resolution: "@testing-library/dom@npm:10.1.0" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10c0/81f0e0a510d24e458c3af17777960ed678fb4fe464903ef8ec9ed816c9794fc69a673ea94f87b9e054b181383c51814605451dbf4fd9df93d0d8f24b4859990d + languageName: node + linkType: hard + +"@testing-library/dom@npm:^10.0.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f + languageName: node + linkType: hard + +"@testing-library/react@npm:15.0.7": + version: 15.0.7 + resolution: "@testing-library/react@npm:15.0.7" + dependencies: + "@babel/runtime": "npm:^7.12.5" + "@testing-library/dom": "npm:^10.0.0" + "@types/react-dom": "npm:^18.0.0" + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/ac8ee8968e81949ecb35f7ee34741c2c043f73dd7fee2247d56f6de6a30de4742af94f25264356863974e54387485b46c9448ecf3f6ca41cf4339011c369f2d4 + languageName: node + linkType: hard + +"@testing-library/user-event@npm:14.5.2": + version: 14.5.2 + resolution: "@testing-library/user-event@npm:14.5.2" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10c0/68a0c2aa28a3c8e6eb05cafee29705438d7d8a9427423ce5064d44f19c29e89b5636de46dd2f28620fb10abba75c67130185bbc3aa23ac1163a227a5f36641e1 + languageName: node + linkType: hard + +"@tootallnate/once@npm:1": + version: 1.1.2 + resolution: "@tootallnate/once@npm:1.1.2" + checksum: 10c0/8fe4d006e90422883a4fa9339dd05a83ff626806262e1710cee5758d493e8cbddf2db81c0e4690636dc840b02c9fda62877866ea774ebd07c1777ed5fafbdec6 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + +"@types/accepts@npm:*": + version: 1.3.7 + resolution: "@types/accepts@npm:1.3.7" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/7b21efc78b98ed57063ac31588f871f11501c080cd1201ca3743cf02ee0aee74bdb5a634183bc0987dc8dc582b26316789fd203650319ccc89a66cf88311d64f + languageName: node + linkType: hard + +"@types/argparse@npm:1.0.38": + version: 1.0.38 + resolution: "@types/argparse@npm:1.0.38" + checksum: 10c0/4fc892da5df16923f48180da2d1f4562fa8b0507cf636b24780444fa0a1d7321d4dc0c0ecbee6152968823f5a2ae0d321b4f8c705a489bf1ae1245bdeb0868fd + languageName: node + linkType: hard + +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: 10c0/dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 + languageName: node + linkType: hard + +"@types/body-parser@npm:*": + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df + languageName: node + linkType: hard + +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + +"@types/co-body@npm:^6.1.0": + version: 6.1.3 + resolution: "@types/co-body@npm:6.1.3" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + checksum: 10c0/3a716829b7c8fa5b3d18bc47b98756d60b2ebc302ec90601e1ac1aed34bcc1f7ee88f379b2531837a42902d14362bfa29c9ddc2a39bbc8030afc26d66e671b0d + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + languageName: node + linkType: hard + +"@types/content-disposition@npm:*": + version: 0.5.8 + resolution: "@types/content-disposition@npm:0.5.8" + checksum: 10c0/f10baeab2ec44579012c1170763851687e740ea30531a80cd7a403475730ce7d7ead4f88927cea6970cc2d5e74fa7af38cdf4f039c5f115fba1bb98ec0014977 + languageName: node + linkType: hard + +"@types/cookies@npm:*": + version: 0.9.0 + resolution: "@types/cookies@npm:0.9.0" + dependencies: + "@types/connect": "npm:*" + "@types/express": "npm:*" + "@types/keygrip": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/ce95c1968532af674185efd4092cbdec8d5d3bda72f729e512bf37fa77877f466ad4bd5f00fca299f94c6e3d2a3875744ae5a705ffc5113183f5e46b76d8846a + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^4.17.30, @types/express-serve-static-core@npm:^4.17.33": + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983 + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^5.0.0": + version: 5.0.2 + resolution: "@types/express-serve-static-core@npm:5.0.2" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/9f6ee50bd81f0aa6cc9df6ad2c2d221a3a63249da944db58ec8bb8681e77a5b3b3fdb1931bda73beb13cfaf9125731f835fe5256afb6a6da35b0eb08ccbdbfdf + languageName: node + linkType: hard + +"@types/express@npm:*": + version: 5.0.0 + resolution: "@types/express@npm:5.0.0" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/0d74b53aefa69c3b3817ee9b5145fd50d7dbac52a8986afc2d7500085c446656d0b6dc13158c04e2d9f18f4324d4d93b0452337c5ff73dd086dca3e4ff11f47b + languageName: node + linkType: hard + +"@types/express@npm:^4.17.13, @types/express@npm:^4.17.17": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf + languageName: node + linkType: hard + +"@types/fined@npm:*": + version: 1.1.5 + resolution: "@types/fined@npm:1.1.5" + checksum: 10c0/dfd510331a50c75c0955578d68d81855022708a9c0d06cda6ae978130eb53993fa88821a81defe80ce9b153c883bf1c63b06ccd0c12f698b94e45b30d480945d + languageName: node + linkType: hard + +"@types/follow-redirects@npm:^1.14.4": + version: 1.14.4 + resolution: "@types/follow-redirects@npm:1.14.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/5e0d09e6c9a8bee09b1af9e1fce80fcc2e22f082d786b2f25aa5ccb3be996cf8b9ba866024e17817e01e961586aa2aad13c38c6c3a0dabbe8654d4b47d07977c + languageName: node + linkType: hard + +"@types/formidable@npm:^2.0.5": + version: 2.0.6 + resolution: "@types/formidable@npm:2.0.6" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2816718c407e9adf2337ca69241e29097f5e0b22f3d0a3dde1ea23a2eef2ad41ad19612a6eac895492bd746593d87278f9732b4cb354dd72df3c03e8c1ad72c3 + languageName: node + linkType: hard + +"@types/glob@npm:^7.1.1": + version: 7.2.0 + resolution: "@types/glob@npm:7.2.0" + dependencies: + "@types/minimatch": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/a8eb5d5cb5c48fc58c7ca3ff1e1ddf771ee07ca5043da6e4871e6757b4472e2e73b4cfef2644c38983174a4bc728c73f8da02845c28a1212f98cabd293ecae98 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b + languageName: node + linkType: hard + +"@types/history@npm:^4.7.11": + version: 4.7.11 + resolution: "@types/history@npm:4.7.11" + checksum: 10c0/3facf37c2493d1f92b2e93a22cac7ea70b06351c2ab9aaceaa3c56aa6099fb63516f6c4ec1616deb5c56b4093c026a043ea2d3373e6c0644d55710364d02c934 + languageName: node + linkType: hard + +"@types/hoist-non-react-statics@npm:*, @types/hoist-non-react-statics@npm:3, @types/hoist-non-react-statics@npm:^3.3.1": + version: 3.3.6 + resolution: "@types/hoist-non-react-statics@npm:3.3.6" + dependencies: + "@types/react": "npm:*" + hoist-non-react-statics: "npm:^3.3.0" + checksum: 10c0/149a4c217d81f21f8a1e152160a59d5b99b6a9aa6d354385d5f5bc02760cbf1e170a8442ba92eb653befff44b0c5bc2234bb77ce33e0d11a65f779e8bab5c321 + languageName: node + linkType: hard + +"@types/html-minifier-terser@npm:^6.0.0": + version: 6.1.0 + resolution: "@types/html-minifier-terser@npm:6.1.0" + checksum: 10c0/a62fb8588e2f3818d82a2d7b953ad60a4a52fd767ae04671de1c16f5788bd72f1ed3a6109ed63fd190c06a37d919e3c39d8adbc1793a005def76c15a3f5f5dab + languageName: node + linkType: hard + +"@types/http-assert@npm:*": + version: 1.5.6 + resolution: "@types/http-assert@npm:1.5.6" + checksum: 10c0/62d536440a5e09f4b7968112f4b235212407937033de800993f95b6f140181b4b2ad6075b73094e7ca0ccf7d9c80d68b93ca53fb1af196cc6d0257f3a4c3d5ba + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 + languageName: node + linkType: hard + +"@types/inquirer@npm:^6.5.0": + version: 6.5.0 + resolution: "@types/inquirer@npm:6.5.0" + dependencies: + "@types/through": "npm:*" + rxjs: "npm:^6.4.0" + checksum: 10c0/95467c07ae338b5cbf687936f7f9cb8d4b70581cd6e2c7c3e0d047245a11a179333b9ec1a2c4a713e5bc41a9ca2033425a5ec7594e6e8aa2c54534b6d8b91dc0 + languageName: node + linkType: hard + +"@types/inquirer@npm:^9.0.3": + version: 9.0.7 + resolution: "@types/inquirer@npm:9.0.7" + dependencies: + "@types/through": "npm:*" + rxjs: "npm:^7.2.0" + checksum: 10c0/b7138af41226c0457b99ff9b179da4a82078bc1674762e812d3cc3e3276936d7326b9fa6b98212b8eb055b2b6aaebe3c20359eebe176a6ca71061f4e08ce3a0f + languageName: node + linkType: hard + +"@types/is-hotkey@npm:^0.1.1": + version: 0.1.10 + resolution: "@types/is-hotkey@npm:0.1.10" + checksum: 10c0/8ce7cc70a42e4191ba9871905a68fa6586a9da0bfa9940e20fe67e573b34bc79bfc23158e842c7bd3288ebf9c82ee5cce0c7fa1fe8245f6845c2f9b9f3afc536 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + +"@types/jest@npm:^29.5.12": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10c0/18e0712d818890db8a8dab3d91e9ea9f7f19e3f83c2e50b312f557017dc81466207a71f3ed79cf4428e813ba939954fa26ffa0a9a7f153181ba174581b1c2aed + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/jsonwebtoken@npm:^9.0.2": + version: 9.0.7 + resolution: "@types/jsonwebtoken@npm:9.0.7" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/e1cd0e48fcae21b1d4378887a23453bd7212b480a131b11bcda2cdeb0687d03c9646ee5ba592e04cfaf76f7cc80f179950e627cdb3ebc90a5923bce49a35631a + languageName: node + linkType: hard + +"@types/keygrip@npm:*": + version: 1.0.6 + resolution: "@types/keygrip@npm:1.0.6" + checksum: 10c0/1045a79913259f539ac1d04384ea8f61cf29f1d299040eb4b67d92304ec3bcea59b7e4b83cf95a73aa251ff62e55924e380d0c563a21fe8f6e91de20cc610386 + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + +"@types/koa-bodyparser@npm:^4.3.12": + version: 4.3.12 + resolution: "@types/koa-bodyparser@npm:4.3.12" + dependencies: + "@types/koa": "npm:*" + checksum: 10c0/1484ad4a24feff23e08d39d243ad80321ab0a42aef355ca8bbedecda85f9778b446d75d8e2ff511d8ad08afa3b473f513debc627b4e0053e9abe950c9e42d1e4 + languageName: node + linkType: hard + +"@types/koa-compose@npm:*": + version: 3.2.8 + resolution: "@types/koa-compose@npm:3.2.8" + dependencies: + "@types/koa": "npm:*" + checksum: 10c0/f2bfb7376c1e9075e8df7a46a5fce073159b01b94ec7dcca6e9f68627d48ea86a726bcfbd06491e1c99f68c0f27b8174b498081f9a3e4f976694452b5d0b5f01 + languageName: node + linkType: hard + +"@types/koa@npm:*, @types/koa@npm:^2.13.5, @types/koa@npm:^2.15.0": + version: 2.15.0 + resolution: "@types/koa@npm:2.15.0" + dependencies: + "@types/accepts": "npm:*" + "@types/content-disposition": "npm:*" + "@types/cookies": "npm:*" + "@types/http-assert": "npm:*" + "@types/http-errors": "npm:*" + "@types/keygrip": "npm:*" + "@types/koa-compose": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/3fd591e25ecffc32ffa7cb152d2c5caeccefe5a72cb09d187102d8f41101bdaeeb802a07a6672eac58f805fa59892e79c1cc203ca7b27b0de75d7eac508c2b47 + languageName: node + linkType: hard + +"@types/koa__router@npm:^12.0.4": + version: 12.0.4 + resolution: "@types/koa__router@npm:12.0.4" + dependencies: + "@types/koa": "npm:*" + checksum: 10c0/bc783b47d3c2a6bb8171ba3ddffa5781c5ed11e6b716e74281dfb71229ceb3189ddf5ac178e6f9552ca9d43e8370e0bd558054d66439b43a9e500d046a15ffa8 + languageName: node + linkType: hard + +"@types/liftoff@npm:^4.0.3": + version: 4.0.3 + resolution: "@types/liftoff@npm:4.0.3" + dependencies: + "@types/fined": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/21640018cac5a52ff552c1fea275965b59fe033f31d7fb6db47238d95ba0877c27fddd6d1984cd2fa0293097c941c85a7f7f5f3b9b689b90a12739f439fa1ba6 + languageName: node + linkType: hard + +"@types/lodash@npm:^4.14.149, @types/lodash@npm:^4.14.165, @types/lodash@npm:^4.17.4": + version: 4.17.13 + resolution: "@types/lodash@npm:4.17.13" + checksum: 10c0/c3d0b7efe7933ac0369b99f2f7bff9240d960680fdb74b41ed4bd1b3ca60cca1e31fe4046d9abbde778f941a41bc2a75eb629abf8659fa6c27b66efbbb0802a9 + languageName: node + linkType: hard + +"@types/long@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/long@npm:4.0.2" + checksum: 10c0/42ec66ade1f72ff9d143c5a519a65efc7c1c77be7b1ac5455c530ae9acd87baba065542f8847522af2e3ace2cc999f3ad464ef86e6b7352eece34daf88f8c924 + languageName: node + linkType: hard + +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc + languageName: node + linkType: hard + +"@types/minimatch@npm:*": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 10c0/83cf1c11748891b714e129de0585af4c55dd4c2cafb1f1d5233d79246e5e1e19d1b5ad9e8db449667b3ffa2b6c80125c429dbee1054e9efb45758dbc4e118562 + languageName: node + linkType: hard + +"@types/node-fetch@npm:^2.6.1": + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" + dependencies: + "@types/node": "npm:*" + form-data: "npm:^4.0.0" + checksum: 10c0/7693acad5499b7df2d1727d46cff092a63896dc04645f36b973dd6dd754a59a7faba76fcb777bdaa35d80625c6a9dd7257cca9c401a4bab03b04480cda7fd1af + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 22.10.2 + resolution: "@types/node@npm:22.10.2" + dependencies: + undici-types: "npm:~6.20.0" + checksum: 10c0/2c7b71a040f1ef5320938eca8ebc946e6905caa9bbf3d5665d9b3774a8d15ea9fab1582b849a6d28c7fc80756a62c5666bc66b69f42f4d5dafd1ccb193cdb4ac + languageName: node + linkType: hard + +"@types/node@npm:^20.12.0": + version: 20.17.10 + resolution: "@types/node@npm:20.17.10" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10c0/458ec725319e57d4692cbb56d81f1a90f9074cef9ec185c59e6f6c557a3d2ded57c5e443b1e82eba923d53dda4db18797fb131ee6e46fdb3d7d2f54d54aaebe3 + languageName: node + linkType: hard + +"@types/nodemon@npm:1.19.6": + version: 1.19.6 + resolution: "@types/nodemon@npm:1.19.6" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/34a6bcb1dd17e9f6756d43e777c0301e3c04640d4bd83df109cae22a944eb9368494cf8d629bcc714cb9ac3eb3c4be9ea582a0f98f1433650dcea70062434de9 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 + languageName: node + linkType: hard + +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 + languageName: node + linkType: hard + +"@types/pluralize@npm:0.0.33": + version: 0.0.33 + resolution: "@types/pluralize@npm:0.0.33" + checksum: 10c0/24899caf85b79dd291a6b6e9b9f3b67b452b18d578d0ac0d531a705bf5ee0361d9386ea1f8532c64de9e22c6e9606c5497787bb5e31bd299c487980436c59785 + languageName: node + linkType: hard + +"@types/progress-stream@npm:^2.0.5": + version: 2.0.5 + resolution: "@types/progress-stream@npm:2.0.5" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/8d4e80b660621958e5045cc212f47d99a00759680a71bf3ff8aa700407965da2653dbeb636e1f0cda87ee6e487ad26b58666386960fd713dbdcc6e1eb5a9ccd7 + languageName: node + linkType: hard + +"@types/prompts@npm:2.4.9": + version: 2.4.9 + resolution: "@types/prompts@npm:2.4.9" + dependencies: + "@types/node": "npm:*" + kleur: "npm:^3.0.3" + checksum: 10c0/22fe0da6807681c85e88ba283184f4be4c8a95c744ea12a638865c98c4e0c22e7f733542f6b0f1fbca02245cdc3fe84feacf9c9adf4ddd8bc98a337fd679d8d2 + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.14 + resolution: "@types/prop-types@npm:15.7.14" + checksum: 10c0/1ec775160bfab90b67a782d735952158c7e702ca4502968aa82565bd8e452c2de8601c8dfe349733073c31179116cf7340710160d3836aa8a1ef76d1532893b1 + languageName: node + linkType: hard + +"@types/qs@npm:*": + version: 6.9.17 + resolution: "@types/qs@npm:6.9.17" + checksum: 10c0/a183fa0b3464267f8f421e2d66d960815080e8aab12b9aadab60479ba84183b1cdba8f4eff3c06f76675a8e42fe6a3b1313ea76c74f2885c3e25d32499c17d1b + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c + languageName: node + linkType: hard + +"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.3.0": + version: 18.3.5 + resolution: "@types/react-dom@npm:18.3.5" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/b163d35a6b32a79f5782574a7aeb12a31a647e248792bf437e6d596e2676961c394c5e3c6e91d1ce44ae90441dbaf93158efb4f051c0d61e2612f1cb04ce4faa + languageName: node + linkType: hard + +"@types/react-router-dom@npm:5.3.3": + version: 5.3.3 + resolution: "@types/react-router-dom@npm:5.3.3" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + "@types/react-router": "npm:*" + checksum: 10c0/a9231a16afb9ed5142678147eafec9d48582809295754fb60946e29fcd3757a4c7a3180fa94b45763e4c7f6e3f02379e2fcb8dd986db479dcab40eff5fc62a91 + languageName: node + linkType: hard + +"@types/react-router@npm:*": + version: 5.1.20 + resolution: "@types/react-router@npm:5.1.20" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + checksum: 10c0/1f7eee61981d2f807fa01a34a0ef98ebc0774023832b6611a69c7f28fdff01de5a38cabf399f32e376bf8099dcb7afaf724775bea9d38870224492bea4cb5737 + languageName: node + linkType: hard + +"@types/react-transition-group@npm:^4.4.0": + version: 4.4.12 + resolution: "@types/react-transition-group@npm:4.4.12" + peerDependencies: + "@types/react": "*" + checksum: 10c0/0441b8b47c69312c89ec0760ba477ba1a0808a10ceef8dc1c64b1013ed78517332c30f18681b0ec0b53542731f1ed015169fed1d127cc91222638ed955478ec7 + languageName: node + linkType: hard + +"@types/react@npm:*": + version: 19.0.1 + resolution: "@types/react@npm:19.0.1" + dependencies: + csstype: "npm:^3.0.2" + checksum: 10c0/25eb69114abb9a6d5fc4414ee584388275bbc9ac32976449cf58b95fe9880efe6b3f936c3842be9bed8c571546a9752e8d3e2095288381e9c809269f5f574f2e + languageName: node + linkType: hard + +"@types/react@npm:16 || 17 || 18, @types/react@npm:^18.3.8": + version: 18.3.16 + resolution: "@types/react@npm:18.3.16" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/9113d3003865eda07be0fb596f5bd8d7784b8900675090c56e75bdee45499f0b0de2481cbbeb5980c3b4ad18f234a49f39c9e62fd7b89a4e8530c74789f739bd + languageName: node + linkType: hard + +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c + languageName: node + linkType: hard + +"@types/serve-static@npm:*": + version: 1.15.7 + resolution: "@types/serve-static@npm:1.15.7" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c + languageName: node + linkType: hard + +"@types/styled-components@npm:5.1.34": + version: 5.1.34 + resolution: "@types/styled-components@npm:5.1.34" + dependencies: + "@types/hoist-non-react-statics": "npm:*" + "@types/react": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/5bce93ea2c6161fc45daaf863eefdc20672e839ae486597c40b95e7978e249c160c1bc9706f56cb5152a7ef63cf485d15a9502889169ef945281f511e4b2d5a0 + languageName: node + linkType: hard + +"@types/stylis@npm:4.2.5": + version: 4.2.5 + resolution: "@types/stylis@npm:4.2.5" + checksum: 10c0/23f5b35a3a04f6bb31a29d404fa1bc8e0035fcaff2356b4047743a057e0c37b2eba7efe14d57dd2b95b398cea3bac294d9c6cd93ed307d8c0b7f5d282224b469 + languageName: node + linkType: hard + +"@types/through@npm:*": + version: 0.0.33 + resolution: "@types/through@npm:0.0.33" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/6a8edd7f40cd7e197318e86310a40e568cddd380609dde59b30d5cc6c5f8276ddc698905eac4b3b429eb39f2e8ee326bc20dc6e95a2cdc41c4d3fc9a1ebd4929 + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a + languageName: node + linkType: hard + +"@types/use-sync-external-store@npm:^0.0.3": + version: 0.0.3 + resolution: "@types/use-sync-external-store@npm:0.0.3" + checksum: 10c0/82824c1051ba40a00e3d47964cdf4546a224e95f172e15a9c62aa3f118acee1c7518b627a34f3aa87298a2039f982e8509f92bfcc18bea7c255c189c293ba547 + languageName: node + linkType: hard + +"@types/uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "@types/uuid@npm:10.0.0" + checksum: 10c0/9a1404bf287164481cb9b97f6bb638f78f955be57c40c6513b7655160beb29df6f84c915aaf4089a1559c216557dc4d2f79b48d978742d3ae10b937420ddac60 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b + languageName: node + linkType: hard + +"@ucast/core@npm:^1.0.0, @ucast/core@npm:^1.4.1, @ucast/core@npm:^1.6.1": + version: 1.10.2 + resolution: "@ucast/core@npm:1.10.2" + checksum: 10c0/bc24a2b02d796b5c14353aaf1c8faf8103157695522e82e9d6d7813a300e631a406d4809030c582bda99a72232a8eb19f25b4d78857f1c9fab2e8fb2028706e8 + languageName: node + linkType: hard + +"@ucast/js@npm:^3.0.0": + version: 3.0.4 + resolution: "@ucast/js@npm:3.0.4" + dependencies: + "@ucast/core": "npm:^1.0.0" + checksum: 10c0/c1243a22a82afa6a553317ed8201dbc496b86d3a33220778033773789bd7f38efe8ddb65d6dd9dd7b8035239f87a467b17c560afd206c0ece8b71780333d4f17 + languageName: node + linkType: hard + +"@ucast/mongo2js@npm:^1.3.0": + version: 1.3.4 + resolution: "@ucast/mongo2js@npm:1.3.4" + dependencies: + "@ucast/core": "npm:^1.6.1" + "@ucast/js": "npm:^3.0.0" + "@ucast/mongo": "npm:^2.4.0" + checksum: 10c0/40f3d862f196b052e1beb1fff08ff7e4393e9bc9f2a037cc1dbe3f4235d0851fc3f561bed1d12d3c4a29d785b9880ab4c1aaffb66b67ecd8f68972245c514570 + languageName: node + linkType: hard + +"@ucast/mongo@npm:^2.4.0": + version: 2.4.3 + resolution: "@ucast/mongo@npm:2.4.3" + dependencies: + "@ucast/core": "npm:^1.4.1" + checksum: 10c0/3b806014f5754594faae5045f778e330c03216904895116ad524bd5e57e24875d7994add478e873628b5b2406d8c4cbce6e3eba5a7c6591924e4226e956d78b6 + languageName: node + linkType: hard + +"@uiw/codemirror-extensions-basic-setup@npm:4.22.2": + version: 4.22.2 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.22.2" + dependencies: + "@codemirror/autocomplete": "npm:^6.0.0" + "@codemirror/commands": "npm:^6.0.0" + "@codemirror/language": "npm:^6.0.0" + "@codemirror/lint": "npm:^6.0.0" + "@codemirror/search": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + peerDependencies: + "@codemirror/autocomplete": ">=6.0.0" + "@codemirror/commands": ">=6.0.0" + "@codemirror/language": ">=6.0.0" + "@codemirror/lint": ">=6.0.0" + "@codemirror/search": ">=6.0.0" + "@codemirror/state": ">=6.0.0" + "@codemirror/view": ">=6.0.0" + checksum: 10c0/b51614ba0489fca517b98ecfef4fb789b7b24313b0e70d23286a27f2a989818f102a89e80991b3b33277fde65ea2456f248f3eab35443c9cd1fc706e428936c4 + languageName: node + linkType: hard + +"@uiw/react-codemirror@npm:4.22.2": + version: 4.22.2 + resolution: "@uiw/react-codemirror@npm:4.22.2" + dependencies: + "@babel/runtime": "npm:^7.18.6" + "@codemirror/commands": "npm:^6.1.0" + "@codemirror/state": "npm:^6.1.1" + "@codemirror/theme-one-dark": "npm:^6.0.0" + "@uiw/codemirror-extensions-basic-setup": "npm:4.22.2" + codemirror: "npm:^6.0.0" + peerDependencies: + "@babel/runtime": ">=7.11.0" + "@codemirror/state": ">=6.0.0" + "@codemirror/theme-one-dark": ">=6.0.0" + "@codemirror/view": ">=6.0.0" + codemirror: ">=6.0.0" + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/de4903d2c4789c3a3872c46e69a6cde37e4abf3b96e602ff4f96f9b01e6951b1c06ce1e0ef3061395fc6ebc733bf5da924d4dd85b7e153a7eb015b8c5e46d533 + languageName: node + linkType: hard + +"@vitejs/plugin-react-swc@npm:3.6.0": + version: 3.6.0 + resolution: "@vitejs/plugin-react-swc@npm:3.6.0" + dependencies: + "@swc/core": "npm:^1.3.107" + peerDependencies: + vite: ^4 || ^5 + checksum: 10c0/aae7c02f390559d0fbfb6285f1ba80917493d2c4979315f62f90fa06fb19b0b40362717fac035cac726575fdb120f66c4094f27bea846e2009686d15bc8637ae + languageName: node + linkType: hard + +"@vitejs/plugin-react-swc@npm:3.7.0": + version: 3.7.0 + resolution: "@vitejs/plugin-react-swc@npm:3.7.0" + dependencies: + "@swc/core": "npm:^1.5.7" + peerDependencies: + vite: ^4 || ^5 + checksum: 10c0/f9f562c87f0fd384d160c5d499056841f8a38050fc01f5295d3394a77c288eca1f78f6df3aa08c01f3f5cb3e4937c6490607ac87b700d87bab425b7c4dc15e91 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10c0/67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10c0/0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10c0/31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10c0/0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10c0/c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10c0/1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10c0/d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10c0/5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10c0/515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10c0/95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": "npm:1.14.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"accepts@npm:^1.3.5, accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.2": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"addressparser@npm:1.0.1": + version: 1.0.1 + resolution: "addressparser@npm:1.0.1" + checksum: 10c0/15a6b149c643e3fb0888bcad89aa385e7718714a33049b5f357063b64b84a2febd6a0775011783c25e6b161982663d38a84fd4522de69adb4779971b92b4ddb3 + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"aggregate-error@npm:^4.0.0": + version: 4.0.1 + resolution: "aggregate-error@npm:4.0.1" + dependencies: + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" + checksum: 10c0/75fd739f5c4c60a667cce35ccaf0edf135e147ef0be9a029cab75de14ac9421779b15339d562e58d25b233ea0ef2bbd4c916f149fdbcb73c2b9a62209e611343 + languageName: node + linkType: hard + +"ajv-draft-04@npm:~1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 + languageName: node + linkType: hard + +"ajv-formats@npm:~3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + peerDependencies: + ajv: ^8.8.2 + checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 + languageName: node + linkType: hard + +"ajv@npm:8.16.0": + version: 8.16.0 + resolution: "ajv@npm:8.16.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.4.1" + checksum: 10c0/6fc38aa8fd4fbfaa7096ac049e48c0cb440db36b76fef2d7d5b7d92b102735670d055d412d19176c08c9d48eaa9d06661b67e59f04943dc71ab1551e0484f88c + languageName: node + linkType: hard + +"ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"ajv@npm:~8.13.0": + version: 8.13.0 + resolution: "ajv@npm:8.13.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.4.1" + checksum: 10c0/14c6497b6f72843986d7344175a1aa0e2c35b1e7f7475e55bc582cddb765fca7e6bf950f465dc7846f817776d9541b706f4b5b3fbedd8dfdeb5fce6f22864264 + languageName: node + linkType: hard + +"ansi-align@npm:^3.0.0": + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" + dependencies: + string-width: "npm:^4.1.0" + checksum: 10c0/ad8b755a253a1bc8234eb341e0cec68a857ab18bf97ba2bda529e86f6e30460416523e0ec58c32e5c21f0ca470d779503244892873a5895dbd0c39c788e82467 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-html-community@npm:0.0.8": + version: 0.0.8 + resolution: "ansi-html-community@npm:0.0.8" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 + languageName: node + linkType: hard + +"ansi-html@npm:^0.0.9": + version: 0.0.9 + resolution: "ansi-html@npm:0.0.9" + bin: + ansi-html: bin/ansi-html + checksum: 10c0/4a5de9802fb50193e32b51a9ea48dc0d7e4436b860cb819d7110c62f2bfb1410288e1a2f9a848269f5eab8f903797a7f0309fe4c552f92a92b61a5b759ed52bd + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + languageName: node + linkType: hard + +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.1 + resolution: "ansi-sequence-parser@npm:1.1.1" + checksum: 10c0/ab2259ccf69f145ecf1418d4e71524158828f44afdf37c7536677871f4cebaa8b176fcb95de8f94a68129357dddc59586597da25f9d4ebf9968f6ef022bf0b31 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"any-promise@npm:^1.0.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 10c0/60f0298ed34c74fef50daab88e8dab786036ed5a7fad02e012ab57e376e0a0b4b29e83b95ea9b5e7d89df762f5f25119b83e00706ecaccb22cfbacee98d74889 + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"argparse@npm:^1.0.7, argparse@npm:~1.0.9": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"argv@npm:0.0.2": + version: 0.0.2 + resolution: "argv@npm:0.0.2" + checksum: 10c0/13b7a94bf690b8cf04dcaac0c70b631df10de8a1eeb701f31c85abe46a60db449c1e3330e92ef00ffe2a709a5b35baf815e52cc4b8cbe495829c90ceb3e3e30f + languageName: node + linkType: hard + +"aria-hidden@npm:1.2.4, aria-hidden@npm:^1.1.1": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10c0/8abcab2e1432efc4db415e97cb3959649ddf52c8fc815d7384f43f3d3abf56f1c12852575d00df9a8927f421d7e0712652dd5f8db244ea57634344e29ecfc74a + languageName: node + linkType: hard + +"aria-query@npm:5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 + languageName: node + linkType: hard + +"array-each@npm:^1.0.1": + version: 1.0.1 + resolution: "array-each@npm:1.0.1" + checksum: 10c0/b5951ac450b560849143722d6785672ae71f5e9b061f11e7e2f775513a952e583e8bcedbba538a08049e235f5583756efec440fc6740a9b47b411cb487f65a9b + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 + languageName: node + linkType: hard + +"array-slice@npm:^1.0.0": + version: 1.1.0 + resolution: "array-slice@npm:1.1.0" + checksum: 10c0/dfefd705905f428b6c4cace2a787f308b5a64db5411e33cdf8ff883b6643f1703e48ac152b74eea482f8f6765fdf78b5277e2bad7840be2b4d5c23777db3266f + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 10c0/c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab + languageName: node + linkType: hard + +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + +"async-retry@npm:^1.2.1": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: "npm:0.13.1" + checksum: 10c0/cabced4fb46f8737b95cc88dc9c0ff42656c62dc83ce0650864e891b6c155a063af08d62c446269b51256f6fbcb69a6563b80e76d0ea4a5117b0c0377b6b19d8 + languageName: node + linkType: hard + +"async@npm:3.2.3": + version: 3.2.3 + resolution: "async@npm:3.2.3" + checksum: 10c0/109780c846f05109dde14412d916ae4ed6daf6f9aad0c4aa1dcf0d4da775a3a9e35e0e06e4e06ad9fed66f99ca15549da16f2f243c56103b346e9d3bcd9c943f + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"axios@npm:1.7.4": + version: 1.7.4 + resolution: "axios@npm:1.7.4" + dependencies: + follow-redirects: "npm:^1.15.6" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: 10c0/5ea1a93140ca1d49db25ef8e1bd8cfc59da6f9220159a944168860ad15a2743ea21c5df2967795acb15cbe81362f5b157fdebbea39d53117ca27658bab9f7f17 + languageName: node + linkType: hard + +"b4a@npm:^1.6.4": + version: 1.6.7 + resolution: "b4a@npm:1.6.7" + checksum: 10c0/ec2f004d1daae04be8c5a1f8aeb7fea213c34025e279db4958eb0b82c1729ee25f7c6e89f92a5f65c8a9cf2d017ce27e3dda912403341d1781bd74528a4849d4 + languageName: node + linkType: hard + +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e + languageName: node + linkType: hard + +"babel-plugin-macros@npm:^3.1.0": + version: 3.1.0 + resolution: "babel-plugin-macros@npm:3.1.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + cosmiconfig: "npm:^7.0.0" + resolve: "npm:^1.19.0" + checksum: 10c0/c6dfb15de96f67871d95bd2e8c58b0c81edc08b9b087dc16755e7157f357dc1090a8dc60ebab955e92587a9101f02eba07e730adc253a1e4cf593ca3ebd3839c + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"bare-events@npm:^2.0.0, bare-events@npm:^2.2.0": + version: 2.5.0 + resolution: "bare-events@npm:2.5.0" + checksum: 10c0/afbeec4e8be4d93fb4a3be65c3b4a891a2205aae30b5a38fafd42976cc76cf30dad348963fe330a0d70186e15dc507c11af42c89af5dddab2a54e5aff02e2896 + languageName: node + linkType: hard + +"bare-fs@npm:^2.1.1": + version: 2.3.5 + resolution: "bare-fs@npm:2.3.5" + dependencies: + bare-events: "npm:^2.0.0" + bare-path: "npm:^2.0.0" + bare-stream: "npm:^2.0.0" + checksum: 10c0/ff18cc9be7c557c38e0342681ba3672ae4b01e5696b567d4035e5995255dc6bc7d4df88ed210fa4d3eb940eb29512e924ebb42814c87fc59a2bee8cf83b7c2f9 + languageName: node + linkType: hard + +"bare-os@npm:^2.1.0": + version: 2.4.4 + resolution: "bare-os@npm:2.4.4" + checksum: 10c0/e7d1a7b2100c05da8d25b60d0d48cf850c6f57064577a3f2f51cf18d417fbcfd6967ed2d8314320914ed69e0f2ebcf54eb1b36092dd172d8e8f969cf8cccf041 + languageName: node + linkType: hard + +"bare-path@npm:^2.0.0, bare-path@npm:^2.1.0": + version: 2.1.3 + resolution: "bare-path@npm:2.1.3" + dependencies: + bare-os: "npm:^2.1.0" + checksum: 10c0/35587e177fc8fa5b13fb90bac8779b5ce49c99016d221ddaefe2232d02bd4295d79b941e14ae19fda75ec42a6fe5fb66c07d83ae7ec11462178e66b7be65ca74 + languageName: node + linkType: hard + +"bare-stream@npm:^2.0.0": + version: 2.6.1 + resolution: "bare-stream@npm:2.6.1" + dependencies: + streamx: "npm:^2.21.0" + checksum: 10c0/f6fe238b4b067fc9ec99e6f9a218239413d1641dfd5bc4defa5fbd0e360ac09e7f454929f5fedd0ee1e7b84d780d32084afe3b60d369ed5f53512dd5fa8b9f8b + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bcryptjs@npm:2.4.3": + version: 2.4.3 + resolution: "bcryptjs@npm:2.4.3" + checksum: 10c0/b969467087ed7a01ff905a1c6a0c45014ec586248a448ea08370c8ed8bb314bda16a870ca23e0961d7d23bdce1a04c76fa70a9d680be814fa9ac7d8fc61870a3 + languageName: node + linkType: hard + +"big-integer@npm:^1.6.16": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"bl@npm:^4.0.3, bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf + languageName: node + linkType: hard + +"boolean@npm:^3.0.1": + version: 3.2.0 + resolution: "boolean@npm:3.2.0" + checksum: 10c0/6a0dc9668f6f3dda42a53c181fcbdad223169c8d87b6c4011b87a8b14a21770efb2934a778f063d7ece17280f8c06d313c87f7b834bb1dd526a867ffcd00febf + languageName: node + linkType: hard + +"boxen@npm:5.1.2": + version: 5.1.2 + resolution: "boxen@npm:5.1.2" + dependencies: + ansi-align: "npm:^3.0.0" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.1.0" + cli-boxes: "npm:^2.2.1" + string-width: "npm:^4.2.2" + type-fest: "npm:^0.20.2" + widest-line: "npm:^3.1.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/71f31c2eb3dcacd5fce524ae509e0cc90421752e0bfbd0281fd3352871d106c462a0f810c85f2fdb02f3a9fab2d7a84e9718b4999384d651b76104ebe5d2c024 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"broadcast-channel@npm:^3.4.1": + version: 3.7.0 + resolution: "broadcast-channel@npm:3.7.0" + dependencies: + "@babel/runtime": "npm:^7.7.2" + detect-node: "npm:^2.1.0" + js-sha3: "npm:0.8.0" + microseconds: "npm:0.2.0" + nano-time: "npm:1.0.0" + oblivious-set: "npm:1.0.0" + rimraf: "npm:3.0.2" + unload: "npm:2.2.0" + checksum: 10c0/95978446f24c685be666f5508a91350bcd4075c08feda929d26c0c678fb24bd421901f19fa8d36cb6f5ed480a334072f3bdce48fa177a8cb29793d88693911cc + languageName: node + linkType: hard + +"browserslist-to-esbuild@npm:1.2.0": + version: 1.2.0 + resolution: "browserslist-to-esbuild@npm:1.2.0" + dependencies: + browserslist: "npm:^4.17.3" + checksum: 10c0/d0825e3fb622d0d846ea176af1709ead0529aedc6e1e5d4bc10d8fbe614aab561ec781a3e5d6638174b9ac5e955af5c45826c561bb4f18e6b6883fa2e99fee18 + languageName: node + linkType: hard + +"browserslist@npm:^4.17.3, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" + dependencies: + caniuse-lite: "npm:^1.0.30001669" + electron-to-chromium: "npm:^1.5.41" + node-releases: "npm:^2.0.18" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10c0/d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a + languageName: node + linkType: hard + +"bs-logger@npm:^0.2.6": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: 10c0/80e89aaaed4b68e3374ce936f2eb097456a0dddbf11f75238dbd53140b1e39259f0d248a5089ed456f1158984f22191c3658d54a713982f676709fbe1a6fa5a0 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 + languageName: node + linkType: hard + +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"buffer@npm:^5.1.0, buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"buildmail@npm:3.10.0": + version: 3.10.0 + resolution: "buildmail@npm:3.10.0" + dependencies: + addressparser: "npm:1.0.1" + libbase64: "npm:0.1.0" + libmime: "npm:2.1.0" + libqp: "npm:1.1.0" + nodemailer-fetch: "npm:1.6.0" + nodemailer-shared: "npm:1.1.0" + checksum: 10c0/1d816e1519a1c785b8d3c05c99db9925d5c421f51ed4d9621cea933ead620d4f91241a6c4eff08cbff406a5583693f12943a4fca65d061dd2aa8add22322e430 + languageName: node + linkType: hard + +"byte-size@npm:8.1.1": + version: 8.1.1 + resolution: "byte-size@npm:8.1.1" + checksum: 10c0/83170a16820fde48ebaef93bf6b2e86c5f72041f76e44eba1f3c738cceb699aeadf11088198944d5d7c6f970b465ab1e3dddc2e60bfb49a74374f3447a8db5b9 + languageName: node + linkType: hard + +"bytes@npm:3.1.2, bytes@npm:^3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + languageName: node + linkType: hard + +"cache-content-type@npm:^1.0.0": + version: 1.0.1 + resolution: "cache-content-type@npm:1.0.1" + dependencies: + mime-types: "npm:^2.1.18" + ylru: "npm:^1.2.0" + checksum: 10c0/59b50e29e64a24bb52a16e5d35b69ad27ef14313701acc5e462b0aeebf2f09ff87fb6538eb0c0f0de4de05c8a1eecaef47f455f5b4928079e68f607f816a0843 + languageName: node + linkType: hard + +"cache-manager@npm:^3.6.0": + version: 3.6.3 + resolution: "cache-manager@npm:3.6.3" + dependencies: + async: "npm:3.2.3" + lodash.clonedeep: "npm:^4.5.0" + lru-cache: "npm:6.0.0" + checksum: 10c0/83e45031e964b94dab47a7af0adbab1c21a3a0f05efe1fc964207d429eb2cf5c77849fc61e04e5eaa8a29ae147ebc031199371d1a898b1dc28b2149648a03ddd + languageName: node + linkType: hard + +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": + version: 1.0.1 + resolution: "call-bind-apply-helpers@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/acb2ab68bf2718e68a3e895f0d0b73ccc9e45b9b6f210f163512ba76f91dab409eb8792f6dae188356f9095747512a3101646b3dea9d37fb8c7c6bf37796d18c + languageName: node + linkType: hard + +"call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bound@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.8" + get-intrinsic: "npm:^1.2.5" + checksum: 10c0/19761e1ce55578f9c41bed06b162de22058d0228cd9c14215d8db73716594ef61b87e5e7486855ea04becd86f55ed08ed81e2c25a4a56962ca12e6b0e772f141 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camel-case@npm:^3.0.0": + version: 3.0.0 + resolution: "camel-case@npm:3.0.0" + dependencies: + no-case: "npm:^2.2.0" + upper-case: "npm:^1.1.1" + checksum: 10c0/491c6bbf986b9d8355e12cca6beb719b44c2fe96e8526c09958a1b4e0dbb081a82ea59c13b5a6ccf9158ce5979cbe56a8a10d7322bfeed2d84725c6b89d8f934 + languageName: node + linkType: hard + +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"camelize@npm:^1.0.0": + version: 1.0.1 + resolution: "camelize@npm:1.0.1" + checksum: 10c0/4c9ac55efd356d37ac483bad3093758236ab686192751d1c9daa43188cc5a07b09bd431eb7458a4efd9ca22424bba23253e7b353feb35d7c749ba040de2385fb + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001688 + resolution: "caniuse-lite@npm:1.0.30001688" + checksum: 10c0/2ef3145ac69ea5faf403b613912a3a72006db2e004e58abcf40dc89904aa05568032b5a6dcfb267556944fd380a9b018ad645f93d84e543bed3471e4950a89f4 + languageName: node + linkType: hard + +"capital-case@npm:^1.0.4": + version: 1.0.4 + resolution: "capital-case@npm:1.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case-first: "npm:^2.0.2" + checksum: 10c0/6a034af73401f6e55d91ea35c190bbf8bda21714d4ea8bb8f1799311d123410a80f0875db4e3236dc3f97d74231ff4bf1c8783f2be13d7733c7d990c57387281 + languageName: node + linkType: hard + +"castable-video@npm:~1.1.0": + version: 1.1.3 + resolution: "castable-video@npm:1.1.3" + dependencies: + custom-media-element: "npm:~1.4.1" + checksum: 10c0/5e0ecf09da1752c03c0985ea3a3ab0a0a31501d85385b933a37dd5e070df3fbd8d364764c24e0f9e8e8a702e1b69a27e5fb82b4ef0b2c9cb47cd227144edf30f + languageName: node + linkType: hard + +"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + +"change-case@npm:^3.1.0": + version: 3.1.0 + resolution: "change-case@npm:3.1.0" + dependencies: + camel-case: "npm:^3.0.0" + constant-case: "npm:^2.0.0" + dot-case: "npm:^2.1.0" + header-case: "npm:^1.0.0" + is-lower-case: "npm:^1.1.0" + is-upper-case: "npm:^1.1.0" + lower-case: "npm:^1.1.1" + lower-case-first: "npm:^1.0.0" + no-case: "npm:^2.3.2" + param-case: "npm:^2.1.0" + pascal-case: "npm:^2.0.0" + path-case: "npm:^2.1.0" + sentence-case: "npm:^2.1.0" + snake-case: "npm:^2.1.0" + swap-case: "npm:^1.1.0" + title-case: "npm:^2.1.0" + upper-case: "npm:^1.1.1" + upper-case-first: "npm:^1.1.0" + checksum: 10c0/cb44722e596e0c69e8ba28dce664b36e537ec76c8296c0baaef11d2b3db1e4a797ed50a99ff9c98a008c69dbe0270cfb96e384417a264d33de4baa709b79b9bb + languageName: node + linkType: hard + +"change-case@npm:^4.1.2": + version: 4.1.2 + resolution: "change-case@npm:4.1.2" + dependencies: + camel-case: "npm:^4.1.2" + capital-case: "npm:^1.0.4" + constant-case: "npm:^3.0.4" + dot-case: "npm:^3.0.4" + header-case: "npm:^2.0.4" + no-case: "npm:^3.0.4" + param-case: "npm:^3.0.4" + pascal-case: "npm:^3.1.2" + path-case: "npm:^3.0.4" + sentence-case: "npm:^3.0.4" + snake-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/95a6e48563cd393241ce18470c7310a8a050304a64b63addac487560ab039ce42b099673d1d293cc10652324d92060de11b5d918179fe3b5af2ee521fb03ca58 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d + languageName: node + linkType: hard + +"chokidar@npm:3.6.0, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + +"chokidar@npm:4.0.1": + version: 4.0.1 + resolution: "chokidar@npm:4.0.1" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9 + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5 + languageName: node + linkType: hard + +"ci-info@npm:3.8.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: 10c0/0d3052193b58356372b34ab40d2668c3e62f1006d5ca33726d1d3c423853b19a85508eadde7f5908496fb41448f465263bf61c1ee58b7832cb6a924537e3863a + languageName: node + linkType: hard + +"ci-info@npm:4.0.0": + version: 4.0.0 + resolution: "ci-info@npm:4.0.0" + checksum: 10c0/ecc003e5b60580bd081d83dd61d398ddb8607537f916313e40af4667f9c92a1243bd8e8a591a5aa78e418afec245dbe8e90a0e26e39ca0825129a99b978dd3f9 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10c0/5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc + languageName: node + linkType: hard + +"clean-css@npm:^5.2.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" + dependencies: + source-map: "npm:~0.6.0" + checksum: 10c0/381de7523e23f3762eb180e327dcc0cedafaf8cb1cd8c26b7cc1fc56e0829a92e734729c4f955394d65ed72fb62f82d8baf78af34b33b8a7d41ebad2accdd6fb + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"clean-stack@npm:^4.0.0": + version: 4.2.0 + resolution: "clean-stack@npm:4.2.0" + dependencies: + escape-string-regexp: "npm:5.0.0" + checksum: 10c0/2bdf981a0fef0a23c14255df693b30eb9ae27eedf212470d8c400a0c0b6fb82fbf1ff8c5216ccd5721e3670b700389c886b1dce5070776dc9fbcc040957758c0 + languageName: node + linkType: hard + +"cli-boxes@npm:^2.2.1": + version: 2.2.1 + resolution: "cli-boxes@npm:2.2.1" + checksum: 10c0/6111352edbb2f62dbc7bfd58f2d534de507afed7f189f13fa894ce5a48badd94b2aa502fda28f1d7dd5f1eb456e7d4033d09a76660013ef50c7f66e7a034f050 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-cursor@npm:^5.0.0": + version: 5.0.0 + resolution: "cli-cursor@npm:5.0.0" + dependencies: + restore-cursor: "npm:^5.0.0" + checksum: 10c0/7ec62f69b79f6734ab209a3e4dbdc8af7422d44d360a7cb1efa8a0887bbe466a6e625650c466fe4359aee44dbe2dc0b6994b583d40a05d0808a5cb193641d220 + languageName: node + linkType: hard + +"cli-progress@npm:3.12.0": + version: 3.12.0 + resolution: "cli-progress@npm:3.12.0" + dependencies: + string-width: "npm:^4.2.3" + checksum: 10c0/f464cb19ebde2f3880620a2adfaeeefaec6cb15c8e610c8a659ca1047ee90d69f3bf2fdabbb1fe33ac408678e882e3e0eecdb84ab5df0edf930b269b8a72682d + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0, cli-spinners@npm:^2.9.2": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 + languageName: node + linkType: hard + +"cli-table3@npm:0.6.2": + version: 0.6.2 + resolution: "cli-table3@npm:0.6.2" + dependencies: + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10c0/aaa87929d86ba36e651e0280ab34cc28660e13da9dd2b6f8aa36e800c40e331c32bff53597cb9126e8a2e88e7a9025aff9c240350fe69876207d51ba452ef5e0 + languageName: node + linkType: hard + +"cli-table3@npm:0.6.5": + version: 0.6.5 + resolution: "cli-table3@npm:0.6.5" + dependencies: + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10c0/d7cc9ed12212ae68241cc7a3133c52b844113b17856e11f4f81308acc3febcea7cc9fd298e70933e294dd642866b29fd5d113c2c098948701d0c35f09455de78 + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 10c0/125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a + languageName: node + linkType: hard + +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10c0/1fbd56413578f6117abcaf858903ba1f4ad78370a4032f916745fa2c7e390183a9d9029cf837df320b0fdce8137668e522f60a30a5f3d6529ff3872d265a955f + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"co-body@npm:^6.0.0, co-body@npm:^6.1.0": + version: 6.2.0 + resolution: "co-body@npm:6.2.0" + dependencies: + "@hapi/bourne": "npm:^3.0.0" + inflation: "npm:^2.0.0" + qs: "npm:^6.5.2" + raw-body: "npm:^2.3.3" + type-is: "npm:^1.6.16" + checksum: 10c0/3a320d8b324abc14031243f427d2584cfe8f61562204f1a45d0a08bba20fff7122a04883f4d312ba648fb455246030916cacb92c19c6f7b329aaf1de70045e37 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"codecov@npm:^3.7.2": + version: 3.8.2 + resolution: "codecov@npm:3.8.2" + dependencies: + argv: "npm:0.0.2" + ignore-walk: "npm:3.0.3" + js-yaml: "npm:3.14.1" + teeny-request: "npm:7.0.1" + urlgrey: "npm:0.4.4" + bin: + codecov: bin/codecov + checksum: 10c0/8b58aa507d0f7843cdf28cfc0724d43951619d262486a15d71f3d8c703937a37624b2e3f8551c05929704d4f45c8d4c0bf05cf2b17287bb7403a74b073e1e546 + languageName: node + linkType: hard "codemirror5@npm:codemirror@^5.65.11": - version "5.65.16" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.16.tgz#efc0661be6bf4988a6a1c2fe6893294638cdb334" - integrity sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg== - -codemirror@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" - integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/commands" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/lint" "^6.0.0" - "@codemirror/search" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorette@2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -colors@~1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" - integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@8.3.0, commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0, commander@^2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -compute-scroll-into-view@^1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43" - integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== - -compute-scroll-into-view@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" - integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-disposition@~0.5.2: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookies@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -copy-to@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" - integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== - -core-js-pure@^3.23.3: - version "3.35.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.35.1.tgz#f33ad7fdf9dddae260339a30e5f8363f5c49a3bc" - integrity sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.2.0: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -crelt@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" - integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== - -cron-parser@^4.2.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" - integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== - dependencies: - luxon "^3.2.1" - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.1, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-loader@^6.9.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" - integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.33" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.4" - postcss-modules-scope "^3.1.1" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.5.4" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssfilter@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" - integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -date-fns@2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== - -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -dicer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" - integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== - dependencies: - streamsearch "0.1.2" - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -direction@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/direction/-/direction-1.0.4.tgz#2b86fb686967e987088caf8b89059370d4837442" - integrity sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ== - -dnd-core@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-16.0.1.tgz#a1c213ed08961f6bd1959a28bb76f1a868360d19" - integrity sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng== - dependencies: - "@react-dnd/asap" "^5.0.1" - "@react-dnd/invariant" "^4.0.1" - redux "^4.2.0" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv@14.2.0: - version "14.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.2.0.tgz#7e77fd5dd6cff5942c4496e1acf2d0f37a9e67aa" - integrity sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.188: - version "1.4.200" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.200.tgz#6e4c5266106688965b4ea7caa11f0dd315586854" - integrity sha512-nPyI7oHc8T64oSqRXrAt99gNMpk0SAgPHw/o+hkNKyb5+bcdnFtZcSO9FUJES5cVkVZvo8u4qiZ1gQILl8UXsA== - -electron-to-chromium@^1.4.648: - version "1.4.661" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.661.tgz#b28d63468b06e75610ed2b0f8e5f5f669a57bd91" - integrity sha512-AFg4wDHSOk5F+zA8aR+SVIOabu7m0e7BiJnigCvPXzIGy731XENw/lmNxTySpVFtkFEy+eyt4oHhh5FF3NjQNw== - -emittery@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.12.1.tgz#cb9a4a18745816f7a1fa03a8953e7eaededb45f2" - integrity sha512-pYyW59MIZo0HxPFf+Vb3+gacUu0gxVS3TZwB2ClwkEZywgF9f9OJDoVmNLojTn0vKX3tO9LC+pdQEcLP4Oz/bQ== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encodeurl@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -enhanced-resolve@^5.17.1: - version "5.17.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - -es-module-lexer@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== - -esbuild-loader@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/esbuild-loader/-/esbuild-loader-2.21.0.tgz#2698a3e565b0db2bb19a3dd91c2b6c9aad526c80" - integrity sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g== - dependencies: - esbuild "^0.16.17" - joycon "^3.0.1" - json5 "^2.2.0" - loader-utils "^2.0.0" - tapable "^2.2.0" - webpack-sources "^1.4.3" - -esbuild-register@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" - integrity sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A== - dependencies: - debug "^4.3.4" - -esbuild@0.19.11: - version "0.19.11" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" - integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.11" - "@esbuild/android-arm" "0.19.11" - "@esbuild/android-arm64" "0.19.11" - "@esbuild/android-x64" "0.19.11" - "@esbuild/darwin-arm64" "0.19.11" - "@esbuild/darwin-x64" "0.19.11" - "@esbuild/freebsd-arm64" "0.19.11" - "@esbuild/freebsd-x64" "0.19.11" - "@esbuild/linux-arm" "0.19.11" - "@esbuild/linux-arm64" "0.19.11" - "@esbuild/linux-ia32" "0.19.11" - "@esbuild/linux-loong64" "0.19.11" - "@esbuild/linux-mips64el" "0.19.11" - "@esbuild/linux-ppc64" "0.19.11" - "@esbuild/linux-riscv64" "0.19.11" - "@esbuild/linux-s390x" "0.19.11" - "@esbuild/linux-x64" "0.19.11" - "@esbuild/netbsd-x64" "0.19.11" - "@esbuild/openbsd-x64" "0.19.11" - "@esbuild/sunos-x64" "0.19.11" - "@esbuild/win32-arm64" "0.19.11" - "@esbuild/win32-ia32" "0.19.11" - "@esbuild/win32-x64" "0.19.11" - -esbuild@^0.16.17: - version "0.16.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" - integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== - optionalDependencies: - "@esbuild/android-arm" "0.16.17" - "@esbuild/android-arm64" "0.16.17" - "@esbuild/android-x64" "0.16.17" - "@esbuild/darwin-arm64" "0.16.17" - "@esbuild/darwin-x64" "0.16.17" - "@esbuild/freebsd-arm64" "0.16.17" - "@esbuild/freebsd-x64" "0.16.17" - "@esbuild/linux-arm" "0.16.17" - "@esbuild/linux-arm64" "0.16.17" - "@esbuild/linux-ia32" "0.16.17" - "@esbuild/linux-loong64" "0.16.17" - "@esbuild/linux-mips64el" "0.16.17" - "@esbuild/linux-ppc64" "0.16.17" - "@esbuild/linux-riscv64" "0.16.17" - "@esbuild/linux-s390x" "0.16.17" - "@esbuild/linux-x64" "0.16.17" - "@esbuild/netbsd-x64" "0.16.17" - "@esbuild/openbsd-x64" "0.16.17" - "@esbuild/sunos-x64" "0.16.17" - "@esbuild/win32-arm64" "0.16.17" - "@esbuild/win32-ia32" "0.16.17" - "@esbuild/win32-x64" "0.16.17" - -esbuild@^0.19.3: - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esm@^3.2.25: - version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@5.1.1, execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-root@1.1.0, find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.15.0: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -fork-ts-checker-webpack-plugin@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz#c12c590957837eb02b02916902dcf3e675fd2b1e" - integrity sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg== - dependencies: - "@babel/code-frame" "^7.16.7" - chalk "^4.1.2" - chokidar "^3.5.3" - cosmiconfig "^8.2.0" - deepmerge "^4.2.2" - fs-extra "^10.0.0" - memfs "^3.4.1" - minimatch "^3.0.4" - node-abort-controller "^3.0.1" - schema-utils "^3.1.1" - semver "^7.3.5" - tapable "^2.2.1" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formik@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.0.tgz#8243e42a89e1c9fbe9aefbd48bc8d1f10ae2950d" - integrity sha512-QZiWztt9fD84EYcF7Bmr431ZhIm1xUVgBACbTuJ6azPrUpVp7o6q+t9HJaIQsFZrMfcBPNBotYtDgyDpzQ3z0Q== - dependencies: - deepmerge "^2.1.1" - hoist-non-react-statics "^3.3.0" - lodash "^4.17.21" - lodash-es "^4.17.21" - react-fast-compare "^2.0.1" - tiny-warning "^1.0.2" - tslib "^1.10.0" - -formik@^2.2.9: - version "2.2.9" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0" - integrity sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA== - dependencies: - deepmerge "^2.1.1" - hoist-non-react-statics "^3.3.0" - lodash "^4.17.21" - lodash-es "^4.17.21" - react-fast-compare "^2.0.1" - tiny-warning "^1.0.2" - tslib "^1.10.0" - -fractional-indexing@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fractional-indexing/-/fractional-indexing-3.2.0.tgz#1193e63d54ff4e0cbe0c79a9ed6cfbab25d91628" - integrity sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ== - -fresh@~0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-capacitor@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" - integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== - -fs-extra@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-jetpack@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-4.3.1.tgz#cdfd4b64e6bfdec7c7dc55c76b39efaa7853bb20" - integrity sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ== - dependencies: - minimatch "^3.0.2" - rimraf "^2.6.3" - -fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -getopts@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" - integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graphql-depth-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/graphql-depth-limit/-/graphql-depth-limit-1.1.0.tgz#59fe6b2acea0ab30ee7344f4c75df39cc18244e8" - integrity sha512-+3B2BaG8qQ8E18kzk9yiSdAa75i/hnnOwgSeAxVJctGQPvmeiLtqKOYF6HETCyRjiF7Xfsyal0HbLlxCQkgkrw== - dependencies: - arrify "^1.0.1" - -graphql-playground-html@^1.6.30: - version "1.6.30" - resolved "https://registry.yarnpkg.com/graphql-playground-html/-/graphql-playground-html-1.6.30.tgz#14c2a8eb7fc17bfeb1a746bbb28a11e34bf0b391" - integrity sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw== - dependencies: - xss "^1.0.6" - -graphql-playground-middleware-koa@^1.6.21: - version "1.6.22" - resolved "https://registry.yarnpkg.com/graphql-playground-middleware-koa/-/graphql-playground-middleware-koa-1.6.22.tgz#23937dd4dd73ae4c4cb8599b904b5ba59b4a2c3d" - integrity sha512-soVUM76ecq5GHk12H69Ce7afzbYuWWc73oKMOcEkmtAn/G9NUdsNvLjLdCnHQX1V0cOUeSbmcYcrebyBOIYGMQ== - dependencies: - graphql-playground-html "^1.6.30" - -graphql-scalars@1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.22.2.tgz#6326e6fe2d0ad4228a9fea72a977e2bf26b86362" - integrity sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ== - dependencies: - tslib "^2.5.0" - -graphql-tag@^2.11.0: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql-upload@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-13.0.0.tgz#1a255b64d3cbf3c9f9171fa62a8fb0b9b59bb1d9" - integrity sha512-YKhx8m/uOtKu4Y1UzBFJhbBGJTlk7k4CydlUUiNrtxnwZv0WigbRHP+DVhRNKt7u7DXOtcKZeYJlGtnMXvreXA== - dependencies: - busboy "^0.3.1" - fs-capacitor "^6.2.0" - http-errors "^1.8.1" - object-path "^0.11.8" - -graphql@^15.5.1: - version "15.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" - integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -highlight.js@^10.4.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-entities@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== - -html-escaper@^2.0.0, html-escaper@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-webpack-plugin@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" - integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -http-assert@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" - integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== - dependencies: - deep-equal "~1.0.1" - http-errors "~1.8.0" - -http-errors@1.8.1, http-errors@^1.6.3, http-errors@^1.7.3, http-errors@^1.8.1, http-errors@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore-walk@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - -immer@9.0.19: - version "9.0.19" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" - integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== - -immer@^9.0.21, immer@^9.0.6: - version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflation@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" - integrity sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -inquirer@8.2.5: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -intl-messageformat@10.3.3: - version "10.3.3" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.3.tgz#576798d31c9f8d90f9beadaa5a3878b8d30177a2" - integrity sha512-un/f07/g2e/3Q8e1ghDKET+el22Bi49M7O/rHxd597R+oLpPOMykSv5s51cABVfu3FZW+fea4hrzf2MHu1W4hw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.3.0" - tslib "^2.4.0" - -intl-messageformat@10.3.4: - version "10.3.4" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.4.tgz#20f064c28b46fa6d352a4c4ba5e9bfc597af3eba" - integrity sha512-/FxUIrlbPtuykSNX85CB5sp2FjLVeTmdD7TfRkVFPft2n4FgcSlAcilFytYiFAEmPHc+0PvpLCIPXeaGFzIvOg== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.3.1" - tslib "^2.4.0" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hotkey@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/is-hotkey/-/is-hotkey-0.1.8.tgz#6b1f4b2d0e5639934e20c05ed24d623a21d36d25" - integrity sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ== - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-localhost-ip@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-localhost-ip/-/is-localhost-ip-2.0.0.tgz#c2bf11faa0973657fd6e29e4e848348aeb09a1cd" - integrity sha512-vlgs2cSgMOfnKU8c1ewgKPyum9rVrjjLLW2HBdL5i0iAJjOs8NY55ZBd/hqUTaYR0EO9CKZd3hVSC2HlIbygTQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterall@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" - integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-cli@^29.6.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-styled-components@^7.0.2: - version "7.0.8" - resolved "https://registry.yarnpkg.com/jest-styled-components/-/jest-styled-components-7.0.8.tgz#9ea3b43f002de060b4638fde3b422d14b3e3ec9f" - integrity sha512-0KE54d0yIzKcvtOv8eikyjG3rFRtKYUyQovaoha3nondtZzXYGB3bhsvYgEegU08Iry0ndWx2+g9f5ZzD4I+0Q== - dependencies: - css "^3.0.0" - -jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^27.4.5, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@29.6.0: - version "29.6.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.0.tgz#dbc8136e6d933177487e2427187e07ebf9db8ce4" - integrity sha512-do1J9gGrQ68E4UfMz/4OM71p9qCqQxu32N/9ZfeYFSSlx0uUOuxeyZxtJZNaUTW12ZA11ERhmBjBhy1Ho96R4g== - dependencies: - "@jest/core" "^29.6.0" - "@jest/types" "^29.6.0" - import-local "^3.0.2" - jest-cli "^29.6.0" - -joycon@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" - integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== - -js-cookie@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.14.1, js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.0, json5@^2.2.1, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonwebtoken@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" - integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== - dependencies: - jws "^3.2.2" - lodash "^4.17.21" - ms "^2.1.1" - semver "^7.3.8" - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -knex@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/knex/-/knex-2.5.0.tgz#5c99245e9c7e6a9d1a8b7fcf48b457ccb471dec3" - integrity sha512-h6Ru3PJmZjCDUEqLgwQ/RJUu06Bz7MTzY6sD90udLIa9qwtC7Rnicr7TBiWSaswZmDqk4EZ8xysdg1fkvhYM6w== - dependencies: - colorette "2.0.19" - commander "^10.0.0" - debug "4.3.4" - escalade "^3.1.1" - esm "^3.2.25" - get-package-type "^0.1.0" - getopts "2.3.0" - interpret "^2.2.0" - lodash "^4.17.21" - pg-connection-string "2.6.1" - rechoir "^0.8.0" - resolve-from "^5.0.0" - tarn "^3.0.2" - tildify "2.0.0" - -koa-bodyparser@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz#a908d848e142cc57d9eece478e932bf00dce3029" - integrity sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w== - dependencies: - co-body "^6.0.0" - copy-to "^2.0.1" - type-is "^1.6.18" - -koa-bodyparser@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" - integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== - dependencies: - co-body "^6.0.0" - copy-to "^2.0.1" - -koa-compose@4.1.0, koa-compose@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== - -koa-convert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" - integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== - dependencies: - co "^4.6.0" - koa-compose "^4.1.0" - -koa-passport@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/koa-passport/-/koa-passport-5.0.0.tgz#66c8e91b06358969ab6129d90368fa07a06fafc0" - integrity sha512-eNGg3TGgZ4ydm9DYCOqaa0ySSA/44BS6X+v4CKjP/nHOoXlADRonHsZvS3QWok6EV0ZL0V7FhfWxRYfD2B5kTQ== - dependencies: - passport "^0.6.0" - -koa-send@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" - integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== - dependencies: - debug "^4.1.1" - http-errors "^1.7.3" - resolve-path "^1.4.0" - -koa-static@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" - integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== - dependencies: - debug "^3.1.0" - koa-send "^5.0.0" - -koa2-ratelimit@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/koa2-ratelimit/-/koa2-ratelimit-1.1.3.tgz#9f839c4f5533151aa4d5b8d11381a9a07854f0ff" - integrity sha512-gdrIw6m/D7pmScScL4dz50qLbRR3UGqvO1Vuy2dc7hVIuFAl1OVTnu6WFyEJ5GbfyLZFaCMWzRw6t4krvzvUTg== - -koa@2.13.4, koa@^2.8.0: - version "2.13.4" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e" - integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g== - dependencies: - accepts "^1.3.5" - cache-content-type "^1.0.0" - content-disposition "~0.5.2" - content-type "^1.0.4" - cookies "~0.8.0" - debug "^4.3.2" - delegates "^1.0.0" - depd "^2.0.0" - destroy "^1.0.4" - encodeurl "^1.0.2" - escape-html "^1.0.3" - fresh "~0.5.2" - http-assert "^1.3.0" - http-errors "^1.6.3" - is-generator-function "^1.0.7" - koa-compose "^4.1.0" - koa-convert "^2.0.0" - on-finished "^2.3.0" - only "~0.0.2" - parseurl "^1.3.2" - statuses "^1.5.0" - type-is "^1.6.16" - vary "^1.1.2" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" - integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== - dependencies: - uc.micro "^1.0.1" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0, loader-utils@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash-es@^4.17.15, lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== - -lodash.deburr@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" - integrity sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ== - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -loglevel@^1.6.8: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== - -long-timeout@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" - integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@6.0.0, lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^7.10.1: - version "7.13.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" - integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== - -luxon@^3.2.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" - integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markdown-it-abbr@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz#d66b5364521cbb3dd8aa59dadfba2fb6865c8fd8" - integrity sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg== - -markdown-it-container@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz#1d19b06040a020f9a827577bb7dbf67aa5de9a5b" - integrity sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw== - -markdown-it-deflist@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz#50d7a56b9544cd81252f7623bd785e28a8dcef5c" - integrity sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg== - -markdown-it-emoji@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz#cd42421c2fda1537d9cc12b9923f5c8aeb9029c8" - integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== - -markdown-it-footnote@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz#e0e4c0d67390a4c5f0c75f73be605c7c190ca4d8" - integrity sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w== - -markdown-it-ins@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz#c09356b917cf1dbf73add0b275d67ab8c73d4b4d" - integrity sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw== - -markdown-it-mark@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz#51257db58787d78aaf46dc13418d99a9f3f0ebd3" - integrity sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A== - -markdown-it-sub@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz#375fd6026eae7ddcb012497f6411195ea1e3afe8" - integrity sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q== - -markdown-it-sup@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3" - integrity sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ== - -markdown-it@^12.3.2: - version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" - integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== - dependencies: - argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -match-sorter@^6.0.2: - version "6.3.1" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" - integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== - dependencies: - "@babel/runtime" "^7.12.5" - remove-accents "0.4.2" - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.4.1, memfs@^3.4.12: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -"memoize-one@>=3.1.1 <6": - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -methods@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mini-css-extract-plugin@2.7.7: - version "2.7.7" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz#4acf02f362c641c38fb913bfcb7ca2fc4a7cf339" - integrity sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw== - dependencies: - schema-utils "^4.0.0" - -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -mrmime@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" - integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" - -nanoclone@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" - integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nexus@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/nexus/-/nexus-1.3.0.tgz#d7e2671d48bf887e30e2815f509bbf4b0ee2a02b" - integrity sha512-w/s19OiNOs0LrtP7pBmD9/FqJHvZLmCipVRt6v1PM8cRUYIbhEswyNKGHVoC4eHZGPSnD+bOf5A3+gnbt0A5/A== - dependencies: - iterall "^1.3.0" - tslib "^2.0.3" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-abort-controller@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== - -node-fetch@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -node-schedule@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" - integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ== - dependencies: - cron-parser "^4.2.0" - long-timeout "0.1.1" - sorted-array-functions "^1.3.0" - -nodemon@^2.0.15: - version "2.0.19" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.19.tgz#cac175f74b9cb8b57e770d47841995eebe4488bd" - integrity sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A== - dependencies: - chokidar "^3.5.2" - debug "^3.2.7" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.8" - semver "^5.7.1" - simple-update-notifier "^1.0.7" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" - integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-path@^0.11.8: - version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" - integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== - -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - -on-finished@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -only@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" - integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ== - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -ora@5.4.1, ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -outdent@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" - integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-srcset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" - integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -passport-local@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" - integrity sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow== - dependencies: - passport-strategy "1.x.x" - -passport-strategy@1.x.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" - integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== - -passport@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d" - integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== - dependencies: - passport-strategy "1.x.x" - pause "0.0.1" - utils-merge "^1.0.1" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@1.0.1, path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-to-regexp@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" - integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path@^0.12.7: - version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== - dependencies: - process "^0.11.1" - util "^0.10.3" - -pause@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" - integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== - -pg-connection-string@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" - integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pluralize@8.0.0, pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -pony-cause@^2.1.2: - version "2.1.10" - resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" - integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" - integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" - integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.3.11, postcss@^8.4.32, postcss@^8.4.33: - version "8.4.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier@2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" - integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process@^0.11.1: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-expr@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" - integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode@2.3.1, punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== - -qs@6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== - dependencies: - side-channel "^1.0.4" - -qs@^6.5.2: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@^2.3.3: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-dnd-html5-backend@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz#87faef15845d512a23b3c08d29ecfd34871688b6" - integrity sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw== - dependencies: - dnd-core "^16.0.1" - -react-dnd@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-16.0.1.tgz#2442a3ec67892c60d40a1559eef45498ba26fa37" - integrity sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q== - dependencies: - "@react-dnd/invariant" "^4.0.1" - "@react-dnd/shallowequal" "^4.0.1" - dnd-core "^16.0.1" - fast-deep-equal "^3.1.3" - hoist-non-react-statics "^3.3.2" - -react-dom@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-error-boundary@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" - integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== - dependencies: - "@babel/runtime" "^7.12.5" - -react-fast-compare@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== - -react-fast-compare@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.1.tgz#53933d9e14f364281d6cba24bfed7a4afb808b5f" - integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== - -react-helmet@6.1.0, react-helmet@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" - integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== - dependencies: - object-assign "^4.1.1" - prop-types "^15.7.2" - react-fast-compare "^3.1.1" - react-side-effect "^2.1.0" - -react-intl@*: - version "6.3.2" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.3.2.tgz#0816f0943690dbc6186ab1a2968eb378ba9c99f7" - integrity sha512-NT03zOHRAFGcZdTx4cXcVKZtnWBOM6RfLPK8Q67eA+Ba+pHdYb+cmrahncqAnevZKgO1r/nEauiVFKwQeudLIw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/icu-messageformat-parser" "2.3.0" - "@formatjs/intl" "2.6.9" - "@formatjs/intl-displaynames" "6.2.6" - "@formatjs/intl-listformat" "7.1.9" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/react" "16 || 17 || 18" - hoist-non-react-statics "^3.3.2" - intl-messageformat "10.3.3" - tslib "^2.4.0" - -react-intl@6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.4.1.tgz#01e4bd5497cb93d87146e966d8eda25851d4d9b6" - integrity sha512-/aT5595AEMZ+Pjmt8W2R5/ZkYJmyyd6jTzHzqhJ1LnfeG36+N5huBtykxYhHqLc1BrIRQ1fTX1orYC0Ej5ojtg== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/icu-messageformat-parser" "2.3.1" - "@formatjs/intl" "2.7.1" - "@formatjs/intl-displaynames" "6.3.1" - "@formatjs/intl-listformat" "7.2.1" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/react" "16 || 17 || 18" - hoist-non-react-statics "^3.3.2" - intl-messageformat "10.3.4" - tslib "^2.4.0" - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0, react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-query@3.39.3: - version "3.39.3" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" - integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== - dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" - -react-redux@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.1.tgz#8e740f3fd864a4cd0de5ba9cdc8ad39cc9e7c81a" - integrity sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA== - dependencies: - "@babel/runtime" "^7.12.1" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/use-sync-external-store" "^0.0.3" - hoist-non-react-statics "^3.3.2" - react-is "^18.0.0" - use-sync-external-store "^1.0.0" - -react-refresh@0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== - -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll-bar@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" - integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" - integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== - dependencies: - react-remove-scroll-bar "^2.3.3" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-remove-scroll@^2.5.9: - version "2.5.9" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz#6a38e7d46043abc2c6b0fb39db650b9f2e38be3e" - integrity sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA== - dependencies: - react-remove-scroll-bar "^2.3.6" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-router-dom@5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-select@5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" - integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== - dependencies: - "@babel/runtime" "^7.12.0" - "@emotion/cache" "^11.4.0" - "@emotion/react" "^11.8.1" - "@floating-ui/dom" "^1.0.1" - "@types/react-transition-group" "^4.4.0" - memoize-one "^6.0.0" - prop-types "^15.6.0" - react-transition-group "^4.3.0" - use-isomorphic-layout-effect "^1.1.2" - -react-side-effect@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" - integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== - -react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-transition-group@^4.3.0: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react-window@1.8.8: - version "1.8.8" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.8.tgz#1b52919f009ddf91970cbdb2050a6c7be44df243" - integrity sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^18.2.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -read-pkg-up@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -redux-thunk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" - integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== - -redux@^4.2.0, redux@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -reselect@^4.1.8: - version "4.1.8" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" - integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-path@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" - integrity sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w== - dependencies: - http-errors "~1.6.2" - path-is-absolute "1.0.1" - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.10.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.19.0, resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -rimraf@3.0.2, rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rollup@^4.2.0: - version "4.9.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.6.tgz#4515facb0318ecca254a2ee1315e22e09efc50a0" - integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.6" - "@rollup/rollup-android-arm64" "4.9.6" - "@rollup/rollup-darwin-arm64" "4.9.6" - "@rollup/rollup-darwin-x64" "4.9.6" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.6" - "@rollup/rollup-linux-arm64-gnu" "4.9.6" - "@rollup/rollup-linux-arm64-musl" "4.9.6" - "@rollup/rollup-linux-riscv64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-musl" "4.9.6" - "@rollup/rollup-win32-arm64-msvc" "4.9.6" - "@rollup/rollup-win32-ia32-msvc" "4.9.6" - "@rollup/rollup-win32-x64-msvc" "4.9.6" - fsevents "~2.3.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sanitize-html@2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.13.0.tgz#71aedcdb777897985a4ea1877bf4f895a1170dae" - integrity sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA== - dependencies: - deepmerge "^4.2.2" - escape-string-regexp "^4.0.0" - htmlparser2 "^8.0.0" - is-plain-object "^5.0.0" - parse-srcset "^1.0.2" - postcss "^8.3.11" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -scroll-into-view-if-needed@^2.2.20: - version "2.2.31" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587" - integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA== - dependencies: - compute-scroll-into-view "^1.0.20" - -"semver@2 || 3 || 4 || 5", semver@^5.7.1: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@7.5.4, semver@^7.3.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -serialize-javascript@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.11: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -sift@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" - integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -simple-update-notifier@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc" - integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew== - dependencies: - semver "~7.0.0" - -sirv@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" - integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slate-history@0.93.0: - version "0.93.0" - resolved "https://registry.yarnpkg.com/slate-history/-/slate-history-0.93.0.tgz#d2fad47e4e8b262ab7c86b653f5dd6d9b6d85277" - integrity sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g== - dependencies: - is-plain-object "^5.0.0" - -slate-react@0.98.3: - version "0.98.3" - resolved "https://registry.yarnpkg.com/slate-react/-/slate-react-0.98.3.tgz#5090d269d69186f3ec2a6b5862d2645f01772eda" - integrity sha512-p1BnF9eRyRM0i5hkgOb11KgmpWLQm9Zyp6jVkOAj5fPdIGheKhg48Z7aWKrayeJ4nmRyi/NjRZz/io5hQcphmw== - dependencies: - "@juggle/resize-observer" "^3.4.0" - "@types/is-hotkey" "^0.1.1" - "@types/lodash" "^4.14.149" - direction "^1.0.3" - is-hotkey "^0.1.6" - is-plain-object "^5.0.0" - lodash "^4.17.4" - scroll-into-view-if-needed "^2.2.20" - tiny-invariant "1.0.6" - -slate@0.94.1: - version "0.94.1" - resolved "https://registry.yarnpkg.com/slate/-/slate-0.94.1.tgz#13b0ba7d0a7eeb0ec89a87598e9111cbbd685696" - integrity sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA== - dependencies: - immer "^9.0.6" - is-plain-object "^5.0.0" - tiny-warning "^1.0.3" - -sorted-array-functions@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" - integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" - integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -strapi-plugin-rest-cache@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/strapi-plugin-rest-cache/-/strapi-plugin-rest-cache-4.2.9.tgz#f90f0e5508472438970fe5be4cc3fc04d96e753a" - integrity sha512-v9g2sCgxloX3HHBk1CIDuVPnSXVMstEYhbCDi7ZUsCRCZltzIJv6Unonc65vigopzKKYUVJnwEJQj0o/LdrLDg== - dependencies: - "@koa/router" "^10.1.1" - chalk "^4.1.2" - debug "^4.3.4" - lodash "^4.17.21" - path "^0.12.7" - strapi-provider-rest-cache-memory "^4.2.9" - -strapi-provider-rest-cache-memory@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/strapi-provider-rest-cache-memory/-/strapi-provider-rest-cache-memory-4.2.9.tgz#29b8152fc26c509b286e81388f8a07ca26f679c4" - integrity sha512-BLumxd6OwLqmlQI5HqauN6c86ig59Co8jUHTlFC5waytQM5zyOZnIt5Ody4Qdc6yeMi726EFyI7yUF7L/DaQ9A== - dependencies: - cache-manager "^3.6.0" - -strapi-typed@1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/strapi-typed/-/strapi-typed-1.0.20.tgz#dd739e2df919b3979da987e342aaf74eb75e5c9f" - integrity sha512-PZOAo38urs9mH+7zMTCqbfsQJhV2b/fJQkbzXAzyPZtRRGO/2mm9JoL3PylHKsCvj0lwQXUJhQWOtzxlmq0xgA== - dependencies: - "@strapi/plugin-graphql" "^4.25.8" - "@strapi/utils" "^4.25.8" - "@types/react" "^18.0.28" - "@types/react-intl" "^3.0.0" - -stream-events@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" - integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== - dependencies: - stubs "^3.0.0" - -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA== - -string-argv@~0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -stubs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" - integrity sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw== - -style-loader@3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" - integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== - -style-mod@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.2.tgz#ef9e14c4c67428bcf31cc886787e81ca7f8f5021" - integrity sha512-C4myMmRTO8iaC5Gg+N1ftK2WT4eXUTMAa+HEFPPrfVeO/NtqLTtAmV1HbqnuGtLwCek44Ra76fdGUkSqjiMPcQ== - -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tarn@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" - integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== - -teeny-request@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.1.1.tgz#2b0d156f4a8ad81de44303302ba8d7f1f05e20e6" - integrity sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg== - dependencies: - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.1" - stream-events "^1.0.5" - uuid "^8.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.20" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" - -terser@^5.10.0, terser@^5.26.0: - version "5.27.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" - integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tildify@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" - integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== - -tiny-invariant@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" - integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== - -tiny-invariant@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -triple-beam@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - -ts-jest@29.1.1: - version "29.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" - integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" - -ts-node@^10.7.0: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.5.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^2.18.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@^1.6.16, type-is@^1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -umzug@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.2.1.tgz#01c3a109efb037a10a317d4191be22810c37b195" - integrity sha512-XyWQowvP9CKZycKc/Zg9SYWrAWX/gJCE799AUTFqk8yC3tp44K1xWr3LoFF0MNEjClKOo1suCr5ASnoy+KltdA== - dependencies: - "@rushstack/ts-command-line" "^4.12.2" - emittery "^0.12.1" - fs-jetpack "^4.3.1" - glob "^8.0.3" - pony-cause "^2.1.2" - type-fest "^2.18.0" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unload@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-browserslist-db@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -urlgrey@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-1.0.0.tgz#72d2f904482d0b602e3c7fa599343d699bbe1017" - integrity sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w== - dependencies: - fast-url-parser "^1.1.3" - -use-callback-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" - integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== - dependencies: - tslib "^2.0.0" - -use-isomorphic-layout-effect@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -use-sync-external-store@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.0.0, uuid@^8.3.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -value-or-promise@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" - integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== - -vary@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vite@5.0.13: - version "5.0.13" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.13.tgz#605865b0e482506163e3f04f91665238f3be8cf1" - integrity sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg== - dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-keyname@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" - integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-bundle-analyzer@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" - integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - commander "^7.2.0" - debounce "^1.2.1" - escape-string-regexp "^4.0.0" - gzip-size "^6.0.0" - html-escaper "^2.0.2" - is-plain-object "^5.0.0" - opener "^1.5.2" - picocolors "^1.0.0" - sirv "^2.0.3" - ws "^7.3.1" - -webpack-dev-middleware@6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz#0463232e59b7d7330fa154121528d484d36eb973" - integrity sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ== - dependencies: - colorette "^2.0.10" - memfs "^3.4.12" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-hot-middleware@2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.26.0.tgz#0a103c9b2836c1f27d7f74bbe0e96c99c82d0265" - integrity sha512-okzjec5sAEy4t+7rzdT8eRyxsk0FDSmBPN2KwX4Qd+6+oQCfe5Ve07+u7cJvofgB+B4w5/4dO4Pz0jhhHyyPLQ== - dependencies: - ansi-html-community "0.0.8" - html-entities "^2.1.0" - strip-ansi "^6.0.0" - -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.89.0: - version "5.94.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== - dependencies: - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -winston-transport@^4.5.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" - integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== - dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" - triple-beam "^1.3.0" - -winston@3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.10.0.tgz#d033cb7bd3ced026fed13bf9d92c55b903116803" - integrity sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g== - dependencies: - "@colors/colors" "1.5.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.4.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.5.0" - -word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^7.3.1, ws@^7.4.6: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xss@^1.0.6, xss@^1.0.8: - version "1.0.13" - resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.13.tgz#6e48f616128b39f366dfadc57411e1eb5b341c6c" - integrity sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q== - dependencies: - commander "^2.20.3" - cssfilter "0.0.10" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -ylru@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" - integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yup@0.32.9: - version "0.32.9" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.9.tgz#9367bec6b1b0e39211ecbca598702e106019d872" - integrity sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg== - dependencies: - "@babel/runtime" "^7.10.5" - "@types/lodash" "^4.14.165" - lodash "^4.17.20" - lodash-es "^4.17.15" - nanoclone "^0.2.1" - property-expr "^2.0.4" - toposort "^2.0.2" + version: 5.65.18 + resolution: "codemirror@npm:5.65.18" + checksum: 10c0/806e00c7081f9a5ba6bc59205d0cf5ada273bc977da9967d04a78e94e27cdfbd41a10409fcf74eea4b12eebe1972e05120771780729a8bc04eef14b1ed20ac98 + languageName: node + linkType: hard + +"codemirror@npm:^6.0.0": + version: 6.0.1 + resolution: "codemirror@npm:6.0.1" + dependencies: + "@codemirror/autocomplete": "npm:^6.0.0" + "@codemirror/commands": "npm:^6.0.0" + "@codemirror/language": "npm:^6.0.0" + "@codemirror/lint": "npm:^6.0.0" + "@codemirror/search": "npm:^6.0.0" + "@codemirror/state": "npm:^6.0.0" + "@codemirror/view": "npm:^6.0.0" + checksum: 10c0/219b0f6ee91d373380fba2e0564a2665990a3cdada0b01861768005b09061187c58eeb3db96aef486777b02b77b50a50ee843635e3743c47d3725034913c4b60 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-string@npm:^1.6.0, color-string@npm:^1.9.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.3" + color-string: "npm:^1.6.0" + checksum: 10c0/39345d55825884c32a88b95127d417a2c24681d8b57069413596d9fcbb721459ef9d9ec24ce3e65527b5373ce171b73e38dbcd9c830a52a6487e7f37bf00e83c + languageName: node + linkType: hard + +"color@npm:^4.2.3": + version: 4.2.3 + resolution: "color@npm:4.2.3" + dependencies: + color-convert: "npm:^2.0.1" + color-string: "npm:^1.9.0" + checksum: 10c0/7fbe7cfb811054c808349de19fb380252e5e34e61d7d168ec3353e9e9aacb1802674bddc657682e4e9730c2786592a4de6f8283e7e0d3870b829bb0b7b2f6118 + languageName: node + linkType: hard + +"colorette@npm:2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 10c0/2bcc9134095750fece6e88167011499b964b78bf0ea953469130ddb1dba3c8fe6c03debb0ae181e710e2be10900d117460f980483a7df4ba4a1bac3b182ecb64 + languageName: node + linkType: hard + +"colorette@npm:^2.0.10": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: "npm:^3.1.3" + text-hex: "npm:1.0.x" + checksum: 10c0/af5f91ff7f8e146b96e439ac20ed79b197210193bde721b47380a75b21751d90fa56390c773bb67c0aedd34ff85091883a437ab56861c779bd507d639ba7e123 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 + languageName: node + linkType: hard + +"commander@npm:8.3.0, commander@npm:^8.3.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + languageName: node + linkType: hard + +"commander@npm:^2.20.0, commander@npm:^2.20.3": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a + languageName: node + linkType: hard + +"compressible@npm:^2.0.18": + version: 2.0.18 + resolution: "compressible@npm:2.0.18" + dependencies: + mime-db: "npm:>= 1.43.0 < 2" + checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 + languageName: node + linkType: hard + +"compute-scroll-into-view@npm:^1.0.20": + version: 1.0.20 + resolution: "compute-scroll-into-view@npm:1.0.20" + checksum: 10c0/19034322590bfce59cb6939b3603e7aaf6f0d4128b8627bbc136e71c8714905e2f8bf2ba0cb7f153c6e8cdb8ad907ffd6d0188ccc7625dc05790a59ae6a81f01 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concurrently@npm:8.2.2, concurrently@npm:^8.2.2": + version: 8.2.2 + resolution: "concurrently@npm:8.2.2" + dependencies: + chalk: "npm:^4.1.2" + date-fns: "npm:^2.30.0" + lodash: "npm:^4.17.21" + rxjs: "npm:^7.8.1" + shell-quote: "npm:^1.8.1" + spawn-command: "npm:0.0.2" + supports-color: "npm:^8.1.1" + tree-kill: "npm:^1.2.2" + yargs: "npm:^17.7.2" + bin: + conc: dist/bin/concurrently.js + concurrently: dist/bin/concurrently.js + checksum: 10c0/0e9683196fe9c071d944345d21d8f34aa6c0cc50c0dd897e95619f2f1c9eb4871dca851b2569da17888235b7335b4c821ca19deed35bebcd9a131ee5d247f34c + languageName: node + linkType: hard + +"config-chain@npm:^1.1.11": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" + dependencies: + ini: "npm:^1.3.4" + proto-list: "npm:~1.2.1" + checksum: 10c0/39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e + languageName: node + linkType: hard + +"configstore@npm:5.0.1": + version: 5.0.1 + resolution: "configstore@npm:5.0.1" + dependencies: + dot-prop: "npm:^5.2.0" + graceful-fs: "npm:^4.1.2" + make-dir: "npm:^3.0.0" + unique-string: "npm:^2.0.0" + write-file-atomic: "npm:^3.0.0" + xdg-basedir: "npm:^4.0.0" + checksum: 10c0/5af23830e78bdc56cbe92a2f81e87f1d3a39e96e51a0ab2a8bc79bbbc5d4440a48d92833b3fd9c6d34b4a9c4c5853c8487b8e6e68593e7ecbc7434822f7aced3 + languageName: node + linkType: hard + +"constant-case@npm:^2.0.0": + version: 2.0.0 + resolution: "constant-case@npm:2.0.0" + dependencies: + snake-case: "npm:^2.1.0" + upper-case: "npm:^1.1.1" + checksum: 10c0/795142a64dd61da267e937502a1ce060abdbc42d4f68367d08f1de34fc06a1db240ac09658275122f8e171448b19a4645b023ee8229803def1a11559e80b6132 + languageName: node + linkType: hard + +"constant-case@npm:^3.0.4": + version: 3.0.4 + resolution: "constant-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case: "npm:^2.0.2" + checksum: 10c0/91d54f18341fcc491ae66d1086642b0cc564be3e08984d7b7042f8b0a721c8115922f7f11d6a09f13ed96ff326eabae11f9d1eb0335fa9d8b6e39e4df096010e + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4, content-disposition@npm:~0.5.2": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb + languageName: node + linkType: hard + +"content-type@npm:^1.0.4, content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"convert-source-map@npm:^1.5.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 + languageName: node + linkType: hard + +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde + languageName: node + linkType: hard + +"cookies@npm:~0.9.0": + version: 0.9.1 + resolution: "cookies@npm:0.9.1" + dependencies: + depd: "npm:~2.0.0" + keygrip: "npm:~1.1.0" + checksum: 10c0/3ffa1c0e992b62ee119adae4dd2ddd4a89166fa5434cd9bd9ff84ec4d2f14dfe2318a601280abfe32a4f64f884ec9345fb1912e488b002d188d2efa0d3919ba3 + languageName: node + linkType: hard + +"copy-to@npm:^2.0.1": + version: 2.0.1 + resolution: "copy-to@npm:2.0.1" + checksum: 10c0/ee10fa7ab257ccc1fada75d8571312f7a7eb2fa6a3129d89c6e3afc9884e0eb0cbb79140a92671fd3e35fa285b1e7f27f5422f885494ff14cf4c8c56e62d9daf + languageName: node + linkType: hard + +"copyfiles@npm:2.4.1": + version: 2.4.1 + resolution: "copyfiles@npm:2.4.1" + dependencies: + glob: "npm:^7.0.5" + minimatch: "npm:^3.0.3" + mkdirp: "npm:^1.0.4" + noms: "npm:0.0.0" + through2: "npm:^2.0.1" + untildify: "npm:^4.0.0" + yargs: "npm:^16.1.0" + bin: + copyfiles: copyfiles + copyup: copyfiles + checksum: 10c0/e65cd055ec9acc14997b0ace83973d73f8d9c68167cbf4293c40b52d100af09a8c8da329042d52dc33422c0a8cbf74c6efb25e9ae088667721653659bd67bf57 + languageName: node + linkType: hard + +"core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.30.2": + version: 3.39.0 + resolution: "core-js-pure@npm:3.39.0" + checksum: 10c0/5d954e467703ea1e860eb070bd72cf9dc5bfddd7037c09d750f0eba3ffc4066db741a595af86dc833a709929e161a909e48da3cbdd2d9bee7795cb516dc9f7d4 + languageName: node + linkType: hard + +"core-util-is@npm:^1.0.2, core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"cors@npm:^2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: "npm:^4" + vary: "npm:^1" + checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.0.0, cosmiconfig@npm:^7.0.1": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + languageName: node + linkType: hard + +"crc@npm:^3.8.0": + version: 3.8.0 + resolution: "crc@npm:3.8.0" + dependencies: + buffer: "npm:^5.1.0" + checksum: 10c0/1a0da36e5f95b19cd2a7b2eab5306a08f1c47bdd22da6f761ab764e2222e8e90a877398907cea94108bd5e41a6d311ea84d7914eaca67da2baa4050bd6384b3d + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"crelt@npm:^1.0.5": + version: 1.0.6 + resolution: "crelt@npm:1.0.6" + checksum: 10c0/e0fb76dff50c5eb47f2ea9b786c17f9425c66276025adee80876bdbf4a84ab72e899e56d3928431ab0cb057a105ef704df80fe5726ef0f7b1658f815521bdf09 + languageName: node + linkType: hard + +"cron-parser@npm:^4.2.0": + version: 4.9.0 + resolution: "cron-parser@npm:4.9.0" + dependencies: + luxon: "npm:^3.2.1" + checksum: 10c0/348622bdcd1a15695b61fc33af8a60133e5913a85cf99f6344367579e7002896514ba3b0a9d6bb569b02667d6b06836722bf2295fcd101b3de378f71d37bed0b + languageName: node + linkType: hard + +"cropperjs@npm:1.6.1": + version: 1.6.1 + resolution: "cropperjs@npm:1.6.1" + checksum: 10c0/53a2e3af688cb3307eb0cd9b39e8009c5bdbf1d2a78317f07c506f741e27df0fd35d3dd2f6a17509e59949866735eb25808f277988fb1658365541423e30b1a6 + languageName: node + linkType: hard + +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: "npm:^7.0.1" + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: 10c0/f3765c25746c69fcca369655c442c6c886e54ccf3ab8c16847d5ad0e91e2f337d36eedc6599c1227904bf2a228d721e690324446876115bc8e7b32a866735ecf + languageName: node + linkType: hard + +"cross-inspect@npm:1.0.1": + version: 1.0.1 + resolution: "cross-inspect@npm:1.0.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/2493ee47a801b46ede1c42ca6242b8d2059f7319b5baf23887bbaf46a6ea8e536d2e271d0990176c05092f67b32d084ffd8c93e7c1227eff4a06cceadb49af47 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.3": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"crypto-random-string@npm:^2.0.0": + version: 2.0.0 + resolution: "crypto-random-string@npm:2.0.0" + checksum: 10c0/288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 + languageName: node + linkType: hard + +"css-color-keywords@npm:^1.0.0": + version: 1.0.0 + resolution: "css-color-keywords@npm:1.0.0" + checksum: 10c0/af205a86c68e0051846ed91eb3e30b4517e1904aac040013ff1d742019b3f9369ba5658ba40901dbbc121186fc4bf0e75a814321cc3e3182fbb2feb81c6d9cb7 + languageName: node + linkType: hard + +"css-loader@npm:^6.10.0": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: "npm:^5.1.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" + postcss-modules-values: "npm:^4.0.0" + postcss-value-parser: "npm:^4.2.0" + semver: "npm:^7.5.4" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/bb52434138085fed06a33e2ffbdae9ee9014ad23bf60f59d6b7ee67f28f26c6b1764024d3030bd19fd884d6ee6ee2224eaed64ad19eb18fbbb23d148d353a965 + languageName: node + linkType: hard + +"css-select@npm:^4.1.3": + version: 4.3.0 + resolution: "css-select@npm:4.3.0" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.0.1" + domhandler: "npm:^4.3.1" + domutils: "npm:^2.8.0" + nth-check: "npm:^2.0.1" + checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 + languageName: node + linkType: hard + +"css-to-react-native@npm:3.2.0": + version: 3.2.0 + resolution: "css-to-react-native@npm:3.2.0" + dependencies: + camelize: "npm:^1.0.0" + css-color-keywords: "npm:^1.0.0" + postcss-value-parser: "npm:^4.0.2" + checksum: 10c0/fde850a511d5d3d7c55a1e9b8ed26b69a8ad4868b3487e36ebfbfc0b96fc34bc977d9cd1d61a289d0c74d3f9a662d8cee297da53d4433bf2e27d6acdff8e1003 + languageName: node + linkType: hard + +"css-what@npm:^6.0.1": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"cssfilter@npm:0.0.10": + version: 0.0.10 + resolution: "cssfilter@npm:0.0.10" + checksum: 10c0/478a227a616fb6e9bb338eb95f690df141b86231ec737cbea574484f31a09a51db894b4921afc4987459dae08d584355fd689ff2a7a7c7a74de4bb4c072ce553 + languageName: node + linkType: hard + +"csstype@npm:3.1.3, csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + +"custom-media-element@npm:~1.3.1": + version: 1.3.3 + resolution: "custom-media-element@npm:1.3.3" + checksum: 10c0/21c4f3a4b016e4b32d7a3b8d6e1f0a9bc72a6f5ff8f3bc0df30930aadd7437d14da935d9988946a68a8cdfa218be946fd131e7d5c4fb14b612593254accc96b6 + languageName: node + linkType: hard + +"custom-media-element@npm:~1.4.1": + version: 1.4.1 + resolution: "custom-media-element@npm:1.4.1" + checksum: 10c0/250d1f6eef50ed59a840653e5be95c230159615e46c4fb8e0220300aa70fac677b9545a7b69b99ca691e0b59b04728a3ab7f23199c19583f0716963a3e6f8250 + languageName: node + linkType: hard + +"date-fns-tz@npm:2.0.1": + version: 2.0.1 + resolution: "date-fns-tz@npm:2.0.1" + peerDependencies: + date-fns: 2.x + checksum: 10c0/f860dda9e3d38bc99dc325c678cafb94b3a18c12b1fea0e2f4e451396ea6c4cacced683066c669a67ec380f64fdda83aa4c414a207029b647faa2b76b2a5c6e3 + languageName: node + linkType: hard + +"date-fns@npm:2.30.0, date-fns@npm:^2.30.0": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": "npm:^7.21.0" + checksum: 10c0/e4b521fbf22bc8c3db332bbfb7b094fd3e7627de0259a9d17c7551e2d2702608a7307a449206065916538e384f37b181565447ce2637ae09828427aed9cb5581 + languageName: node + linkType: hard + +"debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 10c0/6c9320aa0973fc42050814621a7a8a78146c1975799b5b3cc1becf1f77ba9a5aa583987884230da0842a03f385def452fad5d60db97c3d1c8b824e38a8edf500 + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + languageName: node + linkType: hard + +"debug@npm:4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"debug@npm:^3.1.0, debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"decompress-response@npm:^7.0.0": + version: 7.0.0 + resolution: "decompress-response@npm:7.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/925d5a34c9ae2c5026748feff4cbf1310b044be31618b188f1fe9f4ddfda4e013ebeeb0a7ec6d251095542ed3b3b879dac168e54cc65e5a82fb88ea0b287a788 + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10c0/d94bde6e6f780be4da4fd760288fcf755ec368872f4ac5218197200d86430aeb8d90a003a840bff1c20221188e3f23adced0119cb811c6873c70d0ac66d12832 + languageName: node + linkType: hard + +"deep-equal@npm:~1.0.1": + version: 1.0.1 + resolution: "deep-equal@npm:1.0.1" + checksum: 10c0/bef838ef9824e124d10335deb9c7540bfc9f2f0eab17ad1bb870d0eee83ee4e7e6f6f892e5eebc2bd82759a76676926ad5246180097e28e57752176ff7dae888 + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"deepmerge@npm:^2.1.1": + version: 2.2.1 + resolution: "deepmerge@npm:2.2.1" + checksum: 10c0/4379288cabd817587cee92a095ea65d18317b45e48010a2e0d87982b5f432239a144f9c8ebd4ab090cc21f0cb47e51ebfe32921f329b3b3084a2711d5d63e450 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"del@npm:^5.1.0": + version: 5.1.0 + resolution: "del@npm:5.1.0" + dependencies: + globby: "npm:^10.0.1" + graceful-fs: "npm:^4.2.2" + is-glob: "npm:^4.0.1" + is-path-cwd: "npm:^2.2.0" + is-path-inside: "npm:^3.0.1" + p-map: "npm:^3.0.0" + rimraf: "npm:^3.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/1c25de7ff7cf4a8ee017190e39e05d2c4e19774802213d210daaa627228b50e0f5b04e7ce8cceaf03647b238732f78dc303ec5a9d54d5104de33a13fb5a899cf + languageName: node + linkType: hard + +"del@npm:^7.1.0": + version: 7.1.0 + resolution: "del@npm:7.1.0" + dependencies: + globby: "npm:^13.1.2" + graceful-fs: "npm:^4.2.10" + is-glob: "npm:^4.0.3" + is-path-cwd: "npm:^3.0.0" + is-path-inside: "npm:^4.0.0" + p-map: "npm:^5.5.0" + rimraf: "npm:^3.0.2" + slash: "npm:^4.0.0" + checksum: 10c0/5ad2777b69e386b414ba77f5eba23bb52422c096f4c084c0d1d829ee4776d1a025a6f69765906907c4137026e9bd071ee9d422fd531b1417ef546adc7eb6fada + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"delegates@npm:1.0.0, delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:^2.0.0, depd@npm:~2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 + languageName: node + linkType: hard + +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + +"destroy@npm:1.2.0, destroy@npm:^1.0.4": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 + languageName: node + linkType: hard + +"detect-file@npm:^1.0.0": + version: 1.0.0 + resolution: "detect-file@npm:1.0.0" + checksum: 10c0/c782a5f992047944c39d337c82f5d1d21d65d1378986d46c354df9d9ec6d5f356bca0182969c11b08b9b8a7af8727b3c2d5a9fad0b022be4a3bf4c216f63ed07 + languageName: node + linkType: hard + +"detect-indent@npm:^6.0.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: 10c0/dd83cdeda9af219cf77f5e9a0dc31d828c045337386cfb55ce04fad94ba872ee7957336834154f7647b89b899c3c7acc977c57a79b7c776b506240993f97acc7 + languageName: node + linkType: hard + +"detect-indent@npm:^7.0.1": + version: 7.0.1 + resolution: "detect-indent@npm:7.0.1" + checksum: 10c0/47b6e3e3dda603c386e73b129f3e84844ae59bc2615f5072becf3cc02eab400bed5a4e6379c49d0b18cf630e80c2b07e87e0038b777addbc6ef793ad77dd05bc + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.2": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"detect-newline@npm:^4.0.0": + version: 4.0.1 + resolution: "detect-newline@npm:4.0.1" + checksum: 10c0/1cc1082e88ad477f30703ae9f23bd3e33816ea2db6a35333057e087d72d466f5a777809b71f560118ecff935d2c712f5b59e1008a8b56a900909d8fd4621c603 + languageName: node + linkType: hard + +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10c0/e562f00de23f10c27d7119e1af0e7388407eb4b06596a25f6d79a360094a109ff285de317f02b090faae093d314cf6e73ac3214f8a5bb3a0def5bece94557fbe + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4, detect-node@npm:^2.1.0": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"dezalgo@npm:^1.0.4": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: "npm:^2.0.0" + wrappy: "npm:1" + checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"direction@npm:^1.0.3": + version: 1.0.4 + resolution: "direction@npm:1.0.4" + bin: + direction: cli.js + checksum: 10c0/2257006edba01b3294322311a212a3f0e7c656d710ab164fd95123a2a9daaec536252c60da6a9df5be2bb89e9030684e9d1c7804fe82c9b3f510c2f737adeada + languageName: node + linkType: hard + +"dkim-signer@npm:0.2.2": + version: 0.2.2 + resolution: "dkim-signer@npm:0.2.2" + dependencies: + libmime: "npm:^2.0.3" + checksum: 10c0/f4268f812bfa34f714eefae33502e588f332db2e7f4e8f5df76852e6ad982660635076c78ffa4d48cd2406c90b2f76267fa5d65c541e9d6fedcad7ccc1bb6461 + languageName: node + linkType: hard + +"dnd-core@npm:^16.0.1": + version: 16.0.1 + resolution: "dnd-core@npm:16.0.1" + dependencies: + "@react-dnd/asap": "npm:^5.0.1" + "@react-dnd/invariant": "npm:^4.0.1" + redux: "npm:^4.2.0" + checksum: 10c0/6b852c576c88b0a42e618efb37e046334f5e9914b8d38ad139933dd9595b6caf2a484953a6301094d23119c17479549553d71e92fd77fa37318122ea1e579f65 + languageName: node + linkType: hard + +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 10c0/b2c2eda4fae568977cdac27a9f0c001edf4f95a6a6191dfa611e3721db2478d1badc01db5bb4fa8a848aeee13e442a6c2a4386d65ec65a1436f24715a2f8d053 + languageName: node + linkType: hard + +"dom-converter@npm:^0.2.0": + version: 0.2.0 + resolution: "dom-converter@npm:0.2.0" + dependencies: + utila: "npm:~0.4" + checksum: 10c0/e96aa63bd8c6ee3cd9ce19c3aecfc2c42e50a460e8087114794d4f5ecf3a4f052b34ea3bf2d73b5d80b4da619073b49905e6d7d788ceb7814ca4c29be5354a11 + languageName: node + linkType: hard + +"dom-helpers@npm:^5.0.1": + version: 5.2.1 + resolution: "dom-helpers@npm:5.2.1" + dependencies: + "@babel/runtime": "npm:^7.8.7" + csstype: "npm:^3.0.2" + checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + entities: "npm:^4.2.0" + checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: "npm:^2.3.0" + checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a + languageName: node + linkType: hard + +"domutils@npm:^2.5.2, domutils@npm:^2.8.0": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db + languageName: node + linkType: hard + +"domutils@npm:^3.0.1": + version: 3.1.0 + resolution: "domutils@npm:3.1.0" + dependencies: + dom-serializer: "npm:^2.0.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + checksum: 10c0/342d64cf4d07b8a0573fb51e0a6312a88fb520c7fefd751870bf72fa5fc0f2e0cb9a3958a573610b1d608c6e2a69b8e9b4b40f0bfb8f87a71bce4f180cca1887 + languageName: node + linkType: hard + +"dot-case@npm:^2.1.0": + version: 2.1.1 + resolution: "dot-case@npm:2.1.1" + dependencies: + no-case: "npm:^2.2.0" + checksum: 10c0/6859ba3bfe3106388c05eba9bec709856bbc9917d2c081aed5d268a2afc73b03bc062ea19925e29bdd482f6a8c032ae7a7d73f75c12d4159978e809b9418f7ef + languageName: node + linkType: hard + +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 + languageName: node + linkType: hard + +"dot-prop@npm:^5.2.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 10c0/93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 + languageName: node + linkType: hard + +"dotenv@npm:16.4.5": + version: 16.4.5 + resolution: "dotenv@npm:16.4.5" + checksum: 10c0/48d92870076832af0418b13acd6e5a5a3e83bb00df690d9812e94b24aff62b88ade955ac99a05501305b8dc8f1b0ee7638b18493deb6fe93d680e5220936292f + languageName: node + linkType: hard + +"dset@npm:^3.1.2": + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: 10c0/b67bbd28dd8a539e90c15ffb61100eb64ef995c5270a124d4f99bbb53f4d82f55a051b731ba81f3215dd9dce2b4c8d69927dc20b3be1c5fc88bab159467aa438 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "dunder-proto@npm:1.0.0" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/b321e5cbf64f0a4c786b0b3dc187eb5197a83f6e05a1e11b86db25251b3ae6747c4b805d9e0a4fbf481d22a86a539dc75f82d883daeac7fc2ce4bd72ff5ef5a2 + languageName: node + linkType: hard + +"duplexer@npm:^0.1.2": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + +"ejs@npm:^3.1.10": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: "npm:^10.8.5" + bin: + ejs: bin/cli.js + checksum: 10c0/52eade9e68416ed04f7f92c492183340582a36482836b11eab97b159fcdcfdedc62233a1bf0bf5e5e1851c501f2dca0e2e9afd111db2599e4e7f53ee29429ae1 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.41": + version: 1.5.73 + resolution: "electron-to-chromium@npm:1.5.73" + checksum: 10c0/b97118d469f2b3b7a816932004cd36d82879829904ca4a8daf70eaefbe686a23afa6e39e0ad0cdc39d00a9ebab97160d072b786fdeb6964f13fb15aa688958f1 + languageName: node + linkType: hard + +"emittery@npm:^0.13.0, emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.4.0 + resolution: "emoji-regex@npm:10.4.0" + checksum: 10c0/a3fcedfc58bfcce21a05a5f36a529d81e88d602100145fcca3dc6f795e3c8acc4fc18fe773fbf9b6d6e9371205edb3afa2668ec3473fa2aa7fd47d2a9d46482d + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f + languageName: node + linkType: hard + +"encodeurl@npm:^1.0.2, encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec + languageName: node + linkType: hard + +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 + languageName: node + linkType: hard + +"entities@npm:^4.2.0, entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"entities@npm:~2.1.0": + version: 2.1.0 + resolution: "entities@npm:2.1.0" + checksum: 10c0/dd96ed95f7e017b7fbbcdd39bd6dc3dea6638f747c00610b53f23ea461ac409af87670f313805d85854bfce04f96e17d83575f75b3b2920365d78678ccd2a405 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"error-stack-parser@npm:^2.0.6": + version: 2.1.4 + resolution: "error-stack-parser@npm:2.1.4" + dependencies: + stackframe: "npm:^1.3.4" + checksum: 10c0/7679b780043c98b01fc546725484e0cfd3071bf5c906bbe358722972f04abf4fc3f0a77988017665bab367f6ef3fc2d0185f7528f45966b83e7c99c02d5509b9 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: 10c0/300a469488c2f22081df1e4c8398c78db92358496e639b0df7f89ac6455462aaf5d8893939087c1a1cbcbf20eed4610c70e0bcb8f3e4b0d80a5d2611c539408c + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 + languageName: node + linkType: hard + +"es6-error@npm:^4.1.1": + version: 4.1.1 + resolution: "es6-error@npm:4.1.1" + checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef + languageName: node + linkType: hard + +"esbuild-loader@npm:^2.21.0": + version: 2.21.0 + resolution: "esbuild-loader@npm:2.21.0" + dependencies: + esbuild: "npm:^0.16.17" + joycon: "npm:^3.0.1" + json5: "npm:^2.2.0" + loader-utils: "npm:^2.0.0" + tapable: "npm:^2.2.0" + webpack-sources: "npm:^1.4.3" + peerDependencies: + webpack: ^4.40.0 || ^5.0.0 + checksum: 10c0/459687e7cf5353433483e607ccca4357046a6698144df82ac63e69bd77f683e374de3b463b8b6e7ac94d79f27992d45f60885bbc9c347bca7da61c5a3fa3c66b + languageName: node + linkType: hard + +"esbuild-register@npm:3.5.0": + version: 3.5.0 + resolution: "esbuild-register@npm:3.5.0" + dependencies: + debug: "npm:^4.3.4" + peerDependencies: + esbuild: ">=0.12 <1" + checksum: 10c0/9ccd0573cb66018e4cce3c1416eed0f5f3794c7026ce469a94e2f8761335abed8e363fc8e8bb036ab9ad7e579bb4296b8568a04ae5626596c123576b0d9c9bde + languageName: node + linkType: hard + +"esbuild@npm:0.20.2, esbuild@npm:^0.20.1": + version: 0.20.2 + resolution: "esbuild@npm:0.20.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.20.2" + "@esbuild/android-arm": "npm:0.20.2" + "@esbuild/android-arm64": "npm:0.20.2" + "@esbuild/android-x64": "npm:0.20.2" + "@esbuild/darwin-arm64": "npm:0.20.2" + "@esbuild/darwin-x64": "npm:0.20.2" + "@esbuild/freebsd-arm64": "npm:0.20.2" + "@esbuild/freebsd-x64": "npm:0.20.2" + "@esbuild/linux-arm": "npm:0.20.2" + "@esbuild/linux-arm64": "npm:0.20.2" + "@esbuild/linux-ia32": "npm:0.20.2" + "@esbuild/linux-loong64": "npm:0.20.2" + "@esbuild/linux-mips64el": "npm:0.20.2" + "@esbuild/linux-ppc64": "npm:0.20.2" + "@esbuild/linux-riscv64": "npm:0.20.2" + "@esbuild/linux-s390x": "npm:0.20.2" + "@esbuild/linux-x64": "npm:0.20.2" + "@esbuild/netbsd-x64": "npm:0.20.2" + "@esbuild/openbsd-x64": "npm:0.20.2" + "@esbuild/sunos-x64": "npm:0.20.2" + "@esbuild/win32-arm64": "npm:0.20.2" + "@esbuild/win32-ia32": "npm:0.20.2" + "@esbuild/win32-x64": "npm:0.20.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/66398f9fb2c65e456a3e649747b39af8a001e47963b25e86d9c09d2a48d61aa641b27da0ce5cad63df95ad246105e1d83e7fee0e1e22a0663def73b1c5101112 + languageName: node + linkType: hard + +"esbuild@npm:0.21.3": + version: 0.21.3 + resolution: "esbuild@npm:0.21.3" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.3" + "@esbuild/android-arm": "npm:0.21.3" + "@esbuild/android-arm64": "npm:0.21.3" + "@esbuild/android-x64": "npm:0.21.3" + "@esbuild/darwin-arm64": "npm:0.21.3" + "@esbuild/darwin-x64": "npm:0.21.3" + "@esbuild/freebsd-arm64": "npm:0.21.3" + "@esbuild/freebsd-x64": "npm:0.21.3" + "@esbuild/linux-arm": "npm:0.21.3" + "@esbuild/linux-arm64": "npm:0.21.3" + "@esbuild/linux-ia32": "npm:0.21.3" + "@esbuild/linux-loong64": "npm:0.21.3" + "@esbuild/linux-mips64el": "npm:0.21.3" + "@esbuild/linux-ppc64": "npm:0.21.3" + "@esbuild/linux-riscv64": "npm:0.21.3" + "@esbuild/linux-s390x": "npm:0.21.3" + "@esbuild/linux-x64": "npm:0.21.3" + "@esbuild/netbsd-x64": "npm:0.21.3" + "@esbuild/openbsd-x64": "npm:0.21.3" + "@esbuild/sunos-x64": "npm:0.21.3" + "@esbuild/win32-arm64": "npm:0.21.3" + "@esbuild/win32-ia32": "npm:0.21.3" + "@esbuild/win32-x64": "npm:0.21.3" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/5bf85ccd11cc7e7fbbb7ca3458a0fa019ec9b38e1ed9e61f0866b29419e7348231da0aa336e4645c3bda8e757fa20bd3fd8a5f73256308488086a6c7ec9b6ac5 + languageName: node + linkType: hard + +"esbuild@npm:^0.16.17": + version: 0.16.17 + resolution: "esbuild@npm:0.16.17" + dependencies: + "@esbuild/android-arm": "npm:0.16.17" + "@esbuild/android-arm64": "npm:0.16.17" + "@esbuild/android-x64": "npm:0.16.17" + "@esbuild/darwin-arm64": "npm:0.16.17" + "@esbuild/darwin-x64": "npm:0.16.17" + "@esbuild/freebsd-arm64": "npm:0.16.17" + "@esbuild/freebsd-x64": "npm:0.16.17" + "@esbuild/linux-arm": "npm:0.16.17" + "@esbuild/linux-arm64": "npm:0.16.17" + "@esbuild/linux-ia32": "npm:0.16.17" + "@esbuild/linux-loong64": "npm:0.16.17" + "@esbuild/linux-mips64el": "npm:0.16.17" + "@esbuild/linux-ppc64": "npm:0.16.17" + "@esbuild/linux-riscv64": "npm:0.16.17" + "@esbuild/linux-s390x": "npm:0.16.17" + "@esbuild/linux-x64": "npm:0.16.17" + "@esbuild/netbsd-x64": "npm:0.16.17" + "@esbuild/openbsd-x64": "npm:0.16.17" + "@esbuild/sunos-x64": "npm:0.16.17" + "@esbuild/win32-arm64": "npm:0.16.17" + "@esbuild/win32-ia32": "npm:0.16.17" + "@esbuild/win32-x64": "npm:0.16.17" + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/c2aaef0d2369349b2ef40c0115c2d2030ed7d7341cc91d26af3e243218ecec972f8f1243d5ce8e9a4c80b29439b89dff44c658e57c696d3b07e9074a77878b49 + languageName: node + linkType: hard + +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + +"escape-string-regexp@npm:5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + +"esm@npm:^3.2.25": + version: 3.2.25 + resolution: "esm@npm:3.2.25" + checksum: 10c0/8e60e8075506a7ce28681c30c8f54623fe18a251c364cd481d86719fc77f58aa055b293d80632d9686d5408aaf865ffa434897dc9fd9153c8b3f469fad23f094 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"eventsource@npm:2.0.2": + version: 2.0.2 + resolution: "eventsource@npm:2.0.2" + checksum: 10c0/0b8c70b35e45dd20f22ff64b001be9d530e33b92ca8bdbac9e004d0be00d957ab02ef33c917315f59bf2f20b178c56af85c52029bc8e6cc2d61c31d87d943573 + languageName: node + linkType: hard + +"execa@npm:5.1.1, execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"execa@npm:^9.3.1": + version: 9.5.2 + resolution: "execa@npm:9.5.2" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.3" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.0" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.0.0" + checksum: 10c0/94782a6282e03253224406c29068d18f9095cc251a45d1f19ac3d8f2a9db2cbe32fb8ceb039db1451d8fce3531135a6c0c559f76d634f85416268fc4a6995365 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + +"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": + version: 2.0.2 + resolution: "expand-tilde@npm:2.0.2" + dependencies: + homedir-polyfill: "npm:^1.0.1" + checksum: 10c0/205a60497422746d1c3acbc1d65bd609b945066f239a2b785e69a7a651ac4cbeb4e08555b1ea0023abbe855e6fcb5bbf27d0b371367fdccd303d4fb2b4d66845 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"express@npm:^4.17.1": + version: 4.21.2 + resolution: "express@npm:4.21.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.3" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.7.1" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.3.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.3" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.12" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.13.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10c0/38168fd0a32756600b56e6214afecf4fc79ec28eca7f7a91c2ab8d50df4f47562ca3f9dee412da7f5cea6b1a1544b33b40f9f8586dbacfbdada0fe90dbb10a1f + languageName: node + linkType: hard + +"extend@npm:^3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 + languageName: node + linkType: hard + +"external-editor@npm:^3.0.3, external-editor@npm:^3.1.0": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 + languageName: node + linkType: hard + +"fast-deep-equal@npm:3.1.3, fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-safe-stringify@npm:2.1.1": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: 10c0/d90ec1c963394919828872f21edaa3ad6f1dddd288d2bd4e977027afff09f5db40f94e39536d4646f7e01761d704d72d51dce5af1b93717f3489ef808f5f4e4d + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10c0/4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 + languageName: node + linkType: hard + +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10c0/426b1de3944a3d153b053f1c0ebfd02dccd0308a4f9e832ad220707a6d1f1b3c9784d6cadf6b2f68f09a57565f63ebc7bcdc913ccf8012d834f472c46e596f41 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f + languageName: node + linkType: hard + +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: 10c0/1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa + languageName: node + linkType: hard + +"find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: "npm:^3.0.0" + checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"find-yarn-workspace-root2@npm:1.2.16": + version: 1.2.16 + resolution: "find-yarn-workspace-root2@npm:1.2.16" + dependencies: + micromatch: "npm:^4.0.2" + pkg-dir: "npm:^4.2.0" + checksum: 10c0/d576067c7823de517d71831eafb5f6dc60554335c2d14445708f2698551b234f89c976a7f259d9355a44e417c49e7a93b369d0474579af02bbe2498f780c92d3 + languageName: node + linkType: hard + +"findup-sync@npm:^5.0.0": + version: 5.0.0 + resolution: "findup-sync@npm:5.0.0" + dependencies: + detect-file: "npm:^1.0.0" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.4" + resolve-dir: "npm:^1.0.1" + checksum: 10c0/bbdb8af8c86a0bde4445e2f738003b92e4cd2a4539a5b45199d0252f2f504aeaf19aeca1fac776c3632c60657b2659151e72c8ead29a79617459a57419a0920b + languageName: node + linkType: hard + +"fined@npm:^2.0.0": + version: 2.0.0 + resolution: "fined@npm:2.0.0" + dependencies: + expand-tilde: "npm:^2.0.2" + is-plain-object: "npm:^5.0.0" + object.defaults: "npm:^1.1.0" + object.pick: "npm:^1.3.0" + parse-filepath: "npm:^1.0.2" + checksum: 10c0/0a06efeb0ede9a4e392e3a1295d238cfdb17ac0bffb0983656d34bc10dd41ffb468dc8077e0f8c140a989ec827e4a729ab77db517c1cb8f3497305710f3747e2 + languageName: node + linkType: hard + +"flagged-respawn@npm:^2.0.0": + version: 2.0.0 + resolution: "flagged-respawn@npm:2.0.0" + checksum: 10c0/630c8ce4e6dc6425d98d31a533af8a012187904bbd0ce0afebc9bf25c47da7b27901f75fca2da5ab37fc8d77109dc5da3ddab98ab400f9d9f985871513e2692a + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a + languageName: node + linkType: hard + +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + languageName: node + linkType: hard + +"for-in@npm:^1.0.1": + version: 1.0.2 + resolution: "for-in@npm:1.0.2" + checksum: 10c0/42bb609d564b1dc340e1996868b67961257fd03a48d7fdafd4f5119530b87f962be6b4d5b7e3a3fc84c9854d149494b1d358e0b0ce9837e64c4c6603a49451d6 + languageName: node + linkType: hard + +"for-own@npm:^1.0.0": + version: 1.0.0 + resolution: "for-own@npm:1.0.0" + dependencies: + for-in: "npm:^1.0.1" + checksum: 10c0/ca475bc22935edf923631e9e23588edcbed33a30f0c81adc98e2c7df35db362ec4f4b569bc69051c7cfc309dfc223818c09a2f52ccd9ed77b71931c913a43a13 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"fork-ts-checker-webpack-plugin@npm:8.0.0": + version: 8.0.0 + resolution: "fork-ts-checker-webpack-plugin@npm:8.0.0" + dependencies: + "@babel/code-frame": "npm:^7.16.7" + chalk: "npm:^4.1.2" + chokidar: "npm:^3.5.3" + cosmiconfig: "npm:^7.0.1" + deepmerge: "npm:^4.2.2" + fs-extra: "npm:^10.0.0" + memfs: "npm:^3.4.1" + minimatch: "npm:^3.0.4" + node-abort-controller: "npm:^3.0.1" + schema-utils: "npm:^3.1.1" + semver: "npm:^7.3.5" + tapable: "npm:^2.2.1" + peerDependencies: + typescript: ">3.6.0" + webpack: ^5.11.0 + checksum: 10c0/1a2bb9bbd3e943e3b3a45d7fa9e8383698f5fea1ba28f7d18c8372c804460c2f13af53f791360b973fddafd3e88de7af59082c3cb3375f4e7c3365cd85accedc + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.1 + resolution: "form-data@npm:4.0.1" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: 10c0/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 + languageName: node + linkType: hard + +"formidable@npm:^2.0.1": + version: 2.1.2 + resolution: "formidable@npm:2.1.2" + dependencies: + dezalgo: "npm:^1.0.4" + hexoid: "npm:^1.0.0" + once: "npm:^1.4.0" + qs: "npm:^6.11.0" + checksum: 10c0/efba03d11127098daa6ef54c3c0fad25693973eb902fa88ccaaa203baebe8c74d12ba0fe1e113eccf79b9172510fa337e4e107330b124fb3a8c74697b4aa2ce3 + languageName: node + linkType: hard + +"formik@npm:2.4.5": + version: 2.4.5 + resolution: "formik@npm:2.4.5" + dependencies: + "@types/hoist-non-react-statics": "npm:^3.3.1" + deepmerge: "npm:^2.1.1" + hoist-non-react-statics: "npm:^3.3.0" + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + react-fast-compare: "npm:^2.0.1" + tiny-warning: "npm:^1.0.2" + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/61f0d9eb092edd122f0d2988ca3d0a01073bde38af977e96ba9818382dc1fefd4cdb016cd61f08443055a748bbbbe2a95347d4528b81cc5c1c6f75865fc84927 + languageName: node + linkType: hard + +"formik@npm:^2.2.9": + version: 2.4.6 + resolution: "formik@npm:2.4.6" + dependencies: + "@types/hoist-non-react-statics": "npm:^3.3.1" + deepmerge: "npm:^2.1.1" + hoist-non-react-statics: "npm:^3.3.0" + lodash: "npm:^4.17.21" + lodash-es: "npm:^4.17.21" + react-fast-compare: "npm:^2.0.1" + tiny-warning: "npm:^1.0.2" + tslib: "npm:^2.0.0" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/e2853fc7833649386ff183eac9cb6a69a999c4b05aabe5636152e1cec1eb35ac0d9f511425624f0d7a88c6e19d4fd2aa259399a6683f0475c30170a5a3ea4f79 + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fractional-indexing@npm:3.2.0": + version: 3.2.0 + resolution: "fractional-indexing@npm:3.2.0" + checksum: 10c0/d4d477c2ba369346ef0f03a4776bd78a3426e2778c23f8fd9dd3f51f9a851280bfc412c9bd970de55f1d21b831899f4c7f75f7fb72ae7f92b189eee962564005 + languageName: node + linkType: hard + +"fresh@npm:0.5.2, fresh@npm:~0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + +"fs-extra@npm:11.2.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 + languageName: node + linkType: hard + +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e + languageName: node + linkType: hard + +"fs-extra@npm:^8.0.1": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10c0/259f7b814d9e50d686899550c4f9ded85c46c643f7fe19be69504888e007fcbc08f306fae8ec495b8b998635e997c9e3e175ff2eeed230524ef1c1684cc96423 + languageName: node + linkType: hard + +"fs-extra@npm:~7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 10c0/1943bb2150007e3739921b8d13d4109abdc3cc481e53b97b7ea7f77eda1c3c642e27ae49eac3af074e3496ea02fde30f411ef410c760c70a38b92e656e5da784 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs-monkey@npm:^1.0.4": + version: 1.0.6 + resolution: "fs-monkey@npm:1.0.6" + checksum: 10c0/6f2508e792a47e37b7eabd5afc79459c1ea72bce2a46007d2b7ed0bfc3a4d64af38975c6eb7e93edb69ac98bbb907c13ff1b1579b2cf52d3d02dbc0303fca79f + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:*, fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A*#optional!builtin, fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-east-asian-width@npm:^1.0.0": + version: 1.3.0 + resolution: "get-east-asian-width@npm:1.3.0" + checksum: 10c0/1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5": + version: 1.2.6 + resolution: "get-intrinsic@npm:1.2.6" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + dunder-proto: "npm:^1.0.0" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + function-bind: "npm:^1.1.2" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.0.0" + checksum: 10c0/0f1ea6d807d97d074e8a31ac698213a12757fcfa9a8f4778263d2e4702c40fe83198aadd3dba2e99aabc2e4cf8a38345545dbb0518297d3df8b00b56a156c32a + languageName: node + linkType: hard + +"get-it@npm:^8.0.9": + version: 8.6.5 + resolution: "get-it@npm:8.6.5" + dependencies: + "@types/follow-redirects": "npm:^1.14.4" + "@types/progress-stream": "npm:^2.0.5" + decompress-response: "npm:^7.0.0" + follow-redirects: "npm:^1.15.6" + is-retry-allowed: "npm:^2.2.0" + progress-stream: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + checksum: 10c0/d4ef44279148576fed2dc5cf0afef20ed0eabe72ab7506364fef2903833a0e7a5c73191ee3983da5e4fe6b2fa6e9effe90e6eff8b1b2db5224f46b4bc0fd7310 + languageName: node + linkType: hard + +"get-latest-version@npm:5.1.0": + version: 5.1.0 + resolution: "get-latest-version@npm:5.1.0" + dependencies: + get-it: "npm:^8.0.9" + registry-auth-token: "npm:^5.0.2" + registry-url: "npm:^5.1.0" + semver: "npm:^7.3.8" + checksum: 10c0/93731caa54ed402b43f76156b7c3f81a25c768d7ff92188072a3d5f172a8c8abeaf322e27864a5c0750fba971d045acd1b7f674ce89314a34851ed26be539abc + languageName: node + linkType: hard + +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10c0/2d7df55279060bf0568549e1ffc9b84bc32a32b7541675ca092dce56317cdd1a59a98dcc4072c9f6a980779440139a3221d7486f52c488e69dc0fd27b1efb162 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + +"get-stdin@npm:^9.0.0": + version: 9.0.0 + resolution: "get-stdin@npm:9.0.0" + checksum: 10c0/7ef2edc0c81a0644ca9f051aad8a96ae9373d901485abafaabe59fd347a1c378689d8a3d8825fb3067415d1d09dfcaa43cb9b9516ecac6b74b3138b65a8ccc6b + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + +"getopts@npm:2.3.0": + version: 2.3.0 + resolution: "getopts@npm:2.3.0" + checksum: 10c0/edbcbd7020e9d87dc41e4ad9add5eb3873ae61339a62431bd92a461be2c0eaa9ec33b6fd0d67fa1b44feedffcf1cf28d6f9dbdb7d604cb1617eaba146a33cbca + languageName: node + linkType: hard + +"git-hooks-list@npm:^3.0.0": + version: 3.1.0 + resolution: "git-hooks-list@npm:3.1.0" + checksum: 10c0/f1b93dd11b80b2a687b99a8bb553c0d07f344532d475b3ac2a5ff044d40fa71567ddcfa5cb39fae0b4e43a670a33f02f71ec3b24b7263233f3a3df89deddfb5a + languageName: node + linkType: hard + +"git-up@npm:^7.0.0": + version: 7.0.0 + resolution: "git-up@npm:7.0.0" + dependencies: + is-ssh: "npm:^1.4.0" + parse-url: "npm:^8.1.0" + checksum: 10c0/a3fa02e1a63c7c824b5ebbf23f4a9a6b34dd80031114c5dd8adb7ef53493642e39d3d80dfef4025a452128400c35c2c138d20a0f6ae5d7d7ef70d9ba13083d34 + languageName: node + linkType: hard + +"git-url-parse@npm:13.1.1": + version: 13.1.1 + resolution: "git-url-parse@npm:13.1.1" + dependencies: + git-up: "npm:^7.0.0" + checksum: 10c0/9304e6fbc1a6acf5e351e84ad87574fa6b840ccbe531afbbce9ba38e01fcacf6adf386ef7593daa037da59d9fd43b5d7c5232d5648638f8301cc2f18d00ad386 + languageName: node + linkType: hard + +"git-url-parse@npm:14.0.0": + version: 14.0.0 + resolution: "git-url-parse@npm:14.0.0" + dependencies: + git-up: "npm:^7.0.0" + checksum: 10c0/d360cf23c6278e302b74603f3dc490c3fe22e533d58b7f35e0295fad9af209ce5046a55950ccbf2f0d18de7931faefb4353e3f3fd3dda87fce77b409d48e0ba9 + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.0.5, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"global-agent@npm:3.0.0": + version: 3.0.0 + resolution: "global-agent@npm:3.0.0" + dependencies: + boolean: "npm:^3.0.1" + es6-error: "npm:^4.1.1" + matcher: "npm:^3.0.0" + roarr: "npm:^2.15.3" + semver: "npm:^7.3.2" + serialize-error: "npm:^7.0.1" + checksum: 10c0/bb8750d026b25da437072762fd739098bad92ff72f66483c3929db4579e072f5523960f7e7fd70ee0d75db48898067b5dc1c9c1d17888128cff008fcc34d1bd3 + languageName: node + linkType: hard + +"global-modules@npm:^1.0.0": + version: 1.0.0 + resolution: "global-modules@npm:1.0.0" + dependencies: + global-prefix: "npm:^1.0.1" + is-windows: "npm:^1.0.1" + resolve-dir: "npm:^1.0.0" + checksum: 10c0/7d91ecf78d4fcbc966b2d89c1400df273afea795bc8cadf39857ee1684e442065621fd79413ff5fcd9e90c6f1b2dc0123e644fa0b7811f987fd54c6b9afad858 + languageName: node + linkType: hard + +"global-prefix@npm:^1.0.1": + version: 1.0.2 + resolution: "global-prefix@npm:1.0.2" + dependencies: + expand-tilde: "npm:^2.0.2" + homedir-polyfill: "npm:^1.0.1" + ini: "npm:^1.3.4" + is-windows: "npm:^1.0.1" + which: "npm:^1.2.14" + checksum: 10c0/d8037e300f1dc04d5d410d16afa662e71bfad22dcceba6c9727bb55cc273b8988ca940b3402f62e5392fd261dd9924a9a73a865ef2000219461f31f3fc86be06 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globalthis@npm:^1.0.1": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"globby@npm:^10.0.1": + version: 10.0.2 + resolution: "globby@npm:10.0.2" + dependencies: + "@types/glob": "npm:^7.1.1" + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.0.3" + glob: "npm:^7.1.3" + ignore: "npm:^5.1.1" + merge2: "npm:^1.2.3" + slash: "npm:^3.0.0" + checksum: 10c0/9c610ad47117b9dfbc5b0c6c2408c3b72f89c1b9f91ee14c4dc794794e35768ee0920e2a403b688cfa749f48617c6ba3f3a52df07677ed73d602d4349b68c810 + languageName: node + linkType: hard + +"globby@npm:^13.1.2, globby@npm:^13.2.2": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"got@npm:^11.8.2": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + +"graceful-fs@npm:4.2.10": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 10c0/4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphql-depth-limit@npm:^1.1.0": + version: 1.1.0 + resolution: "graphql-depth-limit@npm:1.1.0" + dependencies: + arrify: "npm:^1.0.1" + peerDependencies: + graphql: "*" + checksum: 10c0/8f50268ab3e2553cfe64fad532a3bd60068865217f113ac7388bfea1484d36a7e711a1c26f6a03e67969923967f2a84b62618c07732ca2ca603c295f8a19dbf9 + languageName: node + linkType: hard + +"graphql-playground-html@npm:^1.6.30": + version: 1.6.30 + resolution: "graphql-playground-html@npm:1.6.30" + dependencies: + xss: "npm:^1.0.6" + checksum: 10c0/32c87615b221610e57db41b68788bccf1e548ae66f38489521d4cfd2abf35666c76acf8250ce178f86b2bd825c2a9b083d496684abede1085847ca2dc7e71fb6 + languageName: node + linkType: hard + +"graphql-playground-middleware-koa@npm:^1.6.21": + version: 1.6.22 + resolution: "graphql-playground-middleware-koa@npm:1.6.22" + dependencies: + graphql-playground-html: "npm:^1.6.30" + peerDependencies: + koa: ^2 + checksum: 10c0/79461d0d624df4189fb85e8c06c26aa2894486cd91179bbda04febfd2808c4c59eb6dac7d75712b8f95416a388ba4adc21e709523ccab5e0a247bd18f90fd5cc + languageName: node + linkType: hard + +"graphql-scalars@npm:1.22.2": + version: 1.22.2 + resolution: "graphql-scalars@npm:1.22.2" + dependencies: + tslib: "npm:^2.5.0" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 10c0/8ba7e0e2ea90a0067cdbffcd67a8ff486ce4accceabe15a5b9bc7749204ea3ce31630619d9069153147661a885118e93983582b3914c982fa48f09c18edacdad + languageName: node + linkType: hard + +"graphql@npm:^16.8.1": + version: 16.9.0 + resolution: "graphql@npm:16.9.0" + checksum: 10c0/a8850f077ff767377237d1f8b1da2ec70aeb7623cdf1dfc9e1c7ae93accc0c8149c85abe68923be9871a2934b1bce5a2496f846d4d56e1cfb03eaaa7ddba9b6a + languageName: node + linkType: hard + +"gzip-size@npm:^6.0.0": + version: 6.0.0 + resolution: "gzip-size@npm:6.0.0" + dependencies: + duplexer: "npm:^0.1.2" + checksum: 10c0/4ccb924626c82125897a997d1c84f2377846a6ef57fbee38f7c0e6b41387fba4d00422274440747b58008b5d60114bac2349c2908e9aba55188345281af40a3f + languageName: node + linkType: hard + +"handlebars@npm:^4.4.3, handlebars@npm:^4.7.7, handlebars@npm:^4.7.8": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 + languageName: node + linkType: hard + +"header-case@npm:^1.0.0": + version: 1.0.1 + resolution: "header-case@npm:1.0.1" + dependencies: + no-case: "npm:^2.2.0" + upper-case: "npm:^1.1.3" + checksum: 10c0/973b81b3fba82140cf8cdc819edb32edd5959ff61ff42128c5f54e56f7454bb8f61c0197180c38cde84a4be1dddbc780e1413d5e1602c96caf0195d863e6bd03 + languageName: node + linkType: hard + +"header-case@npm:^2.0.4": + version: 2.0.4 + resolution: "header-case@npm:2.0.4" + dependencies: + capital-case: "npm:^1.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/c9f295d9d8e38fa50679281fd70d80726962256e888a76c8e72e526453da7a1832dcb427caa716c1ad5d79841d4537301b90156fa30298fefd3d68f4ea2181bb + languageName: node + linkType: hard + +"helmet@npm:^6.0.1": + version: 6.2.0 + resolution: "helmet@npm:6.2.0" + checksum: 10c0/52d97adfdb151ebdc08e5d78eb93eebfb7e8e3e0563e68664828138dc6ab2d9d512b4ae71e1f8c6fcf8ddc38f87908325971d95dcabaafd4fde1f5b0faabeb8c + languageName: node + linkType: hard + +"hexoid@npm:^1.0.0": + version: 1.0.0 + resolution: "hexoid@npm:1.0.0" + checksum: 10c0/9c45e8ba676b9eb88455631ebceec4c829a8374a583410dc735472ab9808bf11339fcd074633c3fa30e420901b894d8a92ffd5e2e21eddd41149546e05a91f69 + languageName: node + linkType: hard + +"highlight.js@npm:^10.4.1": + version: 10.7.3 + resolution: "highlight.js@npm:10.7.3" + checksum: 10c0/073837eaf816922427a9005c56c42ad8786473dc042332dfe7901aa065e92bc3d94ebf704975257526482066abb2c8677cc0326559bb8621e046c21c5991c434 + languageName: node + linkType: hard + +"hls.js@npm:~1.5.11": + version: 1.5.17 + resolution: "hls.js@npm:1.5.17" + checksum: 10c0/37b6fe2c8ed961b0b45ae961035aeafd203ff43aea26f0b63ac1382a05c45415e0e5d2302a2c4e316444e93d438ccd12e7cd36159e4f1fe2c3bfe57f53be3e98 + languageName: node + linkType: hard + +"hoist-non-react-statics@npm:3, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: "npm:^16.7.0" + checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 + languageName: node + linkType: hard + +"homedir-polyfill@npm:^1.0.1": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" + dependencies: + parse-passwd: "npm:^1.0.0" + checksum: 10c0/3c099844f94b8b438f124bd5698bdcfef32b2d455115fb8050d7148e7f7b95fc89ba9922586c491f0e1cdebf437b1053c84ecddb8d596e109e9ac69c5b4a9e27 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"html-entities@npm:^2.1.0": + version: 2.5.2 + resolution: "html-entities@npm:2.5.2" + checksum: 10c0/f20ffb4326606245c439c231de40a7c560607f639bf40ffbfb36b4c70729fd95d7964209045f1a4e62fe17f2364cef3d6e49b02ea09016f207fde51c2211e481 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"html-minifier-terser@npm:^6.0.2": + version: 6.1.0 + resolution: "html-minifier-terser@npm:6.1.0" + dependencies: + camel-case: "npm:^4.1.2" + clean-css: "npm:^5.2.2" + commander: "npm:^8.3.0" + he: "npm:^1.2.0" + param-case: "npm:^3.0.4" + relateurl: "npm:^0.2.7" + terser: "npm:^5.10.0" + bin: + html-minifier-terser: cli.js + checksum: 10c0/1aa4e4f01cf7149e3ac5ea84fb7a1adab86da40d38d77a6fff42852b5ee3daccb78b615df97264e3a6a5c33e57f0c77f471d607ca1e1debd1dab9b58286f4b5a + languageName: node + linkType: hard + +"html-webpack-plugin@npm:5.6.0": + version: 5.6.0 + resolution: "html-webpack-plugin@npm:5.6.0" + dependencies: + "@types/html-minifier-terser": "npm:^6.0.0" + html-minifier-terser: "npm:^6.0.2" + lodash: "npm:^4.17.21" + pretty-error: "npm:^4.0.0" + tapable: "npm:^2.0.0" + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/50d1a0f90d512463ea8d798985d91a7ccc9d5e461713dedb240125b2ff0671f58135dd9355f7969af341ff4725e73b2defbc0984cfdce930887a48506d970002 + languageName: node + linkType: hard + +"htmlparser2@npm:^6.1.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.0.0" + domutils: "npm:^2.5.2" + entities: "npm:^2.0.0" + checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 + languageName: node + linkType: hard + +"htmlparser2@npm:^8.0.0": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.0.1" + entities: "npm:^4.4.0" + checksum: 10c0/609cca85886d0bf2c9a5db8c6926a89f3764596877492e2caa7a25a789af4065bc6ee2cdc81807fe6b1d03a87bf8a373b5a754528a4cc05146b713c20575aab4 + languageName: node + linkType: hard + +"http-assert@npm:^1.3.0": + version: 1.5.0 + resolution: "http-assert@npm:1.5.0" + dependencies: + deep-equal: "npm:~1.0.1" + http-errors: "npm:~1.8.0" + checksum: 10c0/7b4e631114a1a77654f9ba3feb96da305ddbdeb42112fe384b7b3249c7141e460d7177970155bea6e54e655a04850415b744b452c1fe5052eba6f4186d16b095 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 + languageName: node + linkType: hard + +"http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:^1.8.1, http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:>= 1.5.0 < 2" + toidentifier: "npm:1.0.1" + checksum: 10c0/f01aeecd76260a6fe7f08e192fcbe9b2f39ed20fc717b852669a69930167053b01790998275c6297d44f435cf0e30edd50c05223d1bec9bc484e6cf35b2d6f43 + languageName: node + linkType: hard + +"http-errors@npm:~1.6.2": + version: 1.6.3 + resolution: "http-errors@npm:1.6.3" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.3" + setprototypeof: "npm:1.1.0" + statuses: "npm:>= 1.4.0 < 2" + checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^4.0.0": + version: 4.0.1 + resolution: "http-proxy-agent@npm:4.0.1" + dependencies: + "@tootallnate/once": "npm:1" + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/4fa4774d65b5331814b74ac05cefea56854fc0d5989c80b13432c1b0d42a14c9f4342ca3ad9f0359a52e78da12b1744c9f8a28e50042136ea9171675d972a5fd + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"human-signals@npm:^8.0.0": + version: 8.0.0 + resolution: "human-signals@npm:8.0.0" + checksum: 10c0/e4dac4f7d3eb791ed04129fc6a85bd454a9102d3e3b76c911d0db7057ebd60b2956b435b5b5712aec18960488ede3c21ef7c56e42cdd70760c0d84d3c05cd92e + languageName: node + linkType: hard + +"husky@npm:7.0.4": + version: 7.0.4 + resolution: "husky@npm:7.0.4" + bin: + husky: lib/bin.js + checksum: 10c0/aacb2b8fbfed0ec161f94e9b08d422c51fec073def4e165e57da42f47c10f520a5f0a88b42efc667784e314a1af83cf1994b582cd6f4b0333739921a601c6187 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.13": + version: 0.4.13 + resolution: "iconv-lite@npm:0.4.13" + checksum: 10c0/9822d158a94cb7cbbf602d63a3eee231793319bc863229f7f0b96870078b95ead40ed222f291bd5418cd3a2ee29c4cf290bc19d6632f8b304fff0ac473cee227 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.15": + version: 0.4.15 + resolution: "iconv-lite@npm:0.4.15" + checksum: 10c0/25699b635722175ee6fa5e07872b1ee71d25d5f2fd800b6f9384cc3455a829a53e5a6bbbc946b6db5c6b707abdf5fcdba623aa29cf3ddc69c097e0f181202726 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 10c0/9ab6e70e80f7cc12735def7ecb5527cfa56ab4e1152cd64d294522827f2dcf1f6d85531241537dc3713544e88dd888f65cb3c49c7b2cddb9009087c75274e533 + languageName: node + linkType: hard + +"ignore-walk@npm:3.0.3": + version: 3.0.3 + resolution: "ignore-walk@npm:3.0.3" + dependencies: + minimatch: "npm:^3.0.4" + checksum: 10c0/80d8a223fa82609188033581212b0e3906ddb996c35e2a8693a17f2f03f5f2e411bc877db3dca3aaf407b4220fa83cab33f5d5cb91c4a42cda8dc7cf3eb63915 + languageName: node + linkType: hard + +"ignore-walk@npm:^3.0.3": + version: 3.0.4 + resolution: "ignore-walk@npm:3.0.4" + dependencies: + minimatch: "npm:^3.0.4" + checksum: 10c0/690372b433887796fa3badd25babab7daf60a1882259dcc130ec78eea79745c2416322e10d1a96b367071204471c532647d20b11cd7ab70bd9b49879e461f956 + languageName: node + linkType: hard + +"ignore@npm:^5.0.4, ignore@npm:^5.1.1, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"immer@npm:9.0.21, immer@npm:^9.0.21, immer@npm:^9.0.6": + version: 9.0.21 + resolution: "immer@npm:9.0.21" + checksum: 10c0/03ea3ed5d4d72e8bd428df4a38ad7e483ea8308e9a113d3b42e0ea2cc0cc38340eb0a6aca69592abbbf047c685dbda04e3d34bf2ff438ab57339ed0a34cc0a05 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-lazy@npm:~4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 + languageName: node + linkType: hard + +"inflation@npm:^2.0.0": + version: 2.1.0 + resolution: "inflation@npm:2.1.0" + checksum: 10c0/aadfcb8047a7e00d644e2e195f901dd9d7266c2be2326b7f8f6a99298f14916f1e322d00108a7e2778d6e76a8dc2174ddb9ac14bcdfe4f4866dfd612b695ab5d + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 + languageName: node + linkType: hard + +"ini@npm:4.1.2": + version: 4.1.2 + resolution: "ini@npm:4.1.2" + checksum: 10c0/e0ffe587038e26ca1debfece6f5e52fd17f4e65be59bb481bb24b89cd2be31a71f619465918da215916b4deba7d1134c228c58fe5e0db66a71a472dee9b8f99c + languageName: node + linkType: hard + +"ini@npm:^1.3.4, ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"ini@npm:^2.0.0": + version: 2.0.0 + resolution: "ini@npm:2.0.0" + checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 + languageName: node + linkType: hard + +"inquirer@npm:8.2.5": + version: 8.2.5 + resolution: "inquirer@npm:8.2.5" + dependencies: + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.1" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:0.0.8" + ora: "npm:^5.4.1" + run-async: "npm:^2.4.0" + rxjs: "npm:^7.5.5" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/e3e64e10f5daeeb8f770f1310acceb4aab593c10d693e7676ecd4a5b023d5b865b484fec7ead516e5e394db70eff687ef85459f75890f11a99ceadc0f4adce18 + languageName: node + linkType: hard + +"inquirer@npm:^7.1.0": + version: 7.3.3 + resolution: "inquirer@npm:7.3.3" + dependencies: + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.19" + mute-stream: "npm:0.0.8" + run-async: "npm:^2.4.0" + rxjs: "npm:^6.6.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + checksum: 10c0/96e75974cfd863fe6653c075e41fa5f1a290896df141189816db945debabcd92d3277145f11aef8d2cfca5409ab003ccdd18a099744814057b52a2f27aeb8c94 + languageName: node + linkType: hard + +"inquirer@npm:^9.2.10": + version: 9.3.7 + resolution: "inquirer@npm:9.3.7" + dependencies: + "@inquirer/figures": "npm:^1.0.3" + ansi-escapes: "npm:^4.3.2" + cli-width: "npm:^4.1.0" + external-editor: "npm:^3.1.0" + mute-stream: "npm:1.0.0" + ora: "npm:^5.4.1" + run-async: "npm:^3.0.0" + rxjs: "npm:^7.8.1" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10c0/7a5b70312a734b579846648365cbf354e8b23ec73f379d46ada30bc2cf3961dc33b7ca59a3c2beed8a8e03744e3d6c12d4998a34b2d3904774aed238d77328b4 + languageName: node + linkType: hard + +"interpret@npm:^2.2.0": + version: 2.2.0 + resolution: "interpret@npm:2.2.0" + checksum: 10c0/c0ef90daec6c4120bb7a226fa09a9511f6b5618aa9c94cf4641472f486948e643bb3b36efbd0136bbffdee876435af9fdf7bbb4622f5a16778eed5397f8a1946 + languageName: node + linkType: hard + +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 + languageName: node + linkType: hard + +"intl-messageformat@npm:10.5.11": + version: 10.5.11 + resolution: "intl-messageformat@npm:10.5.11" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/fast-memoize": "npm:2.2.0" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" + tslib: "npm:^2.4.0" + checksum: 10c0/423f1c879ce2d0e7b9e0b4c1787a81ead7fe4d1734e0366a20fef56b06c09146e7ca3618e2e78b4f8b8f2b59cafe6237ceed21530fe0c16cfb47d915fc80222d + languageName: node + linkType: hard + +"intl-messageformat@npm:10.7.7": + version: 10.7.7 + resolution: "intl-messageformat@npm:10.7.7" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/fast-memoize": "npm:2.2.3" + "@formatjs/icu-messageformat-parser": "npm:2.9.4" + tslib: "npm:2" + checksum: 10c0/691895fb6a73a2feb2569658706e0d452861441de184dd1c9201e458a39fb80fc80080dd40d3d370400a52663f87de7a6d5a263c94245492f7265dd760441a95 + languageName: node + linkType: hard + +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + +"is-absolute@npm:^1.0.0": + version: 1.0.0 + resolution: "is-absolute@npm:1.0.0" + dependencies: + is-relative: "npm:^1.0.0" + is-windows: "npm:^1.0.1" + checksum: 10c0/422302ce879d4f3ca6848499b6f3ddcc8fd2dc9f3e9cad3f6bcedff58cdfbbbd7f4c28600fffa7c59a858f1b15c27fb6cfe1d5275e58a36d2bf098a44ef5abc4 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-class-hotfix@npm:~0.0.6": + version: 0.0.6 + resolution: "is-class-hotfix@npm:0.0.6" + checksum: 10c0/722da72c30fb986fafc752e94b7bbf6e69359d7a5af74dd78152b3b45a5ae0adf34acfd86b98917769bc740cb0cd46dff890756e28661daee13dc91c8ced31e0 + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/53432f10c69c40bfd2fa8914133a68709ff9498c86c3bf5fca3cdf3145a56fd2168cbf4a43b29843a6202a120a5f9c5ffba0a4322e1e3441739bc0b641682612 + languageName: node + linkType: hard + +"is-docker@npm:2.2.1, is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.7": + version: 1.0.10 + resolution: "is-generator-function@npm:1.0.10" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 10c0/df03514df01a6098945b5a0cfa1abff715807c8e72f57c49a0686ad54b3b74d394e2d8714e6f709a71eb00c9630d48e73ca1796c1ccc84ac95092c1fecc0d98b + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-hotkey@npm:^0.1.6": + version: 0.1.8 + resolution: "is-hotkey@npm:0.1.8" + checksum: 10c0/5aca28f98b9ffff45d9141d26024ffbc33d2d7c8163144d4bd8eccc9330e3299fb7761e962517b7729f6bf9e95f248654aa8b0fccf16478baecddb428a5923fd + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d + languageName: node + linkType: hard + +"is-interactive@npm:^2.0.0": + version: 2.0.0 + resolution: "is-interactive@npm:2.0.0" + checksum: 10c0/801c8f6064f85199dc6bf99b5dd98db3282e930c3bc197b32f2c5b89313bb578a07d1b8a01365c4348c2927229234f3681eb861b9c2c92bee72ff397390fa600 + languageName: node + linkType: hard + +"is-localhost-ip@npm:2.0.0": + version: 2.0.0 + resolution: "is-localhost-ip@npm:2.0.0" + checksum: 10c0/40a55283374add1fe1edd5130d66e0ec814bc89e45d1a8b91722c494548ce4807b08e70bdc668b732e497f4de8b95d13d7a477e0d060df04ade2cbf0505f9480 + languageName: node + linkType: hard + +"is-lower-case@npm:^1.1.0": + version: 1.1.3 + resolution: "is-lower-case@npm:1.1.3" + dependencies: + lower-case: "npm:^1.1.0" + checksum: 10c0/af174cfdd50e4ab997bd4aeaf96d5b1841490a721c62a9ab07b14dfb63885134065683d5027f53e2f76180ff972a3c9a0155815e715c37815757a6bd67d4459e + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: 10c0/85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e + languageName: node + linkType: hard + +"is-path-cwd@npm:^2.2.0": + version: 2.2.0 + resolution: "is-path-cwd@npm:2.2.0" + checksum: 10c0/afce71533a427a759cd0329301c18950333d7589533c2c90205bd3fdcf7b91eb92d1940493190567a433134d2128ec9325de2fd281e05be1920fbee9edd22e0a + languageName: node + linkType: hard + +"is-path-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "is-path-cwd@npm:3.0.0" + checksum: 10c0/8135b789c74e137501ca33b11a846c32d160c517037c0ce390004a98335e010b9712792d97c73d9e98a5ecbcfd03589a81e95c72e1c05014a69fead963a02753 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.1": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-path-inside@npm:^4.0.0": + version: 4.0.0 + resolution: "is-path-inside@npm:4.0.0" + checksum: 10c0/51188d7e2b1d907a9a5f7c18d99a90b60870b951ed87cf97595d9aaa429d4c010652c3350bcbf31182e7f4b0eab9a1860b43e16729b13cb1a44baaa6cdb64c46 + languageName: node + linkType: hard + +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-relative@npm:^1.0.0": + version: 1.0.0 + resolution: "is-relative@npm:1.0.0" + dependencies: + is-unc-path: "npm:^1.0.0" + checksum: 10c0/61157c4be8594dd25ac6f0ef29b1218c36667259ea26698367a4d9f39ff9018368bc365c490b3c79be92dfb1e389e43c4b865c95709e7b3bc72c5932f751fb60 + languageName: node + linkType: hard + +"is-retry-allowed@npm:^2.2.0": + version: 2.2.0 + resolution: "is-retry-allowed@npm:2.2.0" + checksum: 10c0/013be4f8a0a06a49ed1fe495242952e898325d496202a018f6f9fb3fb9ac8fe3b957a9bd62463d68299ae35dbbda680473c85a9bcefca731b49d500d3ccc08ff + languageName: node + linkType: hard + +"is-ssh@npm:^1.4.0": + version: 1.4.0 + resolution: "is-ssh@npm:1.4.0" + dependencies: + protocols: "npm:^2.0.1" + checksum: 10c0/3eb30d1bcb4507cd25562e7ac61a1c0aa31772134c67cec9c3afe6f4d57ec17e8c2892600a608e8e583f32f53f36465b8968c0305f2855cfbff95acfd049e113 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + +"is-type-of@npm:^1.2.1": + version: 1.4.0 + resolution: "is-type-of@npm:1.4.0" + dependencies: + core-util-is: "npm:^1.0.2" + is-class-hotfix: "npm:~0.0.6" + isstream: "npm:~0.1.2" + checksum: 10c0/f88221d6aeb2111c3f94613317fd54234dc4e3164fec1ac8120ab15e2b045bb423caab8f261f72331808d8154740db778e520bab7176a805434f8b164791ccc0 + languageName: node + linkType: hard + +"is-typedarray@npm:^1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-unc-path@npm:^1.0.0": + version: 1.0.0 + resolution: "is-unc-path@npm:1.0.0" + dependencies: + unc-path-regex: "npm:^0.1.2" + checksum: 10c0/ac1b78f9b748196e3be3d0e722cd4b0f98639247a130a8f2473a58b29baf63fdb1b1c5a12c830660c5ee6ef0279c5418ca8e346f98cbe1a29e433d7ae531d42e + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^1.3.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + +"is-upper-case@npm:^1.1.0": + version: 1.1.2 + resolution: "is-upper-case@npm:1.1.2" + dependencies: + upper-case: "npm:^1.1.0" + checksum: 10c0/81b8defdee0e0de7310446ac717422c586c4d013c2a517c5fcf8b119349aa2798be56fa213169b0de3936cb00e796a383683c2504d221596ae09a0eb282a5b25 + languageName: node + linkType: hard + +"is-windows@npm:^1.0.1": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 10c0/b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5 + languageName: node + linkType: hard + +"is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isbinaryfile@npm:^4.0.2": + version: 4.0.10 + resolution: "isbinaryfile@npm:4.0.10" + checksum: 10c0/0703d8cfeb69ed79e6d173120f327450011a066755150a6bbf97ffecec1069a5f2092777868315b21359098c84b54984871cad1abce877ad9141fb2caf3dcabf + languageName: node + linkType: hard + +"isbinaryfile@npm:^5.0.0": + version: 5.0.4 + resolution: "isbinaryfile@npm:5.0.4" + checksum: 10c0/fea255bfae67ff4827e8dd2238d6700d4803d02b4d892b72eeac4541487284e901251a3427966af5018d4eb29fa155b036dcb75dd217634146a072991afbc2c2 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isobject@npm:^3.0.0, isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 10c0/a6686a878735ca0a48e0d674dd6d8ad31aedfaf70f07920da16ceadc7577b46d67179a60b313f2e6860cb097a2c2eb3cbd0b89e921ae89199a59a17c3273d66f + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + languageName: node + linkType: hard + +"iterall@npm:^1.3.0": + version: 1.3.0 + resolution: "iterall@npm:1.3.0" + checksum: 10c0/40de624e5fe937c4c0e511981b91caea9ff2142bfc0316cccc8506eaa03aa253820cc17c5bc5f0a98706c7268a373e5ebee9af9a0c8a359730cf7c05938b57b5 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jake@npm:^10.8.5": + version: 10.9.2 + resolution: "jake@npm:10.9.2" + dependencies: + async: "npm:^3.2.3" + chalk: "npm:^4.0.2" + filelist: "npm:^1.0.4" + minimatch: "npm:^3.1.2" + bin: + jake: bin/cli.js + checksum: 10c0/c4597b5ed9b6a908252feab296485a4f87cba9e26d6c20e0ca144fb69e0c40203d34a2efddb33b3d297b8bd59605e6c1f44f6221ca1e10e69175ecbf3ff5fe31 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c + languageName: node + linkType: hard + +"jest-junit@npm:^16.0.0": + version: 16.0.0 + resolution: "jest-junit@npm:16.0.0" + dependencies: + mkdirp: "npm:^1.0.4" + strip-ansi: "npm:^6.0.1" + uuid: "npm:^8.3.2" + xml: "npm:^1.0.1" + checksum: 10c0/d813d4d142341c2b51b634db7ad6ceb9849514cb58f96ec5e7e4cf4031a557133490452710c2d9dec9b1dd546334d9ca663e042d3070c3e8f102ce6217bd8e2e + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 + languageName: node + linkType: hard + +"jest-styled-components@npm:^7.1.1": + version: 7.2.0 + resolution: "jest-styled-components@npm:7.2.0" + dependencies: + "@adobe/css-tools": "npm:^4.0.1" + peerDependencies: + styled-components: ">= 5" + checksum: 10c0/44eecf73cd1ee50686c9c16517222e2c012422dd7d90a07813f82f3ccce4059563e620d25aed60274e05d31fe6375b1f31a3486033aa39ea5e82fd94afcfa32f + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b + languageName: node + linkType: hard + +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 + languageName: node + linkType: hard + +"jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + languageName: node + linkType: hard + +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 10c0/f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad + languageName: node + linkType: hard + +"jose@npm:^4.14.6": + version: 4.15.9 + resolution: "jose@npm:4.15.9" + checksum: 10c0/4ed4ddf4a029db04bd167f2215f65d7245e4dc5f36d7ac3c0126aab38d66309a9e692f52df88975d99429e357e5fd8bab340ff20baab544d17684dd1d940a0f4 + languageName: node + linkType: hard + +"joycon@npm:^3.0.1": + version: 3.1.1 + resolution: "joycon@npm:3.1.1" + checksum: 10c0/131fb1e98c9065d067fd49b6e685487ac4ad4d254191d7aa2c9e3b90f4e9ca70430c43cad001602bdbdabcf58717d3b5c5b7461c1bd8e39478c8de706b3fe6ae + languageName: node + linkType: hard + +"js-sha3@npm:0.8.0": + version: 0.8.0 + resolution: "js-sha3@npm:0.8.0" + checksum: 10c0/43a21dc7967c871bd2c46cb1c2ae97441a97169f324e509f382d43330d8f75cf2c96dba7c806ab08a425765a9c847efdd4bffbac2d99c3a4f3de6c0218f40533 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:3.14.1, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + +"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsonwebtoken@npm:9.0.0": + version: 9.0.0 + resolution: "jsonwebtoken@npm:9.0.0" + dependencies: + jws: "npm:^3.2.2" + lodash: "npm:^4.17.21" + ms: "npm:^2.1.1" + semver: "npm:^7.3.8" + checksum: 10c0/60c30d90d8a69b8e7148306e0c299ac120dbde9c032add48d26df928fe349e952cf4b09f12d7942257681a936e3374e4d49280ab20f8a4578688c7f08d87f9bc + languageName: node + linkType: hard + +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" + dependencies: + buffer-equal-constant-time: "npm:1.0.1" + ecdsa-sig-formatter: "npm:1.0.11" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/5c533540bf38702e73cf14765805a94027c66a0aa8b16bc3e89d8d905e61a4ce2791e87e21be97d1293a5ee9d4f3e5e47737e671768265ca4f25706db551d5e9 + languageName: node + linkType: hard + +"jwks-rsa@npm:3.1.0": + version: 3.1.0 + resolution: "jwks-rsa@npm:3.1.0" + dependencies: + "@types/express": "npm:^4.17.17" + "@types/jsonwebtoken": "npm:^9.0.2" + debug: "npm:^4.3.4" + jose: "npm:^4.14.6" + limiter: "npm:^1.1.5" + lru-memoizer: "npm:^2.2.0" + checksum: 10c0/60d686ba42ebfcedffd867aa68044d3d505bc21f6574afda17c6cc8bcabcf88a9a2b651965a25c53280902a532767cd002694c98f68287d31a60b492cba35822 + languageName: node + linkType: hard + +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: "npm:^1.4.1" + safe-buffer: "npm:^5.0.1" + checksum: 10c0/e770704533d92df358adad7d1261fdecad4d7b66fa153ba80d047e03ca0f1f73007ce5ed3fbc04d2eba09ba6e7e6e645f351e08e5ab51614df1b0aa4f384dfff + languageName: node + linkType: hard + +"keygrip@npm:~1.1.0": + version: 1.1.0 + resolution: "keygrip@npm:1.1.0" + dependencies: + tsscmp: "npm:1.0.6" + checksum: 10c0/2aceec1a1e642a0caf938044056ed67b1909cfe67a93a59b32aae2863e0f35a1a53782ecc8f9cd0e3bdb60863fa0f401ccbd257cd7dfae61915f78445139edea + languageName: node + linkType: hard + +"keyv@npm:^4.0.0": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + +"knex@npm:3.0.1": + version: 3.0.1 + resolution: "knex@npm:3.0.1" + dependencies: + colorette: "npm:2.0.19" + commander: "npm:^10.0.0" + debug: "npm:4.3.4" + escalade: "npm:^3.1.1" + esm: "npm:^3.2.25" + get-package-type: "npm:^0.1.0" + getopts: "npm:2.3.0" + interpret: "npm:^2.2.0" + lodash: "npm:^4.17.21" + pg-connection-string: "npm:2.6.1" + rechoir: "npm:^0.8.0" + resolve-from: "npm:^5.0.0" + tarn: "npm:^3.0.2" + tildify: "npm:2.0.0" + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true + bin: + knex: bin/cli.js + checksum: 10c0/43ce4858642b17304ba1f524361936d6369bccbc09ae4695f7b253a7553a729708a413f0fa5e4b3a295fe4f7483e4776be5f960d72c2decff34be11186685033 + languageName: node + linkType: hard + +"koa-body@npm:6.0.1": + version: 6.0.1 + resolution: "koa-body@npm:6.0.1" + dependencies: + "@types/co-body": "npm:^6.1.0" + "@types/formidable": "npm:^2.0.5" + "@types/koa": "npm:^2.13.5" + co-body: "npm:^6.1.0" + formidable: "npm:^2.0.1" + zod: "npm:^3.19.1" + checksum: 10c0/5645dd08d2ce54171be35d3acf1764e0b3024660570a55cc2692e2f5f3256043bae136ec2dcab2860cae3be8faab99d5720c8660dec2cdff37d5413053bbcee8 + languageName: node + linkType: hard + +"koa-bodyparser@npm:4.4.1": + version: 4.4.1 + resolution: "koa-bodyparser@npm:4.4.1" + dependencies: + co-body: "npm:^6.0.0" + copy-to: "npm:^2.0.1" + type-is: "npm:^1.6.18" + checksum: 10c0/72abf648bb62649cebfed310ef8fd09db3ca48867e083814b63f799fedadfdc440817507b9edbcd1d8d75282b23ed64812d924d4d5fc12375ae935150b224c1d + languageName: node + linkType: hard + +"koa-compose@npm:4.1.0, koa-compose@npm:^4.1.0": + version: 4.1.0 + resolution: "koa-compose@npm:4.1.0" + checksum: 10c0/f1f786f994a691931148e7f38f443865bf2702af4a61610d1eea04dab79c04b1232285b59d82a0cf61c830516dd92f10ab0d009b024fcecd4098e7d296ab771a + languageName: node + linkType: hard + +"koa-compress@npm:5.1.1": + version: 5.1.1 + resolution: "koa-compress@npm:5.1.1" + dependencies: + bytes: "npm:^3.1.2" + compressible: "npm:^2.0.18" + http-errors: "npm:^1.8.1" + koa-is-json: "npm:^1.0.0" + checksum: 10c0/c3b9456330b1c3d02852af588a19b8a709616c67f2d2602d5d1bb2cf851a4387c76d350936ac373059b0c956c92dedb2d6cbe4aae3b5d3eb741835f949d22e9f + languageName: node + linkType: hard + +"koa-convert@npm:^2.0.0": + version: 2.0.0 + resolution: "koa-convert@npm:2.0.0" + dependencies: + co: "npm:^4.6.0" + koa-compose: "npm:^4.1.0" + checksum: 10c0/d3e243ceccd11524d5f4942f6ccd828a9b18a1a967c4375192aa9eedf844f790563632839f006732ce8ca720275737c65a3bab344e13b25f41fb2be451ea102c + languageName: node + linkType: hard + +"koa-favicon@npm:2.1.0": + version: 2.1.0 + resolution: "koa-favicon@npm:2.1.0" + dependencies: + mz: "npm:^2.7.0" + checksum: 10c0/de20fb847aa87bf871efe12fde04340cc186c68483175e212dddbcd34089a979129a914ae9b6a87b3ea8743f398b3856a06b5403deb6d6eb6470abd50ba4f556 + languageName: node + linkType: hard + +"koa-helmet@npm:7.0.2": + version: 7.0.2 + resolution: "koa-helmet@npm:7.0.2" + dependencies: + helmet: "npm:^6.0.1" + checksum: 10c0/ab6fd4084829c469192ab99978fcab96a719e57933cadbfc4f86523da795becfea12a51504241b5b319cbbf6a6a0532579818ad27ac6905f85d389c5a20b812c + languageName: node + linkType: hard + +"koa-ip@npm:^2.1.3": + version: 2.1.3 + resolution: "koa-ip@npm:2.1.3" + dependencies: + debug: "npm:4.3.4" + lodash.isplainobject: "npm:4.0.6" + request-ip: "npm:3.3.0" + checksum: 10c0/1a996b9555fd09ce581dbfd902e618b6776443787b6cf24323c1e9edb0faa0f85537b68c8e993806dcfd8fb307ddd185005d97f904e51495bebfa4eab6ca57a6 + languageName: node + linkType: hard + +"koa-is-json@npm:^1.0.0": + version: 1.0.0 + resolution: "koa-is-json@npm:1.0.0" + checksum: 10c0/b942126580724772fbcb533675cb5dd914a1bea5fbdccf6c1341b399ab7b2b52319f7252cad308fd596b7198ced77cacbb13784a0040141e83d8913e561f735f + languageName: node + linkType: hard + +"koa-passport@npm:6.0.0": + version: 6.0.0 + resolution: "koa-passport@npm:6.0.0" + dependencies: + passport: "npm:^0.6.0" + checksum: 10c0/1def6daa2e44edc86298e4527831354da7280c66de09dbbd076c23f6702671bfee46c03e48ba91ef85d503acac42845801654be0144b8413fcd1c2229031971b + languageName: node + linkType: hard + +"koa-range@npm:0.3.0": + version: 0.3.0 + resolution: "koa-range@npm:0.3.0" + dependencies: + stream-slice: "npm:^0.1.2" + checksum: 10c0/01da0edba7c8c327962ffd5808d52d7e4e1a7c7fbf9976b0d77847834fa388e54d4f52d7042cf8c586f69c20c4018a6457ed839c90ce7015007b8e284aa1b894 + languageName: node + linkType: hard + +"koa-send@npm:^5.0.0": + version: 5.0.1 + resolution: "koa-send@npm:5.0.1" + dependencies: + debug: "npm:^4.1.1" + http-errors: "npm:^1.7.3" + resolve-path: "npm:^1.4.0" + checksum: 10c0/787a8abaf3690a86cf2e6021f1d870daba5f8393f4b4da4da74c26e7d1f7a89636fa2f251a0ec1ea75364fc81a9ef20d3c52e8e2dc7ad9f1d5053357a0db204f + languageName: node + linkType: hard + +"koa-session@npm:6.4.0": + version: 6.4.0 + resolution: "koa-session@npm:6.4.0" + dependencies: + crc: "npm:^3.8.0" + debug: "npm:^4.3.3" + is-type-of: "npm:^1.2.1" + uuid: "npm:^8.3.2" + checksum: 10c0/0f5faa194cf899af7d95ad73a08cc4be33ee2055c2afb33ae3dbdf37e382ec354b7ba274ba9cc551446440bea7a0c396f77f4b87e48fe7896a7b90a037b50fa6 + languageName: node + linkType: hard + +"koa-static@npm:5.0.0": + version: 5.0.0 + resolution: "koa-static@npm:5.0.0" + dependencies: + debug: "npm:^3.1.0" + koa-send: "npm:^5.0.0" + checksum: 10c0/4cb7a4e98506d54274658eb3565b24fcbe606bbb6916cb5ef226b2613d3ffd417dec3404000baa171f2206f2a6d29117bbe881fd26b27d54ef746d9de6de3e91 + languageName: node + linkType: hard + +"koa2-ratelimit@npm:^1.1.3": + version: 1.1.3 + resolution: "koa2-ratelimit@npm:1.1.3" + peerDependencies: + mongoose: ">= 5" + redis: ">= 4.0.0" + sequelize: ">=5.8.7" + peerDependenciesMeta: + mongoose: + optional: true + redis: + optional: true + sequelize: + optional: true + checksum: 10c0/577ebaeac93c25330ae33e6cace9c270d15f54f35ab5180b768e22f7b42f71abfe115b250b2b0d05e564cc6505ade87c8f2da677f8faa2fe18979f79ce992f59 + languageName: node + linkType: hard + +"koa@npm:2.15.2": + version: 2.15.2 + resolution: "koa@npm:2.15.2" + dependencies: + accepts: "npm:^1.3.5" + cache-content-type: "npm:^1.0.0" + content-disposition: "npm:~0.5.2" + content-type: "npm:^1.0.4" + cookies: "npm:~0.9.0" + debug: "npm:^4.3.2" + delegates: "npm:^1.0.0" + depd: "npm:^2.0.0" + destroy: "npm:^1.0.4" + encodeurl: "npm:^1.0.2" + escape-html: "npm:^1.0.3" + fresh: "npm:~0.5.2" + http-assert: "npm:^1.3.0" + http-errors: "npm:^1.6.3" + is-generator-function: "npm:^1.0.7" + koa-compose: "npm:^4.1.0" + koa-convert: "npm:^2.0.0" + on-finished: "npm:^2.3.0" + only: "npm:~0.0.2" + parseurl: "npm:^1.3.2" + statuses: "npm:^1.5.0" + type-is: "npm:^1.6.16" + vary: "npm:^1.1.2" + checksum: 10c0/ff486f4564c10340ba6d59ab667af5554058f2c4250352e8b15016c3c6d0079c25cef5e75aa787930617a2a57929617b7697341b1228db03e5da9f46f5f0b571 + languageName: node + linkType: hard + +"koa@npm:^2.15.3": + version: 2.15.3 + resolution: "koa@npm:2.15.3" + dependencies: + accepts: "npm:^1.3.5" + cache-content-type: "npm:^1.0.0" + content-disposition: "npm:~0.5.2" + content-type: "npm:^1.0.4" + cookies: "npm:~0.9.0" + debug: "npm:^4.3.2" + delegates: "npm:^1.0.0" + depd: "npm:^2.0.0" + destroy: "npm:^1.0.4" + encodeurl: "npm:^1.0.2" + escape-html: "npm:^1.0.3" + fresh: "npm:~0.5.2" + http-assert: "npm:^1.3.0" + http-errors: "npm:^1.6.3" + is-generator-function: "npm:^1.0.7" + koa-compose: "npm:^4.1.0" + koa-convert: "npm:^2.0.0" + on-finished: "npm:^2.3.0" + only: "npm:~0.0.2" + parseurl: "npm:^1.3.2" + statuses: "npm:^1.5.0" + type-is: "npm:^1.6.16" + vary: "npm:^1.1.2" + checksum: 10c0/1dca5027e06855dfc4144093fc678c445b5718c3a61b3b7840e3def999f3efcd0359665fb30d3f427890dfee12ebb1e7d01e210d2122a17240d2f3ceae12b2f2 + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + +"libbase64@npm:0.1.0": + version: 0.1.0 + resolution: "libbase64@npm:0.1.0" + checksum: 10c0/e6a8b0f6b4bba81ba82064d14c472dc9a57f064ef14a7d05a9d85ebf15f51af0c63634eb59dc595fa7e39ad73a57c92b025e78aa9d5f9260c400f9c5398ac5d1 + languageName: node + linkType: hard + +"libmime@npm:2.1.0": + version: 2.1.0 + resolution: "libmime@npm:2.1.0" + dependencies: + iconv-lite: "npm:0.4.13" + libbase64: "npm:0.1.0" + libqp: "npm:1.1.0" + checksum: 10c0/49d1ae677f851aba40056ca50e4a53dc5c904f58e1fe6ca6f9375a88128864e3a55f60e939d38806f0cfe78de65be55fb37a5be064d522a5aa006d31f69b1abb + languageName: node + linkType: hard + +"libmime@npm:^2.0.3": + version: 2.1.3 + resolution: "libmime@npm:2.1.3" + dependencies: + iconv-lite: "npm:0.4.15" + libbase64: "npm:0.1.0" + libqp: "npm:1.1.0" + checksum: 10c0/67959cf5fa99a0aaf158e1ca0deca0051619280cb7b17fb765c4fcc14e524e2fa3406e86150fa4f7904ce6a1b21051fa928c74af6832c93ee6c34517bb23d255 + languageName: node + linkType: hard + +"libqp@npm:1.1.0": + version: 1.1.0 + resolution: "libqp@npm:1.1.0" + checksum: 10c0/7be09651e4ad13faca701e0f34ea255b052fac01a347a82f1cf800c5db13879c00b5549332592c781d9f48d228b015d5d4df8a7f891c4139eca054202d450264 + languageName: node + linkType: hard + +"liftoff@npm:^4.0.0": + version: 4.0.0 + resolution: "liftoff@npm:4.0.0" + dependencies: + extend: "npm:^3.0.2" + findup-sync: "npm:^5.0.0" + fined: "npm:^2.0.0" + flagged-respawn: "npm:^2.0.0" + is-plain-object: "npm:^5.0.0" + object.map: "npm:^1.0.1" + rechoir: "npm:^0.8.0" + resolve: "npm:^1.20.0" + checksum: 10c0/c323c173f18f36100761f3e6017dffd0a0f5fd45f13254741b0edf8604a065afe6190812fddbde3d95220998a15b20acf4e44baa3cc3185b9c65bb5662b9c24a + languageName: node + linkType: hard + +"limiter@npm:^1.1.5": + version: 1.1.5 + resolution: "limiter@npm:1.1.5" + checksum: 10c0/ebe2b20a820d1f67b8e1724051246434c419b2da041a7e9cd943f6daf113b8d17a52a1bd88fb79be5b624c10283ecb737f50edb5c1c88c71f4cd367108c97300 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"linkify-it@npm:^3.0.1": + version: 3.0.3 + resolution: "linkify-it@npm:3.0.3" + dependencies: + uc.micro: "npm:^1.0.1" + checksum: 10c0/468cb4954f85cdfc16e169db89a42d65287e3f121a9448b29c3c00d64c6f5a8f4367bea3978ba9109a0e3a10b19d50632b983639f91b9be9f20d1f63a5ff5bc1 + languageName: node + linkType: hard + +"load-yaml-file@npm:^0.2.0": + version: 0.2.0 + resolution: "load-yaml-file@npm:0.2.0" + dependencies: + graceful-fs: "npm:^4.1.5" + js-yaml: "npm:^3.13.0" + pify: "npm:^4.0.1" + strip-bom: "npm:^3.0.0" + checksum: 10c0/e00ed43048c0648dfef7639129b6d7e5c2272bc36d2a50dd983dd495f3341a02cd2c40765afa01345f798d0d894e5ba53212449933e72ddfa4d3f7a48f822d2f + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^2.1.2" + checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 + languageName: node + linkType: hard + +"locate-path@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-path@npm:3.0.0" + dependencies: + p-locate: "npm:^3.0.0" + path-exists: "npm:^3.0.0" + checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash-es@npm:^4.17.15, lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 10c0/fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 + languageName: node + linkType: hard + +"lodash.clonedeep@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.clonedeep@npm:4.5.0" + checksum: 10c0/2caf0e4808f319d761d2939ee0642fa6867a4bbf2cfce43276698828380756b99d4c4fa226d881655e6ac298dd453fe12a5ec8ba49861777759494c534936985 + languageName: node + linkType: hard + +"lodash.deburr@npm:^4.1.0": + version: 4.1.0 + resolution: "lodash.deburr@npm:4.1.0" + checksum: 10c0/30c068e9c3b21d65d260887a8849fa7b94692f868adcc4527136c296b4e71ced7149f58e0f37154d3c56d7950cc605ad3e10b2ee0baedf5638af0befc5013ebc + languageName: node + linkType: hard + +"lodash.get@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: 10c0/48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e + languageName: node + linkType: hard + +"lodash.isplainobject@npm:4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 + languageName: node + linkType: hard + +"lodash@npm:4.17.21, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"log-symbols@npm:^6.0.0": + version: 6.0.0 + resolution: "log-symbols@npm:6.0.0" + dependencies: + chalk: "npm:^5.3.0" + is-unicode-supported: "npm:^1.3.0" + checksum: 10c0/36636cacedba8f067d2deb4aad44e91a89d9efb3ead27e1846e7b82c9a10ea2e3a7bd6ce28a7ca616bebc60954ff25c67b0f92d20a6a746bb3cc52c3701891f6 + languageName: node + linkType: hard + +"logform@npm:^2.4.0, logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" + dependencies: + "@colors/colors": "npm:1.6.0" + "@types/triple-beam": "npm:^1.3.2" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f + languageName: node + linkType: hard + +"loglevel@npm:^1.6.8": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 + languageName: node + linkType: hard + +"long-timeout@npm:0.1.1": + version: 0.1.1 + resolution: "long-timeout@npm:0.1.1" + checksum: 10c0/a62240cc8f449d7a00081e817ae543fb1ded4d9fc05492e9fa8d6868cb33b2c9d5d71176a6f8be4473df7ba4b208460b3073b0e05069c3ec286122f3e4b5747f + languageName: node + linkType: hard + +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 10c0/50a6417d15b06104dbe4e3d4a667c39b137f130a9108ea8752b352a4cfae047531a3ac351c181792f3f8768fe17cca6b0f406674a541a86fb638aaac560d83ed + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"lower-case-first@npm:^1.0.0": + version: 1.0.2 + resolution: "lower-case-first@npm:1.0.2" + dependencies: + lower-case: "npm:^1.1.2" + checksum: 10c0/e0689a82df329db44e28b0dd53ccace09a8a4918fc86aa6c08b091ec31bc5f3496a0b07cf7e81be065335bea996f7aa0fbe0163a3e6f019b0480a5f20a79e871 + languageName: node + linkType: hard + +"lower-case@npm:^1.1.0, lower-case@npm:^1.1.1, lower-case@npm:^1.1.2": + version: 1.1.4 + resolution: "lower-case@npm:1.1.4" + checksum: 10c0/2153ae5490d655a63addc8e7d2f848c6c94803b342ed2d177f75e8073e9fbb50a733d1432c82e1cb8425fa6eae14b2877bf5bbdcb93ab93bb982fb5c3962c57b + languageName: node + linkType: hard + +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b + languageName: node + linkType: hard + +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + +"lru-cache@npm:6.0.0, lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"lru-cache@npm:^7.10.1, lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + languageName: node + linkType: hard + +"lru-memoizer@npm:^2.2.0": + version: 2.3.0 + resolution: "lru-memoizer@npm:2.3.0" + dependencies: + lodash.clonedeep: "npm:^4.5.0" + lru-cache: "npm:6.0.0" + checksum: 10c0/13cf6bc9ff74cdb167078dbb66d4cf43adc802495da8f56097e6f388b4d7ccb91668beb809bdbc55b62d016c138d7c19a18c5883a2fdbcc7f508ad8a23ec7c65 + languageName: node + linkType: hard + +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b + languageName: node + linkType: hard + +"luxon@npm:^3.2.1": + version: 3.5.0 + resolution: "luxon@npm:3.5.0" + checksum: 10c0/335789bba95077db831ef99894edadeb23023b3eb2137a1b56acd0d290082b691cf793143d69e30bc069ec95f0b49f36419f48e951c68014f19ffe12045e3494 + languageName: node + linkType: hard + +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 10c0/36128e4de34791838abe979b19927c26e67201ca5acf00880377af7d765b38d1c60847e01c5ec61b1a260c48029084ab3893a3925fd6e48a04011364b089991b + languageName: node + linkType: hard + +"mailcomposer@npm:3.12.0": + version: 3.12.0 + resolution: "mailcomposer@npm:3.12.0" + dependencies: + buildmail: "npm:3.10.0" + libmime: "npm:2.1.0" + checksum: 10c0/282dd9b8f594e0840f20ceffafeed9b1ffb6de62d8c4b543c4d74b597628f6050fc013e6a3a7e1b8b2c33a6c8ad205dfed4ee807e5fc01a9e6802f57d09a69be + languageName: node + linkType: hard + +"make-dir@npm:^3.0.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1, make-error@npm:^1.3.6": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + +"make-iterator@npm:^1.0.0": + version: 1.0.1 + resolution: "make-iterator@npm:1.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/84b77d72e4af589a4e6069a9e0265ff55e63162b528aa085149060b7bf4e858c700892b95a073feaf517988cac75ca2e8d9ceb14243718b2f268dc4f4a90ff0a + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c + languageName: node + linkType: hard + +"map-cache@npm:^0.2.0": + version: 0.2.2 + resolution: "map-cache@npm:0.2.2" + checksum: 10c0/05e3eb005c1b80b9f949ca007687640e8c5d0fc88dc45c3c3ab4902a3bec79d66a58f3e3b04d6985d90cd267c629c7b46c977e9c34433e8c11ecfcbb9f0fa290 + languageName: node + linkType: hard + +"markdown-it-abbr@npm:^1.0.4": + version: 1.0.4 + resolution: "markdown-it-abbr@npm:1.0.4" + checksum: 10c0/eb53187e6cc09d0561da228b7bd7d5cc1a8f1cfae9a2e2e82a6dd620e4a63e7abeeff16d532791269779ac88c6ebc2d950ffe5519d2656bc6d1e4de4e1c0db7f + languageName: node + linkType: hard + +"markdown-it-container@npm:^3.0.0": + version: 3.0.0 + resolution: "markdown-it-container@npm:3.0.0" + checksum: 10c0/478dc04ec0348ad26a8bd5ee842e897d7aa47f4305023f1a6ac39b056e10b6ba66aed13b42223ee6abd15f5547570857bd0db63064af10386a612d0ac2e69ac1 + languageName: node + linkType: hard + +"markdown-it-deflist@npm:^2.1.0": + version: 2.1.0 + resolution: "markdown-it-deflist@npm:2.1.0" + checksum: 10c0/c311a5bb86d9f03396a93b672f1043582ecfb9299c4cdc831daa9046b3187830e9f2d124f5922a987b07de5012b5e2f59736ec9b396bf494995034c85165f185 + languageName: node + linkType: hard + +"markdown-it-emoji@npm:^2.0.0": + version: 2.0.2 + resolution: "markdown-it-emoji@npm:2.0.2" + checksum: 10c0/c22791a7e25b6b0d6f9fa6a9ed90d6d41dcb5751ffb5d2a811053c7400c37d2c9e0bbbc7b78d5449b36dc95e468177198e3431d9912c15970f729a95510d669d + languageName: node + linkType: hard + +"markdown-it-footnote@npm:^3.0.3": + version: 3.0.3 + resolution: "markdown-it-footnote@npm:3.0.3" + checksum: 10c0/b765a47720dbabd76f8b9379de4c4ac5a7963fff6a0f509f081955f0e7e338255410befadabf028b084883858b1f0fff11469bfa19a6521f096fb1d3734b4a74 + languageName: node + linkType: hard + +"markdown-it-ins@npm:^3.0.1": + version: 3.0.1 + resolution: "markdown-it-ins@npm:3.0.1" + checksum: 10c0/67d7e70792598dc0632b8f4d36e1a11e26c96a56d644fcb5b86b39686fbf537341714d42d90769ebee3ab4215895c9b6bc6874d0219d48bc613f377565bdacd9 + languageName: node + linkType: hard + +"markdown-it-mark@npm:^3.0.1": + version: 3.0.1 + resolution: "markdown-it-mark@npm:3.0.1" + checksum: 10c0/42da61be28278d5f19271455c1aafc4d28a1250ab6f0b2bd26eeb705ca120764f57caed79f23cd326ed0415d3bfd3fb74db9a2bdd3e87ece2d2f4ea9ada63f38 + languageName: node + linkType: hard + +"markdown-it-sub@npm:^1.0.0": + version: 1.0.0 + resolution: "markdown-it-sub@npm:1.0.0" + checksum: 10c0/e980d7f29afd0d8bf5703a4f15569acb568d1de4f9a9c0427f917fbaaaca2a5010b80798c9a89207f3cb18d308b04c3fb8e60dfd8b2a993117a5f0d0ab93d018 + languageName: node + linkType: hard + +"markdown-it-sup@npm:1.0.0": + version: 1.0.0 + resolution: "markdown-it-sup@npm:1.0.0" + checksum: 10c0/67493fac9f625dfea51f1bf0250683a73d1d14dc7fa02f14fffb97f5acb26575402cc384d5ed4b59d2cd7b097d695776650d2deaf318bdaf6e51e733cd554bb3 + languageName: node + linkType: hard + +"markdown-it@npm:^12.3.2": + version: 12.3.2 + resolution: "markdown-it@npm:12.3.2" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:~2.1.0" + linkify-it: "npm:^3.0.1" + mdurl: "npm:^1.0.1" + uc.micro: "npm:^1.0.5" + bin: + markdown-it: bin/markdown-it.js + checksum: 10c0/7f97b924e6f90e2c5ccdfb486a19bd7885b938f568a86b527bf6f916a16b01a298e6739f86a99e77acb5e7c020f6c8b34bd726364179b3f820e48b2971a6450c + languageName: node + linkType: hard + +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 10c0/0013463855e31b9c88d8bb2891a611d10ef1dc79f2e3cbff1bf71ba389e04c5971298c886af0be799d7fa9aa4593b086a136062d59f1210b0480b026a8c5dc47 + languageName: node + linkType: hard + +"match-sorter@npm:^6.0.2": + version: 6.3.4 + resolution: "match-sorter@npm:6.3.4" + dependencies: + "@babel/runtime": "npm:^7.23.8" + remove-accents: "npm:0.5.0" + checksum: 10c0/35d2a6b6df003c677d9ec87ecd4683657638f5bce856f43f9cf90b03e357ed2f09813ebbac759defa7e7438706936dd34dc2bfe1a18771f7d2541f14d639b4ad + languageName: node + linkType: hard + +"matcher@npm:^3.0.0": + version: 3.0.0 + resolution: "matcher@npm:3.0.0" + dependencies: + escape-string-regexp: "npm:^4.0.0" + checksum: 10c0/2edf24194a2879690bcdb29985fc6bc0d003df44e04df21ebcac721fa6ce2f6201c579866bb92f9380bffe946f11ecd8cd31f34117fb67ebf8aca604918e127e + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.0.0": + version: 1.0.0 + resolution: "math-intrinsics@npm:1.0.0" + checksum: 10c0/470ee2f267b4b3698eb9faa7f0bcf88696d87e2eeab25bba867dc676c09ddbae9b6f2e8ac7a2c1f0c9c2c5299c2a89f4f1f6d0e70d682725e2e7fca7507eef9f + languageName: node + linkType: hard + +"mdurl@npm:^1.0.1": + version: 1.0.1 + resolution: "mdurl@npm:1.0.1" + checksum: 10c0/ea8534341eb002aaa532a722daef6074cd8ca66202e10a2b4cda46722c1ebdb1da92197ac300bc953d3ef1bf41cd6561ef2cc69d82d5d0237dae00d4a61a4eee + languageName: node + linkType: hard + +"media-chrome@npm:^4.1.0": + version: 4.3.0 + resolution: "media-chrome@npm:4.3.0" + checksum: 10c0/a07b7886d938411b180b19f889b057162e0069085bd934b07ea2ae7990a11706842f1c5453458dcd9e63d3e05e3ac1d93484306f233cfdd907b7d058f8d68ab6 + languageName: node + linkType: hard + +"media-chrome@npm:~4.2.1": + version: 4.2.3 + resolution: "media-chrome@npm:4.2.3" + checksum: 10c0/88cd534dad0f67db90b5187de74ceff1affa3baf521850562aa55dc585547221538903b2c61f61bcd8347c47d5625cdb7560ba201aac2bc0fcfa648a73fbc1bb + languageName: node + linkType: hard + +"media-tracks@npm:~0.3.2": + version: 0.3.3 + resolution: "media-tracks@npm:0.3.3" + checksum: 10c0/ecd57e628222b6e0611f21813a291a47b30c96aa1c9d7e13546932b59e8bb206651961a36360cc5584bf76bf890ce01be3bb0c045facf76ab8b1cfacecf9808b + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 + languageName: node + linkType: hard + +"memfs@npm:^3.4.1, memfs@npm:^3.4.12": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" + dependencies: + fs-monkey: "npm:^1.0.4" + checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 + languageName: node + linkType: hard + +"memoize-one@npm:>=3.1.1 <6": + version: 5.2.1 + resolution: "memoize-one@npm:5.2.1" + checksum: 10c0/fd22dbe9a978a2b4f30d6a491fc02fb90792432ad0dab840dc96c1734d2bd7c9cdeb6a26130ec60507eb43230559523615873168bcbe8fafab221c30b11d54c1 + languageName: node + linkType: hard + +"memoize-one@npm:^6.0.0": + version: 6.0.0 + resolution: "memoize-one@npm:6.0.0" + checksum: 10c0/45c88e064fd715166619af72e8cf8a7a17224d6edf61f7a8633d740ed8c8c0558a4373876c9b8ffc5518c2b65a960266adf403cc215cb1e90f7e262b58991f54 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"methods@npm:^1.1.2, methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"microseconds@npm:0.2.0": + version: 0.2.0 + resolution: "microseconds@npm:0.2.0" + checksum: 10c0/59dfae1c696c0bacd79603c4df7cd0dcc9e091b7c5556aaca9b0832017d3c0b40ad8f57ca25e0ee5709ef1973404448c4a2fea6c9c1fad7d9e197ff5c1c9c2d5 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-db@npm:>= 1.43.0 < 2": + version: 1.53.0 + resolution: "mime-db@npm:1.53.0" + checksum: 10c0/1dcc37ba8ed5d1c179f5c6f0837e8db19371d5f2ea3690c3c2f3fa8c3858f976851d3460b172b4dee78ebd606762cbb407aa398545fbacd539e519f858cd7bf4 + languageName: node + linkType: hard + +"mime-types@npm:2.1.35, mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d + languageName: node + linkType: hard + +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"mini-css-extract-plugin@npm:2.7.7": + version: 2.7.7 + resolution: "mini-css-extract-plugin@npm:2.7.7" + dependencies: + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/e22f76d96966ee4dfc1318e0f4c45ac75638932df468dc7d103094e1c97cb2d01ea7ccfb354e39d9e57d1971218cdc92678b9c8676472b2f1f801bb514967c44 + languageName: node + linkType: hard + +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + +"minimatch@npm:^3.0.3, minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + +"mrmime@npm:^2.0.0": + version: 2.0.0 + resolution: "mrmime@npm:2.0.0" + checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: 10c0/18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 + languageName: node + linkType: hard + +"mute-stream@npm:1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c + languageName: node + linkType: hard + +"mux-embed@npm:^5.3.1": + version: 5.4.3 + resolution: "mux-embed@npm:5.4.3" + checksum: 10c0/fdb00b9afd0478cdaa811fb5546664ac3dab3bd04af5fb96a2f726fa489c1ae62d2bfe63124f037885269e0a9f663f9d7e2e8168487d22022663f24b716a0b17 + languageName: node + linkType: hard + +"mz@npm:^2.7.0": + version: 2.7.0 + resolution: "mz@npm:2.7.0" + dependencies: + any-promise: "npm:^1.0.0" + object-assign: "npm:^4.0.1" + thenify-all: "npm:^1.0.0" + checksum: 10c0/103114e93f87362f0b56ab5b2e7245051ad0276b646e3902c98397d18bb8f4a77f2ea4a2c9d3ad516034ea3a56553b60d3f5f78220001ca4c404bd711bd0af39 + languageName: node + linkType: hard + +"nano-time@npm:1.0.0": + version: 1.0.0 + resolution: "nano-time@npm:1.0.0" + dependencies: + big-integer: "npm:^1.6.16" + checksum: 10c0/3bd12e0bcd30867178afdbe8053b3dde5fdd1c665ecd348bf879863049344fbaf05cbb1d7806a825b91efbca011ee115eee52e76fb38b7da9c97931cd9e61f15 + languageName: node + linkType: hard + +"nanoclone@npm:^0.2.1": + version: 0.2.1 + resolution: "nanoclone@npm:0.2.1" + checksum: 10c0/760b569ea841c9678fdf8d763c6d7bb093f0889150087f82d86c536a318b302939c82ce35cdaec999d0f687789d0d79d0f3f75a272d7a98dfac7a067c0b47053 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.7": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 + languageName: node + linkType: hard + +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 10c0/37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + +"nexus@npm:1.3.0": + version: 1.3.0 + resolution: "nexus@npm:1.3.0" + dependencies: + iterall: "npm:^1.3.0" + tslib: "npm:^2.0.3" + peerDependencies: + graphql: 15.x || 16.x + checksum: 10c0/9e09d8db65bf112c4a91491cbffc1d3568d4785a04bb2d1c2522f97f683d6e4073d137005ddb41213609f05a1b2eb2f27e446dfd4b6d91bf12b707c483fbd36e + languageName: node + linkType: hard + +"no-case@npm:^2.2.0, no-case@npm:^2.3.2": + version: 2.3.2 + resolution: "no-case@npm:2.3.2" + dependencies: + lower-case: "npm:^1.1.1" + checksum: 10c0/63f306e83c18efa0bb37f1c23a25baf4ccf5ebaec70b482fa04d4c5bf8bbb8bcc9a8fbcd818af828ab69f2b602153daf81ec26e448b2bda2d704b8d0c7eec8fa + languageName: node + linkType: hard + +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/dbd0792ea729329cd9d099f28a5681ff9e8a6db48cf64e1437bf6a7fd669009d1e758a784619a1c4cc8bfd1ed17162f042c787654edf19a1f64b5018457c9c1f + languageName: node + linkType: hard + +"node-abort-controller@npm:^3.0.1, node-abort-controller@npm:^3.1.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 10c0/f7ad0e7a8e33809d4f3a0d1d65036a711c39e9d23e0319d80ebe076b9a3b4432b4d6b86a7fab65521de3f6872ffed36fc35d1327487c48eb88c517803403eda3 + languageName: node + linkType: hard + +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/d2699c4ad15740fd31482a3b6fca789af7723ab9d393adc6ac45250faaee72edad8f0b10b2b9d087df0de93f1bdc16d97afdd179b26b9ebc9ed68b569faa4bac + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a + languageName: node + linkType: hard + +"node-machine-id@npm:1.1.12": + version: 1.1.12 + resolution: "node-machine-id@npm:1.1.12" + checksum: 10c0/ab2fea5f75a6f1ce3c76c5e0ae3903b631230e0a99b003d176568fff8ddbdf7b2943be96cd8d220c497ca0f6149411831f8a450601929f326781cb1b59bab7f8 + languageName: node + linkType: hard + +"node-plop@npm:0.26.3": + version: 0.26.3 + resolution: "node-plop@npm:0.26.3" + dependencies: + "@babel/runtime-corejs3": "npm:^7.9.2" + "@types/inquirer": "npm:^6.5.0" + change-case: "npm:^3.1.0" + del: "npm:^5.1.0" + globby: "npm:^10.0.1" + handlebars: "npm:^4.4.3" + inquirer: "npm:^7.1.0" + isbinaryfile: "npm:^4.0.2" + lodash.get: "npm:^4.4.2" + mkdirp: "npm:^0.5.1" + resolve: "npm:^1.12.0" + checksum: 10c0/0c78e9911f032a9ccffa4f83612284d99db98f4792dca11c7aad241982bcdef1a3f8268c5feaa1be77d36adaae8db53e71a53da360151f2bec000bfdb9503a99 + languageName: node + linkType: hard + +"node-plop@npm:^0.32.0": + version: 0.32.0 + resolution: "node-plop@npm:0.32.0" + dependencies: + "@types/inquirer": "npm:^9.0.3" + change-case: "npm:^4.1.2" + del: "npm:^7.1.0" + globby: "npm:^13.2.2" + handlebars: "npm:^4.7.8" + inquirer: "npm:^9.2.10" + isbinaryfile: "npm:^5.0.0" + lodash.get: "npm:^4.4.2" + lower-case: "npm:^2.0.2" + mkdirp: "npm:^3.0.1" + resolve: "npm:^1.22.4" + title-case: "npm:^3.0.3" + upper-case: "npm:^2.0.2" + checksum: 10c0/83babd504c4d5f84638c8d1638f99d6d3cd3615162df5be118163c4231b56e09388032db40034ec8fd4c93ef2e8d75d50b7b4d90a3150358554b759663051b2a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.18": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa + languageName: node + linkType: hard + +"node-schedule@npm:2.1.1": + version: 2.1.1 + resolution: "node-schedule@npm:2.1.1" + dependencies: + cron-parser: "npm:^4.2.0" + long-timeout: "npm:0.1.1" + sorted-array-functions: "npm:^1.3.0" + checksum: 10c0/6ec51b34b9e676740ac25298e4ced5ee46053379f0d3aad533e51d7e083bc24ced045df1772a95bf9d9cfdb81299340bbf551549a7c5eb6e4d2dc6468c85c70e + languageName: node + linkType: hard + +"nodemailer-fetch@npm:1.6.0": + version: 1.6.0 + resolution: "nodemailer-fetch@npm:1.6.0" + checksum: 10c0/47b1aa2c7704582663b71b314251260bd9ceeb7f88cd016a27060a10dab41e21ad14e24a46fdbd1cf9a8c056824f99e56415653c6134b82e80c756baa67218b5 + languageName: node + linkType: hard + +"nodemailer-shared@npm:1.1.0": + version: 1.1.0 + resolution: "nodemailer-shared@npm:1.1.0" + dependencies: + nodemailer-fetch: "npm:1.6.0" + checksum: 10c0/15d19fb0d1b546527da4e2d443cd53e50c3a7638b5b33a1ccd7ddc401680bc9163337cf09f6fb4e76a5f12de42f5fadf85dad80e56378edc3c27dd641413b3f7 + languageName: node + linkType: hard + +"nodemon@npm:3.0.2": + version: 3.0.2 + resolution: "nodemon@npm:3.0.2" + dependencies: + chokidar: "npm:^3.5.2" + debug: "npm:^4" + ignore-by-default: "npm:^1.0.1" + minimatch: "npm:^3.1.2" + pstree.remy: "npm:^1.1.8" + semver: "npm:^7.5.3" + simple-update-notifier: "npm:^2.0.0" + supports-color: "npm:^5.5.0" + touch: "npm:^3.1.0" + undefsafe: "npm:^2.0.5" + bin: + nodemon: bin/nodemon.js + checksum: 10c0/65837603fa790d723f8d59e1f098342ed5a5517c3a38ea3b52ca3d532ed21924ecd43fbaceadb458472ae0a8ae6b8395bda22ccd062709ad50c5c4537a625c9d + languageName: node + linkType: hard + +"nodemon@npm:^2.0.15": + version: 2.0.22 + resolution: "nodemon@npm:2.0.22" + dependencies: + chokidar: "npm:^3.5.2" + debug: "npm:^3.2.7" + ignore-by-default: "npm:^1.0.1" + minimatch: "npm:^3.1.2" + pstree.remy: "npm:^1.1.8" + semver: "npm:^5.7.1" + simple-update-notifier: "npm:^1.0.7" + supports-color: "npm:^5.5.0" + touch: "npm:^3.1.0" + undefsafe: "npm:^2.0.5" + bin: + nodemon: bin/nodemon.js + checksum: 10c0/37e960b995b66e6d9e3b0e435ecc07a45200c4c566c4820a4deb6e7cc234b305e076a8ff0b4dc9c01ee690c663ae82a217d60c591dcbbcd4af1e3a7d0ad2b2c6 + languageName: node + linkType: hard + +"nodemon@npm:^3.1.0": + version: 3.1.7 + resolution: "nodemon@npm:3.1.7" + dependencies: + chokidar: "npm:^3.5.2" + debug: "npm:^4" + ignore-by-default: "npm:^1.0.1" + minimatch: "npm:^3.1.2" + pstree.remy: "npm:^1.1.8" + semver: "npm:^7.5.3" + simple-update-notifier: "npm:^2.0.0" + supports-color: "npm:^5.5.0" + touch: "npm:^3.1.0" + undefsafe: "npm:^2.0.5" + bin: + nodemon: bin/nodemon.js + checksum: 10c0/e0b46939abdbce251b1d6281005a5763cee57db295bb00bc4a753b0f5320dac00fe53547fb6764c70a086cf6d1238875cccb800fbc71544b3ecbd3ef71183c87 + languageName: node + linkType: hard + +"noms@npm:0.0.0": + version: 0.0.0 + resolution: "noms@npm:0.0.0" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:~1.0.31" + checksum: 10c0/7790dbbef45c593b5444b361cb9cde3260244ab66aaa199c0728d334525eb69df96231115cff260b71b92fc7a6915a642aa22f2f8448696d8dd6e7d7cebfccce + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + +"npm-bundled@npm:^1.1.1": + version: 1.1.2 + resolution: "npm-bundled@npm:1.1.2" + dependencies: + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 10c0/3f2337789afc8cb608a0dd71cefe459531053d48a5497db14b07b985c4cab15afcae88600db9f92eae072c89b982eeeec8e4463e1d77bc03a7e90f5dacf29769 + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^1.0.1": + version: 1.0.1 + resolution: "npm-normalize-package-bin@npm:1.0.1" + checksum: 10c0/b0c8c05fe419a122e0ff970ccbe7874ae24b4b4b08941a24d18097fe6e1f4b93e3f6abfb5512f9c5488827a5592f2fb3ce2431c41d338802aed24b9a0c160551 + languageName: node + linkType: hard + +"npm-packlist@npm:^2.1.5": + version: 2.2.2 + resolution: "npm-packlist@npm:2.2.2" + dependencies: + glob: "npm:^7.1.6" + ignore-walk: "npm:^3.0.3" + npm-bundled: "npm:^1.1.1" + npm-normalize-package-bin: "npm:^1.0.1" + bin: + npm-packlist: bin/index.js + checksum: 10c0/cf0b1350bfa2e4bdef5e283365fb54811bd095f4b6c8e5f1352a12a155f9aafbd22776b5a79fea7c5e952fab2e72c40f54cea2e139d7d705cfc6f6f955f1aa48 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd + languageName: node + linkType: hard + +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 + languageName: node + linkType: hard + +"object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.defaults@npm:^1.1.0": + version: 1.1.0 + resolution: "object.defaults@npm:1.1.0" + dependencies: + array-each: "npm:^1.0.1" + array-slice: "npm:^1.0.0" + for-own: "npm:^1.0.0" + isobject: "npm:^3.0.0" + checksum: 10c0/9ed5c41ce500c2dce2e6f8baa71b0e73b013dcd57c02e545dd85b46e52140af707e2b05c31f6126209f8b15709f10817ddbe6fb5c13f8d873d811694f28ee3fd + languageName: node + linkType: hard + +"object.map@npm:^1.0.1": + version: 1.0.1 + resolution: "object.map@npm:1.0.1" + dependencies: + for-own: "npm:^1.0.0" + make-iterator: "npm:^1.0.0" + checksum: 10c0/f5dff48d3aa6604e8c1983c988a1314b8858181cbedc1671a83c8db6f247a97f31a7acb7ec1b85a72a785149bc34ffbd284d953d902fef7a3c19e2064959a0aa + languageName: node + linkType: hard + +"object.pick@npm:^1.3.0": + version: 1.3.0 + resolution: "object.pick@npm:1.3.0" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/cd316ec986e49895a28f2df9182de9cdeee57cd2a952c122aacc86344c28624fe002d9affc4f48b5014ec7c033da9942b08821ddb44db8c5bac5b3ec54bdc31e + languageName: node + linkType: hard + +"oblivious-set@npm:1.0.0": + version: 1.0.0 + resolution: "oblivious-set@npm:1.0.0" + checksum: 10c0/ca8640474ea1e1feb3b5c98d42f5649f114ac4513ef84774e724f22fc7e529f1de3e7f26a0d9593097ab8942ca0bb8c241f7c1bd63c3e33047dd49de3aca9805 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1, on-finished@npm:^2.3.0": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"onetime@npm:^7.0.0": + version: 7.0.0 + resolution: "onetime@npm:7.0.0" + dependencies: + mimic-function: "npm:^5.0.0" + checksum: 10c0/5cb9179d74b63f52a196a2e7037ba2b9a893245a5532d3f44360012005c9cadb60851d56716ebff18a6f47129dab7168022445df47c2aff3b276d92585ed1221 + languageName: node + linkType: hard + +"only@npm:~0.0.2": + version: 0.0.2 + resolution: "only@npm:0.0.2" + checksum: 10c0/d26b1347835a5a9b17afbd889ed60de3d3ae14cdeca5ba008d86e6bf055466a431adc731b82e1e8ab24a3b8be5b5c2cdbc16e652d231d18cc1a5752320aaf0a0 + languageName: node + linkType: hard + +"open@npm:8.4.0": + version: 8.4.0 + resolution: "open@npm:8.4.0" + dependencies: + define-lazy-prop: "npm:^2.0.0" + is-docker: "npm:^2.1.1" + is-wsl: "npm:^2.2.0" + checksum: 10c0/585596580226cbeb7262f36b5acc7eed05211dc26980020a2527f829336b8b07fd79cdc4240f4d995b5615f635e0a59ebb0261c4419fef91edd5d4604c463f18 + languageName: node + linkType: hard + +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 + languageName: node + linkType: hard + +"ora@npm:5.4.1, ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 + languageName: node + linkType: hard + +"ora@npm:^8.0.0": + version: 8.1.1 + resolution: "ora@npm:8.1.1" + dependencies: + chalk: "npm:^5.3.0" + cli-cursor: "npm:^5.0.0" + cli-spinners: "npm:^2.9.2" + is-interactive: "npm:^2.0.0" + is-unicode-supported: "npm:^2.0.0" + log-symbols: "npm:^6.0.0" + stdin-discarder: "npm:^0.2.2" + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/996a81a9e997481339de3a7996c56131ea292c0a0e9e42d1cd454e2390f1ce7015ec925dcdd29e3d74dc5d037a4aa1877e575b491555507bcd9f219df760a63f + languageName: node + linkType: hard + +"os-paths@npm:^7.4.0": + version: 7.4.0 + resolution: "os-paths@npm:7.4.0" + dependencies: + fsevents: "npm:*" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/196b31eaba32d56780ad42674c7fab22f9cdc811c90bca0e7eb9b016ce76ad8eb4d32dc537e7eea8ca11627b6e2c709ae9a1287d7b265c3b6feb855f87579022 + languageName: node + linkType: hard + +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"outdent@npm:0.8.0": + version: 0.8.0 + resolution: "outdent@npm:0.8.0" + checksum: 10c0/d8a6c38b838b7ac23ebf1cc50442312f4efe286b211dbe5c71fa84d5daa2512fb94a8f2df1389313465acb0b4e5fa72270dd78f519f3d4db5bc22b2762c86827 + languageName: node + linkType: hard + +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + +"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^3.0.0": + version: 3.0.0 + resolution: "p-locate@npm:3.0.0" + dependencies: + p-limit: "npm:^2.0.0" + checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-map@npm:4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-map@npm:^3.0.0": + version: 3.0.0 + resolution: "p-map@npm:3.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/297930737e52412ad9f5787c52774ad6496fad9a8be5f047e75fd0a3dc61930d8f7a9b2bbe1c4d1404e54324228a4f69721da2538208dadaa4ef4c81773c9f20 + languageName: node + linkType: hard + +"p-map@npm:^5.5.0": + version: 5.5.0 + resolution: "p-map@npm:5.5.0" + dependencies: + aggregate-error: "npm:^4.0.0" + checksum: 10c0/410bce846b1e3db6bb2ccab6248372ecf4e635fc2b31331c8f56478e73fec9e146e8b4547585e635703160a3d252a6a65b8f855834aebc2c3408eb5789630cc4 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"package-json@npm:7.0.0": + version: 7.0.0 + resolution: "package-json@npm:7.0.0" + dependencies: + got: "npm:^11.8.2" + registry-auth-token: "npm:^4.0.0" + registry-url: "npm:^5.0.0" + semver: "npm:^7.3.5" + checksum: 10c0/8d36759b19e9fc2dbd40145ca6f43ee6da127f811e398b146b5cae61b8a79d553f4e1d0263965e971b194ea077288c656bbc12a1bd5f536eb96a0ee1d143fe33 + languageName: node + linkType: hard + +"param-case@npm:^2.1.0": + version: 2.1.1 + resolution: "param-case@npm:2.1.1" + dependencies: + no-case: "npm:^2.2.0" + checksum: 10c0/8ea1b8472fd51d5f50b28d1d754899713805d05f2241e9b8c4acafa2c500b3f47457a3b4932ab75220f14d2c69180bb7338b78a45576e2b4d90da1e6f0285833 + languageName: node + linkType: hard + +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-filepath@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-filepath@npm:1.0.2" + dependencies: + is-absolute: "npm:^1.0.0" + map-cache: "npm:^0.2.0" + path-root: "npm:^0.1.1" + checksum: 10c0/37bbd225fa864257246777efbdf72a9305c4ae12110bf467d11994e93f8be60dd309dcef68124a2c78c5d3b4e64e1c36fcc2560e2ea93fd97767831e7a446805 + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + +"parse-passwd@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-passwd@npm:1.0.0" + checksum: 10c0/1c05c05f95f184ab9ca604841d78e4fe3294d46b8e3641d305dcc28e930da0e14e602dbda9f3811cd48df5b0e2e27dbef7357bf0d7c40e41b18c11c3a8b8d17b + languageName: node + linkType: hard + +"parse-path@npm:^7.0.0": + version: 7.0.0 + resolution: "parse-path@npm:7.0.0" + dependencies: + protocols: "npm:^2.0.0" + checksum: 10c0/e7646f6b998b083bbd40102643d803557ce4ae18ae1704e6cc7ae2525ea7c5400f4a3635aca3244cfe65ce4dd0ff77db1142dde4d080e8a80c364c4b3e8fe8d2 + languageName: node + linkType: hard + +"parse-srcset@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-srcset@npm:1.0.2" + checksum: 10c0/2f268e3d110d4c53d06ed2a8e8ee61a7da0cee13bf150819a6da066a8ca9b8d15b5600d6e6cae8be940e2edc50ee7c1e1052934d6ec858324065ecef848f0497 + languageName: node + linkType: hard + +"parse-url@npm:^8.1.0": + version: 8.1.0 + resolution: "parse-url@npm:8.1.0" + dependencies: + parse-path: "npm:^7.0.0" + checksum: 10c0/68b95afdf4bbf72e57c7ab66f8757c935fff888f7e2b0f1e06098b4faa19e06b6b743bddaed5bc8df4f0c2de6fc475355d787373b2fdd40092be9e4e4b996648 + languageName: node + linkType: hard + +"parseurl@npm:^1.3.2, parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + +"pascal-case@npm:^2.0.0": + version: 2.0.1 + resolution: "pascal-case@npm:2.0.1" + dependencies: + camel-case: "npm:^3.0.0" + upper-case-first: "npm:^1.1.0" + checksum: 10c0/84420c1ceeee36eebe7a6975926f50500563f2c664160b952ff78774af85696d06d52a0fbfeb28c063ee37da6c83665d2518a4fefc9c66996226cabb04a1319e + languageName: node + linkType: hard + +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 + languageName: node + linkType: hard + +"passport-local@npm:1.0.0": + version: 1.0.0 + resolution: "passport-local@npm:1.0.0" + dependencies: + passport-strategy: "npm:1.x.x" + checksum: 10c0/59becb988014921a5d6056470d9373c41db452fcf113323064f39d53baa6f184e72151bf269ca6770511f7f0260e13632dacc7b6afdbf60ebf63e90327e186d4 + languageName: node + linkType: hard + +"passport-strategy@npm:1.x.x": + version: 1.0.0 + resolution: "passport-strategy@npm:1.0.0" + checksum: 10c0/cf4cd32e1bf2538a239651581292fbb91ccc83973cde47089f00d2014c24bed63d3e65af21da8ddef649a8896e089eb9c3ac9ca639f36c797654ae9ee4ed65e1 + languageName: node + linkType: hard + +"passport@npm:^0.6.0": + version: 0.6.0 + resolution: "passport@npm:0.6.0" + dependencies: + passport-strategy: "npm:1.x.x" + pause: "npm:0.0.1" + utils-merge: "npm:^1.0.1" + checksum: 10c0/1d8651a4a1a72b84ea08c498cff9cfc209aebfe18baed4cf93292ded3f8e30a04e30b404fdfce39dfb6aa7247e205f1df43fbfd7bc7c1a67a600884359d46ee6 + languageName: node + linkType: hard + +"path-case@npm:^2.1.0": + version: 2.1.1 + resolution: "path-case@npm:2.1.1" + dependencies: + no-case: "npm:^2.2.0" + checksum: 10c0/ea74c24b55cbc2a9d766415e79f53d48a4227cecd0259a00dc4392df6195f68055de164f90c27a3b2056c1977a28a99b2916b66bade0cbf6cf18a8045e76c922 + languageName: node + linkType: hard + +"path-case@npm:^3.0.4": + version: 3.0.4 + resolution: "path-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/b6b14637228a558793f603aaeb2fcd981e738b8b9319421b713532fba96d75aa94024b9f6b9ae5aa33d86755144a5b36697d28db62ae45527dbd672fcc2cf0b7 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:1.0.1, path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-root-regex@npm:^0.1.0": + version: 0.1.2 + resolution: "path-root-regex@npm:0.1.2" + checksum: 10c0/27651a234f280c70d982dd25c35550f74a4284cde6b97237aab618cb4b5745682d18cdde1160617bb4a4b6b8aec4fbc911c4a2ad80d01fa4c7ee74dae7af2337 + languageName: node + linkType: hard + +"path-root@npm:^0.1.1": + version: 0.1.1 + resolution: "path-root@npm:0.1.1" + dependencies: + path-root-regex: "npm:^0.1.0" + checksum: 10c0/aed5cd290df84c46c7730f6a363e95e47a23929b51ab068a3818d69900da3e89dc154cdfd0c45c57b2e02f40c094351bc862db70c2cb00b7e6bd47039a227813 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1, path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b + languageName: node + linkType: hard + +"path-to-regexp@npm:^6.1.0, path-to-regexp@npm:^6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"path@npm:^0.12.7": + version: 0.12.7 + resolution: "path@npm:0.12.7" + dependencies: + process: "npm:^0.11.1" + util: "npm:^0.10.3" + checksum: 10c0/f795ce5438a988a590c7b6dfd450ec9baa1c391a8be4c2dea48baa6e0f5b199e56cd83b8c9ebf3991b81bea58236d2c32bdafe2c17a2e70c3a2e4c69891ade59 + languageName: node + linkType: hard + +"pause@npm:0.0.1": + version: 0.0.1 + resolution: "pause@npm:0.0.1" + checksum: 10c0/f362655dfa7f44b946302c5a033148852ed5d05f744bd848b1c7eae6a543f743e79c7751ee896ba519fd802affdf239a358bb2ea5ca1b1c1e4e916279f83ab75 + languageName: node + linkType: hard + +"pg-connection-string@npm:2.6.1": + version: 2.6.1 + resolution: "pg-connection-string@npm:2.6.1" + checksum: 10c0/e5a71a2da143b8dc17143a9db7737679b210643771aa678d3bc60c7bc70da11bbb8e2d531be91c8c4eddd6ac6046307811e793f5850b9ba595a11785c948a417 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"pkg-up@npm:3.1.0": + version: 3.1.0 + resolution: "pkg-up@npm:3.1.0" + dependencies: + find-up: "npm:^3.0.0" + checksum: 10c0/ecb60e1f8e1f611c0bdf1a0b6a474d6dfb51185567dc6f29cdef37c8d480ecba5362e006606bb290519bbb6f49526c403fabea93c3090c20368d98bb90c999ab + languageName: node + linkType: hard + +"player.style@npm:^0.0.8": + version: 0.0.8 + resolution: "player.style@npm:0.0.8" + dependencies: + media-chrome: "npm:^4.1.0" + checksum: 10c0/a0e45a2a5d44ad423e2c0feb3b41c0219481ff95eab100e1c905e7f49a550c86ee362e09a8ac87279301a182795aed058245aec277bf039ba2e63161f8dca44f + languageName: node + linkType: hard + +"plop@npm:4.0.1": + version: 4.0.1 + resolution: "plop@npm:4.0.1" + dependencies: + "@types/liftoff": "npm:^4.0.3" + chalk: "npm:^5.3.0" + interpret: "npm:^3.1.1" + liftoff: "npm:^4.0.0" + minimist: "npm:^1.2.8" + node-plop: "npm:^0.32.0" + ora: "npm:^8.0.0" + v8flags: "npm:^4.0.1" + bin: + plop: bin/plop.js + checksum: 10c0/2143c028f35a9bc14ac7d7195dcd3fbe2369a6957fb5a5fbdd3a60e9d2a16ccad73deccf829fa04e8dee647cdaeae1066d84e6c3c5958caf3a3a5314a781aa7c + languageName: node + linkType: hard + +"pluralize@npm:8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10c0/2044cfc34b2e8c88b73379ea4a36fc577db04f651c2909041b054c981cd863dd5373ebd030123ab058d194ae615d3a97cfdac653991e499d10caf592e8b3dc33 + languageName: node + linkType: hard + +"pony-cause@npm:^2.1.4": + version: 2.1.11 + resolution: "pony-cause@npm:2.1.11" + checksum: 10c0/d5db6489ec42f8fcce0fd9ad2052be98cd8f63814bf32819694ec1f4c6a01bc3be6181050d83bc79e95272174a5b9776d1c2af1fa79ef51e0ccc0f97c22b1420 + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/b0b83feb2a4b61f5383979d37f23116c99bc146eba1741ca3cf1acca0e4d0dbf293ac1810a6ab4eccbe1ee76440dd0a9eb2db5b3bba4f99fc1b3ded16baa6358 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: "npm:^5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-selector-parser@npm:7.0.0" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.0.2, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 + languageName: node + linkType: hard + +"postcss@npm:8.4.38": + version: 8.4.38 + resolution: "postcss@npm:8.4.38" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.0.0" + source-map-js: "npm:^1.2.0" + checksum: 10c0/955407b8f70cf0c14acf35dab3615899a2a60a26718a63c848cf3c29f2467b0533991b985a2b994430d890bd7ec2b1963e36352b0774a19143b5f591540f7c06 + languageName: node + linkType: hard + +"postcss@npm:^8.3.11, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.43": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 + languageName: node + linkType: hard + +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/e64868ba9ef2068fd7264f5b03e5298a901e02a450acdb1f56258d88c09dea601eefdb3d1dfdff8513fdd230a92961712be0676192626a3b4d01ba154d48bdd3 + languageName: node + linkType: hard + +"preferred-pm@npm:3.1.2": + version: 3.1.2 + resolution: "preferred-pm@npm:3.1.2" + dependencies: + find-up: "npm:^5.0.0" + find-yarn-workspace-root2: "npm:1.2.16" + path-exists: "npm:^4.0.0" + which-pm: "npm:2.0.0" + checksum: 10c0/0c1a876461d41ddd8c5ecdcb4be2b8c93b408857c8b7ff7a14312920301b7458061d620b476da90e16b27a2d7d19688a51bdeddf200557ad1d925658f05796f8 + languageName: node + linkType: hard + +"prettier-plugin-packagejson@npm:2.5.2": + version: 2.5.2 + resolution: "prettier-plugin-packagejson@npm:2.5.2" + dependencies: + sort-package-json: "npm:2.10.1" + synckit: "npm:0.9.1" + peerDependencies: + prettier: ">= 1.16.0" + peerDependenciesMeta: + prettier: + optional: true + checksum: 10c0/ddaf6a662f0156ad1a34d4e891b6ea05398de4fe56d6d14f4802f79b4824c71602e09661e665e0228232313a5cd27fe6d9d481080d6dd41620f9cf7fb285d240 + languageName: node + linkType: hard + +"prettier@npm:2.8.8": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: 10c0/463ea8f9a0946cd5b828d8cf27bd8b567345cf02f56562d5ecde198b91f47a76b7ac9eae0facd247ace70e927143af6135e8cf411986b8cb8478784a4d6d724a + languageName: node + linkType: hard + +"prettier@npm:3.3.3": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 + languageName: node + linkType: hard + +"prettier@npm:^3.3.3": + version: 3.4.2 + resolution: "prettier@npm:3.4.2" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 + languageName: node + linkType: hard + +"pretty-error@npm:^4.0.0": + version: 4.0.0 + resolution: "pretty-error@npm:4.0.0" + dependencies: + lodash: "npm:^4.17.20" + renderkid: "npm:^3.0.0" + checksum: 10c0/dc292c087e2857b2e7592784ab31e37a40f3fa918caa11eba51f9fb2853e1d4d6e820b219917e35f5721d833cfd20fdf4f26ae931a90fd1ad0cae2125c345138 + languageName: node + linkType: hard + +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: "npm:^5.0.1" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^17.0.1" + checksum: 10c0/0cbda1031aa30c659e10921fa94e0dd3f903ecbbbe7184a729ad66f2b6e7f17891e8c7d7654c458fa4ccb1a411ffb695b4f17bbcd3fe075fabe181027c4040ed + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"pretty-ms@npm:^9.0.0": + version: 9.2.0 + resolution: "pretty-ms@npm:9.2.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"process@npm:^0.11.1": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"progress-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "progress-stream@npm:2.0.0" + dependencies: + speedometer: "npm:~1.0.0" + through2: "npm:~2.0.3" + checksum: 10c0/25902a05d05932a49879bfb87bc1a5f6ea80d1174e1ed00c9fa6d28d22b8628c6d7fbc575ec3a552c070352158b8aa67d5584562d4c7032ccc706596f52e537d + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prompts@npm:2.4.2, prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + +"prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + languageName: node + linkType: hard + +"property-expr@npm:^2.0.4": + version: 2.0.6 + resolution: "property-expr@npm:2.0.6" + checksum: 10c0/69b7da15038a1146d6447c69c445306f66a33c425271235bb20507f1846dbf9577a8f9dfafe8acbfcb66f924b270157f155248308f026a68758f35fc72265b3c + languageName: node + linkType: hard + +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: 10c0/b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 + languageName: node + linkType: hard + +"protocols@npm:^2.0.0, protocols@npm:^2.0.1": + version: 2.0.1 + resolution: "protocols@npm:2.0.1" + checksum: 10c0/016cc58a596e401004a028a2f7005e3444bf89ee8f606409c411719374d1e8bba0464fc142a065cce0d19f41669b2f7ffe25a8bde4f16ce3b6eb01fabc51f2e7 + languageName: node + linkType: hard + +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 10c0/30f78c88ce6393cb3f7834216cb6e282eb83c92ccb227430d4590298ab2811bc4a4745f850a27c5178e79a8f3e316591de0fec87abc19da648c2b3c6eb766d14 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.2 + resolution: "pump@npm:3.0.2" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + +"punycode@npm:2.3.1, punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"qs@npm:6.11.1": + version: 6.11.1 + resolution: "qs@npm:6.11.1" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 10c0/7ec57d3d62334c6313346b54f2b588b28c983793bf73981b77d769396fbb04fec911fa4e8a085528c3ebe7c04cfc9c9130410b277b3328da91087ae8ca728437 + languageName: node + linkType: hard + +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + +"qs@npm:^6.11.0, qs@npm:^6.5.2": + version: 6.13.1 + resolution: "qs@npm:6.13.1" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10c0/5ef527c0d62ffca5501322f0832d800ddc78eeb00da3b906f1b260ca0492721f8cdc13ee4b8fd8ac314a6ec37b948798c7b603ccc167e954088df392092f160c + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"queue-tick@npm:^1.0.1": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 10c0/0db998e2c9b15215317dbcf801e9b23e6bcde4044e115155dae34f8e7454b9a783f737c9a725528d677b7a66c775eb7a955cf144fe0b87f62b575ce5bfd515a9 + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:2.5.2, raw-body@npm:^2.3.3": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 + languageName: node + linkType: hard + +"rc@npm:1.2.8, rc@npm:^1.2.7, rc@npm:^1.2.8": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"react-dnd-html5-backend@npm:16.0.1, react-dnd-html5-backend@npm:^16.0.1": + version: 16.0.1 + resolution: "react-dnd-html5-backend@npm:16.0.1" + dependencies: + dnd-core: "npm:^16.0.1" + checksum: 10c0/6e4b632a11e20211d71f5f3bedadf13ecec2fa73372fde388619838294b1375f15b717d1ce128e12c872ff7b15c32d26761d2026b33c14fc55e4fd5477c15289 + languageName: node + linkType: hard + +"react-dnd@npm:16.0.1, react-dnd@npm:^16.0.1": + version: 16.0.1 + resolution: "react-dnd@npm:16.0.1" + dependencies: + "@react-dnd/invariant": "npm:^4.0.1" + "@react-dnd/shallowequal": "npm:^4.0.1" + dnd-core: "npm:^16.0.1" + fast-deep-equal: "npm:^3.1.3" + hoist-non-react-statics: "npm:^3.3.2" + peerDependencies: + "@types/hoist-non-react-statics": ">= 3.3.1" + "@types/node": ">= 12" + "@types/react": ">= 16" + react: ">= 16.14" + peerDependenciesMeta: + "@types/hoist-non-react-statics": + optional: true + "@types/node": + optional: true + "@types/react": + optional: true + checksum: 10c0/d069435750f0d6653cfa2b951cac8abb3583fb144ff134a20176608877d9c5964c63384ebbacaa0fdeef819b592a103de0d8e06f3b742311d64a029ffed0baa3 + languageName: node + linkType: hard + +"react-dom@npm:^18.3.1": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 + languageName: node + linkType: hard + +"react-fast-compare@npm:^2.0.1": + version: 2.0.4 + resolution: "react-fast-compare@npm:2.0.4" + checksum: 10c0/f0300c677e95198b5f993cbb8a983dab09586157dc678f9e2b5b29ff941b6677a8776fbbdc425ce102fad86937e36bb45cfcfd797f006270b97ccf287ebfb885 + languageName: node + linkType: hard + +"react-fast-compare@npm:^3.1.1": + version: 3.2.2 + resolution: "react-fast-compare@npm:3.2.2" + checksum: 10c0/0bbd2f3eb41ab2ff7380daaa55105db698d965c396df73e6874831dbafec8c4b5b08ba36ff09df01526caa3c61595247e3269558c284e37646241cba2b90a367 + languageName: node + linkType: hard + +"react-helmet@npm:^6.1.0": + version: 6.1.0 + resolution: "react-helmet@npm:6.1.0" + dependencies: + object-assign: "npm:^4.1.1" + prop-types: "npm:^15.7.2" + react-fast-compare: "npm:^3.1.1" + react-side-effect: "npm:^2.1.0" + peerDependencies: + react: ">=16.3.0" + checksum: 10c0/1d2831d9c3b4f5c91f020076aeb6502437a4788077d0c438421e466eb9633d5dc2aacedf7b779a970b807d61cf87793c5ff76ee3190a185d71c90b5cfb367e96 + languageName: node + linkType: hard + +"react-intl@npm:6.6.2": + version: 6.6.2 + resolution: "react-intl@npm:6.6.2" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/intl": "npm:2.10.0" + "@formatjs/intl-displaynames": "npm:6.6.6" + "@formatjs/intl-listformat": "npm:7.5.5" + "@types/hoist-non-react-statics": "npm:^3.3.1" + "@types/react": "npm:16 || 17 || 18" + hoist-non-react-statics: "npm:^3.3.2" + intl-messageformat: "npm:10.5.11" + tslib: "npm:^2.4.0" + peerDependencies: + react: ^16.6.0 || 17 || 18 + typescript: ^4.7 || 5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/78288a0fded816735812dca6dcfee3eaa8bb3af7e963ba47639b51cc700a102a526859ff647ca79a5ebcdc69d6d78da90daeeed15cc0b819c7a20a74b2e1469c + languageName: node + linkType: hard + +"react-intl@npm:^6.6.8": + version: 6.8.9 + resolution: "react-intl@npm:6.8.9" + dependencies: + "@formatjs/ecma402-abstract": "npm:2.2.4" + "@formatjs/icu-messageformat-parser": "npm:2.9.4" + "@formatjs/intl": "npm:2.10.15" + "@formatjs/intl-displaynames": "npm:6.8.5" + "@formatjs/intl-listformat": "npm:7.7.5" + "@types/hoist-non-react-statics": "npm:3" + "@types/react": "npm:16 || 17 || 18" + hoist-non-react-statics: "npm:3" + intl-messageformat: "npm:10.7.7" + tslib: "npm:2" + peerDependencies: + react: ^16.6.0 || 17 || 18 + typescript: ^4.7 || 5 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d42a6252beac5448b4a248d84923b0f75dfbbee6208cd5c49ac2f525714ab94efe2a4933d464c64cb161ddccaa37b83dffb2dd0529428219b8a60ce548da3e57 + languageName: node + linkType: hard + +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + languageName: node + linkType: hard + +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 10c0/2bdb6b93fbb1820b024b496042cce405c57e2f85e777c9aabd55f9b26d145408f9f74f5934676ffdc46f3dcff656d78413a6e43968e7b3f92eea35b3052e9053 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0, react-is@npm:^18.2.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 + languageName: node + linkType: hard + +"react-query@npm:3.39.3": + version: 3.39.3 + resolution: "react-query@npm:3.39.3" + dependencies: + "@babel/runtime": "npm:^7.5.5" + broadcast-channel: "npm:^3.4.1" + match-sorter: "npm:^6.0.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 10c0/319045ef31b9b02aa9b5446169a8c6f95cfe49406466b819cc85e41c29bfe5032d3732577efe56511278db41514772375d416a3e3976e8967c6e0972ff04dd2e + languageName: node + linkType: hard + +"react-redux@npm:8.1.3": + version: 8.1.3 + resolution: "react-redux@npm:8.1.3" + dependencies: + "@babel/runtime": "npm:^7.12.1" + "@types/hoist-non-react-statics": "npm:^3.3.1" + "@types/use-sync-external-store": "npm:^0.0.3" + hoist-non-react-statics: "npm:^3.3.2" + react-is: "npm:^18.0.0" + use-sync-external-store: "npm:^1.0.0" + peerDependencies: + "@types/react": ^16.8 || ^17.0 || ^18.0 + "@types/react-dom": ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: ">=0.59" + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + checksum: 10c0/64c8be2765568dc66a3c442a41dd0ed74fe048d5ceb7a4fe72e5bac3d3687996a7115f57b5156af7406521087065a0e60f9194318c8ca99c55e9ce48558980ce + languageName: node + linkType: hard + +"react-refresh@npm:0.14.0": + version: 0.14.0 + resolution: "react-refresh@npm:0.14.0" + checksum: 10c0/b8ae07ad153357d77830928a7f1fc2df837aabefee907fa273ba04c7643f3b860e986f1d4b7ada9b721c8d79b8c24b5b911a314a1a2398b105f1b13d19ea2b8d + languageName: node + linkType: hard + +"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.6": + version: 2.3.6 + resolution: "react-remove-scroll-bar@npm:2.3.6" + dependencies: + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/4e32ee04bf655a8bd3b4aacf6ffc596ae9eb1b9ba27eef83f7002632ee75371f61516ae62250634a9eae4b2c8fc6f6982d9b182de260f6c11841841e6e2e7515 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.10": + version: 2.5.10 + resolution: "react-remove-scroll@npm:2.5.10" + dependencies: + react-remove-scroll-bar: "npm:^2.3.6" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/5057ebf11cf6b7a9126087c37be56f08bb96065906d871e7715f94caf74d980e01df8ad074e049d9d2f40d2946e50c14bd3c77966bcf4bf1d53ca303ecc64955 + languageName: node + linkType: hard + +"react-remove-scroll@npm:2.5.5": + version: 2.5.5 + resolution: "react-remove-scroll@npm:2.5.5" + dependencies: + react-remove-scroll-bar: "npm:^2.3.3" + react-style-singleton: "npm:^2.2.1" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.0" + use-sidecar: "npm:^1.1.2" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/4952657e6a7b9d661d4ad4dfcef81b9c7fa493e35164abff99c35c0b27b3d172ef7ad70c09416dc44dd14ff2e6b38a5ec7da27e27e90a15cbad36b8fd2fd8054 + languageName: node + linkType: hard + +"react-router-dom@npm:^6.26.2": + version: 6.28.0 + resolution: "react-router-dom@npm:6.28.0" + dependencies: + "@remix-run/router": "npm:1.21.0" + react-router: "npm:6.28.0" + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 10c0/e2930cf83e8c843a932b008c7ce11059fd83390502a433f0e41f192e3cb80081a621d069eeda7af3cf4bf74d7f8029f0141cdce741bca3f0af82d4bbbc7f7f10 + languageName: node + linkType: hard + +"react-router@npm:6.28.0": + version: 6.28.0 + resolution: "react-router@npm:6.28.0" + dependencies: + "@remix-run/router": "npm:1.21.0" + peerDependencies: + react: ">=16.8" + checksum: 10c0/b435510de78fd882bf6ca9800a73cd90cee418bd1d19efd91b8dcaebde36929bbb589e25d9f7eec24ceb84255e8d538bc1fe54e6ddb5c43c32798e2b720fa76d + languageName: node + linkType: hard + +"react-select@npm:5.8.0": + version: 5.8.0 + resolution: "react-select@npm:5.8.0" + dependencies: + "@babel/runtime": "npm:^7.12.0" + "@emotion/cache": "npm:^11.4.0" + "@emotion/react": "npm:^11.8.1" + "@floating-ui/dom": "npm:^1.0.1" + "@types/react-transition-group": "npm:^4.4.0" + memoize-one: "npm:^6.0.0" + prop-types: "npm:^15.6.0" + react-transition-group: "npm:^4.3.0" + use-isomorphic-layout-effect: "npm:^1.1.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/b4b98aaf117ee5cc4642871b7bd51fd0e2697988d0b880f30b21e933ca90258959147117d8aada36713b622e0e4cb06bd18ec02069f3f108896e0d31e69e3c16 + languageName: node + linkType: hard + +"react-side-effect@npm:^2.1.0": + version: 2.1.2 + resolution: "react-side-effect@npm:2.1.2" + peerDependencies: + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/5d934cae438f701ce646f566750ae6a445e99185ce1a026108f9db728147f7962a22ecf8db79ff26089953a3799b3607766904f4f10194ce42bcd5a1aa0215e8 + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.1": + version: 2.2.1 + resolution: "react-style-singleton@npm:2.2.1" + dependencies: + get-nonce: "npm:^1.0.0" + invariant: "npm:^2.2.4" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/6d66f3bdb65e1ec79089f80314da97c9a005087a04ee034255a5de129a4c0d9fd0bf99fa7bf642781ac2dc745ca687aae3de082bd8afdd0d117bc953241e15ad + languageName: node + linkType: hard + +"react-transition-group@npm:^4.3.0": + version: 4.4.5 + resolution: "react-transition-group@npm:4.4.5" + dependencies: + "@babel/runtime": "npm:^7.5.5" + dom-helpers: "npm:^5.0.1" + loose-envify: "npm:^1.4.0" + prop-types: "npm:^15.6.2" + peerDependencies: + react: ">=16.6.0" + react-dom: ">=16.6.0" + checksum: 10c0/2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 + languageName: node + linkType: hard + +"react-window@npm:1.8.10": + version: 1.8.10 + resolution: "react-window@npm:1.8.10" + dependencies: + "@babel/runtime": "npm:^7.0.0" + memoize-one: "npm:>=3.1.1 <6" + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/eda9afb667d9784513dcc2755b65edf3a1412e7877975322993c1382908aaef0c0b948b7e3b2d705e353306556274d90f7ab19ac40aef2184fa39d4c1e2232ea + languageName: node + linkType: hard + +"react@npm:^18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 + languageName: node + linkType: hard + +"read-pkg-up@npm:7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: 10c0/82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 + languageName: node + linkType: hard + +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: 10c0/b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readable-stream@npm:~1.0.31": + version: 1.0.34 + resolution: "readable-stream@npm:1.0.34" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 10c0/02272551396ed8930ddee1a088bdf0379f0f7cc47ac49ed8804e998076cb7daec9fbd2b1fd9c0490ec72e56e8bb3651abeb8080492b8e0a9c3f2158330908ed6 + languageName: node + linkType: hard + +"readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readdirp@npm:^4.0.1": + version: 4.0.2 + resolution: "readdirp@npm:4.0.2" + checksum: 10c0/a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: "npm:^1.20.0" + checksum: 10c0/1a30074124a22abbd5d44d802dac26407fa72a0a95f162aa5504ba8246bc5452f8b1a027b154d9bdbabcd8764920ff9333d934c46a8f17479c8912e92332f3ff + languageName: node + linkType: hard + +"redux-thunk@npm:^2.4.2": + version: 2.4.2 + resolution: "redux-thunk@npm:2.4.2" + peerDependencies: + redux: ^4 + checksum: 10c0/e202d6ef7dfa7df08ed24cb221aa89d6c84dbaa7d65fe90dbd8e826d0c10d801f48388f9a7598a4fd970ecbc93d335014570a61ca7bc8bf569eab5de77b31a3c + languageName: node + linkType: hard + +"redux@npm:^4.2.0, redux@npm:^4.2.1": + version: 4.2.1 + resolution: "redux@npm:4.2.1" + dependencies: + "@babel/runtime": "npm:^7.9.2" + checksum: 10c0/136d98b3d5dbed1cd6279c8c18a6a74c416db98b8a432a46836bdd668475de6279a2d4fd9d1363f63904e00f0678a8a3e7fa532c897163340baf1e71bb42c742 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 + languageName: node + linkType: hard + +"registry-auth-token@npm:^4.0.0": + version: 4.2.2 + resolution: "registry-auth-token@npm:4.2.2" + dependencies: + rc: "npm:1.2.8" + checksum: 10c0/1d0000b8b65e7141a4cc4594926e2551607f48596e01326e7aa2ba2bc688aea86b2aa0471c5cb5de7acc9a59808a3a1ddde9084f974da79bfc67ab67aa48e003 + languageName: node + linkType: hard + +"registry-auth-token@npm:^5.0.2": + version: 5.0.3 + resolution: "registry-auth-token@npm:5.0.3" + dependencies: + "@pnpm/npm-conf": "npm:^2.1.0" + checksum: 10c0/f92313032fae7dca787aa878cc7fa8499ee5da960802777f6b9f168a5d8f24a97fcfa0cf30a604bcf38b050a5db5f034b1e2fec18a3326f41822a6aff9514c85 + languageName: node + linkType: hard + +"registry-url@npm:^5.0.0, registry-url@npm:^5.1.0": + version: 5.1.0 + resolution: "registry-url@npm:5.1.0" + dependencies: + rc: "npm:^1.2.8" + checksum: 10c0/c2c455342b5836cbed5162092eba075c7a02c087d9ce0fde8aeb4dc87a8f4a34a542e58bf4d8ec2d4cb73f04408cb3148ceb1f76647f76b978cfec22047dc6d6 + languageName: node + linkType: hard + +"relateurl@npm:^0.2.7": + version: 0.2.7 + resolution: "relateurl@npm:0.2.7" + checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a + languageName: node + linkType: hard + +"remove-accents@npm:0.5.0": + version: 0.5.0 + resolution: "remove-accents@npm:0.5.0" + checksum: 10c0/a75321aa1b53d9abe82637115a492770bfe42bb38ed258be748bf6795871202bc8b4badff22013494a7029f5a241057ad8d3f72adf67884dbe15a9e37e87adc4 + languageName: node + linkType: hard + +"renderkid@npm:^3.0.0": + version: 3.0.0 + resolution: "renderkid@npm:3.0.0" + dependencies: + css-select: "npm:^4.1.3" + dom-converter: "npm:^0.2.0" + htmlparser2: "npm:^6.1.0" + lodash: "npm:^4.17.21" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/24a9fae4cc50e731d059742d1b3eec163dc9e3872b12010d120c3fcbd622765d9cda41f79a1bbb4bf63c1d3442f18a08f6e1642cb5d7ebf092a0ce3f7a3bd143 + languageName: node + linkType: hard + +"request-ip@npm:3.3.0": + version: 3.3.0 + resolution: "request-ip@npm:3.3.0" + checksum: 10c0/35ab5fcb29408cb72629b53207f00a443a60fe881ffb63e3b08a06c07dae3eee617522741bd0b035492153d6c9babe7f8d9f79c008d493d1e6638b0bd92cb02b + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"reselect@npm:^4.1.8": + version: 4.1.8 + resolution: "reselect@npm:4.1.8" + checksum: 10c0/06a305a504affcbb67dd0561ddc8306b35796199c7e15b38934c80606938a021eadcf68cfd58e7bb5e17786601c37602a3362a4665c7bf0a96c1041ceee9d0b7 + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + +"resolve-cwd@npm:3.0.0, resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": + version: 1.0.1 + resolution: "resolve-dir@npm:1.0.1" + dependencies: + expand-tilde: "npm:^2.0.0" + global-modules: "npm:^1.0.0" + checksum: 10c0/8197ed13e4a51d9cd786ef6a09fc83450db016abe7ef3311ca39389b3e508d77c26fe0cf0483a9b407b8caa2764bb5ccc52cf6a017ded91492a416475a56066f + languageName: node + linkType: hard + +"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-path@npm:^1.4.0": + version: 1.4.0 + resolution: "resolve-path@npm:1.4.0" + dependencies: + http-errors: "npm:~1.6.2" + path-is-absolute: "npm:1.0.1" + checksum: 10c0/7405c01e02c7c71c62f89e42eac1b876e5a1bb9c3b85e07ce674646841dd177571bca5639ff6780528bec9ff58be7b44845e69eced1d8c5d519f4c1d72c30907 + languageName: node + linkType: hard + +"resolve.exports@npm:2.0.2": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: 10c0/cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98 + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: 10c0/1ade1493f4642a6267d0a5e68faeac20b3d220f18c28b140343feb83694d8fed7a286852aef43689d16042c61e2ddb270be6578ad4a13990769e12065191200d + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.4, resolve@npm:~1.22.1": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + +"restore-cursor@npm:^5.0.0": + version: 5.1.0 + resolution: "restore-cursor@npm:5.1.0" + dependencies: + onetime: "npm:^7.0.0" + signal-exit: "npm:^4.1.0" + checksum: 10c0/c2ba89131eea791d1b25205bdfdc86699767e2b88dee2a590b1a6caa51737deac8bad0260a5ded2f7c074b7db2f3a626bcf1fcf3cdf35974cbeea5e2e6764f60 + languageName: node + linkType: hard + +"retry@npm:0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:3.0.2, rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"rimraf@npm:5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/d50dbe724f33835decd88395b25ed35995077c60a50ae78ded06e0185418914e555817aad1b4243edbff2254548c2f6ad6f70cc850040bebb4da9e8cc016f586 + languageName: node + linkType: hard + +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + +"roarr@npm:^2.15.3": + version: 2.15.4 + resolution: "roarr@npm:2.15.4" + dependencies: + boolean: "npm:^3.0.1" + detect-node: "npm:^2.0.4" + globalthis: "npm:^1.0.1" + json-stringify-safe: "npm:^5.0.1" + semver-compare: "npm:^1.0.0" + sprintf-js: "npm:^1.1.2" + checksum: 10c0/7d01d4c14513c461778dd673a8f9e53255221f8d04173aafeb8e11b23d8b659bb83f1c90cfe81af7f9c213b8084b404b918108fd792bda76678f555340cc64ec + languageName: node + linkType: hard + +"rollup@npm:^4.13.0, rollup@npm:^4.20.0": + version: 4.28.1 + resolution: "rollup@npm:4.28.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.28.1" + "@rollup/rollup-android-arm64": "npm:4.28.1" + "@rollup/rollup-darwin-arm64": "npm:4.28.1" + "@rollup/rollup-darwin-x64": "npm:4.28.1" + "@rollup/rollup-freebsd-arm64": "npm:4.28.1" + "@rollup/rollup-freebsd-x64": "npm:4.28.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.28.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.28.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.28.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.28.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.28.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-x64-musl": "npm:4.28.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.28.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.28.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.28.1" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/2d2d0433b7cb53153a04c7b406f342f31517608dc57510e49177941b9e68c30071674b83a0292ef1d87184e5f7c6d0f2945c8b3c74963074de10c75366fe2c14 + languageName: node + linkType: hard + +"run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: 10c0/35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 + languageName: node + linkType: hard + +"run-async@npm:^3.0.0": + version: 3.0.0 + resolution: "run-async@npm:3.0.0" + checksum: 10c0/b18b562ae37c3020083dcaae29642e4cc360c824fbfb6b7d50d809a9d5227bb986152d09310255842c8dce40526e82ca768f02f00806c91ba92a8dfa6159cb85 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rxjs@npm:7.8.1, rxjs@npm:^7.2.0, rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + languageName: node + linkType: hard + +"rxjs@npm:^6.4.0, rxjs@npm:^6.6.0": + version: 6.6.7 + resolution: "rxjs@npm:6.6.7" + dependencies: + tslib: "npm:^1.9.0" + checksum: 10c0/e556a13a9aa89395e5c9d825eabcfa325568d9c9990af720f3f29f04a888a3b854f25845c2b55875d875381abcae2d8100af9cacdc57576e7ed6be030a01d2fe + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sanitize-html@npm:2.13.0": + version: 2.13.0 + resolution: "sanitize-html@npm:2.13.0" + dependencies: + deepmerge: "npm:^4.2.2" + escape-string-regexp: "npm:^4.0.0" + htmlparser2: "npm:^8.0.0" + is-plain-object: "npm:^5.0.0" + parse-srcset: "npm:^1.0.2" + postcss: "npm:^8.3.11" + checksum: 10c0/2a83f7dae19ba60c25b928708538e53bc9b6278e04a6107e162369d9ae06c0ac5f5a7236d24b38a716b19c67bfac137daf4645be145800c199533db7da40ca0d + languageName: node + linkType: hard + +"scheduler@npm:0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd + languageName: node + linkType: hard + +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 + languageName: node + linkType: hard + +"schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 10c0/c23f0fa73ef71a01d4a2bb7af4c91e0d356ec640e071aa2d06ea5e67f042962bb7ac7c29a60a295bb0125878801bc3209197a2b8a833dd25bd38e37c3ed21427 + languageName: node + linkType: hard + +"scroll-into-view-if-needed@npm:^2.2.20": + version: 2.2.31 + resolution: "scroll-into-view-if-needed@npm:2.2.31" + dependencies: + compute-scroll-into-view: "npm:^1.0.20" + checksum: 10c0/d44c518479505e37ab5b8b4a5aef9130edd8745f8ba9ca291ff0d8358bc89b63da8c30434f35c097384e455702bfe4acbe8b82dfb8b860a971adcae084c5b2f7 + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.7.1": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:7.5.4, semver@npm:~7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + +"semver@npm:~7.0.0": + version: 7.0.0 + resolution: "semver@npm:7.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/7fd341680a967a0abfd66f3a7d36ba44e52ff5d3e799e9a6cdb01a68160b64ef09be82b4af05459effeecdd836f002c2462555d2821cd890dfdfe36a0d9f56a5 + languageName: node + linkType: hard + +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 + languageName: node + linkType: hard + +"sendmail@npm:^1.6.1": + version: 1.6.1 + resolution: "sendmail@npm:1.6.1" + dependencies: + dkim-signer: "npm:0.2.2" + mailcomposer: "npm:3.12.0" + checksum: 10c0/093b3fb0d43b70e27536af2ee0873973c568b6fda472e9fc240010166d7880312be3ae710802faecadea7891b21616a26caa277392a678aece619d5bff50275d + languageName: node + linkType: hard + +"sentence-case@npm:^2.1.0": + version: 2.1.1 + resolution: "sentence-case@npm:2.1.1" + dependencies: + no-case: "npm:^2.2.0" + upper-case-first: "npm:^1.1.2" + checksum: 10c0/3572fe33dd5df4156bc2e5f46a8f7642906234c448484016d5fbb8c7214bdd1f5f01d1791a7b2b1a4f5a99e6e43141d22aa097c0fdcfe41214fd56a85f1ee7f6 + languageName: node + linkType: hard + +"sentence-case@npm:^3.0.4": + version: 3.0.4 + resolution: "sentence-case@npm:3.0.4" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + upper-case-first: "npm:^2.0.2" + checksum: 10c0/9a90527a51300cf5faea7fae0c037728f9ddcff23ac083883774c74d180c0a03c31aab43d5c3347512e8c1b31a0d4712512ec82beb71aa79b85149f9abeb5467 + languageName: node + linkType: hard + +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + languageName: node + linkType: hard + +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" + dependencies: + encodeurl: "npm:~2.0.0" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.19.0" + checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"setprototypeof@npm:1.1.0": + version: 1.1.0 + resolution: "setprototypeof@npm:1.1.0" + checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + +"sha.js@npm:^2.4.11": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + bin: + sha.js: ./bin.js + checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 + languageName: node + linkType: hard + +"shallowequal@npm:1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: 10c0/b926efb51cd0f47aa9bc061add788a4a650550bbe50647962113a4579b60af2abe7b62f9b02314acc6f97151d4cf87033a2b15fc20852fae306d1a095215396c + languageName: node + linkType: hard + +"sharp@npm:0.32.6": + version: 0.32.6 + resolution: "sharp@npm:0.32.6" + dependencies: + color: "npm:^4.2.3" + detect-libc: "npm:^2.0.2" + node-addon-api: "npm:^6.1.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.1" + semver: "npm:^7.5.4" + simple-get: "npm:^4.0.1" + tar-fs: "npm:^3.0.4" + tunnel-agent: "npm:^0.6.0" + checksum: 10c0/f6a756fec5051ef2f9341e0543cde1da4e822982dd5398010baad92e2262bd177e08b753eb19b2fbee30f2fcb0e8756f24088fafc48293a364e9a8f8dc65a300 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:^1.8.1": + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 + languageName: node + linkType: hard + +"shiki@npm:^0.14.7": + version: 0.14.7 + resolution: "shiki@npm:0.14.7" + dependencies: + ansi-sequence-parser: "npm:^1.1.0" + jsonc-parser: "npm:^3.2.0" + vscode-oniguruma: "npm:^1.7.0" + vscode-textmate: "npm:^8.0.0" + checksum: 10c0/5c7fcbb870d0facccc7ae2f3410a28121f8e0b3f298e4e956de817ad6ab60a4c7e20a9184edfe50a93447addbb88b95b69e6ef88ac16ac6ca3e94c50771a6459 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + +"sift@npm:16.0.1": + version: 16.0.1 + resolution: "sift@npm:16.0.1" + checksum: 10c0/e3d1a68babf240c2b244687a12a32fa43439e8ec0b1bfa2a93bd0e21c50ed3364f935361a42f3fb850dc1c0fd369bc99bc0a6d15456141717ea29c60d9612289 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10c0/62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0, simple-get@npm:^4.0.1": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: "npm:^0.3.1" + checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^1.0.7": + version: 1.1.0 + resolution: "simple-update-notifier@npm:1.1.0" + dependencies: + semver: "npm:~7.0.0" + checksum: 10c0/3cbbbc71a5d9a2924f0e3f42fbf3cbe1854bfe142203456b00d5233bdbbdeb5091b8067cd34fb00f81dbfbc29fc30dbb6e026b3d58ea0551e3f26c0e64082092 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^2.0.0": + version: 2.0.0 + resolution: "simple-update-notifier@npm:2.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/2a00bd03bfbcbf8a737c47ab230d7920f8bfb92d1159d421bdd194479f6d01ebc995d13fbe13d45dace23066a78a3dc6642999b4e3b38b847e6664191575b20c + languageName: node + linkType: hard + +"sirv@npm:^2.0.3": + version: 2.0.4 + resolution: "sirv@npm:2.0.4" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10c0/68f8ee857f6a9415e9c07a1f31c7c561df8d5f1b1ba79bee3de583fa37da8718def5309f6b1c6e2c3ef77de45d74f5e49efc7959214443aa92d42e9c99180a4e + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slate-history@npm:0.93.0": + version: 0.93.0 + resolution: "slate-history@npm:0.93.0" + dependencies: + is-plain-object: "npm:^5.0.0" + peerDependencies: + slate: ">=0.65.3" + checksum: 10c0/f9680b48af93000650055f51408d6c1653b6cd67e276d47e340f18758240716d0390547067cba4dd1919ed3ee734dcf70e2f65b8e6eb113eb5f9adf588b64252 + languageName: node + linkType: hard + +"slate-react@npm:0.98.3": + version: 0.98.3 + resolution: "slate-react@npm:0.98.3" + dependencies: + "@juggle/resize-observer": "npm:^3.4.0" + "@types/is-hotkey": "npm:^0.1.1" + "@types/lodash": "npm:^4.14.149" + direction: "npm:^1.0.3" + is-hotkey: "npm:^0.1.6" + is-plain-object: "npm:^5.0.0" + lodash: "npm:^4.17.4" + scroll-into-view-if-needed: "npm:^2.2.20" + tiny-invariant: "npm:1.0.6" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + slate: ">=0.65.3" + checksum: 10c0/0c20818a0c3a5024c0309b09e7b9b85777ca5e7f25beb85b14787f207e3d1e715255e39052416f2e22b1e0f7b8e8bffe00f28b8b253d8cd650dcb677717f1576 + languageName: node + linkType: hard + +"slate@npm:0.94.1": + version: 0.94.1 + resolution: "slate@npm:0.94.1" + dependencies: + immer: "npm:^9.0.6" + is-plain-object: "npm:^5.0.0" + tiny-warning: "npm:^1.0.3" + checksum: 10c0/ac536d78a5351c84a2bd4b8dfe5bf3ab352d39ec7bd7b31eb7e1d9f503d3baf633c617228a86e6bc2e74626d2652b6061d4131c6d345e36b144a4c3423c40031 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"snake-case@npm:^2.1.0": + version: 2.1.0 + resolution: "snake-case@npm:2.1.0" + dependencies: + no-case: "npm:^2.2.0" + checksum: 10c0/fd8b21537263d4e64cadd62da0cb5fd96c95f8685ee8e290c912b79950385dbb9eccf7216a913d96db5efc4ade426badae5e3e35b69ea1f10cbb0b4898a38236 + languageName: node + linkType: hard + +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10c0/ab19a913969f58f4474fe9f6e8a026c8a2142a01f40b52b79368068343177f818cdfef0b0c6b9558f298782441d5ca8ed5932eb57822439fad791d866e62cecd + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"sort-object-keys@npm:^1.1.3": + version: 1.1.3 + resolution: "sort-object-keys@npm:1.1.3" + checksum: 10c0/3bf62398658d3ff4bbca0db4ed8f42f98abc41433859f63d02fb0ab953fbe5526be240ec7e5d85aa50fcab6c937f3fa7015abf1ecdeb3045a2281c53953886bf + languageName: node + linkType: hard + +"sort-package-json@npm:2.10.1": + version: 2.10.1 + resolution: "sort-package-json@npm:2.10.1" + dependencies: + detect-indent: "npm:^7.0.1" + detect-newline: "npm:^4.0.0" + get-stdin: "npm:^9.0.0" + git-hooks-list: "npm:^3.0.0" + globby: "npm:^13.1.2" + is-plain-obj: "npm:^4.1.0" + semver: "npm:^7.6.0" + sort-object-keys: "npm:^1.1.3" + bin: + sort-package-json: cli.js + checksum: 10c0/7511c57e4661be222bce68522fb90f72e77a2a4694d05df0e55e70e72736944371a4be82a7cb1be4402455bbfd23857b0fabae3bbe9a1ae1351ff7caac64a468 + languageName: node + linkType: hard + +"sorted-array-functions@npm:^1.3.0": + version: 1.3.0 + resolution: "sorted-array-functions@npm:1.3.0" + checksum: 10c0/d94e3401a2bc1689dc913f56939621c892a3ff1288e984e85689a6c6e46b0ec16f65edc8b47d46b0f09d06857f67ca245553b462da597619102b9fad270476d9 + languageName: node + linkType: hard + +"source-list-map@npm:^2.0.0": + version: 2.0.1 + resolution: "source-list-map@npm:2.0.1" + checksum: 10c0/2e5e421b185dcd857f46c3c70e2e711a65d717b78c5f795e2e248c9d67757882ea989b80ebc08cf164eeeda5f4be8aa95d3b990225070b2daaaf3257c5958149 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d + languageName: node + linkType: hard + +"source-map@npm:^0.5.7": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"source-map@npm:^0.7.3": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc + languageName: node + linkType: hard + +"spawn-command@npm:0.0.2": + version: 0.0.2 + resolution: "spawn-command@npm:0.0.2" + checksum: 10c0/b22f2d71239e6e628a400831861ba747750bbb40c0a53323754cf7b84330b73d81e40ff1f9055e6d1971818679510208a9302e13d9ff3b32feb67e74d7a1b3ef + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.20 + resolution: "spdx-license-ids@npm:3.0.20" + checksum: 10c0/bdff7534fad6ef59be49becda1edc3fb7f5b3d6f296a715516ab9d972b8ad59af2c34b2003e01db8970d4c673d185ff696ba74c6b61d3bf327e2b3eac22c297c + languageName: node + linkType: hard + +"speedometer@npm:~1.0.0": + version: 1.0.0 + resolution: "speedometer@npm:1.0.0" + checksum: 10c0/d5bfafd5721a1d5300be03f1f3dead419fcec715103dcfd72a1cb85d64a7fae1afaf7e5c80b974a44a4550eafa01ae034e0dbddb50be1dba3a58c9241ee8de54 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.2, sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"stackframe@npm:^1.3.4": + version: 1.3.4 + resolution: "stackframe@npm:1.3.4" + checksum: 10c0/18410f7a1e0c5d211a4effa83bdbf24adbe8faa8c34db52e1cd3e89837518c592be60b60d8b7270ac53eeeb8b807cd11b399a41667f6c9abb41059c3ccc8a989 + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 + languageName: node + linkType: hard + +"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:^1.5.0": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 + languageName: node + linkType: hard + +"stdin-discarder@npm:^0.2.2": + version: 0.2.2 + resolution: "stdin-discarder@npm:0.2.2" + checksum: 10c0/c78375e82e956d7a64be6e63c809c7f058f5303efcaf62ea48350af072bacdb99c06cba39209b45a071c1acbd49116af30df1df9abb448df78a6005b72f10537 + languageName: node + linkType: hard + +"strapi-plugin-navigation@workspace:.": + version: 0.0.0-use.local + resolution: "strapi-plugin-navigation@workspace:." + dependencies: + "@faker-js/faker": "npm:^9.0.3" + "@jest/types": "npm:29.5.x" + "@koa/router": "npm:^12.0.1" + "@sensinum/strapi-utils": "npm:^1.0.4" + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/design-system": "npm:2.0.0-rc.14" + "@strapi/icons": "npm:2.0.0-rc.14" + "@strapi/plugin-graphql": "npm:^5.5.1" + "@strapi/sdk-plugin": "npm:^5.2.8" + "@strapi/strapi": "npm:^5.5.1" + "@strapi/types": "npm:^5.5.1" + "@strapi/typescript-utils": "npm:^5.5.1" + "@tanstack/react-query": "npm:^5.40.0" + "@types/jest": "npm:^29.5.12" + "@types/koa": "npm:^2.15.0" + "@types/koa-bodyparser": "npm:^4.3.12" + "@types/koa__router": "npm:^12.0.4" + "@types/lodash": "npm:^4.17.4" + "@types/node": "npm:^20.12.0" + "@types/pluralize": "npm:0.0.33" + "@types/react": "npm:^18.3.8" + "@types/react-dom": "npm:^18.3.0" + "@types/react-router-dom": "npm:5.3.3" + "@types/styled-components": "npm:5.1.34" + "@types/uuid": "npm:^10.0.0" + codecov: "npm:^3.7.2" + formik: "npm:^2.2.9" + husky: "npm:7.0.4" + jest: "npm:^29.7.0" + jest-cli: "npm:^29.7.0" + jest-junit: "npm:^16.0.0" + jest-styled-components: "npm:^7.1.1" + koa: "npm:^2.15.3" + lodash: "npm:^4.17.21" + nodemon: "npm:^2.0.15" + pluralize: "npm:8.0.0" + prettier: "npm:^3.3.3" + react: "npm:^18.3.1" + react-dnd: "npm:^16.0.1" + react-dnd-html5-backend: "npm:^16.0.1" + react-dom: "npm:^18.3.1" + react-intl: "npm:^6.6.8" + react-query: "npm:3.39.3" + react-router-dom: "npm:^6.26.2" + strapi-plugin-rest-cache: "npm:^4.2.9" + styled-components: "npm:^6.1.13" + ts-jest: "npm:^29.1.4" + ts-node: "npm:^10.9.1" + typescript: "npm:^5.6.2" + uuid: "npm:^10.0.0" + zod: "npm:^3.22.5" + peerDependencies: + "@strapi/sdk-plugin": ^5.2.8 + "@strapi/strapi": ^5.5.1 + react: ^18.3.1 + react-dom: ^18.3.1 + react-router-dom: ^6.26.2 + styled-components: ^6.1.13 + languageName: unknown + linkType: soft + +"strapi-plugin-rest-cache@npm:^4.2.9": + version: 4.2.9 + resolution: "strapi-plugin-rest-cache@npm:4.2.9" + dependencies: + "@koa/router": "npm:^10.1.1" + chalk: "npm:^4.1.2" + debug: "npm:^4.3.4" + lodash: "npm:^4.17.21" + path: "npm:^0.12.7" + strapi-provider-rest-cache-memory: "npm:^4.2.9" + peerDependencies: + "@strapi/strapi": ^4.0.5 + checksum: 10c0/3dada98bb9bdd2dfc13b9f87494007b3d6ae6799b393eb2c507e74ba7903fd3d793f482e6b260e525d75352cc6de03a3a8a508d73cd8a023d39e6e9b54c87fdd + languageName: node + linkType: hard + +"strapi-provider-rest-cache-memory@npm:^4.2.9": + version: 4.2.9 + resolution: "strapi-provider-rest-cache-memory@npm:4.2.9" + dependencies: + cache-manager: "npm:^3.6.0" + peerDependencies: + "@strapi/strapi": ^4.0.0 + strapi-plugin-rest-cache: ^4.0.0 + checksum: 10c0/cfebbbd4da12e0248f32f298a1d5c594b9514c8e26127f27dd6ad53f9eca106929bf0abf501c48c29818c5a1da594da863197352b15e79ac12676ac6dd0955d9 + languageName: node + linkType: hard + +"stream-chain@npm:2.2.5, stream-chain@npm:^2.2.5": + version: 2.2.5 + resolution: "stream-chain@npm:2.2.5" + checksum: 10c0/c512f50190d7c92d688fa64e7af540c51b661f9c2b775fc72bca38ea9bca515c64c22c2197b1be463741daacbaaa2dde8a8ea24ebda46f08391224f15249121a + languageName: node + linkType: hard + +"stream-events@npm:^1.0.5": + version: 1.0.5 + resolution: "stream-events@npm:1.0.5" + dependencies: + stubs: "npm:^3.0.0" + checksum: 10c0/5d235a5799a483e94ea8829526fe9d95d76460032d5e78555fe4f801949ac6a27ea2212e4e0827c55f78726b3242701768adf2d33789465f51b31ed8ebd6b086 + languageName: node + linkType: hard + +"stream-json@npm:1.8.0": + version: 1.8.0 + resolution: "stream-json@npm:1.8.0" + dependencies: + stream-chain: "npm:^2.2.5" + checksum: 10c0/5e6de600a7d86f54f9ced608131f1f840082fa7aa443df9fe72bd255b6b1c098d2c6c756b4b9acd64e50e2b9f52d9a432714bce43e96e9850b819ee9ff6331a1 + languageName: node + linkType: hard + +"stream-slice@npm:^0.1.2": + version: 0.1.2 + resolution: "stream-slice@npm:0.1.2" + checksum: 10c0/fe9ccd8adfff2e2754617d3fd4afe9aa677c69d51ccd94b34909ae669d5882ed4b2753893c4dbd4100495c0deda51adbaa7bfe340e6b340e52211b32faa0e835 + languageName: node + linkType: hard + +"streamx@npm:^2.15.0, streamx@npm:^2.21.0": + version: 2.21.1 + resolution: "streamx@npm:2.21.1" + dependencies: + bare-events: "npm:^2.2.0" + fast-fifo: "npm:^1.3.2" + queue-tick: "npm:^1.0.1" + text-decoder: "npm:^1.1.0" + dependenciesMeta: + bare-events: + optional: true + checksum: 10c0/752297e877bdeba4a4c180335564c446636c3a33f1c8733b4773746dab6212266e97cd71be8cade9748bbb1b9e2fee61f81e46bcdaf1ff396b79c9cb9355f26e + languageName: node + linkType: hard + +"string-argv@npm:~0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string-width@npm:^7.2.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + +"stubs@npm:^3.0.0": + version: 3.0.0 + resolution: "stubs@npm:3.0.0" + checksum: 10c0/841a4ab8c76795d34aefe129185763b55fbf2e4693208215627caea4dd62e1299423dcd96f708d3128e3dfa0e669bae2cb912e6e906d7d81eaf6493196570923 + languageName: node + linkType: hard + +"style-loader@npm:3.3.4": + version: 3.3.4 + resolution: "style-loader@npm:3.3.4" + peerDependencies: + webpack: ^5.0.0 + checksum: 10c0/8f8027fc5c6e91400cbb60066e7db3315810f8eaa0d19b2a254936eb0bec399ba8a7043b1789da9d05ab7c3ba50faf9267765ae0bf3571e48aa34ecdc774be37 + languageName: node + linkType: hard + +"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": + version: 4.1.2 + resolution: "style-mod@npm:4.1.2" + checksum: 10c0/ad4d870b3642b0e42ecc7be0e106dd14b7af11985e34fee8de34e5e38c3214bfc96fa7055acea86d75a3a59ddea3f6a8c6641001a66494d7df72d09685e3fadb + languageName: node + linkType: hard + +"styled-components@npm:^6.1.13": + version: 6.1.13 + resolution: "styled-components@npm:6.1.13" + dependencies: + "@emotion/is-prop-valid": "npm:1.2.2" + "@emotion/unitless": "npm:0.8.1" + "@types/stylis": "npm:4.2.5" + css-to-react-native: "npm:3.2.0" + csstype: "npm:3.1.3" + postcss: "npm:8.4.38" + shallowequal: "npm:1.1.0" + stylis: "npm:4.3.2" + tslib: "npm:2.6.2" + peerDependencies: + react: ">= 16.8.0" + react-dom: ">= 16.8.0" + checksum: 10c0/dd0379179c6ce9655c97285e9f6475b533d4cc4cad72e8f16824c5454803a9d12126877d8b2837cd5b54520250c55cde97a183e813eed720d2575362d9646663 + languageName: node + linkType: hard + +"stylis@npm:4.2.0": + version: 4.2.0 + resolution: "stylis@npm:4.2.0" + checksum: 10c0/a7128ad5a8ed72652c6eba46bed4f416521bc9745a460ef5741edc725252cebf36ee45e33a8615a7057403c93df0866ab9ee955960792db210bb80abd5ac6543 + languageName: node + linkType: hard + +"stylis@npm:4.3.2": + version: 4.3.2 + resolution: "stylis@npm:4.3.2" + checksum: 10c0/0410e1404cbeee3388a9e17587875211ce2f014c8379af0d1e24ca55878867c9f1ccc7b0ce9a156ca53f5d6e301391a82b0645522a604674a378b3189a4a1994 + languageName: node + linkType: hard + +"supports-color@npm:^5.5.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1, supports-color@npm:~8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"swap-case@npm:^1.1.0": + version: 1.1.2 + resolution: "swap-case@npm:1.1.2" + dependencies: + lower-case: "npm:^1.1.1" + upper-case: "npm:^1.1.1" + checksum: 10c0/0fb57c2427cec53c85cab0dd85f243b8b84b68e039eb550c50e01340cfa43a62e5276e04d088e9066b89073f781b258eeb97bf2c22d6232e005feeca2a11d6bc + languageName: node + linkType: hard + +"synckit@npm:0.9.1": + version: 0.9.1 + resolution: "synckit@npm:0.9.1" + dependencies: + "@pkgr/core": "npm:^0.1.0" + tslib: "npm:^2.6.2" + checksum: 10c0/d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e + languageName: node + linkType: hard + +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10c0/871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-fs@npm:^3.0.4": + version: 3.0.6 + resolution: "tar-fs@npm:3.0.6" + dependencies: + bare-fs: "npm:^2.1.1" + bare-path: "npm:^2.1.0" + pump: "npm:^3.0.0" + tar-stream: "npm:^3.1.5" + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: 10c0/207b7c0f193495668bd9dbad09a0108ce4ffcfec5bce2133f90988cdda5c81fad83c99f963d01e47b565196594f7a17dbd063ae55b97b36268fcc843975278ee + languageName: node + linkType: hard + +"tar-stream@npm:2.2.0, tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + +"tar-stream@npm:^3.1.5": + version: 3.1.7 + resolution: "tar-stream@npm:3.1.7" + dependencies: + b4a: "npm:^1.6.4" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 + languageName: node + linkType: hard + +"tar@npm:6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + +"tarn@npm:^3.0.2": + version: 3.0.2 + resolution: "tarn@npm:3.0.2" + checksum: 10c0/ea2344e3d21936111176375bd6f34eba69a38ef1bc59434d523fd313166f8a28a47b0a847846c119f72dcf2c1e1231596d74ac3fcfc3cc73966b3d293a327269 + languageName: node + linkType: hard + +"teeny-request@npm:7.0.1": + version: 7.0.1 + resolution: "teeny-request@npm:7.0.1" + dependencies: + http-proxy-agent: "npm:^4.0.0" + https-proxy-agent: "npm:^5.0.0" + node-fetch: "npm:^2.6.1" + stream-events: "npm:^1.0.5" + uuid: "npm:^8.0.0" + checksum: 10c0/49e75a9925b9e52bfd858abe784c7104f26c64e931c9e26f202b182d66b7e91f2badc5a140d1dc80993fe5d0fac070e956c86d4a12575a1c8f61a2ec319fc2bd + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + languageName: node + linkType: hard + +"terser@npm:^5.10.0, terser@npm:^5.26.0": + version: 5.37.0 + resolution: "terser@npm:5.37.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/ff0dc79b0a0da821e7f5bf7a047eab6d04e70e88b62339a0f1d71117db3310e255f5c00738fa3b391f56c3571f800a00047720261ba04ced0241c1f9922199f4 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + +"text-decoder@npm:^1.1.0": + version: 1.2.2 + resolution: "text-decoder@npm:1.2.2" + dependencies: + b4a: "npm:^1.6.4" + checksum: 10c0/20612b87d282ee07d8fba28f4b411c556a2487948de4c77610191e263e4e80fec5af1ffd9a00b58b7598c153e58127e36110be642721a197f222b58ff2aab5c2 + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d + languageName: node + linkType: hard + +"thenify-all@npm:^1.0.0": + version: 1.6.0 + resolution: "thenify-all@npm:1.6.0" + dependencies: + thenify: "npm:>= 3.1.0 < 4" + checksum: 10c0/9b896a22735e8122754fe70f1d65f7ee691c1d70b1f116fda04fea103d0f9b356e3676cb789506e3909ae0486a79a476e4914b0f92472c2e093d206aed4b7d6b + languageName: node + linkType: hard + +"thenify@npm:>= 3.1.0 < 4": + version: 3.3.1 + resolution: "thenify@npm:3.3.1" + dependencies: + any-promise: "npm:^1.0.0" + checksum: 10c0/f375aeb2b05c100a456a30bc3ed07ef03a39cbdefe02e0403fb714b8c7e57eeaad1a2f5c4ecfb9ce554ce3db9c2b024eba144843cd9e344566d9fcee73b04767 + languageName: node + linkType: hard + +"through2@npm:^2.0.1, through2@npm:~2.0.3": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade + languageName: node + linkType: hard + +"through@npm:^2.3.6": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"tildify@npm:2.0.0": + version: 2.0.0 + resolution: "tildify@npm:2.0.0" + checksum: 10c0/57961810a6915f47bdba7da7fa66a5f12597a0495fa016785de197b02e7ba9994ffebb30569294061bbf6d9395c6b1319d830076221e5a3f49f1318bc749565c + languageName: node + linkType: hard + +"tiny-invariant@npm:1.0.6": + version: 1.0.6 + resolution: "tiny-invariant@npm:1.0.6" + checksum: 10c0/37ca64a84b71ff34545466dfb511d206f329a262d3dd1e3ac93db485c23e06c685670437e24c07cb06bba4cf1f75e44ae6cd8f2f30502556b33a71ef2762aeb5 + languageName: node + linkType: hard + +"tiny-warning@npm:^1.0.2, tiny-warning@npm:^1.0.3": + version: 1.0.3 + resolution: "tiny-warning@npm:1.0.3" + checksum: 10c0/ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa + languageName: node + linkType: hard + +"title-case@npm:^2.1.0": + version: 2.1.1 + resolution: "title-case@npm:2.1.1" + dependencies: + no-case: "npm:^2.2.0" + upper-case: "npm:^1.0.3" + checksum: 10c0/7b4e51036af10d99c48fac9eee8c6f59f92c1c6cc56fc1f790c7727f5eb139c7ebf7a22381626855ce74b6534f36041e91922469dbe086e67d0d71e7e8e40fc3 + languageName: node + linkType: hard + +"title-case@npm:^3.0.3": + version: 3.0.3 + resolution: "title-case@npm:3.0.3" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/face56f686060f777b43a180d371407124d201eb4238c19d9e97030fd54859696ca4e2ca499cc232f8700f24f2414cc08aab9fdf6d39acff055dd825a4d86d6a + languageName: node + linkType: hard + +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: "npm:~1.0.2" + checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + +"toposort@npm:^2.0.2": + version: 2.0.2 + resolution: "toposort@npm:2.0.2" + checksum: 10c0/ab9ca91fce4b972ccae9e2f539d755bf799a0c7eb60da07fd985fce0f14c159ed1e92305ff55697693b5bc13e300f5417db90e2593b127d421c9f6c440950222 + languageName: node + linkType: hard + +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 + languageName: node + linkType: hard + +"touch@npm:^3.1.0": + version: 3.1.1 + resolution: "touch@npm:3.1.1" + bin: + nodetouch: bin/nodetouch.js + checksum: 10c0/d2e4d269a42c846a22a29065b9af0b263de58effc85a1764bb7a2e8fc4b47700e9e2fcbd7eb1f5bffbb7c73d860f93600cef282b93ddac8f0b62321cb498b36e + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + +"tree-kill@npm:^1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea + languageName: node + linkType: hard + +"ts-jest@npm:^29.1.4": + version: 29.2.5 + resolution: "ts-jest@npm:29.2.5" + dependencies: + bs-logger: "npm:^0.2.6" + ejs: "npm:^3.1.10" + fast-json-stable-stringify: "npm:^2.1.0" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.6.3" + yargs-parser: "npm:^21.1.1" + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/transform": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: 10c0/acb62d168faec073e64b20873b583974ba8acecdb94681164eb346cef82ade8fb481c5b979363e01a97ce4dd1e793baf64d9efd90720bc941ad7fc1c3d6f3f68 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + +"tslib@npm:2, tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.2, tslib@npm:^2.8.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"tslib@npm:2.6.2": + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb + languageName: node + linkType: hard + +"tslib@npm:^1.9.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 + languageName: node + linkType: hard + +"tsscmp@npm:1.0.6": + version: 1.0.6 + resolution: "tsscmp@npm:1.0.6" + checksum: 10c0/2f79a9455e7e3e8071995f98cdf3487ccfc91b760bec21a9abb4d90519557eafaa37246e87c92fa8bf3fef8fd30cfd0cc3c4212bb929baa9fb62494bfa4d24b2 + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: 10c0/0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 + languageName: node + linkType: hard + +"type-fest@npm:^4.0.0": + version: 4.30.0 + resolution: "type-fest@npm:4.30.0" + checksum: 10c0/9441fbbc971f92a53d7dfdb0db3f9c71a5a33ac3e021ca605cba8ad0b5c0a1e191cc778b4980c534b098ccb4e3322809100baf763be125510c993c9b8361f60e + languageName: node + linkType: hard + +"type-is@npm:^1.6.16, type-is@npm:^1.6.18, type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:^3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: "npm:^1.0.0" + checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 + languageName: node + linkType: hard + +"typedoc-github-wiki-theme@npm:1.1.0": + version: 1.1.0 + resolution: "typedoc-github-wiki-theme@npm:1.1.0" + peerDependencies: + typedoc: ">=0.24.0" + typedoc-plugin-markdown: ">=3.15.0" + checksum: 10c0/b714bb185343ea54717d5e32766c09380efc63d2a6ecabe90660e7cf7eb7372519472bdf29f78dc3dcc9e4164aebbef4c154c2f36c0aca762f887fd9b3066276 + languageName: node + linkType: hard + +"typedoc-plugin-markdown@npm:3.17.1": + version: 3.17.1 + resolution: "typedoc-plugin-markdown@npm:3.17.1" + dependencies: + handlebars: "npm:^4.7.7" + peerDependencies: + typedoc: ">=0.24.0" + checksum: 10c0/5c9322cd6b5218b1c8b18e6c9df45ad0f99dea9b9cee4006f1f286b04725db47e26856b3e07069beabbd65d8357da34563707d50027b19bb18fd3633a3591349 + languageName: node + linkType: hard + +"typedoc@npm:0.25.10": + version: 0.25.10 + resolution: "typedoc@npm:0.25.10" + dependencies: + lunr: "npm:^2.3.9" + marked: "npm:^4.3.0" + minimatch: "npm:^9.0.3" + shiki: "npm:^0.14.7" + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x + bin: + typedoc: bin/typedoc + checksum: 10c0/b2a100c35ffcabc4cb356a04bf58e88255840a750fa84a4bbd52d5dd1244d4669cc61bdccf115e4164b0fb343d6bb76f6792e7922d86a642567879a50ca7a05d + languageName: node + linkType: hard + +"typescript@npm:5.3.2": + version: 5.3.2 + resolution: "typescript@npm:5.3.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/d7dbe1fbe19039e36a65468ea64b5d338c976550394ba576b7af9c68ed40c0bc5d12ecce390e4b94b287a09a71bd3229f19c2d5680611f35b7c53a3898791159 + languageName: node + linkType: hard + +"typescript@npm:5.4.4": + version: 5.4.4 + resolution: "typescript@npm:5.4.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/4d8de0291204ed61ca97ad0cba2ce064e09c4988ca1c451c787e4653ba76296ba35177a52694e8a00cf4ef899d0ee83338663b926d8b7d55167ff0ba81549999 + languageName: node + linkType: hard + +"typescript@npm:^5.5.4, typescript@npm:^5.6.2": + version: 5.7.2 + resolution: "typescript@npm:5.7.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/a873118b5201b2ef332127ef5c63fb9d9c155e6fdbe211cbd9d8e65877283797cca76546bad742eea36ed7efbe3424a30376818f79c7318512064e8625d61622 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A5.3.2#optional!builtin": + version: 5.3.2 + resolution: "typescript@patch:typescript@npm%3A5.3.2#optional!builtin::version=5.3.2&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/73c8bad74e732d93211c9d77f28b03307e2f5fc6a0afc73f4b783261ab567686a16d6ae958bdaef383a00be1b0b8c8b6741dd6ca3d13af4963fa7e47456d49c7 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A5.4.4#optional!builtin": + version: 5.4.4 + resolution: "typescript@patch:typescript@npm%3A5.4.4#optional!builtin::version=5.4.4&hash=5adc0c" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/1fa41b9964a9ff0ed913b339c90b46031b2d2da3cb1a192af516610733f7f1d5f7f9754a8e22b9ac7076d3d8aedd2c4f84db3f113bad060eac3a95962443a1bf + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.5.4#optional!builtin, typescript@patch:typescript@npm%3A^5.6.2#optional!builtin": + version: 5.7.2 + resolution: "typescript@patch:typescript@npm%3A5.7.2#optional!builtin::version=5.7.2&hash=8c6c40" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/c891ccf04008bc1305ba34053db951f8a4584b4a1bf2f68fd972c4a354df3dc5e62c8bfed4f6ac2d12e5b3b1c49af312c83a651048f818cd5b4949d17baacd79 + languageName: node + linkType: hard + +"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": + version: 1.0.6 + resolution: "uc.micro@npm:1.0.6" + checksum: 10c0/9bde2afc6f2e24b899db6caea47dae778b88862ca76688d844ef6e6121dec0679c152893a74a6cfbd2e6fde34654e6bd8424fee8e0166cdfa6c9ae5d42b8a17b + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 + languageName: node + linkType: hard + +"umzug@npm:3.8.1": + version: 3.8.1 + resolution: "umzug@npm:3.8.1" + dependencies: + "@rushstack/ts-command-line": "npm:^4.12.2" + emittery: "npm:^0.13.0" + fast-glob: "npm:^3.3.2" + pony-cause: "npm:^2.1.4" + type-fest: "npm:^4.0.0" + checksum: 10c0/5e0472e170aabd249885e9a2e3539036b50f707a6401af72a176ab2edfd24c5c05e4acb98049e5097ce24a987f7e835f5887d62ba528cba4ed76b97e801a66fc + languageName: node + linkType: hard + +"unc-path-regex@npm:^0.1.2": + version: 0.1.2 + resolution: "unc-path-regex@npm:0.1.2" + checksum: 10c0/bf9c781c4e2f38e6613ea17a51072e4b416840fbe6eeb244597ce9b028fac2fb6cfd3dde1f14111b02c245e665dc461aab8168ecc30b14364d02caa37f812996 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: 10c0/96c0466a5fbf395917974a921d5d4eee67bca4b30d3a31ce7e621e0228c479cf893e783a109af6e14329b52fe2f0cb4108665fad2b87b0018c0df6ac771261d5 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf + languageName: node + linkType: hard + +"undici@npm:6.19.2": + version: 6.19.2 + resolution: "undici@npm:6.19.2" + checksum: 10c0/3b7b9238c0c84fd90742422fb12844a29e33e922d2c5f722f626090ca1f1ec93596ccec9be1814bb0e923e28682d2080a17d17a4afe373897b9770ef25a64d97 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"unique-string@npm:^2.0.0": + version: 2.0.0 + resolution: "unique-string@npm:2.0.0" + dependencies: + crypto-random-string: "npm:^2.0.0" + checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + +"unload@npm:2.2.0": + version: 2.2.0 + resolution: "unload@npm:2.2.0" + dependencies: + "@babel/runtime": "npm:^7.6.2" + detect-node: "npm:^2.0.4" + checksum: 10c0/0a4f86b502e7aa35d39c27373ebeaad4f2b7da793fb3d6308e5337aab541885cfe7b339ea4a1963477bf73fddabd5d69f4f47023dad71224b4b4a25611ef7dd8 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: 10c0/d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1": + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.0" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 + languageName: node + linkType: hard + +"upper-case-first@npm:^1.1.0, upper-case-first@npm:^1.1.2": + version: 1.1.2 + resolution: "upper-case-first@npm:1.1.2" + dependencies: + upper-case: "npm:^1.1.1" + checksum: 10c0/db3aff30538ed53c35b91a68faf46119d35ceb8800fec373ad781cbfc487f10ccd4d60609e4188e85d20ea3ec9db9a2392fa6372c334f1d1107cbde0bcb5edfe + languageName: node + linkType: hard + +"upper-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case-first@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/ccad6a0b143310ebfba2b5841f30bef71246297385f1329c022c902b2b5fc5aee009faf1ac9da5ab3ba7f615b88f5dc1cd80461b18a8f38cb1d4c3eb92538ea9 + languageName: node + linkType: hard + +"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1, upper-case@npm:^1.1.3": + version: 1.1.3 + resolution: "upper-case@npm:1.1.3" + checksum: 10c0/3e4d3a90519915bb591db84d72610392518806d8287b8f7541d87642d30388f42b2def1ed2f687e5792ee025e8f7e17d3a0dcbd5b3b59e306ceb1f3b8121ef54 + languageName: node + linkType: hard + +"upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10c0/5ac176c9d3757abb71400df167f9abb46d63152d5797c630d1a9f083fbabd89711fb4b3dc6de06ff0138fe8946fa5b8518b4fcdae9ca8a3e341417075beae069 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"urlgrey@npm:0.4.4": + version: 0.4.4 + resolution: "urlgrey@npm:0.4.4" + checksum: 10c0/e8e32031f538dc94ea795c5cd8c02ee67aade4d7837a6259faec7b09f6872c6d41f8431c9bace5f1d188c641677bacfde9b96568c23cd5c061329ce53768b762 + languageName: node + linkType: hard + +"use-callback-ref@npm:^1.3.0": + version: 1.3.2 + resolution: "use-callback-ref@npm:1.3.2" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/d232c37160fe3970c99255da19b5fb5299fb5926a5d6141d928a87feb47732c323d29be2f8137d3b1e5499c70d284cd1d9cfad703cc58179db8be24d7dd8f1f2 + languageName: node + linkType: hard + +"use-context-selector@npm:1.4.1": + version: 1.4.1 + resolution: "use-context-selector@npm:1.4.1" + peerDependencies: + react: ">=16.8.0" + react-dom: "*" + react-native: "*" + scheduler: ">=0.19.0" + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 10c0/9751181117fdb47049aec8f3a6ccc4f1286e8661c769dbed554d58e478538cb83dac180a62baedcb3f65c99c3ed41d5423a955c9b7c12133b0e4263c30255bff + languageName: node + linkType: hard + +"use-isomorphic-layout-effect@npm:^1.1.2": + version: 1.2.0 + resolution: "use-isomorphic-layout-effect@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/2e4bdee68d65893b37e716ebdcc111550775189c80e662eda87d6f5b54dc431d3383a18914ea01a893ee5478902a878012713eaebcacbb6611ab88c463accb83 + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.2": + version: 1.1.2 + resolution: "use-sidecar@npm:1.1.2" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/89f0018fd9aee1fc17c85ac18c4bf8944d460d453d0d0e04ddbc8eaddf3fa591e9c74a1f8a438a1bff368a7a2417fab380bdb3df899d2194c4375b0982736de0 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.0.0": + version: 1.4.0 + resolution: "use-sync-external-store@npm:1.4.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/ec011a5055962c0f6b509d6e78c0b143f8cd069890ae370528753053c55e3b360d3648e76cfaa854faa7a59eb08d6c5fb1015e60ffde9046d32f5b2a295acea5 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"util@npm:^0.10.3": + version: 0.10.4 + resolution: "util@npm:0.10.4" + dependencies: + inherits: "npm:2.0.3" + checksum: 10c0/d29f6893e406b63b088ce9924da03201df89b31490d4d011f1c07a386ea4b3dbe907464c274023c237da470258e1805d806c7e4009a5974cd6b1d474b675852a + languageName: node + linkType: hard + +"utila@npm:~0.4": + version: 0.4.0 + resolution: "utila@npm:0.4.0" + checksum: 10c0/2791604e09ca4f77ae314df83e80d1805f867eb5c7e13e7413caee01273c278cf2c9a3670d8d25c889a877f7b149d892fe61b0181a81654b425e9622ab23d42e + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1, utils-merge@npm:^1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 + languageName: node + linkType: hard + +"uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "uuid@npm:10.0.0" + bin: + uuid: dist/bin/uuid + checksum: 10c0/eab18c27fe4ab9fb9709a5d5f40119b45f2ec8314f8d4cf12ce27e4c6f4ffa4a6321dc7db6c515068fa373c075b49691ba969f0010bf37f44c37ca40cd6bf7fe + languageName: node + linkType: hard + +"uuid@npm:^8.0.0, uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 + languageName: node + linkType: hard + +"uuid@npm:^9.0.0": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 10c0/1607dd32ac7fc22f2d8f77051e6a64845c9bce5cd3dd8aa0070c074ec73e666a1f63c7b4e0f4bf2bc8b9d59dc85a15e17807446d9d2b17c8485fbc2147b27f9b + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23 + languageName: node + linkType: hard + +"v8flags@npm:^4.0.1": + version: 4.0.1 + resolution: "v8flags@npm:4.0.1" + checksum: 10c0/59500e19ff9e7b4e2f09bcfe12d16d9443bf36a0e9b65b5fa6688f12c4b3f833d99ecd8debdbe856c047080bd0a73bd2ca5066f524efb1a87fdca6c1e0aecd74 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"value-or-promise@npm:^1.0.12": + version: 1.0.12 + resolution: "value-or-promise@npm:1.0.12" + checksum: 10c0/b75657b74e4d17552bd88e0c2857020fbab34a4d091dc058db18c470e7da0336067e72c130b3358e3321ac0a6ff11c0b92b67a382318a3705ad5d57de7ff3262 + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + +"vite@npm:5.2.14": + version: 5.2.14 + resolution: "vite@npm:5.2.14" + dependencies: + esbuild: "npm:^0.20.1" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.38" + rollup: "npm:^4.13.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/0ed7a8f8274d14bbd01be2ca5c7c539f915e75d884a97f6051cdf494997832bc02c7db9fc9c5ba8f057d5fece28a3bf215761815e6014e843abe2c38a9424fb7 + languageName: node + linkType: hard + +"vite@npm:5.4.8": + version: 5.4.8 + resolution: "vite@npm:5.4.8" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/af70af6d6316a3af71f44ebe3ab343bd66450d4157af73af3b32239e1b6ec43ff6f651d7cc4193b21ed3bff2e9356a3de9e96aee53857f39922e4a2d9fad75a1 + languageName: node + linkType: hard + +"vscode-oniguruma@npm:^1.7.0": + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 10c0/bef0073c665ddf8c86e51da94529c905856559e9aba97a9882f951acd572da560384775941ab6e7e8db94d9c578b25fefb951e4b73c37e8712e16b0231de2689 + languageName: node + linkType: hard + +"vscode-textmate@npm:^8.0.0": + version: 8.0.0 + resolution: "vscode-textmate@npm:8.0.0" + checksum: 10c0/836f7fe73fc94998a38ca193df48173a2b6eab08b4943d83c8cac9a2a0c3546cfdab4cf1b10b890ec4a4374c5bee03a885ef0e83e7fd2bd618cf00781c017c04 + languageName: node + linkType: hard + +"w3c-keyname@npm:^2.2.4": + version: 2.2.8 + resolution: "w3c-keyname@npm:2.2.8" + checksum: 10c0/37cf335c90efff31672ebb345577d681e2177f7ff9006a9ad47c68c5a9d265ba4a7b39d6c2599ceea639ca9315584ce4bd9c9fbf7a7217bfb7a599e71943c4c4 + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e + languageName: node + linkType: hard + +"watchpack@npm:^2.4.1": + version: 2.4.2 + resolution: "watchpack@npm:2.4.2" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + +"webpack-bundle-analyzer@npm:^4.10.1": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" + dependencies: + "@discoveryjs/json-ext": "npm:0.5.7" + acorn: "npm:^8.0.4" + acorn-walk: "npm:^8.0.0" + commander: "npm:^7.2.0" + debounce: "npm:^1.2.1" + escape-string-regexp: "npm:^4.0.0" + gzip-size: "npm:^6.0.0" + html-escaper: "npm:^2.0.2" + opener: "npm:^1.5.2" + picocolors: "npm:^1.0.0" + sirv: "npm:^2.0.3" + ws: "npm:^7.3.1" + bin: + webpack-bundle-analyzer: lib/bin/analyzer.js + checksum: 10c0/00603040e244ead15b2d92981f0559fa14216381349412a30070a7358eb3994cd61a8221d34a3b3fb8202dc3d1c5ee1fbbe94c5c52da536e5b410aa1cf279a48 + languageName: node + linkType: hard + +"webpack-dev-middleware@npm:6.1.2": + version: 6.1.2 + resolution: "webpack-dev-middleware@npm:6.1.2" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^3.4.12" + mime-types: "npm:^2.1.31" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10c0/90c415a770c7db493f4a7d8f3308d761ff63249f628fa8a133eac5a61e849cdf658398e189fc2d95ce0ea884641363f964db6b269c6cea877765321dd7f14b9a + languageName: node + linkType: hard + +"webpack-hot-middleware@npm:2.26.1": + version: 2.26.1 + resolution: "webpack-hot-middleware@npm:2.26.1" + dependencies: + ansi-html-community: "npm:0.0.8" + html-entities: "npm:^2.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/13a3e78009e373b4ee990ffe1d4d49046e9893148a7106f063e11f962d02b744ea58b1dec25f5e76723c9dce678b9e68c883e7f2af2940aaf4de7aab31264c83 + languageName: node + linkType: hard + +"webpack-sources@npm:^1.4.3": + version: 1.4.3 + resolution: "webpack-sources@npm:1.4.3" + dependencies: + source-list-map: "npm:^2.0.0" + source-map: "npm:~0.6.1" + checksum: 10c0/78dafb3e1e297d3f4eb6204311e8c64d28cd028f82887ba33aaf03fffc82482d8e1fdf6de25a60f4dde621d3565f4c3b1bfb350f09add8f4e54e00279ff3db5e + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e + languageName: node + linkType: hard + +"webpack@npm:^5.90.3": + version: 5.97.1 + resolution: "webpack@npm:5.97.1" + dependencies: + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" + "@webassemblyjs/ast": "npm:^1.14.1" + "@webassemblyjs/wasm-edit": "npm:^1.14.1" + "@webassemblyjs/wasm-parser": "npm:^1.14.1" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.17.1" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/a12d3dc882ca582075f2c4bd88840be8307427245c90a8a0e0b372d73560df13fcf25a61625c9e7edc964981d16b5a8323640562eb48347cf9dd2f8bd1b39d35 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 10c0/323895a1cda29a5fb0b9ca82831d2c316309fede0365047c4c323073e3239067a304a09a1f4b123b9532641ab604203f33a1403b5ca6a62ef405bcd7a204080f + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + +"which-pm@npm:2.0.0": + version: 2.0.0 + resolution: "which-pm@npm:2.0.0" + dependencies: + load-yaml-file: "npm:^0.2.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/499fdf18fb259ea7dd58aab0df5f44240685364746596d0d08d9d68ac3a7205bde710ec1023dbc9148b901e755decb1891aa6790ceffdb81c603b6123ec7b5e4 + languageName: node + linkType: hard + +"which@npm:^1.2.14": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + +"widest-line@npm:^3.1.0": + version: 3.1.0 + resolution: "widest-line@npm:3.1.0" + dependencies: + string-width: "npm:^4.0.0" + checksum: 10c0/b1e623adcfb9df35350dd7fc61295d6d4a1eaa65a406ba39c4b8360045b614af95ad10e05abf704936ed022569be438c4bfa02d6d031863c4166a238c301119f + languageName: node + linkType: hard + +"winston-transport@npm:^4.5.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 + languageName: node + linkType: hard + +"winston@npm:3.10.0": + version: 3.10.0 + resolution: "winston@npm:3.10.0" + dependencies: + "@colors/colors": "npm:1.5.0" + "@dabh/diagnostics": "npm:^2.0.2" + async: "npm:^3.2.3" + is-stream: "npm:^2.0.0" + logform: "npm:^2.4.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + safe-stable-stringify: "npm:^2.3.1" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.5.0" + checksum: 10c0/eb9298ae9c335f54d4731525231df9f216d39a55bc1676b0375cbd9d2a14e302d0a700972ffb97626ab352e41f607739b5b8ee5feaadcf06c11977cb8ecd834a + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^3.0.0": + version: 3.0.3 + resolution: "write-file-atomic@npm:3.0.3" + dependencies: + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + +"ws@npm:8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/f4a49064afae4500be772abdc2211c8518f39e1c959640457dcee15d4488628620625c783902a52af2dd02f68558da2868fd06e6fd0e67ebcd09e6881b1b5bfe + languageName: node + linkType: hard + +"ws@npm:^7.3.1": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + +"xdg-app-paths@npm:8.3.0": + version: 8.3.0 + resolution: "xdg-app-paths@npm:8.3.0" + dependencies: + fsevents: "npm:*" + xdg-portable: "npm:^10.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/84d9a80dc7ca2dc327fc89f7dca96cee5638006197e98fd0778d3ab80624bd09803358021b51c58a7e20e55b365355c7b5cff4e45ab3e0aa10227b3dd104a62f + languageName: node + linkType: hard + +"xdg-basedir@npm:^4.0.0": + version: 4.0.0 + resolution: "xdg-basedir@npm:4.0.0" + checksum: 10c0/1b5d70d58355af90363a4e0a51c992e77fc5a1d8de5822699c7d6e96a6afea9a1e048cb93312be6870f338ca45ebe97f000425028fa149c1e87d1b5b8b212a06 + languageName: node + linkType: hard + +"xdg-portable@npm:^10.6.0": + version: 10.6.0 + resolution: "xdg-portable@npm:10.6.0" + dependencies: + fsevents: "npm:*" + os-paths: "npm:^7.4.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/e632280445c5042d7a4b04d332c5481ee49735f443e7d2e5e8fba9a5a5a664fcee6b9f699d729069c7e39eca5124c7fa8f0e6f2dc00aee68a687253ccadc7255 + languageName: node + linkType: hard + +"xml@npm:^1.0.1": + version: 1.0.1 + resolution: "xml@npm:1.0.1" + checksum: 10c0/04bcc9b8b5e7b49392072fbd9c6b0f0958bd8e8f8606fee460318e43991349a68cbc5384038d179ff15aef7d222285f69ca0f067f53d071084eb14c7fdb30411 + languageName: node + linkType: hard + +"xss@npm:^1.0.6": + version: 1.0.15 + resolution: "xss@npm:1.0.15" + dependencies: + commander: "npm:^2.20.3" + cssfilter: "npm:0.0.10" + bin: + xss: bin/xss + checksum: 10c0/9b31bee62a208f78e2b7bc8154e3ee87d980f4661dc4ab850ce6f4de7bc50eb152f0bdc13fa759ff8ab6d9bfdf8c0d79cf9f6f86249872b92181912309bccd08 + languageName: node + linkType: hard + +"xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yalc@npm:1.0.0-pre.53": + version: 1.0.0-pre.53 + resolution: "yalc@npm:1.0.0-pre.53" + dependencies: + chalk: "npm:^4.1.0" + detect-indent: "npm:^6.0.0" + fs-extra: "npm:^8.0.1" + glob: "npm:^7.1.4" + ignore: "npm:^5.0.4" + ini: "npm:^2.0.0" + npm-packlist: "npm:^2.1.5" + yargs: "npm:^16.1.1" + bin: + yalc: src/yalc.js + checksum: 10c0/630f65b00740da6d568d46748a40e2bf2c872cf9babe7c319642a5b6db2dcd0a5d4a34e249d20099709e3ba09bb7e9b34ff78af5cd54c690668e094e156551c9 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yaml@npm:^1.10.0": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^16.1.0, yargs@npm:^16.1.1": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 + languageName: node + linkType: hard + +"yargs@npm:^17.3.1, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"ylru@npm:^1.2.0": + version: 1.4.0 + resolution: "ylru@npm:1.4.0" + checksum: 10c0/eaadc38ed6d78d4fda49abed45cfdaf149bd334df761dbeadd3cff62936d25ffa94571f84c25b64a9a4b5efd8f489ee6fee3eaaf8e7b2886418a3bcb9ec84b84 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard + +"yoctocolors-cjs@npm:^2.1.2": + version: 2.1.2 + resolution: "yoctocolors-cjs@npm:2.1.2" + checksum: 10c0/a0e36eb88fea2c7981eab22d1ba45e15d8d268626e6c4143305e2c1628fa17ebfaa40cd306161a8ce04c0a60ee0262058eab12567493d5eb1409780853454c6f + languageName: node + linkType: hard + +"yoctocolors@npm:^2.0.0": + version: 2.1.1 + resolution: "yoctocolors@npm:2.1.1" + checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0 + languageName: node + linkType: hard + +"yup@npm:0.32.9": + version: 0.32.9 + resolution: "yup@npm:0.32.9" + dependencies: + "@babel/runtime": "npm:^7.10.5" + "@types/lodash": "npm:^4.14.165" + lodash: "npm:^4.17.20" + lodash-es: "npm:^4.17.15" + nanoclone: "npm:^0.2.1" + property-expr: "npm:^2.0.4" + toposort: "npm:^2.0.2" + checksum: 10c0/b2adff31f4be85aaad338e6db12a26715b9e11270c587afe051d42c423f7f24de2d184f646047cb5c3b8c65163c37611f8309f2ef4eb6bb7a66688158a081d66 + languageName: node + linkType: hard + +"zod@npm:^3.19.1, zod@npm:^3.22.4, zod@npm:^3.22.5": + version: 3.24.1 + resolution: "zod@npm:3.24.1" + checksum: 10c0/0223d21dbaa15d8928fe0da3b54696391d8e3e1e2d0283a1a070b5980a1dbba945ce631c2d1eccc088fdbad0f2dfa40155590bf83732d3ac4fcca2cc9237591b + languageName: node + linkType: hard