From 1f586af0f801bc3a248c661b8ded68432f8c1748 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 05:56:32 -0400 Subject: [PATCH 01/17] init monorepo structure --- .nvmrc | 2 +- AGENTS.md | 187 +- README.md | 43 + eslint.config.js | 39 + eslint.config.mjs | 48 - infrastructure/cdk.context.json | 3 - infrastructure/cdk.json | 57 - infrastructure/jest.config.ts | 24 - infrastructure/package-lock.json | 5201 ----------------- infrastructure/package.json | 35 - infrastructure/tsconfig.json | 27 - infrastructure/utils/config.test.ts | 309 - package-lock.json | 4058 +++++++------ package.json | 102 +- .../infra}/.env.example | 4 +- {infrastructure => packages/infra}/README.md | 0 packages/infra/cdk.json | 8 + packages/infra/package.json | 26 + {infrastructure => packages/infra/src}/app.ts | 4 +- .../infra/src}/stacks/cdn-stack.test.ts | 2 + .../infra/src}/stacks/cdn-stack.ts | 0 packages/infra/src/utils/config.test.ts | 37 + .../infra/src}/utils/config.ts | 0 packages/infra/tsconfig.build.json | 4 + packages/infra/tsconfig.json | 9 + packages/infra/vitest.config.ts | 19 + packages/shared/package.json | 13 + packages/shared/src/index.test.ts | 7 + packages/shared/src/index.ts | 1 + packages/shared/tsconfig.build.json | 4 + packages/shared/tsconfig.json | 8 + .env.example => packages/web/.env.example | 0 .../.storybook}/decorators/withProviders.tsx | 0 .../web/.storybook}/main.ts | 0 .../web/.storybook}/preview-head.html | 0 .../web/.storybook}/preview.ts | 0 .../web/components.json | 0 index.html => packages/web/index.html | 0 packages/web/package.json | 69 + {public => packages/web/public}/favicon.ico | Bin {src => packages/web/src}/App.test.tsx | 2 +- {src => packages/web/src}/App.tsx | 16 +- .../web/src}/__fixtures__/charts.ts | 2 +- .../web/src}/__fixtures__/settings.ts | 2 +- .../web/src}/__fixtures__/toasts.ts | 2 +- .../web/src}/__fixtures__/todos.ts | 2 +- .../web/src}/__fixtures__/tokens.ts | 2 +- .../web/src}/__fixtures__/users.ts | 2 +- {src => packages/web/src}/assets/img/logo.png | Bin .../src}/common/api/useGetCurrentUser.test.ts | 8 +- .../web/src}/common/api/useGetCurrentUser.ts | 4 +- .../src}/common/api/useGetSettings.test.ts | 10 +- .../web/src}/common/api/useGetSettings.ts | 6 +- .../web/src}/common/api/useGetUser.test.ts | 5 +- .../web/src}/common/api/useGetUser.ts | 6 +- .../src}/common/api/useGetUserTokens.test.ts | 10 +- .../web/src}/common/api/useGetUserTokens.ts | 4 +- .../src}/common/api/useSetSettings.test.ts | 8 +- .../web/src}/common/api/useSetSettings.ts | 4 +- .../components/Accordion/Accordion.test.tsx | 2 +- .../common/components/Accordion/Accordion.tsx | 6 +- .../__stories__/Accordion.stories.tsx | 0 .../components/Alert/ErrorAlert.test.tsx | 2 +- .../common/components/Alert/ErrorAlert.tsx | 6 +- .../Alert/__stories__/ErrorAlert.stories.tsx | 0 .../components/Backdrop/Backdrop.test.tsx | 2 +- .../common/components/Backdrop/Backdrop.tsx | 4 +- .../common/components/Badge/Badge.test.tsx | 2 +- .../src}/common/components/Badge/Badge.tsx | 4 +- .../Badge/__stories__/Badge.stories.tsx | 0 .../Breadcrumbs/Breadcrumbs.test.tsx | 2 +- .../components/Breadcrumbs/Breadcrumbs.tsx | 6 +- .../__stories__/Breadcrumbs.stories.tsx | 2 +- .../common/components/Button/Button.test.tsx | 2 +- .../src}/common/components/Button/Button.tsx | 4 +- .../components/Button/LanguageToggle.test.tsx | 6 +- .../components/Button/LanguageToggle.tsx | 18 +- .../components/Button/ThemeToggle.test.tsx | 10 +- .../common/components/Button/ThemeToggle.tsx | 20 +- .../Button/__stories__/Button.stories.tsx | 0 .../__stories__/LanguageToggle.stories.tsx | 0 .../__stories__/ThemeToggle.stories.tsx | 0 .../src}/common/components/Card/Card.test.tsx | 2 +- .../web/src}/common/components/Card/Card.tsx | 8 +- .../components/Card/MessageCard.test.tsx | 2 +- .../common/components/Card/MessageCard.tsx | 4 +- .../Card/__stories__/Card.stories.tsx | 0 .../Card/__stories__/MessageCard.stories.tsx | 0 .../components/Chart/DonutChart.test.tsx | 4 +- .../common/components/Chart/DonutChart.tsx | 2 +- .../Chart/__stories__/DonutChart.stories.tsx | 2 +- .../components/Content/Columns.test.tsx | 2 +- .../common/components/Content/Columns.tsx | 4 +- .../components/Content/Container.test.tsx | 2 +- .../common/components/Content/Container.tsx | 4 +- .../common/components/Content/Page.test.tsx | 2 +- .../src}/common/components/Content/Page.tsx | 4 +- .../Content/__stories__/Columns.stories.tsx | 0 .../Content/__stories__/Container.stories.tsx | 0 .../common/components/Dialog/Dialog.test.tsx | 2 +- .../src}/common/components/Dialog/Dialog.tsx | 8 +- .../Dialog/__stories__/Dialog.stories.tsx | 2 +- .../components/Divider/Divider.test.tsx | 2 +- .../src/common/components/Divider/Divider.tsx | 12 + .../Divider/__stories__/Divider.stories.tsx | 0 .../components/Dropdown/DropdownMenu.test.tsx | 2 +- .../components/Dropdown/DropdownMenu.tsx | 10 +- .../__stories__/DropdownMenu.stories.tsx | 4 +- .../components/Errors/ErrorBoundary.test.tsx | 2 +- .../components/Errors/ErrorBoundary.tsx | 0 .../components/Errors/ErrorFallback.test.tsx | 2 +- .../components/Errors/ErrorFallback.tsx | 0 .../common/components/Footer/Footer.test.tsx | 2 +- .../src}/common/components/Footer/Footer.tsx | 14 +- .../common/components/Form/Checkbox.test.tsx | 2 +- .../src}/common/components/Form/Checkbox.tsx | 4 +- .../components/Form/FieldError.test.tsx | 2 +- .../common/components/Form/FieldError.tsx | 4 +- .../common/components/Form/Input.test.tsx | 2 +- .../web/src}/common/components/Form/Input.tsx | 4 +- .../common/components/Form/Label.test.tsx | 2 +- .../web/src}/common/components/Form/Label.tsx | 4 +- .../components/Form/RadioGroup.test.tsx | 2 +- .../common/components/Form/RadioGroup.tsx | 4 +- .../components/Form/SearchInput.test.tsx | 2 +- .../common/components/Form/SearchInput.tsx | 6 +- .../components/Form/SearchResult.test.tsx | 2 +- .../common/components/Form/SearchResult.tsx | 4 +- .../common/components/Form/Select.test.tsx | 2 +- .../src}/common/components/Form/Select.tsx | 8 +- .../common/components/Form/Textarea.test.tsx | 2 +- .../src}/common/components/Form/Textarea.tsx | 4 +- .../common/components/Form/Toggle.test.tsx | 2 +- .../src}/common/components/Form/Toggle.tsx | 4 +- .../Form/__stories__/Checkbox.stories.tsx | 0 .../Form/__stories__/FieldError.stories.tsx | 0 .../Form/__stories__/Input.stories.tsx | 0 .../Form/__stories__/Label.stories.tsx | 2 +- .../Form/__stories__/RadioGroup.stories.tsx | 0 .../Form/__stories__/SearchInput.stories.tsx | 0 .../Form/__stories__/Select.stories.tsx | 0 .../Form/__stories__/Textarea.stories.tsx | 0 .../Form/__stories__/Toggle.stories.tsx | 0 .../common/components/Header/AppMenu.test.tsx | 12 +- .../src}/common/components/Header/AppMenu.tsx | 22 +- .../common/components/Header/Header.test.tsx | 4 +- .../src}/common/components/Header/Header.tsx | 20 +- .../common/components/Icon/Avatar.test.tsx | 2 +- .../src}/common/components/Icon/Avatar.tsx | 4 +- .../common/components/Icon/FAIcon.test.tsx | 2 +- .../src}/common/components/Icon/FAIcon.tsx | 4 +- .../Icon/__stories__/Avatar.stories.tsx | 2 +- .../Icon/__stories__/FAIcon.stories.tsx | 0 .../components/Layout/StandardLayout.test.tsx | 2 +- .../components/Layout/StandardLayout.tsx | 18 +- .../src}/common/components/Link/Link.test.tsx | 2 +- .../web/src}/common/components/Link/Link.tsx | 4 +- .../Link/__stories__/Link.stories.tsx | 0 .../components/Loader/LoaderSuspense.test.tsx | 4 +- .../components/Loader/LoaderSuspense.tsx | 0 .../components/Loader/Skeleton.test.tsx | 2 +- .../common/components/Loader/Skeleton.tsx | 11 +- .../common/components/Loader/Spinner.test.tsx | 2 +- .../src}/common/components/Loader/Spinner.tsx | 6 +- .../Loader/__stories__/Skeleton.stories.tsx | 0 .../Loader/__stories__/Spinner.stories.tsx | 0 .../web/src}/common/components/Menu/Menu.tsx | 0 .../components/Menu/MenuButton.test.tsx | 2 +- .../common/components/Menu/MenuButton.tsx | 6 +- .../components/Menu/MenuCloseButton.test.tsx | 2 +- .../components/Menu/MenuCloseButton.tsx | 8 +- .../components/Menu/MenuNavLink.test.tsx | 2 +- .../common/components/Menu/MenuNavLink.tsx | 6 +- .../components/Menu/MenuSeparator.test.tsx | 2 +- .../common/components/Menu/MenuSeparator.tsx | 13 + .../Menu/SideMenu/SideMenu.test.tsx | 2 +- .../components/Menu/SideMenu/SideMenu.tsx | 4 +- .../Menu/SideMenu/SideMenuHeader.test.tsx | 2 +- .../Menu/SideMenu/SideMenuHeader.tsx | 4 +- .../SideMenu/__stories__/SideMenu.stories.tsx | 2 +- .../components/Popover/Popover.test.tsx | 2 +- .../common/components/Popover/Popover.tsx | 4 +- .../components/Router/PrivateOutlet.test.tsx | 4 +- .../components/Router/PrivateOutlet.tsx | 2 +- .../src}/common/components/Router/Router.tsx | 95 +- .../common/components/Table/Table.test.tsx | 2 +- .../src}/common/components/Table/Table.tsx | 4 +- .../Table/__stories__/Table.stories.tsx | 0 .../src}/common/components/Tabs/Tabs.test.tsx | 2 +- .../web/src}/common/components/Tabs/Tabs.tsx | 10 +- .../Tabs/__stories__/Tabs.stories.tsx | 0 .../components/Text/CodeSnippet.test.tsx | 4 +- .../common/components/Text/CodeSnippet.tsx | 4 +- .../common/components/Text/Currency.test.tsx | 4 +- .../src}/common/components/Text/Currency.tsx | 6 +- .../src}/common/components/Text/Date.test.tsx | 4 +- .../web/src}/common/components/Text/Date.tsx | 4 +- .../components/Text/DayOfTheWeek.test.tsx | 2 +- .../common/components/Text/DayOfTheWeek.tsx | 4 +- .../common/components/Text/Decimal.test.tsx | 4 +- .../src}/common/components/Text/Decimal.tsx | 6 +- .../common/components/Text/Heading.test.tsx | 2 +- .../src}/common/components/Text/Heading.tsx | 4 +- .../common/components/Text/HelpText.test.tsx | 2 +- .../src}/common/components/Text/HelpText.tsx | 4 +- .../common/components/Text/Integer.test.tsx | 4 +- .../src}/common/components/Text/Integer.tsx | 6 +- .../common/components/Text/Percent.test.tsx | 4 +- .../src}/common/components/Text/Percent.tsx | 6 +- .../src}/common/components/Text/Text.test.tsx | 2 +- .../web/src}/common/components/Text/Text.tsx | 4 +- .../Text/__stories__/CodeSnippet.stories.tsx | 0 .../Text/__stories__/Currency.stories.tsx | 2 +- .../Text/__stories__/Date.stories.tsx | 2 +- .../Text/__stories__/DayOfTheWeek.stories.tsx | 0 .../Text/__stories__/Decimal.stories.tsx | 2 +- .../Text/__stories__/Heading.stories.tsx | 0 .../Text/__stories__/HelpText.stories.tsx | 0 .../Text/__stories__/Integer.stories.tsx | 2 +- .../Text/__stories__/Percent.stories.tsx | 2 +- .../Text/__stories__/Text.stories.tsx | 0 .../common/components/Theme/Theme.test.tsx | 4 +- .../src}/common/components/Theme/Theme.tsx | 4 +- .../common/components/Toast/Toast.test.tsx | 6 +- .../src}/common/components/Toast/Toast.tsx | 21 +- .../common/components/Toast/Toasts.test.tsx | 6 +- .../src}/common/components/Toast/Toasts.tsx | 12 +- .../Toast/__stories__/Toast.stories.tsx | 2 +- .../shadcn/__stories__/alert.stories.tsx | 0 .../common/components/shadcn/alert.test.tsx | 2 +- .../src}/common/components/shadcn/alert.tsx | 2 +- .../web/src}/common/hooks/useAuth.test.ts | 8 +- .../web/src}/common/hooks/useAuth.ts | 2 +- .../web/src}/common/hooks/useAxios.test.ts | 8 +- .../web/src}/common/hooks/useAxios.ts | 2 +- .../web/src}/common/hooks/useDebounce.test.ts | 4 +- .../web/src}/common/hooks/useDebounce.ts | 0 .../web/src}/common/hooks/useSettings.test.ts | 8 +- .../web/src}/common/hooks/useSettings.ts | 4 +- .../web/src}/common/hooks/useToasts.test.ts | 4 +- .../web/src}/common/hooks/useToasts.ts | 2 +- .../web/src}/common/providers/AuthContext.ts | 2 +- .../common/providers/AuthProvider.test.tsx | 8 +- .../src}/common/providers/AuthProvider.tsx | 4 +- .../web/src}/common/providers/AxiosContext.ts | 0 .../common/providers/AxiosProvider.test.tsx | 10 +- .../src}/common/providers/AxiosProvider.tsx | 2 +- .../src}/common/providers/SettingsContext.ts | 2 +- .../providers/SettingsProvider.test.tsx | 10 +- .../common/providers/SettingsProvider.tsx | 2 +- .../src}/common/providers/ToastsContext.ts | 2 +- .../common/providers/ToastsProvider.test.tsx | 4 +- .../src}/common/providers/ToastsProvider.tsx | 3 +- .../web/src}/common/utils/config.test.ts | 0 .../web/src}/common/utils/config.ts | 0 .../web/src}/common/utils/constants.ts | 2 +- .../web/src}/common/utils/css.test.ts | 0 {src => packages/web/src}/common/utils/css.ts | 0 .../web/src}/common/utils/i18n/i18n.test.ts | 2 +- .../web/src}/common/utils/i18n/index.ts | 2 +- .../common/utils/i18n/locales/en/common.json | 0 .../common/utils/i18n/locales/en/index.ts | 0 .../common/utils/i18n/locales/en/tasks.json | 0 .../common/utils/i18n/locales/es/common.json | 0 .../common/utils/i18n/locales/es/index.ts | 0 .../common/utils/i18n/locales/es/tasks.json | 0 .../common/utils/i18n/locales/fr/common.json | 0 .../common/utils/i18n/locales/fr/index.ts | 0 .../common/utils/i18n/locales/fr/tasks.json | 0 .../web/src}/common/utils/numbers.test.ts | 2 +- .../web/src}/common/utils/numbers.ts | 0 .../web/src}/common/utils/storage.test.ts | 0 .../web/src}/common/utils/storage.ts | 0 .../web/src}/common/utils/suspense.test.tsx | 4 +- .../web/src}/common/utils/suspense.tsx | 2 +- .../web/src}/common/utils/types.ts | 0 {src => packages/web/src}/index.css | 0 {src => packages/web/src}/main.tsx | 4 +- .../web/src}/pages/About/AboutPage.test.tsx | 2 +- .../web/src}/pages/About/AboutPage.tsx | 14 +- .../pages/Auth/Signin/SigninPage.test.tsx | 2 +- .../web/src}/pages/Auth/Signin/SigninPage.tsx | 6 +- .../pages/Auth/Signin/api/useSignin.test.ts | 4 +- .../src}/pages/Auth/Signin/api/useSignin.ts | 12 +- .../Signin/components/SigninForm.test.tsx | 2 +- .../Auth/Signin/components/SigninForm.tsx | 10 +- .../pages/Auth/Signout/SignoutPage.test.tsx | 2 +- .../src}/pages/Auth/Signout/SignoutPage.tsx | 6 +- .../pages/Auth/Signout/api/useSignout.test.ts | 4 +- .../src}/pages/Auth/Signout/api/useSignout.ts | 5 +- .../pages/Components/ComponentsPage.test.tsx | 2 +- .../src}/pages/Components/ComponentsPage.tsx | 10 +- .../components/AccordionComponents.test.tsx | 2 +- .../components/AccordionComponents.tsx | 10 +- .../components/AlertComponents.test.tsx | 2 +- .../Components/components/AlertComponents.tsx | 10 +- .../components/AvatarComponents.test.tsx | 2 +- .../components/AvatarComponents.tsx | 20 +- .../components/BadgeComponents.test.tsx | 2 +- .../Components/components/BadgeComponents.tsx | 20 +- .../components/BreadcrumbsComponents.test.tsx | 2 +- .../components/BreadcrumbsComponents.tsx | 12 +- .../components/ButtonComponents.test.tsx | 2 +- .../components/ButtonComponents.tsx | 22 +- .../components/CardComponents.test.tsx | 2 +- .../Components/components/CardComponents.tsx | 24 +- .../components/CheckboxComponents.test.tsx | 2 +- .../components/CheckboxComponents.tsx | 12 +- .../components/ColumnsComponents.test.tsx | 2 +- .../components/ColumnsComponents.tsx | 10 +- .../ComponentsPageBreadcrumbs.test.tsx | 2 +- .../components/ComponentsPageBreadcrumbs.tsx | 4 +- .../components/ContainerComponents.test.tsx | 2 +- .../components/ContainerComponents.tsx | 10 +- .../components/DialogComponents.test.tsx | 2 +- .../components/DialogComponents.tsx | 12 +- .../components/DividerComponents.test.tsx | 2 +- .../components/DividerComponents.tsx | 10 +- .../components/DropdownComponents.test.tsx | 2 +- .../components/DropdownComponents.tsx | 14 +- .../components/HeadingComponents.test.tsx | 2 +- .../components/HeadingComponents.tsx | 8 +- .../components/HelpTextComponents.test.tsx | 2 +- .../components/HelpTextComponents.tsx | 12 +- .../components/IconComponents.test.tsx | 2 +- .../Components/components/IconComponents.tsx | 14 +- .../components/InputComponents.test.tsx | 2 +- .../Components/components/InputComponents.tsx | 12 +- .../components/LabelComponents.test.tsx | 2 +- .../Components/components/LabelComponents.tsx | 10 +- .../components/LinkComponents.test.tsx | 2 +- .../Components/components/LinkComponents.tsx | 10 +- .../components/PageComponents.test.tsx | 2 +- .../Components/components/PageComponents.tsx | 10 +- .../components/PopoverComponents.test.tsx | 2 +- .../components/PopoverComponents.tsx | 12 +- .../components/RadioGroupComponents.test.tsx | 2 +- .../components/RadioGroupComponents.tsx | 12 +- .../components/SearchInputComponents.test.tsx | 2 +- .../components/SearchInputComponents.tsx | 14 +- .../components/SelectComponents.test.tsx | 2 +- .../components/SelectComponents.tsx | 12 +- .../components/SkeletonComponents.test.tsx | 2 +- .../components/SkeletonComponents.tsx | 14 +- .../components/SpinnerComponents.test.tsx | 2 +- .../components/SpinnerComponents.tsx | 12 +- .../components/TableComponents.test.tsx | 2 +- .../Components/components/TableComponents.tsx | 10 +- .../components/TabsComponents.test.tsx | 2 +- .../Components/components/TabsComponents.tsx | 10 +- .../components/TextComponents.test.tsx | 2 +- .../Components/components/TextComponents.tsx | 10 +- .../components/TextareaComponents.test.tsx | 2 +- .../components/TextareaComponents.tsx | 12 +- .../components/ToastComponents.test.tsx | 2 +- .../Components/components/ToastComponents.tsx | 14 +- .../components/ToggleComponents.test.tsx | 2 +- .../components/ToggleComponents.tsx | 12 +- .../Components/components/avatar-picture.png | Bin .../src}/pages/Components/model/components.ts | 0 .../web/src}/pages/Error/ErrorPage.test.tsx | 2 +- .../web/src}/pages/Error/ErrorPage.tsx | 0 .../src}/pages/Landing/LandingPage.test.tsx | 4 +- .../web/src}/pages/Landing/LandingPage.tsx | 8 +- .../src}/pages/Settings/SettingsPage.test.tsx | 8 +- .../web/src}/pages/Settings/SettingsPage.tsx | 14 +- .../components/AppearanceSettings.test.tsx | 10 +- .../components/AppearanceSettings.tsx | 18 +- .../components/SettingsHeading.test.tsx | 2 +- .../Settings/components/SettingsHeading.tsx | 2 +- .../SettingsPageBreadcrumbs.test.tsx | 2 +- .../components/SettingsPageBreadcrumbs.tsx | 4 +- .../web/src}/pages/Tasks/TasksPage.test.tsx | 8 +- .../web/src}/pages/Tasks/TasksPage.tsx | 16 +- .../pages/Tasks/api/useCreateTask.test.ts | 8 +- .../web/src}/pages/Tasks/api/useCreateTask.ts | 6 +- .../pages/Tasks/api/useDeleteTask.test.ts | 10 +- .../web/src}/pages/Tasks/api/useDeleteTask.ts | 8 +- .../src}/pages/Tasks/api/useGetTask.test.ts | 2 +- .../web/src}/pages/Tasks/api/useGetTask.ts | 8 +- .../pages/Tasks/api/useGetUserTasks.test.ts | 2 +- .../src}/pages/Tasks/api/useGetUserTasks.ts | 6 +- .../src}/pages/Tasks/api/useGetUsers.test.ts | 2 +- .../web/src}/pages/Tasks/api/useGetUsers.ts | 8 +- .../pages/Tasks/api/useUpdateTask.test.ts | 8 +- .../web/src}/pages/Tasks/api/useUpdateTask.ts | 8 +- .../Tasks/components/Add/TaskAdd.test.tsx | 8 +- .../pages/Tasks/components/Add/TaskAdd.tsx | 20 +- .../Chart/TaskStatusDonutChart.test.tsx | 4 +- .../components/Chart/TaskStatusDonutChart.tsx | 8 +- .../Delete/TaskDeleteDialog.test.tsx | 8 +- .../components/Delete/TaskDeleteDialog.tsx | 12 +- .../Edit/TaskCompleteToggle.test.tsx | 8 +- .../components/Edit/TaskCompleteToggle.tsx | 14 +- .../Tasks/components/Edit/TaskEdit.test.tsx | 2 +- .../pages/Tasks/components/Edit/TaskEdit.tsx | 28 +- .../Tasks/components/Form/TaskForm.test.tsx | 4 +- .../pages/Tasks/components/Form/TaskForm.tsx | 12 +- .../Tasks/components/List/TaskList.test.tsx | 6 +- .../pages/Tasks/components/List/TaskList.tsx | 10 +- .../components/List/TaskListItem.test.tsx | 4 +- .../Tasks/components/List/TaskListItem.tsx | 10 +- .../components/TaskDetailLayout.test.tsx | 6 +- .../Tasks/components/TaskDetailLayout.tsx | 20 +- .../Tasks/components/TaskListLayout.test.tsx | 12 +- .../pages/Tasks/components/TaskListLayout.tsx | 8 +- .../components/TasksPageBreadcrumbs.test.tsx | 2 +- .../Tasks/components/TasksPageBreadcrumbs.tsx | 6 +- .../pages/Tasks/components/UserInfo.test.tsx | 6 +- .../src}/pages/Tasks/components/UserInfo.tsx | 10 +- .../Tasks/components/View/TaskView.test.tsx | 8 +- .../pages/Tasks/components/View/TaskView.tsx | 12 +- .../web/src}/test/mocks/handlers.ts | 6 +- .../web/src}/test/mocks/server.ts | 0 .../web/src}/test/mocks/window.ts | 0 .../web/src}/test/query-client.ts | 0 {src => packages/web/src}/test/test-utils.tsx | 3 +- .../wrappers/AllProvidersExceptRouter.tsx | 6 +- .../src}/test/wrappers/WithAllProviders.tsx | 6 +- .../test/wrappers/WithQueryClientProvider.tsx | 0 {src => packages/web/src}/vite-env.d.ts | 0 packages/web/tsconfig.json | 14 + packages/web/vite.config.ts | 37 + packages/web/vitest.config.ts | 46 + packages/web/vitest.setup.ts | 45 + src/common/components/Divider/Divider.tsx | 17 - src/common/components/Menu/MenuSeparator.tsx | 19 - tsconfig.base.json | 26 + tsconfig.json | 36 - tsconfig.node.json | 11 - vite.config.ts | 60 - vitest.config.ts | 19 + vitest.setup.ts | 18 - 433 files changed, 3861 insertions(+), 8763 deletions(-) create mode 100644 eslint.config.js delete mode 100644 eslint.config.mjs delete mode 100644 infrastructure/cdk.context.json delete mode 100644 infrastructure/cdk.json delete mode 100644 infrastructure/jest.config.ts delete mode 100644 infrastructure/package-lock.json delete mode 100644 infrastructure/package.json delete mode 100644 infrastructure/tsconfig.json delete mode 100644 infrastructure/utils/config.test.ts rename {infrastructure => packages/infra}/.env.example (96%) rename {infrastructure => packages/infra}/README.md (100%) create mode 100644 packages/infra/cdk.json create mode 100644 packages/infra/package.json rename {infrastructure => packages/infra/src}/app.ts (96%) rename {infrastructure => packages/infra/src}/stacks/cdn-stack.test.ts (99%) rename {infrastructure => packages/infra/src}/stacks/cdn-stack.ts (100%) create mode 100644 packages/infra/src/utils/config.test.ts rename {infrastructure => packages/infra/src}/utils/config.ts (100%) create mode 100644 packages/infra/tsconfig.build.json create mode 100644 packages/infra/tsconfig.json create mode 100644 packages/infra/vitest.config.ts create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.test.ts create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/tsconfig.build.json create mode 100644 packages/shared/tsconfig.json rename .env.example => packages/web/.env.example (100%) rename {.storybook => packages/web/.storybook}/decorators/withProviders.tsx (100%) rename {.storybook => packages/web/.storybook}/main.ts (100%) rename {.storybook => packages/web/.storybook}/preview-head.html (100%) rename {.storybook => packages/web/.storybook}/preview.ts (100%) rename components.json => packages/web/components.json (100%) rename index.html => packages/web/index.html (100%) create mode 100644 packages/web/package.json rename {public => packages/web/public}/favicon.ico (100%) rename {src => packages/web/src}/App.test.tsx (85%) rename {src => packages/web/src}/App.tsx (73%) rename {src => packages/web/src}/__fixtures__/charts.ts (77%) rename {src => packages/web/src}/__fixtures__/settings.ts (52%) rename {src => packages/web/src}/__fixtures__/toasts.ts (85%) rename {src => packages/web/src}/__fixtures__/todos.ts (92%) rename {src => packages/web/src}/__fixtures__/tokens.ts (79%) rename {src => packages/web/src}/__fixtures__/users.ts (95%) rename {src => packages/web/src}/assets/img/logo.png (100%) rename {src => packages/web/src}/common/api/useGetCurrentUser.test.ts (86%) rename {src => packages/web/src}/common/api/useGetCurrentUser.ts (86%) rename {src => packages/web/src}/common/api/useGetSettings.test.ts (82%) rename {src => packages/web/src}/common/api/useGetSettings.ts (83%) rename {src => packages/web/src}/common/api/useGetUser.test.ts (81%) rename {src => packages/web/src}/common/api/useGetUser.ts (89%) rename {src => packages/web/src}/common/api/useGetUserTokens.test.ts (85%) rename {src => packages/web/src}/common/api/useGetUserTokens.ts (93%) rename {src => packages/web/src}/common/api/useSetSettings.test.ts (84%) rename {src => packages/web/src}/common/api/useSetSettings.ts (92%) rename {src => packages/web/src}/common/components/Accordion/Accordion.test.tsx (98%) rename {src => packages/web/src}/common/components/Accordion/Accordion.tsx (97%) rename {src => packages/web/src}/common/components/Accordion/__stories__/Accordion.stories.tsx (100%) rename {src => packages/web/src}/common/components/Alert/ErrorAlert.test.tsx (97%) rename {src => packages/web/src}/common/components/Alert/ErrorAlert.tsx (80%) rename {src => packages/web/src}/common/components/Alert/__stories__/ErrorAlert.stories.tsx (100%) rename {src => packages/web/src}/common/components/Backdrop/Backdrop.test.tsx (96%) rename {src => packages/web/src}/common/components/Backdrop/Backdrop.tsx (91%) rename {src => packages/web/src}/common/components/Badge/Badge.test.tsx (94%) rename {src => packages/web/src}/common/components/Badge/Badge.tsx (93%) rename {src => packages/web/src}/common/components/Badge/__stories__/Badge.stories.tsx (100%) rename {src => packages/web/src}/common/components/Breadcrumbs/Breadcrumbs.test.tsx (97%) rename {src => packages/web/src}/common/components/Breadcrumbs/Breadcrumbs.tsx (97%) rename {src => packages/web/src}/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx (97%) rename {src => packages/web/src}/common/components/Button/Button.test.tsx (98%) rename {src => packages/web/src}/common/components/Button/Button.tsx (94%) rename {src => packages/web/src}/common/components/Button/LanguageToggle.test.tsx (93%) rename {src => packages/web/src}/common/components/Button/LanguageToggle.tsx (73%) rename {src => packages/web/src}/common/components/Button/ThemeToggle.test.tsx (89%) rename {src => packages/web/src}/common/components/Button/ThemeToggle.tsx (65%) rename {src => packages/web/src}/common/components/Button/__stories__/Button.stories.tsx (100%) rename {src => packages/web/src}/common/components/Button/__stories__/LanguageToggle.stories.tsx (100%) rename {src => packages/web/src}/common/components/Button/__stories__/ThemeToggle.stories.tsx (100%) rename {src => packages/web/src}/common/components/Card/Card.test.tsx (96%) rename {src => packages/web/src}/common/components/Card/Card.tsx (93%) rename {src => packages/web/src}/common/components/Card/MessageCard.test.tsx (97%) rename {src => packages/web/src}/common/components/Card/MessageCard.tsx (91%) rename {src => packages/web/src}/common/components/Card/__stories__/Card.stories.tsx (100%) rename {src => packages/web/src}/common/components/Card/__stories__/MessageCard.stories.tsx (100%) rename {src => packages/web/src}/common/components/Chart/DonutChart.test.tsx (76%) rename {src => packages/web/src}/common/components/Chart/DonutChart.tsx (96%) rename {src => packages/web/src}/common/components/Chart/__stories__/DonutChart.stories.tsx (95%) rename {src => packages/web/src}/common/components/Content/Columns.test.tsx (90%) rename {src => packages/web/src}/common/components/Content/Columns.tsx (95%) rename {src => packages/web/src}/common/components/Content/Container.test.tsx (89%) rename {src => packages/web/src}/common/components/Content/Container.tsx (93%) rename {src => packages/web/src}/common/components/Content/Page.test.tsx (95%) rename {src => packages/web/src}/common/components/Content/Page.tsx (84%) rename {src => packages/web/src}/common/components/Content/__stories__/Columns.stories.tsx (100%) rename {src => packages/web/src}/common/components/Content/__stories__/Container.stories.tsx (100%) rename {src => packages/web/src}/common/components/Dialog/Dialog.test.tsx (99%) rename {src => packages/web/src}/common/components/Dialog/Dialog.tsx (97%) rename {src => packages/web/src}/common/components/Dialog/__stories__/Dialog.stories.tsx (98%) rename {src => packages/web/src}/common/components/Divider/Divider.test.tsx (93%) create mode 100644 packages/web/src/common/components/Divider/Divider.tsx rename {src => packages/web/src}/common/components/Divider/__stories__/Divider.stories.tsx (100%) rename {src => packages/web/src}/common/components/Dropdown/DropdownMenu.test.tsx (98%) rename {src => packages/web/src}/common/components/Dropdown/DropdownMenu.tsx (95%) rename {src => packages/web/src}/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx (93%) rename {src => packages/web/src}/common/components/Errors/ErrorBoundary.test.tsx (96%) rename {src => packages/web/src}/common/components/Errors/ErrorBoundary.tsx (100%) rename {src => packages/web/src}/common/components/Errors/ErrorFallback.test.tsx (87%) rename {src => packages/web/src}/common/components/Errors/ErrorFallback.tsx (100%) rename {src => packages/web/src}/common/components/Footer/Footer.test.tsx (91%) rename {src => packages/web/src}/common/components/Footer/Footer.tsx (78%) rename {src => packages/web/src}/common/components/Form/Checkbox.test.tsx (98%) rename {src => packages/web/src}/common/components/Form/Checkbox.tsx (96%) rename {src => packages/web/src}/common/components/Form/FieldError.test.tsx (94%) rename {src => packages/web/src}/common/components/Form/FieldError.tsx (87%) rename {src => packages/web/src}/common/components/Form/Input.test.tsx (97%) rename {src => packages/web/src}/common/components/Form/Input.tsx (95%) rename {src => packages/web/src}/common/components/Form/Label.test.tsx (94%) rename {src => packages/web/src}/common/components/Form/Label.tsx (91%) rename {src => packages/web/src}/common/components/Form/RadioGroup.test.tsx (98%) rename {src => packages/web/src}/common/components/Form/RadioGroup.tsx (98%) rename {src => packages/web/src}/common/components/Form/SearchInput.test.tsx (97%) rename {src => packages/web/src}/common/components/Form/SearchInput.tsx (95%) rename {src => packages/web/src}/common/components/Form/SearchResult.test.tsx (96%) rename {src => packages/web/src}/common/components/Form/SearchResult.tsx (91%) rename {src => packages/web/src}/common/components/Form/Select.test.tsx (99%) rename {src => packages/web/src}/common/components/Form/Select.tsx (97%) rename {src => packages/web/src}/common/components/Form/Textarea.test.tsx (97%) rename {src => packages/web/src}/common/components/Form/Textarea.tsx (95%) rename {src => packages/web/src}/common/components/Form/Toggle.test.tsx (97%) rename {src => packages/web/src}/common/components/Form/Toggle.tsx (95%) rename {src => packages/web/src}/common/components/Form/__stories__/Checkbox.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/FieldError.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/Input.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/Label.stories.tsx (94%) rename {src => packages/web/src}/common/components/Form/__stories__/RadioGroup.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/SearchInput.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/Select.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/Textarea.stories.tsx (100%) rename {src => packages/web/src}/common/components/Form/__stories__/Toggle.stories.tsx (100%) rename {src => packages/web/src}/common/components/Header/AppMenu.test.tsx (87%) rename {src => packages/web/src}/common/components/Header/AppMenu.tsx (79%) rename {src => packages/web/src}/common/components/Header/Header.test.tsx (95%) rename {src => packages/web/src}/common/components/Header/Header.tsx (60%) rename {src => packages/web/src}/common/components/Icon/Avatar.test.tsx (96%) rename {src => packages/web/src}/common/components/Icon/Avatar.tsx (95%) rename {src => packages/web/src}/common/components/Icon/FAIcon.test.tsx (88%) rename {src => packages/web/src}/common/components/Icon/FAIcon.tsx (97%) rename {src => packages/web/src}/common/components/Icon/__stories__/Avatar.stories.tsx (95%) rename {src => packages/web/src}/common/components/Icon/__stories__/FAIcon.stories.tsx (100%) rename {src => packages/web/src}/common/components/Layout/StandardLayout.test.tsx (87%) rename {src => packages/web/src}/common/components/Layout/StandardLayout.tsx (50%) rename {src => packages/web/src}/common/components/Link/Link.test.tsx (92%) rename {src => packages/web/src}/common/components/Link/Link.tsx (89%) rename {src => packages/web/src}/common/components/Link/__stories__/Link.stories.tsx (100%) rename {src => packages/web/src}/common/components/Loader/LoaderSuspense.test.tsx (80%) rename {src => packages/web/src}/common/components/Loader/LoaderSuspense.tsx (100%) rename {src => packages/web/src}/common/components/Loader/Skeleton.test.tsx (93%) rename {src => packages/web/src}/common/components/Loader/Skeleton.tsx (54%) rename {src => packages/web/src}/common/components/Loader/Spinner.test.tsx (95%) rename {src => packages/web/src}/common/components/Loader/Spinner.tsx (88%) rename {src => packages/web/src}/common/components/Loader/__stories__/Skeleton.stories.tsx (100%) rename {src => packages/web/src}/common/components/Loader/__stories__/Spinner.stories.tsx (100%) rename {src => packages/web/src}/common/components/Menu/Menu.tsx (100%) rename {src => packages/web/src}/common/components/Menu/MenuButton.test.tsx (97%) rename {src => packages/web/src}/common/components/Menu/MenuButton.tsx (88%) rename {src => packages/web/src}/common/components/Menu/MenuCloseButton.test.tsx (96%) rename {src => packages/web/src}/common/components/Menu/MenuCloseButton.tsx (81%) rename {src => packages/web/src}/common/components/Menu/MenuNavLink.test.tsx (98%) rename {src => packages/web/src}/common/components/Menu/MenuNavLink.tsx (92%) rename {src => packages/web/src}/common/components/Menu/MenuSeparator.test.tsx (94%) create mode 100644 packages/web/src/common/components/Menu/MenuSeparator.tsx rename {src => packages/web/src}/common/components/Menu/SideMenu/SideMenu.test.tsx (98%) rename {src => packages/web/src}/common/components/Menu/SideMenu/SideMenu.tsx (96%) rename {src => packages/web/src}/common/components/Menu/SideMenu/SideMenuHeader.test.tsx (97%) rename {src => packages/web/src}/common/components/Menu/SideMenu/SideMenuHeader.tsx (92%) rename {src => packages/web/src}/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx (97%) rename {src => packages/web/src}/common/components/Popover/Popover.test.tsx (99%) rename {src => packages/web/src}/common/components/Popover/Popover.tsx (98%) rename {src => packages/web/src}/common/components/Router/PrivateOutlet.test.tsx (95%) rename {src => packages/web/src}/common/components/Router/PrivateOutlet.tsx (92%) rename {src => packages/web/src}/common/components/Router/Router.tsx (62%) rename {src => packages/web/src}/common/components/Table/Table.test.tsx (97%) rename {src => packages/web/src}/common/components/Table/Table.tsx (96%) rename {src => packages/web/src}/common/components/Table/__stories__/Table.stories.tsx (100%) rename {src => packages/web/src}/common/components/Tabs/Tabs.test.tsx (99%) rename {src => packages/web/src}/common/components/Tabs/Tabs.tsx (92%) rename {src => packages/web/src}/common/components/Tabs/__stories__/Tabs.stories.tsx (100%) rename {src => packages/web/src}/common/components/Text/CodeSnippet.test.tsx (94%) rename {src => packages/web/src}/common/components/Text/CodeSnippet.tsx (92%) rename {src => packages/web/src}/common/components/Text/Currency.test.tsx (94%) rename {src => packages/web/src}/common/components/Text/Currency.tsx (88%) rename {src => packages/web/src}/common/components/Text/Date.test.tsx (95%) rename {src => packages/web/src}/common/components/Text/Date.tsx (88%) rename {src => packages/web/src}/common/components/Text/DayOfTheWeek.test.tsx (97%) rename {src => packages/web/src}/common/components/Text/DayOfTheWeek.tsx (94%) rename {src => packages/web/src}/common/components/Text/Decimal.test.tsx (97%) rename {src => packages/web/src}/common/components/Text/Decimal.tsx (91%) rename {src => packages/web/src}/common/components/Text/Heading.test.tsx (93%) rename {src => packages/web/src}/common/components/Text/Heading.tsx (92%) rename {src => packages/web/src}/common/components/Text/HelpText.test.tsx (89%) rename {src => packages/web/src}/common/components/Text/HelpText.tsx (87%) rename {src => packages/web/src}/common/components/Text/Integer.test.tsx (97%) rename {src => packages/web/src}/common/components/Text/Integer.tsx (89%) rename {src => packages/web/src}/common/components/Text/Percent.test.tsx (95%) rename {src => packages/web/src}/common/components/Text/Percent.tsx (90%) rename {src => packages/web/src}/common/components/Text/Text.test.tsx (96%) rename {src => packages/web/src}/common/components/Text/Text.tsx (90%) rename {src => packages/web/src}/common/components/Text/__stories__/CodeSnippet.stories.tsx (100%) rename {src => packages/web/src}/common/components/Text/__stories__/Currency.stories.tsx (92%) rename {src => packages/web/src}/common/components/Text/__stories__/Date.stories.tsx (95%) rename {src => packages/web/src}/common/components/Text/__stories__/DayOfTheWeek.stories.tsx (100%) rename {src => packages/web/src}/common/components/Text/__stories__/Decimal.stories.tsx (95%) rename {src => packages/web/src}/common/components/Text/__stories__/Heading.stories.tsx (100%) rename {src => packages/web/src}/common/components/Text/__stories__/HelpText.stories.tsx (100%) rename {src => packages/web/src}/common/components/Text/__stories__/Integer.stories.tsx (93%) rename {src => packages/web/src}/common/components/Text/__stories__/Percent.stories.tsx (95%) rename {src => packages/web/src}/common/components/Text/__stories__/Text.stories.tsx (100%) rename {src => packages/web/src}/common/components/Theme/Theme.test.tsx (96%) rename {src => packages/web/src}/common/components/Theme/Theme.tsx (93%) rename {src => packages/web/src}/common/components/Toast/Toast.test.tsx (90%) rename {src => packages/web/src}/common/components/Toast/Toast.tsx (74%) rename {src => packages/web/src}/common/components/Toast/Toasts.test.tsx (89%) rename {src => packages/web/src}/common/components/Toast/Toasts.tsx (66%) rename {src => packages/web/src}/common/components/Toast/__stories__/Toast.stories.tsx (95%) rename {src => packages/web/src}/common/components/shadcn/__stories__/alert.stories.tsx (100%) rename {src => packages/web/src}/common/components/shadcn/alert.test.tsx (97%) rename {src => packages/web/src}/common/components/shadcn/alert.tsx (98%) rename {src => packages/web/src}/common/hooks/useAuth.test.ts (76%) rename {src => packages/web/src}/common/hooks/useAuth.ts (77%) rename {src => packages/web/src}/common/hooks/useAxios.test.ts (75%) rename {src => packages/web/src}/common/hooks/useAxios.ts (83%) rename {src => packages/web/src}/common/hooks/useDebounce.test.ts (93%) rename {src => packages/web/src}/common/hooks/useDebounce.ts (100%) rename {src => packages/web/src}/common/hooks/useSettings.test.ts (81%) rename {src => packages/web/src}/common/hooks/useSettings.ts (77%) rename {src => packages/web/src}/common/hooks/useToasts.test.ts (94%) rename {src => packages/web/src}/common/hooks/useToasts.ts (83%) rename {src => packages/web/src}/common/providers/AuthContext.ts (90%) rename {src => packages/web/src}/common/providers/AuthProvider.test.tsx (87%) rename {src => packages/web/src}/common/providers/AuthProvider.tsx (90%) rename {src => packages/web/src}/common/providers/AxiosContext.ts (100%) rename {src => packages/web/src}/common/providers/AxiosProvider.test.tsx (88%) rename {src => packages/web/src}/common/providers/AxiosProvider.tsx (98%) rename {src => packages/web/src}/common/providers/SettingsContext.ts (74%) rename {src => packages/web/src}/common/providers/SettingsProvider.test.tsx (77%) rename {src => packages/web/src}/common/providers/SettingsProvider.tsx (91%) rename {src => packages/web/src}/common/providers/ToastsContext.ts (91%) rename {src => packages/web/src}/common/providers/ToastsProvider.test.tsx (82%) rename {src => packages/web/src}/common/providers/ToastsProvider.tsx (96%) rename {src => packages/web/src}/common/utils/config.test.ts (100%) rename {src => packages/web/src}/common/utils/config.ts (100%) rename {src => packages/web/src}/common/utils/constants.ts (98%) rename {src => packages/web/src}/common/utils/css.test.ts (100%) rename {src => packages/web/src}/common/utils/css.ts (100%) rename {src => packages/web/src}/common/utils/i18n/i18n.test.ts (80%) rename {src => packages/web/src}/common/utils/i18n/index.ts (93%) rename {src => packages/web/src}/common/utils/i18n/locales/en/common.json (100%) rename {src => packages/web/src}/common/utils/i18n/locales/en/index.ts (100%) rename {src => packages/web/src}/common/utils/i18n/locales/en/tasks.json (100%) rename {src => packages/web/src}/common/utils/i18n/locales/es/common.json (100%) rename {src => packages/web/src}/common/utils/i18n/locales/es/index.ts (100%) rename {src => packages/web/src}/common/utils/i18n/locales/es/tasks.json (100%) rename {src => packages/web/src}/common/utils/i18n/locales/fr/common.json (100%) rename {src => packages/web/src}/common/utils/i18n/locales/fr/index.ts (100%) rename {src => packages/web/src}/common/utils/i18n/locales/fr/tasks.json (100%) rename {src => packages/web/src}/common/utils/numbers.test.ts (97%) rename {src => packages/web/src}/common/utils/numbers.ts (100%) rename {src => packages/web/src}/common/utils/storage.test.ts (100%) rename {src => packages/web/src}/common/utils/storage.ts (100%) rename {src => packages/web/src}/common/utils/suspense.test.tsx (79%) rename {src => packages/web/src}/common/utils/suspense.tsx (83%) rename {src => packages/web/src}/common/utils/types.ts (100%) rename {src => packages/web/src}/index.css (100%) rename {src => packages/web/src}/main.tsx (78%) rename {src => packages/web/src}/pages/About/AboutPage.test.tsx (98%) rename {src => packages/web/src}/pages/About/AboutPage.tsx (87%) rename {src => packages/web/src}/pages/Auth/Signin/SigninPage.test.tsx (86%) rename {src => packages/web/src}/pages/Auth/Signin/SigninPage.tsx (73%) rename {src => packages/web/src}/pages/Auth/Signin/api/useSignin.test.ts (91%) rename {src => packages/web/src}/pages/Auth/Signin/api/useSignin.ts (86%) rename {src => packages/web/src}/pages/Auth/Signin/components/SigninForm.test.tsx (97%) rename {src => packages/web/src}/pages/Auth/Signin/components/SigninForm.tsx (91%) rename {src => packages/web/src}/pages/Auth/Signout/SignoutPage.test.tsx (93%) rename {src => packages/web/src}/pages/Auth/Signout/SignoutPage.tsx (84%) rename {src => packages/web/src}/pages/Auth/Signout/api/useSignout.test.ts (91%) rename {src => packages/web/src}/pages/Auth/Signout/api/useSignout.ts (91%) rename {src => packages/web/src}/pages/Components/ComponentsPage.test.tsx (87%) rename {src => packages/web/src}/pages/Components/ComponentsPage.tsx (93%) rename {src => packages/web/src}/pages/Components/components/AccordionComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/AccordionComponents.tsx (97%) rename {src => packages/web/src}/pages/Components/components/AlertComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/AlertComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/AvatarComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/AvatarComponents.tsx (85%) rename {src => packages/web/src}/pages/Components/components/BadgeComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/BadgeComponents.tsx (87%) rename {src => packages/web/src}/pages/Components/components/BreadcrumbsComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/BreadcrumbsComponents.tsx (92%) rename {src => packages/web/src}/pages/Components/components/ButtonComponents.test.tsx (96%) rename {src => packages/web/src}/pages/Components/components/ButtonComponents.tsx (89%) rename {src => packages/web/src}/pages/Components/components/CardComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/CardComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/CheckboxComponents.test.tsx (95%) rename {src => packages/web/src}/pages/Components/components/CheckboxComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/ColumnsComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/ColumnsComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx (96%) rename {src => packages/web/src}/pages/Components/components/ComponentsPageBreadcrumbs.tsx (90%) rename {src => packages/web/src}/pages/Components/components/ContainerComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/ContainerComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/DialogComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/DialogComponents.tsx (96%) rename {src => packages/web/src}/pages/Components/components/DividerComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/DividerComponents.tsx (93%) rename {src => packages/web/src}/pages/Components/components/DropdownComponents.test.tsx (95%) rename {src => packages/web/src}/pages/Components/components/DropdownComponents.tsx (91%) rename {src => packages/web/src}/pages/Components/components/HeadingComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/HeadingComponents.tsx (94%) rename {src => packages/web/src}/pages/Components/components/HelpTextComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/HelpTextComponents.tsx (91%) rename {src => packages/web/src}/pages/Components/components/IconComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/IconComponents.tsx (94%) rename {src => packages/web/src}/pages/Components/components/InputComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/InputComponents.tsx (96%) rename {src => packages/web/src}/pages/Components/components/LabelComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/LabelComponents.tsx (93%) rename {src => packages/web/src}/pages/Components/components/LinkComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/LinkComponents.tsx (94%) rename {src => packages/web/src}/pages/Components/components/PageComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/PageComponents.tsx (90%) rename {src => packages/web/src}/pages/Components/components/PopoverComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/PopoverComponents.tsx (96%) rename {src => packages/web/src}/pages/Components/components/RadioGroupComponents.test.tsx (96%) rename {src => packages/web/src}/pages/Components/components/RadioGroupComponents.tsx (97%) rename {src => packages/web/src}/pages/Components/components/SearchInputComponents.test.tsx (97%) rename {src => packages/web/src}/pages/Components/components/SearchInputComponents.tsx (91%) rename {src => packages/web/src}/pages/Components/components/SelectComponents.test.tsx (95%) rename {src => packages/web/src}/pages/Components/components/SelectComponents.tsx (97%) rename {src => packages/web/src}/pages/Components/components/SkeletonComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/SkeletonComponents.tsx (93%) rename {src => packages/web/src}/pages/Components/components/SpinnerComponents.test.tsx (88%) rename {src => packages/web/src}/pages/Components/components/SpinnerComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/TableComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/TableComponents.tsx (96%) rename {src => packages/web/src}/pages/Components/components/TabsComponents.test.tsx (87%) rename {src => packages/web/src}/pages/Components/components/TabsComponents.tsx (94%) rename {src => packages/web/src}/pages/Components/components/TextComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/TextComponents.tsx (92%) rename {src => packages/web/src}/pages/Components/components/TextareaComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/TextareaComponents.tsx (96%) rename {src => packages/web/src}/pages/Components/components/ToastComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/ToastComponents.tsx (96%) rename {src => packages/web/src}/pages/Components/components/ToggleComponents.test.tsx (94%) rename {src => packages/web/src}/pages/Components/components/ToggleComponents.tsx (95%) rename {src => packages/web/src}/pages/Components/components/avatar-picture.png (100%) rename {src => packages/web/src}/pages/Components/model/components.ts (100%) rename {src => packages/web/src}/pages/Error/ErrorPage.test.tsx (90%) rename {src => packages/web/src}/pages/Error/ErrorPage.tsx (100%) rename {src => packages/web/src}/pages/Landing/LandingPage.test.tsx (92%) rename {src => packages/web/src}/pages/Landing/LandingPage.tsx (80%) rename {src => packages/web/src}/pages/Settings/SettingsPage.test.tsx (85%) rename {src => packages/web/src}/pages/Settings/SettingsPage.tsx (77%) rename {src => packages/web/src}/pages/Settings/components/AppearanceSettings.test.tsx (87%) rename {src => packages/web/src}/pages/Settings/components/AppearanceSettings.tsx (86%) rename {src => packages/web/src}/pages/Settings/components/SettingsHeading.test.tsx (93%) rename {src => packages/web/src}/pages/Settings/components/SettingsHeading.tsx (92%) rename {src => packages/web/src}/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx (96%) rename {src => packages/web/src}/pages/Settings/components/SettingsPageBreadcrumbs.tsx (90%) rename {src => packages/web/src}/pages/Tasks/TasksPage.test.tsx (87%) rename {src => packages/web/src}/pages/Tasks/TasksPage.tsx (78%) rename {src => packages/web/src}/pages/Tasks/api/useCreateTask.test.ts (91%) rename {src => packages/web/src}/pages/Tasks/api/useCreateTask.ts (91%) rename {src => packages/web/src}/pages/Tasks/api/useDeleteTask.test.ts (84%) rename {src => packages/web/src}/pages/Tasks/api/useDeleteTask.ts (85%) rename {src => packages/web/src}/pages/Tasks/api/useGetTask.test.ts (90%) rename {src => packages/web/src}/pages/Tasks/api/useGetTask.ts (79%) rename {src => packages/web/src}/pages/Tasks/api/useGetUserTasks.test.ts (94%) rename {src => packages/web/src}/pages/Tasks/api/useGetUserTasks.ts (87%) rename {src => packages/web/src}/pages/Tasks/api/useGetUsers.test.ts (90%) rename {src => packages/web/src}/pages/Tasks/api/useGetUsers.ts (74%) rename {src => packages/web/src}/pages/Tasks/api/useUpdateTask.test.ts (90%) rename {src => packages/web/src}/pages/Tasks/api/useUpdateTask.ts (87%) rename {src => packages/web/src}/pages/Tasks/components/Add/TaskAdd.test.tsx (92%) rename {src => packages/web/src}/pages/Tasks/components/Add/TaskAdd.tsx (78%) rename {src => packages/web/src}/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx (88%) rename {src => packages/web/src}/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx (87%) rename {src => packages/web/src}/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx (91%) rename {src => packages/web/src}/pages/Tasks/components/Delete/TaskDeleteDialog.tsx (87%) rename {src => packages/web/src}/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx (95%) rename {src => packages/web/src}/pages/Tasks/components/Edit/TaskCompleteToggle.tsx (84%) rename {src => packages/web/src}/pages/Tasks/components/Edit/TaskEdit.test.tsx (98%) rename {src => packages/web/src}/pages/Tasks/components/Edit/TaskEdit.tsx (75%) rename {src => packages/web/src}/pages/Tasks/components/Form/TaskForm.test.tsx (95%) rename {src => packages/web/src}/pages/Tasks/components/Form/TaskForm.tsx (91%) rename {src => packages/web/src}/pages/Tasks/components/List/TaskList.test.tsx (95%) rename {src => packages/web/src}/pages/Tasks/components/List/TaskList.tsx (90%) rename {src => packages/web/src}/pages/Tasks/components/List/TaskListItem.test.tsx (78%) rename {src => packages/web/src}/pages/Tasks/components/List/TaskListItem.tsx (71%) rename {src => packages/web/src}/pages/Tasks/components/TaskDetailLayout.test.tsx (94%) rename {src => packages/web/src}/pages/Tasks/components/TaskDetailLayout.tsx (84%) rename {src => packages/web/src}/pages/Tasks/components/TaskListLayout.test.tsx (82%) rename {src => packages/web/src}/pages/Tasks/components/TaskListLayout.tsx (87%) rename {src => packages/web/src}/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx (98%) rename {src => packages/web/src}/pages/Tasks/components/TasksPageBreadcrumbs.tsx (92%) rename {src => packages/web/src}/pages/Tasks/components/UserInfo.test.tsx (89%) rename {src => packages/web/src}/pages/Tasks/components/UserInfo.tsx (86%) rename {src => packages/web/src}/pages/Tasks/components/View/TaskView.test.tsx (93%) rename {src => packages/web/src}/pages/Tasks/components/View/TaskView.tsx (84%) rename {src => packages/web/src}/test/mocks/handlers.ts (93%) rename {src => packages/web/src}/test/mocks/server.ts (100%) rename {src => packages/web/src}/test/mocks/window.ts (100%) rename {src => packages/web/src}/test/query-client.ts (100%) rename {src => packages/web/src}/test/test-utils.tsx (94%) rename {src => packages/web/src}/test/wrappers/AllProvidersExceptRouter.tsx (86%) rename {src => packages/web/src}/test/wrappers/WithAllProviders.tsx (81%) rename {src => packages/web/src}/test/wrappers/WithQueryClientProvider.tsx (100%) rename {src => packages/web/src}/vite-env.d.ts (100%) create mode 100644 packages/web/tsconfig.json create mode 100644 packages/web/vite.config.ts create mode 100644 packages/web/vitest.config.ts create mode 100644 packages/web/vitest.setup.ts delete mode 100644 src/common/components/Divider/Divider.tsx delete mode 100644 src/common/components/Menu/MenuSeparator.tsx create mode 100644 tsconfig.base.json delete mode 100644 tsconfig.json delete mode 100644 tsconfig.node.json delete mode 100644 vite.config.ts create mode 100644 vitest.config.ts delete mode 100644 vitest.setup.ts diff --git a/.nvmrc b/.nvmrc index 72753e10..87e33794 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v24.18.0 \ No newline at end of file +v24.19.0 \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 07be5fa2..74d8c91a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,18 +1,19 @@ -# AGENTS.md - Autonomous Agent Operational Instructions +# AGENTS.md - Autonomous Agent Operational Instructions for TypeScript Monorepo -This document defines the operational boundaries, structural constraints, and execution workflows for Autonomous AI Agents interacting with the **React Starter (react-starter)** repository. Read this file completely before planning or executing any tasks. +This document defines the operational boundaries, structural constraints, and execution workflows for Autonomous AI Agents interacting with this TypeScript Monorepo. Read this file completely before planning or executing any tasks across the frontend, infrastructure, or shared workspaces. --- ## 1. Agent Persona & Core Capabilities -You are a **Senior TypeScript, React, and AWS CDK Developer Agent**. You possess complete mastery over modern frontend architectures, automated testing strategies, and Infrastructure-as-Code (IaC) deployment. +You are a **Senior Full-Stack TypeScript, React, and AWS CDK Developer Agent**. You possess complete mastery over monorepo orchestration, modern frontend architectures, automated cross-boundary testing strategies, and Infrastructure-as-Code (IaC) deployment. ### Authorized Capabilities -- Code generation, modification, and refactoring across the front end and infrastructure codebases. -- Executing local shell commands for linting, testing, formatting, and building. -- Analyzing test coverage metrics and generating co-located unit tests. +- Code generation, modification, and refactoring across all workspace packages (`web`, `infra`, `shared`). +- Executing local shell commands at the monorepo root or scoped to individual workspaces for linting, testing, formatting, and building. +- Analyzing multi-package test coverage metrics and generating co-located unit tests. +- Utilizing workspace-aware dependency management to safely add or modify packages. --- @@ -23,20 +24,22 @@ For every task or issue assigned to you, you **MUST** strictly follow this seque ``` [1. DISCOVER] --> [2. PLAN] --> [3. EXECUTE] -(Read files & logs) (Draft architecture) (Modify/Write code) -^ | -| v -[5. CONCLUDE] <-- [4. VERIFY] <-- [TEST/LINT] -(Update docs/DoD) (Review Coverage) (Run local scripts) +(Read workspace (Draft cross-pkg (Modify/Write code & +files & root logs) architecture) update package.json) +^ | +| v +[6. CONCLUDE] <-- [5. VERIFY] <-- [4. TEST/LINT] +(Update Changesets/ (Review multi-pkg (Run workspace-scoped +Definition of Done) coverage floors) or unified scripts) ``` -1. **Discover & Analyze:** Read the relevant components, types, and existing tests. Do not guess the structure of existing code. -2. **Plan & Confirm:** Formulate your implementation strategy. Explicitly state which files will be modified or created. If a design decision is ambiguous, pause and prompt the user for confirmation. -3. **Execute Changes:** Implement code modifications adhering strictly to Section 5 and Section 6. -4. **Test & Validate:** Execute the exact project test and lint commands. If tests fail or lint issues arise, self-correct immediately. -5. **Verify Coverage:** Check that your changes maintain or exceed the project's code coverage requirements. -6. **Conclude (Definition of Done):** Provide a concise summary of changes and validation outputs. +1. **Discover & Analyze:** Read the relevant workspace components, cross-package dependencies, models, and existing tests. Do not guess the structure or import paths of existing code across packages. +2. **Plan & Confirm:** Formulate your implementation strategy. Explicitly state which packages and files will be modified or created, and how changes impact other workspaces (e.g., how a modification in `packages/shared` affects `packages/web` and `packages/infra`). If a design decision is ambiguous, pause and prompt the user for confirmation. +3. **Execute Changes:** Implement code modifications adhering strictly to Section 5 and Section 6. Ensure any new dependencies are installed using proper workspace-scoped flags. +4. **Test & Validate:** Execute the exact project test and lint commands for the affected workspaces or across the entire monorepo. If tests fail or lint issues arise, self-correct immediately. +5. **Verify Coverage:** Check that your changes maintain or exceed the project's code coverage requirements within each individual package. +6. **Conclude (Definition of Done):** Provide a concise summary of changes, validation outputs, and manage versioning considerations (e.g., changesets) if required. --- @@ -44,82 +47,116 @@ For every task or issue assigned to you, you **MUST** strictly follow this seque ### Directory Map -``` - -src/ -├── common/ # App-wide shared assets -│ ├── api/ # Global API hooks (e.g., useGetCurrentUser.ts) -│ ├── components/ # Shared components -│ │ └── shadcn/ # Atomic shadcn/ui components (DO NOT modify internals) -│ ├── hooks/ # App-wide utilities hooks (e.g., useDebounce.ts) -│ ├── models/ # Type and Interface definitions (e.g., Task.ts) -│ ├── providers/ # Context/Theme providers -│ └── utils/ # Global Axios instances and constants -└── pages/ # Page-specific domains -└── tasks/ # Feature group folder -├── create/ # Feature-scoped components & tests -├── configure/ -├── delete/ -├── hooks/ # Feature-isolated API/State hooks (e.g., useGetTasks.ts) -└── utils/ # Feature-isolated pure utility logic -infrastructure/ # AWS CDK Infrastructure (Self-contained) +```text +├── packages/ # Parent directory for workspace modules +│ ├── infra/ # AWS CDK Infrastructure as Code +│ │ ├── src/ +│ │ │ ├── stacks/ # Infrastructure stack definitions (S3, CloudFront, Route53) +│ │ │ └── utils/ # Configuration validation logic +│ │ ├── package.json +│ │ └── tsconfig.json +│ ├── shared/ # Shared utilities, types, and validation schemas +│ │ ├── src/ +│ │ │ ├── components/ # Reusable UI components +│ │ │ │ └── shadcn/ # Atomic shadcn/ui components (DO NOT modify internals) +│ │ │ ├── models/ # Unified Type & Interface definitions (e.g., Task.ts) +│ │ │ ├── schemas/ # Common Zod verification schemas +│ │ │ └── utils/ # Universal helper functions +│ │ ├── package.json +│ │ └── tsconfig.json +│ └── web/ # Frontend Web Application (React 19 & Vite) +│ ├── src/ +│ │ ├── common/ # App-wide shared assets +│ │ │ ├── api/ # Global API hooks (e.g., TanStack Query hooks) +│ │ │ ├── components/ # App-wide UI components +│ │ │ ├── hooks/ # App-wide utility hooks (e.g., useDebounce.ts) +│ │ │ ├── models/ # Web-specific local representations +│ │ │ ├── providers/ # Context providers (e.g. Theme) +│ │ │ └── utils/ # Global Axios instances, constants, and utilities +│ │ ├── pages/ # Page-specific domains +│ │ │ └── tasks/ # Feature group folder (e.g. Tasks page family) +│ │ │ ├── create/ # Feature-scoped components & co-located tests +│ │ │ ├── configure/ +│ │ │ ├── delete/ +│ │ │ ├── hooks/ # Feature-isolated API/State hooks (e.g., useGetTasks.ts) +│ │ │ └── utils/ # Feature-isolated pure utility logic +│ │ ├── globals.css # Global styles and Tailwind variables +│ │ └── main.tsx # Web application entrypoint +│ ├── package.json +│ └── tsconfig.json +├── package.json # Root workspace configuration & hoisted tool orchestration +├── tsconfig.base.json # Base TypeScript compiler configuration file +├── vitest.config.ts # Base Vitest configuration file +└── eslint.config.js # Shared monorepo lint configuration ``` ### Critical Architecture Rules -- **No Barrel Files:** Never create or maintain `index.ts` files for re-exporting. Import directly from the exact file path. -- **Co-location Principle:** Always place unit tests (`*.test.ts`, `*.test.tsx`) in the exact same directory as the module or component they are testing. +- **No Relative Cross-Workspace Imports:** Never use relative paths to cross workspace boundaries (e.g., do not use `import ... from "../../../shared/src"` inside `packages/web`). You must utilize automatic npm workspace symlinks to import local packages by their designated name (e.g., `import { TaskSchema } from "@react-starter/shared"`). +- **No Barrel Files:** Never create or maintain `index.ts` files for re-exporting within feature folders or lambda submodules. Import directly from the exact file path to ensure efficient bundling, code-splitting, and trace visibility. +- **Co-location Principle:** Always place unit tests (`*.test.ts`, `*.test.tsx`) in the exact same directory as the module, function, handler, or component they are testing. +- **Centralized Base Configs:** Shared configurations (e.g., `tsconfig.base.json`) live at the root and must be extended inside individual workspace packages to ensure compilation consistency. - **Coding Principles:** All source code should follow the Single Responsibility Principle (SRP) and Don't Repeat Yourself (DRY). Do not add unnecessary or unrequested source members, You Aint Gonna Need It (YAGNI). --- ## 4. Permitted Tooling & Command Index -You are authorized to execute the following shell commands to validate your work. Do not use unlisted tools or invent flags. - -| Task | Command | Scope | -| :----------------------- | :--------------------------------------- | :------------------------- | -| **Install Dependencies** | `npm install` | Root Project | -| **Run Unit Tests** | `npm run test` | Front End | -| **Check Code Coverage** | `npm run test:coverage` | Front End | -| **Lint Codebase** | `npm run lint` | Front End / Infrastructure | -| **Format Code** | `npm run format` | Global | -| **Add shadcn Component** | `npx shadcn@latest add [component]` | Front End Component Setup | -| **CDK Synthesize** | `cd infrastructure && npm run cdk synth` | Infrastructure Validation | +You are authorized to execute the following shell commands to validate your work. Do not use unlisted tools, invent flags, or circumvent the root workspace manager. + +| Task | Command | Scope | +| ------------------------ | --------------------------------------------------------------------- | ------------------------------------------- | +| **Install Dependencies** | `npm install` | Root Project (Updates lockfile) | +| **Scoped Installation** | `npm install -w ` | Installs dependency into specific package | +| **Run All Unit Tests** | `npm test --workspaces` | Comprehensive Repo Testing (Vitest) | +| **Run Frontend Tests** | `npm run test -w packages/web` or `npm run test -w @monorepo/web` | Frontend Component/Hook Validation | +| **Run API Lambda Tests** | `npm run test -w packages/api` or `npm run test -w @monorepo/api` | Lambda Handler Validation | +| **Run Infra Tests** | `npm run test -w packages/infra` or `npm run test -w @monorepo/infra` | Infrastructure Stack Validation | +| **Check Code Coverage** | `npm run test:coverage --workspaces` | Global Multi-Package Coverage Review | +| **Lint Entire Codebase** | `npm run lint` | Full Monorepo Linting & Formatting Analysis | +| **Format Code** | `npx run format` | Global Prettier/Formatter execution | +| **Add shadcn Component** | `npx shadcn@latest add [component]` | Executed inside `packages/shared` directory | +| **CDK Synthesize** | `npm run cdk synth -w packages/infra` | AWS CDK Infrastructure Validation | --- ## 5. Code Generation Guardrails -### TypeScript Standards +### TypeScript Standards (Repo-wide) - **Strict Typing:** Set type safety to maximum. Avoid using `any` or `ts-ignore`. -- **Typing Mechanics:** Prefer `interface` for structural object definitions (props, state) and `type` for complex intersections, unions, or utility modifications. -- **Value Handling:** Use optional chaining (`?.`) and nullish coalescing (`??`) over manual falsy checks. Avoid forceful type assertions (`as Type`) unless interfacing with raw external boundaries. +- **Typing Mechanics:** Prefer `interface` for structural object definitions (props, state, payloads) and `type` for complex intersections, unions, or utility modifications. +- **Value Handling:** Use optional chaining (`?.`) and nullish coalescing (`??`) over manual falsy checks. Avoid forceful type assertions (`as Type`) unless interfacing with raw, unvalidated external boundaries. +- **Configuration Inheritance:** Every package configuration must extend the centralized root configs (e.g., `tsconfig.base.json`). +- **Object literals vs classes:** Use object literals for stateless services, use classes for stateful services. Prefer object literals for simplicity and memory utilization. -### React Component Layout +### File & Directory Naming Conventions -- Write components as **Arrow Functions** using explicit functional component patterns. -- Always use **Default Exports** for page components and standard components. -- Enforce code splitting by leveraging route-level `lazy()` and `Suspense` operations. +- **kebab-case for TypeScript Files:** All TypeScript source files (`.ts`, `.ts`, models, utilities, services, handlers) must use `kebab-case`. Example: `document.ts`, `query-request.ts`, `sync-status.ts`. +- **camelCase for React Hooks:** React hook files must use `camelCase`. Example: `useGetTasks.ts`, `useFormState.ts`, `useTheme.ts`. +- **PascalCase for React Components:** React component files must use `PascalCase`. Example: `TaskCard.tsx`, `SearchForm.tsx`, `Modal.tsx`. +- **Test File Colocation:** Test files follow the same naming convention as their source file, with `.test` suffix. Example: `document.test.ts`, `useGetTasks.test.ts`, `TaskCard.test.tsx`. -### Component Testing Hooks +### Frontend React Component Layout (`packages/web`) -- Always inject a `data-testid` attribute or accept a `testId` prop on components to ensure reliable test selection. -- The `testId` prop must default to the component's name written in `kebab-case`. +- Write components as **Arrow Functions** using explicit functional component patterns (`const MyComponent: React.FC = ...`). +- Always use **Default Exports** for page components and standard UI components. +- Enforce code splitting by leveraging route-level `lazy()` and `Suspense` operations in routing definitions. +- **Component Testing Hooks:** Always inject a `data-testid` attribute or accept a `testId` prop on components to ensure reliable test selection. The `testId` prop must default to the component's name written in `kebab-case`. +- **Styling & UI Systems (shadcn/ui & Tailwind):** Use **Tailwind CSS** classes natively. Apply thematic alterations through CSS variables via `packages/web/src/index.css`. Use `class-variance-authority` (CVA) within `packages/web/src/common/utils/css.ts` when handling multi-variant components. +- **shadcn Rule:** Never modify underlying code files inside `packages/web/src/common/components/shadcn/` by hand. If behavior adjustments are required, write a wrapper component around them. Scaffold new ones using the authorized CLI command. -### Styling & UI Systems (shadcn/ui & Tailwind) +### Shared Workspace Standards (`packages/shared`) -- Use **Tailwind CSS** classes natively. Apply thematic alterations through CSS variables via `src/index.css`. -- Use `class-variance-authority` (CVA) within `src/common/utils/css.ts` when handling multi-variant components. -- **shadcn Rule:** Never modify underlying code files inside `src/common/components/shadcn/` by hand. If behavior adjustments are required, write a wrapper component around them. Scaffold new ones using the authorized CLI command. +- **Single Source of Truth:** Place common structural interfaces, data models, and Zod validation schemas inside this package so they can be consumed symmetrically by `packages/web` (frontend forms/state) and future packages. +- **Environment Agnosticism:** Code within `packages/shared` must be pure and free of browser-specific (`window`, `document`) or Node.js runtime-specific (`process.env`) assumptions unless strictly isolated into explicit type contexts. -### Infrastructure (AWS CDK) +### Infrastructure (`packages/infra`) -- Keep the `infrastructure/` directory entirely decoupled from front-end runtime mechanics. -- Use **Zod** to rigorously validate environment configurations and configurations prefixed with `CDK_`. -- Ensure every cloud resource contains the minimum required resource tags: `App`, `Env`, `OU`, and `Owner`. +- **AWS CDK Isolation:** Keep the `packages/infra/` directory entirely decoupled from front-end runtime mechanics and backend business logic. It reads built lambda artifacts or source file paths but does not execute backend logic. +- **Configuration Security:** Use **dotenv** in conjunction with **Zod** to rigorously validate infrastructure environment configurations and parameters prefixed with `CDK_`. +- **Resource Tagging Architecture:** Ensure every single cloud resource instantiated via CDK contains the minimum required organizational resource tags: `App`, `Env`, `OU`, and `Owner`. --- @@ -127,8 +164,14 @@ You are authorized to execute the following shell commands to validate your work Your task cannot be marked as complete until it passes the following strict criteria: -1. **Zero Lint/Type Regressions:** The execution of `npm run lint` and TypeScript compilation returns a `0` exit code. -2. **Co-located Test Presence:** Every new or modified source file (`.ts`, `.tsx`) has a corresponding partner `.test.ts(x)` file sitting directly next to it. -3. **AAA Structure enforced:** Tests must visually segregate actions using comments or structural layout into `Arrange`, `Act`, and `Assert`. -4. **Testing Library Best Practices:** Tests must utilize `screen` from `@testing-library/react` and interactions must be evaluated via `@testing-library/user-event`. -5. **Coverage Floor Met:** The global and feature-scoped test coverage must remain at or above a strict **80% minimum requirement** across all updated lines of code. +1. **Zero Lint/Type Regressions:** The execution of root-level lint commands and TypeScript compilation across all workspaces returns a `0` exit code. +2. **Co-located Test Presence:** Every new or modified source file (`.ts`, `.tsx`) has a corresponding partner `.test.ts(x)` file sitting directly next to it in the exact same directory. +3. **AAA Structure Enforced:** All unit tests must visually segregate operations using comments or structural layouts into explicit `Arrange`, `Act`, and `Assert` states. +4. **Testing Standards:** + + - **Framework Consistency:** Use **Vitest** as the unified runner across all workspaces. + - **Frontend:** Tests must utilize `screen` from `@testing-library/react` and all interactions must be simulated and evaluated via `@testing-library/user-event`. + +5. **Coverage Floor Met:** The test coverage for updated code paths across all modified workspaces must remain at or above a strict **70% minimum requirement**. +6. **Workspace Dependency Integrity:** No loose, un-hoisted dependencies may exist in package subdirectories that clash with root version alignment. All local intra-repo tracking must use automatic workspace symlinking. +7. **Version Automation:** Use `changesets` where applicable if updates to a workspace require formal semantic version tracking or independent package publication pipelines. diff --git a/README.md b/README.md index ef3a57d0..1108f8f2 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,49 @@ This project is licensed under the MIT License - see [LICENSE](./LICENSE) file f For detailed guides and reference materials, see the [Project Documentation](docs/README.md). +## Monorepo Structure + +This project is organized as a **TypeScript monorepo** using npm workspaces, enabling modular development, shared type definitions, and coordinated deployments across frontend, backend, and infrastructure concerns. + +### Packages + +The monorepo consists of three primary packages: + +#### **`packages/web`** — React Frontend Application + +The client-side application built with React 19, TypeScript, and Vite. This package contains all UI components, pages, routing, state management, and API integration logic. It leverages the `shared` package for common types, schemas, and components. + +- **Technology:** React, Vite, React Router DOM, TanStack Query, Axios, React Hook Form, Tailwind CSS, shadcn/ui +- **Structure:** Organized by feature domains with co-located tests (`*.test.tsx`), hooks, and utilities +- **Key Responsibilities:** UI rendering, form handling, API client interactions, client-side routing, theme management + +#### **`packages/shared`** — Common Types, Schemas & Components + +A library package providing the single source of truth for data models, validation schemas, and reusable UI components. Both the frontend (`web`) and infrastructure (`infra`) packages depend on `shared` to ensure consistent type definitions across the application. + +- **Technology:** TypeScript, Zod, shadcn/ui +- **Structure:** Organized by concern: models (interfaces/types), schemas (Zod validators), components (UI library), utilities (pure functions) +- **Key Responsibilities:** Type definitions, schema validation, shared component library, utility functions + +#### **`packages/infra`** — AWS CDK Infrastructure as Code + +Infrastructure provisioning and deployment automation using AWS CDK. This package defines all cloud resources (CloudFront, S3, Route53, etc.) and handles environment-specific configurations. It does not execute application logic but references compiled frontend artifacts and shared configuration schemas. + +- **Technology:** AWS CDK, TypeScript, Zod +- **Structure:** Organized by AWS resource type with stacks and validation utilities +- **Key Responsibilities:** Infrastructure stack definitions, deployment automation, resource tagging, environment configuration + +### Workspace Dependencies + +``` +web ──→ shared +infra ──→ shared +``` + +The `web` and `infra` packages both depend on `shared` for common types and schemas, but maintain independence from each other. This architecture enables parallel development, independent testing, and clear separation of concerns across frontend and infrastructure concerns. + +See [AGENTS.md](./AGENTS.md) for comprehensive architectural guidelines, coding standards, and operational workflows across all packages. + ## Helpful Hints ### Viewing the Starter Kit diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..21ec664e --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,39 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; + +/** + * Global ESLint configuration for the project. + */ +export default defineConfig([ + { + ignores: [ + '**/cdk.out/**', + '**/coverage/**', + '**/dist/**', + '**/node_modules/**', + '**/shadcn/*.tsx', + '**/storybook-static/**', + ], + }, + { + files: ['**/*.{js,mjs,cjs,ts,mts,cts}'], + plugins: { js }, + extends: ['js/recommended'], + languageOptions: { globals: globals.browser }, + }, + tseslint.configs.recommended, + { + files: ['**/*.ts', '**/*.tsx'], + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + }, + }, +]); diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 3295423c..00000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,48 +0,0 @@ -import globals from 'globals'; -import tsParser from '@typescript-eslint/parser'; - -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; - -import reactHooks from 'eslint-plugin-react-hooks'; -import { reactRefresh } from 'eslint-plugin-react-refresh'; -import storybook from 'eslint-plugin-storybook'; - -/** - * The ESLint configuration in "flat config" format. - * - * Note: This configuration uses helper functions from `typescript-eslint`. - * - * @see {@link https://eslint.org/docs/latest/use/configure/ Configure ESLint} - * @see {@link https://typescript-eslint.io/packages/typescript-eslint typescript-eslint} - */ -export default tseslint.config( - { - files: ['**/*.ts', '**/*.tsx'], - extends: [eslint.configs.recommended, ...tseslint.configs.recommended], - languageOptions: { - globals: { - ...globals.browser, - }, - - parser: tsParser, - }, - linterOptions: { - reportUnusedDisableDirectives: 'warn', - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh.plugin, - storybook: storybook, - }, - rules: { - 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], - '@typescript-eslint/no-empty-object-type': ['error', { allowWithName: 'Props$' }], - }, - }, - { - // global ignores - // do not add any other keys to this object - ignores: ['**/node_modules/', '**/coverage/', '**/dist/', '**/storybook-static/', '**/cdk.out/'], - }, -); diff --git a/infrastructure/cdk.context.json b/infrastructure/cdk.context.json deleted file mode 100644 index acf3e96e..00000000 --- a/infrastructure/cdk.context.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "acknowledged-issue-numbers": [34892, 34892] -} diff --git a/infrastructure/cdk.json b/infrastructure/cdk.json deleted file mode 100644 index 3aeb046a..00000000 --- a/infrastructure/cdk.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "app": "npx ts-node --prefer-ts-exts app.ts", - "watch": { - "include": ["**/*.ts"], - "exclude": [ - "README.md", - "cdk*.json", - "**/*.d.ts", - "**/*.js", - "tsconfig.json", - "package*.json", - "yarn.lock", - "node_modules", - "test" - ] - }, - "context": { - "@aws-cdk/aws-lambda:recognizeLayerVersion": true, - "@aws-cdk/core:checkSecretUsage": true, - "@aws-cdk/core:target-partitions": ["aws", "aws-cn"], - "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, - "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, - "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, - "@aws-cdk/aws-iam:minimizePolicies": true, - "@aws-cdk/core:validateSnapshotRemovalPolicy": true, - "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, - "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, - "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, - "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, - "@aws-cdk/core:enablePartitionLiterals": true, - "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, - "@aws-cdk/aws-iam:standardizedServicePrincipals": true, - "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, - "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, - "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, - "@aws-cdk/customresources:installLatestAwsSdkDefault": false, - "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, - "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, - "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, - "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, - "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, - "@aws-cdk/aws-redshift:columnId": true, - "@aws-cdk/aws-stepfunctions-tasks:enableLogging": true, - "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, - "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, - "@aws-cdk/aws-kms:aliasNameRef": true, - "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, - "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, - "@aws-cdk/aws-efs:denyAnonymousAccess": true, - "@aws-cdk/aws-opensearchservice:enableLogging": true, - "@aws-cdk/aws-ssm:parameterValueSelectiveContext": true, - "@aws-cdk/aws-route53:useCertificate": true, - "@aws-cdk/aws-logs:avoidDuplicateResourceName": true, - "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, - "@aws-cdk/aws-route53-patters:useCertificate": true - } -} diff --git a/infrastructure/jest.config.ts b/infrastructure/jest.config.ts deleted file mode 100644 index a8585323..00000000 --- a/infrastructure/jest.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Config } from 'jest'; - -const config: Config = { - preset: 'ts-jest', - testEnvironment: 'node', - roots: [''], - testMatch: ['**/*.test.ts'], - collectCoverageFrom: [ - '**/*.ts', - '!app.ts', - '!**/*.test.ts', - '!**/*.spec.ts', - '!**/node_modules/**', - '!**/cdk.out/**', - '!**/dist/**', - '!jest.config.ts', - '!jest.setup.ts', - ], - coverageDirectory: 'coverage', - coverageReporters: ['json', 'json-summary', 'text', 'lcov', 'clover'], - testTimeout: 30000, // CDK operations can take longer -}; - -export default config; diff --git a/infrastructure/package-lock.json b/infrastructure/package-lock.json deleted file mode 100644 index 26f295ea..00000000 --- a/infrastructure/package-lock.json +++ /dev/null @@ -1,5201 +0,0 @@ -{ - "name": "@leanstacks/react-starter-infrastructure", - "version": "1.7.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@leanstacks/react-starter-infrastructure", - "version": "1.7.0", - "dependencies": { - "aws-cdk-lib": "2.261.0", - "constructs": "10.7.1", - "dotenv": "17.4.2", - "zod": "4.4.3" - }, - "devDependencies": { - "@types/jest": "30.0.0", - "@types/node": "26.1.1", - "aws-cdk": "2.1132.0", - "jest": "30.4.2", - "rimraf": "6.1.3", - "ts-jest": "29.4.12", - "ts-node": "10.9.2", - "typescript": "5.9.3" - } - }, - "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.282", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.282.tgz", - "integrity": "sha512-7hKMi5tTxDcKGIMIOq14PnY0GBcugW33Uh/2YHDZiEwSxLeFOCYBwhR+BFXONb/EJeVI3RETFgailNZbkcKF6g==", - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.2.tgz", - "integrity": "sha512-pDiuqH+qY3zM9lhhLjbKJ1tnKOHzQ2V4Wr/3qsxyKeKAkuPMI/BVGvZG1PbrikUw949cGVTfVEt4ETKKYnrj0Q==", - "license": "Apache-2.0" - }, - "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "54.12.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-54.12.0.tgz", - "integrity": "sha512-u8G9RZGW7vWq0KpEj1MYAin8yc+Mw7wYU2UjM5C2juZIHavXcerj6q7UsoOWd0N2TWtBw9WT9w3gknqR1GzAmg==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "license": "Apache-2.0", - "dependencies": { - "jsonschema": "^1.5.0", - "semver": "^7.8.5" - }, - "engines": { - "node": ">= 18.0.0" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.8.5", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz", - "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/core": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.4.2.tgz", - "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.4.1", - "@jest/pattern": "30.4.0", - "@jest/reporters": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.4.1", - "jest-config": "30.4.2", - "jest-haste-map": "30.4.1", - "jest-message-util": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-resolve-dependencies": "30.4.2", - "jest-runner": "30.4.2", - "jest-runtime": "30.4.2", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "jest-watcher": "30.4.1", - "pretty-format": "30.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", - "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.4.1.tgz", - "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "jest-mock": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.4.1.tgz", - "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "30.4.1", - "jest-snapshot": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", - "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.4.1.tgz", - "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@sinonjs/fake-timers": "^15.4.0", - "@types/node": "*", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.4.1.tgz", - "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.4.1", - "@jest/expect": "30.4.1", - "@jest/types": "30.4.1", - "jest-mock": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", - "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.4.1.tgz", - "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "jest-worker": "30.4.1", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", - "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", - "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.4.1.tgz", - "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.4.1", - "@jest/types": "30.4.1", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", - "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.4.1", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz", - "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.4.1", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-util": "30.4.1", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/types": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", - "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.4.0", - "@jest/schemas": "30.4.1", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", - "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.52", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", - "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", - "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~8.3.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", - "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", - "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", - "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", - "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", - "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", - "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", - "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", - "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", - "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", - "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-loong64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", - "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", - "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", - "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", - "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", - "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", - "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", - "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-openharmony-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", - "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", - "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", - "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", - "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", - "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aws-cdk": { - "version": "2.1132.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1132.0.tgz", - "integrity": "sha512-kcIzBZQO+2v+F97iaeI29fdOUQEx44wr0qDb9HXNqdU82V+1ZKI1KuFlHwH2nq7+6iNc1bu60se4hFf+2d7vXg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 18.0.0" - } - }, - "node_modules/aws-cdk-lib": { - "version": "2.261.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.261.0.tgz", - "integrity": "sha512-e52e3Abjg0HkuRWlWwtSv5+ZiMW1rhCDdL9ff7lzWXInU8xdfLJpuoimfa0IJwjiNGyphppgg52Azx9M80OA0g==", - "bundleDependencies": [ - "@balena/dockerignore", - "@aws-cdk/cloud-assembly-api", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "yaml", - "mime-types" - ], - "license": "Apache-2.0", - "dependencies": { - "@aws-cdk/asset-awscli-v1": "2.2.282", - "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.2", - "@aws-cdk/cloud-assembly-api": "^2.2.5", - "@aws-cdk/cloud-assembly-schema": "^54.0.0", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.3.5", - "ignore": "^5.3.2", - "jsonschema": "^1.5.0", - "mime-types": "^2.1.35", - "minimatch": "^10.2.5", - "punycode": "^2.3.1", - "semver": "^7.8.1", - "yaml": "1.10.3" - }, - "engines": { - "node": ">= 20.0.0" - }, - "peerDependencies": { - "constructs": "^10.5.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@aws-cdk/cloud-assembly-api": { - "version": "2.2.5", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "jsonschema": "^1.5.0", - "semver": "^7.8.0" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": ">=53.28.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/aws-cdk-lib/node_modules/balanced-match": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/aws-cdk-lib/node_modules/brace-expansion": { - "version": "5.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/aws-cdk-lib/node_modules/case": { - "version": "1.6.3", - "inBundle": true, - "license": "(MIT OR GPL-3.0-or-later)", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "11.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.3.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonfile": { - "version": "6.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonschema": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/mime-db": { - "version": "1.52.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/mime-types": { - "version": "2.1.35", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/minimatch": { - "version": "10.2.5", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.8.1", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/yaml": { - "version": "1.10.3", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", - "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.4.1", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.4.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", - "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", - "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", - "integrity": "sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.4.0", - "babel-preset-current-node-syntax": "^1.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", - "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001781", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", - "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/constructs": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.7.1.tgz", - "integrity": "sha512-ulK25Sg2Nv1jW+A9VeV7fu9GFN9KdVTNWdXMoapNRwqkQzSdToro/Tttk3Ak5BGI80NRA/d2nSzKnoZ27LizLw==", - "license": "Apache-2.0" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", - "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.323", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.323.tgz", - "integrity": "sha512-oQm+FxbazvN2WICCbvJgj3IYPKV8awip57+W5VP+Aatk4kFU4pDYCPHZOX22Z27zpw8uttBehEqgK+VTJAYrVw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", - "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.9", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", - "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz", - "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.4.2", - "@jest/types": "30.4.1", - "import-local": "^3.2.0", - "jest-cli": "30.4.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.4.1.tgz", - "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.4.1", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.4.2.tgz", - "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.4.1", - "@jest/expect": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.4.1", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-runtime": "30.4.2", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", - "p-limit": "^3.1.0", - "pretty-format": "30.4.1", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-cli": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.4.2.tgz", - "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.4.2", - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.4.2", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.4.2.tgz", - "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.4.0", - "@jest/test-sequencer": "30.4.1", - "@jest/types": "30.4.1", - "babel-jest": "30.4.1", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-circus": "30.4.2", - "jest-docblock": "30.4.0", - "jest-environment-node": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-runner": "30.4.2", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "parse-json": "^5.2.0", - "pretty-format": "30.4.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", - "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.4.0", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.4.0.tgz", - "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.4.1.tgz", - "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.4.1", - "chalk": "^4.1.2", - "jest-util": "30.4.1", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.4.1.tgz", - "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.4.1", - "@jest/fake-timers": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "jest-mock": "30.4.1", - "jest-util": "30.4.1", - "jest-validate": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.4.1.tgz", - "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.4.0", - "jest-util": "30.4.1", - "jest-worker": "30.4.1", - "picomatch": "^4.0.3", - "walker": "^1.0.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-leak-detector": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", - "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", - "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.4.1", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", - "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.4.1", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-util": "30.4.1", - "picomatch": "^4.0.3", - "pretty-format": "30.4.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-mock": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", - "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "jest-util": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", - "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz", - "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", - "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "30.4.0", - "jest-snapshot": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.4.2.tgz", - "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.4.1", - "@jest/environment": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.4.0", - "jest-environment-node": "30.4.1", - "jest-haste-map": "30.4.1", - "jest-leak-detector": "30.4.1", - "jest-message-util": "30.4.1", - "jest-resolve": "30.4.1", - "jest-runtime": "30.4.2", - "jest-util": "30.4.1", - "jest-watcher": "30.4.1", - "jest-worker": "30.4.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.4.2.tgz", - "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.4.1", - "@jest/fake-timers": "30.4.1", - "@jest/globals": "30.4.1", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.4.1.tgz", - "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.4.1", - "graceful-fs": "^4.2.11", - "jest-diff": "30.4.1", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "pretty-format": "30.4.1", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", - "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.4.1", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz", - "integrity": "sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.4.1", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.4.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.4.1.tgz", - "integrity": "sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.4.1", - "string-length": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz", - "integrity": "sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.4.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", - "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.4.1", - "ansi-styles": "^5.2.0", - "react-is-18": "npm:react-is@^18.3.1", - "react-is-19": "npm:react-is@^19.2.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/react-is-18": { - "name": "react-is", - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-is-19": { - "name": "react-is", - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", - "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/synckit": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", - "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.3.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ts-jest": { - "version": "29.4.12", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.12.tgz", - "integrity": "sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.9", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.8.5", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <7" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "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" - }, - "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" - }, - "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 - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unrs-resolver": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", - "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.4" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.12.2", - "@unrs/resolver-binding-android-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-x64": "1.12.2", - "@unrs/resolver-binding-freebsd-x64": "1.12.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", - "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-musl": "1.12.2", - "@unrs/resolver-binding-openharmony-arm64": "1.12.2", - "@unrs/resolver-binding-wasm32-wasi": "1.12.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/infrastructure/package.json b/infrastructure/package.json deleted file mode 100644 index d7bc74fd..00000000 --- a/infrastructure/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@leanstacks/react-starter-infrastructure", - "version": "1.7.0", - "private": true, - "scripts": { - "build": "tsc", - "clean": "rimraf cdk.out coverage dist", - "cdk": "cdk", - "deploy": "cdk deploy", - "deploy:all": "cdk deploy --all", - "destroy": "cdk destroy", - "destroy:all": "cdk destroy --all", - "diff": "cdk diff", - "synth": "cdk synth", - "test": "jest --coverage=false --verbose --silent", - "test:coverage": "jest --coverage --verbose --silent", - "test:watch": "jest --watch" - }, - "devDependencies": { - "@types/jest": "30.0.0", - "@types/node": "26.1.1", - "aws-cdk": "2.1132.0", - "jest": "30.4.2", - "rimraf": "6.1.3", - "ts-jest": "29.4.12", - "ts-node": "10.9.2", - "typescript": "5.9.3" - }, - "dependencies": { - "aws-cdk-lib": "2.261.0", - "constructs": "10.7.1", - "dotenv": "17.4.2", - "zod": "4.4.3" - } -} diff --git a/infrastructure/tsconfig.json b/infrastructure/tsconfig.json deleted file mode 100644 index 19525305..00000000 --- a/infrastructure/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "commonjs", - "lib": ["ES2022"], - "declaration": true, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "typeRoots": ["./node_modules/@types"], - "outDir": "dist" - }, - "exclude": ["dist", "cdk.out", "node_modules", "coverage", "**/*.js"], - "include": ["**/*.ts", "jest.config.ts"] -} diff --git a/infrastructure/utils/config.test.ts b/infrastructure/utils/config.test.ts deleted file mode 100644 index 542f96a8..00000000 --- a/infrastructure/utils/config.test.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { getConfig, getEnvironmentConfig, getTags, type Config } from './config'; - -describe('config', () => { - const originalEnv = process.env; - - beforeEach(() => { - jest.resetModules(); - process.env = { ...originalEnv }; - }); - - afterAll(() => { - process.env = originalEnv; - }); - - describe('getConfig', () => { - it('should return valid configuration when CDK_ENV is set', () => { - process.env.CDK_ENV = 'dev'; - process.env.CDK_DOMAIN_NAME = 'react-starter.dev.example.com'; - process.env.CDK_CERTIFICATE_ARN = 'arn:aws:acm:us-east-1:123456789012:certificate/test'; - process.env.CDK_HOSTED_ZONE_ID = 'Z1234567890ABCDEFGHI'; - process.env.CDK_HOSTED_ZONE_NAME = 'dev.example.com'; - - const config = getConfig(); - - expect(config).toBeDefined(); - expect(config.CDK_ENV).toBe('dev'); - expect(config.CDK_APP_NAME).toBe('react-starter'); - expect(config.CDK_STORYBOOK_ASSET_PATH).toBe('../storybook-static'); - expect(config.CDK_ASSET_PATH).toBe('../dist'); - }); - - it('should return configuration with optional values', () => { - process.env.CDK_APP_NAME = 'my-app'; - process.env.CDK_ENV = 'prd'; - process.env.CDK_DOMAIN_NAME = 'my-app.prd.example.com'; - process.env.CDK_CERTIFICATE_ARN = 'arn:aws:acm:us-east-1:123456789012:certificate/my-cert'; - process.env.CDK_HOSTED_ZONE_ID = 'Z0987654321FEDCBAXYZ'; - process.env.CDK_HOSTED_ZONE_NAME = 'prd.example.com'; - process.env.CDK_ACCOUNT = '123456789012'; - process.env.CDK_REGION = 'us-east-1'; - process.env.CDK_OU = 'leanstacks'; - process.env.CDK_OWNER = 'platform-team'; - process.env.CDK_ASSET_PATH = '../custom-dist'; - process.env.CDK_STORYBOOK_ASSET_PATH = '../custom-storybook'; - process.env.CDK_STORYBOOK_DOMAIN_NAME = 'my-app-storybook.prd.example.com'; - process.env.CDK_STORYBOOK_CERTIFICATE_ARN = 'arn:aws:acm:us-east-1:123456789012:certificate/my-cert-storybook'; - process.env.CDK_STORYBOOK_HOSTED_ZONE_ID = 'Z0987654321FEDCBAXYZ'; - process.env.CDK_STORYBOOK_HOSTED_ZONE_NAME = 'prd.example.com'; - - const config = getConfig(); - - expect(config).toEqual({ - CDK_APP_NAME: 'my-app', - CDK_ENV: 'prd', - CDK_DOMAIN_NAME: 'my-app.prd.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/my-cert', - CDK_HOSTED_ZONE_ID: 'Z0987654321FEDCBAXYZ', - CDK_HOSTED_ZONE_NAME: 'prd.example.com', - CDK_ASSET_PATH: '../custom-dist', - CDK_ACCOUNT: '123456789012', - CDK_REGION: 'us-east-1', - CDK_OU: 'leanstacks', - CDK_OWNER: 'platform-team', - CDK_STORYBOOK_ASSET_PATH: '../custom-storybook', - CDK_STORYBOOK_DOMAIN_NAME: 'my-app-storybook.prd.example.com', - CDK_STORYBOOK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/my-cert-storybook', - CDK_STORYBOOK_HOSTED_ZONE_ID: 'Z0987654321FEDCBAXYZ', - CDK_STORYBOOK_HOSTED_ZONE_NAME: 'prd.example.com', - }); - }); - - it('should throw error when CDK_ENV is missing', () => { - delete process.env.CDK_ENV; - - expect(() => getConfig()).toThrow('CDK configuration validation failed'); - }); - - it('should throw error when CDK_ENV is invalid', () => { - process.env.CDK_ENV = 'invalid'; - - expect(() => getConfig()).toThrow('CDK configuration validation failed'); - }); - }); - - describe('getTags', () => { - it('should return standard tags', () => { - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'react-starter.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'leanstacks', - CDK_OWNER: 'platform-team', - }; - - const tags = getTags(config); - - expect(tags).toEqual({ - App: 'react-starter', - Env: 'dev', - OU: 'leanstacks', - Owner: 'platform-team', - }); - }); - - it('should use default values for OU and Owner when not provided', () => { - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'qa', - CDK_DOMAIN_NAME: 'react-starter.qa.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'qa.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - }; - - const tags = getTags(config); - - expect(tags).toEqual({ - App: 'react-starter', - Env: 'qa', - OU: 'unknown', - Owner: 'unknown', - }); - }); - - it('should use custom app name in tags', () => { - const config: Config = { - CDK_APP_NAME: 'my-custom-app', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'my-custom-app.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'leanstacks', - CDK_OWNER: 'unknown', - }; - - const tags = getTags(config); - - expect(tags).toEqual({ - App: 'my-custom-app', - Env: 'dev', - OU: 'leanstacks', - Owner: 'unknown', - }); - }); - }); - - describe('getEnvironmentConfig', () => { - it('should return account and region from CDK_ACCOUNT and CDK_REGION', () => { - process.env.CDK_ACCOUNT = '123456789012'; - process.env.CDK_REGION = 'us-west-2'; - - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'react-starter.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - CDK_ACCOUNT: '123456789012', - CDK_REGION: 'us-west-2', - }; - - const envConfig = getEnvironmentConfig(config); - - expect(envConfig).toEqual({ - account: '123456789012', - region: 'us-west-2', - }); - }); - - it('should fallback to CDK_DEFAULT_ACCOUNT and CDK_DEFAULT_REGION', () => { - delete process.env.CDK_ACCOUNT; - delete process.env.CDK_REGION; - process.env.CDK_DEFAULT_ACCOUNT = '987654321098'; - process.env.CDK_DEFAULT_REGION = 'eu-west-1'; - - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'react-starter.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - }; - - const envConfig = getEnvironmentConfig(config); - - expect(envConfig).toEqual({ - account: '987654321098', - region: 'eu-west-1', - }); - }); - - it('should prefer CDK_ACCOUNT over CDK_DEFAULT_ACCOUNT', () => { - process.env.CDK_DEFAULT_ACCOUNT = '111111111111'; - process.env.CDK_DEFAULT_REGION = 'us-east-1'; - - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'prd', - CDK_DOMAIN_NAME: 'react-starter.prd.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'prd.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - CDK_ACCOUNT: '999999999999', - CDK_REGION: 'ap-southeast-2', - }; - - const envConfig = getEnvironmentConfig(config); - - expect(envConfig).toEqual({ - account: '999999999999', - region: 'ap-southeast-2', - }); - }); - - it('should return undefined when neither account nor region are set', () => { - delete process.env.CDK_ACCOUNT; - delete process.env.CDK_REGION; - delete process.env.CDK_DEFAULT_ACCOUNT; - delete process.env.CDK_DEFAULT_REGION; - - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'react-starter.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - }; - - const envConfig = getEnvironmentConfig(config); - - expect(envConfig).toBeUndefined(); - }); - - it('should return undefined when only account is set', () => { - process.env.CDK_DEFAULT_ACCOUNT = '123456789012'; - delete process.env.CDK_DEFAULT_REGION; - - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'react-starter.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - }; - - const envConfig = getEnvironmentConfig(config); - - expect(envConfig).toBeUndefined(); - }); - - it('should return undefined when only region is set', () => { - delete process.env.CDK_DEFAULT_ACCOUNT; - process.env.CDK_DEFAULT_REGION = 'us-east-1'; - - const config: Config = { - CDK_APP_NAME: 'react-starter', - CDK_ENV: 'dev', - CDK_DOMAIN_NAME: 'react-starter.dev.example.com', - CDK_CERTIFICATE_ARN: 'arn:aws:acm:us-east-1:123456789012:certificate/test', - CDK_HOSTED_ZONE_ID: 'Z1234567890ABCDEFGHI', - CDK_HOSTED_ZONE_NAME: 'dev.example.com', - CDK_ASSET_PATH: '../dist', - CDK_STORYBOOK_ASSET_PATH: '../storybook-static', - CDK_OU: 'unknown', - CDK_OWNER: 'unknown', - }; - - const envConfig = getEnvironmentConfig(config); - - expect(envConfig).toBeUndefined(); - }); - }); -}); diff --git a/package-lock.json b/package-lock.json index 6ed47f65..02ade4d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,82 +1,38 @@ { - "name": "@leanstacks/react-starter", - "version": "1.7.0", + "name": "react-starter", + "version": "1.8.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@leanstacks/react-starter", - "version": "1.7.0", + "name": "react-starter", + "version": "1.8.0-alpha.1", "license": "MIT", + "workspaces": [ + "packages/shared", + "packages/web", + "packages/infra" + ], "dependencies": { - "@fontsource-variable/noto-sans": "5.3.0", - "@fortawesome/fontawesome-svg-core": "7.3.1", - "@fortawesome/free-regular-svg-icons": "7.3.1", - "@fortawesome/free-solid-svg-icons": "7.3.1", - "@fortawesome/react-fontawesome": "3.5.0", - "@hookform/resolvers": "5.4.0", - "@react-spring/web": "10.1.2", - "@tailwindcss/vite": "4.3.3", - "@tanstack/react-query": "5.101.4", - "@tanstack/react-query-devtools": "5.101.4", - "@tanstack/react-table": "8.21.3", - "axios": "1.18.1", "class-variance-authority": "0.7.1", - "clsx": "2.1.1", - "dayjs": "1.11.21", - "i18next": "26.3.6", - "i18next-browser-languagedetector": "8.2.1", - "lodash": "4.18.1", - "lucide-react": "1.25.0", - "radix-ui": "1.6.4", "react": "19.2.8", "react-dom": "19.2.8", - "react-hook-form": "7.82.0", - "react-i18next": "17.0.10", - "react-router-dom": "7.18.1", - "react-syntax-highlighter": "16.1.1", - "recharts": "3.10.0", - "tailwind-merge": "3.6.0", - "tailwindcss": "4.3.3", - "tw-animate-css": "1.4.0", - "uuid": "14.0.1", "zod": "4.4.3" }, "devDependencies": { - "@chromatic-com/storybook": "5.2.1", "@eslint/js": "9.39.2", - "@storybook/addon-docs": "10.5.3", - "@storybook/addon-onboarding": "10.5.3", - "@storybook/addon-themes": "10.5.3", - "@storybook/react-vite": "10.5.3", - "@testing-library/jest-dom": "6.9.1", - "@testing-library/react": "16.3.2", - "@testing-library/user-event": "14.6.1", - "@types/eslint__js": "8.42.3", - "@types/lodash": "4.17.24", - "@types/react": "19.2.17", - "@types/react-dom": "19.2.3", - "@types/react-syntax-highlighter": "15.5.13", - "@types/uuid": "10.0.0", - "@vitejs/plugin-react": "6.0.4", + "@types/node": "26.2.0", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.4", "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", "eslint": "9.39.2", - "eslint-plugin-react-hooks": "7.1.1", - "eslint-plugin-react-refresh": "0.5.3", - "eslint-plugin-storybook": "10.5.3", - "globals": "17.7.0", + "globals": "17.10.0", "husky": "9.1.7", - "jsdom": "29.1.1", - "msw": "2.15.0", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", - "shadcn": "4.14.0", - "storybook": "10.5.3", "typescript": "5.9.3", - "typescript-eslint": "8.65.0", - "vite": "8.1.5", + "typescript-eslint": "8.67.0", "vitest": "4.1.10" } }, @@ -138,6 +94,59 @@ "dev": true, "license": "MIT" }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.282", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.282.tgz", + "integrity": "sha512-7hKMi5tTxDcKGIMIOq14PnY0GBcugW33Uh/2YHDZiEwSxLeFOCYBwhR+BFXONb/EJeVI3RETFgailNZbkcKF6g==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.2.tgz", + "integrity": "sha512-pDiuqH+qY3zM9lhhLjbKJ1tnKOHzQ2V4Wr/3qsxyKeKAkuPMI/BVGvZG1PbrikUw949cGVTfVEt4ETKKYnrj0Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "54.16.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-54.16.0.tgz", + "integrity": "sha512-Mhwh/L1buy8r6ucxdjPqSAQB559pX1ehcfusRBpDrpoOi4vHKl/iWDjXz0p1QD6ySptlzCgqbBP8TE+EE6ew0w==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jsonschema": "^1.5.0", + "semver": "^7.8.5" + }, + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.8.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -153,6 +162,13 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/compat-data": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", @@ -194,15 +210,25 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -241,6 +267,26 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", @@ -263,6 +309,16 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", @@ -419,13 +475,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -548,18 +604,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -567,9 +623,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { @@ -604,14 +660,14 @@ } }, "node_modules/@chromatic-com/storybook": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.2.1.tgz", - "integrity": "sha512-z6I7NJk/0VngA64y5TNYaB4Hc2X8+90n4op6lBt9PvWk5TmIlFLDqdX33rlrwbNRkkYijVgA/wO04rVYXi5Mlg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-5.3.0.tgz", + "integrity": "sha512-gMAfVYJnF/tjdY8C3Q54KYz/low2NFjPIZMpCqSFuMUiTJ2DNWCTb7mFhuuzZ1iduWFDhewlJyilFmvKcEDYRA==", "dev": true, "license": "MIT", "dependencies": { "@neoconfetti/react": "^1.0.0", - "chromatic": "16.10.0", + "chromatic": "^18.0.1", "jsonfile": "^6.1.0", "strip-ansi": "^7.1.0" }, @@ -644,9 +700,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", "dev": true, "funding": [ { @@ -668,9 +724,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", - "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", + "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", "dev": true, "funding": [ { @@ -685,7 +741,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.2.1" + "@csstools/css-calc": "^3.3.0" }, "engines": { "node": ">=20.19.0" @@ -719,9 +775,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", - "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", "dev": true, "funding": [ { @@ -814,53 +870,6 @@ "node": ">=8" } }, - "node_modules/@dotenvx/dotenvx/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@dotenvx/dotenvx/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -877,19 +886,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@dotenvx/dotenvx/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -913,19 +909,6 @@ "node": ">=18" } }, - "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@dotenvx/dotenvx/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -944,23 +927,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@dotenvx/dotenvx/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -985,20 +951,20 @@ "license": "BSD-3-Clause" }, "node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.2", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", "license": "MIT", "optional": true, "dependencies": { @@ -1006,9 +972,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "license": "MIT", "optional": true, "dependencies": { @@ -1016,9 +982,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -1032,9 +998,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -1048,9 +1014,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -1064,9 +1030,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -1080,9 +1046,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -1096,9 +1062,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -1112,9 +1078,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -1128,9 +1094,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -1144,9 +1110,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -1160,9 +1126,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -1176,9 +1142,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -1192,9 +1158,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -1208,9 +1174,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -1224,9 +1190,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -1240,9 +1206,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -1256,9 +1222,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -1272,9 +1238,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -1288,9 +1254,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -1304,9 +1270,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -1320,9 +1286,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -1336,9 +1302,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -1352,9 +1318,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -1368,9 +1334,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -1384,9 +1350,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -1400,9 +1366,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -1416,9 +1382,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -1432,16 +1398,16 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.0.tgz", - "integrity": "sha512-rd6n9Sefya1R1Vd594TRwzeHq2VnmICbvh3jebyt1Hs/6OoCSYNVpjGRRsKSTwAq3SKl09w0AfRCU57hoDLmxg==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^5.0.1" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1451,13 +1417,13 @@ } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1712,30 +1678,18 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.0.tgz", + "integrity": "sha512-XovyyCCnBzW+zKu+z/zq8hwNs4KOR5rEMAOxo2f40Q5xoOI37IMm6MIg2COOUtUApo0i6850MTBKH2u4QLGIqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.14.1" + "node": ">=20" }, "peerDependencies": { "hono": "^4" } }, - "node_modules/@hookform/resolvers": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.4.0.tgz", - "integrity": "sha512-EIsqr/t/qbinPIhGjMdtvutIN1Kk4uwbROE9/UQ93CAVGR7GkA7Y92+fX80OzXi/OB67jVFYwKGO1WzkxmkFZw==", - "license": "MIT", - "dependencies": { - "@standard-schema/utils": "^0.3.0" - }, - "peerDependencies": { - "react-hook-form": "^7.55.0" - } - }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -1973,13 +1927,13 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "dev": true, "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -2063,21 +2017,24 @@ "license": "MIT" }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", + "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" } }, "node_modules/@neoconfetti/react": { @@ -2465,55 +2422,21 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", + "integrity": "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", - "integrity": "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxc-parser/binding-win32-ia32-msvc": { @@ -2551,9 +2474,10 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.139.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" @@ -2849,6 +2773,17 @@ "tslib": "^2.4.0" } }, + "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { "version": "11.24.2", "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.24.2.tgz", @@ -2885,24 +2820,24 @@ "license": "MIT" }, "node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.6.tgz", - "integrity": "sha512-w9hl+724uYEgCGR3bhuRepjBtrNB/6gkhCnAf58Ke+SLbHPPQqVZZB59z60roB+5H+nh3nWTcdJhQdFMEydWmw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", "license": "MIT" }, "node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.12.tgz", - "integrity": "sha512-Y0zhCQ/XUdTom5hAxvE8RlXqR4hZmKGK6g2//LfgHmb88PJFOpXSh9B/7FlfYXezVY5FKGjRYWCYz5FXxZ9WZQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.15.tgz", + "integrity": "sha512-WTQwcAvQf5sOcuUyi90lKPbhwcvQ+j55cjrSmeaN+L2vKU3DooOvlKw2MDeiJ5IkV5N905KW0/fGojKOBhD11A==", "license": "MIT", "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.8" + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -2920,20 +2855,20 @@ } }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.17.tgz", - "integrity": "sha512-l3Dmp+qPPc3SqT8+SPnxIgoWBEU2MMBxcQ7BsoRgak2UT75xY83SFvFcrUkUAWukOV3LFF+BQ9aBIFtZsIG8yQ==", + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", + "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collapsible": "1.1.17", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -2951,16 +2886,16 @@ } }, "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.20.tgz", - "integrity": "sha512-Ft1W+jPqSh5BKfSTe4dpq6UYQKKQJ5Tvq3wfux+WVlg7nPwFK/3pIlHTb3Rbe+b/tNurx8YGXD9em91ujmgwuQ==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.23.tgz", + "integrity": "sha512-VAYOiQRqj3GPpYJE0I9J+X8Ip05cyVlNdKOFeiGS2Ou1HHGfpl0BxOyZm6nmVDyU+W+NF3/XLzmjHmVGydhwgA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dialog": "1.1.20", - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -2978,12 +2913,12 @@ } }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.12.tgz", - "integrity": "sha512-ltXCE0glRomMZ9+u10d9o1Go+edqa1aLxufH59JRNNM3Yz1uvaeNWSaS1HeVh1X64agtdBG5JA1W1I6ySqWiwA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -3001,12 +2936,12 @@ } }, "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.12.tgz", - "integrity": "sha512-Sok2IBJxA1XO4pU3ldzZMwUBMumIt64EY8zOUlVq5CdS+i0FrEbajVslfDB+YGWLMsrjY2kZQB0DgkrZXLZvcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.15.tgz", + "integrity": "sha512-fy+dyVR+90nelK8rqIznFlxzx7uPcGbhxH8Nfr2bHb4UfSe+e3hklOC0luK0hDwVwnRX7xTRySpsrQVeW+/oNQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -3024,17 +2959,17 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.3.tgz", - "integrity": "sha512-peavtnApRB1tABx42tHw+rPU83GSg5tXicMYO/Xi1/lqNcRsF6jkr6L7Njo7gj4q/xtDRDKBkqJvbMtoOMYWtA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.6.tgz", + "integrity": "sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3052,18 +2987,18 @@ } }, "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.8.tgz", - "integrity": "sha512-wfN60IGuxynWK7rP4Ks2p7u9G7gqirzkAiFptuzVbsR1ot2/K+PavNUAtxiKxyRfLOvSbVfvvm9m3rFqLEXz7A==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz", + "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3081,19 +3016,19 @@ } }, "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.17.tgz", - "integrity": "sha512-DJgqGsNXa0df3ifz9PFNgvgj/bzIu5QTVWCt5nQWaUkM6y0EarUv4QG4s6mCoeQdOIyVOT/Q1osFuEGub2TDXQ==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", + "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3111,15 +3046,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", - "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -3137,9 +3072,9 @@ } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3152,9 +3087,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", - "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3167,16 +3102,16 @@ } }, "node_modules/@radix-ui/react-context-menu": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.4.tgz", - "integrity": "sha512-eO9tkvHvo4dNwb+lytEcKWjy8c8To+ttLwNt0f9XzzsVFIaspqt3i1/c0JaaksxBB5G//zPo9CCgn39huWQyBA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.7.tgz", + "integrity": "sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-menu": "2.1.21", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -3194,24 +3129,24 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.20.tgz", - "integrity": "sha512-cngVJcvK0yMvR7wICJpv+1uW3Qw4T7QM5sdbb+oE/lxOdTdvF00oaRpWUjVgmjyXe3J+xh7eZyXZlVF3g2g59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.13", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -3231,9 +3166,9 @@ } }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3246,16 +3181,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.16.tgz", - "integrity": "sha512-t45h68IjFx0ccBnPJqk0X6ecv69LkCFWd6DNCFQX56mUnVEXZbNOLCH/u9fHlAjFZ1RrFdl8/m4zev7B7NyhXQ==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-effect-event": "0.0.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" }, "peerDependencies": { "@types/react": "*", @@ -3273,18 +3208,18 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.21.tgz", - "integrity": "sha512-gavFM1iWLmWdxWNdGJHVeWeSQul5WE/0pxfvWWt1QnD71hyyujyMCDVacqBomaSOjdxwDzYB+Ng4+MxOvrFB1A==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.21", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -3302,9 +3237,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3317,14 +3252,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.13.tgz", - "integrity": "sha512-dE04aPEuP9rvKKT0d0KjSOtTEYNg6bmCYFsoSJpfC+y91Hic28ZfDCGgv6aJ+2Kw/LBXYipMZpyqVj/OD3Z8Gg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3342,17 +3277,17 @@ } }, "node_modules/@radix-ui/react-form": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.13.tgz", - "integrity": "sha512-PopvWqiutoZh5TJXk9EV9Wh+khbp+LQ+A0H4uHocIjVcKIi6gMlBy4sAaW15thwUSc6PrR8J62nB2uM+htqrcg==", + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.16.tgz", + "integrity": "sha512-Q4TLEn2A7TAypxwmd6R9EwrlXDvkfYSDMrq9/887AXAGh+G1rH+kYJKSTv+Si9Y0JPKTwKYv6PviAJosysNimA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-label": "2.1.12", - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -3370,20 +3305,20 @@ } }, "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.20.tgz", - "integrity": "sha512-UPmdiR8NsngWjG/y9mClzFg+Rbbpy8u0p0SKM+t7mfH4V07TiLsuylqR0RhJiRibopsawoTtMQudm/TxwHWa9w==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.23.tgz", + "integrity": "sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-popper": "1.3.4", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -3401,12 +3336,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3419,12 +3354,12 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.12.tgz", - "integrity": "sha512-dxioNQ7VOrYKKWJIxMRmJPDSWQN0gNCUy3zaqUSBwsuFAiFzI0yLGJr2q3ml07k/HlOk55N8KEfwa1ZgfprJ3w==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.15.tgz", + "integrity": "sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -3442,27 +3377,27 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.21.tgz", - "integrity": "sha512-2BHtaJHvvoWTECyrja1mOjN6z2dWdpeHL6b8PxqZYgex8J8xakT2KAchpZIaMwNPauIRHH/VlPJYhSSKe8lz2g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.13", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.4", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -3482,21 +3417,21 @@ } }, "node_modules/@radix-ui/react-menubar": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.21.tgz", - "integrity": "sha512-uQONG1qM4D8FSEt0xRs5yDpzeSWggf8lOKqHa84NvqoVoc1qJ6XN+gdkrJuQCyEY55793gLlQI3wjgWO5A/Oqg==", + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.24.tgz", + "integrity": "sha512-eeVs0vf7cuqXaM0qLQCPcufImiJNVBXdJDLu7ZGYl2732UH23Qat/foNGrr6vYV3/DdTsBqASoggUFgH14OcZA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.21", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -3514,25 +3449,25 @@ } }, "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.19.tgz", - "integrity": "sha512-58OVQUrpWx/zGVV3lxGUyAtjX4n0305Z8xIdUAq2QlFO2m2hd1eBS4x1yIVtV8bzCQJja0TJttWcwiPI6y6tmw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.8" + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", + "integrity": "sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -3550,23 +3485,23 @@ } }, "node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.13.tgz", - "integrity": "sha512-reLtbZtEBsMcqXkjd/wOga4e8t9uxzFHdX9W/j/ZfGznTNJxLGjRrDNGnGOOWcBazMH1BI/b7Cx+hblSWSD7aw==", + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.16.tgz", + "integrity": "sha512-Tj9P6ntAJEw52oq/F0AGknXR4XncxEt7XU47O3xJQOiWfLzEy3d9gtgKfvjSzGxzHkfL+VzvxGu2KTFsloJqXw==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3584,19 +3519,19 @@ } }, "node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.8.tgz", - "integrity": "sha512-NH9puF7Es5Loh8vFELm+SyayzV27nyBw8kiP/uD9wbkwgq359FfbkKEvccrNk75z0LiSqC4REWk1iL9xdeWJkQ==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.11.tgz", + "integrity": "sha512-4gvFnmDXu3dgj21CqsufzIameRvlRd4SBqaWhcrlrNhRo0Y5i/49AmRJYe1fdAM3G2VNBbmin4b0D6cdQocwgw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-is-hydrated": "0.1.1" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3614,24 +3549,24 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.20.tgz", - "integrity": "sha512-/PYqbsyuDkNj+IxMcRx71qNt6GelnuNulMwdCV7AtFEhUyK6XkbwreEN6CCLydMeTiDozBV4uv5aF5d12dDH7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.13", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.4", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.4", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -3651,21 +3586,21 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.4.tgz", - "integrity": "sha512-PXnCa3XgTQk0FegMctxgqJXtFLZe4IFJdbUkB7jKSCKEpb6utEO4S9Vog/pkyCfEPdzM331gvE4xpztmBAfMng==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -3683,13 +3618,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.14.tgz", - "integrity": "sha512-REwjAGPMa3J9oyDE4cuWkZbwnCbbyky66NurquQklXMSDn67cl6oGFx2gO7KZhPtFNbNw9xTWNrti3VIhgluYw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3707,12 +3642,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.8.tgz", - "integrity": "sha512-0hhyrQdXMaATgq4ammLG9+iPqsXxzZkgTSIxdrJHdfLnXO4Uo5L7BoO3/Xf0AEaettadGZWGGJMw6ujzQvIpGA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3730,12 +3665,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", - "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -3753,13 +3688,13 @@ } }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.13.tgz", - "integrity": "sha512-1dUdKDd63Tz9FfbTw20MVr28ohG4v7HOJ1dsavGBBPBS3KGzLOyLKiMJAC1OdgiY18nTSHpD4fULGK5gsLY/ww==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.16.tgz", + "integrity": "sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -3777,20 +3712,20 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.4.tgz", - "integrity": "sha512-OpbUmp/korY+tjEQmHwGyQ+QQ3LBlCPC70z03Q/NSqGaHf2EijuwpjQPnswrH6cZLWyT2J6FmB+kzRoMUtPBig==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.7.tgz", + "integrity": "sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3808,22 +3743,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.16.tgz", - "integrity": "sha512-w7lLsTSd3940vFYEshKkHw+NGf7H0QDJPHYsy8NRjDCVbO6ZdKW1X/xoJSYHZtttnrdZiYqbN2O/2uHGB0zasw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3841,20 +3776,20 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.15.tgz", - "integrity": "sha512-JVBHNfTBbGd9hhq/xZZOgmVnBCXhLs8PJJ8vMzgwI0pLZNsKckW9pkoqHyxokUCt1hoxbwDNvF9DItEeZsG68g==", + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", + "integrity": "sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3872,31 +3807,31 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.4.tgz", - "integrity": "sha512-E2JxqAvaTUEhWtBptWo02g8FnLYPymv9ahEvW/cZQPPV4ySeyo0M8n3sXccsLUAIfMbexnfXt91qF7UjTbTMMg==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.13", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.4", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.8", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -3916,12 +3851,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.12.tgz", - "integrity": "sha512-2hezgFBBR5jU3S9L9bIZ9Uag6LnvxuFBNsLCfTR8qx+NshuvFmpL4C72+5zMS3Z6UgHNSU1thOw2UaBBPEDpsQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -3939,22 +3874,22 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.4.tgz", - "integrity": "sha512-8dUytW34KoJaB22ctfP7hqUCuyYa8xn2w7H8kCneeOtS5oM7UBivcnZtR8P4kPYMgdoAZlkMhE9/qkYZ5MlRzQ==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.7.tgz", + "integrity": "sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -3972,12 +3907,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" + "@radix-ui/react-compose-refs": "1.1.5" }, "peerDependencies": { "@types/react": "*", @@ -3990,17 +3925,17 @@ } }, "node_modules/@radix-ui/react-switch": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.4.tgz", - "integrity": "sha512-7iGMj1SfZBAc6xRiy0Y3Wr/v52viQeDhOmaM3fNRyNf2nbYooZA3kKoEDGLPtrDv8JitpzcueqdZLusVMojLdQ==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.7.tgz", + "integrity": "sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4018,19 +3953,19 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.18.tgz", - "integrity": "sha512-1zq2XkQkK/KfbZn84edytYpOLquhNalra5LXc3NAMKhNRSGtyXqjMv6OyC9jlSuNKpqvQtsb57WKoICNk1v/sQ==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", + "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4048,23 +3983,23 @@ } }, "node_modules/@radix-ui/react-toast": { - "version": "1.2.20", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.20.tgz", - "integrity": "sha512-S28OtO1IvYSpWfaUBtiYCTTwRLF8doafj+a+uQw8rc8dLINS52uuG3CIPCeZc3Jfdb/S7o7HhlQxLoXlIYRu6g==", + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.23.tgz", + "integrity": "sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.8" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -4082,14 +4017,14 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.15.tgz", - "integrity": "sha512-tyCejFjhJ51UKFVIG8jh9nTdRIsFPxrgrI4IdlxuJeP+AKTfTko+0gBueyBFLHqsyE71Aj9PKHjMnG+YRPyKhA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4107,18 +4042,18 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.16.tgz", - "integrity": "sha512-uil+A0Um3LaZQJkMap4nIg0VgqWc0j3iNU4AXf9a/zHOgPHNYWfVk5WVsG2296Y8HLv1bxiN7uQJblHc1+00tw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-toggle": "1.1.15", - "@radix-ui/react-use-controllable-state": "1.2.4" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -4136,18 +4071,18 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.16.tgz", - "integrity": "sha512-ZnvUAH+ftoRYzUzFQ8gqKnQ1lUFYb3amguGu+BXpfjvLIkjmXCcHCJlQeBLBlJCOtGNVtP+wHrZaUCC/zYKQMg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.19.tgz", + "integrity": "sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-separator": "1.1.12", - "@radix-ui/react-toggle-group": "1.1.16" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-toggle-group": "1.1.19" }, "peerDependencies": { "@types/react": "*", @@ -4165,24 +4100,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.13.tgz", - "integrity": "sha512-56XPNYGMnGBcPyiBTaEXB7IGPybbsdNkFgSv90SCrHkXnu2Av1HhsyZMegzXlTu/QHA3V6/l22GZCv9iEoiqmQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.4", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.8" + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -4200,9 +4135,9 @@ } }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4215,14 +4150,14 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.4.tgz", - "integrity": "sha512-cx2DixxmSfjCcEoRvDvy1NLd6SWK94XFcEEOZUcharUlXbmahFQGKCfwdKZL2ub34iIwOPOEFVF80xb+yfLYiA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4235,12 +4170,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4253,12 +4188,12 @@ } }, "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.3.tgz", - "integrity": "sha512-3wEkMiPHXha/2VadZ68rYBcmYnPINVGl4Y3gtcM7fKRjANk0OscK+cdqBgUWdozb7YJxsh0vefM7vgAMHXOjqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.5.tgz", + "integrity": "sha512-ge3ipobwSXTj4JyVtswQ7qZj0ZHdtbGuOno/LrgAAeSxtsJ6Vs4Gz5IkPH2bmqpjcLUFoqGhA/mueuIf63UXlA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4271,9 +4206,9 @@ } }, "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", - "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4286,9 +4221,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4301,9 +4236,9 @@ } }, "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", - "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -4316,12 +4251,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.2" + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -4334,12 +4269,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -4352,12 +4287,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.8.tgz", - "integrity": "sha512-FjsQEpkNBJJYiPSat6jh2LGKLPX2jAoDVS3AZSBNX3cOUoEGhw/f+z2FCY8Cf1NkoYIbytJ1f4mlWPQpR+MjVg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -4375,9 +4310,9 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", "license": "MIT" }, "node_modules/@react-spring/animated": { @@ -4453,6 +4388,18 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/@react-starter/infra": { + "resolved": "packages/infra", + "link": true + }, + "node_modules/@react-starter/shared": { + "resolved": "packages/shared", + "link": true + }, + "node_modules/@react-starter/web": { + "resolved": "packages/web", + "link": true + }, "node_modules/@reduxjs/toolkit": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", @@ -4480,9 +4427,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", "cpu": [ "arm64" ], @@ -4496,9 +4443,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", "cpu": [ "arm64" ], @@ -4512,9 +4459,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", "cpu": [ "x64" ], @@ -4528,9 +4475,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", "cpu": [ "x64" ], @@ -4544,9 +4491,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", "cpu": [ "arm" ], @@ -4560,9 +4507,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", "cpu": [ "arm64" ], @@ -4579,9 +4526,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", "cpu": [ "arm64" ], @@ -4598,9 +4545,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", "cpu": [ "ppc64" ], @@ -4617,9 +4564,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", "cpu": [ "s390x" ], @@ -4636,9 +4583,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", "cpu": [ "x64" ], @@ -4655,9 +4602,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", "cpu": [ "x64" ], @@ -4674,9 +4621,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", "cpu": [ "arm64" ], @@ -4689,28 +4636,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", "cpu": [ "arm64" ], @@ -4724,9 +4653,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", "cpu": [ "x64" ], @@ -4768,6 +4697,13 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -4801,16 +4737,16 @@ "license": "MIT" }, "node_modules/@storybook/addon-docs": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.5.3.tgz", - "integrity": "sha512-MI1VDMSMQk78YxjIdt7WlrVOiA3TzTP00lRed1LeXh0fCvA9jxz9YXJI2+XigsLaxCSuOAEf/l35/GTLDMHD8A==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.5.7.tgz", + "integrity": "sha512-KNARJfjICaizinsR3INMEiipZm1ObYo+xw+E26gteu50Bcy2dIZUtk5uHY5XdtardU3AXX6yRXoBZ2HCY3lbHA==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "10.5.3", + "@storybook/csf-plugin": "10.5.7", "@storybook/icons": "^2.0.2", - "@storybook/react-dom-shim": "10.5.3", + "@storybook/react-dom-shim": "10.5.7", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -4821,7 +4757,7 @@ }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.5.3" + "storybook": "^10.5.7" }, "peerDependenciesMeta": { "@types/react": { @@ -4830,9 +4766,9 @@ } }, "node_modules/@storybook/addon-onboarding": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.5.3.tgz", - "integrity": "sha512-PWNUji1a8JUym5iRJyr9KVdmAgU+qgjVgXubVoesa053ZKMrga1J3j9hfyqqFPNACfRBqy6HAXyEAe6mAuOjGw==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-10.5.7.tgz", + "integrity": "sha512-GDssSoWmmGnz6OnUvAofMcrUuTMD53Y2rnbshjXvhtPnjKw4dufXFjo6C7yZQ6vyoNzTS9HyQwCHlxlhyCKJjQ==", "dev": true, "license": "MIT", "funding": { @@ -4840,13 +4776,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.5.3" + "storybook": "^10.5.7" } }, "node_modules/@storybook/addon-themes": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-10.5.3.tgz", - "integrity": "sha512-bEHqMgkwqM6fENwYGptZz/lYzNs5SVdVnI8qTKqTC5S6mwkJ3mzTXF/5MPVZb4BelgfV/KzAWrRF9QR5OFitsA==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-10.5.7.tgz", + "integrity": "sha512-A3xMGyvfvPigSGiWiefgEd4MlV/taxeVsF7uj/oUO1DTrTEd9q2lIrwLtLmGvl/rUhpeP7yx33wrGronl8ym7A==", "dev": true, "license": "MIT", "dependencies": { @@ -4857,17 +4793,17 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.5.3" + "storybook": "^10.5.7" } }, "node_modules/@storybook/builder-vite": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.5.3.tgz", - "integrity": "sha512-qX1jb1nbG1mWJrCn3YrDkpbii+KA1uxdVgENeNusD80RrWCwVG8ce+awjZxKuT8qjYyALSAPBvTHUqZ4C1b7Pg==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.5.7.tgz", + "integrity": "sha512-fShF/aQaITqcJuMCLr42BGNUAbhDi4IboqvlbZqXAwgrrTslnZEUnY8GcEcvpZmjl11VwlmazhMJdH50fIgBPg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "10.5.3", + "@storybook/csf-plugin": "10.5.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -4875,14 +4811,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^10.5.3", + "storybook": "^10.5.7", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.3.tgz", - "integrity": "sha512-mkPq6zru8fN5+46uC1cZEbKW2ws1hh9KvF4g4/Gu8pNbKnvqULPhk0/Bf0ZCtlr7zI7DvcFhyCy3dbvN+2n4Gw==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.7.tgz", + "integrity": "sha512-IaX8FlM0H36HNFhJ2+4L9bCldqfvHGqcLg841SJNyK/DhfMlM7JsvY/GDH2ZFuWrUf8FSOx96GRRnHq6XfRKag==", "dev": true, "license": "MIT", "dependencies": { @@ -4895,7 +4831,7 @@ "peerDependencies": { "esbuild": "*", "rollup": "*", - "storybook": "^10.5.3", + "storybook": "^10.5.7", "vite": "*", "webpack": "*" }, @@ -4932,14 +4868,14 @@ } }, "node_modules/@storybook/react": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.3.tgz", - "integrity": "sha512-d/CK78xgA7DDvqnxkqcYmiTjomE4ch2TWvk0O8/xHQWW6y0nMjKtsZbmUBfZ0QcdYdWq7dErzfbG7YAzxDi7Ig==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.7.tgz", + "integrity": "sha512-uFvty2MMdFXzW5PcQe1JqDAZkz6cQq7q/9G/cbGVnBEvP6zsOVeL+bmrQ0/WBlFQN0Ko9+ZoCTvaQ9s65zBa5g==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "10.5.3", + "@storybook/react-dom-shim": "10.5.7", "react-docgen": "^8.0.2", "react-docgen-typescript": "^2.2.2" }, @@ -4952,7 +4888,7 @@ "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.5.3", + "storybook": "^10.5.7", "typescript": ">= 4.9.x" }, "peerDependenciesMeta": { @@ -4968,9 +4904,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.3.tgz", - "integrity": "sha512-eUWBsRRax5R3MDJVFs/CrFDF1bYS58AMB9tX02lLRuiZe6xy1cKh3CRFS+2xH571l0fNaXQ+7j69TOJ0fk2tmA==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.7.tgz", + "integrity": "sha512-lxOkyh+wu/MiBXvYQHjZfD+DRKOa4bHBzbuGuiHXnHXmdOcTRdcrQTsoeN2FPtfugmmOG66cZUEgDwNX+k5eRA==", "dev": true, "license": "MIT", "funding": { @@ -4982,7 +4918,7 @@ "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.5.3" + "storybook": "^10.5.7" }, "peerDependenciesMeta": { "@types/react": { @@ -4994,16 +4930,16 @@ } }, "node_modules/@storybook/react-vite": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.5.3.tgz", - "integrity": "sha512-9cXaeU3+Kos4M3+Ezur2u/eBn3JIkED6ckxi7lhVQ6r2lK9NAGh5tfHSTQ/206KNSjvaHxZMAhPpxJP3/e2vfQ==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.5.7.tgz", + "integrity": "sha512-eEo3eVa2pvqrzQukKxAzx7YvswDAA1s6k/y+tdMxmRvWyHX6QEOsb9Tda6wcVaa7c8BeJM7Ggq+289cRMTH6Iw==", "dev": true, "license": "MIT", "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "10.5.3", - "@storybook/react": "10.5.3", + "@storybook/builder-vite": "10.5.7", + "@storybook/react": "10.5.7", "empathic": "^2.0.0", "magic-string": "^0.30.0", "react-docgen": "^8.0.2", @@ -5017,7 +4953,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.5.3", + "storybook": "^10.5.7", "typescript": ">= 4.9.x", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, @@ -5458,9 +5394,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "version": "14.6.4", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.4.tgz", + "integrity": "sha512-QCGwP6QrjypBLwyj5cuyfVamkaIEy/XGY+1VDehbtbQqOggYmTFpFOdWR5mPz14vX8vXLMVjDHlRNBcClyO9ew==", "dev": true, "license": "MIT", "engines": { @@ -5494,26 +5430,26 @@ } }, "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -5717,9 +5653,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", "dev": true, "license": "MIT" }, @@ -5731,9 +5667,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", + "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5747,9 +5683,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5757,9 +5693,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "devOptional": true, "license": "MIT", "peerDependencies": { @@ -5827,17 +5763,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", - "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/type-utils": "8.65.0", - "@typescript-eslint/utils": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -5850,7 +5786,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.65.0", + "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -5866,16 +5802,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", - "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3" }, "engines": { @@ -5891,14 +5827,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", - "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.65.0", - "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", "debug": "^4.4.3" }, "engines": { @@ -5913,14 +5849,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", - "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0" + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5931,9 +5867,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", - "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", "dev": true, "license": "MIT", "engines": { @@ -5948,15 +5884,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", - "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -5973,9 +5909,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", - "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", "dev": true, "license": "MIT", "engines": { @@ -5987,16 +5923,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", - "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.65.0", - "@typescript-eslint/tsconfig-utils": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -6025,26 +5961,26 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -6053,30 +5989,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", - "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0" + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6091,13 +6014,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", - "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/types": "8.67.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -6121,32 +6044,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@vitejs/plugin-react": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.4.tgz", - "integrity": "sha512-XcCQz0TBpBgljhj0gMuuDj49i6Ytqh5q1osT/Gp5uAVJUCTWxyskk/l1jwYYiu2xcNHHipdMz40EGfM1VdamVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", - "babel-plugin-react-compiler": "^1.0.0", - "vite": "^8.0.0" - }, - "peerDependenciesMeta": { - "@rolldown/plugin-babel": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - } - } - }, "node_modules/@vitest/coverage-v8": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", @@ -6179,60 +6076,23 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@vitest/mocker": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", @@ -6260,27 +6120,7 @@ } } }, - "node_modules/@vitest/mocker/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/pretty-format": { + "node_modules/@vitest/pretty-format": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", @@ -6324,14 +6164,11 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, "funding": { "url": "https://opencollective.com/vitest" } @@ -6422,9 +6259,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -6460,7 +6297,7 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6477,7 +6314,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -6495,7 +6332,7 @@ "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -6512,7 +6349,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/ansi-colors": { @@ -6615,23 +6452,6 @@ "js-tokens": "^10.0.0" } }, - "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6648,14 +6468,257 @@ "node": ">=10.12.0" } }, + "node_modules/aws-cdk": { + "version": "2.1135.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1135.1.tgz", + "integrity": "sha512-g1jcMfWlyYtGamFJ/kPBOCuchl3NfwTF2UwOLTIDN0nJbGm84EAO+c8DlYnaemM8UmKFkdoq4BGdmiNL5nHWwA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.264.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.264.0.tgz", + "integrity": "sha512-TzeWc4aM2qftdoWzIgqV7DotzUO9+DqYLXHvL2qygZqkrJdvITTp8ojHstxYPH40FfA+RL4x5hVfa52NCTB0ZA==", + "bundleDependencies": [ + "@aws/cloudformation-validate", + "@balena/dockerignore", + "@aws-cdk/cloud-assembly-api", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "yaml", + "mime-types" + ], + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-cdk/asset-awscli-v1": "2.2.282", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.2", + "@aws-cdk/cloud-assembly-api": "^2.2.6", + "@aws-cdk/cloud-assembly-schema": "^54.11.0", + "@aws/cloudformation-validate": "1.6.0-beta", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.3.6", + "ignore": "^5.3.2", + "jsonschema": "^1.5.0", + "mime-types": "^2.1.35", + "minimatch": "^10.2.5", + "punycode": "^2.3.1", + "semver": "^7.8.5", + "yaml": "1.10.3" + }, + "engines": { + "node": ">= 20.0.0" + }, + "peerDependencies": { + "constructs": "^10.5.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@aws-cdk/cloud-assembly-api": { + "version": "2.2.6", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "jsonschema": "^1.5.0", + "semver": "^7.8.4" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": ">=54.5.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@aws/cloudformation-validate": { + "version": "1.6.0-beta", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "5.0.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "dev": true, + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.3.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "10.2.5", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.8.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -6668,9 +6731,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz", - "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==", + "version": "2.11.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", + "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6730,9 +6793,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -6854,9 +6917,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "version": "1.0.30001807", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz", + "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==", "dev": true, "funding": [ { @@ -6875,18 +6938,11 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -6949,9 +7005,9 @@ } }, "node_modules/chromatic": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-16.10.0.tgz", - "integrity": "sha512-nFsztmnu7rFiGafUJgXvLUNpqmRylz92eNvzBoJNTKKQj4EQUyxznwnfpf1dTs7hXtWD8JwcH92jADydaHA1sw==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-18.2.0.tgz", + "integrity": "sha512-xyTKDhBQPDd4qrsXhJK7GAJyIStpRoSTs4b7EtPyliSL0luej3DcqkeCZ9osHxbiLXiViNyWfMxo5Xgzejex8A==", "dev": true, "license": "MIT", "dependencies": { @@ -6962,6 +7018,9 @@ "chromatic": "dist/bin.cjs", "chromatic-cli": "dist/bin.cjs" }, + "engines": { + "node": ">=22.0.0" + }, "peerDependencies": { "@chromatic-com/cypress": "^0.*.* || ^1.0.0", "@chromatic-com/playwright": "^0.*.* || ^1.0.0", @@ -6979,19 +7038,6 @@ } } }, - "node_modules/chromatic/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -7242,18 +7288,12 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/conf/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/constructs": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.8.1.tgz", + "integrity": "sha512-98yGXYyhePqPYh3cYu8nzBERmAhC0DONe3UD03okK0nehZ7hYP4wgZuf02a04+uOWxnTJ5Rpp5m0GRNpwyLGGA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "license": "Apache-2.0" }, "node_modules/content-disposition": { "version": "1.1.0", @@ -7566,13 +7606,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "node_modules/debounce-fn/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -7819,9 +7869,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.395", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", - "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", + "version": "1.5.402", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz", + "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==", "dev": true, "license": "ISC" }, @@ -7853,9 +7903,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", - "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -7978,19 +8028,20 @@ } }, "node_modules/es-toolkit": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", - "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types" ] }, "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "devOptional": true, "hasInstallScript": true, "license": "MIT", @@ -8001,32 +8052,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/escalade": { @@ -8119,51 +8170,6 @@ } } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz", - "integrity": "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": "^9 || ^10" - } - }, - "node_modules/eslint-plugin-storybook": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.5.3.tgz", - "integrity": "sha512-dreVGgQvTTOvPTrnn71uogs3E7skbODW3Ya1cHxupznzuIofLCzy+7zWJ4ObsEZ1MsOcofQlSaQuV9oJBszLoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "^8.60.0", - "@typescript-eslint/utils": "^8.60.0" - }, - "peerDependencies": { - "eslint": ">=8", - "storybook": "^10.5.3" - } - }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -8263,11 +8269,14 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -8319,32 +8328,36 @@ } }, "node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" + "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" }, "engines": { - "node": "^18.19.0 || >=20.5.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", @@ -8400,9 +8413,9 @@ } }, "node_modules/express-rate-limit": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.0.tgz", - "integrity": "sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "dev": true, "license": "MIT", "dependencies": { @@ -8460,7 +8473,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -8497,7 +8510,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -8525,10 +8538,10 @@ } }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", - "dev": true, + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "devOptional": true, "funding": [ { "type": "github", @@ -8694,9 +8707,9 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -8765,9 +8778,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", - "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", "dev": true, "license": "MIT", "dependencies": { @@ -8902,17 +8915,13 @@ } }, "node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8960,26 +8969,26 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/glob/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -8989,9 +8998,9 @@ } }, "node_modules/globals": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", - "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "version": "17.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.10.0.tgz", + "integrity": "sha512-V0kztuWST2k8A/VbxAY8+L+7+Rgo3fyA24IHRLrZp7HOzJjV0gHSaZUjK9lpP/IrBSNite2tZ1prhRkinRu1CA==", "dev": true, "license": "MIT", "engines": { @@ -9119,23 +9128,6 @@ "set-cookie-parser": "^3.0.1" } }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -9152,9 +9144,9 @@ "license": "CC0-1.0" }, "node_modules/hono": { - "version": "4.12.31", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.31.tgz", - "integrity": "sha512-zJIHFrl6bq3RDd2YusFNCDlM8qUprxKswyi/OPzPyzKDdyBXDqWx8bZlZ7R+saTdSTatUmb3O7K4SspGPaEOQg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.0.tgz", + "integrity": "sha512-jhunvfHWxd7J5EFfSgH4xsYJzSe/lfqbUCxiyyeaQasUsXeEHXtzVid+7EOGByc5JnFa23SSFL3Y2RV/z1T+eQ==", "dev": true, "license": "MIT", "engines": { @@ -9182,12 +9174,12 @@ "license": "MIT" }, "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-4.0.1.tgz", + "integrity": "sha512-0zHsZJrK7S3K2aucXWL6ycoYJ/iNtIcFHC/nYQgFklPtrv5LpJctIiSCroWZWeuoXvuyFdzp6KzjJQ+OT5MfFw==", "license": "MIT", - "dependencies": { - "void-elements": "3.1.0" + "funding": { + "url": "https://locize.com" } }, "node_modules/http-errors": { @@ -9225,13 +9217,13 @@ } }, "node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=18.18.0" + "node": ">=10.17.0" } }, "node_modules/husky": { @@ -9315,9 +9307,9 @@ } }, "node_modules/immer": { - "version": "11.1.15", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.15.tgz", - "integrity": "sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ==", + "version": "11.1.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.16.tgz", + "integrity": "sha512-Xs7H9rBc+kti1J6RueUvbEBkmOz7jqj11XYgf+YMXAYzu8EeE7hwZ9poLXdVfVnGmJu7QAf41T7H2KuF6QoK6Q==", "license": "MIT", "funding": { "type": "opencollective", @@ -9378,9 +9370,9 @@ } }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", "dev": true, "license": "MIT", "engines": { @@ -9626,13 +9618,13 @@ } }, "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9723,9 +9715,9 @@ } }, "node_modules/jose": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz", - "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.8.tgz", + "integrity": "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==", "dev": true, "license": "MIT", "funding": { @@ -9733,16 +9725,16 @@ } }, "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, "funding": [ { @@ -9803,16 +9795,6 @@ } } }, - "node_modules/jsdom/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -9844,7 +9826,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/json-schema-typed": { @@ -10290,19 +10272,19 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, "node_modules/lucide-react": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.25.0.tgz", - "integrity": "sha512-/mdJTRbiwcLOQ1NZZK1amZF9rIZyvO18D6r9TngE6TG1NmqHgFuT4eE7Xrkm9UsXMbBJD1NlfwHVltCDWHrOTw==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.31.0.tgz", + "integrity": "sha512-G8u2eEtoHUnUa9f8lbvqDhCiORMnYLdUEo06EEG9MQvHQrInKcX3Pa2TH39MM5qyzRcWETxB0+aOwAPI1g1kEg==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -10328,14 +10310,14 @@ } }, "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, @@ -10355,19 +10337,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10385,13 +10354,17 @@ "license": "CC0-1.0" }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/merge-descriptors": { @@ -10473,13 +10446,13 @@ } }, "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/mimic-function": { @@ -10610,9 +10583,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", "funding": [ { "type": "github", @@ -10645,9 +10618,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", "dev": true, "license": "MIT", "engines": { @@ -10655,33 +10628,16 @@ } }, "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/object-assign": { @@ -10770,16 +10726,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/open": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", @@ -10901,16 +10847,6 @@ "@oxc-parser/binding-win32-x64-msvc": "0.127.0" } }, - "node_modules/oxc-parser/node_modules/@oxc-project/types": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", - "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, "node_modules/oxc-resolver": { "version": "11.24.2", "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.24.2.tgz", @@ -11135,16 +11071,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", @@ -11277,9 +11203,9 @@ } }, "node_modules/postcss": { - "version": "8.5.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.22.tgz", - "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "funding": [ { "type": "opencollective", @@ -11296,7 +11222,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -11557,7 +11483,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -11602,66 +11528,66 @@ "license": "MIT" }, "node_modules/radix-ui": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.4.tgz", - "integrity": "sha512-Kpgb9sx08toOydBK42//0N3MqIPlqjHcY39CYuGG8+7DrF6+NTfAnc3o+f1kvoKzG6cI56ri7Z45XEBQqG1QqQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.6", - "@radix-ui/react-accessible-icon": "1.1.12", - "@radix-ui/react-accordion": "1.2.17", - "@radix-ui/react-alert-dialog": "1.1.20", - "@radix-ui/react-arrow": "1.1.12", - "@radix-ui/react-aspect-ratio": "1.1.12", - "@radix-ui/react-avatar": "1.2.3", - "@radix-ui/react-checkbox": "1.3.8", - "@radix-ui/react-collapsible": "1.1.17", - "@radix-ui/react-collection": "1.1.12", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.2.0", - "@radix-ui/react-context-menu": "2.3.4", - "@radix-ui/react-dialog": "1.1.20", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.16", - "@radix-ui/react-dropdown-menu": "2.1.21", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.13", - "@radix-ui/react-form": "0.1.13", - "@radix-ui/react-hover-card": "1.1.20", - "@radix-ui/react-label": "2.1.12", - "@radix-ui/react-menu": "2.1.21", - "@radix-ui/react-menubar": "1.1.21", - "@radix-ui/react-navigation-menu": "1.2.19", - "@radix-ui/react-one-time-password-field": "0.1.13", - "@radix-ui/react-password-toggle-field": "0.1.8", - "@radix-ui/react-popover": "1.1.20", - "@radix-ui/react-popper": "1.3.4", - "@radix-ui/react-portal": "1.1.14", - "@radix-ui/react-presence": "1.1.8", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-progress": "1.1.13", - "@radix-ui/react-radio-group": "1.4.4", - "@radix-ui/react-roving-focus": "1.1.16", - "@radix-ui/react-scroll-area": "1.2.15", - "@radix-ui/react-select": "2.3.4", - "@radix-ui/react-separator": "1.1.12", - "@radix-ui/react-slider": "1.4.4", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-switch": "1.3.4", - "@radix-ui/react-tabs": "1.1.18", - "@radix-ui/react-toast": "1.2.20", - "@radix-ui/react-toggle": "1.1.15", - "@radix-ui/react-toggle-group": "1.1.16", - "@radix-ui/react-toolbar": "1.1.16", - "@radix-ui/react-tooltip": "1.2.13", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.4", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-escape-keydown": "1.1.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.8" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.7.tgz", + "integrity": "sha512-QBdhh1arIEUvPC0dQ5+nwWAxt7+N+oP/9jPwjJkGFoSk/sqxg32gJtSXGtFh8frAIcS6oC9cx2Q+7KYCQLOAeA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-accessible-icon": "1.1.15", + "@radix-ui/react-accordion": "1.2.20", + "@radix-ui/react-alert-dialog": "1.1.23", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-aspect-ratio": "1.1.15", + "@radix-ui/react-avatar": "1.2.6", + "@radix-ui/react-checkbox": "1.3.11", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-context-menu": "2.3.7", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-dropdown-menu": "2.1.24", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-form": "0.1.16", + "@radix-ui/react-hover-card": "1.1.23", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-menubar": "1.1.24", + "@radix-ui/react-navigation-menu": "1.2.22", + "@radix-ui/react-one-time-password-field": "0.1.16", + "@radix-ui/react-password-toggle-field": "0.1.11", + "@radix-ui/react-popover": "1.1.23", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-progress": "1.1.16", + "@radix-ui/react-radio-group": "1.4.7", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-scroll-area": "1.2.18", + "@radix-ui/react-select": "2.3.7", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-slider": "1.4.7", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-switch": "1.3.7", + "@radix-ui/react-tabs": "1.1.21", + "@radix-ui/react-toast": "1.2.23", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-toggle-group": "1.1.19", + "@radix-ui/react-toolbar": "1.1.19", + "@radix-ui/react-tooltip": "1.2.16", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-escape-keydown": "1.1.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -11762,9 +11688,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.82.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.82.0.tgz", - "integrity": "sha512-Zw/uFZ2dO+02GHlBn7JFGn8kZJ7LdM33B/0BXOovzFay+CMhf94JMw5BVu+F1tVkUKjNvBuaE3fz5BJhga10Tg==", + "version": "7.85.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.85.0.tgz", + "integrity": "sha512-U2MTriFXnclmV4rOE20p2DcRFv5WEg3FIcBFOKcOLFHDVvGIMPvLTkTWefUsonmlaVy23khVDxDWym6uJVGOzw==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -11778,13 +11704,13 @@ } }, "node_modules/react-i18next": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.10.tgz", - "integrity": "sha512-XneHftyYA774MJkkccSkZ5oKrUpCnXIPmxio3wemqrVzCRLWiGXOMbIzObrer03fNDEnm8g8R5yYls4HcE+esg==", + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.11.tgz", + "integrity": "sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", - "html-parse-stringify": "^3.0.1", + "html-parse-stringify": "^4.0.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { @@ -11882,9 +11808,9 @@ } }, "node_modules/react-router": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.1.tgz", - "integrity": "sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -11904,12 +11830,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.1.tgz", - "integrity": "sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", "license": "MIT", "dependencies": { - "react-router": "7.18.1" + "react-router": "7.18.2" }, "engines": { "node": ">=20.0.0" @@ -11968,9 +11894,9 @@ } }, "node_modules/recast": { - "version": "0.23.12", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.12.tgz", - "integrity": "sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==", + "version": "0.23.19", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.19.tgz", + "integrity": "sha512-T98lym7kH+pnZmRaD8yDRdaNqyUbwnbEBx0MuchrzMFOEMray4AO3ZJoTUZ5r78Ao78X/OhzW0DL8GB85w/I2w==", "dev": true, "license": "MIT", "dependencies": { @@ -11985,9 +11911,9 @@ } }, "node_modules/recharts": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.0.tgz", - "integrity": "sha512-wulMvfncpIlmu2uFtRU/mE5/+NiVtASXkw2KdwJTdHs3WsASX0WxZlX+rpKgyn5BDbIhkPtCpUKkB9XNK5KE0w==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", "license": "MIT", "workspaces": [ "www" @@ -12086,7 +12012,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12202,12 +12128,12 @@ } }, "node_modules/rolldown": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.139.0", + "@oxc-project/types": "=0.143.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -12217,21 +12143,29 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.5", - "@rolldown/binding-darwin-arm64": "1.1.5", - "@rolldown/binding-darwin-x64": "1.1.5", - "@rolldown/binding-freebsd-x64": "1.1.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", - "@rolldown/binding-linux-arm64-gnu": "1.1.5", - "@rolldown/binding-linux-arm64-musl": "1.1.5", - "@rolldown/binding-linux-ppc64-gnu": "1.1.5", - "@rolldown/binding-linux-s390x-gnu": "1.1.5", - "@rolldown/binding-linux-x64-gnu": "1.1.5", - "@rolldown/binding-linux-x64-musl": "1.1.5", - "@rolldown/binding-openharmony-arm64": "1.1.5", - "@rolldown/binding-wasm32-wasi": "1.1.5", - "@rolldown/binding-win32-arm64-msvc": "1.1.5", - "@rolldown/binding-win32-x64-msvc": "1.1.5" + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" + } + }, + "node_modules/rolldown/node_modules/@oxc-project/types": { + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/router": { @@ -12326,13 +12260,16 @@ "license": "MIT" }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { @@ -12424,9 +12361,9 @@ "license": "ISC" }, "node_modules/shadcn": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-4.14.0.tgz", - "integrity": "sha512-WSSMmB9ERauwy0SQwE0NlSfeaoBANHtzgSjAfoEsIHpRQwVkQBiiLV8Y9yAYOj9Wf3mbCIdQt3oLGzkH7NQFiQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-4.17.0.tgz", + "integrity": "sha512-kphndh72CD7mxLQ/thkbPVgfXpIjzPUllzvTWRJmU3sNGZc/WbOqzJ0FXbBGj6sqNiaGPiOLDQByy8FAtCuVUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12454,6 +12391,7 @@ "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", + "socks": "^2.8.8", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", @@ -12470,6 +12408,116 @@ "node": ">=20.18.1" } }, + "node_modules/shadcn/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/shadcn/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/shadcn/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/shadcn/node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", @@ -12621,6 +12669,32 @@ "dev": true, "license": "MIT" }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12688,16 +12762,16 @@ } }, "node_modules/storybook": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.3.tgz", - "integrity": "sha512-c8Wumu5qz0N2fnzWBxcPzUsY+8BpKBKChNyl4BEh9qhMV6KW587gL8il8emRB+4Hay+zMjDHA7cIeTkl4FKYuw==", + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.7.tgz", + "integrity": "sha512-oiKvWIwIoOhFP1i6dASYyMXwPHKEtVZMshqSB7EvIVYjWRh0l9H7gHEt1z4Gh2rLGFMekWdsm4s94rvwpR7gkg==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", "@testing-library/dom": "^10.4.1", - "@testing-library/jest-dom": "^6.9.1", + "@testing-library/jest-dom": "6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", @@ -12710,7 +12784,7 @@ "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", - "ws": "^8.18.0" + "ws": "^8.21.1" }, "bin": { "storybook": "dist/bin/dispatcher.js" @@ -12736,6 +12810,81 @@ } } }, + "node_modules/storybook/node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/storybook/node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -12755,17 +12904,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/storybook/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/storybook/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, "node_modules/storybook/node_modules/wsl-utils": { @@ -12869,27 +13015,14 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/strip-indent": { @@ -12952,9 +13085,9 @@ "license": "MIT" }, "node_modules/systeminformation": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.0.tgz", - "integrity": "sha512-0LYSL01CCbjVeJG7iXI8fUCFU76zMjzbHd/EU3or4QpSFYCLMgslR11prwHuA3siz5jmOkqoLhjgOyDRmXBKmA==", + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.1.tgz", + "integrity": "sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==", "dev": true, "license": "MIT", "os": [ @@ -13034,9 +13167,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "dev": true, "license": "MIT", "engines": { @@ -13060,9 +13193,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", "engines": { @@ -13080,22 +13213,22 @@ } }, "node_modules/tldts": { - "version": "7.4.9", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.9.tgz", - "integrity": "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==", + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", + "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.9" + "tldts-core": "^7.4.10" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.9", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.9.tgz", - "integrity": "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==", + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", + "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", "dev": true, "license": "MIT" }, @@ -13207,6 +13340,16 @@ "node": ">=6" } }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -13326,16 +13469,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", - "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.67.0.tgz", + "integrity": "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.65.0", - "@typescript-eslint/parser": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/utils": "8.65.0" + "@typescript-eslint/eslint-plugin": "8.67.0", + "@typescript-eslint/parser": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13350,9 +13493,9 @@ } }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "dev": true, "license": "MIT", "engines": { @@ -13460,7 +13603,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -13581,15 +13724,15 @@ } }, "node_modules/vite": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", - "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "license": "MIT", "dependencies": { - "lightningcss": "^1.32.0", + "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.17", - "rolldown": "~1.1.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", "tinyglobby": "^0.2.17" }, "bin": { @@ -13606,7 +13749,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.3.0", + "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -13657,12 +13800,273 @@ } } }, - "node_modules/vitest": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", - "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", - "dev": true, - "license": "MIT", + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", @@ -13747,53 +14151,6 @@ } } }, - "node_modules/vitest/node_modules/@vitest/expect": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", - "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.10", - "@vitest/utils": "4.1.10", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/spy": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", - "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -13953,9 +14310,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", - "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "version": "8.21.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.2.tgz", + "integrity": "sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==", "dev": true, "license": "MIT", "engines": { @@ -14119,9 +14476,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, "license": "MIT", "engines": { @@ -14150,17 +14507,210 @@ "zod": "^3.25.28 || ^4" } }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "packages/infra": { + "name": "@react-starter/infra", + "version": "1.8.0-alpha.1", + "devDependencies": { + "aws-cdk": "2.1135.1", + "aws-cdk-lib": "2.264.0", + "constructs": "10.8.1", + "dotenv": "17.4.2" + } + }, + "packages/shared": { + "name": "@react-starter/shared", + "version": "1.8.0-alpha.1" + }, + "packages/web": { + "name": "@react-starter/web", + "version": "1.8.0-alpha.1", + "dependencies": { + "@fontsource-variable/noto-sans": "5.3.0", + "@fortawesome/fontawesome-svg-core": "7.3.1", + "@fortawesome/free-regular-svg-icons": "7.3.1", + "@fortawesome/free-solid-svg-icons": "7.3.1", + "@fortawesome/react-fontawesome": "3.5.0", + "@hookform/resolvers": "5.7.1", + "@react-spring/web": "10.1.2", + "@tailwindcss/vite": "4.3.3", + "@tanstack/react-query": "5.101.4", + "@tanstack/react-query-devtools": "5.101.4", + "@tanstack/react-table": "8.21.3", + "axios": "1.19.0", + "clsx": "2.1.1", + "dayjs": "1.11.21", + "i18next": "26.3.6", + "i18next-browser-languagedetector": "8.2.1", + "lodash": "4.18.1", + "lucide-react": "1.31.0", + "radix-ui": "1.6.7", + "react-hook-form": "7.85.0", + "react-i18next": "17.0.11", + "react-router-dom": "7.18.2", + "react-syntax-highlighter": "16.1.1", + "recharts": "3.10.1", + "tailwind-merge": "3.6.0", + "tailwindcss": "4.3.3", + "tw-animate-css": "1.4.0", + "uuid": "14.0.1", + "zod": "4.4.3" + }, + "devDependencies": { + "@chromatic-com/storybook": "5.3.0", + "@storybook/addon-docs": "10.5.7", + "@storybook/addon-onboarding": "10.5.7", + "@storybook/addon-themes": "10.5.7", + "@storybook/react-vite": "10.5.7", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/react": "16.3.2", + "@testing-library/user-event": "14.6.4", + "@types/eslint__js": "8.42.3", + "@types/lodash": "4.17.25", + "@types/react-syntax-highlighter": "15.5.13", + "@types/uuid": "10.0.0", + "@vitejs/plugin-react": "6.0.5", + "@vitest/ui": "4.1.10", + "jsdom": "29.1.1", + "msw": "2.15.0", + "shadcn": "4.17.0", + "storybook": "10.5.7", + "vite": "8.2.1" + } + }, + "packages/web/node_modules/@hookform/resolvers": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.7.1.tgz", + "integrity": "sha512-8wS/P4UDr5sQDe4nFaV51TVyfDPrWgNIXweqG0Bs9Z5LSuzKLb+RQNPvkN2oHM5SRrJyWrVH/F+LOUcFjUyvwQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "@sinclair/typebox": ">=0.25.24", + "@standard-schema/spec": "^1.0.0", + "@typeschema/main": ">=0.13.7", + "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "arktype": "^2.0.0", + "ata-validator": "^1.2.0", + "class-transformer": ">=0.4.0", + "class-validator": ">=0.12.0", + "computed-types": "^1.0.0", + "effect": "^3.10.3", + "fluentvalidation-ts": "^3.0.0", + "fp-ts": "^2.7.0", + "io-ts": "^2.0.0", + "joi": "^17.0.0", + "nope-validator": ">=0.12.0", + "react-hook-form": "^7.55.0", + "superstruct": ">=0.12.0", + "typanion": "^3.3.2", + "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", + "vest": ">=3.0.0", + "yup": "^1.0.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@sinclair/typebox": { + "optional": true + }, + "@standard-schema/spec": { + "optional": true + }, + "@typeschema/main": { + "optional": true + }, + "@vinejs/vine": { + "optional": true + }, + "ajv": { + "optional": true + }, + "ajv-errors": { + "optional": true + }, + "ajv-formats": { + "optional": true + }, + "arktype": { + "optional": true + }, + "ata-validator": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + }, + "computed-types": { + "optional": true + }, + "effect": { + "optional": true + }, + "fluentvalidation-ts": { + "optional": true + }, + "fp-ts": { + "optional": true + }, + "io-ts": { + "optional": true + }, + "joi": { + "optional": true + }, + "nope-validator": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "typanion": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vest": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "packages/web/node_modules/@vitejs/plugin-react": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", "dev": true, "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, "engines": { - "node": ">=18.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } } } } diff --git a/package.json b/package.json index 8022e55f..9be766cf 100644 --- a/package.json +++ b/package.json @@ -1,104 +1,60 @@ { - "name": "@leanstacks/react-starter", + "name": "react-starter", + "version": "1.8.0-alpha.1", "description": "A starter project for React applications using a curated technology stack for optimal performance, reliability, and maintainability.", "keywords": [ - "react, typescript, vite" + "react", + "typescript", + "vite", + "aws-cdk" ], "author": "LeanStacks", "license": "MIT", - "version": "1.7.0", - "type": "module", "repository": { "type": "git", "url": "git+https://github.com/leanstacks/react-starter.git" }, + "homepage": "https://github.com/leanstacks/react-starter#readme", + "directories": { + "doc": "docs" + }, + "type": "module", + "workspaces": [ + "packages/shared", + "packages/web", + "packages/infra" + ], "scripts": { - "clean": "rimraf coverage dist storybook-static", - "dev": "vite --open", - "build": "tsc && vite build", - "build:storybook": "storybook build", - "format": "prettier --write \"**/*.{ts,js,json,md}\"", - "format:check": "prettier --check \"**/*.{ts,js,json,md}\"", - "lint": "eslint . --ext .ts --max-warnings 0", - "lint:fix": "eslint . --ext .ts --fix", + "build": "npm run build --workspaces --if-present", + "clean": "npm run clean --workspaces --if-present", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "eslint .", + "lint:fix": "eslint . --fix", "prepare": "husky", - "preview": "vite preview", - "storybook": "storybook dev -p 6006", - "test": "vitest run --silent passed-only", - "test:coverage": "vitest run --coverage --silent passed-only", - "test:ci": "vitest run --coverage --silent passed-only", - "test:ui": "vitest --ui --coverage --silent passed-only", - "test:watch": "vitest" + "test": "npm run test --workspaces --if-present", + "test:coverage": "npm run test:coverage --workspaces --if-present" }, "dependencies": { - "@fontsource-variable/noto-sans": "5.3.0", - "@fortawesome/fontawesome-svg-core": "7.3.1", - "@fortawesome/free-regular-svg-icons": "7.3.1", - "@fortawesome/free-solid-svg-icons": "7.3.1", - "@fortawesome/react-fontawesome": "3.5.0", - "@hookform/resolvers": "5.4.0", - "@react-spring/web": "10.1.2", - "@tailwindcss/vite": "4.3.3", - "@tanstack/react-query": "5.101.4", - "@tanstack/react-query-devtools": "5.101.4", - "@tanstack/react-table": "8.21.3", - "axios": "1.18.1", "class-variance-authority": "0.7.1", - "clsx": "2.1.1", - "dayjs": "1.11.21", - "i18next": "26.3.6", - "i18next-browser-languagedetector": "8.2.1", - "lodash": "4.18.1", - "lucide-react": "1.25.0", - "radix-ui": "1.6.4", "react": "19.2.8", "react-dom": "19.2.8", - "react-hook-form": "7.82.0", - "react-i18next": "17.0.10", - "react-router-dom": "7.18.1", - "react-syntax-highlighter": "16.1.1", - "recharts": "3.10.0", - "tailwind-merge": "3.6.0", - "tailwindcss": "4.3.3", - "tw-animate-css": "1.4.0", - "uuid": "14.0.1", "zod": "4.4.3" }, "devDependencies": { - "@chromatic-com/storybook": "5.2.1", "@eslint/js": "9.39.2", - "@storybook/addon-docs": "10.5.3", - "@storybook/addon-onboarding": "10.5.3", - "@storybook/addon-themes": "10.5.3", - "@storybook/react-vite": "10.5.3", - "@testing-library/jest-dom": "6.9.1", - "@testing-library/react": "16.3.2", - "@testing-library/user-event": "14.6.1", - "@types/eslint__js": "8.42.3", - "@types/lodash": "4.17.24", - "@types/react": "19.2.17", - "@types/react-dom": "19.2.3", - "@types/react-syntax-highlighter": "15.5.13", - "@types/uuid": "10.0.0", - "@vitejs/plugin-react": "6.0.4", + "@types/node": "26.2.0", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.4", "@vitest/coverage-v8": "4.1.10", - "@vitest/ui": "4.1.10", "eslint": "9.39.2", - "eslint-plugin-react-hooks": "7.1.1", - "eslint-plugin-react-refresh": "0.5.3", - "eslint-plugin-storybook": "10.5.3", - "globals": "17.7.0", + "globals": "17.10.0", "husky": "9.1.7", - "jsdom": "29.1.1", - "msw": "2.15.0", "prettier": "3.9.6", "prettier-plugin-tailwindcss": "0.8.1", "rimraf": "6.1.3", - "shadcn": "4.14.0", - "storybook": "10.5.3", "typescript": "5.9.3", - "typescript-eslint": "8.65.0", - "vite": "8.1.5", + "typescript-eslint": "8.67.0", "vitest": "4.1.10" } } diff --git a/infrastructure/.env.example b/packages/infra/.env.example similarity index 96% rename from infrastructure/.env.example rename to packages/infra/.env.example index ce1c76c5..e23e13b0 100644 --- a/infrastructure/.env.example +++ b/packages/infra/.env.example @@ -22,7 +22,7 @@ CDK_ENV=dev ### Application CDN Configuration ### ## Required: Path to the static assets to deploy (relative to the infrastructure directory) -CDK_ASSET_PATH=../dist +CDK_ASSET_PATH=../web/dist ## Optional: Custom domain name for the application (e.g., react-starter.dev.example.com # CDK_DOMAIN_NAME=react-starter.dev.example.com ## Optional: ACM Certificate ARN for the custom domain (must be in the same region as CloudFront, typically us-east-1) @@ -34,7 +34,7 @@ CDK_ASSET_PATH=../dist ### Storybook CDN Configuration ### ## Required: Path to the static assets to deploy (relative to the infrastructure directory) -CDK_STORYBOOK_ASSET_PATH=../storybook-static +CDK_STORYBOOK_ASSET_PATH=../web/storybook-static ## Optional: Custom domain name for the Storybook application (e.g., react-starter-storybook.dev.example.com # CDK_STORYBOOK_DOMAIN_NAME=react-starter-storybook.dev.example.com ## Optional: ACM Certificate ARN for the custom domain (must be in the same region as CloudFront, typically us-east-1) diff --git a/infrastructure/README.md b/packages/infra/README.md similarity index 100% rename from infrastructure/README.md rename to packages/infra/README.md diff --git a/packages/infra/cdk.json b/packages/infra/cdk.json new file mode 100644 index 00000000..e36c69bf --- /dev/null +++ b/packages/infra/cdk.json @@ -0,0 +1,8 @@ +{ + "app": "node dist/app.js", + "context": {}, + "versionReporting": true, + "pathMetadata": true, + "assetMetadata": true, + "requireApproval": "never" +} diff --git a/packages/infra/package.json b/packages/infra/package.json new file mode 100644 index 00000000..40014a8b --- /dev/null +++ b/packages/infra/package.json @@ -0,0 +1,26 @@ +{ + "name": "@react-starter/infra", + "version": "1.8.0-alpha.1", + "private": true, + "type": "module", + "scripts": { + "build": "tsc --project tsconfig.build.json", + "clean": "rimraf cdk.out coverage dist", + "cdk": "cdk", + "deploy": "cdk deploy", + "deploy:all": "cdk deploy --all --require-approval never", + "destroy": "cdk destroy", + "destroy:all": "cdk destroy --all --force", + "diff": "cdk diff", + "synth": "cdk synth", + "test": "vitest run --silent passed-only", + "test:coverage": "vitest run --coverage --silent passed-only" + }, + "devDependencies": { + "aws-cdk": "2.1135.1", + "aws-cdk-lib": "2.264.0", + "constructs": "10.8.1", + "dotenv": "17.4.2" + }, + "dependencies": {} +} diff --git a/infrastructure/app.ts b/packages/infra/src/app.ts similarity index 96% rename from infrastructure/app.ts rename to packages/infra/src/app.ts index 41a41384..a7f5ff2c 100644 --- a/infrastructure/app.ts +++ b/packages/infra/src/app.ts @@ -1,8 +1,8 @@ #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; -import { getConfig, getEnvironmentConfig, getTags } from './utils/config'; -import { CdnStack } from './stacks/cdn-stack'; +import { getConfig, getEnvironmentConfig, getTags } from './utils/config.js'; +import { CdnStack } from './stacks/cdn-stack.js'; // Load and validate configuration const config = getConfig(); diff --git a/infrastructure/stacks/cdn-stack.test.ts b/packages/infra/src/stacks/cdn-stack.test.ts similarity index 99% rename from infrastructure/stacks/cdn-stack.test.ts rename to packages/infra/src/stacks/cdn-stack.test.ts index e821d9f5..592da93c 100644 --- a/infrastructure/stacks/cdn-stack.test.ts +++ b/packages/infra/src/stacks/cdn-stack.test.ts @@ -1,3 +1,5 @@ +import { describe, expect, it, beforeEach } from 'vitest'; + /** * Unit tests for the CdnStack class. * diff --git a/infrastructure/stacks/cdn-stack.ts b/packages/infra/src/stacks/cdn-stack.ts similarity index 100% rename from infrastructure/stacks/cdn-stack.ts rename to packages/infra/src/stacks/cdn-stack.ts diff --git a/packages/infra/src/utils/config.test.ts b/packages/infra/src/utils/config.test.ts new file mode 100644 index 00000000..1a151f95 --- /dev/null +++ b/packages/infra/src/utils/config.test.ts @@ -0,0 +1,37 @@ +import { afterEach, beforeEach, describe, it, expect } from 'vitest'; + +import { getConfig } from './config'; + +describe('config', () => { + const originalEnv = process.env; + + beforeEach(() => { + process.env = { + ...originalEnv, + // Required fields; seed defaults so all tests pass unless overridden + }; + }); + + afterEach(() => { + process.env = originalEnv; + }); + + describe('getConfig', () => { + it('should return a valid config object when all required environment variables are set', () => { + // ARRANGE + process.env.CDK_APP_NAME = 'my-app'; + process.env.CDK_ENV = 'dev'; + process.env.CDK_OU = 'my-ou'; + process.env.CDK_OWNER = 'my-owner'; + + // ACT + const config = getConfig(); + + // ASSERT + expect(config.CDK_APP_NAME).toBe('my-app'); + expect(config.CDK_ENV).toBe('dev'); + expect(config.CDK_OU).toBe('my-ou'); + expect(config.CDK_OWNER).toBe('my-owner'); + }); + }); +}); diff --git a/infrastructure/utils/config.ts b/packages/infra/src/utils/config.ts similarity index 100% rename from infrastructure/utils/config.ts rename to packages/infra/src/utils/config.ts diff --git a/packages/infra/tsconfig.build.json b/packages/infra/tsconfig.build.json new file mode 100644 index 00000000..b4941293 --- /dev/null +++ b/packages/infra/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["**/*.test.ts", "**/*.test.tsx"] +} diff --git a/packages/infra/tsconfig.json b/packages/infra/tsconfig.json new file mode 100644 index 00000000..eac65a4e --- /dev/null +++ b/packages/infra/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "types": ["node"] + }, + "include": ["src"] +} diff --git a/packages/infra/vitest.config.ts b/packages/infra/vitest.config.ts new file mode 100644 index 00000000..63dc5213 --- /dev/null +++ b/packages/infra/vitest.config.ts @@ -0,0 +1,19 @@ +import { defineConfig, mergeConfig } from 'vitest/config'; + +import baseConfig from '../../vitest.config.ts'; + +/** + * Vitest configuration for the Infra package. + * Extends the base configuration with Infra-specific settings. + */ +export default mergeConfig( + baseConfig, + defineConfig({ + test: { + exclude: ['**/src/app.ts'], + coverage: { + exclude: ['**/src/app.ts'], + }, + }, + }), +); diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 00000000..3119cfaa --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,13 @@ +{ + "name": "@react-starter/shared", + "version": "1.8.0-alpha.1", + "private": true, + "type": "module", + "main": "./src/index.ts", + "scripts": { + "build": "tsc --project tsconfig.build.json", + "clean": "rimraf coverage dist", + "test": "vitest run --silent passed-only", + "test:coverage": "vitest run --coverage --silent passed-only" + } +} diff --git a/packages/shared/src/index.test.ts b/packages/shared/src/index.test.ts new file mode 100644 index 00000000..93ad1b6b --- /dev/null +++ b/packages/shared/src/index.test.ts @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('Shared package', () => { + it('should have a test', () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared/tsconfig.build.json b/packages/shared/tsconfig.build.json new file mode 100644 index 00000000..b4941293 --- /dev/null +++ b/packages/shared/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["**/*.test.ts", "**/*.test.tsx"] +} diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 00000000..792172fb --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src"] +} diff --git a/.env.example b/packages/web/.env.example similarity index 100% rename from .env.example rename to packages/web/.env.example diff --git a/.storybook/decorators/withProviders.tsx b/packages/web/.storybook/decorators/withProviders.tsx similarity index 100% rename from .storybook/decorators/withProviders.tsx rename to packages/web/.storybook/decorators/withProviders.tsx diff --git a/.storybook/main.ts b/packages/web/.storybook/main.ts similarity index 100% rename from .storybook/main.ts rename to packages/web/.storybook/main.ts diff --git a/.storybook/preview-head.html b/packages/web/.storybook/preview-head.html similarity index 100% rename from .storybook/preview-head.html rename to packages/web/.storybook/preview-head.html diff --git a/.storybook/preview.ts b/packages/web/.storybook/preview.ts similarity index 100% rename from .storybook/preview.ts rename to packages/web/.storybook/preview.ts diff --git a/components.json b/packages/web/components.json similarity index 100% rename from components.json rename to packages/web/components.json diff --git a/index.html b/packages/web/index.html similarity index 100% rename from index.html rename to packages/web/index.html diff --git a/packages/web/package.json b/packages/web/package.json new file mode 100644 index 00000000..ea420662 --- /dev/null +++ b/packages/web/package.json @@ -0,0 +1,69 @@ +{ + "name": "@react-starter/web", + "version": "1.8.0-alpha.1", + "private": true, + "type": "module", + "main": "./src/main.tsx", + "scripts": { + "build": "tsc && vite build", + "build:storybook": "storybook build", + "clean": "rimraf coverage dist storybook-static", + "dev": "vite --open", + "preview": "vite preview", + "storybook": "storybook dev -p 6006", + "test": "vitest run --silent passed-only", + "test:coverage": "vitest run --coverage --silent passed-only" + }, + "dependencies": { + "@fontsource-variable/noto-sans": "5.3.0", + "@fortawesome/fontawesome-svg-core": "7.3.1", + "@fortawesome/free-regular-svg-icons": "7.3.1", + "@fortawesome/free-solid-svg-icons": "7.3.1", + "@fortawesome/react-fontawesome": "3.5.0", + "@hookform/resolvers": "5.7.1", + "@react-spring/web": "10.1.2", + "@tailwindcss/vite": "4.3.3", + "@tanstack/react-query": "5.101.4", + "@tanstack/react-query-devtools": "5.101.4", + "@tanstack/react-table": "8.21.3", + "axios": "1.19.0", + "clsx": "2.1.1", + "dayjs": "1.11.21", + "i18next": "26.3.6", + "i18next-browser-languagedetector": "8.2.1", + "lodash": "4.18.1", + "lucide-react": "1.31.0", + "radix-ui": "1.6.7", + "react-hook-form": "7.85.0", + "react-i18next": "17.0.11", + "react-router-dom": "7.18.2", + "react-syntax-highlighter": "16.1.1", + "recharts": "3.10.1", + "tailwind-merge": "3.6.0", + "tailwindcss": "4.3.3", + "tw-animate-css": "1.4.0", + "uuid": "14.0.1", + "zod": "4.4.3" + }, + "devDependencies": { + "@chromatic-com/storybook": "5.3.0", + "@storybook/addon-docs": "10.5.7", + "@storybook/addon-onboarding": "10.5.7", + "@storybook/addon-themes": "10.5.7", + "@storybook/react-vite": "10.5.7", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/react": "16.3.2", + "@testing-library/user-event": "14.6.4", + "@types/eslint__js": "8.42.3", + "@types/lodash": "4.17.25", + "@types/react-syntax-highlighter": "15.5.13", + "@types/uuid": "10.0.0", + "@vitejs/plugin-react": "6.0.5", + "@vitest/ui": "4.1.10", + "jsdom": "29.1.1", + "msw": "2.15.0", + "shadcn": "4.17.0", + "storybook": "10.5.7", + "vite": "8.2.1" + } +} diff --git a/public/favicon.ico b/packages/web/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to packages/web/public/favicon.ico diff --git a/src/App.test.tsx b/packages/web/src/App.test.tsx similarity index 85% rename from src/App.test.tsx rename to packages/web/src/App.test.tsx index b336dd07..e820ea52 100644 --- a/src/App.test.tsx +++ b/packages/web/src/App.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import App from './App'; diff --git a/src/App.tsx b/packages/web/src/App.tsx similarity index 73% rename from src/App.tsx rename to packages/web/src/App.tsx index 9639ce87..dcc71ab9 100644 --- a/src/App.tsx +++ b/packages/web/src/App.tsx @@ -2,14 +2,14 @@ import { RouterProvider } from 'react-router-dom'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import ErrorBoundary from 'common/components/Errors/ErrorBoundary'; -import ErrorFallback from 'common/components/Errors/ErrorFallback'; -import SettingsContextProvider from 'common/providers/SettingsProvider'; -import AxiosContextProvider from 'common/providers/AxiosProvider'; -import { router } from 'common/components/Router/Router'; -import Theme from 'common/components/Theme/Theme'; -import AuthContextProvider from 'common/providers/AuthProvider'; -import ToastsProvider from 'common/providers/ToastsProvider'; +import ErrorBoundary from '@/common/components/Errors/ErrorBoundary'; +import ErrorFallback from '@/common/components/Errors/ErrorFallback'; +import SettingsContextProvider from '@/common/providers/SettingsProvider'; +import AxiosContextProvider from '@/common/providers/AxiosProvider'; +import { router } from '@/common/components/Router/Router'; +import Theme from '@/common/components/Theme/Theme'; +import AuthContextProvider from '@/common/providers/AuthProvider'; +import ToastsProvider from '@/common/providers/ToastsProvider'; /** * React Query `QueryClient` and configuration. diff --git a/src/__fixtures__/charts.ts b/packages/web/src/__fixtures__/charts.ts similarity index 77% rename from src/__fixtures__/charts.ts rename to packages/web/src/__fixtures__/charts.ts index 88c5b805..22c7736d 100644 --- a/src/__fixtures__/charts.ts +++ b/packages/web/src/__fixtures__/charts.ts @@ -1,6 +1,6 @@ import colors from 'tailwindcss/colors'; -import { DonutChartData } from 'common/components/Chart/DonutChart'; +import { DonutChartData } from '@/common/components/Chart/DonutChart'; export const donutChartDataFixture: DonutChartData[] = [ { diff --git a/src/__fixtures__/settings.ts b/packages/web/src/__fixtures__/settings.ts similarity index 52% rename from src/__fixtures__/settings.ts rename to packages/web/src/__fixtures__/settings.ts index 5edcdc63..f60462f9 100644 --- a/src/__fixtures__/settings.ts +++ b/packages/web/src/__fixtures__/settings.ts @@ -1,3 +1,3 @@ -import { Settings } from 'common/api/useGetSettings'; +import { Settings } from '@/common/api/useGetSettings'; export const settingsFixture: Settings = { theme: 'dark' }; diff --git a/src/__fixtures__/toasts.ts b/packages/web/src/__fixtures__/toasts.ts similarity index 85% rename from src/__fixtures__/toasts.ts rename to packages/web/src/__fixtures__/toasts.ts index f1fe23bc..c1c43113 100644 --- a/src/__fixtures__/toasts.ts +++ b/packages/web/src/__fixtures__/toasts.ts @@ -1,4 +1,4 @@ -import { ToastDetail } from 'common/providers/ToastsContext'; +import { ToastDetail } from '@/common/providers/ToastsContext'; export const toastFixture: ToastDetail = { id: 'toast1', diff --git a/src/__fixtures__/todos.ts b/packages/web/src/__fixtures__/todos.ts similarity index 92% rename from src/__fixtures__/todos.ts rename to packages/web/src/__fixtures__/todos.ts index c1b7f43d..157e4d65 100644 --- a/src/__fixtures__/todos.ts +++ b/packages/web/src/__fixtures__/todos.ts @@ -1,4 +1,4 @@ -import { Task } from 'pages/Tasks/api/useGetUserTasks'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; export const todosFixture: Task[] = [ { diff --git a/src/__fixtures__/tokens.ts b/packages/web/src/__fixtures__/tokens.ts similarity index 79% rename from src/__fixtures__/tokens.ts rename to packages/web/src/__fixtures__/tokens.ts index 5d70ab2f..6a38808c 100644 --- a/src/__fixtures__/tokens.ts +++ b/packages/web/src/__fixtures__/tokens.ts @@ -1,4 +1,4 @@ -import { UserTokens } from 'common/api/useGetUserTokens'; +import { UserTokens } from '@/common/api/useGetUserTokens'; export const userTokensFixture: UserTokens = { id_token: 'id-token', diff --git a/src/__fixtures__/users.ts b/packages/web/src/__fixtures__/users.ts similarity index 95% rename from src/__fixtures__/users.ts rename to packages/web/src/__fixtures__/users.ts index 6e9b9a5f..006f968c 100644 --- a/src/__fixtures__/users.ts +++ b/packages/web/src/__fixtures__/users.ts @@ -1,4 +1,4 @@ -import { User } from 'common/api/useGetUser'; +import { User } from '@/common/api/useGetUser'; export const userFixture1: User = { id: 1, diff --git a/src/assets/img/logo.png b/packages/web/src/assets/img/logo.png similarity index 100% rename from src/assets/img/logo.png rename to packages/web/src/assets/img/logo.png diff --git a/src/common/api/useGetCurrentUser.test.ts b/packages/web/src/common/api/useGetCurrentUser.test.ts similarity index 86% rename from src/common/api/useGetCurrentUser.test.ts rename to packages/web/src/common/api/useGetCurrentUser.test.ts index d5de4e8a..d5df6a42 100644 --- a/src/common/api/useGetCurrentUser.test.ts +++ b/packages/web/src/common/api/useGetCurrentUser.test.ts @@ -1,10 +1,10 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; -import { userFixture1 } from '__fixtures__/users'; -import storage from 'common/utils/storage'; +import { userFixture1 } from '@/__fixtures__/users'; +import storage from '@/common/utils/storage'; -import { useGetCurrentUser } from 'common/api/useGetCurrentUser'; +import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; describe('useGetCurrentUser', () => { const getItemSpy = vi.spyOn(storage, 'getJsonItem'); diff --git a/src/common/api/useGetCurrentUser.ts b/packages/web/src/common/api/useGetCurrentUser.ts similarity index 86% rename from src/common/api/useGetCurrentUser.ts rename to packages/web/src/common/api/useGetCurrentUser.ts index 4acf3adc..6d49482b 100644 --- a/src/common/api/useGetCurrentUser.ts +++ b/packages/web/src/common/api/useGetCurrentUser.ts @@ -1,8 +1,8 @@ import { useQuery } from '@tanstack/react-query'; -import storage from 'common/utils/storage'; +import storage from '@/common/utils/storage'; import { User } from './useGetUser'; -import { QueryKey, StorageKey } from 'common/utils/constants'; +import { QueryKey, StorageKey } from '@/common/utils/constants'; /** * An API hook which fetches the currently authenticated `User`. diff --git a/src/common/api/useGetSettings.test.ts b/packages/web/src/common/api/useGetSettings.test.ts similarity index 82% rename from src/common/api/useGetSettings.test.ts rename to packages/web/src/common/api/useGetSettings.test.ts index 7a6620af..5004a760 100644 --- a/src/common/api/useGetSettings.test.ts +++ b/packages/web/src/common/api/useGetSettings.test.ts @@ -1,11 +1,11 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; -import { settingsFixture } from '__fixtures__/settings'; -import { DEFAULT_SETTINGS, StorageKey } from 'common/utils/constants'; -import storage from 'common/utils/storage'; +import { settingsFixture } from '@/__fixtures__/settings'; +import { DEFAULT_SETTINGS, StorageKey } from '@/common/utils/constants'; +import storage from '@/common/utils/storage'; -import { useGetSettings } from 'common/api/useGetSettings'; +import { useGetSettings } from '@/common/api/useGetSettings'; describe('useGetSettings', () => { const getItemSpy = vi.spyOn(storage, 'getJsonItem'); diff --git a/src/common/api/useGetSettings.ts b/packages/web/src/common/api/useGetSettings.ts similarity index 83% rename from src/common/api/useGetSettings.ts rename to packages/web/src/common/api/useGetSettings.ts index f0cecf8c..a7ce00ad 100644 --- a/src/common/api/useGetSettings.ts +++ b/packages/web/src/common/api/useGetSettings.ts @@ -1,8 +1,8 @@ import { useQuery } from '@tanstack/react-query'; -import { ThemeValue } from 'common/components/Theme/Theme'; -import { DEFAULT_SETTINGS, QueryKey, StorageKey } from 'common/utils/constants'; -import storage from 'common/utils/storage'; +import { ThemeValue } from '@/common/components/Theme/Theme'; +import { DEFAULT_SETTINGS, QueryKey, StorageKey } from '@/common/utils/constants'; +import storage from '@/common/utils/storage'; /** * The `Settings` are user preferences. diff --git a/src/common/api/useGetUser.test.ts b/packages/web/src/common/api/useGetUser.test.ts similarity index 81% rename from src/common/api/useGetUser.test.ts rename to packages/web/src/common/api/useGetUser.test.ts index 4ff0d75f..4977812f 100644 --- a/src/common/api/useGetUser.test.ts +++ b/packages/web/src/common/api/useGetUser.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { useGetUser } from 'common/api/useGetUser'; -import { renderHook, waitFor } from 'test/test-utils'; + +import { useGetUser } from '@/common/api/useGetUser'; +import { renderHook, waitFor } from '@/test/test-utils'; describe('useGetUser', () => { it('should get user', async () => { diff --git a/src/common/api/useGetUser.ts b/packages/web/src/common/api/useGetUser.ts similarity index 89% rename from src/common/api/useGetUser.ts rename to packages/web/src/common/api/useGetUser.ts index ba2d4680..a4d8f72f 100644 --- a/src/common/api/useGetUser.ts +++ b/packages/web/src/common/api/useGetUser.ts @@ -1,8 +1,8 @@ import { UseQueryResult, useQuery } from '@tanstack/react-query'; -import { useAxios } from 'common/hooks/useAxios'; -import { config } from 'common/utils/config'; -import { QueryKey } from 'common/utils/constants'; +import { useAxios } from '@/common/hooks/useAxios'; +import { config } from '@/common/utils/config'; +import { QueryKey } from '@/common/utils/constants'; /** * The `Address` type. diff --git a/src/common/api/useGetUserTokens.test.ts b/packages/web/src/common/api/useGetUserTokens.test.ts similarity index 85% rename from src/common/api/useGetUserTokens.test.ts rename to packages/web/src/common/api/useGetUserTokens.test.ts index 6c5c52b6..a7722fe4 100644 --- a/src/common/api/useGetUserTokens.test.ts +++ b/packages/web/src/common/api/useGetUserTokens.test.ts @@ -1,12 +1,12 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import dayjs from 'dayjs'; -import { renderHook, waitFor } from 'test/test-utils'; -import WithQueryClientProvider from 'test/wrappers/WithQueryClientProvider'; -import storage from 'common/utils/storage'; -import { userTokensFixture } from '__fixtures__/tokens'; +import { renderHook, waitFor } from '@/test/test-utils'; +import WithQueryClientProvider from '@/test/wrappers/WithQueryClientProvider'; +import storage from '@/common/utils/storage'; +import { userTokensFixture } from '@/__fixtures__/tokens'; -import { UserTokens, useGetUserTokens } from 'common/api/useGetUserTokens'; +import { UserTokens, useGetUserTokens } from '@/common/api/useGetUserTokens'; describe('useGetTokens', () => { const getItemSpy = vi.spyOn(storage, 'getJsonItem'); diff --git a/src/common/api/useGetUserTokens.ts b/packages/web/src/common/api/useGetUserTokens.ts similarity index 93% rename from src/common/api/useGetUserTokens.ts rename to packages/web/src/common/api/useGetUserTokens.ts index 30582862..83a9f679 100644 --- a/src/common/api/useGetUserTokens.ts +++ b/packages/web/src/common/api/useGetUserTokens.ts @@ -1,8 +1,8 @@ import { UseQueryOptions, UseQueryResult, useQuery } from '@tanstack/react-query'; import dayjs from 'dayjs'; -import { QueryKey, StorageKey } from 'common/utils/constants'; -import storage from 'common/utils/storage'; +import { QueryKey, StorageKey } from '@/common/utils/constants'; +import storage from '@/common/utils/storage'; /** * A `UserTokens` object contains OAuth access, id, and refresh tokens diff --git a/src/common/api/useSetSettings.test.ts b/packages/web/src/common/api/useSetSettings.test.ts similarity index 84% rename from src/common/api/useSetSettings.test.ts rename to packages/web/src/common/api/useSetSettings.test.ts index c2e74568..5dfb5506 100644 --- a/src/common/api/useSetSettings.test.ts +++ b/packages/web/src/common/api/useSetSettings.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; -import storage from 'common/utils/storage'; -import { Settings } from 'common/api/useGetSettings'; +import storage from '@/common/utils/storage'; +import { Settings } from '@/common/api/useGetSettings'; -import { useSetSettings } from 'common/api/useSetSettings'; +import { useSetSettings } from '@/common/api/useSetSettings'; describe('useSetSettings', () => { const setItemSpy = vi.spyOn(storage, 'setJsonItem'); diff --git a/src/common/api/useSetSettings.ts b/packages/web/src/common/api/useSetSettings.ts similarity index 92% rename from src/common/api/useSetSettings.ts rename to packages/web/src/common/api/useSetSettings.ts index 50853035..5258ed59 100644 --- a/src/common/api/useSetSettings.ts +++ b/packages/web/src/common/api/useSetSettings.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import storage from 'common/utils/storage'; -import { DEFAULT_SETTINGS, QueryKey, StorageKey } from 'common/utils/constants'; +import storage from '@/common/utils/storage'; +import { DEFAULT_SETTINGS, QueryKey, StorageKey } from '@/common/utils/constants'; import { Settings } from './useGetSettings'; /** diff --git a/src/common/components/Accordion/Accordion.test.tsx b/packages/web/src/common/components/Accordion/Accordion.test.tsx similarity index 98% rename from src/common/components/Accordion/Accordion.test.tsx rename to packages/web/src/common/components/Accordion/Accordion.test.tsx index f7f78bef..fdd78333 100644 --- a/src/common/components/Accordion/Accordion.test.tsx +++ b/packages/web/src/common/components/Accordion/Accordion.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import Accordion from './Accordion'; diff --git a/src/common/components/Accordion/Accordion.tsx b/packages/web/src/common/components/Accordion/Accordion.tsx similarity index 97% rename from src/common/components/Accordion/Accordion.tsx rename to packages/web/src/common/components/Accordion/Accordion.tsx index 9f5c3b7a..9b3d131e 100644 --- a/src/common/components/Accordion/Accordion.tsx +++ b/packages/web/src/common/components/Accordion/Accordion.tsx @@ -2,8 +2,8 @@ import { createContext, PropsWithChildren, useCallback, useContext, useEffect, u import noop from 'lodash/noop'; import { animated, useSpring } from '@react-spring/web'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import FAIcon from '../Icon/FAIcon'; /** @@ -121,7 +121,7 @@ const AccordionItemContext = createContext({ /** * Properties for the `Item` component. */ -interface ItemProps extends BaseComponentProps, PropsWithChildren { +export interface ItemProps extends BaseComponentProps, PropsWithChildren { value: string; } diff --git a/src/common/components/Accordion/__stories__/Accordion.stories.tsx b/packages/web/src/common/components/Accordion/__stories__/Accordion.stories.tsx similarity index 100% rename from src/common/components/Accordion/__stories__/Accordion.stories.tsx rename to packages/web/src/common/components/Accordion/__stories__/Accordion.stories.tsx diff --git a/src/common/components/Alert/ErrorAlert.test.tsx b/packages/web/src/common/components/Alert/ErrorAlert.test.tsx similarity index 97% rename from src/common/components/Alert/ErrorAlert.test.tsx rename to packages/web/src/common/components/Alert/ErrorAlert.test.tsx index 2224ca0b..1a449d87 100644 --- a/src/common/components/Alert/ErrorAlert.test.tsx +++ b/packages/web/src/common/components/Alert/ErrorAlert.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ErrorAlert from './ErrorAlert'; diff --git a/src/common/components/Alert/ErrorAlert.tsx b/packages/web/src/common/components/Alert/ErrorAlert.tsx similarity index 80% rename from src/common/components/Alert/ErrorAlert.tsx rename to packages/web/src/common/components/Alert/ErrorAlert.tsx index 272f397b..24588fd6 100644 --- a/src/common/components/Alert/ErrorAlert.tsx +++ b/packages/web/src/common/components/Alert/ErrorAlert.tsx @@ -1,8 +1,8 @@ import { AlertCircleIcon } from 'lucide-react'; -import { cn } from 'common/utils/css'; -import { Alert, AlertDescription, AlertTitle } from '../shadcn/alert'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { Alert, AlertDescription, AlertTitle } from '@/common/components/shadcn/alert'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `ErrorAlert` component. diff --git a/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx b/packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx similarity index 100% rename from src/common/components/Alert/__stories__/ErrorAlert.stories.tsx rename to packages/web/src/common/components/Alert/__stories__/ErrorAlert.stories.tsx diff --git a/src/common/components/Backdrop/Backdrop.test.tsx b/packages/web/src/common/components/Backdrop/Backdrop.test.tsx similarity index 96% rename from src/common/components/Backdrop/Backdrop.test.tsx rename to packages/web/src/common/components/Backdrop/Backdrop.test.tsx index 65764ee1..a649dfa2 100644 --- a/src/common/components/Backdrop/Backdrop.test.tsx +++ b/packages/web/src/common/components/Backdrop/Backdrop.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Backdrop from './Backdrop'; diff --git a/src/common/components/Backdrop/Backdrop.tsx b/packages/web/src/common/components/Backdrop/Backdrop.tsx similarity index 91% rename from src/common/components/Backdrop/Backdrop.tsx rename to packages/web/src/common/components/Backdrop/Backdrop.tsx index 1b2017e0..407b7276 100644 --- a/src/common/components/Backdrop/Backdrop.tsx +++ b/packages/web/src/common/components/Backdrop/Backdrop.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * Properties for the `Backdrop` component. diff --git a/src/common/components/Badge/Badge.test.tsx b/packages/web/src/common/components/Badge/Badge.test.tsx similarity index 94% rename from src/common/components/Badge/Badge.test.tsx rename to packages/web/src/common/components/Badge/Badge.test.tsx index 84757fa4..e97cafd5 100644 --- a/src/common/components/Badge/Badge.test.tsx +++ b/packages/web/src/common/components/Badge/Badge.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Badge from './Badge'; diff --git a/src/common/components/Badge/Badge.tsx b/packages/web/src/common/components/Badge/Badge.tsx similarity index 93% rename from src/common/components/Badge/Badge.tsx rename to packages/web/src/common/components/Badge/Badge.tsx index 37b4a2cd..56fd6d26 100644 --- a/src/common/components/Badge/Badge.tsx +++ b/packages/web/src/common/components/Badge/Badge.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * Define the component base and variant styles. diff --git a/src/common/components/Badge/__stories__/Badge.stories.tsx b/packages/web/src/common/components/Badge/__stories__/Badge.stories.tsx similarity index 100% rename from src/common/components/Badge/__stories__/Badge.stories.tsx rename to packages/web/src/common/components/Badge/__stories__/Badge.stories.tsx diff --git a/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx b/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx similarity index 97% rename from src/common/components/Breadcrumbs/Breadcrumbs.test.tsx rename to packages/web/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx index 98b8f2e4..fcf7aa81 100644 --- a/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx +++ b/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Breadcrumbs from './Breadcrumbs'; diff --git a/src/common/components/Breadcrumbs/Breadcrumbs.tsx b/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx similarity index 97% rename from src/common/components/Breadcrumbs/Breadcrumbs.tsx rename to packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx index 0cfff0b8..a19dde9e 100644 --- a/src/common/components/Breadcrumbs/Breadcrumbs.tsx +++ b/packages/web/src/common/components/Breadcrumbs/Breadcrumbs.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; -import { default as CommonLink, LinkProps as CommonLinkProps } from 'common/components/Link/Link'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; +import { default as CommonLink, LinkProps as CommonLinkProps } from '@/common/components/Link/Link'; import FAIcon, { FAIconProps } from '../Icon/FAIcon'; /** diff --git a/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx b/packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx similarity index 97% rename from src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx rename to packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx index 9cb9ad71..6b37cfdc 100644 --- a/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx +++ b/packages/web/src/common/components/Breadcrumbs/__stories__/Breadcrumbs.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { MemoryRouter } from 'react-router-dom'; import Breadcrumbs from '../Breadcrumbs'; -import DropdownMenu from 'common/components/Dropdown/DropdownMenu'; +import DropdownMenu from '@/common/components/Dropdown/DropdownMenu'; const meta = { title: 'Common/Breadcrumbs', diff --git a/src/common/components/Button/Button.test.tsx b/packages/web/src/common/components/Button/Button.test.tsx similarity index 98% rename from src/common/components/Button/Button.test.tsx rename to packages/web/src/common/components/Button/Button.test.tsx index 2b82c1cb..9398a3b1 100644 --- a/src/common/components/Button/Button.test.tsx +++ b/packages/web/src/common/components/Button/Button.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Button from './Button'; diff --git a/src/common/components/Button/Button.tsx b/packages/web/src/common/components/Button/Button.tsx similarity index 94% rename from src/common/components/Button/Button.tsx rename to packages/web/src/common/components/Button/Button.tsx index c503f0f5..0ddcef63 100644 --- a/src/common/components/Button/Button.tsx +++ b/packages/web/src/common/components/Button/Button.tsx @@ -1,8 +1,8 @@ import { ButtonHTMLAttributes } from 'react'; import { cva, type VariantProps } from 'class-variance-authority'; -import { PropsWithTestId } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { PropsWithTestId } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * Define the component base and variant styles. diff --git a/src/common/components/Button/LanguageToggle.test.tsx b/packages/web/src/common/components/Button/LanguageToggle.test.tsx similarity index 93% rename from src/common/components/Button/LanguageToggle.test.tsx rename to packages/web/src/common/components/Button/LanguageToggle.test.tsx index 652ed9c0..1b278562 100644 --- a/src/common/components/Button/LanguageToggle.test.tsx +++ b/packages/web/src/common/components/Button/LanguageToggle.test.tsx @@ -1,9 +1,9 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it, vi } from 'vitest'; -import { StorageKey } from 'common/utils/constants'; -import { render, screen } from 'test/test-utils'; -import storage from 'common/utils/storage'; +import { StorageKey } from '@/common/utils/constants'; +import { render, screen } from '@/test/test-utils'; +import storage from '@/common/utils/storage'; import LanguageToggle from './LanguageToggle'; diff --git a/src/common/components/Button/LanguageToggle.tsx b/packages/web/src/common/components/Button/LanguageToggle.tsx similarity index 73% rename from src/common/components/Button/LanguageToggle.tsx rename to packages/web/src/common/components/Button/LanguageToggle.tsx index 4873aa6a..de5b5b1e 100644 --- a/src/common/components/Button/LanguageToggle.tsx +++ b/packages/web/src/common/components/Button/LanguageToggle.tsx @@ -1,23 +1,17 @@ import { useTranslation } from 'react-i18next'; -import { PropsWithClassName } from 'common/utils/types'; -import { StorageKey } from 'common/utils/constants'; -import storage from 'common/utils/storage'; -import FAIcon from 'common/components/Icon/FAIcon'; +import { PropsWithClassName } from '@/common/utils/types'; +import { StorageKey } from '@/common/utils/constants'; +import storage from '@/common/utils/storage'; +import FAIcon from '@/common/components/Icon/FAIcon'; import DropdownMenu from '../Dropdown/DropdownMenu'; -/** - * Properties for the `LanguageToggle` component. - * @see {@link PropsWithClassName} - */ -export interface LanguageToggleProps extends PropsWithClassName {} - /** * The `LanguageToggle` component renders a `Dropdown` which allows users * to select the language in which they wish to view the application. - * @param {LanguageToggleProps} props - Component properties. + * @param {PropsWithClassName} props - Component properties. */ -const LanguageToggle = ({ className }: LanguageToggleProps) => { +const LanguageToggle = ({ className }: PropsWithClassName) => { const { i18n } = useTranslation(); /** diff --git a/src/common/components/Button/ThemeToggle.test.tsx b/packages/web/src/common/components/Button/ThemeToggle.test.tsx similarity index 89% rename from src/common/components/Button/ThemeToggle.test.tsx rename to packages/web/src/common/components/Button/ThemeToggle.test.tsx index cbd920af..dbf71b88 100644 --- a/src/common/components/Button/ThemeToggle.test.tsx +++ b/packages/web/src/common/components/Button/ThemeToggle.test.tsx @@ -2,11 +2,11 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { UseMutationResult } from '@tanstack/react-query'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; -import { Settings } from 'common/api/useGetSettings'; -import * as UseSettings from 'common/hooks/useSettings'; -import * as UseSetSettings from 'common/api/useSetSettings'; -import { settingsFixture } from '__fixtures__/settings'; +import { render, screen } from '@/test/test-utils'; +import { Settings } from '@/common/api/useGetSettings'; +import * as UseSettings from '@/common/hooks/useSettings'; +import * as UseSetSettings from '@/common/api/useSetSettings'; +import { settingsFixture } from '@/__fixtures__/settings'; import ThemeToggle from './ThemeToggle'; diff --git a/src/common/components/Button/ThemeToggle.tsx b/packages/web/src/common/components/Button/ThemeToggle.tsx similarity index 65% rename from src/common/components/Button/ThemeToggle.tsx rename to packages/web/src/common/components/Button/ThemeToggle.tsx index 39220e3f..5687163d 100644 --- a/src/common/components/Button/ThemeToggle.tsx +++ b/packages/web/src/common/components/Button/ThemeToggle.tsx @@ -1,22 +1,16 @@ -import { PropsWithClassName } from 'common/utils/types'; -import { useSetSettings } from 'common/api/useSetSettings'; -import { useSettings } from 'common/hooks/useSettings'; -import { cn } from 'common/utils/css'; +import { PropsWithClassName } from '@/common/utils/types'; +import { useSetSettings } from '@/common/api/useSetSettings'; +import { useSettings } from '@/common/hooks/useSettings'; +import { cn } from '@/common/utils/css'; import Button from './Button'; -import FAIcon from 'common/components/Icon/FAIcon'; - -/** - * Properties for the `ThemeToggle` component. - */ -export interface ThemeToggleProps extends PropsWithClassName {} +import FAIcon from '@/common/components/Icon/FAIcon'; /** * The `ThemeToggle` React component renders a `Button` which allows users * to toggle between light and dark themes. - * @param {ThemeToggleProps} [props] - Component properties, `ThemeProps`. - * @see {@link ThemeToggleProps} + * @param {PropsWithClassName} [props] - Component properties, `PropsWithClassName`. */ -const ThemeToggle = ({ className }: ThemeToggleProps) => { +const ThemeToggle = ({ className }: PropsWithClassName) => { const settings = useSettings(); const { mutate: setSettings } = useSetSettings(); diff --git a/src/common/components/Button/__stories__/Button.stories.tsx b/packages/web/src/common/components/Button/__stories__/Button.stories.tsx similarity index 100% rename from src/common/components/Button/__stories__/Button.stories.tsx rename to packages/web/src/common/components/Button/__stories__/Button.stories.tsx diff --git a/src/common/components/Button/__stories__/LanguageToggle.stories.tsx b/packages/web/src/common/components/Button/__stories__/LanguageToggle.stories.tsx similarity index 100% rename from src/common/components/Button/__stories__/LanguageToggle.stories.tsx rename to packages/web/src/common/components/Button/__stories__/LanguageToggle.stories.tsx diff --git a/src/common/components/Button/__stories__/ThemeToggle.stories.tsx b/packages/web/src/common/components/Button/__stories__/ThemeToggle.stories.tsx similarity index 100% rename from src/common/components/Button/__stories__/ThemeToggle.stories.tsx rename to packages/web/src/common/components/Button/__stories__/ThemeToggle.stories.tsx diff --git a/src/common/components/Card/Card.test.tsx b/packages/web/src/common/components/Card/Card.test.tsx similarity index 96% rename from src/common/components/Card/Card.test.tsx rename to packages/web/src/common/components/Card/Card.test.tsx index 89acc9a5..be05af33 100644 --- a/src/common/components/Card/Card.test.tsx +++ b/packages/web/src/common/components/Card/Card.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import logo from 'assets/img/logo.png'; diff --git a/src/common/components/Card/Card.tsx b/packages/web/src/common/components/Card/Card.tsx similarity index 93% rename from src/common/components/Card/Card.tsx rename to packages/web/src/common/components/Card/Card.tsx index e3bd2736..a3937fa1 100644 --- a/src/common/components/Card/Card.tsx +++ b/packages/web/src/common/components/Card/Card.tsx @@ -1,8 +1,8 @@ import { ImgHTMLAttributes, PropsWithChildren } from 'react'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; -import Divider, { DividerProps } from '../Divider/Divider'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; +import Divider from '../Divider/Divider'; /** * Properties for the `Card` React component. @@ -126,7 +126,7 @@ Card.Subtitle = Subtitle; * The `Separator` component renders a horizontal divider. * This is useful to organize and separate content. */ -const Separator = ({ className, testId = 'card-separator' }: DividerProps) => { +const Separator = ({ className, testId = 'card-separator' }: BaseComponentProps) => { return ; }; Card.Separator = Separator; diff --git a/src/common/components/Card/MessageCard.test.tsx b/packages/web/src/common/components/Card/MessageCard.test.tsx similarity index 97% rename from src/common/components/Card/MessageCard.test.tsx rename to packages/web/src/common/components/Card/MessageCard.test.tsx index 72ef1d06..3428d434 100644 --- a/src/common/components/Card/MessageCard.test.tsx +++ b/packages/web/src/common/components/Card/MessageCard.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import MessageCard from './MessageCard'; diff --git a/src/common/components/Card/MessageCard.tsx b/packages/web/src/common/components/Card/MessageCard.tsx similarity index 91% rename from src/common/components/Card/MessageCard.tsx rename to packages/web/src/common/components/Card/MessageCard.tsx index a6dc1be9..43192fc5 100644 --- a/src/common/components/Card/MessageCard.tsx +++ b/packages/web/src/common/components/Card/MessageCard.tsx @@ -1,6 +1,6 @@ -import { cn } from 'common/utils/css'; +import { cn } from '@/common/utils/css'; import Card, { CardProps } from './Card'; -import FAIcon, { FAIconProps } from 'common/components/Icon/FAIcon'; +import FAIcon, { FAIconProps } from '@/common/components/Icon/FAIcon'; /** * Properties for the `MessageCard` React component. diff --git a/src/common/components/Card/__stories__/Card.stories.tsx b/packages/web/src/common/components/Card/__stories__/Card.stories.tsx similarity index 100% rename from src/common/components/Card/__stories__/Card.stories.tsx rename to packages/web/src/common/components/Card/__stories__/Card.stories.tsx diff --git a/src/common/components/Card/__stories__/MessageCard.stories.tsx b/packages/web/src/common/components/Card/__stories__/MessageCard.stories.tsx similarity index 100% rename from src/common/components/Card/__stories__/MessageCard.stories.tsx rename to packages/web/src/common/components/Card/__stories__/MessageCard.stories.tsx diff --git a/src/common/components/Chart/DonutChart.test.tsx b/packages/web/src/common/components/Chart/DonutChart.test.tsx similarity index 76% rename from src/common/components/Chart/DonutChart.test.tsx rename to packages/web/src/common/components/Chart/DonutChart.test.tsx index ee9ae125..c28d14f8 100644 --- a/src/common/components/Chart/DonutChart.test.tsx +++ b/packages/web/src/common/components/Chart/DonutChart.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { donutChartDataFixture } from '__fixtures__/charts'; +import { donutChartDataFixture } from '@/__fixtures__/charts'; import DonutChart from './DonutChart'; diff --git a/src/common/components/Chart/DonutChart.tsx b/packages/web/src/common/components/Chart/DonutChart.tsx similarity index 96% rename from src/common/components/Chart/DonutChart.tsx rename to packages/web/src/common/components/Chart/DonutChart.tsx index 82ff626a..b767593e 100644 --- a/src/common/components/Chart/DonutChart.tsx +++ b/packages/web/src/common/components/Chart/DonutChart.tsx @@ -1,6 +1,6 @@ import { CellProps, Legend, Pie, PieChart, PieProps } from 'recharts'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Describes a single piece of data for a `DonutChart` used to create a single diff --git a/src/common/components/Chart/__stories__/DonutChart.stories.tsx b/packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx similarity index 95% rename from src/common/components/Chart/__stories__/DonutChart.stories.tsx rename to packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx index 910af061..1c9c9789 100644 --- a/src/common/components/Chart/__stories__/DonutChart.stories.tsx +++ b/packages/web/src/common/components/Chart/__stories__/DonutChart.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import { donutChartDataFixture } from '__fixtures__/charts'; +import { donutChartDataFixture } from '@/__fixtures__/charts'; import DonutChart from '../DonutChart'; diff --git a/src/common/components/Content/Columns.test.tsx b/packages/web/src/common/components/Content/Columns.test.tsx similarity index 90% rename from src/common/components/Content/Columns.test.tsx rename to packages/web/src/common/components/Content/Columns.test.tsx index 9b0764e7..b58fbbb1 100644 --- a/src/common/components/Content/Columns.test.tsx +++ b/packages/web/src/common/components/Content/Columns.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Columns from './Columns'; diff --git a/src/common/components/Content/Columns.tsx b/packages/web/src/common/components/Content/Columns.tsx similarity index 95% rename from src/common/components/Content/Columns.tsx rename to packages/web/src/common/components/Content/Columns.tsx index 47938ee6..57d30b47 100644 --- a/src/common/components/Content/Columns.tsx +++ b/packages/web/src/common/components/Content/Columns.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * Define the `Columns` component base and variant styles. diff --git a/src/common/components/Content/Container.test.tsx b/packages/web/src/common/components/Content/Container.test.tsx similarity index 89% rename from src/common/components/Content/Container.test.tsx rename to packages/web/src/common/components/Content/Container.test.tsx index 1ae4f01a..8c1bf470 100644 --- a/src/common/components/Content/Container.test.tsx +++ b/packages/web/src/common/components/Content/Container.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Container from './Container'; diff --git a/src/common/components/Content/Container.tsx b/packages/web/src/common/components/Content/Container.tsx similarity index 93% rename from src/common/components/Content/Container.tsx rename to packages/web/src/common/components/Content/Container.tsx index eea138cb..cc18a4a8 100644 --- a/src/common/components/Content/Container.tsx +++ b/packages/web/src/common/components/Content/Container.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Defines the `Container` component base and variant styles. diff --git a/src/common/components/Content/Page.test.tsx b/packages/web/src/common/components/Content/Page.test.tsx similarity index 95% rename from src/common/components/Content/Page.test.tsx rename to packages/web/src/common/components/Content/Page.test.tsx index fa4a2d6e..673cbfc2 100644 --- a/src/common/components/Content/Page.test.tsx +++ b/packages/web/src/common/components/Content/Page.test.tsx @@ -1,4 +1,4 @@ -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import { describe, expect, it } from 'vitest'; diff --git a/src/common/components/Content/Page.tsx b/packages/web/src/common/components/Content/Page.tsx similarity index 84% rename from src/common/components/Content/Page.tsx rename to packages/web/src/common/components/Content/Page.tsx index 625aa01e..701fe64d 100644 --- a/src/common/components/Content/Page.tsx +++ b/packages/web/src/common/components/Content/Page.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `Page` React component. diff --git a/src/common/components/Content/__stories__/Columns.stories.tsx b/packages/web/src/common/components/Content/__stories__/Columns.stories.tsx similarity index 100% rename from src/common/components/Content/__stories__/Columns.stories.tsx rename to packages/web/src/common/components/Content/__stories__/Columns.stories.tsx diff --git a/src/common/components/Content/__stories__/Container.stories.tsx b/packages/web/src/common/components/Content/__stories__/Container.stories.tsx similarity index 100% rename from src/common/components/Content/__stories__/Container.stories.tsx rename to packages/web/src/common/components/Content/__stories__/Container.stories.tsx diff --git a/src/common/components/Dialog/Dialog.test.tsx b/packages/web/src/common/components/Dialog/Dialog.test.tsx similarity index 99% rename from src/common/components/Dialog/Dialog.test.tsx rename to packages/web/src/common/components/Dialog/Dialog.test.tsx index a7555fc3..16a5d5db 100644 --- a/src/common/components/Dialog/Dialog.test.tsx +++ b/packages/web/src/common/components/Dialog/Dialog.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it } from 'vitest'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import Dialog from './Dialog'; diff --git a/src/common/components/Dialog/Dialog.tsx b/packages/web/src/common/components/Dialog/Dialog.tsx similarity index 97% rename from src/common/components/Dialog/Dialog.tsx rename to packages/web/src/common/components/Dialog/Dialog.tsx index 72cc4b70..ea2e6057 100644 --- a/src/common/components/Dialog/Dialog.tsx +++ b/packages/web/src/common/components/Dialog/Dialog.tsx @@ -2,10 +2,10 @@ import { createContext, PropsWithChildren, ReactNode, useContext, useState } fro import noop from 'lodash/noop'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; import Backdrop from '../Backdrop/Backdrop'; -import Divider, { DividerProps } from '../Divider/Divider'; +import Divider from '../Divider/Divider'; import { default as CommonButton, ButtonProps as CommonButtonProps } from '../Button/Button'; /** @@ -268,7 +268,7 @@ Dialog.Button = Button; * The `Separator` component renders a horizontal divider. * This is useful to organize and separate content. */ -const Separator = ({ className, testId = 'dialog-separator' }: DividerProps) => { +const Separator = ({ className, testId = 'dialog-separator' }: BaseComponentProps) => { return ; }; Dialog.Separator = Separator; diff --git a/src/common/components/Dialog/__stories__/Dialog.stories.tsx b/packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx similarity index 98% rename from src/common/components/Dialog/__stories__/Dialog.stories.tsx rename to packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx index d337b934..7d310b0d 100644 --- a/src/common/components/Dialog/__stories__/Dialog.stories.tsx +++ b/packages/web/src/common/components/Dialog/__stories__/Dialog.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import Dialog from '../Dialog'; -import Button from 'common/components/Button/Button'; +import Button from '@/common/components/Button/Button'; const meta = { title: 'Common/Dialog', diff --git a/src/common/components/Divider/Divider.test.tsx b/packages/web/src/common/components/Divider/Divider.test.tsx similarity index 93% rename from src/common/components/Divider/Divider.test.tsx rename to packages/web/src/common/components/Divider/Divider.test.tsx index f8df7582..49f34ba5 100644 --- a/src/common/components/Divider/Divider.test.tsx +++ b/packages/web/src/common/components/Divider/Divider.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Divider from './Divider'; diff --git a/packages/web/src/common/components/Divider/Divider.tsx b/packages/web/src/common/components/Divider/Divider.tsx new file mode 100644 index 00000000..a8f1af9e --- /dev/null +++ b/packages/web/src/common/components/Divider/Divider.tsx @@ -0,0 +1,12 @@ +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; + +/** + * The `Divider` component renders a horizontal line which visually separates + * content. + */ +const Divider = ({ className, testId = 'divider' }: BaseComponentProps) => { + return
; +}; + +export default Divider; diff --git a/src/common/components/Divider/__stories__/Divider.stories.tsx b/packages/web/src/common/components/Divider/__stories__/Divider.stories.tsx similarity index 100% rename from src/common/components/Divider/__stories__/Divider.stories.tsx rename to packages/web/src/common/components/Divider/__stories__/Divider.stories.tsx diff --git a/src/common/components/Dropdown/DropdownMenu.test.tsx b/packages/web/src/common/components/Dropdown/DropdownMenu.test.tsx similarity index 98% rename from src/common/components/Dropdown/DropdownMenu.test.tsx rename to packages/web/src/common/components/Dropdown/DropdownMenu.test.tsx index c2223a43..9c329089 100644 --- a/src/common/components/Dropdown/DropdownMenu.test.tsx +++ b/packages/web/src/common/components/Dropdown/DropdownMenu.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import DropdownMenu from './DropdownMenu'; diff --git a/src/common/components/Dropdown/DropdownMenu.tsx b/packages/web/src/common/components/Dropdown/DropdownMenu.tsx similarity index 95% rename from src/common/components/Dropdown/DropdownMenu.tsx rename to packages/web/src/common/components/Dropdown/DropdownMenu.tsx index b0ae358a..ffeac297 100644 --- a/src/common/components/Dropdown/DropdownMenu.tsx +++ b/packages/web/src/common/components/Dropdown/DropdownMenu.tsx @@ -1,10 +1,10 @@ import { createContext, PropsWithChildren, useContext, useState } from 'react'; import noop from 'lodash/noop'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; import Backdrop from '../Backdrop/Backdrop'; -import Divider, { DividerProps } from '../Divider/Divider'; +import Divider from '../Divider/Divider'; /** * Defines the properties of the DropdownMenuContext value. @@ -118,7 +118,7 @@ DropdownMenu.Content = Content; /** * Properties for the `Item` component. */ -interface ItemProps extends BaseComponentProps, PropsWithChildren { +export interface ItemProps extends BaseComponentProps, PropsWithChildren { onClick?: () => void; } @@ -167,7 +167,7 @@ DropdownMenu.Heading = Heading; * The `Separator` component renders a horizontal divider within a DropdownMenu. * This is useful to organize and separate groups of related menu items. */ -const Separator = ({ className, testId = 'dropdown-menu-separator' }: DividerProps) => { +const Separator = ({ className, testId = 'dropdown-menu-separator' }: BaseComponentProps) => { return ; }; DropdownMenu.Separator = Separator; diff --git a/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx b/packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx similarity index 93% rename from src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx rename to packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx index 2cc1ab00..c08c8e03 100644 --- a/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx +++ b/packages/web/src/common/components/Dropdown/__stories__/DropdownMenu.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import DropdownMenu from '../DropdownMenu'; -import Button from 'common/components/Button/Button'; -import FAIcon from 'common/components/Icon/FAIcon'; +import Button from '@/common/components/Button/Button'; +import FAIcon from '@/common/components/Icon/FAIcon'; const meta = { title: 'Common/Dropdown/DropdownMenu', diff --git a/src/common/components/Errors/ErrorBoundary.test.tsx b/packages/web/src/common/components/Errors/ErrorBoundary.test.tsx similarity index 96% rename from src/common/components/Errors/ErrorBoundary.test.tsx rename to packages/web/src/common/components/Errors/ErrorBoundary.test.tsx index 1c3db66c..f8a960a3 100644 --- a/src/common/components/Errors/ErrorBoundary.test.tsx +++ b/packages/web/src/common/components/Errors/ErrorBoundary.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ErrorBoundary from './ErrorBoundary'; diff --git a/src/common/components/Errors/ErrorBoundary.tsx b/packages/web/src/common/components/Errors/ErrorBoundary.tsx similarity index 100% rename from src/common/components/Errors/ErrorBoundary.tsx rename to packages/web/src/common/components/Errors/ErrorBoundary.tsx diff --git a/src/common/components/Errors/ErrorFallback.test.tsx b/packages/web/src/common/components/Errors/ErrorFallback.test.tsx similarity index 87% rename from src/common/components/Errors/ErrorFallback.test.tsx rename to packages/web/src/common/components/Errors/ErrorFallback.test.tsx index f0ace469..de8470f8 100644 --- a/src/common/components/Errors/ErrorFallback.test.tsx +++ b/packages/web/src/common/components/Errors/ErrorFallback.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ErrorFallback from './ErrorFallback'; diff --git a/src/common/components/Errors/ErrorFallback.tsx b/packages/web/src/common/components/Errors/ErrorFallback.tsx similarity index 100% rename from src/common/components/Errors/ErrorFallback.tsx rename to packages/web/src/common/components/Errors/ErrorFallback.tsx diff --git a/src/common/components/Footer/Footer.test.tsx b/packages/web/src/common/components/Footer/Footer.test.tsx similarity index 91% rename from src/common/components/Footer/Footer.test.tsx rename to packages/web/src/common/components/Footer/Footer.test.tsx index 034a2097..174af10a 100644 --- a/src/common/components/Footer/Footer.test.tsx +++ b/packages/web/src/common/components/Footer/Footer.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Footer from './Footer'; diff --git a/src/common/components/Footer/Footer.tsx b/packages/web/src/common/components/Footer/Footer.tsx similarity index 78% rename from src/common/components/Footer/Footer.tsx rename to packages/web/src/common/components/Footer/Footer.tsx index 6304cfe7..f4a81572 100644 --- a/src/common/components/Footer/Footer.tsx +++ b/packages/web/src/common/components/Footer/Footer.tsx @@ -1,15 +1,9 @@ import dayjs from 'dayjs'; import { useTranslation } from 'react-i18next'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import Link from 'common/components/Link/Link'; - -/** - * Properties for the `Footer` component. - * @see {@link BaseComponentProps} - */ -export interface FooterProps extends BaseComponentProps {} +import { cn } from '@/common/utils/css'; +import type { BaseComponentProps } from '@/common/utils/types'; +import Link from '@/common/components/Link/Link'; /** * The `Footer` React component renders the standard page footer content used @@ -17,7 +11,7 @@ export interface FooterProps extends BaseComponentProps {} * @param {FooterProps} props - Component properties, `FooterProps`. * @see {@link FooterProps} */ -const Footer = ({ className, testId = 'footer' }: FooterProps) => { +const Footer = ({ className, testId = 'footer' }: BaseComponentProps) => { const { t } = useTranslation(); const year = dayjs().format('YYYY'); diff --git a/src/common/components/Form/Checkbox.test.tsx b/packages/web/src/common/components/Form/Checkbox.test.tsx similarity index 98% rename from src/common/components/Form/Checkbox.test.tsx rename to packages/web/src/common/components/Form/Checkbox.test.tsx index a8ed0bd7..a4ffb959 100644 --- a/src/common/components/Form/Checkbox.test.tsx +++ b/packages/web/src/common/components/Form/Checkbox.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Checkbox, { CheckboxProps } from './Checkbox'; diff --git a/src/common/components/Form/Checkbox.tsx b/packages/web/src/common/components/Form/Checkbox.tsx similarity index 96% rename from src/common/components/Form/Checkbox.tsx rename to packages/web/src/common/components/Form/Checkbox.tsx index 244aecef..55eee771 100644 --- a/src/common/components/Form/Checkbox.tsx +++ b/packages/web/src/common/components/Form/Checkbox.tsx @@ -1,8 +1,8 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cva } from 'class-variance-authority'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/src/common/components/Form/FieldError.test.tsx b/packages/web/src/common/components/Form/FieldError.test.tsx similarity index 94% rename from src/common/components/Form/FieldError.test.tsx rename to packages/web/src/common/components/Form/FieldError.test.tsx index dd3cc161..3f7ffdab 100644 --- a/src/common/components/Form/FieldError.test.tsx +++ b/packages/web/src/common/components/Form/FieldError.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import FieldError from './FieldError'; diff --git a/src/common/components/Form/FieldError.tsx b/packages/web/src/common/components/Form/FieldError.tsx similarity index 87% rename from src/common/components/Form/FieldError.tsx rename to packages/web/src/common/components/Form/FieldError.tsx index 93a9f975..8904ff73 100644 --- a/src/common/components/Form/FieldError.tsx +++ b/packages/web/src/common/components/Form/FieldError.tsx @@ -1,5 +1,5 @@ -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `FieldError` component. diff --git a/src/common/components/Form/Input.test.tsx b/packages/web/src/common/components/Form/Input.test.tsx similarity index 97% rename from src/common/components/Form/Input.test.tsx rename to packages/web/src/common/components/Form/Input.test.tsx index 6622e222..64201246 100644 --- a/src/common/components/Form/Input.test.tsx +++ b/packages/web/src/common/components/Form/Input.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Input, { InputProps } from './Input'; diff --git a/src/common/components/Form/Input.tsx b/packages/web/src/common/components/Form/Input.tsx similarity index 95% rename from src/common/components/Form/Input.tsx rename to packages/web/src/common/components/Form/Input.tsx index 5f63d028..79fe2b59 100644 --- a/src/common/components/Form/Input.tsx +++ b/packages/web/src/common/components/Form/Input.tsx @@ -1,8 +1,8 @@ import { InputHTMLAttributes } from 'react'; import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { cn } from 'common/utils/css'; -import { PropsWithTestId } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { PropsWithTestId } from '@/common/utils/types'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/src/common/components/Form/Label.test.tsx b/packages/web/src/common/components/Form/Label.test.tsx similarity index 94% rename from src/common/components/Form/Label.test.tsx rename to packages/web/src/common/components/Form/Label.test.tsx index 99a37f3f..4dc47773 100644 --- a/src/common/components/Form/Label.test.tsx +++ b/packages/web/src/common/components/Form/Label.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Label from './Label'; diff --git a/src/common/components/Form/Label.tsx b/packages/web/src/common/components/Form/Label.tsx similarity index 91% rename from src/common/components/Form/Label.tsx rename to packages/web/src/common/components/Form/Label.tsx index 433f33de..e64969c3 100644 --- a/src/common/components/Form/Label.tsx +++ b/packages/web/src/common/components/Form/Label.tsx @@ -1,8 +1,8 @@ import { LabelHTMLAttributes } from 'react'; import { cva } from 'class-variance-authority'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Define the `Label` component base and variant styles. diff --git a/src/common/components/Form/RadioGroup.test.tsx b/packages/web/src/common/components/Form/RadioGroup.test.tsx similarity index 98% rename from src/common/components/Form/RadioGroup.test.tsx rename to packages/web/src/common/components/Form/RadioGroup.test.tsx index 956f0d2d..b03d26cf 100644 --- a/src/common/components/Form/RadioGroup.test.tsx +++ b/packages/web/src/common/components/Form/RadioGroup.test.tsx @@ -4,7 +4,7 @@ import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import RadioGroup, { RadioGroupProps } from './RadioGroup'; diff --git a/src/common/components/Form/RadioGroup.tsx b/packages/web/src/common/components/Form/RadioGroup.tsx similarity index 98% rename from src/common/components/Form/RadioGroup.tsx rename to packages/web/src/common/components/Form/RadioGroup.tsx index a531f0f2..5a3d9861 100644 --- a/src/common/components/Form/RadioGroup.tsx +++ b/packages/web/src/common/components/Form/RadioGroup.tsx @@ -3,8 +3,8 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; import { cva } from 'class-variance-authority'; import noop from 'lodash/noop'; -import { PropsWithTestId } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { PropsWithTestId } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/src/common/components/Form/SearchInput.test.tsx b/packages/web/src/common/components/Form/SearchInput.test.tsx similarity index 97% rename from src/common/components/Form/SearchInput.test.tsx rename to packages/web/src/common/components/Form/SearchInput.test.tsx index 97b2596e..4853925e 100644 --- a/src/common/components/Form/SearchInput.test.tsx +++ b/packages/web/src/common/components/Form/SearchInput.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import userEvent from '@testing-library/user-event'; import SearchResult from './SearchResult'; diff --git a/src/common/components/Form/SearchInput.tsx b/packages/web/src/common/components/Form/SearchInput.tsx similarity index 95% rename from src/common/components/Form/SearchInput.tsx rename to packages/web/src/common/components/Form/SearchInput.tsx index 6ade63c2..9f6cf489 100644 --- a/src/common/components/Form/SearchInput.tsx +++ b/packages/web/src/common/components/Form/SearchInput.tsx @@ -1,8 +1,8 @@ import { ChangeEvent, type JSX, useEffect, useRef } from 'react'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import FAIcon from 'common/components/Icon/FAIcon'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import FAIcon from '@/common/components/Icon/FAIcon'; /** * Properties for the `SearchInput` React component. diff --git a/src/common/components/Form/SearchResult.test.tsx b/packages/web/src/common/components/Form/SearchResult.test.tsx similarity index 96% rename from src/common/components/Form/SearchResult.test.tsx rename to packages/web/src/common/components/Form/SearchResult.test.tsx index 5aeca2cc..c6131f8e 100644 --- a/src/common/components/Form/SearchResult.test.tsx +++ b/packages/web/src/common/components/Form/SearchResult.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import userEvent from '@testing-library/user-event'; import SearchResult from './SearchResult'; diff --git a/src/common/components/Form/SearchResult.tsx b/packages/web/src/common/components/Form/SearchResult.tsx similarity index 91% rename from src/common/components/Form/SearchResult.tsx rename to packages/web/src/common/components/Form/SearchResult.tsx index da057491..85d038d8 100644 --- a/src/common/components/Form/SearchResult.tsx +++ b/packages/web/src/common/components/Form/SearchResult.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * Properties for the `SearchResult` React component. diff --git a/src/common/components/Form/Select.test.tsx b/packages/web/src/common/components/Form/Select.test.tsx similarity index 99% rename from src/common/components/Form/Select.test.tsx rename to packages/web/src/common/components/Form/Select.test.tsx index 046702be..184018fd 100644 --- a/src/common/components/Form/Select.test.tsx +++ b/packages/web/src/common/components/Form/Select.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import Select, { SelectProps } from './Select'; diff --git a/src/common/components/Form/Select.tsx b/packages/web/src/common/components/Form/Select.tsx similarity index 97% rename from src/common/components/Form/Select.tsx rename to packages/web/src/common/components/Form/Select.tsx index 5bf6ae95..b567b7d5 100644 --- a/src/common/components/Form/Select.tsx +++ b/packages/web/src/common/components/Form/Select.tsx @@ -2,14 +2,14 @@ import { createContext, PropsWithChildren, useContext, useEffect, useState } fro import { Control, FieldValues, Path, useController } from 'react-hook-form'; import noop from 'lodash/noop'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; import FAIcon, { FAIconProps } from '../Icon/FAIcon'; import Backdrop from '../Backdrop/Backdrop'; -import Divider, { DividerProps } from '../Divider/Divider'; +import Divider from '../Divider/Divider'; /** * The type of value for the select form control. @@ -287,7 +287,7 @@ Select.Heading = Heading; * The `Separator` component renders a horizontal divider within Select Options. * This is useful to organize and separate groups of related options. */ -const Separator = ({ className, testId = 'select-separator' }: DividerProps) => { +const Separator = ({ className, testId = 'select-separator' }: BaseComponentProps) => { return ; }; Select.Separator = Separator; diff --git a/src/common/components/Form/Textarea.test.tsx b/packages/web/src/common/components/Form/Textarea.test.tsx similarity index 97% rename from src/common/components/Form/Textarea.test.tsx rename to packages/web/src/common/components/Form/Textarea.test.tsx index 16e5193e..892bca03 100644 --- a/src/common/components/Form/Textarea.test.tsx +++ b/packages/web/src/common/components/Form/Textarea.test.tsx @@ -4,7 +4,7 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Textarea, { TextareaProps } from './Textarea'; diff --git a/src/common/components/Form/Textarea.tsx b/packages/web/src/common/components/Form/Textarea.tsx similarity index 95% rename from src/common/components/Form/Textarea.tsx rename to packages/web/src/common/components/Form/Textarea.tsx index 2bc14b3d..6caacb89 100644 --- a/src/common/components/Form/Textarea.tsx +++ b/packages/web/src/common/components/Form/Textarea.tsx @@ -1,8 +1,8 @@ import { TextareaHTMLAttributes } from 'react'; import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import Label from './Label'; import FieldError from './FieldError'; import HelpText from '../Text/HelpText'; diff --git a/src/common/components/Form/Toggle.test.tsx b/packages/web/src/common/components/Form/Toggle.test.tsx similarity index 97% rename from src/common/components/Form/Toggle.test.tsx rename to packages/web/src/common/components/Form/Toggle.test.tsx index 32f4933a..44b84376 100644 --- a/src/common/components/Form/Toggle.test.tsx +++ b/packages/web/src/common/components/Form/Toggle.test.tsx @@ -4,7 +4,7 @@ import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Toggle, { ToggleProps } from './Toggle'; diff --git a/src/common/components/Form/Toggle.tsx b/packages/web/src/common/components/Form/Toggle.tsx similarity index 95% rename from src/common/components/Form/Toggle.tsx rename to packages/web/src/common/components/Form/Toggle.tsx index 350e6870..da88f5df 100644 --- a/src/common/components/Form/Toggle.tsx +++ b/packages/web/src/common/components/Form/Toggle.tsx @@ -1,7 +1,7 @@ import { Control, FieldValues, Path, useController } from 'react-hook-form'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; import FAIcon from '../Icon/FAIcon'; import Label from './Label'; import FieldError from './FieldError'; diff --git a/src/common/components/Form/__stories__/Checkbox.stories.tsx b/packages/web/src/common/components/Form/__stories__/Checkbox.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/Checkbox.stories.tsx rename to packages/web/src/common/components/Form/__stories__/Checkbox.stories.tsx diff --git a/src/common/components/Form/__stories__/FieldError.stories.tsx b/packages/web/src/common/components/Form/__stories__/FieldError.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/FieldError.stories.tsx rename to packages/web/src/common/components/Form/__stories__/FieldError.stories.tsx diff --git a/src/common/components/Form/__stories__/Input.stories.tsx b/packages/web/src/common/components/Form/__stories__/Input.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/Input.stories.tsx rename to packages/web/src/common/components/Form/__stories__/Input.stories.tsx diff --git a/src/common/components/Form/__stories__/Label.stories.tsx b/packages/web/src/common/components/Form/__stories__/Label.stories.tsx similarity index 94% rename from src/common/components/Form/__stories__/Label.stories.tsx rename to packages/web/src/common/components/Form/__stories__/Label.stories.tsx index b0930793..6b1f5783 100644 --- a/src/common/components/Form/__stories__/Label.stories.tsx +++ b/packages/web/src/common/components/Form/__stories__/Label.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import FAIcon from 'common/components/Icon/FAIcon'; +import FAIcon from '@/common/components/Icon/FAIcon'; import Label from '../Label'; diff --git a/src/common/components/Form/__stories__/RadioGroup.stories.tsx b/packages/web/src/common/components/Form/__stories__/RadioGroup.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/RadioGroup.stories.tsx rename to packages/web/src/common/components/Form/__stories__/RadioGroup.stories.tsx diff --git a/src/common/components/Form/__stories__/SearchInput.stories.tsx b/packages/web/src/common/components/Form/__stories__/SearchInput.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/SearchInput.stories.tsx rename to packages/web/src/common/components/Form/__stories__/SearchInput.stories.tsx diff --git a/src/common/components/Form/__stories__/Select.stories.tsx b/packages/web/src/common/components/Form/__stories__/Select.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/Select.stories.tsx rename to packages/web/src/common/components/Form/__stories__/Select.stories.tsx diff --git a/src/common/components/Form/__stories__/Textarea.stories.tsx b/packages/web/src/common/components/Form/__stories__/Textarea.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/Textarea.stories.tsx rename to packages/web/src/common/components/Form/__stories__/Textarea.stories.tsx diff --git a/src/common/components/Form/__stories__/Toggle.stories.tsx b/packages/web/src/common/components/Form/__stories__/Toggle.stories.tsx similarity index 100% rename from src/common/components/Form/__stories__/Toggle.stories.tsx rename to packages/web/src/common/components/Form/__stories__/Toggle.stories.tsx diff --git a/src/common/components/Header/AppMenu.test.tsx b/packages/web/src/common/components/Header/AppMenu.test.tsx similarity index 87% rename from src/common/components/Header/AppMenu.test.tsx rename to packages/web/src/common/components/Header/AppMenu.test.tsx index cff3f6ed..659d456c 100644 --- a/src/common/components/Header/AppMenu.test.tsx +++ b/packages/web/src/common/components/Header/AppMenu.test.tsx @@ -1,12 +1,12 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; -import { queryClient } from 'test/query-client'; +import { render, screen } from '@/test/test-utils'; +import { queryClient } from '@/test/query-client'; import { UseQueryResult } from '@tanstack/react-query'; -import { User } from 'common/api/useGetUser'; -import * as UseAuth from 'common/hooks/useAuth'; -import * as UseGetCurrentUser from 'common/api/useGetCurrentUser'; -import { userFixture1 } from '__fixtures__/users'; +import { User } from '@/common/api/useGetUser'; +import * as UseAuth from '@/common/hooks/useAuth'; +import * as UseGetCurrentUser from '@/common/api/useGetCurrentUser'; +import { userFixture1 } from '@/__fixtures__/users'; import AppMenu from './AppMenu'; diff --git a/src/common/components/Header/AppMenu.tsx b/packages/web/src/common/components/Header/AppMenu.tsx similarity index 79% rename from src/common/components/Header/AppMenu.tsx rename to packages/web/src/common/components/Header/AppMenu.tsx index 3a214fc9..7beb7ed9 100644 --- a/src/common/components/Header/AppMenu.tsx +++ b/packages/web/src/common/components/Header/AppMenu.tsx @@ -1,25 +1,19 @@ -import { useAuth } from 'common/hooks/useAuth'; -import { useGetCurrentUser } from 'common/api/useGetCurrentUser'; import { useTranslation } from 'react-i18next'; -import logo from 'assets/img/logo.png'; -import SideMenu, { SideMenuProps } from 'common/components/Menu/SideMenu/SideMenu'; -import MenuNavLink from 'common/components/Menu/MenuNavLink'; -import Avatar from 'common/components/Icon/Avatar'; -import MenuSeparator from 'common/components/Menu/MenuSeparator'; - -/** - * Properties fro the `AppMenu` component. - * @see {@see SideMenuProps} - */ -export interface AppMenuProps extends Omit {} +import { useAuth } from '@/common/hooks/useAuth'; +import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; +import logo from '@/assets/img/logo.png'; +import SideMenu, { SideMenuProps } from '@/common/components/Menu/SideMenu/SideMenu'; +import MenuNavLink from '@/common/components/Menu/MenuNavLink'; +import Avatar from '@/common/components/Icon/Avatar'; +import MenuSeparator from '@/common/components/Menu/MenuSeparator'; /** * The `AppMenu` component a `SideMenu` which contains application menu * items. The `AppMenu` is typically rendered at small media breakpoints. * @param {AppMenuProps} props - Component properties, `AppMenuProps`. */ -const AppMenu = ({ side = 'right', testId = 'menu-app', ...props }: AppMenuProps) => { +const AppMenu = ({ side = 'right', testId = 'menu-app', ...props }: Omit) => { const { t } = useTranslation(); const { isAuthenticated } = useAuth(); const { data: user } = useGetCurrentUser(); diff --git a/src/common/components/Header/Header.test.tsx b/packages/web/src/common/components/Header/Header.test.tsx similarity index 95% rename from src/common/components/Header/Header.test.tsx rename to packages/web/src/common/components/Header/Header.test.tsx index 1c124c9b..7846cdcb 100644 --- a/src/common/components/Header/Header.test.tsx +++ b/packages/web/src/common/components/Header/Header.test.tsx @@ -2,9 +2,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; import { Route, Routes } from 'react-router-dom'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import * as UseAuth from 'common/hooks/useAuth'; +import * as UseAuth from '@/common/hooks/useAuth'; import Header from './Header'; diff --git a/src/common/components/Header/Header.tsx b/packages/web/src/common/components/Header/Header.tsx similarity index 60% rename from src/common/components/Header/Header.tsx rename to packages/web/src/common/components/Header/Header.tsx index 9aacf855..a08e69e8 100644 --- a/src/common/components/Header/Header.tsx +++ b/packages/web/src/common/components/Header/Header.tsx @@ -1,25 +1,19 @@ import { Link } from 'react-router-dom'; -import { PropsWithTestId } from 'common/utils/types'; -import { useAuth } from 'common/hooks/useAuth'; -import logo from 'assets/img/logo.png'; -import ThemeToggle from 'common/components/Button/ThemeToggle'; +import { PropsWithTestId } from '@/common/utils/types'; +import { useAuth } from '@/common/hooks/useAuth'; +import logo from '@/assets/img/logo.png'; +import ThemeToggle from '@/common/components/Button/ThemeToggle'; import AppMenu from './AppMenu'; -import MenuButton from 'common/components/Menu/MenuButton'; -import LanguageToggle from 'common/components/Button/LanguageToggle'; - -/** - * Properties for the `Header` component. - * @see {@link PropsWithTestId} - */ -export interface HeaderProps extends PropsWithTestId {} +import MenuButton from '@/common/components/Menu/MenuButton'; +import LanguageToggle from '@/common/components/Button/LanguageToggle'; /** * The `Header` React component renders a top navigation bar for pages. * @param {HeaderProps} [props] - Component properties, `HeaderProps`. * @see {@link HeaderProps} */ -const Header = ({ testId = 'header' }: HeaderProps) => { +const Header = ({ testId = 'header' }: PropsWithTestId) => { const { isAuthenticated } = useAuth(); return ( diff --git a/src/common/components/Icon/Avatar.test.tsx b/packages/web/src/common/components/Icon/Avatar.test.tsx similarity index 96% rename from src/common/components/Icon/Avatar.test.tsx rename to packages/web/src/common/components/Icon/Avatar.test.tsx index d40d2af3..374a208e 100644 --- a/src/common/components/Icon/Avatar.test.tsx +++ b/packages/web/src/common/components/Icon/Avatar.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Avatar from './Avatar'; diff --git a/src/common/components/Icon/Avatar.tsx b/packages/web/src/common/components/Icon/Avatar.tsx similarity index 95% rename from src/common/components/Icon/Avatar.tsx rename to packages/web/src/common/components/Icon/Avatar.tsx index 639af542..82d7856d 100644 --- a/src/common/components/Icon/Avatar.tsx +++ b/packages/web/src/common/components/Icon/Avatar.tsx @@ -1,5 +1,5 @@ -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `Avatar` component. diff --git a/src/common/components/Icon/FAIcon.test.tsx b/packages/web/src/common/components/Icon/FAIcon.test.tsx similarity index 88% rename from src/common/components/Icon/FAIcon.test.tsx rename to packages/web/src/common/components/Icon/FAIcon.test.tsx index e6eba95e..8f588ce5 100644 --- a/src/common/components/Icon/FAIcon.test.tsx +++ b/packages/web/src/common/components/Icon/FAIcon.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import FAIcon from './FAIcon'; diff --git a/src/common/components/Icon/FAIcon.tsx b/packages/web/src/common/components/Icon/FAIcon.tsx similarity index 97% rename from src/common/components/Icon/FAIcon.tsx rename to packages/web/src/common/components/Icon/FAIcon.tsx index 865d1813..1edaaee3 100644 --- a/src/common/components/Icon/FAIcon.tsx +++ b/packages/web/src/common/components/Icon/FAIcon.tsx @@ -41,8 +41,8 @@ import { faXmark, } from '@fortawesome/free-solid-svg-icons'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * A union type of all Font Awesome icon names (without the `fa-` prefix) diff --git a/src/common/components/Icon/__stories__/Avatar.stories.tsx b/packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx similarity index 95% rename from src/common/components/Icon/__stories__/Avatar.stories.tsx rename to packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx index d79343ff..82175012 100644 --- a/src/common/components/Icon/__stories__/Avatar.stories.tsx +++ b/packages/web/src/common/components/Icon/__stories__/Avatar.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import image from 'assets/img/logo.png'; +import image from '@/assets/img/logo.png'; import Avatar from '../Avatar'; diff --git a/src/common/components/Icon/__stories__/FAIcon.stories.tsx b/packages/web/src/common/components/Icon/__stories__/FAIcon.stories.tsx similarity index 100% rename from src/common/components/Icon/__stories__/FAIcon.stories.tsx rename to packages/web/src/common/components/Icon/__stories__/FAIcon.stories.tsx diff --git a/src/common/components/Layout/StandardLayout.test.tsx b/packages/web/src/common/components/Layout/StandardLayout.test.tsx similarity index 87% rename from src/common/components/Layout/StandardLayout.test.tsx rename to packages/web/src/common/components/Layout/StandardLayout.test.tsx index a1238959..510ba006 100644 --- a/src/common/components/Layout/StandardLayout.test.tsx +++ b/packages/web/src/common/components/Layout/StandardLayout.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import StandardLayout from './StandardLayout'; diff --git a/src/common/components/Layout/StandardLayout.tsx b/packages/web/src/common/components/Layout/StandardLayout.tsx similarity index 50% rename from src/common/components/Layout/StandardLayout.tsx rename to packages/web/src/common/components/Layout/StandardLayout.tsx index 78df3c0c..d379863d 100644 --- a/src/common/components/Layout/StandardLayout.tsx +++ b/packages/web/src/common/components/Layout/StandardLayout.tsx @@ -1,22 +1,16 @@ import { Outlet } from 'react-router-dom'; -import { BaseComponentProps } from 'common/utils/types'; -import Header from 'common/components/Header/Header'; -import Footer from 'common/components/Footer/Footer'; -import Toasts from 'common/components/Toast/Toasts'; - -/** - * Properties for the `StandardLayout` component. - * @see {@link BaseComponentProps} - */ -export interface StandardLayoutProps extends BaseComponentProps {} +import { BaseComponentProps } from '@/common/utils/types'; +import Header from '@/common/components/Header/Header'; +import Footer from '@/common/components/Footer/Footer'; +import Toasts from '@/common/components/Toast/Toasts'; /** * The `StandardLayout` React component renders the standard page layout. It * renders a `Header` and `Footer` and provides an `Outlet` for the router. - * @param [props] - Component properties, `StandardLayoutProps`. + * @param [props] - Component properties, `BaseComponentProps`. */ -const StandardLayout = ({ className, testId = 'layout-standard' }: StandardLayoutProps) => { +const StandardLayout = ({ className, testId = 'layout-standard' }: BaseComponentProps) => { return (
diff --git a/src/common/components/Link/Link.test.tsx b/packages/web/src/common/components/Link/Link.test.tsx similarity index 92% rename from src/common/components/Link/Link.test.tsx rename to packages/web/src/common/components/Link/Link.test.tsx index ebe643c9..4e0ce847 100644 --- a/src/common/components/Link/Link.test.tsx +++ b/packages/web/src/common/components/Link/Link.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Link from './Link'; diff --git a/src/common/components/Link/Link.tsx b/packages/web/src/common/components/Link/Link.tsx similarity index 89% rename from src/common/components/Link/Link.tsx rename to packages/web/src/common/components/Link/Link.tsx index c3ad7b42..f1a91eae 100644 --- a/src/common/components/Link/Link.tsx +++ b/packages/web/src/common/components/Link/Link.tsx @@ -1,7 +1,7 @@ import { Link as RouterLink, LinkProps as RouterLinkProps } from 'react-router-dom'; -import { cn } from 'common/utils/css'; -import { PropsWithTestId } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { PropsWithTestId } from '@/common/utils/types'; /** * Properties for the `Link` component. diff --git a/src/common/components/Link/__stories__/Link.stories.tsx b/packages/web/src/common/components/Link/__stories__/Link.stories.tsx similarity index 100% rename from src/common/components/Link/__stories__/Link.stories.tsx rename to packages/web/src/common/components/Link/__stories__/Link.stories.tsx diff --git a/src/common/components/Loader/LoaderSuspense.test.tsx b/packages/web/src/common/components/Loader/LoaderSuspense.test.tsx similarity index 80% rename from src/common/components/Loader/LoaderSuspense.test.tsx rename to packages/web/src/common/components/Loader/LoaderSuspense.test.tsx index 90ba66bf..8b14b549 100644 --- a/src/common/components/Loader/LoaderSuspense.test.tsx +++ b/packages/web/src/common/components/Loader/LoaderSuspense.test.tsx @@ -1,8 +1,8 @@ import { lazy } from 'react'; import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; -const Text = lazy(() => import('common/components/Text/Text')); +import { render, screen } from '@/test/test-utils'; +const Text = lazy(() => import('@/common/components/Text/Text')); import LoaderSuspense from './LoaderSuspense'; diff --git a/src/common/components/Loader/LoaderSuspense.tsx b/packages/web/src/common/components/Loader/LoaderSuspense.tsx similarity index 100% rename from src/common/components/Loader/LoaderSuspense.tsx rename to packages/web/src/common/components/Loader/LoaderSuspense.tsx diff --git a/src/common/components/Loader/Skeleton.test.tsx b/packages/web/src/common/components/Loader/Skeleton.test.tsx similarity index 93% rename from src/common/components/Loader/Skeleton.test.tsx rename to packages/web/src/common/components/Loader/Skeleton.test.tsx index d1e3f468..6c5acd5b 100644 --- a/src/common/components/Loader/Skeleton.test.tsx +++ b/packages/web/src/common/components/Loader/Skeleton.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Skeleton from './Skeleton'; diff --git a/src/common/components/Loader/Skeleton.tsx b/packages/web/src/common/components/Loader/Skeleton.tsx similarity index 54% rename from src/common/components/Loader/Skeleton.tsx rename to packages/web/src/common/components/Loader/Skeleton.tsx index e81c2385..dde953fe 100644 --- a/src/common/components/Loader/Skeleton.tsx +++ b/packages/web/src/common/components/Loader/Skeleton.tsx @@ -1,16 +1,11 @@ -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; - -/** - * Properties for the `Skeleton` component. - */ -export interface SkeletonProps extends BaseComponentProps {} +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * The `Skeleton` component renders an animated loader which pulses * faintly. Typically used when initially loading some data asynchronously. */ -const Skeleton = ({ className, testId = 'skeleton' }: SkeletonProps) => { +const Skeleton = ({ className, testId = 'skeleton' }: BaseComponentProps) => { return (
{ + return
; +}; + +export default MenuSeparator; diff --git a/src/common/components/Menu/SideMenu/SideMenu.test.tsx b/packages/web/src/common/components/Menu/SideMenu/SideMenu.test.tsx similarity index 98% rename from src/common/components/Menu/SideMenu/SideMenu.test.tsx rename to packages/web/src/common/components/Menu/SideMenu/SideMenu.test.tsx index 9b636ee9..e07d0516 100644 --- a/src/common/components/Menu/SideMenu/SideMenu.test.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/SideMenu.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import userEvent from '@testing-library/user-event'; import SideMenu from './SideMenu'; diff --git a/src/common/components/Menu/SideMenu/SideMenu.tsx b/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx similarity index 96% rename from src/common/components/Menu/SideMenu/SideMenu.tsx rename to packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx index 1de8c3de..004b7cce 100644 --- a/src/common/components/Menu/SideMenu/SideMenu.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/SideMenu.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren, ReactNode } from 'react'; import { animated, useSpring } from '@react-spring/web'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import { MenuProps } from '../Menu'; import SideMenuHeader from './SideMenuHeader'; diff --git a/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx b/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx similarity index 97% rename from src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx rename to packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx index dba61e14..c4a8a4fe 100644 --- a/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import userEvent from '@testing-library/user-event'; import SideMenuHeader from './SideMenuHeader'; diff --git a/src/common/components/Menu/SideMenu/SideMenuHeader.tsx b/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx similarity index 92% rename from src/common/components/Menu/SideMenu/SideMenuHeader.tsx rename to packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx index b2cf0c0b..7c2662f9 100644 --- a/src/common/components/Menu/SideMenu/SideMenuHeader.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/SideMenuHeader.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import MenuCloseButton from '../MenuCloseButton'; /** diff --git a/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx b/packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx similarity index 97% rename from src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx rename to packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx index 8cca4518..965057e8 100644 --- a/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx +++ b/packages/web/src/common/components/Menu/SideMenu/__stories__/SideMenu.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { MemoryRouter } from 'react-router-dom'; -import Avatar from 'common/components/Icon/Avatar'; +import Avatar from '@/common/components/Icon/Avatar'; import MenuNavLink from '../../MenuNavLink'; import MenuSeparator from '../../MenuSeparator'; diff --git a/src/common/components/Popover/Popover.test.tsx b/packages/web/src/common/components/Popover/Popover.test.tsx similarity index 99% rename from src/common/components/Popover/Popover.test.tsx rename to packages/web/src/common/components/Popover/Popover.test.tsx index 5f035f26..5959c0f8 100644 --- a/src/common/components/Popover/Popover.test.tsx +++ b/packages/web/src/common/components/Popover/Popover.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import Popover from './Popover'; diff --git a/src/common/components/Popover/Popover.tsx b/packages/web/src/common/components/Popover/Popover.tsx similarity index 98% rename from src/common/components/Popover/Popover.tsx rename to packages/web/src/common/components/Popover/Popover.tsx index 6198ddc5..3c524a0b 100644 --- a/src/common/components/Popover/Popover.tsx +++ b/packages/web/src/common/components/Popover/Popover.tsx @@ -1,8 +1,8 @@ import { createContext, PropsWithChildren, useContext, useEffect, useMemo, useRef, useState } from 'react'; import noop from 'lodash/noop'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import Backdrop from '../Backdrop/Backdrop'; /** diff --git a/src/common/components/Router/PrivateOutlet.test.tsx b/packages/web/src/common/components/Router/PrivateOutlet.test.tsx similarity index 95% rename from src/common/components/Router/PrivateOutlet.test.tsx rename to packages/web/src/common/components/Router/PrivateOutlet.test.tsx index bb0fa12c..484f2e3f 100644 --- a/src/common/components/Router/PrivateOutlet.test.tsx +++ b/packages/web/src/common/components/Router/PrivateOutlet.test.tsx @@ -1,8 +1,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Navigate, Route, Routes } from 'react-router-dom'; -import { render, screen } from 'test/test-utils'; -import * as UseAuth from 'common/hooks/useAuth'; +import { render, screen } from '@/test/test-utils'; +import * as UseAuth from '@/common/hooks/useAuth'; import PrivateOutlet from './PrivateOutlet'; diff --git a/src/common/components/Router/PrivateOutlet.tsx b/packages/web/src/common/components/Router/PrivateOutlet.tsx similarity index 92% rename from src/common/components/Router/PrivateOutlet.tsx rename to packages/web/src/common/components/Router/PrivateOutlet.tsx index a0e45adb..9f719ebd 100644 --- a/src/common/components/Router/PrivateOutlet.tsx +++ b/packages/web/src/common/components/Router/PrivateOutlet.tsx @@ -1,6 +1,6 @@ import { Navigate, Outlet } from 'react-router-dom'; -import { useAuth } from 'common/hooks/useAuth'; +import { useAuth } from '@/common/hooks/useAuth'; /** * The `PrivateOutlet` determines if the user is authenticated. It is typically diff --git a/src/common/components/Router/Router.tsx b/packages/web/src/common/components/Router/Router.tsx similarity index 62% rename from src/common/components/Router/Router.tsx rename to packages/web/src/common/components/Router/Router.tsx index c25cf7a9..d96dae1b 100644 --- a/src/common/components/Router/Router.tsx +++ b/packages/web/src/common/components/Router/Router.tsx @@ -1,67 +1,66 @@ -/* eslint-disable react-refresh/only-export-components */ import { lazy } from 'react'; import { Navigate, RouteObject, createBrowserRouter } from 'react-router-dom'; -import { withSuspense } from 'common/utils/suspense'; -import StandardLayout from 'common/components/Layout/StandardLayout'; -import ErrorPage from 'pages/Error/ErrorPage'; +import { withSuspense } from '@/common/utils/suspense'; +import StandardLayout from '@/common/components/Layout/StandardLayout'; +import ErrorPage from '@/pages/Error/ErrorPage'; import PrivateOutlet from './PrivateOutlet'; // Landing Page Family -import LandingPage from 'pages/Landing/LandingPage'; +import LandingPage from '@/pages/Landing/LandingPage'; // Auth Page Family -const SigninPage = lazy(() => import('pages/Auth/Signin/SigninPage')); -const SignoutPage = lazy(() => import('pages/Auth/Signout/SignoutPage')); +const SigninPage = lazy(() => import('@/pages/Auth/Signin/SigninPage')); +const SignoutPage = lazy(() => import('@/pages/Auth/Signout/SignoutPage')); // Settings Page Family -const SettingsPage = lazy(() => import('pages/Settings/SettingsPage')); -const AppearanceSettings = lazy(() => import('pages/Settings/components/AppearanceSettings')); +const SettingsPage = lazy(() => import('@/pages/Settings/SettingsPage')); +const AppearanceSettings = lazy(() => import('@/pages/Settings/components/AppearanceSettings')); // Components Page Family -const ComponentsPage = lazy(() => import('pages/Components/ComponentsPage')); -const AccordionComponents = lazy(() => import('pages/Components/components/AccordionComponents')); -const AlertComponents = lazy(() => import('pages/Components/components/AlertComponents')); -const AvatarComponents = lazy(() => import('pages/Components/components/AvatarComponents')); -const BadgeComponents = lazy(() => import('pages/Components/components/BadgeComponents')); -const BreadcrumbsComponents = lazy(() => import('pages/Components/components/BreadcrumbsComponents')); -const ButtonComponents = lazy(() => import('pages/Components/components/ButtonComponents')); -const CardComponents = lazy(() => import('pages/Components/components/CardComponents')); -const CheckboxComponents = lazy(() => import('pages/Components/components/CheckboxComponents')); -const ColumnComponents = lazy(() => import('pages/Components/components/ColumnsComponents')); -const ContainerComponents = lazy(() => import('pages/Components/components/ContainerComponents')); -const DialogComponents = lazy(() => import('pages/Components/components/DialogComponents')); -const DividerComponents = lazy(() => import('pages/Components/components/DividerComponents')); -const DropdownComponents = lazy(() => import('pages/Components/components/DropdownComponents')); -const HeadingComponents = lazy(() => import('pages/Components/components/HeadingComponents')); -const HelpTextComponents = lazy(() => import('pages/Components/components/HelpTextComponents')); -const IconComponents = lazy(() => import('pages/Components/components/IconComponents')); -const InputComponents = lazy(() => import('pages/Components/components/InputComponents')); -const LabelComponents = lazy(() => import('pages/Components/components/LabelComponents')); -const LinkComponents = lazy(() => import('pages/Components/components/LinkComponents')); -const PageComponents = lazy(() => import('pages/Components/components/PageComponents')); -const PopoverComponents = lazy(() => import('pages/Components/components/PopoverComponents')); -const RadioGroupComponents = lazy(() => import('pages/Components/components/RadioGroupComponents')); -const SearchInputComponents = lazy(() => import('pages/Components/components/SearchInputComponents')); -const SelectComponents = lazy(() => import('pages/Components/components/SelectComponents')); -const SkeletonComponents = lazy(() => import('pages/Components/components/SkeletonComponents')); -const SpinnerComponents = lazy(() => import('pages/Components/components/SpinnerComponents')); -const TableComponents = lazy(() => import('pages/Components/components/TableComponents')); -const TabsComponents = lazy(() => import('pages/Components/components/TabsComponents')); -const TextComponents = lazy(() => import('pages/Components/components/TextComponents')); -const TextareaComponents = lazy(() => import('pages/Components/components/TextareaComponents')); -const ToastComponents = lazy(() => import('pages/Components/components/ToastComponents')); -const ToggleComponents = lazy(() => import('pages/Components/components/ToggleComponents')); +const ComponentsPage = lazy(() => import('@/pages/Components/ComponentsPage')); +const AccordionComponents = lazy(() => import('@/pages/Components/components/AccordionComponents')); +const AlertComponents = lazy(() => import('@/pages/Components/components/AlertComponents')); +const AvatarComponents = lazy(() => import('@/pages/Components/components/AvatarComponents')); +const BadgeComponents = lazy(() => import('@/pages/Components/components/BadgeComponents')); +const BreadcrumbsComponents = lazy(() => import('@/pages/Components/components/BreadcrumbsComponents')); +const ButtonComponents = lazy(() => import('@/pages/Components/components/ButtonComponents')); +const CardComponents = lazy(() => import('@/pages/Components/components/CardComponents')); +const CheckboxComponents = lazy(() => import('@/pages/Components/components/CheckboxComponents')); +const ColumnComponents = lazy(() => import('@/pages/Components/components/ColumnsComponents')); +const ContainerComponents = lazy(() => import('@/pages/Components/components/ContainerComponents')); +const DialogComponents = lazy(() => import('@/pages/Components/components/DialogComponents')); +const DividerComponents = lazy(() => import('@/pages/Components/components/DividerComponents')); +const DropdownComponents = lazy(() => import('@/pages/Components/components/DropdownComponents')); +const HeadingComponents = lazy(() => import('@/pages/Components/components/HeadingComponents')); +const HelpTextComponents = lazy(() => import('@/pages/Components/components/HelpTextComponents')); +const IconComponents = lazy(() => import('@/pages/Components/components/IconComponents')); +const InputComponents = lazy(() => import('@/pages/Components/components/InputComponents')); +const LabelComponents = lazy(() => import('@/pages/Components/components/LabelComponents')); +const LinkComponents = lazy(() => import('@/pages/Components/components/LinkComponents')); +const PageComponents = lazy(() => import('@/pages/Components/components/PageComponents')); +const PopoverComponents = lazy(() => import('@/pages/Components/components/PopoverComponents')); +const RadioGroupComponents = lazy(() => import('@/pages/Components/components/RadioGroupComponents')); +const SearchInputComponents = lazy(() => import('@/pages/Components/components/SearchInputComponents')); +const SelectComponents = lazy(() => import('@/pages/Components/components/SelectComponents')); +const SkeletonComponents = lazy(() => import('@/pages/Components/components/SkeletonComponents')); +const SpinnerComponents = lazy(() => import('@/pages/Components/components/SpinnerComponents')); +const TableComponents = lazy(() => import('@/pages/Components/components/TableComponents')); +const TabsComponents = lazy(() => import('@/pages/Components/components/TabsComponents')); +const TextComponents = lazy(() => import('@/pages/Components/components/TextComponents')); +const TextareaComponents = lazy(() => import('@/pages/Components/components/TextareaComponents')); +const ToastComponents = lazy(() => import('@/pages/Components/components/ToastComponents')); +const ToggleComponents = lazy(() => import('@/pages/Components/components/ToggleComponents')); // About Page Family -const AboutPage = lazy(() => import('pages/About/AboutPage')); +const AboutPage = lazy(() => import('@/pages/About/AboutPage')); // Tasks Page Family -const TasksPage = lazy(() => import('pages/Tasks/TasksPage')); -const TaskListLayout = lazy(() => import('pages/Tasks/components/TaskListLayout')); -const TaskDetailLayout = lazy(() => import('pages/Tasks/components/TaskDetailLayout')); -const TaskAdd = lazy(() => import('pages/Tasks/components/Add/TaskAdd')); -const TaskEdit = lazy(() => import('pages/Tasks/components/Edit/TaskEdit')); +const TasksPage = lazy(() => import('@/pages/Tasks/TasksPage')); +const TaskListLayout = lazy(() => import('@/pages/Tasks/components/TaskListLayout')); +const TaskDetailLayout = lazy(() => import('@/pages/Tasks/components/TaskDetailLayout')); +const TaskAdd = lazy(() => import('@/pages/Tasks/components/Add/TaskAdd')); +const TaskEdit = lazy(() => import('@/pages/Tasks/components/Edit/TaskEdit')); /** * The React Router configuration. An array of `RouteObject`. diff --git a/src/common/components/Table/Table.test.tsx b/packages/web/src/common/components/Table/Table.test.tsx similarity index 97% rename from src/common/components/Table/Table.test.tsx rename to packages/web/src/common/components/Table/Table.test.tsx index 579a552d..2e8ecc74 100644 --- a/src/common/components/Table/Table.test.tsx +++ b/packages/web/src/common/components/Table/Table.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Table from './Table'; describe('Table', () => { diff --git a/src/common/components/Table/Table.tsx b/packages/web/src/common/components/Table/Table.tsx similarity index 96% rename from src/common/components/Table/Table.tsx rename to packages/web/src/common/components/Table/Table.tsx index 60eb8667..9cad8673 100644 --- a/src/common/components/Table/Table.tsx +++ b/packages/web/src/common/components/Table/Table.tsx @@ -1,7 +1,7 @@ import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `Table` React component. diff --git a/src/common/components/Table/__stories__/Table.stories.tsx b/packages/web/src/common/components/Table/__stories__/Table.stories.tsx similarity index 100% rename from src/common/components/Table/__stories__/Table.stories.tsx rename to packages/web/src/common/components/Table/__stories__/Table.stories.tsx diff --git a/src/common/components/Tabs/Tabs.test.tsx b/packages/web/src/common/components/Tabs/Tabs.test.tsx similarity index 99% rename from src/common/components/Tabs/Tabs.test.tsx rename to packages/web/src/common/components/Tabs/Tabs.test.tsx index 785c4a0e..33dd5357 100644 --- a/src/common/components/Tabs/Tabs.test.tsx +++ b/packages/web/src/common/components/Tabs/Tabs.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import Tabs from './Tabs'; diff --git a/src/common/components/Tabs/Tabs.tsx b/packages/web/src/common/components/Tabs/Tabs.tsx similarity index 92% rename from src/common/components/Tabs/Tabs.tsx rename to packages/web/src/common/components/Tabs/Tabs.tsx index 1bd1d2d6..4965e05f 100644 --- a/src/common/components/Tabs/Tabs.tsx +++ b/packages/web/src/common/components/Tabs/Tabs.tsx @@ -2,8 +2,8 @@ import { createContext, PropsWithChildren, useContext, useState } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; import noop from 'lodash/noop'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import Button from '../Button/Button'; /** @@ -80,7 +80,7 @@ const listVariants = cva('flex gap-4 border-b border-b-neutral-500/10', { /** * Properties for the `List` component. */ -interface ListProps extends BaseComponentProps, PropsWithChildren, VariantProps {} +export interface ListProps extends BaseComponentProps, PropsWithChildren, VariantProps {} /** * The `List` component is a container for one to many `Tab` components. It @@ -113,7 +113,7 @@ const tabVariants = cva('rounded-none border-0 border-b-2 px-4 text-sm font-bold /** * Properties for the `Tab` component. */ -interface TabProps extends BaseComponentProps, PropsWithChildren { +export interface TabProps extends BaseComponentProps, PropsWithChildren { value: string; } @@ -160,7 +160,7 @@ const contentVariants = cva('', { /** * Properties for the `Content` component. */ -interface TabContentProps extends BaseComponentProps, PropsWithChildren { +export interface TabContentProps extends BaseComponentProps, PropsWithChildren { value: string; } diff --git a/src/common/components/Tabs/__stories__/Tabs.stories.tsx b/packages/web/src/common/components/Tabs/__stories__/Tabs.stories.tsx similarity index 100% rename from src/common/components/Tabs/__stories__/Tabs.stories.tsx rename to packages/web/src/common/components/Tabs/__stories__/Tabs.stories.tsx diff --git a/src/common/components/Text/CodeSnippet.test.tsx b/packages/web/src/common/components/Text/CodeSnippet.test.tsx similarity index 94% rename from src/common/components/Text/CodeSnippet.test.tsx rename to packages/web/src/common/components/Text/CodeSnippet.test.tsx index cc3fa652..1d41fd8f 100644 --- a/src/common/components/Text/CodeSnippet.test.tsx +++ b/packages/web/src/common/components/Text/CodeSnippet.test.tsx @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import * as UseSettings from 'common/hooks/useSettings'; +import * as UseSettings from '@/common/hooks/useSettings'; import CodeSnippet from './CodeSnippet'; diff --git a/src/common/components/Text/CodeSnippet.tsx b/packages/web/src/common/components/Text/CodeSnippet.tsx similarity index 92% rename from src/common/components/Text/CodeSnippet.tsx rename to packages/web/src/common/components/Text/CodeSnippet.tsx index a02a8c41..c5ffff8b 100644 --- a/src/common/components/Text/CodeSnippet.tsx +++ b/packages/web/src/common/components/Text/CodeSnippet.tsx @@ -5,8 +5,8 @@ import tsx from 'react-syntax-highlighter/dist/esm/languages/prism/tsx'; import light from 'react-syntax-highlighter/dist/esm/styles/prism/prism'; import dark from 'react-syntax-highlighter/dist/esm/styles/prism/a11y-dark'; -import { BaseComponentProps } from 'common/utils/types'; -import { useSettings } from 'common/hooks/useSettings'; +import { BaseComponentProps } from '@/common/utils/types'; +import { useSettings } from '@/common/hooks/useSettings'; /** * Register the TSX language for syntax highlighting. diff --git a/src/common/components/Text/Currency.test.tsx b/packages/web/src/common/components/Text/Currency.test.tsx similarity index 94% rename from src/common/components/Text/Currency.test.tsx rename to packages/web/src/common/components/Text/Currency.test.tsx index 92ec2922..6f4e511a 100644 --- a/src/common/components/Text/Currency.test.tsx +++ b/packages/web/src/common/components/Text/Currency.test.tsx @@ -1,8 +1,8 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Currency from './Currency'; -import { CurrencyCode, CurrencyDisplay, CurrencySign } from 'common/utils/constants'; +import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@/common/utils/constants'; describe('Currency', () => { it('should render successfully', async () => { diff --git a/src/common/components/Text/Currency.tsx b/packages/web/src/common/components/Text/Currency.tsx similarity index 88% rename from src/common/components/Text/Currency.tsx rename to packages/web/src/common/components/Text/Currency.tsx index 28c38ad1..1d34feb1 100644 --- a/src/common/components/Text/Currency.tsx +++ b/packages/web/src/common/components/Text/Currency.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { CurrencyCode, CurrencyDisplay, CurrencySign } from 'common/utils/constants'; -import { formatNumber } from 'common/utils/numbers'; -import { BaseComponentProps } from 'common/utils/types'; +import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@/common/utils/constants'; +import { formatNumber } from '@/common/utils/numbers'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `Currency` component. diff --git a/src/common/components/Text/Date.test.tsx b/packages/web/src/common/components/Text/Date.test.tsx similarity index 95% rename from src/common/components/Text/Date.test.tsx rename to packages/web/src/common/components/Text/Date.test.tsx index 8ebd3870..15fad2a7 100644 --- a/src/common/components/Text/Date.test.tsx +++ b/packages/web/src/common/components/Text/Date.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { DateFormat } from 'common/utils/constants'; +import { DateFormat } from '@/common/utils/constants'; import Date from './Date'; describe('Date', () => { diff --git a/src/common/components/Text/Date.tsx b/packages/web/src/common/components/Text/Date.tsx similarity index 88% rename from src/common/components/Text/Date.tsx rename to packages/web/src/common/components/Text/Date.tsx index 6d405bb6..c04d1f1a 100644 --- a/src/common/components/Text/Date.tsx +++ b/packages/web/src/common/components/Text/Date.tsx @@ -1,7 +1,7 @@ import dayjs from 'dayjs'; -import { BaseComponentProps } from 'common/utils/types'; -import { DateFormat } from 'common/utils/constants'; +import { BaseComponentProps } from '@/common/utils/types'; +import { DateFormat } from '@/common/utils/constants'; /** * Properties for the `Date` component. diff --git a/src/common/components/Text/DayOfTheWeek.test.tsx b/packages/web/src/common/components/Text/DayOfTheWeek.test.tsx similarity index 97% rename from src/common/components/Text/DayOfTheWeek.test.tsx rename to packages/web/src/common/components/Text/DayOfTheWeek.test.tsx index 8385496c..7100618d 100644 --- a/src/common/components/Text/DayOfTheWeek.test.tsx +++ b/packages/web/src/common/components/Text/DayOfTheWeek.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import dayjs from 'dayjs'; import DayOfTheWeek from './DayOfTheWeek'; diff --git a/src/common/components/Text/DayOfTheWeek.tsx b/packages/web/src/common/components/Text/DayOfTheWeek.tsx similarity index 94% rename from src/common/components/Text/DayOfTheWeek.tsx rename to packages/web/src/common/components/Text/DayOfTheWeek.tsx index 30e91526..5a8cbd1e 100644 --- a/src/common/components/Text/DayOfTheWeek.tsx +++ b/packages/web/src/common/components/Text/DayOfTheWeek.tsx @@ -3,8 +3,8 @@ import isToday from 'dayjs/plugin/isToday'; import isTomorrow from 'dayjs/plugin/isTomorrow'; import isYesterday from 'dayjs/plugin/isYesterday'; -import { BaseComponentProps } from 'common/utils/types'; -import { DateFormat } from 'common/utils/constants'; +import { BaseComponentProps } from '@/common/utils/types'; +import { DateFormat } from '@/common/utils/constants'; import Date from './Date'; dayjs.extend(isToday); diff --git a/src/common/components/Text/Decimal.test.tsx b/packages/web/src/common/components/Text/Decimal.test.tsx similarity index 97% rename from src/common/components/Text/Decimal.test.tsx rename to packages/web/src/common/components/Text/Decimal.test.tsx index 92f543e3..eade6968 100644 --- a/src/common/components/Text/Decimal.test.tsx +++ b/packages/web/src/common/components/Text/Decimal.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { SignDisplay, Unit, UnitDisplay } from 'common/utils/constants'; +import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; import Decimal from './Decimal'; diff --git a/src/common/components/Text/Decimal.tsx b/packages/web/src/common/components/Text/Decimal.tsx similarity index 91% rename from src/common/components/Text/Decimal.tsx rename to packages/web/src/common/components/Text/Decimal.tsx index d22f5b08..ed357c95 100644 --- a/src/common/components/Text/Decimal.tsx +++ b/packages/web/src/common/components/Text/Decimal.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { formatNumber } from 'common/utils/numbers'; -import { BaseComponentProps } from 'common/utils/types'; -import { SignDisplay, Unit, UnitDisplay } from 'common/utils/constants'; +import { formatNumber } from '@/common/utils/numbers'; +import { BaseComponentProps } from '@/common/utils/types'; +import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; /** * Properties for the `Decimal` component. diff --git a/src/common/components/Text/Heading.test.tsx b/packages/web/src/common/components/Text/Heading.test.tsx similarity index 93% rename from src/common/components/Text/Heading.test.tsx rename to packages/web/src/common/components/Text/Heading.test.tsx index 3da6a6df..60250ff0 100644 --- a/src/common/components/Text/Heading.test.tsx +++ b/packages/web/src/common/components/Text/Heading.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Heading from './Heading'; diff --git a/src/common/components/Text/Heading.tsx b/packages/web/src/common/components/Text/Heading.tsx similarity index 92% rename from src/common/components/Text/Heading.tsx rename to packages/web/src/common/components/Text/Heading.tsx index a8827be1..a258a863 100644 --- a/src/common/components/Text/Heading.tsx +++ b/packages/web/src/common/components/Text/Heading.tsx @@ -1,8 +1,8 @@ import { HTMLAttributes } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { BaseComponentProps } from 'common/utils/types'; -import { cn } from 'common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { cn } from '@/common/utils/css'; /** * Defines the types of heading elements. diff --git a/src/common/components/Text/HelpText.test.tsx b/packages/web/src/common/components/Text/HelpText.test.tsx similarity index 89% rename from src/common/components/Text/HelpText.test.tsx rename to packages/web/src/common/components/Text/HelpText.test.tsx index 4b37eb3e..a1fd4de0 100644 --- a/src/common/components/Text/HelpText.test.tsx +++ b/packages/web/src/common/components/Text/HelpText.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import HelpText from './HelpText'; diff --git a/src/common/components/Text/HelpText.tsx b/packages/web/src/common/components/Text/HelpText.tsx similarity index 87% rename from src/common/components/Text/HelpText.tsx rename to packages/web/src/common/components/Text/HelpText.tsx index 0fa3275a..7642a3dc 100644 --- a/src/common/components/Text/HelpText.tsx +++ b/packages/web/src/common/components/Text/HelpText.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Properties for the `HelpText` component. diff --git a/src/common/components/Text/Integer.test.tsx b/packages/web/src/common/components/Text/Integer.test.tsx similarity index 97% rename from src/common/components/Text/Integer.test.tsx rename to packages/web/src/common/components/Text/Integer.test.tsx index 664ef9f7..b8cc8f6c 100644 --- a/src/common/components/Text/Integer.test.tsx +++ b/packages/web/src/common/components/Text/Integer.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { SignDisplay, Unit, UnitDisplay } from 'common/utils/constants'; +import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; import Integer from './Integer'; diff --git a/src/common/components/Text/Integer.tsx b/packages/web/src/common/components/Text/Integer.tsx similarity index 89% rename from src/common/components/Text/Integer.tsx rename to packages/web/src/common/components/Text/Integer.tsx index 0b1204ff..667d00cc 100644 --- a/src/common/components/Text/Integer.tsx +++ b/packages/web/src/common/components/Text/Integer.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { formatNumber } from '../../utils/numbers'; -import { BaseComponentProps } from 'common/utils/types'; -import { SignDisplay, Unit, UnitDisplay } from 'common/utils/constants'; +import { formatNumber } from '@/common/utils/numbers'; +import { BaseComponentProps } from '@/common/utils/types'; +import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; /** * Properties for the `Integer` component. diff --git a/src/common/components/Text/Percent.test.tsx b/packages/web/src/common/components/Text/Percent.test.tsx similarity index 95% rename from src/common/components/Text/Percent.test.tsx rename to packages/web/src/common/components/Text/Percent.test.tsx index 25561bd9..26a7a261 100644 --- a/src/common/components/Text/Percent.test.tsx +++ b/packages/web/src/common/components/Text/Percent.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { SignDisplay } from 'common/utils/constants'; +import { SignDisplay } from '@/common/utils/constants'; import Percent from './Percent'; diff --git a/src/common/components/Text/Percent.tsx b/packages/web/src/common/components/Text/Percent.tsx similarity index 90% rename from src/common/components/Text/Percent.tsx rename to packages/web/src/common/components/Text/Percent.tsx index c2dddc99..64e6c7d4 100644 --- a/src/common/components/Text/Percent.tsx +++ b/packages/web/src/common/components/Text/Percent.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react'; -import { BaseComponentProps } from 'common/utils/types'; -import { SignDisplay } from 'common/utils/constants'; -import { formatNumber } from 'common/utils/numbers'; +import { BaseComponentProps } from '@/common/utils/types'; +import { SignDisplay } from '@/common/utils/constants'; +import { formatNumber } from '@/common/utils/numbers'; /** * Properties for the `Percent` component. diff --git a/src/common/components/Text/Text.test.tsx b/packages/web/src/common/components/Text/Text.test.tsx similarity index 96% rename from src/common/components/Text/Text.test.tsx rename to packages/web/src/common/components/Text/Text.test.tsx index 9be8a1bd..adcaddee 100644 --- a/src/common/components/Text/Text.test.tsx +++ b/packages/web/src/common/components/Text/Text.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import Text from './Text'; diff --git a/src/common/components/Text/Text.tsx b/packages/web/src/common/components/Text/Text.tsx similarity index 90% rename from src/common/components/Text/Text.tsx rename to packages/web/src/common/components/Text/Text.tsx index 72491d64..9c10e2c1 100644 --- a/src/common/components/Text/Text.tsx +++ b/packages/web/src/common/components/Text/Text.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; import { cva, VariantProps } from 'class-variance-authority'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; /** * Define the component base and variant styles. diff --git a/src/common/components/Text/__stories__/CodeSnippet.stories.tsx b/packages/web/src/common/components/Text/__stories__/CodeSnippet.stories.tsx similarity index 100% rename from src/common/components/Text/__stories__/CodeSnippet.stories.tsx rename to packages/web/src/common/components/Text/__stories__/CodeSnippet.stories.tsx diff --git a/src/common/components/Text/__stories__/Currency.stories.tsx b/packages/web/src/common/components/Text/__stories__/Currency.stories.tsx similarity index 92% rename from src/common/components/Text/__stories__/Currency.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Currency.stories.tsx index 2823122f..42b2d6b9 100644 --- a/src/common/components/Text/__stories__/Currency.stories.tsx +++ b/packages/web/src/common/components/Text/__stories__/Currency.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import { CurrencyCode, CurrencyDisplay, CurrencySign } from 'common/utils/constants'; +import { CurrencyCode, CurrencyDisplay, CurrencySign } from '@/common/utils/constants'; import Currency from '../Currency'; diff --git a/src/common/components/Text/__stories__/Date.stories.tsx b/packages/web/src/common/components/Text/__stories__/Date.stories.tsx similarity index 95% rename from src/common/components/Text/__stories__/Date.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Date.stories.tsx index 6bc374e9..963597ff 100644 --- a/src/common/components/Text/__stories__/Date.stories.tsx +++ b/packages/web/src/common/components/Text/__stories__/Date.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import { DateFormat } from 'common/utils/constants'; +import { DateFormat } from '@/common/utils/constants'; import Date from '../Date'; diff --git a/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx b/packages/web/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx similarity index 100% rename from src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx rename to packages/web/src/common/components/Text/__stories__/DayOfTheWeek.stories.tsx diff --git a/src/common/components/Text/__stories__/Decimal.stories.tsx b/packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx similarity index 95% rename from src/common/components/Text/__stories__/Decimal.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx index 48a4bab9..c1d4c663 100644 --- a/src/common/components/Text/__stories__/Decimal.stories.tsx +++ b/packages/web/src/common/components/Text/__stories__/Decimal.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import { SignDisplay, Unit, UnitDisplay } from 'common/utils/constants'; +import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; import Decimal from '../Decimal'; diff --git a/src/common/components/Text/__stories__/Heading.stories.tsx b/packages/web/src/common/components/Text/__stories__/Heading.stories.tsx similarity index 100% rename from src/common/components/Text/__stories__/Heading.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Heading.stories.tsx diff --git a/src/common/components/Text/__stories__/HelpText.stories.tsx b/packages/web/src/common/components/Text/__stories__/HelpText.stories.tsx similarity index 100% rename from src/common/components/Text/__stories__/HelpText.stories.tsx rename to packages/web/src/common/components/Text/__stories__/HelpText.stories.tsx diff --git a/src/common/components/Text/__stories__/Integer.stories.tsx b/packages/web/src/common/components/Text/__stories__/Integer.stories.tsx similarity index 93% rename from src/common/components/Text/__stories__/Integer.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Integer.stories.tsx index 60e01f01..e7425b13 100644 --- a/src/common/components/Text/__stories__/Integer.stories.tsx +++ b/packages/web/src/common/components/Text/__stories__/Integer.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import { SignDisplay, Unit, UnitDisplay } from 'common/utils/constants'; +import { SignDisplay, Unit, UnitDisplay } from '@/common/utils/constants'; import Integer from '../Integer'; diff --git a/src/common/components/Text/__stories__/Percent.stories.tsx b/packages/web/src/common/components/Text/__stories__/Percent.stories.tsx similarity index 95% rename from src/common/components/Text/__stories__/Percent.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Percent.stories.tsx index b2d1ec18..822b0787 100644 --- a/src/common/components/Text/__stories__/Percent.stories.tsx +++ b/packages/web/src/common/components/Text/__stories__/Percent.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; -import { SignDisplay } from 'common/utils/constants'; +import { SignDisplay } from '@/common/utils/constants'; import Percent from '../Percent'; diff --git a/src/common/components/Text/__stories__/Text.stories.tsx b/packages/web/src/common/components/Text/__stories__/Text.stories.tsx similarity index 100% rename from src/common/components/Text/__stories__/Text.stories.tsx rename to packages/web/src/common/components/Text/__stories__/Text.stories.tsx diff --git a/src/common/components/Theme/Theme.test.tsx b/packages/web/src/common/components/Theme/Theme.test.tsx similarity index 96% rename from src/common/components/Theme/Theme.test.tsx rename to packages/web/src/common/components/Theme/Theme.test.tsx index bf5342bb..c93f61cc 100644 --- a/src/common/components/Theme/Theme.test.tsx +++ b/packages/web/src/common/components/Theme/Theme.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, beforeEach, vi } from 'vitest'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; -import { mockMatchMedia } from 'test/mocks/window'; +import { mockMatchMedia } from '@/test/mocks/window'; import Theme from './Theme'; describe('Theme', () => { diff --git a/src/common/components/Theme/Theme.tsx b/packages/web/src/common/components/Theme/Theme.tsx similarity index 93% rename from src/common/components/Theme/Theme.tsx rename to packages/web/src/common/components/Theme/Theme.tsx index 0e84ff58..29f8a835 100644 --- a/src/common/components/Theme/Theme.tsx +++ b/packages/web/src/common/components/Theme/Theme.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react'; -import { BaseComponentProps } from 'common/utils/types'; -import { useSettings } from 'common/hooks/useSettings'; +import { BaseComponentProps } from '@/common/utils/types'; +import { useSettings } from '@/common/hooks/useSettings'; /** * The `ThemeValue` type defines the possible theme values that can be used in the application. diff --git a/src/common/components/Toast/Toast.test.tsx b/packages/web/src/common/components/Toast/Toast.test.tsx similarity index 90% rename from src/common/components/Toast/Toast.test.tsx rename to packages/web/src/common/components/Toast/Toast.test.tsx index d9757c5a..1479dce6 100644 --- a/src/common/components/Toast/Toast.test.tsx +++ b/packages/web/src/common/components/Toast/Toast.test.tsx @@ -2,10 +2,10 @@ import { describe, expect, it, vi } from 'vitest'; import dayjs from 'dayjs'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; -import { ToastDetail } from 'common/providers/ToastsContext'; -import { toastFixture } from '__fixtures__/toasts'; +import { ToastDetail } from '@/common/providers/ToastsContext'; +import { toastFixture } from '@/__fixtures__/toasts'; import Toast from './Toast'; diff --git a/src/common/components/Toast/Toast.tsx b/packages/web/src/common/components/Toast/Toast.tsx similarity index 74% rename from src/common/components/Toast/Toast.tsx rename to packages/web/src/common/components/Toast/Toast.tsx index 65498455..771422c2 100644 --- a/src/common/components/Toast/Toast.tsx +++ b/packages/web/src/common/components/Toast/Toast.tsx @@ -3,12 +3,12 @@ import dayjs from 'dayjs'; import { animated, useSpring } from '@react-spring/web'; import { cva, VariantProps } from 'class-variance-authority'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { config } from 'common/utils/config'; -import { ToastDetail } from 'common/providers/ToastsContext'; -import Button from 'common/components/Button/Button'; -import FAIcon from 'common/components/Icon/FAIcon'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { config } from '@/common/utils/config'; +import { ToastDetail } from '@/common/providers/ToastsContext'; +import Button from '@/common/components/Button/Button'; +import FAIcon from '@/common/components/Icon/FAIcon'; /** * Defines the component base and variant styles. @@ -61,7 +61,13 @@ const Toast = ({ className, dismiss, testId = 'toast', toast }: ToastProps) => { }); }; + /** + * Effect hook to handle auto dismissing the toast. If the toast is set to auto dismiss, an interval is + * created to check if the toast should be dismissed based on its creation time and the configured auto + * dismiss duration. If the toast is not set to auto dismiss, no interval is created to avoid memory leaks. + */ useEffect(() => { + // auto dismiss toasts need an interval to check if they should be dismissed if (toast.isAutoDismiss) { const dismissInterval = setInterval(() => { const dismissAt = dayjs(toast.createdAt).add(config.VITE_TOAST_AUTO_DISMISS_MILLIS, 'millisecond'); @@ -72,6 +78,9 @@ const Toast = ({ className, dismiss, testId = 'toast', toast }: ToastProps) => { return () => clearInterval(dismissInterval); } + + // manually dismissed toasts do not need an interval, so return undefined to avoid a memory leak + return undefined; }, [toast]); return ( diff --git a/src/common/components/Toast/Toasts.test.tsx b/packages/web/src/common/components/Toast/Toasts.test.tsx similarity index 89% rename from src/common/components/Toast/Toasts.test.tsx rename to packages/web/src/common/components/Toast/Toasts.test.tsx index cc3b11d6..33b1ff92 100644 --- a/src/common/components/Toast/Toasts.test.tsx +++ b/packages/web/src/common/components/Toast/Toasts.test.tsx @@ -1,9 +1,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; -import * as UseToasts from 'common/hooks/useToasts'; -import { toastFixture } from '__fixtures__/toasts'; +import { render, screen, waitFor } from '@/test/test-utils'; +import * as UseToasts from '@/common/hooks/useToasts'; +import { toastFixture } from '@/__fixtures__/toasts'; import Toasts from './Toasts'; diff --git a/src/common/components/Toast/Toasts.tsx b/packages/web/src/common/components/Toast/Toasts.tsx similarity index 66% rename from src/common/components/Toast/Toasts.tsx rename to packages/web/src/common/components/Toast/Toasts.tsx index b22e8f22..2673accf 100644 --- a/src/common/components/Toast/Toasts.tsx +++ b/packages/web/src/common/components/Toast/Toasts.tsx @@ -1,19 +1,13 @@ -import { PropsWithTestId } from 'common/utils/types'; -import { useToasts } from 'common/hooks/useToasts'; +import { PropsWithTestId } from '@/common/utils/types'; +import { useToasts } from '@/common/hooks/useToasts'; import Toast from './Toast'; -/** - * Properties for the `Toasts` component. - * @see {@link PropsWithTestId} - */ -export interface ToastsProps extends PropsWithTestId {} - /** * The `Toasts` component renders a container for a list of `Toast` * components. * @param {ToastsProps} props - Component properties, `ToastsProps`. */ -const Toasts = ({ testId = 'toasts' }: ToastsProps) => { +const Toasts = ({ testId = 'toasts' }: PropsWithTestId) => { const { removeToast, toasts } = useToasts(); return ( diff --git a/src/common/components/Toast/__stories__/Toast.stories.tsx b/packages/web/src/common/components/Toast/__stories__/Toast.stories.tsx similarity index 95% rename from src/common/components/Toast/__stories__/Toast.stories.tsx rename to packages/web/src/common/components/Toast/__stories__/Toast.stories.tsx index 05ee6df6..fb64e376 100644 --- a/src/common/components/Toast/__stories__/Toast.stories.tsx +++ b/packages/web/src/common/components/Toast/__stories__/Toast.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import dayjs from 'dayjs'; -import { ToastDetail } from 'common/providers/ToastsContext'; +import { ToastDetail } from '@/common/providers/ToastsContext'; import Toast from '../Toast'; diff --git a/src/common/components/shadcn/__stories__/alert.stories.tsx b/packages/web/src/common/components/shadcn/__stories__/alert.stories.tsx similarity index 100% rename from src/common/components/shadcn/__stories__/alert.stories.tsx rename to packages/web/src/common/components/shadcn/__stories__/alert.stories.tsx diff --git a/src/common/components/shadcn/alert.test.tsx b/packages/web/src/common/components/shadcn/alert.test.tsx similarity index 97% rename from src/common/components/shadcn/alert.test.tsx rename to packages/web/src/common/components/shadcn/alert.test.tsx index ccade7e7..29a8e555 100644 --- a/src/common/components/shadcn/alert.test.tsx +++ b/packages/web/src/common/components/shadcn/alert.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import { Alert } from './alert'; diff --git a/src/common/components/shadcn/alert.tsx b/packages/web/src/common/components/shadcn/alert.tsx similarity index 98% rename from src/common/components/shadcn/alert.tsx rename to packages/web/src/common/components/shadcn/alert.tsx index de712c34..dac76381 100644 --- a/src/common/components/shadcn/alert.tsx +++ b/packages/web/src/common/components/shadcn/alert.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { cva, type VariantProps } from 'class-variance-authority'; -import { cn } from 'common/utils/css'; +import { cn } from '@/common/utils/css'; const alertVariants = cva( "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", diff --git a/src/common/hooks/useAuth.test.ts b/packages/web/src/common/hooks/useAuth.test.ts similarity index 76% rename from src/common/hooks/useAuth.test.ts rename to packages/web/src/common/hooks/useAuth.test.ts index bea41502..3e2d205c 100644 --- a/src/common/hooks/useAuth.test.ts +++ b/packages/web/src/common/hooks/useAuth.test.ts @@ -1,12 +1,12 @@ import { UseQueryResult } from '@tanstack/react-query'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; -import { userTokensFixture } from '__fixtures__/tokens'; -import * as UseGetUserTokens from 'common/api/useGetUserTokens'; +import { userTokensFixture } from '@/__fixtures__/tokens'; +import * as UseGetUserTokens from '@/common/api/useGetUserTokens'; -import { useAuth } from 'common/hooks/useAuth'; +import { useAuth } from '@/common/hooks/useAuth'; describe('useAuth', () => { const useGetUserTokensSpy = vi.spyOn(UseGetUserTokens, 'useGetUserTokens'); diff --git a/src/common/hooks/useAuth.ts b/packages/web/src/common/hooks/useAuth.ts similarity index 77% rename from src/common/hooks/useAuth.ts rename to packages/web/src/common/hooks/useAuth.ts index e2956bfa..5ce3b6b9 100644 --- a/src/common/hooks/useAuth.ts +++ b/packages/web/src/common/hooks/useAuth.ts @@ -1,6 +1,6 @@ import { useContext } from 'react'; -import { AuthContext, AuthContextValue } from 'common/providers/AuthContext'; +import { AuthContext, AuthContextValue } from '@/common/providers/AuthContext'; /** * The `useAuth` hook returns the current `AuthContext` value. diff --git a/src/common/hooks/useAxios.test.ts b/packages/web/src/common/hooks/useAxios.test.ts similarity index 75% rename from src/common/hooks/useAxios.test.ts rename to packages/web/src/common/hooks/useAxios.test.ts index 529ae36a..b3ee3f9b 100644 --- a/src/common/hooks/useAxios.test.ts +++ b/packages/web/src/common/hooks/useAxios.test.ts @@ -1,10 +1,10 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; -import * as UseAuth from 'common/hooks/useAuth'; -import { userTokensFixture } from '__fixtures__/tokens'; +import * as UseAuth from '@/common/hooks/useAuth'; +import { userTokensFixture } from '@/__fixtures__/tokens'; -import { useAxios } from 'common/hooks/useAxios'; +import { useAxios } from '@/common/hooks/useAxios'; describe('useAxios', () => { const useAuthSpy = vi.spyOn(UseAuth, 'useAuth'); diff --git a/src/common/hooks/useAxios.ts b/packages/web/src/common/hooks/useAxios.ts similarity index 83% rename from src/common/hooks/useAxios.ts rename to packages/web/src/common/hooks/useAxios.ts index 96b08b4d..1ee52666 100644 --- a/src/common/hooks/useAxios.ts +++ b/packages/web/src/common/hooks/useAxios.ts @@ -1,7 +1,7 @@ import { useContext } from 'react'; import { AxiosInstance } from 'axios'; -import { AxiosContext } from 'common/providers/AxiosContext'; +import { AxiosContext } from '@/common/providers/AxiosContext'; /** * The `useAxios` hook returns the current `AxiosContext` value. diff --git a/src/common/hooks/useDebounce.test.ts b/packages/web/src/common/hooks/useDebounce.test.ts similarity index 93% rename from src/common/hooks/useDebounce.test.ts rename to packages/web/src/common/hooks/useDebounce.test.ts index 9816f0e8..af967dc1 100644 --- a/src/common/hooks/useDebounce.test.ts +++ b/packages/web/src/common/hooks/useDebounce.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from '@testing-library/react'; +import { renderHook, waitFor } from '@/test/test-utils'; -import { useDebounce } from 'common/hooks/useDebounce'; +import { useDebounce } from '@/common/hooks/useDebounce'; describe('useDebounce', () => { it('should return debounced value', async () => { diff --git a/src/common/hooks/useDebounce.ts b/packages/web/src/common/hooks/useDebounce.ts similarity index 100% rename from src/common/hooks/useDebounce.ts rename to packages/web/src/common/hooks/useDebounce.ts diff --git a/src/common/hooks/useSettings.test.ts b/packages/web/src/common/hooks/useSettings.test.ts similarity index 81% rename from src/common/hooks/useSettings.test.ts rename to packages/web/src/common/hooks/useSettings.test.ts index 26c57f6d..8510fab9 100644 --- a/src/common/hooks/useSettings.test.ts +++ b/packages/web/src/common/hooks/useSettings.test.ts @@ -2,11 +2,11 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { renderHook as renderHookWithoutWrapper } from '@testing-library/react'; import { UseQueryResult } from '@tanstack/react-query'; -import { renderHook, waitFor } from 'test/test-utils'; -import * as UseGetSettings from 'common/api/useGetSettings'; -import { settingsFixture } from '__fixtures__/settings'; +import { renderHook, waitFor } from '@/test/test-utils'; +import * as UseGetSettings from '@/common/api/useGetSettings'; +import { settingsFixture } from '@/__fixtures__/settings'; -import { useSettings } from 'common/hooks/useSettings'; +import { useSettings } from '@/common/hooks/useSettings'; describe('useSettings', () => { const useGetSettingsSpy = vi.spyOn(UseGetSettings, 'useGetSettings'); diff --git a/src/common/hooks/useSettings.ts b/packages/web/src/common/hooks/useSettings.ts similarity index 77% rename from src/common/hooks/useSettings.ts rename to packages/web/src/common/hooks/useSettings.ts index 9bdff34a..f0dd29d4 100644 --- a/src/common/hooks/useSettings.ts +++ b/packages/web/src/common/hooks/useSettings.ts @@ -1,7 +1,7 @@ import { useContext } from 'react'; -import { Settings } from 'common/api/useGetSettings'; -import { SettingsContext } from 'common/providers/SettingsContext'; +import { Settings } from '@/common/api/useGetSettings'; +import { SettingsContext } from '@/common/providers/SettingsContext'; /** * The `useSettings` hook returns the current `SettingsContext` value. diff --git a/src/common/hooks/useToasts.test.ts b/packages/web/src/common/hooks/useToasts.test.ts similarity index 94% rename from src/common/hooks/useToasts.test.ts rename to packages/web/src/common/hooks/useToasts.test.ts index f33ab696..27a63fed 100644 --- a/src/common/hooks/useToasts.test.ts +++ b/packages/web/src/common/hooks/useToasts.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from 'vitest'; import { renderHook as renderHookWithoutWrapper } from '@testing-library/react'; -import { act, renderHook, waitFor } from 'test/test-utils'; +import { act, renderHook, waitFor } from '@/test/test-utils'; -import { useToasts } from 'common/hooks/useToasts'; +import { useToasts } from '@/common/hooks/useToasts'; describe('useToasts', () => { it('should return the context', async () => { diff --git a/src/common/hooks/useToasts.ts b/packages/web/src/common/hooks/useToasts.ts similarity index 83% rename from src/common/hooks/useToasts.ts rename to packages/web/src/common/hooks/useToasts.ts index 5b831708..9b323bff 100644 --- a/src/common/hooks/useToasts.ts +++ b/packages/web/src/common/hooks/useToasts.ts @@ -1,6 +1,6 @@ import { useContext } from 'react'; -import { ToastsContext, ToastsContextValue } from 'common/providers/ToastsContext'; +import { ToastsContext, ToastsContextValue } from '@/common/providers/ToastsContext'; /** * The `useToasts` hook returns the current `ToastsContext` value. diff --git a/src/common/providers/AuthContext.ts b/packages/web/src/common/providers/AuthContext.ts similarity index 90% rename from src/common/providers/AuthContext.ts rename to packages/web/src/common/providers/AuthContext.ts index cf255d10..995f6869 100644 --- a/src/common/providers/AuthContext.ts +++ b/packages/web/src/common/providers/AuthContext.ts @@ -1,7 +1,7 @@ import { createContext } from 'react'; import { QueryObserverBaseResult } from '@tanstack/react-query'; -import { UserTokens } from 'common/api/useGetUserTokens'; +import { UserTokens } from '@/common/api/useGetUserTokens'; /** * The `value` provided by the `AuthContext`. diff --git a/src/common/providers/AuthProvider.test.tsx b/packages/web/src/common/providers/AuthProvider.test.tsx similarity index 87% rename from src/common/providers/AuthProvider.test.tsx rename to packages/web/src/common/providers/AuthProvider.test.tsx index a7106fed..dca558b5 100644 --- a/src/common/providers/AuthProvider.test.tsx +++ b/packages/web/src/common/providers/AuthProvider.test.tsx @@ -1,12 +1,12 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { userTokensFixture } from '__fixtures__/tokens'; -import * as UseGetUserTokens from 'common/api/useGetUserTokens'; +import { userTokensFixture } from '@/__fixtures__/tokens'; +import * as UseGetUserTokens from '@/common/api/useGetUserTokens'; -import AuthContextProvider from 'common/providers/AuthProvider'; +import AuthContextProvider from '@/common/providers/AuthProvider'; describe('AuthProvider', () => { const useGetUserTokensSpy = vi.spyOn(UseGetUserTokens, 'useGetUserTokens'); diff --git a/src/common/providers/AuthProvider.tsx b/packages/web/src/common/providers/AuthProvider.tsx similarity index 90% rename from src/common/providers/AuthProvider.tsx rename to packages/web/src/common/providers/AuthProvider.tsx index 06c96d4f..af5617cd 100644 --- a/src/common/providers/AuthProvider.tsx +++ b/packages/web/src/common/providers/AuthProvider.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; import { AuthContext, AuthContextValue } from './AuthContext'; -import { useGetUserTokens } from 'common/api/useGetUserTokens'; -import Spinner from 'common/components/Loader/Spinner'; +import { useGetUserTokens } from '@/common/api/useGetUserTokens'; +import Spinner from '@/common/components/Loader/Spinner'; /** * The `AuthContextProvider` React component creates, maintains, and provides diff --git a/src/common/providers/AxiosContext.ts b/packages/web/src/common/providers/AxiosContext.ts similarity index 100% rename from src/common/providers/AxiosContext.ts rename to packages/web/src/common/providers/AxiosContext.ts diff --git a/src/common/providers/AxiosProvider.test.tsx b/packages/web/src/common/providers/AxiosProvider.test.tsx similarity index 88% rename from src/common/providers/AxiosProvider.test.tsx rename to packages/web/src/common/providers/AxiosProvider.test.tsx index e88c7d56..6a07230f 100644 --- a/src/common/providers/AxiosProvider.test.tsx +++ b/packages/web/src/common/providers/AxiosProvider.test.tsx @@ -1,13 +1,13 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { useEffect, useState } from 'react'; import { InternalAxiosRequestConfig } from 'axios'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { useAxios } from 'common/hooks/useAxios'; -import * as UseAuth from 'common/hooks/useAuth'; -import { userTokensFixture } from '__fixtures__/tokens'; +import { useAxios } from '@/common/hooks/useAxios'; +import * as UseAuth from '@/common/hooks/useAuth'; +import { userTokensFixture } from '@/__fixtures__/tokens'; -import AxiosContextProvider from 'common/providers/AxiosProvider'; +import AxiosContextProvider from '@/common/providers/AxiosProvider'; describe('AxiosProvider', () => { const useAuthSpy = vi.spyOn(UseAuth, 'useAuth'); diff --git a/src/common/providers/AxiosProvider.tsx b/packages/web/src/common/providers/AxiosProvider.tsx similarity index 98% rename from src/common/providers/AxiosProvider.tsx rename to packages/web/src/common/providers/AxiosProvider.tsx index 31746d17..8234f4dd 100644 --- a/src/common/providers/AxiosProvider.tsx +++ b/packages/web/src/common/providers/AxiosProvider.tsx @@ -3,7 +3,7 @@ import axios, { AxiosError, InternalAxiosRequestConfig } from 'axios'; import { AxiosContext, customAxios } from './AxiosContext'; import { AuthContextValue } from './AuthContext'; -import { useAuth } from 'common/hooks/useAuth'; +import { useAuth } from '@/common/hooks/useAuth'; /** * An Axios request interceptor that adds user authentication headers to diff --git a/src/common/providers/SettingsContext.ts b/packages/web/src/common/providers/SettingsContext.ts similarity index 74% rename from src/common/providers/SettingsContext.ts rename to packages/web/src/common/providers/SettingsContext.ts index 31652e09..ea59c7e5 100644 --- a/src/common/providers/SettingsContext.ts +++ b/packages/web/src/common/providers/SettingsContext.ts @@ -1,6 +1,6 @@ import { createContext } from 'react'; -import { Settings } from 'common/api/useGetSettings'; +import { Settings } from '@/common/api/useGetSettings'; /** * The `SettingsContext` instance. diff --git a/src/common/providers/SettingsProvider.test.tsx b/packages/web/src/common/providers/SettingsProvider.test.tsx similarity index 77% rename from src/common/providers/SettingsProvider.test.tsx rename to packages/web/src/common/providers/SettingsProvider.test.tsx index 89a43f02..3868c507 100644 --- a/src/common/providers/SettingsProvider.test.tsx +++ b/packages/web/src/common/providers/SettingsProvider.test.tsx @@ -1,12 +1,12 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { render as renderWithoutWrapper } from '@testing-library/react'; +import { UseQueryResult } from '@tanstack/react-query'; -import { screen } from 'test/test-utils'; +import { screen } from '@/test/test-utils'; -import SettingsContextProvider from 'common/providers/SettingsProvider'; -import { settingsFixture } from '__fixtures__/settings'; -import * as UseGetSettings from 'common/api/useGetSettings'; -import { UseQueryResult } from '@tanstack/react-query'; +import SettingsContextProvider from '@/common/providers/SettingsProvider'; +import { settingsFixture } from '@/__fixtures__/settings'; +import * as UseGetSettings from '@/common/api/useGetSettings'; const useGetSettingsSpy = vi.spyOn(UseGetSettings, 'useGetSettings'); diff --git a/src/common/providers/SettingsProvider.tsx b/packages/web/src/common/providers/SettingsProvider.tsx similarity index 91% rename from src/common/providers/SettingsProvider.tsx rename to packages/web/src/common/providers/SettingsProvider.tsx index e495a619..423ec123 100644 --- a/src/common/providers/SettingsProvider.tsx +++ b/packages/web/src/common/providers/SettingsProvider.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren, useMemo } from 'react'; -import { useGetSettings } from 'common/api/useGetSettings'; +import { useGetSettings } from '@/common/api/useGetSettings'; import { SettingsContext } from './SettingsContext'; /** diff --git a/src/common/providers/ToastsContext.ts b/packages/web/src/common/providers/ToastsContext.ts similarity index 91% rename from src/common/providers/ToastsContext.ts rename to packages/web/src/common/providers/ToastsContext.ts index a7e95e23..95ee0fd5 100644 --- a/src/common/providers/ToastsContext.ts +++ b/packages/web/src/common/providers/ToastsContext.ts @@ -1,6 +1,6 @@ import { createContext } from 'react'; -import { ToastVariants } from 'common/components/Toast/Toast'; +import { ToastVariants } from '@/common/components/Toast/Toast'; /** * Describes the attributes of a single Toast. diff --git a/src/common/providers/ToastsProvider.test.tsx b/packages/web/src/common/providers/ToastsProvider.test.tsx similarity index 82% rename from src/common/providers/ToastsProvider.test.tsx rename to packages/web/src/common/providers/ToastsProvider.test.tsx index 1019dd66..a2acfdcc 100644 --- a/src/common/providers/ToastsProvider.test.tsx +++ b/packages/web/src/common/providers/ToastsProvider.test.tsx @@ -1,9 +1,9 @@ import { describe, expect, it } from 'vitest'; import { render as renderWithoutWrapper } from '@testing-library/react'; -import { screen } from 'test/test-utils'; +import { screen } from '@/test/test-utils'; -import ToastsProvider from 'common/providers/ToastsProvider'; +import ToastsProvider from '@/common/providers/ToastsProvider'; describe('ToastsProvider', () => { it('should render successfully', async () => { diff --git a/src/common/providers/ToastsProvider.tsx b/packages/web/src/common/providers/ToastsProvider.tsx similarity index 96% rename from src/common/providers/ToastsProvider.tsx rename to packages/web/src/common/providers/ToastsProvider.tsx index 8432ada9..48a08b2b 100644 --- a/src/common/providers/ToastsProvider.tsx +++ b/packages/web/src/common/providers/ToastsProvider.tsx @@ -29,8 +29,7 @@ enum ToastAction { * requested. */ type ToastsContextAction = - | { type: ToastAction.Create; payload: ToastDetail } - | { type: ToastAction.Remove; payload: string }; + { type: ToastAction.Create; payload: ToastDetail } | { type: ToastAction.Remove; payload: string }; /** * The default `state` of the reducer. diff --git a/src/common/utils/config.test.ts b/packages/web/src/common/utils/config.test.ts similarity index 100% rename from src/common/utils/config.test.ts rename to packages/web/src/common/utils/config.test.ts diff --git a/src/common/utils/config.ts b/packages/web/src/common/utils/config.ts similarity index 100% rename from src/common/utils/config.ts rename to packages/web/src/common/utils/config.ts diff --git a/src/common/utils/constants.ts b/packages/web/src/common/utils/constants.ts similarity index 98% rename from src/common/utils/constants.ts rename to packages/web/src/common/utils/constants.ts index a851244a..cf7e9b53 100644 --- a/src/common/utils/constants.ts +++ b/packages/web/src/common/utils/constants.ts @@ -1,4 +1,4 @@ -import { Settings } from 'common/api/useGetSettings'; +import { Settings } from '@/common/api/useGetSettings'; /** * Keys used with React Query cache. diff --git a/src/common/utils/css.test.ts b/packages/web/src/common/utils/css.test.ts similarity index 100% rename from src/common/utils/css.test.ts rename to packages/web/src/common/utils/css.test.ts diff --git a/src/common/utils/css.ts b/packages/web/src/common/utils/css.ts similarity index 100% rename from src/common/utils/css.ts rename to packages/web/src/common/utils/css.ts diff --git a/src/common/utils/i18n/i18n.test.ts b/packages/web/src/common/utils/i18n/i18n.test.ts similarity index 80% rename from src/common/utils/i18n/i18n.test.ts rename to packages/web/src/common/utils/i18n/i18n.test.ts index a63c52d7..470760bc 100644 --- a/src/common/utils/i18n/i18n.test.ts +++ b/packages/web/src/common/utils/i18n/i18n.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import i18n from 'common/utils/i18n'; +import i18n from '@/common/utils/i18n'; describe('i18n', () => { it('should initialize i18n', () => { diff --git a/src/common/utils/i18n/index.ts b/packages/web/src/common/utils/i18n/index.ts similarity index 93% rename from src/common/utils/i18n/index.ts rename to packages/web/src/common/utils/i18n/index.ts index 47463d8f..565bb29b 100644 --- a/src/common/utils/i18n/index.ts +++ b/packages/web/src/common/utils/i18n/index.ts @@ -2,7 +2,7 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; -import { StorageKey } from 'common/utils/constants'; +import { StorageKey } from '@/common/utils/constants'; // translation resources import en from './locales/en'; diff --git a/src/common/utils/i18n/locales/en/common.json b/packages/web/src/common/utils/i18n/locales/en/common.json similarity index 100% rename from src/common/utils/i18n/locales/en/common.json rename to packages/web/src/common/utils/i18n/locales/en/common.json diff --git a/src/common/utils/i18n/locales/en/index.ts b/packages/web/src/common/utils/i18n/locales/en/index.ts similarity index 100% rename from src/common/utils/i18n/locales/en/index.ts rename to packages/web/src/common/utils/i18n/locales/en/index.ts diff --git a/src/common/utils/i18n/locales/en/tasks.json b/packages/web/src/common/utils/i18n/locales/en/tasks.json similarity index 100% rename from src/common/utils/i18n/locales/en/tasks.json rename to packages/web/src/common/utils/i18n/locales/en/tasks.json diff --git a/src/common/utils/i18n/locales/es/common.json b/packages/web/src/common/utils/i18n/locales/es/common.json similarity index 100% rename from src/common/utils/i18n/locales/es/common.json rename to packages/web/src/common/utils/i18n/locales/es/common.json diff --git a/src/common/utils/i18n/locales/es/index.ts b/packages/web/src/common/utils/i18n/locales/es/index.ts similarity index 100% rename from src/common/utils/i18n/locales/es/index.ts rename to packages/web/src/common/utils/i18n/locales/es/index.ts diff --git a/src/common/utils/i18n/locales/es/tasks.json b/packages/web/src/common/utils/i18n/locales/es/tasks.json similarity index 100% rename from src/common/utils/i18n/locales/es/tasks.json rename to packages/web/src/common/utils/i18n/locales/es/tasks.json diff --git a/src/common/utils/i18n/locales/fr/common.json b/packages/web/src/common/utils/i18n/locales/fr/common.json similarity index 100% rename from src/common/utils/i18n/locales/fr/common.json rename to packages/web/src/common/utils/i18n/locales/fr/common.json diff --git a/src/common/utils/i18n/locales/fr/index.ts b/packages/web/src/common/utils/i18n/locales/fr/index.ts similarity index 100% rename from src/common/utils/i18n/locales/fr/index.ts rename to packages/web/src/common/utils/i18n/locales/fr/index.ts diff --git a/src/common/utils/i18n/locales/fr/tasks.json b/packages/web/src/common/utils/i18n/locales/fr/tasks.json similarity index 100% rename from src/common/utils/i18n/locales/fr/tasks.json rename to packages/web/src/common/utils/i18n/locales/fr/tasks.json diff --git a/src/common/utils/numbers.test.ts b/packages/web/src/common/utils/numbers.test.ts similarity index 97% rename from src/common/utils/numbers.test.ts rename to packages/web/src/common/utils/numbers.test.ts index 105169ad..dd91dea4 100644 --- a/src/common/utils/numbers.test.ts +++ b/packages/web/src/common/utils/numbers.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { formatNumber, toNumberBetween } from 'common/utils/numbers'; +import { formatNumber, toNumberBetween } from '@/common/utils/numbers'; describe('numbers', () => { describe('toNumberBetween', () => { diff --git a/src/common/utils/numbers.ts b/packages/web/src/common/utils/numbers.ts similarity index 100% rename from src/common/utils/numbers.ts rename to packages/web/src/common/utils/numbers.ts diff --git a/src/common/utils/storage.test.ts b/packages/web/src/common/utils/storage.test.ts similarity index 100% rename from src/common/utils/storage.test.ts rename to packages/web/src/common/utils/storage.test.ts diff --git a/src/common/utils/storage.ts b/packages/web/src/common/utils/storage.ts similarity index 100% rename from src/common/utils/storage.ts rename to packages/web/src/common/utils/storage.ts diff --git a/src/common/utils/suspense.test.tsx b/packages/web/src/common/utils/suspense.test.tsx similarity index 79% rename from src/common/utils/suspense.test.tsx rename to packages/web/src/common/utils/suspense.test.tsx index 99332372..41e46121 100644 --- a/src/common/utils/suspense.test.tsx +++ b/packages/web/src/common/utils/suspense.test.tsx @@ -1,8 +1,8 @@ import { lazy } from 'react'; import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; -const Text = lazy(() => import('common/components/Text/Text')); +import { render, screen } from '@/test/test-utils'; +const Text = lazy(() => import('@/common/components/Text/Text')); import { withSuspense } from './suspense'; diff --git a/src/common/utils/suspense.tsx b/packages/web/src/common/utils/suspense.tsx similarity index 83% rename from src/common/utils/suspense.tsx rename to packages/web/src/common/utils/suspense.tsx index 922439f2..e6a38ca6 100644 --- a/src/common/utils/suspense.tsx +++ b/packages/web/src/common/utils/suspense.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import LoaderSuspense from 'common/components/Loader/LoaderSuspense'; +import LoaderSuspense from '@/common/components/Loader/LoaderSuspense'; /** * Helper function which wraps the supplied `children` with the `LoaderSuspense` diff --git a/src/common/utils/types.ts b/packages/web/src/common/utils/types.ts similarity index 100% rename from src/common/utils/types.ts rename to packages/web/src/common/utils/types.ts diff --git a/src/index.css b/packages/web/src/index.css similarity index 100% rename from src/index.css rename to packages/web/src/index.css diff --git a/src/main.tsx b/packages/web/src/main.tsx similarity index 78% rename from src/main.tsx rename to packages/web/src/main.tsx index f917a2a2..e938b0ca 100644 --- a/src/main.tsx +++ b/packages/web/src/main.tsx @@ -1,8 +1,8 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; -import 'common/utils/i18n'; -import App from './App.tsx'; +import '@/common/utils/i18n'; +import App from './App'; import './index.css'; ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/pages/About/AboutPage.test.tsx b/packages/web/src/pages/About/AboutPage.test.tsx similarity index 98% rename from src/pages/About/AboutPage.test.tsx rename to packages/web/src/pages/About/AboutPage.test.tsx index 44bcb814..6b11967c 100644 --- a/src/pages/About/AboutPage.test.tsx +++ b/packages/web/src/pages/About/AboutPage.test.tsx @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import AboutPage from './AboutPage'; diff --git a/src/pages/About/AboutPage.tsx b/packages/web/src/pages/About/AboutPage.tsx similarity index 87% rename from src/pages/About/AboutPage.tsx rename to packages/web/src/pages/About/AboutPage.tsx index ef2c5ff5..c3da983d 100644 --- a/src/pages/About/AboutPage.tsx +++ b/packages/web/src/pages/About/AboutPage.tsx @@ -2,13 +2,13 @@ import { ColumnDef } from '@tanstack/react-table'; import { useTranslation } from 'react-i18next'; import dayjs from 'dayjs'; -import { config } from 'common/utils/config'; -import Page from 'common/components/Content/Page'; -import Container from 'common/components/Content/Container'; -import Heading from 'common/components/Text/Heading'; -import Card from 'common/components/Card/Card'; -import Table from 'common/components/Table/Table'; -import { DateFormat } from 'common/utils/constants'; +import { config } from '@/common/utils/config'; +import Page from '@/common/components/Content/Page'; +import Container from '@/common/components/Content/Container'; +import Heading from '@/common/components/Text/Heading'; +import Card from '@/common/components/Card/Card'; +import Table from '@/common/components/Table/Table'; +import { DateFormat } from '@/common/utils/constants'; /** * Represents a build info attribute entry. diff --git a/src/pages/Auth/Signin/SigninPage.test.tsx b/packages/web/src/pages/Auth/Signin/SigninPage.test.tsx similarity index 86% rename from src/pages/Auth/Signin/SigninPage.test.tsx rename to packages/web/src/pages/Auth/Signin/SigninPage.test.tsx index f86a58d9..de91085a 100644 --- a/src/pages/Auth/Signin/SigninPage.test.tsx +++ b/packages/web/src/pages/Auth/Signin/SigninPage.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SigninPage from './SigninPage'; diff --git a/src/pages/Auth/Signin/SigninPage.tsx b/packages/web/src/pages/Auth/Signin/SigninPage.tsx similarity index 73% rename from src/pages/Auth/Signin/SigninPage.tsx rename to packages/web/src/pages/Auth/Signin/SigninPage.tsx index 0125edae..9fab0386 100644 --- a/src/pages/Auth/Signin/SigninPage.tsx +++ b/packages/web/src/pages/Auth/Signin/SigninPage.tsx @@ -1,6 +1,6 @@ -import Page from 'common/components/Content/Page'; -import Container from 'common/components/Content/Container'; -import Heading from 'common/components/Text/Heading'; +import Page from '@/common/components/Content/Page'; +import Container from '@/common/components/Content/Container'; +import Heading from '@/common/components/Text/Heading'; import SigninForm from './components/SigninForm'; /** diff --git a/src/pages/Auth/Signin/api/useSignin.test.ts b/packages/web/src/pages/Auth/Signin/api/useSignin.test.ts similarity index 91% rename from src/pages/Auth/Signin/api/useSignin.test.ts rename to packages/web/src/pages/Auth/Signin/api/useSignin.test.ts index f992ac93..d5b6eea6 100644 --- a/src/pages/Auth/Signin/api/useSignin.test.ts +++ b/packages/web/src/pages/Auth/Signin/api/useSignin.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; -import storage from 'common/utils/storage'; +import { renderHook, waitFor } from '@/test/test-utils'; +import storage from '@/common/utils/storage'; import { useSignin } from './useSignin'; diff --git a/src/pages/Auth/Signin/api/useSignin.ts b/packages/web/src/pages/Auth/Signin/api/useSignin.ts similarity index 86% rename from src/pages/Auth/Signin/api/useSignin.ts rename to packages/web/src/pages/Auth/Signin/api/useSignin.ts index 846cba79..ce5764e3 100644 --- a/src/pages/Auth/Signin/api/useSignin.ts +++ b/packages/web/src/pages/Auth/Signin/api/useSignin.ts @@ -2,12 +2,12 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import dayjs from 'dayjs'; import find from 'lodash/find'; -import { User } from 'common/api/useGetUser'; -import { UserTokens } from 'common/api/useGetUserTokens'; -import { useAxios } from 'common/hooks/useAxios'; -import { config } from 'common/utils/config'; -import storage from 'common/utils/storage'; -import { QueryKey, StorageKey } from 'common/utils/constants'; +import { User } from '@/common/api/useGetUser'; +import { UserTokens } from '@/common/api/useGetUserTokens'; +import { useAxios } from '@/common/hooks/useAxios'; +import { config } from '@/common/utils/config'; +import storage from '@/common/utils/storage'; +import { QueryKey, StorageKey } from '@/common/utils/constants'; /** * An API hook which performs user authentication. diff --git a/src/pages/Auth/Signin/components/SigninForm.test.tsx b/packages/web/src/pages/Auth/Signin/components/SigninForm.test.tsx similarity index 97% rename from src/pages/Auth/Signin/components/SigninForm.test.tsx rename to packages/web/src/pages/Auth/Signin/components/SigninForm.test.tsx index 1cb262d7..728a0a66 100644 --- a/src/pages/Auth/Signin/components/SigninForm.test.tsx +++ b/packages/web/src/pages/Auth/Signin/components/SigninForm.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SigninForm from './SigninForm'; diff --git a/src/pages/Auth/Signin/components/SigninForm.tsx b/packages/web/src/pages/Auth/Signin/components/SigninForm.tsx similarity index 91% rename from src/pages/Auth/Signin/components/SigninForm.tsx rename to packages/web/src/pages/Auth/Signin/components/SigninForm.tsx index b9cf1fd7..ee50b0b0 100644 --- a/src/pages/Auth/Signin/components/SigninForm.tsx +++ b/packages/web/src/pages/Auth/Signin/components/SigninForm.tsx @@ -5,12 +5,12 @@ import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; import { useSignin } from '../api/useSignin'; -import Input from 'common/components/Form/Input'; -import Button from 'common/components/Button/Button'; -import ErrorAlert from 'common/components/Alert/ErrorAlert'; +import Input from '@/common/components/Form/Input'; +import Button from '@/common/components/Button/Button'; +import ErrorAlert from '@/common/components/Alert/ErrorAlert'; /** * Signin form values. diff --git a/src/pages/Auth/Signout/SignoutPage.test.tsx b/packages/web/src/pages/Auth/Signout/SignoutPage.test.tsx similarity index 93% rename from src/pages/Auth/Signout/SignoutPage.test.tsx rename to packages/web/src/pages/Auth/Signout/SignoutPage.test.tsx index c0138b91..1ac191da 100644 --- a/src/pages/Auth/Signout/SignoutPage.test.tsx +++ b/packages/web/src/pages/Auth/Signout/SignoutPage.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import SignoutPage from './SignoutPage'; diff --git a/src/pages/Auth/Signout/SignoutPage.tsx b/packages/web/src/pages/Auth/Signout/SignoutPage.tsx similarity index 84% rename from src/pages/Auth/Signout/SignoutPage.tsx rename to packages/web/src/pages/Auth/Signout/SignoutPage.tsx index aba66844..4e3b0ca9 100644 --- a/src/pages/Auth/Signout/SignoutPage.tsx +++ b/packages/web/src/pages/Auth/Signout/SignoutPage.tsx @@ -2,9 +2,9 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useSignout } from './api/useSignout'; -import Spinner from 'common/components/Loader/Spinner'; -import Page from 'common/components/Content/Page'; -import Container from 'common/components/Content/Container'; +import Spinner from '@/common/components/Loader/Spinner'; +import Page from '@/common/components/Content/Page'; +import Container from '@/common/components/Content/Container'; /** * The `SignoutPage` component deauthenticates the current user and redirects diff --git a/src/pages/Auth/Signout/api/useSignout.test.ts b/packages/web/src/pages/Auth/Signout/api/useSignout.test.ts similarity index 91% rename from src/pages/Auth/Signout/api/useSignout.test.ts rename to packages/web/src/pages/Auth/Signout/api/useSignout.test.ts index 35709d51..8e120fa9 100644 --- a/src/pages/Auth/Signout/api/useSignout.test.ts +++ b/packages/web/src/pages/Auth/Signout/api/useSignout.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; -import storage from 'common/utils/storage'; -import { renderHook, waitFor } from 'test/test-utils'; +import storage from '@/common/utils/storage'; +import { renderHook, waitFor } from '@/test/test-utils'; import { useSignout } from './useSignout'; diff --git a/src/pages/Auth/Signout/api/useSignout.ts b/packages/web/src/pages/Auth/Signout/api/useSignout.ts similarity index 91% rename from src/pages/Auth/Signout/api/useSignout.ts rename to packages/web/src/pages/Auth/Signout/api/useSignout.ts index ad19dcd3..07cc0699 100644 --- a/src/pages/Auth/Signout/api/useSignout.ts +++ b/packages/web/src/pages/Auth/Signout/api/useSignout.ts @@ -1,6 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { QueryKey, StorageKey } from 'common/utils/constants'; -import storage from 'common/utils/storage'; + +import { QueryKey, StorageKey } from '@/common/utils/constants'; +import storage from '@/common/utils/storage'; /** * An API hook which deauthenticates the currently authenticated user. diff --git a/src/pages/Components/ComponentsPage.test.tsx b/packages/web/src/pages/Components/ComponentsPage.test.tsx similarity index 87% rename from src/pages/Components/ComponentsPage.test.tsx rename to packages/web/src/pages/Components/ComponentsPage.test.tsx index c5d36f73..9ac54fdd 100644 --- a/src/pages/Components/ComponentsPage.test.tsx +++ b/packages/web/src/pages/Components/ComponentsPage.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ComponentsPage from './ComponentsPage'; diff --git a/src/pages/Components/ComponentsPage.tsx b/packages/web/src/pages/Components/ComponentsPage.tsx similarity index 93% rename from src/pages/Components/ComponentsPage.tsx rename to packages/web/src/pages/Components/ComponentsPage.tsx index 668bacf9..219d39d2 100644 --- a/src/pages/Components/ComponentsPage.tsx +++ b/packages/web/src/pages/Components/ComponentsPage.tsx @@ -1,12 +1,12 @@ import { useEffect } from 'react'; import { Outlet, useLocation } from 'react-router-dom'; -import Page from 'common/components/Content/Page'; -import Container from 'common/components/Content/Container'; -import MenuNavLink from 'common/components/Menu/MenuNavLink'; -import Heading from 'common/components/Text/Heading'; +import Page from '@/common/components/Content/Page'; +import Container from '@/common/components/Content/Container'; +import MenuNavLink from '@/common/components/Menu/MenuNavLink'; +import Heading from '@/common/components/Text/Heading'; import ComponentsPageBreadcrumbs from './components/ComponentsPageBreadcrumbs'; -import Columns from 'common/components/Content/Columns'; +import Columns from '@/common/components/Content/Columns'; /** * The `ComponentsPage` component renders the layout for the components page. diff --git a/src/pages/Components/components/AccordionComponents.test.tsx b/packages/web/src/pages/Components/components/AccordionComponents.test.tsx similarity index 88% rename from src/pages/Components/components/AccordionComponents.test.tsx rename to packages/web/src/pages/Components/components/AccordionComponents.test.tsx index 012f7095..74f8faed 100644 --- a/src/pages/Components/components/AccordionComponents.test.tsx +++ b/packages/web/src/pages/Components/components/AccordionComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import AccordionComponents from './AccordionComponents'; diff --git a/src/pages/Components/components/AccordionComponents.tsx b/packages/web/src/pages/Components/components/AccordionComponents.tsx similarity index 97% rename from src/pages/Components/components/AccordionComponents.tsx rename to packages/web/src/pages/Components/components/AccordionComponents.tsx index e1d24205..ee973454 100644 --- a/src/pages/Components/components/AccordionComponents.tsx +++ b/packages/web/src/pages/Components/components/AccordionComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Accordion from 'common/components/Accordion/Accordion'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Accordion from '@/common/components/Accordion/Accordion'; /** * The `AccordionComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/AlertComponents.test.tsx b/packages/web/src/pages/Components/components/AlertComponents.test.tsx similarity index 87% rename from src/pages/Components/components/AlertComponents.test.tsx rename to packages/web/src/pages/Components/components/AlertComponents.test.tsx index dd8f0158..86f8af72 100644 --- a/src/pages/Components/components/AlertComponents.test.tsx +++ b/packages/web/src/pages/Components/components/AlertComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import AlertComponents from './AlertComponents'; diff --git a/src/pages/Components/components/AlertComponents.tsx b/packages/web/src/pages/Components/components/AlertComponents.tsx similarity index 95% rename from src/pages/Components/components/AlertComponents.tsx rename to packages/web/src/pages/Components/components/AlertComponents.tsx index 4c8cc700..ea4a3034 100644 --- a/src/pages/Components/components/AlertComponents.tsx +++ b/packages/web/src/pages/Components/components/AlertComponents.tsx @@ -1,12 +1,12 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; import { AlertCircleIcon, HeartHandshake } from 'lucide-react'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import { Alert, AlertDescription, AlertTitle } from 'common/components/shadcn/alert'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import { Alert, AlertDescription, AlertTitle } from '@/common/components/shadcn/alert'; /** * The `AlertComponents` React component renders a set of examples illustrating diff --git a/src/pages/Components/components/AvatarComponents.test.tsx b/packages/web/src/pages/Components/components/AvatarComponents.test.tsx similarity index 94% rename from src/pages/Components/components/AvatarComponents.test.tsx rename to packages/web/src/pages/Components/components/AvatarComponents.test.tsx index 3fef9222..3f0d96c9 100644 --- a/src/pages/Components/components/AvatarComponents.test.tsx +++ b/packages/web/src/pages/Components/components/AvatarComponents.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import AvatarComponents from './AvatarComponents'; describe('AvatarComponents', () => { diff --git a/src/pages/Components/components/AvatarComponents.tsx b/packages/web/src/pages/Components/components/AvatarComponents.tsx similarity index 85% rename from src/pages/Components/components/AvatarComponents.tsx rename to packages/web/src/pages/Components/components/AvatarComponents.tsx index 8125db0c..2a66ab18 100644 --- a/src/pages/Components/components/AvatarComponents.tsx +++ b/packages/web/src/pages/Components/components/AvatarComponents.tsx @@ -1,25 +1,19 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import avatarPicture from './avatar-picture.png'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Avatar from 'common/components/Icon/Avatar'; -import Heading from 'common/components/Text/Heading'; - -/** - * Properties for the `AvatarComponents` React component. - * @see {@link BaseComponentProps} - */ -interface AvatarComponentsProps extends BaseComponentProps {} +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Avatar from '@/common/components/Icon/Avatar'; +import Heading from '@/common/components/Text/Heading'; /** * The `AvatarComponents` React component renders a set of examples illustrating * the use of the `Avatar` component. - * @param {AvatarComponentsProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const AvatarComponents = ({ className, testId = 'components-avatar' }: AvatarComponentsProps) => { +const AvatarComponents = ({ className, testId = 'components-avatar' }: BaseComponentProps) => { const data: ComponentProperty[] = [ { name: 'className', diff --git a/src/pages/Components/components/BadgeComponents.test.tsx b/packages/web/src/pages/Components/components/BadgeComponents.test.tsx similarity index 94% rename from src/pages/Components/components/BadgeComponents.test.tsx rename to packages/web/src/pages/Components/components/BadgeComponents.test.tsx index e3d20394..0928e935 100644 --- a/src/pages/Components/components/BadgeComponents.test.tsx +++ b/packages/web/src/pages/Components/components/BadgeComponents.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import BadgeComponents from './BadgeComponents'; describe('BadgeComponents', () => { diff --git a/src/pages/Components/components/BadgeComponents.tsx b/packages/web/src/pages/Components/components/BadgeComponents.tsx similarity index 87% rename from src/pages/Components/components/BadgeComponents.tsx rename to packages/web/src/pages/Components/components/BadgeComponents.tsx index 2b744bce..7486df59 100644 --- a/src/pages/Components/components/BadgeComponents.tsx +++ b/packages/web/src/pages/Components/components/BadgeComponents.tsx @@ -1,24 +1,18 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Badge from 'common/components/Badge/Badge'; -import Heading from 'common/components/Text/Heading'; - -/** - * Properties for the `BadgeComponents` React component. - * @see {@link BaseComponentProps} - */ -interface BadgeComponentsProps extends BaseComponentProps {} +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Badge from '@/common/components/Badge/Badge'; +import Heading from '@/common/components/Text/Heading'; /** * The `BadgeComponents` React component renders a set of examples illustrating * the use of the `Badge` component. - * @param {BadgeComponentsProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const BadgeComponents = ({ className, testId = 'components-badge' }: BadgeComponentsProps) => { +const BadgeComponents = ({ className, testId = 'components-badge' }: BaseComponentProps) => { const data: ComponentProperty[] = [ { name: 'children', diff --git a/src/pages/Components/components/BreadcrumbsComponents.test.tsx b/packages/web/src/pages/Components/components/BreadcrumbsComponents.test.tsx similarity index 88% rename from src/pages/Components/components/BreadcrumbsComponents.test.tsx rename to packages/web/src/pages/Components/components/BreadcrumbsComponents.test.tsx index 375d2629..7d4852d7 100644 --- a/src/pages/Components/components/BreadcrumbsComponents.test.tsx +++ b/packages/web/src/pages/Components/components/BreadcrumbsComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import BreadcrumbsComponents from './BreadcrumbsComponents'; diff --git a/src/pages/Components/components/BreadcrumbsComponents.tsx b/packages/web/src/pages/Components/components/BreadcrumbsComponents.tsx similarity index 92% rename from src/pages/Components/components/BreadcrumbsComponents.tsx rename to packages/web/src/pages/Components/components/BreadcrumbsComponents.tsx index 26fc452e..6eb56212 100644 --- a/src/pages/Components/components/BreadcrumbsComponents.tsx +++ b/packages/web/src/pages/Components/components/BreadcrumbsComponents.tsx @@ -1,12 +1,12 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Breadcrumbs from 'common/components/Breadcrumbs/Breadcrumbs'; -import DropdownMenu from 'common/components/Dropdown/DropdownMenu'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Breadcrumbs from '@/common/components/Breadcrumbs/Breadcrumbs'; +import DropdownMenu from '@/common/components/Dropdown/DropdownMenu'; /** * The `BreadcrumbsComponents` React component renders a set of examples illustrating diff --git a/src/pages/Components/components/ButtonComponents.test.tsx b/packages/web/src/pages/Components/components/ButtonComponents.test.tsx similarity index 96% rename from src/pages/Components/components/ButtonComponents.test.tsx rename to packages/web/src/pages/Components/components/ButtonComponents.test.tsx index a606621d..6a002f7f 100644 --- a/src/pages/Components/components/ButtonComponents.test.tsx +++ b/packages/web/src/pages/Components/components/ButtonComponents.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ButtonComponents from './ButtonComponents'; import userEvent from '@testing-library/user-event'; diff --git a/src/pages/Components/components/ButtonComponents.tsx b/packages/web/src/pages/Components/components/ButtonComponents.tsx similarity index 89% rename from src/pages/Components/components/ButtonComponents.tsx rename to packages/web/src/pages/Components/components/ButtonComponents.tsx index a64d070a..3376a080 100644 --- a/src/pages/Components/components/ButtonComponents.tsx +++ b/packages/web/src/pages/Components/components/ButtonComponents.tsx @@ -1,24 +1,18 @@ -import { BaseComponentProps } from 'common/utils/types'; -import Button from 'common/components/Button/Button'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; +import { BaseComponentProps } from '@/common/utils/types'; +import Button from '@/common/components/Button/Button'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; import { ComponentProperty } from '../model/components'; import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import Table from 'common/components/Table/Table'; -import FAIcon from 'common/components/Icon/FAIcon'; -import Heading from 'common/components/Text/Heading'; - -/** - * Properties for the `ButtonComponents` React component. - * @see {@link BaseComponentProps} - */ -interface ButtonComponentsProps extends BaseComponentProps {} +import Table from '@/common/components/Table/Table'; +import FAIcon from '@/common/components/Icon/FAIcon'; +import Heading from '@/common/components/Text/Heading'; /** * The `ButtonComponents` React component renders a set of examples illustrating * the use of the `Button` component. - * @param {ButtonComponentsProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const ButtonComponents = ({ className, testId = 'components-button' }: ButtonComponentsProps) => { +const ButtonComponents = ({ className, testId = 'components-button' }: BaseComponentProps) => { const data: ComponentProperty[] = [ { name: 'children', diff --git a/src/pages/Components/components/CardComponents.test.tsx b/packages/web/src/pages/Components/components/CardComponents.test.tsx similarity index 94% rename from src/pages/Components/components/CardComponents.test.tsx rename to packages/web/src/pages/Components/components/CardComponents.test.tsx index 928e9f10..7dc6424b 100644 --- a/src/pages/Components/components/CardComponents.test.tsx +++ b/packages/web/src/pages/Components/components/CardComponents.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import CardComponents from './CardComponents'; describe('CardComponents', () => { diff --git a/src/pages/Components/components/CardComponents.tsx b/packages/web/src/pages/Components/components/CardComponents.tsx similarity index 95% rename from src/pages/Components/components/CardComponents.tsx rename to packages/web/src/pages/Components/components/CardComponents.tsx index 1c489613..a04fadaf 100644 --- a/src/pages/Components/components/CardComponents.tsx +++ b/packages/web/src/pages/Components/components/CardComponents.tsx @@ -1,26 +1,20 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Card from 'common/components/Card/Card'; -import MessageCard from 'common/components/Card/MessageCard'; -import Heading from 'common/components/Text/Heading'; -import Button from 'common/components/Button/Button'; - -/** - * Properties for the `CardComponents` React component. - * @see {@link BaseComponentProps} - */ -interface CardComponentsProps extends BaseComponentProps {} +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Card from '@/common/components/Card/Card'; +import MessageCard from '@/common/components/Card/MessageCard'; +import Heading from '@/common/components/Text/Heading'; +import Button from '@/common/components/Button/Button'; /** * The `CardComponents` React component renders a set of examples illustrating * the use of the `Card` family of components. - * @param {CardComponentsProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const CardComponents = ({ className, testId = 'components-card' }: CardComponentsProps) => { +const CardComponents = ({ className, testId = 'components-card' }: BaseComponentProps) => { const columnHelper = createColumnHelper(); const cardData: ComponentProperty[] = [ { diff --git a/src/pages/Components/components/CheckboxComponents.test.tsx b/packages/web/src/pages/Components/components/CheckboxComponents.test.tsx similarity index 95% rename from src/pages/Components/components/CheckboxComponents.test.tsx rename to packages/web/src/pages/Components/components/CheckboxComponents.test.tsx index 42d635a2..b71a4dff 100644 --- a/src/pages/Components/components/CheckboxComponents.test.tsx +++ b/packages/web/src/pages/Components/components/CheckboxComponents.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import CheckboxComponents from './CheckboxComponents'; diff --git a/src/pages/Components/components/CheckboxComponents.tsx b/packages/web/src/pages/Components/components/CheckboxComponents.tsx similarity index 95% rename from src/pages/Components/components/CheckboxComponents.tsx rename to packages/web/src/pages/Components/components/CheckboxComponents.tsx index f7e65398..7457c095 100644 --- a/src/pages/Components/components/CheckboxComponents.tsx +++ b/packages/web/src/pages/Components/components/CheckboxComponents.tsx @@ -4,13 +4,13 @@ import noop from 'lodash/noop'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Button from 'common/components/Button/Button'; -import Checkbox from 'common/components/Form/Checkbox'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Button from '@/common/components/Button/Button'; +import Checkbox from '@/common/components/Form/Checkbox'; /** * The `CheckboxComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/ColumnsComponents.test.tsx b/packages/web/src/pages/Components/components/ColumnsComponents.test.tsx similarity index 88% rename from src/pages/Components/components/ColumnsComponents.test.tsx rename to packages/web/src/pages/Components/components/ColumnsComponents.test.tsx index 7f73553e..53af3eab 100644 --- a/src/pages/Components/components/ColumnsComponents.test.tsx +++ b/packages/web/src/pages/Components/components/ColumnsComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ColumnsComponents from './ColumnsComponents'; diff --git a/src/pages/Components/components/ColumnsComponents.tsx b/packages/web/src/pages/Components/components/ColumnsComponents.tsx similarity index 95% rename from src/pages/Components/components/ColumnsComponents.tsx rename to packages/web/src/pages/Components/components/ColumnsComponents.tsx index b08b3ca7..543e4355 100644 --- a/src/pages/Components/components/ColumnsComponents.tsx +++ b/packages/web/src/pages/Components/components/ColumnsComponents.tsx @@ -1,12 +1,12 @@ import { PropsWithChildren } from 'react'; import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Columns from 'common/components/Content/Columns'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Columns from '@/common/components/Content/Columns'; /** * The `ColumnsComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx b/packages/web/src/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx similarity index 96% rename from src/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx rename to packages/web/src/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx index afebd2e8..2cc59df3 100644 --- a/src/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx +++ b/packages/web/src/pages/Components/components/ComponentsPageBreadcrumbs.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { Navigate, Route, Routes } from 'react-router-dom'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ComponentsPageBreadcrumbs from './ComponentsPageBreadcrumbs'; diff --git a/src/pages/Components/components/ComponentsPageBreadcrumbs.tsx b/packages/web/src/pages/Components/components/ComponentsPageBreadcrumbs.tsx similarity index 90% rename from src/pages/Components/components/ComponentsPageBreadcrumbs.tsx rename to packages/web/src/pages/Components/components/ComponentsPageBreadcrumbs.tsx index cba18424..34e5770c 100644 --- a/src/pages/Components/components/ComponentsPageBreadcrumbs.tsx +++ b/packages/web/src/pages/Components/components/ComponentsPageBreadcrumbs.tsx @@ -1,7 +1,7 @@ import { useLocation } from 'react-router-dom'; -import { BaseComponentProps } from 'common/utils/types'; -import Breadcrumbs from 'common/components/Breadcrumbs/Breadcrumbs'; +import { BaseComponentProps } from '@/common/utils/types'; +import Breadcrumbs from '@/common/components/Breadcrumbs/Breadcrumbs'; /** * The `ComponentsPageBreadcrumbs` component renders the `Breadcrumbs` for the components diff --git a/src/pages/Components/components/ContainerComponents.test.tsx b/packages/web/src/pages/Components/components/ContainerComponents.test.tsx similarity index 88% rename from src/pages/Components/components/ContainerComponents.test.tsx rename to packages/web/src/pages/Components/components/ContainerComponents.test.tsx index 908acec9..9710181b 100644 --- a/src/pages/Components/components/ContainerComponents.test.tsx +++ b/packages/web/src/pages/Components/components/ContainerComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ContainerComponents from './ContainerComponents'; diff --git a/src/pages/Components/components/ContainerComponents.tsx b/packages/web/src/pages/Components/components/ContainerComponents.tsx similarity index 95% rename from src/pages/Components/components/ContainerComponents.tsx rename to packages/web/src/pages/Components/components/ContainerComponents.tsx index 50dbfafb..1167cfff 100644 --- a/src/pages/Components/components/ContainerComponents.tsx +++ b/packages/web/src/pages/Components/components/ContainerComponents.tsx @@ -1,12 +1,12 @@ import { PropsWithChildren } from 'react'; import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Container from 'common/components/Content/Container'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Container from '@/common/components/Content/Container'; /** * The `ContainerComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/DialogComponents.test.tsx b/packages/web/src/pages/Components/components/DialogComponents.test.tsx similarity index 94% rename from src/pages/Components/components/DialogComponents.test.tsx rename to packages/web/src/pages/Components/components/DialogComponents.test.tsx index 08e29ae7..fd3c3054 100644 --- a/src/pages/Components/components/DialogComponents.test.tsx +++ b/packages/web/src/pages/Components/components/DialogComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import DialogComponents from './DialogComponents'; import userEvent from '@testing-library/user-event'; diff --git a/src/pages/Components/components/DialogComponents.tsx b/packages/web/src/pages/Components/components/DialogComponents.tsx similarity index 96% rename from src/pages/Components/components/DialogComponents.tsx rename to packages/web/src/pages/Components/components/DialogComponents.tsx index a0918ee6..7630bb32 100644 --- a/src/pages/Components/components/DialogComponents.tsx +++ b/packages/web/src/pages/Components/components/DialogComponents.tsx @@ -1,12 +1,12 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Dialog from 'common/components/Dialog/Dialog'; -import Button from 'common/components/Button/Button'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Dialog from '@/common/components/Dialog/Dialog'; +import Button from '@/common/components/Button/Button'; /** * The `DialogComponents` React component renders a set of examples illustrating diff --git a/src/pages/Components/components/DividerComponents.test.tsx b/packages/web/src/pages/Components/components/DividerComponents.test.tsx similarity index 88% rename from src/pages/Components/components/DividerComponents.test.tsx rename to packages/web/src/pages/Components/components/DividerComponents.test.tsx index 99807ae6..81ce99ad 100644 --- a/src/pages/Components/components/DividerComponents.test.tsx +++ b/packages/web/src/pages/Components/components/DividerComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import DividerComponents from './DividerComponents'; diff --git a/src/pages/Components/components/DividerComponents.tsx b/packages/web/src/pages/Components/components/DividerComponents.tsx similarity index 93% rename from src/pages/Components/components/DividerComponents.tsx rename to packages/web/src/pages/Components/components/DividerComponents.tsx index 457a2340..4941442a 100644 --- a/src/pages/Components/components/DividerComponents.tsx +++ b/packages/web/src/pages/Components/components/DividerComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Divider from 'common/components/Divider/Divider'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Divider from '@/common/components/Divider/Divider'; /** * The `DividerComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/DropdownComponents.test.tsx b/packages/web/src/pages/Components/components/DropdownComponents.test.tsx similarity index 95% rename from src/pages/Components/components/DropdownComponents.test.tsx rename to packages/web/src/pages/Components/components/DropdownComponents.test.tsx index 2dec15fb..d316b8da 100644 --- a/src/pages/Components/components/DropdownComponents.test.tsx +++ b/packages/web/src/pages/Components/components/DropdownComponents.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import DropdownComponents from './DropdownComponents'; diff --git a/src/pages/Components/components/DropdownComponents.tsx b/packages/web/src/pages/Components/components/DropdownComponents.tsx similarity index 91% rename from src/pages/Components/components/DropdownComponents.tsx rename to packages/web/src/pages/Components/components/DropdownComponents.tsx index f52d1187..88888f75 100644 --- a/src/pages/Components/components/DropdownComponents.tsx +++ b/packages/web/src/pages/Components/components/DropdownComponents.tsx @@ -1,13 +1,13 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import DropdownMenu from 'common/components/Dropdown/DropdownMenu'; -import Button from 'common/components/Button/Button'; -import FAIcon from 'common/components/Icon/FAIcon'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import DropdownMenu from '@/common/components/Dropdown/DropdownMenu'; +import Button from '@/common/components/Button/Button'; +import FAIcon from '@/common/components/Icon/FAIcon'; /** * The `DropdownComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/HeadingComponents.test.tsx b/packages/web/src/pages/Components/components/HeadingComponents.test.tsx similarity index 88% rename from src/pages/Components/components/HeadingComponents.test.tsx rename to packages/web/src/pages/Components/components/HeadingComponents.test.tsx index 059a095d..183e7fef 100644 --- a/src/pages/Components/components/HeadingComponents.test.tsx +++ b/packages/web/src/pages/Components/components/HeadingComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import HeadingComponents from './HeadingComponents'; diff --git a/src/pages/Components/components/HeadingComponents.tsx b/packages/web/src/pages/Components/components/HeadingComponents.tsx similarity index 94% rename from src/pages/Components/components/HeadingComponents.tsx rename to packages/web/src/pages/Components/components/HeadingComponents.tsx index 92365d94..d548dfb6 100644 --- a/src/pages/Components/components/HeadingComponents.tsx +++ b/packages/web/src/pages/Components/components/HeadingComponents.tsx @@ -1,10 +1,10 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; +import { BaseComponentProps } from '@/common/utils/types'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import Heading from 'common/components/Text/Heading'; +import Table from '@/common/components/Table/Table'; +import Heading from '@/common/components/Text/Heading'; /** * The `HeadingComponents` React component renders a set of examples illustrating diff --git a/src/pages/Components/components/HelpTextComponents.test.tsx b/packages/web/src/pages/Components/components/HelpTextComponents.test.tsx similarity index 88% rename from src/pages/Components/components/HelpTextComponents.test.tsx rename to packages/web/src/pages/Components/components/HelpTextComponents.test.tsx index 207cedcc..7c6e2132 100644 --- a/src/pages/Components/components/HelpTextComponents.test.tsx +++ b/packages/web/src/pages/Components/components/HelpTextComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import HelpTextComponents from './HelpTextComponents'; diff --git a/src/pages/Components/components/HelpTextComponents.tsx b/packages/web/src/pages/Components/components/HelpTextComponents.tsx similarity index 91% rename from src/pages/Components/components/HelpTextComponents.tsx rename to packages/web/src/pages/Components/components/HelpTextComponents.tsx index 13ca5f61..9225ff90 100644 --- a/src/pages/Components/components/HelpTextComponents.tsx +++ b/packages/web/src/pages/Components/components/HelpTextComponents.tsx @@ -1,12 +1,12 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import HelpText from 'common/components/Text/HelpText'; -import FAIcon from 'common/components/Icon/FAIcon'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import HelpText from '@/common/components/Text/HelpText'; +import FAIcon from '@/common/components/Icon/FAIcon'; /** * The `HelpTextComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/IconComponents.test.tsx b/packages/web/src/pages/Components/components/IconComponents.test.tsx similarity index 87% rename from src/pages/Components/components/IconComponents.test.tsx rename to packages/web/src/pages/Components/components/IconComponents.test.tsx index 603f1b19..ef940532 100644 --- a/src/pages/Components/components/IconComponents.test.tsx +++ b/packages/web/src/pages/Components/components/IconComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import IconComponents from './IconComponents'; diff --git a/src/pages/Components/components/IconComponents.tsx b/packages/web/src/pages/Components/components/IconComponents.tsx similarity index 94% rename from src/pages/Components/components/IconComponents.tsx rename to packages/web/src/pages/Components/components/IconComponents.tsx index f3fc06db..4f86b192 100644 --- a/src/pages/Components/components/IconComponents.tsx +++ b/packages/web/src/pages/Components/components/IconComponents.tsx @@ -1,13 +1,13 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Link from 'common/components/Link/Link'; -import FAIcon from 'common/components/Icon/FAIcon'; -import Columns from 'common/components/Content/Columns'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Link from '@/common/components/Link/Link'; +import FAIcon from '@/common/components/Icon/FAIcon'; +import Columns from '@/common/components/Content/Columns'; /** * The `IconComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/InputComponents.test.tsx b/packages/web/src/pages/Components/components/InputComponents.test.tsx similarity index 94% rename from src/pages/Components/components/InputComponents.test.tsx rename to packages/web/src/pages/Components/components/InputComponents.test.tsx index 114c1147..1d8106e6 100644 --- a/src/pages/Components/components/InputComponents.test.tsx +++ b/packages/web/src/pages/Components/components/InputComponents.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import InputComponents from './InputComponents'; diff --git a/src/pages/Components/components/InputComponents.tsx b/packages/web/src/pages/Components/components/InputComponents.tsx similarity index 96% rename from src/pages/Components/components/InputComponents.tsx rename to packages/web/src/pages/Components/components/InputComponents.tsx index 7cf34db2..b0475920 100644 --- a/src/pages/Components/components/InputComponents.tsx +++ b/packages/web/src/pages/Components/components/InputComponents.tsx @@ -4,13 +4,13 @@ import noop from 'lodash/noop'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Input from 'common/components/Form/Input'; -import Button from 'common/components/Button/Button'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Input from '@/common/components/Form/Input'; +import Button from '@/common/components/Button/Button'; /** * The `InputComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/LabelComponents.test.tsx b/packages/web/src/pages/Components/components/LabelComponents.test.tsx similarity index 87% rename from src/pages/Components/components/LabelComponents.test.tsx rename to packages/web/src/pages/Components/components/LabelComponents.test.tsx index 3b860b00..bd92f8a4 100644 --- a/src/pages/Components/components/LabelComponents.test.tsx +++ b/packages/web/src/pages/Components/components/LabelComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import LabelComponents from './LabelComponents'; diff --git a/src/pages/Components/components/LabelComponents.tsx b/packages/web/src/pages/Components/components/LabelComponents.tsx similarity index 93% rename from src/pages/Components/components/LabelComponents.tsx rename to packages/web/src/pages/Components/components/LabelComponents.tsx index fee271ff..7e0d2661 100644 --- a/src/pages/Components/components/LabelComponents.tsx +++ b/packages/web/src/pages/Components/components/LabelComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Label from 'common/components/Form/Label'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Label from '@/common/components/Form/Label'; /** * The `LabelComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/LinkComponents.test.tsx b/packages/web/src/pages/Components/components/LinkComponents.test.tsx similarity index 87% rename from src/pages/Components/components/LinkComponents.test.tsx rename to packages/web/src/pages/Components/components/LinkComponents.test.tsx index c321a0df..c0211d38 100644 --- a/src/pages/Components/components/LinkComponents.test.tsx +++ b/packages/web/src/pages/Components/components/LinkComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import LinkComponents from './LinkComponents'; diff --git a/src/pages/Components/components/LinkComponents.tsx b/packages/web/src/pages/Components/components/LinkComponents.tsx similarity index 94% rename from src/pages/Components/components/LinkComponents.tsx rename to packages/web/src/pages/Components/components/LinkComponents.tsx index 95c868f0..dfc77f5c 100644 --- a/src/pages/Components/components/LinkComponents.tsx +++ b/packages/web/src/pages/Components/components/LinkComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Link from 'common/components/Link/Link'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Link from '@/common/components/Link/Link'; /** * The `LinkComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/PageComponents.test.tsx b/packages/web/src/pages/Components/components/PageComponents.test.tsx similarity index 87% rename from src/pages/Components/components/PageComponents.test.tsx rename to packages/web/src/pages/Components/components/PageComponents.test.tsx index 07d4bc85..21417943 100644 --- a/src/pages/Components/components/PageComponents.test.tsx +++ b/packages/web/src/pages/Components/components/PageComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import PageComponents from './PageComponents'; diff --git a/src/pages/Components/components/PageComponents.tsx b/packages/web/src/pages/Components/components/PageComponents.tsx similarity index 90% rename from src/pages/Components/components/PageComponents.tsx rename to packages/web/src/pages/Components/components/PageComponents.tsx index f6a109d1..d96245b1 100644 --- a/src/pages/Components/components/PageComponents.tsx +++ b/packages/web/src/pages/Components/components/PageComponents.tsx @@ -1,12 +1,12 @@ import { PropsWithChildren } from 'react'; import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Page from 'common/components/Content/Page'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Page from '@/common/components/Content/Page'; /** * The `PageComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/PopoverComponents.test.tsx b/packages/web/src/pages/Components/components/PopoverComponents.test.tsx similarity index 88% rename from src/pages/Components/components/PopoverComponents.test.tsx rename to packages/web/src/pages/Components/components/PopoverComponents.test.tsx index cc219a96..1982966c 100644 --- a/src/pages/Components/components/PopoverComponents.test.tsx +++ b/packages/web/src/pages/Components/components/PopoverComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import PopoverComponents from './PopoverComponents'; diff --git a/src/pages/Components/components/PopoverComponents.tsx b/packages/web/src/pages/Components/components/PopoverComponents.tsx similarity index 96% rename from src/pages/Components/components/PopoverComponents.tsx rename to packages/web/src/pages/Components/components/PopoverComponents.tsx index 4f415bf1..39744467 100644 --- a/src/pages/Components/components/PopoverComponents.tsx +++ b/packages/web/src/pages/Components/components/PopoverComponents.tsx @@ -1,12 +1,12 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Popover from 'common/components/Popover/Popover'; -import Card from 'common/components/Card/Card'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Popover from '@/common/components/Popover/Popover'; +import Card from '@/common/components/Card/Card'; /** * The `PopoverComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/RadioGroupComponents.test.tsx b/packages/web/src/pages/Components/components/RadioGroupComponents.test.tsx similarity index 96% rename from src/pages/Components/components/RadioGroupComponents.test.tsx rename to packages/web/src/pages/Components/components/RadioGroupComponents.test.tsx index 67c6e2c9..beb5152b 100644 --- a/src/pages/Components/components/RadioGroupComponents.test.tsx +++ b/packages/web/src/pages/Components/components/RadioGroupComponents.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import RadioGroupComponents from './RadioGroupComponents'; diff --git a/src/pages/Components/components/RadioGroupComponents.tsx b/packages/web/src/pages/Components/components/RadioGroupComponents.tsx similarity index 97% rename from src/pages/Components/components/RadioGroupComponents.tsx rename to packages/web/src/pages/Components/components/RadioGroupComponents.tsx index 838424e5..18502221 100644 --- a/src/pages/Components/components/RadioGroupComponents.tsx +++ b/packages/web/src/pages/Components/components/RadioGroupComponents.tsx @@ -4,13 +4,13 @@ import noop from 'lodash/noop'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Button from 'common/components/Button/Button'; -import RadioGroup from 'common/components/Form/RadioGroup'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Button from '@/common/components/Button/Button'; +import RadioGroup from '@/common/components/Form/RadioGroup'; /** * The `RadioGroupComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/SearchInputComponents.test.tsx b/packages/web/src/pages/Components/components/SearchInputComponents.test.tsx similarity index 97% rename from src/pages/Components/components/SearchInputComponents.test.tsx rename to packages/web/src/pages/Components/components/SearchInputComponents.test.tsx index 96b0ec26..c90406cd 100644 --- a/src/pages/Components/components/SearchInputComponents.test.tsx +++ b/packages/web/src/pages/Components/components/SearchInputComponents.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SearchInputComponents from './SearchInputComponents'; diff --git a/src/pages/Components/components/SearchInputComponents.tsx b/packages/web/src/pages/Components/components/SearchInputComponents.tsx similarity index 91% rename from src/pages/Components/components/SearchInputComponents.tsx rename to packages/web/src/pages/Components/components/SearchInputComponents.tsx index c6738bfe..be4fddfe 100644 --- a/src/pages/Components/components/SearchInputComponents.tsx +++ b/packages/web/src/pages/Components/components/SearchInputComponents.tsx @@ -3,17 +3,17 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; import { filter } from 'lodash'; import { map } from 'lodash'; -import { BaseComponentProps } from 'common/utils/types'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; +import { BaseComponentProps } from '@/common/utils/types'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import SearchInput from 'common/components/Form/SearchInput'; -import SearchResult from 'common/components/Form/SearchResult'; -import Heading from 'common/components/Text/Heading'; +import Table from '@/common/components/Table/Table'; +import SearchInput from '@/common/components/Form/SearchInput'; +import SearchResult from '@/common/components/Form/SearchResult'; +import Heading from '@/common/components/Text/Heading'; /** * The `SearchInputComponents` React component renders a set of examples illustrating - * the use of the `SearchField` component. + * the use of the `SearchInput` component. * @param {BaseComponentProps} props - Component properties. */ const SearchInputComponents = ({ className, testId = 'components-search-input' }: BaseComponentProps) => { diff --git a/src/pages/Components/components/SelectComponents.test.tsx b/packages/web/src/pages/Components/components/SelectComponents.test.tsx similarity index 95% rename from src/pages/Components/components/SelectComponents.test.tsx rename to packages/web/src/pages/Components/components/SelectComponents.test.tsx index e933b4f1..7e297136 100644 --- a/src/pages/Components/components/SelectComponents.test.tsx +++ b/packages/web/src/pages/Components/components/SelectComponents.test.tsx @@ -1,7 +1,7 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SelectComponents from './SelectComponents'; diff --git a/src/pages/Components/components/SelectComponents.tsx b/packages/web/src/pages/Components/components/SelectComponents.tsx similarity index 97% rename from src/pages/Components/components/SelectComponents.tsx rename to packages/web/src/pages/Components/components/SelectComponents.tsx index ec746d99..e4d1c91d 100644 --- a/src/pages/Components/components/SelectComponents.tsx +++ b/packages/web/src/pages/Components/components/SelectComponents.tsx @@ -4,13 +4,13 @@ import noop from 'lodash/noop'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Button from 'common/components/Button/Button'; -import Select from 'common/components/Form/Select'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Button from '@/common/components/Button/Button'; +import Select from '@/common/components/Form/Select'; /** * The `SelectComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/SkeletonComponents.test.tsx b/packages/web/src/pages/Components/components/SkeletonComponents.test.tsx similarity index 88% rename from src/pages/Components/components/SkeletonComponents.test.tsx rename to packages/web/src/pages/Components/components/SkeletonComponents.test.tsx index ad2beede..82a018a1 100644 --- a/src/pages/Components/components/SkeletonComponents.test.tsx +++ b/packages/web/src/pages/Components/components/SkeletonComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SkeletonComponents from './SkeletonComponents'; diff --git a/src/pages/Components/components/SkeletonComponents.tsx b/packages/web/src/pages/Components/components/SkeletonComponents.tsx similarity index 93% rename from src/pages/Components/components/SkeletonComponents.tsx rename to packages/web/src/pages/Components/components/SkeletonComponents.tsx index 24986247..a2888aec 100644 --- a/src/pages/Components/components/SkeletonComponents.tsx +++ b/packages/web/src/pages/Components/components/SkeletonComponents.tsx @@ -1,17 +1,17 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Skeleton from 'common/components/Loader/Skeleton'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Skeleton from '@/common/components/Loader/Skeleton'; /** * The `SkeletonComponents` component renders a set of examples illustrating * the use of the `Skeleton` component. */ -const SelectComponents = ({ className, testId = 'components-skeleton' }: BaseComponentProps) => { +const SkeletonComponents = ({ className, testId = 'components-skeleton' }: BaseComponentProps) => { const data: ComponentProperty[] = [ { name: 'className', @@ -152,4 +152,4 @@ const SelectComponents = ({ className, testId = 'components-skeleton' }: BaseCom ); }; -export default SelectComponents; +export default SkeletonComponents; diff --git a/src/pages/Components/components/SpinnerComponents.test.tsx b/packages/web/src/pages/Components/components/SpinnerComponents.test.tsx similarity index 88% rename from src/pages/Components/components/SpinnerComponents.test.tsx rename to packages/web/src/pages/Components/components/SpinnerComponents.test.tsx index 1a3fbc43..1a6c0a05 100644 --- a/src/pages/Components/components/SpinnerComponents.test.tsx +++ b/packages/web/src/pages/Components/components/SpinnerComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SpinnerComponents from './SpinnerComponents'; diff --git a/src/pages/Components/components/SpinnerComponents.tsx b/packages/web/src/pages/Components/components/SpinnerComponents.tsx similarity index 95% rename from src/pages/Components/components/SpinnerComponents.tsx rename to packages/web/src/pages/Components/components/SpinnerComponents.tsx index b6bcdba3..29e21276 100644 --- a/src/pages/Components/components/SpinnerComponents.tsx +++ b/packages/web/src/pages/Components/components/SpinnerComponents.tsx @@ -1,12 +1,12 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Spinner from 'common/components/Loader/Spinner'; -import Link from 'common/components/Link/Link'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Spinner from '@/common/components/Loader/Spinner'; +import Link from '@/common/components/Link/Link'; /** * The `SpinnerComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/TableComponents.test.tsx b/packages/web/src/pages/Components/components/TableComponents.test.tsx similarity index 87% rename from src/pages/Components/components/TableComponents.test.tsx rename to packages/web/src/pages/Components/components/TableComponents.test.tsx index 4c714b14..249dfa06 100644 --- a/src/pages/Components/components/TableComponents.test.tsx +++ b/packages/web/src/pages/Components/components/TableComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import TableComponents from './TableComponents'; diff --git a/src/pages/Components/components/TableComponents.tsx b/packages/web/src/pages/Components/components/TableComponents.tsx similarity index 96% rename from src/pages/Components/components/TableComponents.tsx rename to packages/web/src/pages/Components/components/TableComponents.tsx index 9ec75982..771d08e9 100644 --- a/src/pages/Components/components/TableComponents.tsx +++ b/packages/web/src/pages/Components/components/TableComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Link from 'common/components/Link/Link'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Link from '@/common/components/Link/Link'; /** * Example type for the data used in the table. diff --git a/src/pages/Components/components/TabsComponents.test.tsx b/packages/web/src/pages/Components/components/TabsComponents.test.tsx similarity index 87% rename from src/pages/Components/components/TabsComponents.test.tsx rename to packages/web/src/pages/Components/components/TabsComponents.test.tsx index c508b140..64e2dfa2 100644 --- a/src/pages/Components/components/TabsComponents.test.tsx +++ b/packages/web/src/pages/Components/components/TabsComponents.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import TabsComponents from './TabsComponents'; diff --git a/src/pages/Components/components/TabsComponents.tsx b/packages/web/src/pages/Components/components/TabsComponents.tsx similarity index 94% rename from src/pages/Components/components/TabsComponents.tsx rename to packages/web/src/pages/Components/components/TabsComponents.tsx index d840a6b1..b2c03f81 100644 --- a/src/pages/Components/components/TabsComponents.tsx +++ b/packages/web/src/pages/Components/components/TabsComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Tabs from 'common/components/Tabs/Tabs'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Tabs from '@/common/components/Tabs/Tabs'; /** * The `TabsComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/TextComponents.test.tsx b/packages/web/src/pages/Components/components/TextComponents.test.tsx similarity index 94% rename from src/pages/Components/components/TextComponents.test.tsx rename to packages/web/src/pages/Components/components/TextComponents.test.tsx index 331e26d2..fbe88b90 100644 --- a/src/pages/Components/components/TextComponents.test.tsx +++ b/packages/web/src/pages/Components/components/TextComponents.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import TextComponents from './TextComponents'; diff --git a/src/pages/Components/components/TextComponents.tsx b/packages/web/src/pages/Components/components/TextComponents.tsx similarity index 92% rename from src/pages/Components/components/TextComponents.tsx rename to packages/web/src/pages/Components/components/TextComponents.tsx index c709e2ff..b738f091 100644 --- a/src/pages/Components/components/TextComponents.tsx +++ b/packages/web/src/pages/Components/components/TextComponents.tsx @@ -1,11 +1,11 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; -import { BaseComponentProps } from 'common/utils/types'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; +import { BaseComponentProps } from '@/common/utils/types'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import Heading from 'common/components/Text/Heading'; -import Text from 'common/components/Text/Text'; +import Table from '@/common/components/Table/Table'; +import Heading from '@/common/components/Text/Heading'; +import Text from '@/common/components/Text/Text'; /** * The `TextComponents` React component renders a set of examples illustrating diff --git a/src/pages/Components/components/TextareaComponents.test.tsx b/packages/web/src/pages/Components/components/TextareaComponents.test.tsx similarity index 94% rename from src/pages/Components/components/TextareaComponents.test.tsx rename to packages/web/src/pages/Components/components/TextareaComponents.test.tsx index 31c80ae9..578410f6 100644 --- a/src/pages/Components/components/TextareaComponents.test.tsx +++ b/packages/web/src/pages/Components/components/TextareaComponents.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import TextareaComponents from './TextareaComponents'; diff --git a/src/pages/Components/components/TextareaComponents.tsx b/packages/web/src/pages/Components/components/TextareaComponents.tsx similarity index 96% rename from src/pages/Components/components/TextareaComponents.tsx rename to packages/web/src/pages/Components/components/TextareaComponents.tsx index a9a66a65..ea7507c3 100644 --- a/src/pages/Components/components/TextareaComponents.tsx +++ b/packages/web/src/pages/Components/components/TextareaComponents.tsx @@ -4,13 +4,13 @@ import noop from 'lodash/noop'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Textarea from 'common/components/Form/Textarea'; -import Button from 'common/components/Button/Button'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Textarea from '@/common/components/Form/Textarea'; +import Button from '@/common/components/Button/Button'; /** * The `TextareaComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/ToastComponents.test.tsx b/packages/web/src/pages/Components/components/ToastComponents.test.tsx similarity index 94% rename from src/pages/Components/components/ToastComponents.test.tsx rename to packages/web/src/pages/Components/components/ToastComponents.test.tsx index 9dd0d469..046327e9 100644 --- a/src/pages/Components/components/ToastComponents.test.tsx +++ b/packages/web/src/pages/Components/components/ToastComponents.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ToastComponents from './ToastComponents'; diff --git a/src/pages/Components/components/ToastComponents.tsx b/packages/web/src/pages/Components/components/ToastComponents.tsx similarity index 96% rename from src/pages/Components/components/ToastComponents.tsx rename to packages/web/src/pages/Components/components/ToastComponents.tsx index 5f8b7b9b..8c416329 100644 --- a/src/pages/Components/components/ToastComponents.tsx +++ b/packages/web/src/pages/Components/components/ToastComponents.tsx @@ -1,14 +1,14 @@ import { ColumnDef, createColumnHelper } from '@tanstack/react-table'; import noop from 'lodash/noop'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Button from 'common/components/Button/Button'; -import Toast from 'common/components/Toast/Toast'; -import { useToasts } from 'common/hooks/useToasts'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Button from '@/common/components/Button/Button'; +import Toast from '@/common/components/Toast/Toast'; +import { useToasts } from '@/common/hooks/useToasts'; /** * The `ToastComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/ToggleComponents.test.tsx b/packages/web/src/pages/Components/components/ToggleComponents.test.tsx similarity index 94% rename from src/pages/Components/components/ToggleComponents.test.tsx rename to packages/web/src/pages/Components/components/ToggleComponents.test.tsx index ba48492a..7a5d2d6c 100644 --- a/src/pages/Components/components/ToggleComponents.test.tsx +++ b/packages/web/src/pages/Components/components/ToggleComponents.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ToggleComponents from './ToggleComponents'; diff --git a/src/pages/Components/components/ToggleComponents.tsx b/packages/web/src/pages/Components/components/ToggleComponents.tsx similarity index 95% rename from src/pages/Components/components/ToggleComponents.tsx rename to packages/web/src/pages/Components/components/ToggleComponents.tsx index 4cea088d..d214ac2f 100644 --- a/src/pages/Components/components/ToggleComponents.tsx +++ b/packages/web/src/pages/Components/components/ToggleComponents.tsx @@ -4,13 +4,13 @@ import noop from 'lodash/noop'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { BaseComponentProps } from 'common/utils/types'; +import { BaseComponentProps } from '@/common/utils/types'; import { ComponentProperty } from '../model/components'; -import Table from 'common/components/Table/Table'; -import CodeSnippet from 'common/components/Text/CodeSnippet'; -import Heading from 'common/components/Text/Heading'; -import Toggle from 'common/components/Form/Toggle'; -import Button from 'common/components/Button/Button'; +import Table from '@/common/components/Table/Table'; +import CodeSnippet from '@/common/components/Text/CodeSnippet'; +import Heading from '@/common/components/Text/Heading'; +import Toggle from '@/common/components/Form/Toggle'; +import Button from '@/common/components/Button/Button'; /** * The `ToggleComponents` component renders a set of examples illustrating diff --git a/src/pages/Components/components/avatar-picture.png b/packages/web/src/pages/Components/components/avatar-picture.png similarity index 100% rename from src/pages/Components/components/avatar-picture.png rename to packages/web/src/pages/Components/components/avatar-picture.png diff --git a/src/pages/Components/model/components.ts b/packages/web/src/pages/Components/model/components.ts similarity index 100% rename from src/pages/Components/model/components.ts rename to packages/web/src/pages/Components/model/components.ts diff --git a/src/pages/Error/ErrorPage.test.tsx b/packages/web/src/pages/Error/ErrorPage.test.tsx similarity index 90% rename from src/pages/Error/ErrorPage.test.tsx rename to packages/web/src/pages/Error/ErrorPage.test.tsx index d9dc92d2..1d5d31a2 100644 --- a/src/pages/Error/ErrorPage.test.tsx +++ b/packages/web/src/pages/Error/ErrorPage.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import ErrorPage from './ErrorPage'; diff --git a/src/pages/Error/ErrorPage.tsx b/packages/web/src/pages/Error/ErrorPage.tsx similarity index 100% rename from src/pages/Error/ErrorPage.tsx rename to packages/web/src/pages/Error/ErrorPage.tsx diff --git a/src/pages/Landing/LandingPage.test.tsx b/packages/web/src/pages/Landing/LandingPage.test.tsx similarity index 92% rename from src/pages/Landing/LandingPage.test.tsx rename to packages/web/src/pages/Landing/LandingPage.test.tsx index ae3db44f..2caf37b6 100644 --- a/src/pages/Landing/LandingPage.test.tsx +++ b/packages/web/src/pages/Landing/LandingPage.test.tsx @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import * as UseAuth from 'common/hooks/useAuth'; +import * as UseAuth from '@/common/hooks/useAuth'; import LandingPage from './LandingPage'; import { Route, Routes } from 'react-router-dom'; diff --git a/src/pages/Landing/LandingPage.tsx b/packages/web/src/pages/Landing/LandingPage.tsx similarity index 80% rename from src/pages/Landing/LandingPage.tsx rename to packages/web/src/pages/Landing/LandingPage.tsx index ca134ab4..088e5186 100644 --- a/src/pages/Landing/LandingPage.tsx +++ b/packages/web/src/pages/Landing/LandingPage.tsx @@ -1,10 +1,10 @@ import { Navigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { useAuth } from 'common/hooks/useAuth'; -import Page from 'common/components/Content/Page'; -import Container from 'common/components/Content/Container'; -import Heading from 'common/components/Text/Heading'; +import { useAuth } from '@/common/hooks/useAuth'; +import Page from '@/common/components/Content/Page'; +import Container from '@/common/components/Content/Container'; +import Heading from '@/common/components/Text/Heading'; /** * The `LandingPage` component renders the content of the landing page diff --git a/src/pages/Settings/SettingsPage.test.tsx b/packages/web/src/pages/Settings/SettingsPage.test.tsx similarity index 85% rename from src/pages/Settings/SettingsPage.test.tsx rename to packages/web/src/pages/Settings/SettingsPage.test.tsx index 4c706b0e..b43c1cee 100644 --- a/src/pages/Settings/SettingsPage.test.tsx +++ b/packages/web/src/pages/Settings/SettingsPage.test.tsx @@ -1,11 +1,11 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { User } from 'common/api/useGetUser'; -import * as UseGetCurrentUser from 'common/api/useGetCurrentUser'; -import { userFixture1 } from '__fixtures__/users'; +import { User } from '@/common/api/useGetUser'; +import * as UseGetCurrentUser from '@/common/api/useGetCurrentUser'; +import { userFixture1 } from '@/__fixtures__/users'; import SettingsPage from './SettingsPage'; diff --git a/src/pages/Settings/SettingsPage.tsx b/packages/web/src/pages/Settings/SettingsPage.tsx similarity index 77% rename from src/pages/Settings/SettingsPage.tsx rename to packages/web/src/pages/Settings/SettingsPage.tsx index 741ed89f..449bf343 100644 --- a/src/pages/Settings/SettingsPage.tsx +++ b/packages/web/src/pages/Settings/SettingsPage.tsx @@ -1,13 +1,13 @@ import { Outlet } from 'react-router-dom'; -import { useGetCurrentUser } from 'common/api/useGetCurrentUser'; -import Avatar from 'common/components/Icon/Avatar'; -import Skeleton from 'common/components/Loader/Skeleton'; -import MenuNavLink from 'common/components/Menu/MenuNavLink'; -import Page from 'common/components/Content/Page'; +import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; +import Avatar from '@/common/components/Icon/Avatar'; +import Skeleton from '@/common/components/Loader/Skeleton'; +import MenuNavLink from '@/common/components/Menu/MenuNavLink'; +import Page from '@/common/components/Content/Page'; import SettingsPageBreadcrumbs from './components/SettingsPageBreadcrumbs'; -import Columns from 'common/components/Content/Columns'; -import Container from 'common/components/Content/Container'; +import Columns from '@/common/components/Content/Columns'; +import Container from '@/common/components/Content/Container'; /** * The `SettingsPage` component renders the layout for the settings page. It diff --git a/src/pages/Settings/components/AppearanceSettings.test.tsx b/packages/web/src/pages/Settings/components/AppearanceSettings.test.tsx similarity index 87% rename from src/pages/Settings/components/AppearanceSettings.test.tsx rename to packages/web/src/pages/Settings/components/AppearanceSettings.test.tsx index 8055e093..8501c314 100644 --- a/src/pages/Settings/components/AppearanceSettings.test.tsx +++ b/packages/web/src/pages/Settings/components/AppearanceSettings.test.tsx @@ -2,11 +2,11 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { UseMutationResult } from '@tanstack/react-query'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; -import { Settings } from 'common/api/useGetSettings'; -import { DEFAULT_SETTINGS } from 'common/utils/constants'; -import * as UseSettings from 'common/hooks/useSettings'; -import * as UseSetSettings from 'common/api/useSetSettings'; +import { render, screen } from '@/test/test-utils'; +import { Settings } from '@/common/api/useGetSettings'; +import { DEFAULT_SETTINGS } from '@/common/utils/constants'; +import * as UseSettings from '@/common/hooks/useSettings'; +import * as UseSetSettings from '@/common/api/useSetSettings'; import AppearanceSettings from './AppearanceSettings'; diff --git a/src/pages/Settings/components/AppearanceSettings.tsx b/packages/web/src/pages/Settings/components/AppearanceSettings.tsx similarity index 86% rename from src/pages/Settings/components/AppearanceSettings.tsx rename to packages/web/src/pages/Settings/components/AppearanceSettings.tsx index a74d4acd..0a373910 100644 --- a/src/pages/Settings/components/AppearanceSettings.tsx +++ b/packages/web/src/pages/Settings/components/AppearanceSettings.tsx @@ -1,22 +1,16 @@ -import { cn } from 'common/utils/css'; -import { PropsWithTestId } from 'common/utils/types'; -import { useSettings } from 'common/hooks/useSettings'; -import { useSetSettings } from 'common/api/useSetSettings'; +import { cn } from '@/common/utils/css'; +import { PropsWithTestId } from '@/common/utils/types'; +import { useSettings } from '@/common/hooks/useSettings'; +import { useSetSettings } from '@/common/api/useSetSettings'; import SettingsHeading from './SettingsHeading'; -/** - * Properties for the `AppearanceSettings` component. - * @see {@link PropsWithTestId} - */ -interface AppearanceSettingsProps extends PropsWithTestId {} - /** * The `AppearanceSettings` React component renders a set of controls to * allow users to update personal configuration related to how the application * appears. - * @param {AppearanceSettingsProps} props - Component properties, `AppearanceSettingsProps`. + * @param {PropsWithTestId} props - Component properties, `PropsWithTestId`. */ -const AppearanceSettings = ({ testId = 'settings-appearance' }: AppearanceSettingsProps) => { +const AppearanceSettings = ({ testId = 'settings-appearance' }: PropsWithTestId) => { const settings = useSettings(); const { mutate: setSettings } = useSetSettings(); diff --git a/src/pages/Settings/components/SettingsHeading.test.tsx b/packages/web/src/pages/Settings/components/SettingsHeading.test.tsx similarity index 93% rename from src/pages/Settings/components/SettingsHeading.test.tsx rename to packages/web/src/pages/Settings/components/SettingsHeading.test.tsx index 9be54d16..7b9c7352 100644 --- a/src/pages/Settings/components/SettingsHeading.test.tsx +++ b/packages/web/src/pages/Settings/components/SettingsHeading.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SettingsHeading from './SettingsHeading'; diff --git a/src/pages/Settings/components/SettingsHeading.tsx b/packages/web/src/pages/Settings/components/SettingsHeading.tsx similarity index 92% rename from src/pages/Settings/components/SettingsHeading.tsx rename to packages/web/src/pages/Settings/components/SettingsHeading.tsx index 0bdb6ffd..6b1197bd 100644 --- a/src/pages/Settings/components/SettingsHeading.tsx +++ b/packages/web/src/pages/Settings/components/SettingsHeading.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { PropsWithTestId } from 'common/utils/types'; +import { PropsWithTestId } from '@/common/utils/types'; /** * Properties for the `SettingsHeading` component. diff --git a/src/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx b/packages/web/src/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx similarity index 96% rename from src/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx rename to packages/web/src/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx index 2a843b73..22251202 100644 --- a/src/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx +++ b/packages/web/src/pages/Settings/components/SettingsPageBreadcrumbs.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { Navigate, Route, Routes } from 'react-router-dom'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import SettingsPageBreadcrumbs from './SettingsPageBreadcrumbs'; diff --git a/src/pages/Settings/components/SettingsPageBreadcrumbs.tsx b/packages/web/src/pages/Settings/components/SettingsPageBreadcrumbs.tsx similarity index 90% rename from src/pages/Settings/components/SettingsPageBreadcrumbs.tsx rename to packages/web/src/pages/Settings/components/SettingsPageBreadcrumbs.tsx index c6f19cba..d3b2d82e 100644 --- a/src/pages/Settings/components/SettingsPageBreadcrumbs.tsx +++ b/packages/web/src/pages/Settings/components/SettingsPageBreadcrumbs.tsx @@ -1,7 +1,7 @@ import { useLocation } from 'react-router-dom'; -import { BaseComponentProps } from 'common/utils/types'; -import Breadcrumbs from 'common/components/Breadcrumbs/Breadcrumbs'; +import { BaseComponentProps } from '@/common/utils/types'; +import Breadcrumbs from '@/common/components/Breadcrumbs/Breadcrumbs'; /** * The `SettingsPageBreadcrumbs` component renders the `Breadcrumbs` for the settings diff --git a/src/pages/Tasks/TasksPage.test.tsx b/packages/web/src/pages/Tasks/TasksPage.test.tsx similarity index 87% rename from src/pages/Tasks/TasksPage.test.tsx rename to packages/web/src/pages/Tasks/TasksPage.test.tsx index 8d5f4e80..83da72ee 100644 --- a/src/pages/Tasks/TasksPage.test.tsx +++ b/packages/web/src/pages/Tasks/TasksPage.test.tsx @@ -2,10 +2,10 @@ import userEvent from '@testing-library/user-event'; import { describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import { render, screen } from 'test/test-utils'; -import * as UseGetCurrentUser from 'common/api/useGetCurrentUser'; -import { User } from 'common/api/useGetUser'; -import { userFixture1 } from '__fixtures__/users'; +import { render, screen } from '@/test/test-utils'; +import * as UseGetCurrentUser from '@/common/api/useGetCurrentUser'; +import { User } from '@/common/api/useGetUser'; +import { userFixture1 } from '@/__fixtures__/users'; import TasksPage from './TasksPage'; diff --git a/src/pages/Tasks/TasksPage.tsx b/packages/web/src/pages/Tasks/TasksPage.tsx similarity index 78% rename from src/pages/Tasks/TasksPage.tsx rename to packages/web/src/pages/Tasks/TasksPage.tsx index 4dc68c18..d9e951e9 100644 --- a/src/pages/Tasks/TasksPage.tsx +++ b/packages/web/src/pages/Tasks/TasksPage.tsx @@ -2,16 +2,16 @@ import { Outlet } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; -import { PropsWithTestId } from 'common/utils/types'; -import { useGetCurrentUser } from 'common/api/useGetCurrentUser'; -import Page from 'common/components/Content/Page'; -import Container from 'common/components/Content/Container'; -import Heading from 'common/components/Text/Heading'; +import type { PropsWithTestId } from '@/common/utils/types'; +import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; +import Page from '@/common/components/Content/Page'; +import Container from '@/common/components/Content/Container'; +import Heading from '@/common/components/Text/Heading'; import TasksPageBreadcrumbs from './components/TasksPageBreadcrumbs'; import UserInfo from './components/UserInfo'; -import Card from 'common/components/Card/Card'; -import FAIcon from 'common/components/Icon/FAIcon'; -import Button from 'common/components/Button/Button'; +import Card from '@/common/components/Card/Card'; +import FAIcon from '@/common/components/Icon/FAIcon'; +import Button from '@/common/components/Button/Button'; /** * The `TasksPage` component renders the layout for the tasks family of pages. diff --git a/src/pages/Tasks/api/useCreateTask.test.ts b/packages/web/src/pages/Tasks/api/useCreateTask.test.ts similarity index 91% rename from src/pages/Tasks/api/useCreateTask.test.ts rename to packages/web/src/pages/Tasks/api/useCreateTask.test.ts index ca4aa283..b03e47ba 100644 --- a/src/pages/Tasks/api/useCreateTask.test.ts +++ b/packages/web/src/pages/Tasks/api/useCreateTask.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; -import { queryClient } from 'test/query-client'; +import { renderHook, waitFor } from '@/test/test-utils'; +import { queryClient } from '@/test/query-client'; import { Task } from './useGetUserTasks'; -import { QueryKey } from 'common/utils/constants'; -import { todosFixture } from '__fixtures__/todos'; +import { QueryKey } from '@/common/utils/constants'; +import { todosFixture } from '@/__fixtures__/todos'; import { useCreateTask } from './useCreateTask'; diff --git a/src/pages/Tasks/api/useCreateTask.ts b/packages/web/src/pages/Tasks/api/useCreateTask.ts similarity index 91% rename from src/pages/Tasks/api/useCreateTask.ts rename to packages/web/src/pages/Tasks/api/useCreateTask.ts index a13f1f40..929422a5 100644 --- a/src/pages/Tasks/api/useCreateTask.ts +++ b/packages/web/src/pages/Tasks/api/useCreateTask.ts @@ -2,9 +2,9 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import reject from 'lodash/reject'; import { Task } from './useGetUserTasks'; -import { useAxios } from 'common/hooks/useAxios'; -import { QueryKey } from 'common/utils/constants'; -import { config } from 'common/utils/config'; +import { useAxios } from '@/common/hooks/useAxios'; +import { QueryKey } from '@/common/utils/constants'; +import { config } from '@/common/utils/config'; /** * The `CreateTaskDTO` object describes the `Task` attributes used to diff --git a/src/pages/Tasks/api/useDeleteTask.test.ts b/packages/web/src/pages/Tasks/api/useDeleteTask.test.ts similarity index 84% rename from src/pages/Tasks/api/useDeleteTask.test.ts rename to packages/web/src/pages/Tasks/api/useDeleteTask.test.ts index b0b6db9b..fc8ca9fc 100644 --- a/src/pages/Tasks/api/useDeleteTask.test.ts +++ b/packages/web/src/pages/Tasks/api/useDeleteTask.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from 'vitest'; -import { QueryKey } from 'common/utils/constants'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { todosFixture } from '__fixtures__/todos'; -import { queryClient } from 'test/query-client'; -import { renderHook, waitFor } from 'test/test-utils'; +import { QueryKey } from '@/common/utils/constants'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { todosFixture } from '@/__fixtures__/todos'; +import { queryClient } from '@/test/query-client'; +import { renderHook, waitFor } from '@/test/test-utils'; import { useDeleteTask } from './useDeleteTask'; diff --git a/src/pages/Tasks/api/useDeleteTask.ts b/packages/web/src/pages/Tasks/api/useDeleteTask.ts similarity index 85% rename from src/pages/Tasks/api/useDeleteTask.ts rename to packages/web/src/pages/Tasks/api/useDeleteTask.ts index 7b24d9df..fbbd3e07 100644 --- a/src/pages/Tasks/api/useDeleteTask.ts +++ b/packages/web/src/pages/Tasks/api/useDeleteTask.ts @@ -1,10 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import reject from 'lodash/reject'; -import { QueryKey } from 'common/utils/constants'; -import { config } from 'common/utils/config'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { useAxios } from 'common/hooks/useAxios'; +import { QueryKey } from '@/common/utils/constants'; +import { config } from '@/common/utils/config'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { useAxios } from '@/common/hooks/useAxios'; /** * The `useDeleteTask` mutation function variables. diff --git a/src/pages/Tasks/api/useGetTask.test.ts b/packages/web/src/pages/Tasks/api/useGetTask.test.ts similarity index 90% rename from src/pages/Tasks/api/useGetTask.test.ts rename to packages/web/src/pages/Tasks/api/useGetTask.test.ts index d208f691..5a8c977b 100644 --- a/src/pages/Tasks/api/useGetTask.test.ts +++ b/packages/web/src/pages/Tasks/api/useGetTask.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; import { useGetTask } from './useGetTask'; diff --git a/src/pages/Tasks/api/useGetTask.ts b/packages/web/src/pages/Tasks/api/useGetTask.ts similarity index 79% rename from src/pages/Tasks/api/useGetTask.ts rename to packages/web/src/pages/Tasks/api/useGetTask.ts index 0debf32e..25760316 100644 --- a/src/pages/Tasks/api/useGetTask.ts +++ b/packages/web/src/pages/Tasks/api/useGetTask.ts @@ -1,9 +1,9 @@ import { UseQueryResult, useQuery } from '@tanstack/react-query'; -import { useAxios } from 'common/hooks/useAxios'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { QueryKey } from 'common/utils/constants'; -import { config } from 'common/utils/config'; +import { useAxios } from '@/common/hooks/useAxios'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { QueryKey } from '@/common/utils/constants'; +import { config } from '@/common/utils/config'; /** * Properties for the `useGetTask` hook. diff --git a/src/pages/Tasks/api/useGetUserTasks.test.ts b/packages/web/src/pages/Tasks/api/useGetUserTasks.test.ts similarity index 94% rename from src/pages/Tasks/api/useGetUserTasks.test.ts rename to packages/web/src/pages/Tasks/api/useGetUserTasks.test.ts index dd45d014..b0e1a5ec 100644 --- a/src/pages/Tasks/api/useGetUserTasks.test.ts +++ b/packages/web/src/pages/Tasks/api/useGetUserTasks.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; import { useGetUserTasks } from './useGetUserTasks'; diff --git a/src/pages/Tasks/api/useGetUserTasks.ts b/packages/web/src/pages/Tasks/api/useGetUserTasks.ts similarity index 87% rename from src/pages/Tasks/api/useGetUserTasks.ts rename to packages/web/src/pages/Tasks/api/useGetUserTasks.ts index f6921aa1..496f80ce 100644 --- a/src/pages/Tasks/api/useGetUserTasks.ts +++ b/packages/web/src/pages/Tasks/api/useGetUserTasks.ts @@ -1,8 +1,8 @@ import { UseQueryResult, useQuery } from '@tanstack/react-query'; -import { useAxios } from 'common/hooks/useAxios'; -import { QueryKey } from 'common/utils/constants'; -import { config } from 'common/utils/config'; +import { useAxios } from '@/common/hooks/useAxios'; +import { QueryKey } from '@/common/utils/constants'; +import { config } from '@/common/utils/config'; /** * The `Task` type. diff --git a/src/pages/Tasks/api/useGetUsers.test.ts b/packages/web/src/pages/Tasks/api/useGetUsers.test.ts similarity index 90% rename from src/pages/Tasks/api/useGetUsers.test.ts rename to packages/web/src/pages/Tasks/api/useGetUsers.test.ts index 5503dd14..a103e591 100644 --- a/src/pages/Tasks/api/useGetUsers.test.ts +++ b/packages/web/src/pages/Tasks/api/useGetUsers.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; +import { renderHook, waitFor } from '@/test/test-utils'; import { useGetUsers } from './useGetUsers'; diff --git a/src/pages/Tasks/api/useGetUsers.ts b/packages/web/src/pages/Tasks/api/useGetUsers.ts similarity index 74% rename from src/pages/Tasks/api/useGetUsers.ts rename to packages/web/src/pages/Tasks/api/useGetUsers.ts index be162eb0..fa335e46 100644 --- a/src/pages/Tasks/api/useGetUsers.ts +++ b/packages/web/src/pages/Tasks/api/useGetUsers.ts @@ -1,9 +1,9 @@ import { UseQueryResult, useQuery } from '@tanstack/react-query'; -import { User } from 'common/api/useGetUser'; +import { User } from '@/common/api/useGetUser'; -import { useAxios } from 'common/hooks/useAxios'; -import { QueryKey } from 'common/utils/constants'; -import { config } from 'common/utils/config'; +import { useAxios } from '@/common/hooks/useAxios'; +import { QueryKey } from '@/common/utils/constants'; +import { config } from '@/common/utils/config'; /** * An API hook which fetches a collection of `User` objects. diff --git a/src/pages/Tasks/api/useUpdateTask.test.ts b/packages/web/src/pages/Tasks/api/useUpdateTask.test.ts similarity index 90% rename from src/pages/Tasks/api/useUpdateTask.test.ts rename to packages/web/src/pages/Tasks/api/useUpdateTask.test.ts index a19be186..9c8cf744 100644 --- a/src/pages/Tasks/api/useUpdateTask.test.ts +++ b/packages/web/src/pages/Tasks/api/useUpdateTask.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from 'test/test-utils'; -import { queryClient } from 'test/query-client'; -import { todosFixture } from '__fixtures__/todos'; -import { QueryKey } from 'common/utils/constants'; +import { renderHook, waitFor } from '@/test/test-utils'; +import { queryClient } from '@/test/query-client'; +import { todosFixture } from '@/__fixtures__/todos'; +import { QueryKey } from '@/common/utils/constants'; import { Task } from './useGetUserTasks'; import { useUpdateTask } from './useUpdateTask'; diff --git a/src/pages/Tasks/api/useUpdateTask.ts b/packages/web/src/pages/Tasks/api/useUpdateTask.ts similarity index 87% rename from src/pages/Tasks/api/useUpdateTask.ts rename to packages/web/src/pages/Tasks/api/useUpdateTask.ts index b2f02faa..3f6bbec4 100644 --- a/src/pages/Tasks/api/useUpdateTask.ts +++ b/packages/web/src/pages/Tasks/api/useUpdateTask.ts @@ -1,10 +1,10 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import reject from 'lodash/reject'; -import { QueryKey } from 'common/utils/constants'; -import { config } from 'common/utils/config'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { useAxios } from 'common/hooks/useAxios'; +import { QueryKey } from '@/common/utils/constants'; +import { config } from '@/common/utils/config'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { useAxios } from '@/common/hooks/useAxios'; /** * The `useUpdateTask` mutation function variables. diff --git a/src/pages/Tasks/components/Add/TaskAdd.test.tsx b/packages/web/src/pages/Tasks/components/Add/TaskAdd.test.tsx similarity index 92% rename from src/pages/Tasks/components/Add/TaskAdd.test.tsx rename to packages/web/src/pages/Tasks/components/Add/TaskAdd.test.tsx index 72fe334c..a6111654 100644 --- a/src/pages/Tasks/components/Add/TaskAdd.test.tsx +++ b/packages/web/src/pages/Tasks/components/Add/TaskAdd.test.tsx @@ -2,10 +2,10 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; import { UseQueryResult } from '@tanstack/react-query'; -import { render, screen, waitFor } from 'test/test-utils'; -import * as UseGetCurrentUser from 'common/api/useGetCurrentUser'; -import { User } from 'common/api/useGetUser'; -import { userFixture1 } from '__fixtures__/users'; +import { render, screen, waitFor } from '@/test/test-utils'; +import * as UseGetCurrentUser from '@/common/api/useGetCurrentUser'; +import { User } from '@/common/api/useGetUser'; +import { userFixture1 } from '@/__fixtures__/users'; import TaskAdd from './TaskAdd'; diff --git a/src/pages/Tasks/components/Add/TaskAdd.tsx b/packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx similarity index 78% rename from src/pages/Tasks/components/Add/TaskAdd.tsx rename to packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx index 65c5c502..329443ec 100644 --- a/src/pages/Tasks/components/Add/TaskAdd.tsx +++ b/packages/web/src/pages/Tasks/components/Add/TaskAdd.tsx @@ -2,25 +2,19 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { useToasts } from 'common/hooks/useToasts'; -import { useGetCurrentUser } from 'common/api/useGetCurrentUser'; -import { useCreateTask } from 'pages/Tasks/api/useCreateTask'; -import { BaseComponentProps } from 'common/utils/types'; +import { useToasts } from '@/common/hooks/useToasts'; +import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; +import { useCreateTask } from '@/pages/Tasks/api/useCreateTask'; +import { BaseComponentProps } from '@/common/utils/types'; import TaskForm, { TaskFormValues } from '../Form/TaskForm'; -import ErrorAlert from 'common/components/Alert/ErrorAlert'; - -/** - * Properties for the `TaskAdd` component. - * @see {@link BaseComponentProps} - */ -export interface TaskAddProps extends BaseComponentProps {} +import ErrorAlert from '@/common/components/Alert/ErrorAlert'; /** * The `TaskAdd` component renders the layout for creating a new Task including * headings, the task form, etc. - * @param {TaskAddProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const TaskAdd = ({ className, testId = 'task-add' }: TaskAddProps) => { +const TaskAdd = ({ className, testId = 'task-add' }: BaseComponentProps) => { const [taskCreateError, setTaskCreateError] = useState(''); const { t } = useTranslation(); const navigate = useNavigate(); diff --git a/src/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx b/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx similarity index 88% rename from src/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx rename to packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx index d660fc5f..625d9b6e 100644 --- a/src/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx +++ b/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; -import { todosFixture } from '__fixtures__/todos'; +import { todosFixture } from '@/__fixtures__/todos'; import TaskStatusDonutChart from './TaskStatusDonutChart'; diff --git a/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx b/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx similarity index 87% rename from src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx rename to packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx index 5a33e794..716b9644 100644 --- a/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx +++ b/packages/web/src/pages/Tasks/components/Chart/TaskStatusDonutChart.tsx @@ -3,10 +3,10 @@ import { filter, reject } from 'lodash'; import colors from 'tailwindcss/colors'; import { useTranslation } from 'react-i18next'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import DonutChart, { DonutChartData, DonutChartProps } from 'common/components/Chart/DonutChart'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import DonutChart, { DonutChartData, DonutChartProps } from '@/common/components/Chart/DonutChart'; /** * Properties for the `TaskStatusDonutChart` component. diff --git a/src/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx b/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx similarity index 91% rename from src/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx rename to packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx index 1fccb2a2..bfa66ee4 100644 --- a/src/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx +++ b/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.test.tsx @@ -1,10 +1,10 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; -import { todosFixture } from '__fixtures__/todos'; -import { ToastsContextValue } from 'common/providers/ToastsContext'; -import * as UseToasts from 'common/hooks/useToasts'; +import { render, screen, waitFor } from '@/test/test-utils'; +import { todosFixture } from '@/__fixtures__/todos'; +import { ToastsContextValue } from '@/common/providers/ToastsContext'; +import * as UseToasts from '@/common/hooks/useToasts'; import TaskDeleteDialog from './TaskDeleteDialog'; diff --git a/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx b/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx similarity index 87% rename from src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx rename to packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx index b0f3c9cc..8ed5acfa 100644 --- a/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx +++ b/packages/web/src/pages/Tasks/components/Delete/TaskDeleteDialog.tsx @@ -2,12 +2,12 @@ import { PropsWithChildren } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { useDeleteTask } from 'pages/Tasks/api/useDeleteTask'; -import { useToasts } from 'common/hooks/useToasts'; -import Dialog from 'common/components/Dialog/Dialog'; -import ErrorAlert from 'common/components/Alert/ErrorAlert'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { useDeleteTask } from '@/pages/Tasks/api/useDeleteTask'; +import { useToasts } from '@/common/hooks/useToasts'; +import Dialog from '@/common/components/Dialog/Dialog'; +import ErrorAlert from '@/common/components/Alert/ErrorAlert'; /** * Properties for the `TaskDeleteDialog` component. diff --git a/src/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx b/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx similarity index 95% rename from src/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx rename to packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx index 85c389f3..9eaf1452 100644 --- a/src/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx +++ b/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.test.tsx @@ -1,10 +1,10 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { todosFixture } from '__fixtures__/todos'; -import * as UseToasts from 'common/hooks/useToasts'; +import { render, screen, waitFor } from '@/test/test-utils'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { todosFixture } from '@/__fixtures__/todos'; +import * as UseToasts from '@/common/hooks/useToasts'; import TaskCompleteToggle from './TaskCompleteToggle'; diff --git a/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx b/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx similarity index 84% rename from src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx rename to packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx index 6aabbb64..66cb3687 100644 --- a/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx +++ b/packages/web/src/pages/Tasks/components/Edit/TaskCompleteToggle.tsx @@ -1,13 +1,13 @@ import { useTranslation } from 'react-i18next'; import { useState } from 'react'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { useUpdateTask } from 'pages/Tasks/api/useUpdateTask'; -import { useToasts } from 'common/hooks/useToasts'; -import FAIcon from 'common/components/Icon/FAIcon'; -import Button from 'common/components/Button/Button'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { useUpdateTask } from '@/pages/Tasks/api/useUpdateTask'; +import { useToasts } from '@/common/hooks/useToasts'; +import FAIcon from '@/common/components/Icon/FAIcon'; +import Button from '@/common/components/Button/Button'; /** * Propeties for the `TaskCompleteToggle` component. diff --git a/src/pages/Tasks/components/Edit/TaskEdit.test.tsx b/packages/web/src/pages/Tasks/components/Edit/TaskEdit.test.tsx similarity index 98% rename from src/pages/Tasks/components/Edit/TaskEdit.test.tsx rename to packages/web/src/pages/Tasks/components/Edit/TaskEdit.test.tsx index d215cf59..c719db8f 100644 --- a/src/pages/Tasks/components/Edit/TaskEdit.test.tsx +++ b/packages/web/src/pages/Tasks/components/Edit/TaskEdit.test.tsx @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen, waitFor } from 'test/test-utils'; +import { render, screen, waitFor } from '@/test/test-utils'; import TaskEdit from './TaskEdit'; diff --git a/src/pages/Tasks/components/Edit/TaskEdit.tsx b/packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx similarity index 75% rename from src/pages/Tasks/components/Edit/TaskEdit.tsx rename to packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx index d7b0f5e6..0ae9e0ec 100644 --- a/src/pages/Tasks/components/Edit/TaskEdit.tsx +++ b/packages/web/src/pages/Tasks/components/Edit/TaskEdit.tsx @@ -3,28 +3,22 @@ import { useNavigate, useParams } from 'react-router-dom'; import toNumber from 'lodash/toNumber'; import { useTranslation } from 'react-i18next'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { useGetTask } from 'pages/Tasks/api/useGetTask'; -import { useToasts } from 'common/hooks/useToasts'; -import { useUpdateTask } from 'pages/Tasks/api/useUpdateTask'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { useGetTask } from '@/pages/Tasks/api/useGetTask'; +import { useToasts } from '@/common/hooks/useToasts'; +import { useUpdateTask } from '@/pages/Tasks/api/useUpdateTask'; import TaskForm, { TaskFormValues } from '../Form/TaskForm'; -import Skeleton from 'common/components/Loader/Skeleton'; -import ErrorAlert from 'common/components/Alert/ErrorAlert'; +import Skeleton from '@/common/components/Loader/Skeleton'; +import ErrorAlert from '@/common/components/Alert/ErrorAlert'; /** - * Properties for the `TaskEdit` component. - * @see {@link BaseComponentProps} - */ -export interface TaskEditProps extends BaseComponentProps {} - -/** - * The `TaskAdd` component renders the layout for updating a Task including + * The `TaskEdit` component renders the layout for updating a Task including * headings, the task form, etc. - * @param {TaskEditProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const TaskEdit = ({ className, testId = 'task-edit' }: TaskEditProps) => { +const TaskEdit = ({ className, testId = 'task-edit' }: BaseComponentProps) => { const [taskUpdateError, setTaskUpdateError] = useState(''); const { t } = useTranslation(); const navigate = useNavigate(); diff --git a/src/pages/Tasks/components/Form/TaskForm.test.tsx b/packages/web/src/pages/Tasks/components/Form/TaskForm.test.tsx similarity index 95% rename from src/pages/Tasks/components/Form/TaskForm.test.tsx rename to packages/web/src/pages/Tasks/components/Form/TaskForm.test.tsx index 017de435..e8780446 100644 --- a/src/pages/Tasks/components/Form/TaskForm.test.tsx +++ b/packages/web/src/pages/Tasks/components/Form/TaskForm.test.tsx @@ -1,8 +1,8 @@ import { describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; -import { render, screen } from 'test/test-utils'; -import { todosFixture } from '__fixtures__/todos'; +import { render, screen } from '@/test/test-utils'; +import { todosFixture } from '@/__fixtures__/todos'; import TaskForm from './TaskForm'; diff --git a/src/pages/Tasks/components/Form/TaskForm.tsx b/packages/web/src/pages/Tasks/components/Form/TaskForm.tsx similarity index 91% rename from src/pages/Tasks/components/Form/TaskForm.tsx rename to packages/web/src/pages/Tasks/components/Form/TaskForm.tsx index 56483444..a1d5dd37 100644 --- a/src/pages/Tasks/components/Form/TaskForm.tsx +++ b/packages/web/src/pages/Tasks/components/Form/TaskForm.tsx @@ -3,12 +3,12 @@ import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import Input from 'common/components/Form/Input'; -import Button from 'common/components/Button/Button'; -import Toggle from 'common/components/Form/Toggle'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import Input from '@/common/components/Form/Input'; +import Button from '@/common/components/Button/Button'; +import Toggle from '@/common/components/Form/Toggle'; /** * Task form values. diff --git a/src/pages/Tasks/components/List/TaskList.test.tsx b/packages/web/src/pages/Tasks/components/List/TaskList.test.tsx similarity index 95% rename from src/pages/Tasks/components/List/TaskList.test.tsx rename to packages/web/src/pages/Tasks/components/List/TaskList.test.tsx index 47c94bb2..28c9d06f 100644 --- a/src/pages/Tasks/components/List/TaskList.test.tsx +++ b/packages/web/src/pages/Tasks/components/List/TaskList.test.tsx @@ -1,9 +1,9 @@ -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import { describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import { todosFixture } from '__fixtures__/todos'; -import * as UseGetUserTasks from 'pages/Tasks/api/useGetUserTasks'; +import { todosFixture } from '@/__fixtures__/todos'; +import * as UseGetUserTasks from '@/pages/Tasks/api/useGetUserTasks'; import TaskList from './TaskList'; diff --git a/src/pages/Tasks/components/List/TaskList.tsx b/packages/web/src/pages/Tasks/components/List/TaskList.tsx similarity index 90% rename from src/pages/Tasks/components/List/TaskList.tsx rename to packages/web/src/pages/Tasks/components/List/TaskList.tsx index 627da4eb..aba48efc 100644 --- a/src/pages/Tasks/components/List/TaskList.tsx +++ b/packages/web/src/pages/Tasks/components/List/TaskList.tsx @@ -3,12 +3,12 @@ import { filter } from 'lodash'; import { orderBy as order } from 'lodash'; import { times } from 'lodash'; -import { Task, useGetUserTasks } from 'pages/Tasks/api/useGetUserTasks'; -import { BaseComponentProps } from 'common/utils/types'; -import Skeleton from 'common/components/Loader/Skeleton'; +import { Task, useGetUserTasks } from '@/pages/Tasks/api/useGetUserTasks'; +import { BaseComponentProps } from '@/common/utils/types'; +import Skeleton from '@/common/components/Loader/Skeleton'; import TaskListItem from './TaskListItem'; -import Badge from 'common/components/Badge/Badge'; -import ErrorAlert from 'common/components/Alert/ErrorAlert'; +import Badge from '@/common/components/Badge/Badge'; +import ErrorAlert from '@/common/components/Alert/ErrorAlert'; /** * Type describes the possible sort order directions. diff --git a/src/pages/Tasks/components/List/TaskListItem.test.tsx b/packages/web/src/pages/Tasks/components/List/TaskListItem.test.tsx similarity index 78% rename from src/pages/Tasks/components/List/TaskListItem.test.tsx rename to packages/web/src/pages/Tasks/components/List/TaskListItem.test.tsx index 6a72e80c..97180965 100644 --- a/src/pages/Tasks/components/List/TaskListItem.test.tsx +++ b/packages/web/src/pages/Tasks/components/List/TaskListItem.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { todosFixture } from '__fixtures__/todos'; -import { render, screen } from 'test/test-utils'; +import { todosFixture } from '@/__fixtures__/todos'; +import { render, screen } from '@/test/test-utils'; import TaskListItem from './TaskListItem'; diff --git a/src/pages/Tasks/components/List/TaskListItem.tsx b/packages/web/src/pages/Tasks/components/List/TaskListItem.tsx similarity index 71% rename from src/pages/Tasks/components/List/TaskListItem.tsx rename to packages/web/src/pages/Tasks/components/List/TaskListItem.tsx index e5f25396..a2b8f55d 100644 --- a/src/pages/Tasks/components/List/TaskListItem.tsx +++ b/packages/web/src/pages/Tasks/components/List/TaskListItem.tsx @@ -1,8 +1,8 @@ -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import TaskCompleteToggle from 'pages/Tasks/components/Edit/TaskCompleteToggle'; -import Link from 'common/components/Link/Link'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import TaskCompleteToggle from '@/pages/Tasks/components/Edit/TaskCompleteToggle'; +import Link from '@/common/components/Link/Link'; /** * Properties for the `TaskListItem` component. diff --git a/src/pages/Tasks/components/TaskDetailLayout.test.tsx b/packages/web/src/pages/Tasks/components/TaskDetailLayout.test.tsx similarity index 94% rename from src/pages/Tasks/components/TaskDetailLayout.test.tsx rename to packages/web/src/pages/Tasks/components/TaskDetailLayout.test.tsx index c06e40ce..bd238cec 100644 --- a/src/pages/Tasks/components/TaskDetailLayout.test.tsx +++ b/packages/web/src/pages/Tasks/components/TaskDetailLayout.test.tsx @@ -2,9 +2,9 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; import { UseQueryResult } from '@tanstack/react-query'; -import { render, screen } from 'test/test-utils'; -import * as UseGetTask from 'pages/Tasks/api/useGetTask'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; +import { render, screen } from '@/test/test-utils'; +import * as UseGetTask from '@/pages/Tasks/api/useGetTask'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; import TaskDetailLayout from './TaskDetailLayout'; diff --git a/src/pages/Tasks/components/TaskDetailLayout.tsx b/packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx similarity index 84% rename from src/pages/Tasks/components/TaskDetailLayout.tsx rename to packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx index 51834807..373f6289 100644 --- a/src/pages/Tasks/components/TaskDetailLayout.tsx +++ b/packages/web/src/pages/Tasks/components/TaskDetailLayout.tsx @@ -1,27 +1,21 @@ import { useNavigate, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { BaseComponentProps } from 'common/utils/types'; +import type { BaseComponentProps } from '@/common/utils/types'; import { useGetTask } from '../api/useGetTask'; -import Skeleton from 'common/components/Loader/Skeleton'; -import FAIcon from 'common/components/Icon/FAIcon'; +import Skeleton from '@/common/components/Loader/Skeleton'; +import FAIcon from '@/common/components/Icon/FAIcon'; import TaskDeleteDialog from './Delete/TaskDeleteDialog'; -import Button from 'common/components/Button/Button'; +import Button from '@/common/components/Button/Button'; import TaskView from './View/TaskView'; -import ErrorAlert from 'common/components/Alert/ErrorAlert'; - -/** - * Properties for the `TaskDetailLayout` component. - * @see {@link BaseComponentProps} - */ -interface TaskDetailLayoutProps extends BaseComponentProps {} +import ErrorAlert from '@/common/components/Alert/ErrorAlert'; /** * The `TaskDetailLayout` component renders a layout for viewing and maintaining * a single `Task`. Provides buttons and navigation to perform actions on the Task. - * @param {TaskDetailLayoutProps} props - Component properties. + * @param {BaseComponentProps} props - Component properties. */ -const TaskDetailLayout = ({ className, testId = 'layout-task-detail' }: TaskDetailLayoutProps) => { +const TaskDetailLayout = ({ className, testId = 'layout-task-detail' }: BaseComponentProps) => { const { t } = useTranslation(); const navigate = useNavigate(); const { taskId } = useParams(); diff --git a/src/pages/Tasks/components/TaskListLayout.test.tsx b/packages/web/src/pages/Tasks/components/TaskListLayout.test.tsx similarity index 82% rename from src/pages/Tasks/components/TaskListLayout.test.tsx rename to packages/web/src/pages/Tasks/components/TaskListLayout.test.tsx index a1a6fe12..3bac71ef 100644 --- a/src/pages/Tasks/components/TaskListLayout.test.tsx +++ b/packages/web/src/pages/Tasks/components/TaskListLayout.test.tsx @@ -1,12 +1,12 @@ -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import { describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import * as UseGetCurrentUser from 'common/api/useGetCurrentUser'; -import * as UseGetUserTasks from 'pages/Tasks/api/useGetUserTasks'; -import { User } from 'common/api/useGetUser'; -import { userFixture1 } from '__fixtures__/users'; -import { todosFixture } from '__fixtures__/todos'; +import * as UseGetCurrentUser from '@/common/api/useGetCurrentUser'; +import * as UseGetUserTasks from '@/pages/Tasks/api/useGetUserTasks'; +import type { User } from '@/common/api/useGetUser'; +import { userFixture1 } from '@/__fixtures__/users'; +import { todosFixture } from '@/__fixtures__/todos'; import TaskListLayout from './TaskListLayout'; diff --git a/src/pages/Tasks/components/TaskListLayout.tsx b/packages/web/src/pages/Tasks/components/TaskListLayout.tsx similarity index 87% rename from src/pages/Tasks/components/TaskListLayout.tsx rename to packages/web/src/pages/Tasks/components/TaskListLayout.tsx index 7b23789f..eebaacf9 100644 --- a/src/pages/Tasks/components/TaskListLayout.tsx +++ b/packages/web/src/pages/Tasks/components/TaskListLayout.tsx @@ -1,11 +1,11 @@ import { useTranslation } from 'react-i18next'; -import { useGetCurrentUser } from 'common/api/useGetCurrentUser'; -import { useGetUserTasks } from 'pages/Tasks/api/useGetUserTasks'; -import { BaseComponentProps } from 'common/utils/types'; +import { useGetCurrentUser } from '@/common/api/useGetCurrentUser'; +import { useGetUserTasks } from '@/pages/Tasks/api/useGetUserTasks'; +import type { BaseComponentProps } from '@/common/utils/types'; import TaskList from './List/TaskList'; import TaskStatusDonutChart from './Chart/TaskStatusDonutChart'; -import Card from 'common/components/Card/Card'; +import Card from '@/common/components/Card/Card'; /** * The `TaskListLayout` component renders the layout for all tasks for a diff --git a/src/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx b/packages/web/src/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx similarity index 98% rename from src/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx rename to packages/web/src/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx index 07e2d734..64d7c8da 100644 --- a/src/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx +++ b/packages/web/src/pages/Tasks/components/TasksPageBreadcrumbs.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { Navigate, Route, Routes } from 'react-router-dom'; -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import TasksPageBreadcrumbs from './TasksPageBreadcrumbs'; diff --git a/src/pages/Tasks/components/TasksPageBreadcrumbs.tsx b/packages/web/src/pages/Tasks/components/TasksPageBreadcrumbs.tsx similarity index 92% rename from src/pages/Tasks/components/TasksPageBreadcrumbs.tsx rename to packages/web/src/pages/Tasks/components/TasksPageBreadcrumbs.tsx index c9e54fa6..c916c377 100644 --- a/src/pages/Tasks/components/TasksPageBreadcrumbs.tsx +++ b/packages/web/src/pages/Tasks/components/TasksPageBreadcrumbs.tsx @@ -1,10 +1,10 @@ import { useLocation, useParams } from 'react-router-dom'; import toNumber from 'lodash/toNumber'; -import { BaseComponentProps } from 'common/utils/types'; +import type { BaseComponentProps } from '@/common/utils/types'; import { useGetTask } from '../api/useGetTask'; -import Breadcrumbs from 'common/components/Breadcrumbs/Breadcrumbs'; -import Skeleton from 'common/components/Loader/Skeleton'; +import Breadcrumbs from '@/common/components/Breadcrumbs/Breadcrumbs'; +import Skeleton from '@/common/components/Loader/Skeleton'; /** * The `TasksPageBreadcrumbs` component renders the `Breadcrumbs` for the tasks diff --git a/src/pages/Tasks/components/UserInfo.test.tsx b/packages/web/src/pages/Tasks/components/UserInfo.test.tsx similarity index 89% rename from src/pages/Tasks/components/UserInfo.test.tsx rename to packages/web/src/pages/Tasks/components/UserInfo.test.tsx index 30fdb97b..8b55a145 100644 --- a/src/pages/Tasks/components/UserInfo.test.tsx +++ b/packages/web/src/pages/Tasks/components/UserInfo.test.tsx @@ -1,9 +1,9 @@ -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import { describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import * as UseGetUser from 'common/api/useGetUser'; -import { userFixture1 } from '__fixtures__/users'; +import * as UseGetUser from '@/common/api/useGetUser'; +import { userFixture1 } from '@/__fixtures__/users'; import UserInfo from './UserInfo'; diff --git a/src/pages/Tasks/components/UserInfo.tsx b/packages/web/src/pages/Tasks/components/UserInfo.tsx similarity index 86% rename from src/pages/Tasks/components/UserInfo.tsx rename to packages/web/src/pages/Tasks/components/UserInfo.tsx index 0f4616af..83dd5402 100644 --- a/src/pages/Tasks/components/UserInfo.tsx +++ b/packages/web/src/pages/Tasks/components/UserInfo.tsx @@ -1,8 +1,8 @@ -import { useGetUser } from 'common/api/useGetUser'; -import { BaseComponentProps } from 'common/utils/types'; -import Avatar from 'common/components/Icon/Avatar'; -import Skeleton from 'common/components/Loader/Skeleton'; -import FAIcon from 'common/components/Icon/FAIcon'; +import { useGetUser } from '@/common/api/useGetUser'; +import type { BaseComponentProps } from '@/common/utils/types'; +import Avatar from '@/common/components/Icon/Avatar'; +import Skeleton from '@/common/components/Loader/Skeleton'; +import FAIcon from '@/common/components/Icon/FAIcon'; /** * Properties for the `UserInfo` component. diff --git a/src/pages/Tasks/components/View/TaskView.test.tsx b/packages/web/src/pages/Tasks/components/View/TaskView.test.tsx similarity index 93% rename from src/pages/Tasks/components/View/TaskView.test.tsx rename to packages/web/src/pages/Tasks/components/View/TaskView.test.tsx index bd208855..37fcf503 100644 --- a/src/pages/Tasks/components/View/TaskView.test.tsx +++ b/packages/web/src/pages/Tasks/components/View/TaskView.test.tsx @@ -1,10 +1,10 @@ -import { render, screen } from 'test/test-utils'; +import { render, screen } from '@/test/test-utils'; import { describe, expect, it, vi } from 'vitest'; import { UseQueryResult } from '@tanstack/react-query'; -import { todosFixture } from '__fixtures__/todos'; -import { userFixture1 } from '__fixtures__/users'; -import * as UseGetUser from 'common/api/useGetUser'; +import { todosFixture } from '@/__fixtures__/todos'; +import { userFixture1 } from '@/__fixtures__/users'; +import * as UseGetUser from '@/common/api/useGetUser'; import TaskView from './TaskView'; diff --git a/src/pages/Tasks/components/View/TaskView.tsx b/packages/web/src/pages/Tasks/components/View/TaskView.tsx similarity index 84% rename from src/pages/Tasks/components/View/TaskView.tsx rename to packages/web/src/pages/Tasks/components/View/TaskView.tsx index 66af86b6..0b25ff00 100644 --- a/src/pages/Tasks/components/View/TaskView.tsx +++ b/packages/web/src/pages/Tasks/components/View/TaskView.tsx @@ -1,11 +1,11 @@ import { useTranslation } from 'react-i18next'; -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; -import { useGetUser } from 'common/api/useGetUser'; -import Badge from 'common/components/Badge/Badge'; -import Skeleton from 'common/components/Loader/Skeleton'; +import { cn } from '@/common/utils/css'; +import { BaseComponentProps } from '@/common/utils/types'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; +import { useGetUser } from '@/common/api/useGetUser'; +import Badge from '@/common/components/Badge/Badge'; +import Skeleton from '@/common/components/Loader/Skeleton'; /** * Properties for the `TaskView` component. diff --git a/src/test/mocks/handlers.ts b/packages/web/src/test/mocks/handlers.ts similarity index 93% rename from src/test/mocks/handlers.ts rename to packages/web/src/test/mocks/handlers.ts index 03a1a673..7b54fdb1 100644 --- a/src/test/mocks/handlers.ts +++ b/packages/web/src/test/mocks/handlers.ts @@ -2,9 +2,9 @@ import { delay, HttpResponse, http } from 'msw'; import filter from 'lodash/filter'; import find from 'lodash/find'; -import { usersFixture } from '__fixtures__/users'; -import { todosFixture } from '__fixtures__/todos'; -import { Task } from 'pages/Tasks/api/useGetUserTasks'; +import { usersFixture } from '@/__fixtures__/users'; +import { todosFixture } from '@/__fixtures__/todos'; +import { Task } from '@/pages/Tasks/api/useGetUserTasks'; export const handlers = [ http.get('https://jsonplaceholder.typicode.com/users', () => { diff --git a/src/test/mocks/server.ts b/packages/web/src/test/mocks/server.ts similarity index 100% rename from src/test/mocks/server.ts rename to packages/web/src/test/mocks/server.ts diff --git a/src/test/mocks/window.ts b/packages/web/src/test/mocks/window.ts similarity index 100% rename from src/test/mocks/window.ts rename to packages/web/src/test/mocks/window.ts diff --git a/src/test/query-client.ts b/packages/web/src/test/query-client.ts similarity index 100% rename from src/test/query-client.ts rename to packages/web/src/test/query-client.ts diff --git a/src/test/test-utils.tsx b/packages/web/src/test/test-utils.tsx similarity index 94% rename from src/test/test-utils.tsx rename to packages/web/src/test/test-utils.tsx index c5832e53..3b90ecaa 100644 --- a/src/test/test-utils.tsx +++ b/packages/web/src/test/test-utils.tsx @@ -1,6 +1,6 @@ import { queries, Queries, render, renderHook, RenderHookOptions, RenderOptions } from '@testing-library/react'; -import 'common/utils/i18n'; +import '@/common/utils/i18n'; import WithAllProviders from './wrappers/WithAllProviders'; const customRender = (ui: React.ReactElement, options?: RenderOptions, { route = '/' } = {}) => { @@ -20,7 +20,6 @@ function customRenderHook< } // re-export @testing-library/react -// eslint-disable-next-line export * from '@testing-library/react'; // override the render function diff --git a/src/test/wrappers/AllProvidersExceptRouter.tsx b/packages/web/src/test/wrappers/AllProvidersExceptRouter.tsx similarity index 86% rename from src/test/wrappers/AllProvidersExceptRouter.tsx rename to packages/web/src/test/wrappers/AllProvidersExceptRouter.tsx index afbe9682..3d16460d 100644 --- a/src/test/wrappers/AllProvidersExceptRouter.tsx +++ b/packages/web/src/test/wrappers/AllProvidersExceptRouter.tsx @@ -1,9 +1,9 @@ import { PropsWithChildren } from 'react'; import { QueryClientProvider } from '@tanstack/react-query'; -import SettingsContextProvider from 'common/providers/SettingsProvider'; -import AuthContextProvider from 'common/providers/AuthProvider'; -import ToastsProvider from 'common/providers/ToastsProvider'; +import SettingsContextProvider from '@/common/providers/SettingsProvider'; +import AuthContextProvider from '@/common/providers/AuthProvider'; +import ToastsProvider from '@/common/providers/ToastsProvider'; import { queryClient } from '../query-client'; diff --git a/src/test/wrappers/WithAllProviders.tsx b/packages/web/src/test/wrappers/WithAllProviders.tsx similarity index 81% rename from src/test/wrappers/WithAllProviders.tsx rename to packages/web/src/test/wrappers/WithAllProviders.tsx index 91b40544..de494124 100644 --- a/src/test/wrappers/WithAllProviders.tsx +++ b/packages/web/src/test/wrappers/WithAllProviders.tsx @@ -2,9 +2,9 @@ import { PropsWithChildren } from 'react'; import { MemoryRouter } from 'react-router-dom'; import { QueryClientProvider } from '@tanstack/react-query'; -import SettingsContextProvider from 'common/providers/SettingsProvider'; -import AuthContextProvider from 'common/providers/AuthProvider'; -import ToastsProvider from 'common/providers/ToastsProvider'; +import SettingsContextProvider from '@/common/providers/SettingsProvider'; +import AuthContextProvider from '@/common/providers/AuthProvider'; +import ToastsProvider from '@/common/providers/ToastsProvider'; import { queryClient } from '../query-client'; diff --git a/src/test/wrappers/WithQueryClientProvider.tsx b/packages/web/src/test/wrappers/WithQueryClientProvider.tsx similarity index 100% rename from src/test/wrappers/WithQueryClientProvider.tsx rename to packages/web/src/test/wrappers/WithQueryClientProvider.tsx diff --git a/src/vite-env.d.ts b/packages/web/src/vite-env.d.ts similarity index 100% rename from src/vite-env.d.ts rename to packages/web/src/vite-env.d.ts diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json new file mode 100644 index 00000000..0b036d2a --- /dev/null +++ b/packages/web/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "outDir": "./dist", + "rootDir": ".", + "jsx": "react-jsx", + "types": ["node", "vitest/globals", "@testing-library/jest-dom"], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", ".storybook/**/*.{ts,tsx}"] +} diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts new file mode 100644 index 00000000..9e4f9e45 --- /dev/null +++ b/packages/web/vite.config.ts @@ -0,0 +1,37 @@ +/// +import { defineConfig } from 'vite'; +import path from 'path'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], + resolve: { + alias: { + '@': path.resolve(import.meta.dirname, './src'), + }, + }, + build: { + emptyOutDir: true, + outDir: 'dist', + sourcemap: true, + rollupOptions: { + output: { + manualChunks: (id) => { + if (id.indexOf('node_modules') > -1) { + if (id.indexOf('@codemirror') > -1) { + return 'codemirror'; + } + if (id.indexOf('@fortawesome') > -1) { + return 'fortawesome'; + } + if (id.indexOf('mime-db') > -1) { + return 'mime-db'; + } + } + }, + }, + }, + }, +}); diff --git a/packages/web/vitest.config.ts b/packages/web/vitest.config.ts new file mode 100644 index 00000000..1725f0e1 --- /dev/null +++ b/packages/web/vitest.config.ts @@ -0,0 +1,46 @@ +import { coverageConfigDefaults, defineConfig, mergeConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +import baseConfig from '../../vitest.config.ts'; + +/** + * Vitest configuration for the Web package. + * Extends the base configuration with web-specific settings. + */ +export default mergeConfig( + baseConfig, + defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + test: { + environment: 'jsdom', + globals: true, + mockReset: true, + setupFiles: './vitest.setup.ts', + include: ['src/**/*.test.ts', 'src/**/*.test.tsx'], + coverage: { + include: ['src/**/*.ts', 'src/**/*.tsx'], + exclude: [ + 'storybook-static', + '**/__fixtures__/**', + '**/__mocks__/**', + 'src/**/main.tsx', + 'src/assets/', + 'src/test/', + 'src/**/*.d.ts', + 'src/**/*.test.ts', + 'src/**/*.test.tsx', + 'src/*.stories.*', + 'src/common/components/shadcn/**', + 'src/**/i18n/locales/**', + ...coverageConfigDefaults.exclude, + ], + }, + }, + }), +); diff --git a/packages/web/vitest.setup.ts b/packages/web/vitest.setup.ts new file mode 100644 index 00000000..c1871bba --- /dev/null +++ b/packages/web/vitest.setup.ts @@ -0,0 +1,45 @@ +import { afterAll, afterEach, beforeAll, vi } from 'vitest'; +import '@testing-library/jest-dom/vitest'; + +import { server } from './src/test/mocks/server'; +import { queryClient } from './src/test/query-client'; + +beforeAll(() => { + server.listen(); +}); + +afterEach(() => { + server.resetHandlers(); + queryClient.clear(); +}); + +afterAll(() => { + server.close(); +}); + +// Set up environment variables for testing +process.env.VITE_API_BASE_URL = 'http://localhost:3000/api'; + +// Mock window.matchMedia for tests +Object.defineProperty(window, 'matchMedia', { + writable: true, + value: vi.fn().mockImplementation((query: string) => ({ + matches: false, + media: query, + onchange: null, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + addListener: vi.fn(), + removeListener: vi.fn(), + dispatchEvent: vi.fn(), + })), +}); + +// Mock ResizeObserver for tests +class ResizeObserverMock { + observe = vi.fn(); + unobserve = vi.fn(); + disconnect = vi.fn(); +} + +global.ResizeObserver = ResizeObserverMock as unknown as typeof ResizeObserver; diff --git a/src/common/components/Divider/Divider.tsx b/src/common/components/Divider/Divider.tsx deleted file mode 100644 index 6b8bb4d4..00000000 --- a/src/common/components/Divider/Divider.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; - -/** - * Properties for the `Divider` component. - */ -export interface DividerProps extends BaseComponentProps {} - -/** - * The `Divider` component renders a horizontal line which visually separates - * content. - */ -const Divider = ({ className, testId = 'divider' }: DividerProps) => { - return
; -}; - -export default Divider; diff --git a/src/common/components/Menu/MenuSeparator.tsx b/src/common/components/Menu/MenuSeparator.tsx deleted file mode 100644 index 474aa0ee..00000000 --- a/src/common/components/Menu/MenuSeparator.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { cn } from 'common/utils/css'; -import { BaseComponentProps } from 'common/utils/types'; - -/** - * Properties for the `MenuSeparator` component. - * @see {@link BaseComponentProps} - */ -export interface MenuSeparatorProps extends BaseComponentProps {} - -/** - * The `MenuSeparator` component renders a separator to deliniate the boundary - * between sections of a `Menu`. - * @param {MenuSeparatorProps} props - Component properties, `MenuSeparatorProps`. - */ -const MenuSeparator = ({ className, testId = 'menu-separator' }: MenuSeparatorProps) => { - return
; -}; - -export default MenuSeparator; diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..203171df --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,26 @@ +/** + * The base TypeScript configuration for the project. Extended by individual package configurations. + */ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022"], + "module": "ESNext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "allowJs": false, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "exclude": ["node_modules", "dist", "coverage"] +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 1e5af508..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - - /* Absolute imports */ - "baseUrl": ".", - "paths": { - "__fixtures__/*": ["./src/__fixtures__/*"], - "assets/*": ["./src/assets/*"], - "common/*": ["./src/common/*"], - "pages/*": ["./src/pages/*"], - "test/*": ["./src/test/*"] - } - }, - "include": ["src", "./vitest.setup.ts"], - "exclude": ["infrastructure"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/tsconfig.node.json b/tsconfig.node.json deleted file mode 100644 index 97ede7ee..00000000 --- a/tsconfig.node.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true - }, - "include": ["vite.config.ts"] -} diff --git a/vite.config.ts b/vite.config.ts deleted file mode 100644 index ab32fed4..00000000 --- a/vite.config.ts +++ /dev/null @@ -1,60 +0,0 @@ -/// -import { defineConfig } from 'vite'; -import { coverageConfigDefaults, configDefaults } from 'vitest/config'; -import react from '@vitejs/plugin-react'; -import tailwindcss from '@tailwindcss/vite'; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), tailwindcss()], - resolve: { - alias: { - __fixtures__: '/src/__fixtures__', - assets: '/src/assets', - common: '/src/common', - pages: '/src/pages', - test: '/src/test', - }, - }, - test: { - exclude: [...configDefaults.exclude, '**/infrastructure/**'], - coverage: { - exclude: [ - 'storybook-static/**', - '**/__fixtures__/**', - '**/__mocks__/**', - '**/*.stories.*', - 'src/main.tsx', - 'src/assets', - 'src/test', - '**/i18n/locales/**', - '**/tailwind.config.js', - ...coverageConfigDefaults.exclude, - ], - reporter: ['text', 'json', 'html'], - }, - environment: 'jsdom', - globals: true, - mockReset: true, - setupFiles: ['./vitest.setup.ts'], - }, - build: { - rollupOptions: { - output: { - manualChunks: (id) => { - if (id.indexOf('node_modules') > -1) { - if (id.indexOf('@codemirror') > -1) { - return 'codemirror'; - } - if (id.indexOf('@fortawesome') > -1) { - return 'fortawesome'; - } - if (id.indexOf('mime-db') > -1) { - return 'mime-db'; - } - } - }, - }, - }, - }, -}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..bfa0e380 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'vitest/config'; + +/** + * The base Vitest configuration for the project. Extended by individual package configurations. + */ +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['src/**/*.test.ts', 'src/**/*.test.tsx'], + exclude: ['node_modules', 'dist', '**/__fixtures__/**'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'json-summary', 'html'], + include: ['src/**/*.ts', 'src/**/*.tsx'], + exclude: ['node_modules', 'dist', '**/__fixtures__/**'], + }, + }, +}); diff --git a/vitest.setup.ts b/vitest.setup.ts deleted file mode 100644 index ce4edf50..00000000 --- a/vitest.setup.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { afterAll, afterEach, beforeAll } from 'vitest'; -import '@testing-library/jest-dom/vitest'; - -import { server } from './src/test/mocks/server'; -import { queryClient } from './src/test/query-client'; - -beforeAll(() => { - server.listen(); -}); - -afterEach(() => { - server.resetHandlers(); - queryClient.clear(); -}); - -afterAll(() => { - server.close(); -}); From 908116d44f017cbc9963776b3fca19486ee1661a Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 06:04:23 -0400 Subject: [PATCH 02/17] updated infra tests --- packages/infra/src/stacks/cdn-stack.test.ts | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/infra/src/stacks/cdn-stack.test.ts b/packages/infra/src/stacks/cdn-stack.test.ts index 592da93c..b0d51da2 100644 --- a/packages/infra/src/stacks/cdn-stack.test.ts +++ b/packages/infra/src/stacks/cdn-stack.test.ts @@ -25,7 +25,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', }; stack = new CdnStack(app, 'TestStack', props); @@ -152,7 +152,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', certificateArn: 'arn:aws:acm:us-east-1:123456789012:certificate/test-cert', domainName: 'app.example.com', }; @@ -224,7 +224,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'prod', - assetPath: '../dist', + assetPath: '../web/dist', certificateArn: 'arn:aws:acm:us-east-1:123456789012:certificate/test-cert', domainName: 'app.example.com', hostedZoneId: 'Z1234567890ABC', @@ -280,7 +280,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', certificateArn: 'arn:aws:acm:us-east-1:123456789012:certificate/test-cert', domainName: 'app.example.com', hostedZoneName: 'example.com', @@ -297,7 +297,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', certificateArn: 'arn:aws:acm:us-east-1:123456789012:certificate/test-cert', domainName: 'app.example.com', hostedZoneId: 'Z1234567890ABC', @@ -314,7 +314,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', domainName: 'app.example.com', // certificateArn is missing }; @@ -340,7 +340,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'my-app', envName: 'staging', - assetPath: '../dist', + assetPath: '../web/dist', }; const stack = new CdnStack(app, 'TestStackNaming', props); @@ -354,7 +354,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', }; const stack = new CdnStack(app, 'TestStackProperties', props); @@ -367,7 +367,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', }; const stack = new CdnStack(app, 'TestStackInheritance', props); @@ -384,7 +384,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', }; stack = new CdnStack(app, 'TestStackCloudFront', props); @@ -426,7 +426,7 @@ describe('CdnStack', () => { const props: CdnStackProps = { appName: 'test-app', envName: 'dev', - assetPath: '../dist', + assetPath: '../web/dist', }; stack = new CdnStack(app, 'TestStackS3', props); From ec8f4745d842ea66c36722c97d5d26fe61712676 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 06:09:53 -0400 Subject: [PATCH 03/17] fix: update path resolution in Vitest config to use import.meta.dirname --- packages/web/vitest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/vitest.config.ts b/packages/web/vitest.config.ts index 1725f0e1..6f779549 100644 --- a/packages/web/vitest.config.ts +++ b/packages/web/vitest.config.ts @@ -14,7 +14,7 @@ export default mergeConfig( plugins: [react()], resolve: { alias: { - '@': path.resolve(__dirname, './src'), + '@': path.resolve(import.meta.dirname, './src'), }, }, test: { From cf8c9f0a5007e83142d647b6efeadefa7d8f121c Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 06:10:04 -0400 Subject: [PATCH 04/17] fixed unit tests --- packages/web/src/pages/About/AboutPage.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/pages/About/AboutPage.test.tsx b/packages/web/src/pages/About/AboutPage.test.tsx index 6b11967c..11855160 100644 --- a/packages/web/src/pages/About/AboutPage.test.tsx +++ b/packages/web/src/pages/About/AboutPage.test.tsx @@ -4,7 +4,7 @@ import { render, screen } from '@/test/test-utils'; import AboutPage from './AboutPage'; // Mock the config module -vi.mock('common/utils/config', () => ({ +vi.mock('@/common/utils/config', () => ({ config: { VITE_BUILD_DATE: '2026-07-22', VITE_BUILD_TIME: '12:00:00', From 0c34c0e9df6719e62722a0330c30695c8ccd11f8 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 06:39:50 -0400 Subject: [PATCH 05/17] unit test fixes --- packages/web/src/common/hooks/useDebounce.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/common/hooks/useDebounce.test.ts b/packages/web/src/common/hooks/useDebounce.test.ts index af967dc1..a7abed9b 100644 --- a/packages/web/src/common/hooks/useDebounce.test.ts +++ b/packages/web/src/common/hooks/useDebounce.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { renderHook, waitFor } from '@/test/test-utils'; +import { renderHook, waitFor } from '@testing-library/react'; import { useDebounce } from '@/common/hooks/useDebounce'; From b5ecb14d5497aaf148fa36e0e1c221db4fddf54c Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 07:24:32 -0400 Subject: [PATCH 06/17] fix web package Vitest setup --- packages/web/vitest.setup.ts | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/packages/web/vitest.setup.ts b/packages/web/vitest.setup.ts index c1871bba..ce4edf50 100644 --- a/packages/web/vitest.setup.ts +++ b/packages/web/vitest.setup.ts @@ -1,4 +1,4 @@ -import { afterAll, afterEach, beforeAll, vi } from 'vitest'; +import { afterAll, afterEach, beforeAll } from 'vitest'; import '@testing-library/jest-dom/vitest'; import { server } from './src/test/mocks/server'; @@ -16,30 +16,3 @@ afterEach(() => { afterAll(() => { server.close(); }); - -// Set up environment variables for testing -process.env.VITE_API_BASE_URL = 'http://localhost:3000/api'; - -// Mock window.matchMedia for tests -Object.defineProperty(window, 'matchMedia', { - writable: true, - value: vi.fn().mockImplementation((query: string) => ({ - matches: false, - media: query, - onchange: null, - addEventListener: vi.fn(), - removeEventListener: vi.fn(), - addListener: vi.fn(), - removeListener: vi.fn(), - dispatchEvent: vi.fn(), - })), -}); - -// Mock ResizeObserver for tests -class ResizeObserverMock { - observe = vi.fn(); - unobserve = vi.fn(); - disconnect = vi.fn(); -} - -global.ResizeObserver = ResizeObserverMock as unknown as typeof ResizeObserver; From e7023221831731890e968a0385fc6bfe49ad9f79 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 07:24:41 -0400 Subject: [PATCH 07/17] fix unit tests --- packages/web/src/common/components/Card/Card.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/common/components/Card/Card.test.tsx b/packages/web/src/common/components/Card/Card.test.tsx index be05af33..9e543ab6 100644 --- a/packages/web/src/common/components/Card/Card.test.tsx +++ b/packages/web/src/common/components/Card/Card.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { render, screen } from '@/test/test-utils'; -import logo from 'assets/img/logo.png'; +import logo from '@/assets/img/logo.png'; import Card from './Card'; From d5fda686643c68d33f578d93d49385376182fa3a Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 08:20:33 -0400 Subject: [PATCH 08/17] fix: update workflows for monorepo structure --- .github/workflows/ci.yml | 51 ++++---- .github/workflows/code-quality.yml | 166 +++++++++----------------- .github/workflows/deploy-reusable.yml | 44 +++---- 3 files changed, 99 insertions(+), 162 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65d55119..1d1c3297 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,14 +31,20 @@ jobs: node-version-file: '.nvmrc' cache: 'npm' - # --- Application Checks --- - name: Install dependencies run: npm ci - - name: 'Create .env file' + - name: 'Create web .env file' + working-directory: ./packages/web run: | echo "${{ vars.ENV_CI }}" > .env + - name: Create infrastructure .env file + working-directory: ./packages/infra + run: | + echo "${{ vars.CDK_ENV_DEV }}" > .env + + # --- Project Checks --- - name: Lint run: npm run lint @@ -49,30 +55,14 @@ jobs: run: npm run build - name: Run unit tests - run: npm run test:ci + run: npm run test:coverage + # --- Web Package Checks --- # --- Storybook Checks --- - name: Build Storybook - run: npm run build:storybook - - # --- Infrastructure Checks --- - - name: Install infrastructure dependencies - working-directory: ./infrastructure - run: npm ci - - - name: Build infrastructure - working-directory: ./infrastructure - run: npm run build - - - name: Run infrastructure tests with coverage - working-directory: ./infrastructure - run: npm run test:coverage - - - name: Create infrastructure .env file - working-directory: ./infrastructure - run: | - echo "${{ vars.CDK_ENV_DEV }}" > .env + run: npm run build:storybook -w packages/web + # --- Infrastructure Package Checks --- - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v6 with: @@ -80,16 +70,19 @@ jobs: role-session-name: ci-react-starter aws-region: ${{ vars.AWS_REGION }} - - name: Synthesize CDK stacks - working-directory: ./infrastructure - run: npm run synth + - name: Synthesize AWS CDK stacks + run: npm run synth -w packages/infra - # Final Step: Clean up sensitive infrastructure files + # --- Final Step: Clean up sensitive files --- - name: Clean up sensitive files if: always() - working-directory: ./infrastructure run: | echo "🧹 Cleaning up sensitive files..." - rm -f .env - rm -rf cdk.out + rm -f packages/web/.env + rm -rf packages/web/dist + rm -rf packages/web/storybook-static + rm -f packages/infra/.env + rm -rf packages/infra/dist + rm -rf packages/infra/cdk.out + rm -rf packages/shared/dist echo "✅ Sensitive files cleaned up" diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index c96a786a..da8a0935 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -2,16 +2,16 @@ name: Code Quality on: schedule: - # Run code quality checks daily at 2 AM UTC on Sundays - - cron: '0 2 * * 0' + # Run code quality checks daily at 0500 UTC on Sundays + - cron: '0 5 * * 0' workflow_dispatch: push: branches: [main] paths: - - 'src/**' - - 'package.json' - - 'tsconfig.json' - - 'tsconfig.node.json' + - '**/src/**' + - '**/package.json' + - '**/tsconfig.json' + - '**/tsconfig.node.json' - '.github/workflows/**' jobs: @@ -21,6 +21,7 @@ jobs: timeout-minutes: 10 steps: + # --- Setup --- - name: Checkout repository uses: actions/checkout@v6 with: @@ -35,19 +36,26 @@ jobs: - name: Install dependencies run: npm ci - - name: 'Create .env file' + - name: 'Create web .env file' + working-directory: ./packages/web run: | echo "${{ vars.ENV_CI }}" > .env + - name: Create infrastructure .env file + working-directory: ./packages/infra + run: | + echo "${{ vars.CDK_ENV_DEV }}" > .env + + # --- Project Checks --- - name: Run ESLint with detailed output run: | echo "## ESLint Analysis" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - npm run lint -- --output-file eslint-output.txt || true - if [ -s eslint-output.txt ]; then + npm run lint -- --output-file lint-output.txt || true + if [ -s lint-output.txt ]; then echo "### Issues Found:" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY - cat eslint-output.txt >> $GITHUB_STEP_SUMMARY + cat lint-output.txt >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY else echo "✅ No ESLint issues found" >> $GITHUB_STEP_SUMMARY @@ -58,55 +66,28 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY echo "## Prettier Analysis" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - npm run format:check > prettier-output.txt 2>&1 || true + npm run format:check > format-output.txt 2>&1 || true if [ $? -eq 0 ]; then echo "✅ All files are properly formatted" >> $GITHUB_STEP_SUMMARY else echo "❌ Some files need formatting:" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY - cat prettier-output.txt >> $GITHUB_STEP_SUMMARY + cat format-output.txt >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY fi - - name: Run tests with detailed coverage - run: | - echo "" >> $GITHUB_STEP_SUMMARY - echo "## Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - npm run test:ci -- --coverage.reporter=json-summary - - # Extract coverage summary - if [ -f coverage/coverage-summary.json ]; then - echo "### Coverage Summary:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - # Use Node.js to parse JSON and create a table - node -e " - const fs = require('fs'); - const coverage = JSON.parse(fs.readFileSync('coverage/coverage-summary.json', 'utf8')); - const total = coverage.total; - - console.log('| Metric | Percentage | Covered/Total |'); - console.log('|--------|------------|---------------|'); - console.log(\`| Lines | \${total.lines.pct}% | \${total.lines.covered}/\${total.lines.total} |\`); - console.log(\`| Functions | \${total.functions.pct}% | \${total.functions.covered}/\${total.functions.total} |\`); - console.log(\`| Branches | \${total.branches.pct}% | \${total.branches.covered}/\${total.branches.total} |\`); - console.log(\`| Statements | \${total.statements.pct}% | \${total.statements.covered}/\${total.statements.total} |\`); - " >> $GITHUB_STEP_SUMMARY - fi - - name: Build check run: | echo "" >> $GITHUB_STEP_SUMMARY echo "## Build" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - npm run build > tsc-output.txt 2>&1 + npm run build > build-output.txt 2>&1 if [ $? -eq 0 ]; then echo "✅ Build successful" >> $GITHUB_STEP_SUMMARY else echo "❌ Build failed:" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY - cat tsc-output.txt >> $GITHUB_STEP_SUMMARY + cat build-output.txt >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY fi @@ -134,36 +115,32 @@ jobs: # Check for outdated packages echo "### Outdated Packages:" >> $GITHUB_STEP_SUMMARY - npm outdated > outdated-output.txt 2>&1 || true - if [ -s outdated-output.txt ]; then + npm outdated > package-output.txt 2>&1 || true + if [ -s package-output.txt ]; then echo '```' >> $GITHUB_STEP_SUMMARY - cat outdated-output.txt >> $GITHUB_STEP_SUMMARY + cat package-output.txt >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY else echo "✅ All packages are up to date" >> $GITHUB_STEP_SUMMARY fi - - name: Install infrastructure dependencies - working-directory: ./infrastructure - run: npm ci - - - name: Run infrastructure tests with detailed coverage - working-directory: ./infrastructure + # -- Web Package Checks --- + - name: Run web tests with detailed coverage run: | echo "" >> $GITHUB_STEP_SUMMARY - echo "## Infrastructure Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY + echo "## Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - npm run test:coverage + npm run test:coverage -w packages/web # Extract coverage summary - if [ -f coverage/coverage-summary.json ]; then - echo "### Infrastructure Coverage Summary:" >> $GITHUB_STEP_SUMMARY + if [ -f packages/web/coverage/coverage-summary.json ]; then + echo "### Web Coverage Summary:" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY # Use Node.js to parse JSON and create a table node -e " const fs = require('fs'); - const coverage = JSON.parse(fs.readFileSync('coverage/coverage-summary.json', 'utf8')); + const coverage = JSON.parse(fs.readFileSync('packages/web/coverage/coverage-summary.json', 'utf8')); const total = coverage.total; console.log('| Metric | Percentage | Covered/Total |'); @@ -175,55 +152,32 @@ jobs: " >> $GITHUB_STEP_SUMMARY fi - - name: Infrastructure build check - working-directory: ./infrastructure - run: | - echo "" >> $GITHUB_STEP_SUMMARY - echo "## Infrastructure Build" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - npm run build > infra-tsc-output.txt 2>&1 - if [ $? -eq 0 ]; then - echo "✅ Build successful" >> $GITHUB_STEP_SUMMARY - else - echo "❌ Build failed:" >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - cat infra-tsc-output.txt >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - fi - - - name: Infrastructure security audit - working-directory: ./infrastructure - run: | - echo "" >> $GITHUB_STEP_SUMMARY - echo "## Infrastructure Security Audit" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - npm audit --audit-level=moderate --omit=dev > infra-security-output.txt 2>&1 || true - - if grep -q "found 0 vulnerabilities" infra-security-output.txt; then - echo "✅ No security vulnerabilities found" >> $GITHUB_STEP_SUMMARY - else - echo "⚠️ Security vulnerabilities detected:" >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - cat infra-security-output.txt >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - fi - - - name: Infrastructure package analysis - working-directory: ./infrastructure + # --- Infrastructure Package Checks --- + - name: Run infrastructure tests with detailed coverage run: | echo "" >> $GITHUB_STEP_SUMMARY - echo "## Infrastructure Package Analysis" >> $GITHUB_STEP_SUMMARY + echo "## Infrastructure Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY + npm run test:coverage -w packages/infrastructure - # Check for outdated packages - echo "### Outdated Packages:" >> $GITHUB_STEP_SUMMARY - npm outdated > infra-outdated-output.txt 2>&1 || true - if [ -s infra-outdated-output.txt ]; then - echo '```' >> $GITHUB_STEP_SUMMARY - cat infra-outdated-output.txt >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - else - echo "✅ All packages are up to date" >> $GITHUB_STEP_SUMMARY + # Extract coverage summary + if [ -f packages/infra/coverage/coverage-summary.json ]; then + echo "### Infrastructure Coverage Summary:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Use Node.js to parse JSON and create a table + node -e " + const fs = require('fs'); + const coverage = JSON.parse(fs.readFileSync('packages/infra/coverage/coverage-summary.json', 'utf8')); + const total = coverage.total; + + console.log('| Metric | Percentage | Covered/Total |'); + console.log('|--------|------------|---------------|'); + console.log(\`| Lines | \${total.lines.pct}% | \${total.lines.covered}/\${total.lines.total} |\`); + console.log(\`| Functions | \${total.functions.pct}% | \${total.functions.covered}/\${total.functions.total} |\`); + console.log(\`| Branches | \${total.branches.pct}% | \${total.branches.covered}/\${total.branches.total} |\`); + console.log(\`| Statements | \${total.statements.pct}% | \${total.statements.covered}/\${total.statements.total} |\`); + " >> $GITHUB_STEP_SUMMARY fi - name: Archive test results @@ -232,13 +186,9 @@ jobs: with: name: test-results path: | - coverage/ - eslint-output.txt - prettier-output.txt - tsc-output.txt + lint-output.txt + format-output.txt + build-output.txt security-output.txt - outdated-output.txt - infra-tsc-output.txt - infra-security-output.txt - infra-outdated-output.txt + package-output.txt retention-days: 7 diff --git a/.github/workflows/deploy-reusable.yml b/.github/workflows/deploy-reusable.yml index b4363281..b55f4adc 100644 --- a/.github/workflows/deploy-reusable.yml +++ b/.github/workflows/deploy-reusable.yml @@ -45,7 +45,8 @@ jobs: - name: Install Dependencies run: npm ci - - name: Create app .env file + - name: Create web .env file + working-directory: ./packages/web run: | echo "${{ inputs.env_file }}" > .env echo "VITE_BUILD_DATE=$(date -u +'%Y-%m-%d')" >> .env @@ -57,11 +58,16 @@ jobs: echo "VITE_BUILD_WORKFLOW_RUN_NUMBER=${{ github.run_number }}" >> .env echo "VITE_BUILD_WORKFLOW_RUN_ATTEMPT=${{ github.run_attempt }}" >> .env + - name: Create infrastructure .env file + working-directory: ./packages/infra + run: | + echo "${{ inputs.cdk_env_file }}" > .env + - name: Build the app run: npm run build - name: Build storybook - run: npm run build:storybook + run: npm run build:storybook -w packages/web - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v6 @@ -70,45 +76,33 @@ jobs: aws-region: ${{ inputs.aws_region }} role-session-name: deploy-react-starter-${{ github.run_id }} - - name: Install infrastructure dependencies - working-directory: ./infrastructure - run: npm ci - - - name: Create infrastructure .env file - working-directory: ./infrastructure - run: | - echo "${{ inputs.cdk_env_file }}" > .env - echo "✅ Infrastructure .env file created" - - - name: Build infrastructure - working-directory: ./infrastructure - run: npm run build - - name: Bootstrap CDK - working-directory: ./infrastructure + working-directory: ./packages/infra run: | echo "⚡ Checking if CDK bootstrap is needed..." # Try to describe the bootstrap stack to see if it exists if ! aws cloudformation describe-stacks --stack-name CDKToolkit --region ${{ inputs.aws_region }} >/dev/null 2>&1; then echo "🚀 CDK not bootstrapped, bootstrapping now..." - npm run bootstrap + npx cdk bootstrap else echo "✅ CDK already bootstrapped, skipping..." fi - name: Synthesize CDK stacks - working-directory: ./infrastructure - run: npm run synth + run: npm run synth -w packages/infra - name: Deploy CDK stacks - working-directory: ./infrastructure - run: npm run deploy:all -- --require-approval never + run: npm run deploy:all -w packages/infra - name: Clean up sensitive files if: always() - working-directory: ./infrastructure run: | echo "🧹 Cleaning up sensitive files..." - rm -f .env - rm -rf cdk.out + rm -f packages/web/.env + rm -rf packages/web/dist + rm -rf packages/web/storybook-static + rm -f packages/infra/.env + rm -rf packages/infra/dist + rm -rf packages/infra/cdk.out + rm -rf packages/shared/dist echo "✅ Sensitive files cleaned up" From af4033fe1aa29a1263ef44aa463d6e52c2af67a2 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 14:42:57 -0400 Subject: [PATCH 09/17] fix: update CODEOWNERS for package structure --- .github/CODEOWNERS | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 25fd3c2c..3afe4d40 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,11 +5,17 @@ # Default owner for everything in the repository * @mwarman -# Infrastructure as Code (AWS CDK) -/infrastructure/ @mwarman - # GitHub configuration and workflows /.github/ @mwarman # Documentation /docs/ @mwarman + +# Infrastructure as Code +/packages/infra/ @mwarman + +# Shared Package +/packages/shared/ @mwarman + +# Frontend Package +/packages/web/ @mwarman \ No newline at end of file From dbfa85bc2a8bac109739972c8cbbb59e894f79f4 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 14:44:54 -0400 Subject: [PATCH 10/17] fix: update infrastructure test coverage command to use correct package path --- .github/workflows/code-quality.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index da8a0935..58c2136b 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -158,7 +158,7 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY echo "## Infrastructure Test Coverage Analysis" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - npm run test:coverage -w packages/infrastructure + npm run test:coverage -w packages/infra # Extract coverage summary if [ -f packages/infra/coverage/coverage-summary.json ]; then From 68702cc7e9ee225905661f64af2b56f15c37e8c0 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Wed, 12 Aug 2026 15:23:50 -0400 Subject: [PATCH 11/17] feat: add README files for shared and web packages with detailed documentation --- packages/infra/README.md | 8 +- packages/shared/README.md | 86 +++++++++++++++++++++ packages/web/README.md | 156 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 packages/shared/README.md create mode 100644 packages/web/README.md diff --git a/packages/infra/README.md b/packages/infra/README.md index 9b90d4d8..26ab566f 100644 --- a/packages/infra/README.md +++ b/packages/infra/README.md @@ -50,4 +50,10 @@ AWS CDK infrastructure for the React Starter application. ## Further Reading -See [../docs/infrastructure.md](../docs/infrastructure.md) for complete documentation. +See the [Infrastructure Guide](../../docs/INFRASTRUCTURE_GUIDE.md) for detailed infrastructure documentation. + +
+ +--- + +:point_left: Return to the main project [README](../../README.md). diff --git a/packages/shared/README.md b/packages/shared/README.md new file mode 100644 index 00000000..b75392de --- /dev/null +++ b/packages/shared/README.md @@ -0,0 +1,86 @@ +# @react-starter/shared + +Shared utilities, types, and components for the React Starter monorepo. + +## Overview + +This package provides the single source of truth for common structural interfaces, data models, Zod validation schemas, and reusable UI components used across all workspaces in the monorepo. + +## What's Included + +### Components (`src/components/`) + +- Reusable UI components, primarily based on `shadcn/ui` +- Atomic components that can be composed into feature-specific implementations +- **Note:** Do not modify component internals inside `shadcn/` subdirectory; create wrapper components instead + +### Models (`src/models/`) + +- TypeScript interfaces and types that define data structures +- Shared across frontend, infrastructure, and backend layers +- Examples: `Task.ts`, `User.ts`, `Settings.ts` + +### Schemas (`src/schemas/`) + +- Zod validation schemas for runtime data validation +- Ensures type safety at API boundaries and form inputs +- Examples: `TaskSchema.ts`, `UserSchema.ts` + +### Utils (`src/utils/`) + +- Pure utility functions and helpers +- Environment-agnostic (no browser or Node.js specific dependencies) +- Reusable across all workspaces + +## Usage + +### Importing from Shared + +Use workspace symlinks to import from this package in other workspaces: + +```typescript +// In packages/web or packages/infra +import { TaskSchema } from '@react-starter/shared'; +import { Button } from '@react-starter/shared'; +import { formatDate } from '@react-starter/shared'; +``` + +**Never use relative paths** to import from this package. + +## Development + +### Adding New Content + +1. **Models:** Define interfaces in `src/models/` using clear, descriptive names +2. **Schemas:** Create corresponding Zod schemas in `src/schemas/` for validation +3. **Components:** Add shadcn components or wrappers in `src/components/` +4. **Utils:** Place pure utility functions in `src/utils/` + +### Testing + +All exported code must have co-located unit tests: + +```bash +npm run test -w @react-starter/shared +``` + +### Code Standards + +- Use TypeScript strict mode +- No `any` types; prefer specific interfaces +- Include JSDoc comments for public exports +- Maintain 70%+ test coverage + +## Re-exporting Best Practices + +Use barrel files to re-export public APIs to simplify imports in consuming packages. + +```typescript +// ❌ Avoid +// Import directly in consuming packages +import { Task } from '@react-starter/shared/src/models/task'; + +// ✅ Preferred +// src/index.ts +export { Task } from './models/Task'; +``` diff --git a/packages/web/README.md b/packages/web/README.md new file mode 100644 index 00000000..ca329fa5 --- /dev/null +++ b/packages/web/README.md @@ -0,0 +1,156 @@ +# @react-starter/web + +React 19 frontend application built with Vite and TypeScript. + +## Overview + +This is the primary user-facing web application for the React Starter monorepo. It provides a modern, component-driven interface built with React 19, Vite for fast development, and Tailwind CSS for styling. + +## Quick Start + +### Development Server + +```bash +npm run dev -w @react-starter/web +``` + +The application starts at `http://localhost:5173` + +### Build for Production + +```bash +npm run build -w @react-starter/web +``` + +### Run Tests + +```bash +npm run test -w @react-starter/web +``` + +## Directory Structure + +### `src/common/` + +Shared application infrastructure: + +- **api/** - Global TanStack Query hooks for data fetching +- **components/** - App-wide UI components and layout components +- **hooks/** - Utility hooks like `useDebounce`, `useAuth`, `useSettings` +- **providers/** - Context providers for theme, auth, and other global state +- **utils/** - Axios instances, constants, and global helper functions + +### `src/pages/` + +Feature-organized page components: + +``` +pages/ + tasks/ # Feature group + create/ # Feature-scoped components + configure/ + delete/ + hooks/ # Feature-specific API hooks + utils/ # Feature-specific utilities +``` + +Each page feature is self-contained with its own components, hooks, and utilities. + +### `src/__fixtures__/` + +Mock data and test fixtures for development and testing. + +## Development Patterns + +### Component Structure + +- Write components as arrow functions with explicit typing +- Use default exports for page and UI components +- Include `data-testid` attributes or `testId` prop for testing + +```typescript +const MyComponent: React.FC = ({ children }) => { + return
{children}
; +}; + +export default MyComponent; +``` + +### Styling + +- Use Tailwind CSS classes for styling +- Apply theme variables via CSS in `src/index.css` +- Use `class-variance-authority` (CVA) in `src/common/utils/css.ts` for multi-variant components + +### State & Data Fetching + +- Use TanStack Query hooks from `src/common/api/` for global data fetching +- Use feature-scoped hooks in `src/pages/[feature]/hooks/` for local state +- Leverage React Context from `src/common/providers/` for app-wide state + +### Code Splitting + +- Use `React.lazy()` and `Suspense` for route-level code splitting +- Defined in routing configuration for optimal bundle optimization + +## Testing + +### Standards + +- Use Vitest as the test runner +- Use `@testing-library/react` for component testing +- Use `@testing-library/user-event` for user interactions +- Apply AAA (Arrange-Act-Assert) structure + +### Test Coverage + +Maintain 70%+ coverage across all code. Co-locate tests with source files: + +``` +MyComponent.tsx +MyComponent.test.tsx +useMyHook.ts +useMyHook.test.ts +``` + +### Test Setup + +Utilities and helpers for testing are in `src/test/`: + +- `query-client.ts` - Configured TanStack Query client for tests +- `test-utils.tsx` - Custom render functions and helpers +- `mocks/` - Mock data and API handlers +- `wrappers/` - Test wrapper components + +## File Naming Conventions + +| Type | Convention | Example | +| -------------------- | ------------------------ | ------------------- | +| React Components | PascalCase | `TaskCard.tsx` | +| React Hooks | camelCase | `useGetTasks.ts` | +| Utilities & Services | kebab-case | `date-utils.ts` | +| Test Files | Same as source + `.test` | `TaskCard.test.tsx` | + +## Best Practices + +1. **No Relative Cross-Package Imports:** Always use workspace symlinks + - ✅ `import { Task } from "@react-starter/shared"` + - ❌ `import { Task } from "../../../shared/src/models/task"` + +2. **Co-location:** Keep components, hooks, and utilities close to where they're used + +3. **Single Responsibility:** Each component and hook should have one clear purpose + +4. **Testability:** Always include `data-testid` or `testId` prop for reliable test selection + +5. **Environment Safety:** Keep browser-specific code (window, document) out of shared utilities + +## Build Output + +Production builds are optimized for performance: + +- Minified and tree-shaken bundles +- Lazy-loaded routes for faster initial load +- Environment-specific configuration via Vite + +Output is in the `dist/` directory. From 534ca036e47c0d4427267b082b63060b03e3c6bd Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Thu, 13 Aug 2026 06:08:47 -0400 Subject: [PATCH 12/17] fix: reorganize README to clarify monorepo structure and package details --- README.md | 140 ++++++++++++++++++++++++------------------------------ 1 file changed, 62 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 1108f8f2..bce00c06 100644 --- a/README.md +++ b/README.md @@ -15,49 +15,6 @@ This project is licensed under the MIT License - see [LICENSE](./LICENSE) file f For detailed guides and reference materials, see the [Project Documentation](docs/README.md). -## Monorepo Structure - -This project is organized as a **TypeScript monorepo** using npm workspaces, enabling modular development, shared type definitions, and coordinated deployments across frontend, backend, and infrastructure concerns. - -### Packages - -The monorepo consists of three primary packages: - -#### **`packages/web`** — React Frontend Application - -The client-side application built with React 19, TypeScript, and Vite. This package contains all UI components, pages, routing, state management, and API integration logic. It leverages the `shared` package for common types, schemas, and components. - -- **Technology:** React, Vite, React Router DOM, TanStack Query, Axios, React Hook Form, Tailwind CSS, shadcn/ui -- **Structure:** Organized by feature domains with co-located tests (`*.test.tsx`), hooks, and utilities -- **Key Responsibilities:** UI rendering, form handling, API client interactions, client-side routing, theme management - -#### **`packages/shared`** — Common Types, Schemas & Components - -A library package providing the single source of truth for data models, validation schemas, and reusable UI components. Both the frontend (`web`) and infrastructure (`infra`) packages depend on `shared` to ensure consistent type definitions across the application. - -- **Technology:** TypeScript, Zod, shadcn/ui -- **Structure:** Organized by concern: models (interfaces/types), schemas (Zod validators), components (UI library), utilities (pure functions) -- **Key Responsibilities:** Type definitions, schema validation, shared component library, utility functions - -#### **`packages/infra`** — AWS CDK Infrastructure as Code - -Infrastructure provisioning and deployment automation using AWS CDK. This package defines all cloud resources (CloudFront, S3, Route53, etc.) and handles environment-specific configurations. It does not execute application logic but references compiled frontend artifacts and shared configuration schemas. - -- **Technology:** AWS CDK, TypeScript, Zod -- **Structure:** Organized by AWS resource type with stacks and validation utilities -- **Key Responsibilities:** Infrastructure stack definitions, deployment automation, resource tagging, environment configuration - -### Workspace Dependencies - -``` -web ──→ shared -infra ──→ shared -``` - -The `web` and `infra` packages both depend on `shared` for common types and schemas, but maintain independence from each other. This architecture enables parallel development, independent testing, and clear separation of concerns across frontend and infrastructure concerns. - -See [AGENTS.md](./AGENTS.md) for comprehensive architectural guidelines, coding standards, and operational workflows across all packages. - ## Helpful Hints ### Viewing the Starter Kit @@ -169,7 +126,7 @@ When using the application, you may sign in with any of the JSON Placeholder [Us ### AI-Assisted Coding -- **GitHub Copilot instructions** (`copilot-instructions.md`) providing comprehensive guidance for agentic AI coding +- **Agentic coding instructions** are built in with the GitHub Copilot instructions file pointing to the industry standard `AGENTS.md` file housing all agentic coding instructions - **Project-specific coding standards** documented for AI assistants including TypeScript conventions, React patterns, and testing practices - **Architecture and file organization** guidance enabling AI agents to generate consistent, maintainable code - **Tool restrictions and best practices** defined for AI-assisted code generation, refactoring, and documentation @@ -217,7 +174,7 @@ The infrastructure technology stack includes: This repository uses [trunk-based development](https://www.atlassian.com/continuous-delivery/continuous-integration/trunk-based-development). The latest code is located on the `main` branch. The `main` branch is always ready for deployment. -Features are developed on branches named `feature/NNNNN-feature-name` or `NNNNN-feature-name` which are created from the `main` branch. The feature name used in the branch contains an issue identifier or a short name, e.g. `feature/123-do-something`. +Features are developed on branches named `feature/NNNNN-feature-name` or `NNNNN-feature-name` which are created from the `main` branch. The feature name used in the branch contains an issue identifier or a short name, e.g. `feature/123-do-something` or `123-do-something`. Releases are created on branches named `release/MM.mm.pp` which are created from the `main` branch. The release name follows the [semantic versioning](https://semver.org/) specification. @@ -237,6 +194,49 @@ The project includes configuration files for the [Prettier](https://prettier.io/ Adjust the configuration as desired. +## Monorepo Structure + +This project is organized as a **TypeScript monorepo** using npm workspaces, enabling modular development, shared type definitions, and coordinated deployments across frontend, backend, and infrastructure concerns. + +### Packages + +The monorepo consists of three primary packages: + +#### **`packages/web`** — React Frontend Application + +The client-side application built with React 19, TypeScript, and Vite. This package contains all UI components, pages, routing, state management, and API integration logic. It leverages the `shared` package for common types, schemas, and components. + +- **Technology:** React, Vite, React Router DOM, TanStack Query, Axios, React Hook Form, Tailwind CSS, shadcn/ui +- **Structure:** Organized by feature domains with co-located tests (`*.test.tsx`), hooks, and utilities +- **Key Responsibilities:** UI rendering, form handling, API client interactions, client-side routing, theme management + +#### **`packages/shared`** — Common Types, Schemas & Components + +A library package providing the single source of truth for data models, validation schemas, and reusable UI components. Both the frontend (`web`) and infrastructure (`infra`) packages depend on `shared` to ensure consistent type definitions across the application. + +- **Technology:** TypeScript, Zod, shadcn/ui +- **Structure:** Organized by concern: models (interfaces/types), schemas (Zod validators), components (UI library), utilities (pure functions) +- **Key Responsibilities:** Type definitions, schema validation, shared component library, utility functions + +#### **`packages/infra`** — AWS CDK Infrastructure as Code + +Infrastructure provisioning and deployment automation using AWS CDK. This package defines all cloud resources (CloudFront, S3, Route53, etc.) and handles environment-specific configurations. It does not execute application logic but references compiled frontend artifacts and shared configuration schemas. + +- **Technology:** AWS CDK, TypeScript, Zod +- **Structure:** Organized by AWS resource type with stacks and validation utilities +- **Key Responsibilities:** Infrastructure stack definitions, deployment automation, resource tagging, environment configuration + +### Workspace Dependencies + +``` +web ──→ shared +infra ──→ shared +``` + +The `web` and `infra` packages both depend on `shared` for common types and schemas, but maintain independence from each other. This architecture enables parallel development, independent testing, and clear separation of concerns across frontend and infrastructure concerns. + +See [AGENTS.md](./AGENTS.md) for comprehensive architectural guidelines, coding standards, and operational workflows across all packages. + ## Installation ### Prerequistes @@ -302,37 +302,6 @@ Many of the scripts leverage the [Vite CLI](https://vitejs.dev/guide/cli.html) o In the project base directory, the following commands are available to run. -### `npm run dev` - -Runs the app in the development mode. -Open [http://localhost:5173](http://localhost:5173) to view it in the browser. - -The page will reload when source files are saved. - -### `npm test` - -Executes the unit tests once. See the Vitest documentation about [running tests](https://vitest.dev/guide/cli.html) for more information. - -### `npm run test:coverage` - -Executes the unit tests once, producing a code coverage report. - -### `npm run test:watch` - -Launches the test runner in the interactive watch mode. - -### `npm run test:ci` - -Executes the test runner in `CI` mode and produces a coverage report. With `CI` mode enabled, the test runner executes all tests one time silently and prints a summary report to the console. A code coverage report is printed to the console immediately following the test summary. - -A detailed test coverage report is created in the `./coverage` directory. Additional report formats, for example a JSON summary report, are produced which may be injested by external reporting tools. - -> **NOTE:** This is the command which should be utilized by CI/CD platforms. - -### `npm run test:ui` - -Executes the tests and opens the [Vitest UI](https://vitest.dev/guide/ui) to view and interact with the unit tests. - ### `npm run build` Builds the app for production to the `dist` folder. @@ -356,11 +325,26 @@ Runs the eslint static code analysis and prints the results to the console. Runs the eslint static code analysis and updates source code to fix problems. -## `npm run storybook` +### `npm test` + +Executes the unit tests once. See the Vitest documentation about [running tests](https://vitest.dev/guide/cli.html) for more information. + +### `npm run test:coverage` + +Executes the unit tests once, producing a code coverage report. + +### `npm run dev -w packages/web` + +Runs the app in the development mode. +Open [http://localhost:5173](http://localhost:5173) to view it in the browser. + +The page will reload when source files are saved. + +## `npm run storybook -w packages/web` Starts the [Storybook][storybook] UI. Open [http://localhost:6006](http://localhost:6006) to view it in the browser. -## `npm run build:storybook` +## `npm run build:storybook -w packages/web` Build a static version the [Storybook][storybook] UI which may be deployed to a CDN or HTTP server. From eb660ec549d291a8170f1fb9c2ec92cb3c4597da Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Sat, 15 Aug 2026 05:44:41 -0400 Subject: [PATCH 13/17] updated config guide --- docs/CONFIGURATION_GUIDE.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/CONFIGURATION_GUIDE.md b/docs/CONFIGURATION_GUIDE.md index 5189d462..294f843c 100644 --- a/docs/CONFIGURATION_GUIDE.md +++ b/docs/CONFIGURATION_GUIDE.md @@ -79,7 +79,7 @@ const envCode = config.VITE_BUILD_ENV_CODE; - **Single Source of Truth**: Configuration is centralized and consistently accessed throughout the application **Configuration Schema Location:** -The Zod schema that validates all environment variables is defined in [src/common/utils/config.ts](../src/common/utils/config.ts). This file also exports the `Config` type for use in type annotations when needed. +The Zod schema that validates all environment variables is defined in [packages/web/src/common/utils/config.ts](../packages/web/src/common/utils/config.ts). This file also exports the `Config` type for use in type annotations when needed. ### Local Development @@ -175,12 +175,12 @@ The following environment variables are available for configuring the infrastruc | `CDK_REGION` | string | AWS region for deployment (e.g., `us-east-1`) | Auto-detected from AWS CLI | No | | `CDK_OU` | string | Organizational Unit for resource tagging | `unknown` | No | | `CDK_OWNER` | string | Owner tag for resource tracking | `unknown` | No | -| `CDK_ASSET_PATH` | string | Path to application build artifacts (relative to infrastructure directory) | `../dist` | No | +| `CDK_ASSET_PATH` | string | Path to application build artifacts (relative to packages/infra directory) | `../web/dist` | No | | `CDK_DOMAIN_NAME` | string | Custom domain name for the application CDN (e.g., `app.example.com`) | - | No | | `CDK_CERTIFICATE_ARN` | string | ACM certificate ARN for custom domain (must be in `us-east-1` for CloudFront) | - | No | | `CDK_HOSTED_ZONE_ID` | string | Route53 hosted zone ID for DNS records | - | No | | `CDK_HOSTED_ZONE_NAME` | string | Route53 hosted zone name (e.g., `example.com`) | - | No | -| `CDK_STORYBOOK_ASSET_PATH` | string | Path to Storybook build artifacts (relative to infrastructure directory) | `../storybook-static` | No | +| `CDK_STORYBOOK_ASSET_PATH` | string | Path to Storybook build artifacts (relative to packages/infra directory) | `../web/storybook-static` | No | | `CDK_STORYBOOK_DOMAIN_NAME` | string | Custom domain name for Storybook CDN | - | No | | `CDK_STORYBOOK_CERTIFICATE_ARN` | string | ACM certificate ARN for Storybook custom domain | - | No | | `CDK_STORYBOOK_HOSTED_ZONE_ID` | string | Route53 hosted zone ID for Storybook DNS records | - | No | @@ -188,10 +188,10 @@ The following environment variables are available for configuring the infrastruc ### Setup -1. **Navigate to the infrastructure directory:** +1. **Navigate to the infrastructure package directory:** ```bash - cd infrastructure + cd packages/infra ``` 2. **Copy the example configuration file:** @@ -212,7 +212,7 @@ The following environment variables are available for configuring the infrastruc ### Usage -Infrastructure configuration is loaded and validated through the `getConfig()` function in `infrastructure/utils/config.ts`: +Infrastructure configuration is loaded and validated through the `getConfig()` function in [packages/infra/src/utils/config.ts](../packages/infra/src/utils/config.ts): ```typescript import { getConfig, getTags, getEnvironmentConfig } from './utils/config'; @@ -231,7 +231,7 @@ console.log(`Tags:`, tags); Infrastructure configuration can be provided through: 1. **Environment variables** - Set directly in your shell or CI/CD pipeline (highest priority) -2. **.env file** - Create a `.env` file in the `infrastructure/` directory for local development +2. **.env file** - Create a `.env` file in the `packages/infra/` directory for local development 3. **Default values** - Specified in the Zod schema (lowest priority) ### Resource Tagging @@ -251,7 +251,7 @@ These tags are used for cost allocation, resource management, and identifying re #### Development Environment -Create `infrastructure/.env` for development deployment: +Create `packages/infra/.env` for development deployment: ```env ############################################### @@ -268,14 +268,14 @@ CDK_OU=software-engineering CDK_OWNER=frontend-team ### CDN Configuration ### -CDK_ASSET_PATH=../dist +CDK_ASSET_PATH=../web/dist CDK_DOMAIN_NAME=react-starter.dev.example.com CDK_CERTIFICATE_ARN=arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CDK_HOSTED_ZONE_ID=Z1234567890ABC CDK_HOSTED_ZONE_NAME=dev.example.com ### Storybook CDN Configuration ### -CDK_STORYBOOK_ASSET_PATH=../storybook-static +CDK_STORYBOOK_ASSET_PATH=../web/storybook-static CDK_STORYBOOK_DOMAIN_NAME=react-starter-storybook.dev.example.com CDK_STORYBOOK_CERTIFICATE_ARN=arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CDK_STORYBOOK_HOSTED_ZONE_ID=Z1234567890ABC @@ -297,13 +297,13 @@ CDK_REGION=us-east-1 CDK_OU=software-engineering CDK_OWNER=frontend-team -CDK_ASSET_PATH=../dist +CDK_ASSET_PATH=../web/dist CDK_DOMAIN_NAME=react-starter.qa.example.com CDK_CERTIFICATE_ARN=arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CDK_HOSTED_ZONE_ID=Z1234567890ABC CDK_HOSTED_ZONE_NAME=qa.example.com -CDK_STORYBOOK_ASSET_PATH=../storybook-static +CDK_STORYBOOK_ASSET_PATH=../web/storybook-static CDK_STORYBOOK_DOMAIN_NAME=react-starter-storybook.qa.example.com CDK_STORYBOOK_CERTIFICATE_ARN=arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CDK_STORYBOOK_HOSTED_ZONE_ID=Z1234567890ABC @@ -325,13 +325,13 @@ CDK_REGION=us-east-1 CDK_OU=software-engineering CDK_OWNER=frontend-team -CDK_ASSET_PATH=../dist +CDK_ASSET_PATH=../web/dist CDK_DOMAIN_NAME=react-starter.example.com CDK_CERTIFICATE_ARN=arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CDK_HOSTED_ZONE_ID=Z1234567890ABC CDK_HOSTED_ZONE_NAME=example.com -CDK_STORYBOOK_ASSET_PATH=../storybook-static +CDK_STORYBOOK_ASSET_PATH=../web/storybook-static CDK_STORYBOOK_DOMAIN_NAME=react-starter-storybook.example.com CDK_STORYBOOK_CERTIFICATE_ARN=arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx CDK_STORYBOOK_HOSTED_ZONE_ID=Z1234567890ABC From 549b5c1f9521f824e5010c6323b0c18b3c2d90a1 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Sat, 15 Aug 2026 05:50:11 -0400 Subject: [PATCH 14/17] fix: update DevOps guide to clarify monorepo structure and workflows --- docs/DEVOPS_GUIDE.md | 147 ++++++++++++++++++++++--------------------- 1 file changed, 76 insertions(+), 71 deletions(-) diff --git a/docs/DEVOPS_GUIDE.md b/docs/DEVOPS_GUIDE.md index 724c20d5..623e7420 100644 --- a/docs/DEVOPS_GUIDE.md +++ b/docs/DEVOPS_GUIDE.md @@ -1,20 +1,29 @@ # DevOps Guide -Welcome to the DevOps guide for the React Starter project. This document is designed to help engineers understand the DevOps practices, tools, and workflows used in this React frontend repository. +Welcome to the DevOps guide for the React Starter project. This document is designed to help engineers understand the DevOps practices, tools, and workflows used in this TypeScript monorepo. ## Overview -DevOps in this project focuses on automation, reliability, and maintainability. The main goals are to ensure code quality, automate testing, validate infrastructure as code, and streamline deployment processes to AWS. +DevOps in this project focuses on automation, reliability, and maintainability across a **monorepo structure** containing multiple workspaces. The main goals are to ensure code quality, automate testing across all packages, validate infrastructure as code, and streamline deployment processes to AWS. All workflows are designed to work seamlessly with the monorepo's workspace architecture. + +### Monorepo Structure + +The project uses a monorepo with the following workspaces: + +- **`packages/web`** - Frontend React application built with Vite +- **`packages/infra`** - AWS CDK infrastructure as code +- **`packages/shared`** - Shared utilities, types, and components used across workspaces ## DevOps Tools Used ### GitHub Actions -- **Purpose:** Automates CI/CD workflows, including running tests, building the project, validating infrastructure code, and deploying to AWS. +- **Purpose:** Automates CI/CD workflows, including running tests across all workspaces, building the project, validating infrastructure as code, and deploying to AWS. - **Location:** All workflow files are stored in the `.github/workflows/` directory. +- **Monorepo Integration:** All workflows use workspace-scoped npm commands (with `-w` flag) to run tasks in specific packages and maintain workspace isolation. - **Key Workflows:** - - **CI (Continuous Integration):** Validates pull requests by linting, formatting, building, and testing both the application and infrastructure code. - - **Code Quality:** Performs automated code quality checks, test coverage analysis, security audits, and dependency analysis on a schedule and on push to main. + - **CI (Continuous Integration):** Validates pull requests by linting, formatting, building, and testing all packages (web and infrastructure). + - **Code Quality:** Performs automated code quality checks, test coverage analysis (per-package), security audits, and dependency analysis on a schedule and on push to main. - **Deploy to DEV:** Automatically deploys the application to the development environment on every push to main. - **Deploy to QA:** Deploys the application to the QA environment when pushing to release branches. - **Deploy to PROD:** Deploys the application to production when publishing GitHub releases. @@ -25,7 +34,7 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea ### Continuous Integration Workflow (`ci.yml`) -- **Purpose:** Validates every pull request to the `main` branch by linting, formatting, building, and testing both the application and infrastructure code. +- **Purpose:** Validates every pull request to the `main` branch by linting, formatting, building, and testing all packages (web and infrastructure). - **Triggers:** - On pull requests targeting the `main` branch - Manual: Via GitHub Actions UI (`workflow_dispatch`) @@ -41,55 +50,49 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea - **Main Steps:** 1. Checkout repository 2. Setup Node.js (from `.nvmrc`, with npm cache) - 3. Install dependencies (`npm ci`) - 4. Create application `.env` file from variables (`ENV_CI`) - 5. Lint code (`npm run lint`) - 6. Check code formatting (`npm run format:check`) - 7. Build application (`npm run build`) - 8. Run unit tests with CI mode (`npm run test:ci`) - 9. Build Storybook (`npm run build:storybook`) - 10. Install and build infrastructure code - 11. Create infrastructure `.env` file from variables (`CDK_ENV_DEV`) - 12. Configure AWS credentials using OIDC (role: `AWS_ROLE_ARN_DEV`) - 13. Synthesize CDK stacks (`npm run synth`) - 14. Clean up sensitive files (`.env`, `cdk.out`) + 3. Install dependencies (`npm ci` - installs for all workspaces) + 4. Create web package `.env` file in `packages/web/` from variables (`ENV_CI`) + 5. Create infra package `.env` file in `packages/infra/` from variables (`CDK_ENV_DEV`) + 6. Lint code across all workspaces (`npm run lint`) + 7. Check code formatting (`npm run format:check`) + 8. Build application (`npm run build` - builds all packages) + 9. Run unit tests with coverage across all packages (`npm run test:coverage`) + 10. Build Storybook for web package (`npm run build:storybook -w packages/web`) + 11. Configure AWS credentials using OIDC (role: `AWS_ROLE_ARN_DEV`) + 12. Synthesize CDK stacks for infra package (`npm run synth -w packages/infra`) + 13. Clean up sensitive files (`.env` in `packages/web/` and `packages/infra/`, build artifacts) - **Importance:** Ensures that all code merged into `main` passes linting, formatting, builds successfully, is covered by tests, and that the AWS CDK infrastructure code is valid and synthesizes correctly. This prevents broken or low-quality code from being merged and keeps the main branch stable. ### Code Quality Workflow (`code-quality.yml`) -- **Purpose:** Automates comprehensive code quality checks, test coverage analysis, security audits, and dependency analysis for both the application and infrastructure. +- **Purpose:** Automates comprehensive code quality checks, test coverage analysis (per-package), security audits, and dependency analysis across all workspaces. - **Triggers:** - - Scheduled: Every Sunday at 2 AM UTC + - Scheduled: Every Sunday at 5 AM UTC - Manual: Via GitHub Actions UI (`workflow_dispatch`) - - On push to `main` branch (if source files or workflow files change) + - On push to `main` branch (if source files, package.json, or workflow files change) - **Timeout:** 10 minutes - **Main Steps:** - 1. **Application Quality Checks:** - - Checkout repository (full history) - - Setup Node.js (from `.nvmrc`, with npm cache) - - Install dependencies - - Create application `.env` file from secrets - - Run ESLint with output summary - - Check code formatting with Prettier - - Run tests with coverage and output summary table - - Build check - - Security audit (`npm audit` for moderate vulnerabilities) - - Package analysis (`npm outdated`) - 2. **Infrastructure Quality Checks:** - - Install infrastructure dependencies - - Run infrastructure tests with coverage and output summary - - Infrastructure build check - - Infrastructure security audit - - Infrastructure package analysis - 3. **Artifact Archival:** - - Upload test results, coverage reports, and analysis outputs as artifacts - - Retention: 7 days -- **Output Format:** All results are summarized in the GitHub Actions step summary for easy review in the UI -- **Importance:** Maintains code quality, security posture, and up-to-date dependencies. Provides visibility into test coverage and build health. Acts as an early detection system for quality issues, security vulnerabilities, and outdated packages. + 1. Checkout repository (with full history for better analysis) + 2. Setup Node.js (from `.nvmrc`, with npm cache) + 3. Install dependencies for all workspaces (`npm ci`) + 4. Create web package `.env` file in `packages/web/` from variables (`ENV_CI`) + 5. Create infra package `.env` file in `packages/infra/` from variables (`CDK_ENV_DEV`) + 6. Run ESLint across all workspaces with detailed output summary + 7. Check code formatting with Prettier + 8. Build check across all packages + 9. Security audit (`npm audit` for moderate vulnerabilities) + 10. Package analysis (`npm outdated`) + 11. Run web tests with coverage (`npm run test:coverage -w packages/web`) + 12. Generate web coverage summary table from `packages/web/coverage/coverage-summary.json` + 13. Run infrastructure tests with coverage (`npm run test:coverage -w packages/infra`) + 14. Generate infrastructure coverage summary table from `packages/infra/coverage/coverage-summary.json` + 15. Archive test results and analysis outputs as artifacts (retention: 7 days) +- **Output Format:** All results are summarized in the GitHub Actions step summary for easy review in the UI, including per-package coverage tables +- **Importance:** Maintains code quality, security posture, and up-to-date dependencies across all workspaces. Provides visibility into test coverage and build health for each package. Acts as an early detection system for quality issues, security vulnerabilities, and outdated packages. ### Deploy to DEV Workflow (`deploy-dev.yml`) -- **Purpose:** Automatically builds and deploys the application to the development environment on AWS with full infrastructure provisioning. +- **Purpose:** Automatically builds and deploys all packages (web and infrastructure) to the development environment on AWS with full infrastructure provisioning. - **Triggers:** - On push to the `main` branch - On push of the `dev` tag @@ -102,12 +105,12 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea - `AWS_REGION` - AWS region for deployment (default: `us-east-1`) - `ENV_DEV` - Application environment variables - `CDK_ENV_DEV` - CDK infrastructure environment configuration -- **Execution:** Calls the reusable `Deploy` workflow +- **Execution:** Calls the reusable `deploy-reusable.yml` workflow with environment-specific configuration - **Importance:** Enables rapid deployment of latest changes to development environment for testing and validation. Ensures infrastructure-as-code is always in sync with application deployments. ### Deploy to QA Workflow (`deploy-qa.yml`) -- **Purpose:** Deploys the application to the QA environment on AWS for testing and quality assurance. +- **Purpose:** Deploys all packages (web and infrastructure) to the QA environment on AWS for testing and quality assurance. - **Triggers:** - On push to `release/*` branches - On push of the `qa` tag @@ -119,12 +122,12 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea - `AWS_REGION` - AWS region for deployment - `ENV_QA` - Application environment variables - `CDK_ENV_QA` - CDK infrastructure environment configuration -- **Execution:** Calls the reusable `Deploy` workflow +- **Execution:** Calls the reusable `deploy-reusable.yml` workflow with environment-specific configuration - **Importance:** Allows testing of release branches in a QA environment before deploying to production. ### Deploy to PROD Workflow (`deploy-prod.yml`) -- **Purpose:** Deploys the application to the production environment on AWS when releasing to production. +- **Purpose:** Deploys all packages (web and infrastructure) to the production environment on AWS when releasing to production. - **Triggers:** - On GitHub release publication - On push of the `prod` tag @@ -136,15 +139,15 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea - `AWS_REGION` - AWS region for deployment - `ENV_PROD` - Application environment variables - `CDK_ENV_PROD` - CDK infrastructure environment configuration -- **Execution:** Calls the reusable `Deploy` workflow +- **Execution:** Calls the reusable `deploy-reusable.yml` workflow with environment-specific configuration - **Importance:** Ensures controlled, traceable deployments to production. Using GitHub releases provides a clear release history and version tracking. -### Reusable Deploy Workflow (`reusable-deploy.yml`) +### Reusable Deploy Workflow (`deploy-reusable.yml`) -- **Purpose:** Reusable workflow that handles the complete deployment process for any environment. Centralizes deployment logic used by all environment-specific workflows. +- **Purpose:** Reusable workflow that handles the complete deployment process for any environment. Centralizes deployment logic used by all environment-specific workflows (`deploy-dev.yml`, `deploy-qa.yml`, `deploy-prod.yml`). - **Triggers:** - - Called by other workflows (`deploy-dev.yml`, `deploy-qa.yml`, `deploy-prod.yml`) -- **Inputs:** + - Called by other workflows via `workflow_call` +- **Inputs (from calling workflow):** - `aws_role_arn` - AWS IAM role ARN for the target environment (required) - `aws_region` - AWS region for deployment (default: `us-east-1`) - `env` - Environment name (dev, qa, prod; default: `dev`) @@ -157,25 +160,25 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea - **Main Steps:** 1. Checkout repository 2. Setup Node.js (from `.nvmrc`, with npm cache) - 3. Install application dependencies - 4. Create application `.env` file with: - - Environment variables from secrets - - Build metadata: date, time, commit SHA + 3. Install dependencies for all workspaces (`npm ci`) + 4. Create web package `.env` file in `packages/web/` with: + - Environment variables from input + - Build metadata: date (UTC), time (UTC), commit SHA - Environment code and workflow information - 5. Build the application (`npm run build`) - 6. Build Storybook (`npm run build:storybook`) - 7. Configure AWS credentials using OIDC (no long-lived credentials) - 8. Install infrastructure dependencies - 9. Create infrastructure `.env` file - 10. Build infrastructure code - 11. Bootstrap CDK (checks if already bootstrapped, skips if so) - 12. Synthesize CDK CloudFormation templates - 13. Deploy CDK stacks (`npm run deploy:all` with auto-approval) - 14. Clean up sensitive files (`.env`, `cdk.out`) + 5. Create infrastructure `.env` file in `packages/infra/` with environment variables + 6. Build all packages (`npm run build`) + 7. Build Storybook for web package (`npm run build:storybook -w packages/web`) + 8. Configure AWS credentials using OIDC (no long-lived credentials) + 9. Bootstrap CDK (checks if CDKToolkit stack exists, skips if already bootstrapped): + - Attempts to describe CDKToolkit CloudFormation stack + - Runs `npx cdk bootstrap` only if not already bootstrapped + 10. Synthesize CDK stacks for infra package (`npm run synth -w packages/infra`) + 11. Deploy CDK stacks for infra package (`npm run deploy:all -w packages/infra` with auto-approval) + 12. Clean up sensitive files (`.env` files and build artifacts in all packages) - **Build Metadata:** The following environment variables are injected at build time (accessible in the React app as `import.meta.env.*`): - - `VITE_BUILD_DATE` - Build date (YYYY-MM-DD) - - `VITE_BUILD_TIME` - Build time (HH:MM:SS±HHMM) - - `VITE_BUILD_TS` - Full build timestamp + - `VITE_BUILD_DATE` - Build date (UTC, format: YYYY-MM-DD) + - `VITE_BUILD_TIME` - Build time (UTC, format: HH:MM:SS) + - `VITE_BUILD_TS` - Full build timestamp (UTC, ISO format) - `VITE_BUILD_COMMIT_SHA` - Git commit SHA - `VITE_BUILD_ENV_CODE` - Environment code (dev/qa/prod) - `VITE_BUILD_WORKFLOW_NAME` - GitHub workflow name @@ -185,7 +188,9 @@ The project uses GitHub Actions for CI/CD. Below is a detailed description of ea - Uses OIDC for AWS authentication (no long-lived credentials stored) - Automatic cleanup of sensitive files after deployment - Proper IAM role assumption with session naming -- **Importance:** Provides a consistent, repeatable deployment process across all environments. Includes comprehensive build metadata for debugging and version tracking in deployed applications. + - Bootstrap check prevents unnecessary re-bootstrapping +- **Monorepo Integration:** All build and deploy commands use workspace-scoped flags (`-w packages/infra`, `-w packages/web`) to target specific packages and maintain workspace isolation. +- **Importance:** Provides a consistent, repeatable deployment process across all environments. Centralizes deployment logic to eliminate duplication between environment-specific workflows. Includes comprehensive build metadata for debugging and version tracking in deployed applications. ## Environment Configuration From 840f30c8e7e0b57f8e19436933f75d3eabc99070 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Sat, 15 Aug 2026 05:54:28 -0400 Subject: [PATCH 15/17] docs: enhance infrastructure guide with monorepo context and detailed package structure --- docs/INFRASTRUCTURE_GUIDE.md | 146 +++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 41 deletions(-) diff --git a/docs/INFRASTRUCTURE_GUIDE.md b/docs/INFRASTRUCTURE_GUIDE.md index d19dcb5b..80bca426 100644 --- a/docs/INFRASTRUCTURE_GUIDE.md +++ b/docs/INFRASTRUCTURE_GUIDE.md @@ -3,18 +3,21 @@ This guide provides a comprehensive overview of the AWS infrastructure for the React Starter frontend application, including architectural decisions, deployment instructions, and operational considerations. > **Note:** This infrastructure provisions only frontend/presentation tier components. Resources are used for hosting static React assets via a Content Delivery Network (CDN) for optimal performance and scalability. +> +> **Monorepo Context:** This React Starter project uses an npm workspaces monorepo with separate `packages/infra`, `packages/web`, and `packages/shared` directories. Commands and paths in this guide reflect this structure. ## Table of Contents 1. [Architecture Overview](#architecture-overview) 2. [Infrastructure Components](#infrastructure-components) -3. [Deployment Process](#deployment-process) -4. [Environment Management](#environment-management) -5. [Security Model](#security-model) -6. [Cost Optimization](#cost-optimization) -7. [Monitoring and Observability](#monitoring-and-observability) -8. [Troubleshooting](#troubleshooting) -9. [Best Practices](#best-practices) +3. [Monorepo Architecture](#monorepo-architecture) +4. [Deployment Process](#deployment-process) +5. [Environment Management](#environment-management) +6. [Security Model](#security-model) +7. [Cost Optimization](#cost-optimization) +8. [Monitoring and Observability](#monitoring-and-observability) +9. [Troubleshooting](#troubleshooting) +10. [Best Practices](#best-practices) ## Architecture Overview @@ -147,7 +150,8 @@ CDK_STORYBOOK_HOSTED_ZONE_NAME=example.com 3. **Local Environment**: - Node.js (version specified in `.nvmrc`) - AWS CDK CLI installed globally: `npm install -g aws-cdk` - - Vite build output available at `../dist` (relative to infrastructure/) + - Monorepo dependencies installed: `npm install` (from project root) + - Vite build output available at `packages/web/dist` (relative to project root) ### Step-by-Step Deployment @@ -158,33 +162,38 @@ CDK_STORYBOOK_HOSTED_ZONE_NAME=example.com npm run build ``` - This generates optimized static assets in the `dist` directory. + This generates optimized static assets in the `packages/web/dist` directory. 2. **Configure Infrastructure**: ```bash - cd infrastructure + cd packages/infra cp .env.example .env # Edit .env with your AWS account, region, and domain configuration ``` -3. **Install Infrastructure Dependencies**: +3. **Install Dependencies** (if not already done): ```bash + # From the project root (if dependencies not yet installed) npm install ``` + This installs dependencies for all workspace packages, including the infrastructure package. + 4. **Verify Configuration**: ```bash + # From packages/infra directory npm run synth ``` - This generates CloudFormation templates without deploying. Review the synthesized templates in `cdk.out/`. + This generates CloudFormation templates without deploying. Review the synthesized templates in `packages/infra/cdk.out/`. 5. **Deploy Infrastructure** (with confirmation): ```bash + # From packages/infra directory npm run deploy ``` @@ -222,6 +231,54 @@ CDK automatically manages dependencies, but understand the logical order: - Independent deployment with same structure as UI CDN - Can be created/updated/deleted separately +## Monorepo Architecture + +The React Starter project uses an npm workspaces monorepo structure with three integrated packages: + +### Workspace Packages + +1. **`packages/infra`** - AWS CDK Infrastructure as Code + - Defines and deploys CloudFront + S3 CDN infrastructure + - Configuration via environment variables in `.env` + - Contains build configuration for AWS CDK stacks + - Commands run from this directory for CDK operations + +2. **`packages/web`** - React 19 Frontend Application + - Main React application built with Vite + - Generates optimized build output to `dist/` directory + - Referenced by infrastructure via `CDK_ASSET_PATH` configuration + - Local development via `npm run dev -w @react-starter/web` + +3. **`packages/shared`** - Shared Utilities, Types, and Schemas + - Common TypeScript interfaces and data models + - Zod validation schemas for data consistency + - Reusable UI components + - Shared across web and infrastructure packages + +### Working Directory Context + +- **Root Commands**: Run from project root for monorepo-wide operations + - `npm run build` - Builds all packages including web and infrastructure + - `npm run test --workspaces` - Runs tests across all packages + - `npm run lint` - Lints entire monorepo + +- **Infrastructure Commands**: Run from `packages/infra` directory for CDK operations + - `npm run synth` - Synthesize CloudFormation templates + - `npm run deploy` - Deploy infrastructure stacks + - `npm run diff` - Show CDK changes before deployment + +- **Workspace-Scoped Commands**: Use `-w` flag from root + - `npm run build -w @react-starter/web` - Build only the web package + - `npm run dev -w @react-starter/web` - Start development server + - `npm run deploy -w @react-starter/infra` - Deploy infrastructure + +### Dependency Management + +- Root `package.json` defines workspaces and hoisted dependencies +- Each package has its own `package.json` with specific dependencies +- Cross-package imports use npm workspace symlinks (e.g., `import { TaskSchema } from "@react-starter/shared"`) +- Install dependencies once at project root: `npm install` + ## Resource Configuration ### Performance Considerations @@ -247,26 +304,26 @@ All configuration uses environment variables prefixed with `CDK_`: #### Application CDN Variables -| Variable | Purpose | Default | Required | -| ---------------------- | -------------------- | --------------- | -------- | -| `CDK_APP_NAME` | Application name | `react-starter` | No | -| `CDK_ASSET_PATH` | Path to build output | `../dist` | Yes | -| `CDK_DOMAIN_NAME` | Custom domain | - | No | -| `CDK_CERTIFICATE_ARN` | SSL certificate ARN | - | No\* | -| `CDK_HOSTED_ZONE_ID` | Route 53 zone ID | - | No\* | -| `CDK_HOSTED_ZONE_NAME` | Route 53 zone name | - | No\* | +| Variable | Purpose | Default | Required | +| ---------------------- | ------------------------ | ---------------------- | -------- | +| `CDK_APP_NAME` | Application name | `react-starter` | No | +| `CDK_ASSET_PATH` | Path to web build output | `../packages/web/dist` | Yes | +| `CDK_DOMAIN_NAME` | Custom domain | - | No | +| `CDK_CERTIFICATE_ARN` | SSL certificate ARN | - | No\* | +| `CDK_HOSTED_ZONE_ID` | Route 53 zone ID | - | No\* | +| `CDK_HOSTED_ZONE_NAME` | Route 53 zone name | - | No\* | **Note:** `CDK_CERTIFICATE_ARN`, `CDK_HOSTED_ZONE_ID`, and `CDK_HOSTED_ZONE_NAME` are required only if using `CDK_DOMAIN_NAME`. #### Storybook CDN Variables (Optional) -| Variable | Purpose | Default | Required | -| -------------------------------- | ---------------------- | --------------------- | -------- | -| `CDK_STORYBOOK_ASSET_PATH` | Storybook build output | `../storybook-static` | No | -| `CDK_STORYBOOK_DOMAIN_NAME` | Custom domain | - | No | -| `CDK_STORYBOOK_CERTIFICATE_ARN` | SSL certificate ARN | - | No\* | -| `CDK_STORYBOOK_HOSTED_ZONE_ID` | Route 53 zone ID | - | No\* | -| `CDK_STORYBOOK_HOSTED_ZONE_NAME` | Route 53 zone name | - | No\* | +| Variable | Purpose | Default | Required | +| -------------------------------- | ---------------------- | ---------------------------------- | -------- | +| `CDK_STORYBOOK_ASSET_PATH` | Storybook build output | `../packages/web/storybook-static` | No | +| `CDK_STORYBOOK_DOMAIN_NAME` | Custom domain | - | No | +| `CDK_STORYBOOK_CERTIFICATE_ARN` | SSL certificate ARN | - | No\* | +| `CDK_STORYBOOK_HOSTED_ZONE_ID` | Route 53 zone ID | - | No\* | +| `CDK_STORYBOOK_HOSTED_ZONE_NAME` | Route 53 zone name | - | No\* | **Note:** If `CDK_STORYBOOK_ASSET_PATH` is provided, separate stacks are created for Storybook CDN. @@ -281,7 +338,7 @@ All configuration uses environment variables prefixed with `CDK_`: Each environment uses: -- Separate `.env` files (recommended) +- Separate `.env` files (recommended) in `packages/infra` - Environment-specific stack names: `${appName}-ui-cdn-${env}` - Environment-specific asset deployment - Independent CloudFront cache invalidations @@ -289,6 +346,7 @@ Each environment uses: Example deployment: ```bash +# From packages/infra directory # Development CDK_ENV=dev npm run deploy @@ -430,14 +488,14 @@ Set up alerts for: 1. **Rollback to Previous Version**: ```bash - # Checkout previous build artifacts + # Checkout previous build artifacts from git history git checkout - # Rebuild if needed - npm run build + # Rebuild the web application + npm run build -w @react-starter/web - # Redeploy - npm run deploy + # Redeploy from packages/infra + cd packages/infra && npm run deploy ``` 2. **CloudFront Cache Invalidation**: @@ -510,8 +568,8 @@ aws cloudfront get-invalidation \ # Verify S3 bucket contents aws s3 ls s3:/// --recursive -# Check CDK synthesis without deploying -npm run synth +# Check CDK synthesis without deploying (from packages/infra) +cd packages/infra && npm run synth # View CloudFormation events aws cloudformation describe-stack-events \ @@ -520,25 +578,30 @@ aws cloudformation describe-stack-events \ # Test CloudFront distribution directly curl -I https:///index.html + +# Build just the web package from root +npm run build -w @react-starter/web ``` ## Best Practices ### Configuration Management -1. **Environment Separation**: Use `.env.dev`, `.env.qa`, `.env.prd` -2. **Build Output**: Always build (`npm run build`) before deployment +1. **Environment Separation**: Use separate `.env` files in `packages/infra` (e.g., `.env.dev`, `.env.qa`, `.env.prd`) +2. **Build Output**: Always build from project root using `npm run build` before deployment 3. **Asset Cleanup**: Use appropriate `removalPolicy` per environment -4. **Version Control**: Keep `.env.example` updated, never commit `.env` +4. **Version Control**: Keep `.env.example` in `packages/infra` updated, never commit `.env` files 5. **Configuration Validation**: Test configuration in development first +6. **Working Directory**: Run CDK commands from `packages/infra` directory ### Development Workflow -1. **Local Development**: Use local Vite dev server, not CloudFront -2. **Build Locally**: Verify `dist/` output before deployment +1. **Local Development**: Use `npm run dev -w @react-starter/web` for local Vite dev server, not CloudFront +2. **Build Locally**: Verify `packages/web/dist` output before deployment using `npm run build` 3. **Staging Verification**: Deploy to staging environment first 4. **Progressive Rollout**: Deploy to production after staging validation 5. **Infrastructure as Code**: Always use CDK, never manual AWS changes +6. **Monorepo Commands**: Use workspace-aware npm commands from project root ### Security Best Practices @@ -573,10 +636,11 @@ curl -I https:///index.html ### Operational Best Practices 1. **Documentation**: Keep infrastructure changes documented -2. **Change Management**: Review CDK diffs before deployment +2. **Change Management**: Review CDK diffs before deployment using `npm run diff -w @react-starter/infra` 3. **Release Management**: Use git tags for release tracking 4. **Cost Monitoring**: Review CloudFront costs monthly 5. **Disaster Recovery**: Test rollback procedures regularly +6. **Monorepo Awareness**: Understand how infrastructure changes may impact the shared and web packages ### Code Organization From 94ca12e14f6fe0b0c3ca65f923eb606fd11a6c31 Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Sat, 15 Aug 2026 06:10:48 -0400 Subject: [PATCH 16/17] fix: README heading levels --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bce00c06..21ab89c6 100644 --- a/README.md +++ b/README.md @@ -340,11 +340,11 @@ Open [http://localhost:5173](http://localhost:5173) to view it in the browser. The page will reload when source files are saved. -## `npm run storybook -w packages/web` +### `npm run storybook -w packages/web` Starts the [Storybook][storybook] UI. Open [http://localhost:6006](http://localhost:6006) to view it in the browser. -## `npm run build:storybook -w packages/web` +### `npm run build:storybook -w packages/web` Build a static version the [Storybook][storybook] UI which may be deployed to a CDN or HTTP server. From f683ca0ef7511cba87695c34dbe311e4e1d46c2a Mon Sep 17 00:00:00 2001 From: Matthew Warman Date: Sat, 15 Aug 2026 06:22:38 -0400 Subject: [PATCH 17/17] fix: correct token format in useGetUserTokens test --- packages/web/src/common/api/useGetUserTokens.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/common/api/useGetUserTokens.test.ts b/packages/web/src/common/api/useGetUserTokens.test.ts index a7722fe4..396c1097 100644 --- a/packages/web/src/common/api/useGetUserTokens.test.ts +++ b/packages/web/src/common/api/useGetUserTokens.test.ts @@ -37,7 +37,7 @@ describe('useGetTokens', () => { ...userTokensFixture, expires_at: dayjs('2024-01-01').toISOString(), }; - getItemSpy.mockReturnValue(JSON.stringify(token)); + getItemSpy.mockReturnValue(token); // use a specific wrapper to avoid test side effects from "AuthProvider" const { result } = renderHook(() => useGetUserTokens(), { wrapper: WithQueryClientProvider }); await waitFor(() => expect(result.current.isError).toBe(true));