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 72753e1..87e3379 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 07be5fa..74d8c91 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 ef3a57d..1108f8f 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 0000000..21ec664 --- /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 3295423..0000000 --- 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 acf3e96..0000000 --- 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 3aeb046..0000000 --- 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 a858532..0000000 --- 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 26f295e..0000000 --- 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 d7bc74f..0000000 --- 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 1952530..0000000 --- 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 542f96a..0000000 --- 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 6ed47f6..02ade4d 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 8022e55..9be766c 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 ce1c76c..e23e13b 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 0000000..e36c69b --- /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 0000000..40014a8 --- /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 41a4138..a7f5ff2 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 e821d9f..592da93 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 0000000..1a151f9 --- /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 0000000..b494129 --- /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 0000000..eac65a4 --- /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 0000000..63dc521 --- /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 0000000..3119cfa --- /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 0000000..93ad1b6 --- /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 0000000..cb0ff5c --- /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 0000000..b494129 --- /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 0000000..792172f --- /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 0000000..ea42066 --- /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 b336dd0..e820ea5 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 9639ce8..dcc71ab 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 88c5b80..22c7736 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 5edcdc6..f60462f 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 f1fe23b..c1c4311 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 c1b7f43..157e4d6 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 5d70ab2..6a38808 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 6e9b9a5..006f968 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 d5de4e8..d5df6a4 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 4acf3ad..6d49482 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 7a6620a..5004a76 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 f0cecf8..a7ce00a 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 4ff0d75..4977812 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 ba2d468..a4d8f72 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 6c5c52b..a7722fe 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 3058286..83a9f67 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 c2e7456..5dfb550 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 5085303..5258ed5 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 f7f78be..fdd7833 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 9f5c3b7..9b3d131 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 2224ca0..1a449d8 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 272f397..24588fd 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 65764ee..a649dfa 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 1b2017e..407b727 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 84757fa..e97cafd 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 37b4a2c..56fd6d2 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 98b8f2e..fcf7aa8 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 0cfff0b..a19dde9 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 9cb9ad7..6b37cfd 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 2b82c1c..9398a3b 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 c503f0f..0ddcef6 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 652ed9c..1b27856 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 4873aa6..de5b5b1 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 cbd920a..dbf71b8 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 39220e3..5687163 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 89acc9a..be05af3 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 e3bd273..a3937fa 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 72ef1d0..3428d43 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 a6dc1be..43192fc 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 ee9ae12..c28d14f 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 82ff626..b767593 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 910af06..1c9c978 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 9b0764e..b58fbbb 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 47938ee..57d30b4 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 1ae4f01..8c1bf47 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 eea138c..cc18a4a 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 fa4a2d6..673cbfc 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 625aa01..701fe64 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 a7555fc..16a5d5d 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 72cc4b7..ea2e605 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 d337b93..7d310b0 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 f8df758..49f34ba 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 0000000..a8f1af9 --- /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 c2223a4..9c32908 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 b0ae358..ffeac29 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 2cc1ab0..c08c8e0 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 1c3db66..f8a960a 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 f0ace46..de8470f 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 034a209..174af10 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 6304cfe..f4a8157 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 a8ed0bd..a4ffb95 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 244aece..55eee77 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 dd3cc16..3f7ffda 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 93a9f97..8904ff7 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 6622e22..6420124 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 5f63d02..79fe2b5 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 99a37f3..4dc4777 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 433f33d..e64969c 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 956f0d2..b03d26c 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 a531f0f..5a3d986 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 97b2596..4853925 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 6ade63c..9f6cf48 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 5aeca2c..c6131f8 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 da05749..85d038d 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 046702b..184018f 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 5bf6ae9..b567b7d 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 16e5193..892bca0 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 2bc14b3..6caacb8 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 32f4933..44b8437 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 350e687..da88f5d 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 b093079..6b1f578 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 cff3f6e..659d456 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 3a214fc..7beb7ed 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 1c124c9..7846cdc 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 9aacf85..a08e69e 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 d40d2af..374a208 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 639af54..82d7856 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 e6eba95..8f588ce 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 865d181..1edaaee 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 d79343f..8217501 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 a123895..510ba00 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 78df3c0..d379863 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 ebe643c..4e0ce84 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 c3ad7b4..f1a91ea 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 90ba66b..8b14b54 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 d1e3f46..6c5acd5 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 e81c238..dde953f 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 9b636ee..e07d051 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 1de8c3d..004b7cc 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 dba61e1..c4a8a4f 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 b2cf0c0..7c2662f 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 8cca451..965057e 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 5f035f2..5959c0f 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 6198ddc..3c524a0 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 bb0fa12..484f2e3 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 a0e45ad..9f719eb 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 c25cf7a..d96dae1 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 579a552..2e8ecc7 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 60eb866..9cad867 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 785c4a0..33dd535 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 1bd1d2d..4965e05 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 cc3fa65..1d41fd8 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 a02a8c4..c5ffff8 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 92ec292..6f4e511 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 28c38ad..1d34feb 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 8ebd387..15fad2a 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 6d405bb..c04d1f1 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 8385496..7100618 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 30e9152..5a8cbd1 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 92f543e..eade696 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 d22f5b0..ed357c9 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 3da6a6d..60250ff 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 a8827be..a258a86 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 4b37eb3..a1fd4de 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 0fa3275..7642a3d 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 664ef9f..b8cc8f6 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 0b1204f..667d00c 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 25561bd..26a7a26 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 c2dddc9..64e6c7d 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 9be8a1b..adcadde 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 72491d6..9c10e2c 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 2823122..42b2d6b 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 6bc374e..963597f 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 48a4bab..c1d4c66 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 60e01f0..e7425b1 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 b2d1ec1..822b078 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 bf5342b..c93f61c 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 0e84ff5..29f8a83 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 d9757c5..1479dce 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 6549845..771422c 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 cc3b11d..33b1ff9 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 b22e8f2..2673acc 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 05ee6df..fb64e37 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 ccade7e..29a8e55 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 de712c3..dac7638 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 bea4150..3e2d205 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 e2956bf..5ce3b6b 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 529ae36..b3ee3f9 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 96b08b4..1ee5266 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 9816f0e..af967dc 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 26c57f6..8510fab 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 9bdff34..f0dd29d 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 f33ab69..27a63fe 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 5b83170..9b323bf 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 cf255d1..995f686 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 a7106fe..dca558b 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 06c96d4..af5617c 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 e88c7d5..6a07230 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 31746d1..8234f4d 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 31652e0..ea59c7e 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 89a43f0..3868c50 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 e495a61..423ec12 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 a7e95e2..95ee0fd 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 1019dd6..a2acfdc 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 8432ada..48a08b2 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 a851244..cf7e9b5 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 a63c52d..470760b 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 47463d8..565bb29 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 105169a..dd91dea 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 9933237..41e4612 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 922439f..e6a38ca 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 f917a2a..e938b0c 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 44bcb81..6b11967 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 ef2c5ff..c3da983 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 f86a58d..de91085 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 0125eda..9fab038 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 f992ac9..d5b6eea 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 846cba7..ce5764e 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 1cb262d..728a0a6 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 b9cf1fd..ee50b0b 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 c0138b9..1ac191d 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 aba6684..4e3b0ca 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 35709d5..8e120fa 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 ad19dcd..07cc069 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 c5d36f7..9ac54fd 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 668bacf..219d39d 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 012f709..74f8fae 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 e1d2420..ee97345 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 dd8f015..86f8af7 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 4c8cc70..ea4a303 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 3fef922..3f0d96c 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 8125db0..2a66ab1 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 e3d2039..0928e93 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 2b744bc..7486df5 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 375d262..7d4852d 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 26fc452..6eb5621 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 a606621..6a002f7 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 a64d070..3376a08 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 928e9f1..7dc6424 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 1c48961..a04fada 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 42d635a..b71a4df 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 f7e6539..7457c09 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 7f73553..53af3ea 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 b08b3ca..543e435 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 afebd2e..2cc59df 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 cba1842..34e5770 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 908acec..9710181 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 50dbfaf..1167cff 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 08e29ae..fd3c305 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 a0918ee..7630bb3 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 99807ae..81ce99a 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 457a234..4941442 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 2dec15f..d316b8d 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 f52d118..88888f7 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 059a095..183e7fe 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 92365d9..d548dfb 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 207cedc..7c6e213 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 13ca5f6..9225ff9 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 603f1b1..ef94053 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 f3fc06d..4f86b19 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 114c114..1d8106e 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 7cf34db..b047592 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 3b860b0..bd92f8a 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 fee271f..7e0d266 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 c321a0d..c0211d3 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 95c868f..dfc77f5 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 07d4bc8..2141794 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 f6a109d..d96245b 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 cc219a9..1982966 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 4f415bf..3974446 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 67c6e2c..beb5152 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 838424e..1850222 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 96b0ec2..c90406c 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 c6738bf..be4fddf 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 e933b4f..7e29713 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 ec746d9..e4d1c91 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 ad2beed..82a018a 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 2498624..a2888ae 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 1a3fbc4..1a6c0a0 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 b6bcdba..29e2127 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 4c714b1..249dfa0 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 9ec7598..771d08e 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 c508b14..64e2dfa 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 d840a6b..b2c03f8 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 331e26d..fbe88b9 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 c709e2f..b738f09 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 31c80ae..578410f 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 a9a66a6..ea7507c 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 9dd0d46..046327e 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 5f8b7b9..8c41632 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 ba48492..7a5d2d6 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 4cea088..d214ac2 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 d9dc92d..1d5d31a 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 ae3db44..2caf37b 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 ca134ab..088e518 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 4c706b0..b43c1ce 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 741ed89..449bf34 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 8055e09..8501c31 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 a74d4ac..0a37391 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 9be54d1..7b9c735 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 0bdb6ff..6b1197b 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 2a843b7..2225120 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 c6f19cb..d3b2d82 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 8d5f4e8..83da72e 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 4dc68c1..d9e951e 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 ca4aa28..b03e47b 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 a13f1f4..929422a 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 b0b6db9..fc8ca9f 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 7b24d9d..fbbd3e0 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 d208f69..5a8c977 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 0debf32..2576031 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 dd45d01..b0e1a5e 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 f6921aa..496f80c 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 5503dd1..a103e59 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 be162eb..fa335e4 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 a19be18..9c8cf74 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 b2f02fa..3f6bbec 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 72fe334..a611165 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 65c5c50..329443e 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 d660fc5..625d9b6 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 5a33e79..716b964 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 1fccb2a..bfa66ee 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 b0f3c9c..8ed5acf 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 85c389f..9eaf145 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 6aabbb6..66cb368 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 d215cf5..c719db8 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 d7b0f5e..0ae9e0e 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 017de43..e878044 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 5648344..a1d5dd3 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 47c94bb..28c9d06 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 627da4e..aba48ef 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 6a72e80..9718096 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 e5f2539..a2b8f55 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 c06e40c..bd238ce 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 5183480..373f628 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 a1a6fe1..3bac71e 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 7b23789..eebaacf 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 07e2d73..64d7c8d 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 c9e54fa..c916c37 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 30fdb97..8b55a14 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 0f4616a..83dd540 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 bd20885..37fcf50 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 66af86b..0b25ff0 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 03a1a67..7b54fdb 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 c5832e5..3b90eca 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 afbe968..3d16460 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 91b4054..de49412 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 0000000..0b036d2 --- /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 0000000..9e4f9e4 --- /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 0000000..1725f0e --- /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 0000000..c1871bb --- /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 6b8bb4d..0000000 --- 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 474aa0e..0000000 --- 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 0000000..203171d --- /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 1e5af50..0000000 --- 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 97ede7e..0000000 --- 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 ab32fed..0000000 --- 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 0000000..bfa0e38 --- /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 ce4edf5..0000000 --- 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 592da93..b0d51da 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 1725f0e..6f77954 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 6b11967..1185516 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 af967dc..a7abed9 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 c1871bb..ce4edf5 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 be05af3..9e543ab 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 65d5511..1d1c329 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 c96a786..da8a093 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 b436328..b55f4ad 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 25fd3c2..3afe4d4 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 da8a093..58c2136 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 9b90d4d..26ab566 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 0000000..b75392d --- /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 0000000..ca329fa --- /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 1108f8f..bce00c0 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 5189d46..294f843 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 724c20d..623e742 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 d19dcb5..80bca42 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 bce00c0..21ab89c 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 a7722fe..396c109 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));