From 361700b2394bc616607fdaa25bb7847998f3179f Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Wed, 20 Mar 2024 20:30:58 +0100 Subject: [PATCH] feat: add board access settings (#249) * wip: add board access settings * wip: add user access control * wip: add user access control * feat: add user access control * refactor: move away from mantine-modal-manager * fix: ci issues and failing tests * fix: lint issue * fix: format issue * fix: deepsource issues * chore: address pull request feedback --- apps/nextjs/package.json | 2 +- .../(main)/apps/_app-delete-button.tsx | 7 +- .../integrations/_integration-buttons.tsx | 5 +- .../edit/[id]/_integration-edit-form.tsx | 11 +- .../new/_integration-new-dropdown.tsx | 2 +- .../app/[locale]/_client-providers/modals.tsx | 29 - .../app/[locale]/auth/login/_login-form.tsx | 2 +- .../boards/[name]/@headeractions/page.tsx | 58 +- .../boards/[name]/settings/_access.tsx | 293 +++++++ .../boards/[name]/settings/_danger.tsx | 34 +- .../[locale]/boards/[name]/settings/page.tsx | 9 + .../src/app/[locale]/boards/_client.tsx | 4 +- .../src/app/[locale]/boards/_creator.tsx | 45 +- .../[locale]/init/user/_init-user-form.tsx | 2 +- apps/nextjs/src/app/[locale]/layout.tsx | 4 +- .../_components/create-board-button.tsx | 26 +- apps/nextjs/src/app/[locale]/modals.tsx | 20 - .../app/[locale]/widgets/[kind]/_content.tsx | 62 +- .../widgets/[kind]/_dimension-modal.tsx | 86 +-- .../components/board/items/item-actions.tsx | 8 +- .../board/items/item-select-modal.tsx | 12 +- .../board/modals/board-rename-modal.tsx | 105 +-- .../sections/category/category-actions.ts | 6 +- .../sections/category/category-edit-modal.tsx | 78 +- .../category/category-menu-actions.tsx | 40 +- .../src/components/board/sections/content.tsx | 40 +- .../src/components/layout/header/burger.tsx | 5 +- .../manage/boards/add-board-modal.tsx | 93 +-- apps/nextjs/src/env.mjs | 2 +- packages/api/src/router/board.ts | 53 ++ packages/api/src/router/user.ts | 8 + packages/auth/test/callbacks.spec.ts | 4 +- ...orm.sql => 0000_productive_changeling.sql} | 21 +- packages/db/migrations/0001_slim_swarm.sql | 7 - .../db/migrations/meta/0000_snapshot.json | 119 ++- .../db/migrations/meta/0001_snapshot.json | 722 ------------------ packages/db/migrations/meta/_journal.json | 11 +- packages/db/schema/mysql.ts | 50 +- packages/db/schema/sqlite.ts | 49 +- packages/db/test/schema.spec.ts | 6 +- packages/definitions/src/index.ts | 1 + packages/definitions/src/permissions.ts | 3 + packages/modals/index.ts | 2 + packages/modals/package.json | 39 + packages/modals/src/confirm-modal.tsx | 92 +++ packages/modals/src/creator.ts | 14 + packages/modals/src/index.tsx | 141 ++++ packages/modals/src/reducer.tsx | 125 +++ packages/modals/src/type.ts | 43 ++ packages/modals/tsconfig.json | 8 + packages/translation/src/index.ts | 12 + packages/translation/src/lang/en.ts | 31 + packages/translation/src/type.ts | 1 + packages/validation/src/board.ts | 21 + packages/widgets/package.json | 1 + .../widgets/src/modals/widget-edit-modal.tsx | 117 +-- .../widgets/src/widget-integration-select.tsx | 8 +- pnpm-lock.yaml | 300 ++++---- turbo/generators/templates/package.json.hbs | 2 +- 59 files changed, 1763 insertions(+), 1338 deletions(-) delete mode 100644 apps/nextjs/src/app/[locale]/_client-providers/modals.tsx create mode 100644 apps/nextjs/src/app/[locale]/boards/[name]/settings/_access.tsx delete mode 100644 apps/nextjs/src/app/[locale]/modals.tsx rename packages/db/migrations/{0000_sloppy_bloodstorm.sql => 0000_productive_changeling.sql} (84%) delete mode 100644 packages/db/migrations/0001_slim_swarm.sql delete mode 100644 packages/db/migrations/meta/0001_snapshot.json create mode 100644 packages/definitions/src/permissions.ts create mode 100644 packages/modals/index.ts create mode 100644 packages/modals/package.json create mode 100644 packages/modals/src/confirm-modal.tsx create mode 100644 packages/modals/src/creator.ts create mode 100644 packages/modals/src/index.tsx create mode 100644 packages/modals/src/reducer.tsx create mode 100644 packages/modals/src/type.ts create mode 100644 packages/modals/tsconfig.json diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 73250ed51..6543052c0 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -22,6 +22,7 @@ "@homarr/form": "workspace:^0.1.0", "@homarr/gridstack": "^1.0.0", "@homarr/log": "workspace:^", + "@homarr/modals": "workspace:^0.1.0", "@homarr/notifications": "workspace:^0.1.0", "@homarr/spotlight": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", @@ -46,7 +47,6 @@ "chroma-js": "^2.4.2", "dayjs": "^1.11.10", "jotai": "^2.7.1", - "mantine-modal-manager": "^7.6.2", "next": "^14.1.3", "postcss-preset-mantine": "^1.13.0", "react": "18.2.0", diff --git a/apps/nextjs/src/app/[locale]/(main)/apps/_app-delete-button.tsx b/apps/nextjs/src/app/[locale]/(main)/apps/_app-delete-button.tsx index eb34d6729..5494e7386 100644 --- a/apps/nextjs/src/app/[locale]/(main)/apps/_app-delete-button.tsx +++ b/apps/nextjs/src/app/[locale]/(main)/apps/_app-delete-button.tsx @@ -4,6 +4,7 @@ import { useCallback } from "react"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import { useConfirmModal } from "@homarr/modals"; import { showErrorNotification, showSuccessNotification, @@ -12,7 +13,6 @@ import { useScopedI18n } from "@homarr/translation/client"; import { ActionIcon, IconTrash } from "@homarr/ui"; import { revalidatePathAction } from "../../../revalidatePathAction"; -import { modalEvents } from "../../modals"; interface AppDeleteButtonProps { app: RouterOutputs["app"]["all"][number]; @@ -20,10 +20,11 @@ interface AppDeleteButtonProps { export const AppDeleteButton = ({ app }: AppDeleteButtonProps) => { const t = useScopedI18n("app.page.delete"); + const { openConfirmModal } = useConfirmModal(); const { mutate, isPending } = clientApi.app.delete.useMutation(); const onClick = useCallback(() => { - modalEvents.openConfirmModal({ + openConfirmModal({ title: t("title"), children: t("message", app), onConfirm: () => { @@ -47,7 +48,7 @@ export const AppDeleteButton = ({ app }: AppDeleteButtonProps) => { ); }, }); - }, [app, mutate, t]); + }, [app, mutate, t, openConfirmModal]); return ( { const t = useScopedI18n("integration.page.delete"); const router = useRouter(); + const { openConfirmModal } = useConfirmModal(); const { mutateAsync, isPending } = clientApi.integration.delete.useMutation(); return ( @@ -32,7 +33,7 @@ export const DeleteIntegrationActionButton = ({ variant="subtle" color="red" onClick={() => { - modalEvents.openConfirmModal({ + openConfirmModal({ title: t("title"), children: t("message", integration), onConfirm: () => { diff --git a/apps/nextjs/src/app/[locale]/(main)/integrations/edit/[id]/_integration-edit-form.tsx b/apps/nextjs/src/app/[locale]/(main)/integrations/edit/[id]/_integration-edit-form.tsx index 50670d878..bd804bc91 100644 --- a/apps/nextjs/src/app/[locale]/(main)/integrations/edit/[id]/_integration-edit-form.tsx +++ b/apps/nextjs/src/app/[locale]/(main)/integrations/edit/[id]/_integration-edit-form.tsx @@ -10,6 +10,7 @@ import { getDefaultSecretKinds, } from "@homarr/definitions"; import { useForm, zodResolver } from "@homarr/form"; +import { useConfirmModal } from "@homarr/modals"; import { showErrorNotification, showSuccessNotification, @@ -19,7 +20,6 @@ import { Button, Fieldset, Group, Stack, TextInput } from "@homarr/ui"; import type { z } from "@homarr/validation"; import { validation } from "@homarr/validation"; -import { modalEvents } from "~/app/[locale]/modals"; import { SecretCard } from "../../_integration-secret-card"; import { IntegrationSecretInput } from "../../_integration-secret-inputs"; import { @@ -35,9 +35,10 @@ interface EditIntegrationForm { export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => { const t = useI18n(); + const { openConfirmModal } = useConfirmModal(); const secretsKinds = - getAllSecretKindOptions(integration.kind).find((x) => - integration.secrets.every((y) => x.includes(y.kind)), + getAllSecretKindOptions(integration.kind).find((secretKinds) => + integration.secrets.every((secret) => secretKinds.includes(secret.kind)), ) ?? getDefaultSecretKinds(integration.kind); const initialFormValues = { name: integration.name, @@ -99,7 +100,7 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => { }; return ( -
void handleSubmit(v))}> + void handleSubmit(values))}> @@ -128,7 +129,7 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => { ) { return res(true); } - modalEvents.openConfirmModal({ + openConfirmModal({ title: t("integration.secrets.reset.title"), children: t("integration.secrets.reset.message"), onCancel: () => res(false), diff --git a/apps/nextjs/src/app/[locale]/(main)/integrations/new/_integration-new-dropdown.tsx b/apps/nextjs/src/app/[locale]/(main)/integrations/new/_integration-new-dropdown.tsx index 354024c10..da953177d 100644 --- a/apps/nextjs/src/app/[locale]/(main)/integrations/new/_integration-new-dropdown.tsx +++ b/apps/nextjs/src/app/[locale]/(main)/integrations/new/_integration-new-dropdown.tsx @@ -33,7 +33,7 @@ export const IntegrationCreateDropdownContent = () => { leftSection={} placeholder={t("integration.page.list.search")} value={search} - onChange={(e) => setSearch(e.target.value)} + onChange={(event) => setSearch(event.target.value)} /> {filteredKinds.length > 0 ? ( diff --git a/apps/nextjs/src/app/[locale]/_client-providers/modals.tsx b/apps/nextjs/src/app/[locale]/_client-providers/modals.tsx deleted file mode 100644 index c5f8ca826..000000000 --- a/apps/nextjs/src/app/[locale]/_client-providers/modals.tsx +++ /dev/null @@ -1,29 +0,0 @@ -"use client"; - -import type { PropsWithChildren } from "react"; - -import { useScopedI18n } from "@homarr/translation/client"; - -import { ModalsManager } from "../modals"; - -export const ModalsProvider = ({ children }: PropsWithChildren) => { - const t = useScopedI18n("common.action"); - return ( - - {children} - - ); -}; diff --git a/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx b/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx index 7191ba68b..057268992 100644 --- a/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx +++ b/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx @@ -54,7 +54,7 @@ export const LoginForm = () => { return ( - void handleSubmit(v))}> + void handleSubmit(values))}> { + const { openModal: openCategoryEditModal } = + useModalAction(CategoryEditModal); + const { openModal: openItemSelectModal } = useModalAction(ItemSelectModal); const { addCategoryToEnd } = useCategoryActions(); const t = useI18n(); + const handleAddCategory = useCallback( + () => + openCategoryEditModal( + { + category: { + id: "new", + name: "", + }, + onSuccess({ name }) { + addCategoryToEnd({ name }); + }, + submitLabel: t("section.category.create.submit"), + }, + { + title: (t) => t("section.category.create.title"), + }, + ), + [addCategoryToEnd, openCategoryEditModal, t], + ); + + const handleSelectItem = useCallback(() => { + openItemSelectModal(); + }, [openItemSelectModal]); + return ( @@ -62,14 +92,7 @@ const AddMenu = () => { } - onClick={() => - modalEvents.openManagedModal({ - title: t("item.create.title"), - size: "xl", - modal: "itemSelectModal", - innerProps: {}, - }) - } + onClick={handleSelectItem} > {t("item.action.create")} @@ -81,22 +104,7 @@ const AddMenu = () => { } - onClick={() => - modalEvents.openManagedModal({ - title: t("section.category.create.title"), - modal: "categoryEditModal", - innerProps: { - submitLabel: t("section.category.create.submit"), - category: { - id: "new", - name: "", - }, - onSuccess({ name }) { - addCategoryToEnd({ name }); - }, - }, - }) - } + onClick={handleAddCategory} > {t("section.category.action.create")} diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/_access.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_access.tsx new file mode 100644 index 000000000..0d47e6bba --- /dev/null +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_access.tsx @@ -0,0 +1,293 @@ +"use client"; + +import { useCallback } from "react"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; +import type { BoardPermission } from "@homarr/definitions"; +import { boardPermissions } from "@homarr/definitions"; +import { useForm } from "@homarr/form"; +import { createModal, useModalAction } from "@homarr/modals"; +import { useI18n } from "@homarr/translation/client"; +import type { SelectProps, TablerIcon } from "@homarr/ui"; +import { + Button, + Flex, + Group, + IconCheck, + IconEye, + IconPencil, + IconPlus, + IconSettings, + Select, + Stack, + Table, + TableTbody, + TableTd, + TableTh, + TableThead, + TableTr, + Text, +} from "@homarr/ui"; + +import type { Board } from "../../_types"; + +interface Props { + board: Board; + initialPermissions: RouterOutputs["board"]["permissions"]; +} + +export const AccessSettingsContent = ({ board, initialPermissions }: Props) => { + const { data: permissions } = clientApi.board.permissions.useQuery( + { + id: board.id, + }, + { + initialData: initialPermissions, + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }, + ); + + const t = useI18n(); + const form = useForm({ + initialValues: { + permissions: permissions.sort((permissionA, permissionB) => { + if (permissionA.user.id === board.creatorId) return -1; + if (permissionB.user.id === board.creatorId) return 1; + return permissionA.user.name.localeCompare(permissionB.user.name); + }), + }, + }); + const { mutate, isPending } = clientApi.board.savePermissions.useMutation(); + const utils = clientApi.useUtils(); + const { openModal } = useModalAction(UserSelectModal); + + const handleSubmit = useCallback( + (v: FormType) => { + mutate( + { + id: board.id, + permissions: v.permissions, + }, + { + onSuccess: () => { + void utils.board.permissions.invalidate(); + }, + }, + ); + }, + [board.id, mutate, utils.board.permissions], + ); + + const handleAddUser = useCallback(() => { + const presentUserIds = form.values.permissions.map( + (permission) => permission.user.id, + ); + + openModal({ + presentUserIds: board.creatorId + ? presentUserIds.concat(board.creatorId) + : presentUserIds, + onSelect: (user) => { + form.setFieldValue("permissions", [ + ...form.values.permissions, + { + user, + permission: "board-view", + }, + ]); + }, + }); + }, [form, openModal, board.creatorId]); + + return ( + + + + + + + {t("board.setting.section.access.permission.field.user.label")} + + + {t( + "board.setting.section.access.permission.field.permission.label", + )} + + + + + {board.creator && } + {form.values.permissions.map((row, index) => { + const Icon = icons[row.permission]; + return ( + + {row.user.name} + + +
+ + + + + +
+ + ); +}; + +interface CreatorRowProps { + user: Exclude; +} + +const CreatorRow = ({ user }: CreatorRowProps) => { + const t = useI18n(); + return ( + + {user.name} + + + + + + + {t("board.setting.section.access.permission.item.board-full.label")} + + + + + ); +}; + +const icons = { + "board-change": IconPencil, + "board-view": IconEye, +} satisfies Record; + +const iconProps = { + stroke: 1.5, + color: "currentColor", + opacity: 0.6, + size: "1rem", +}; + +const RenderOption: SelectProps["renderOption"] = ({ option, checked }) => { + const Icon = icons[option.value as BoardPermission]; + return ( + + + {option.label} + {checked && ( + + )} + + ); +}; + +interface FormType { + permissions: RouterOutputs["board"]["permissions"]; +} + +interface InnerProps { + presentUserIds: string[]; + onSelect: (props: { id: string; name: string }) => void; +} + +interface UserSelectFormType { + userId: string; +} + +export const UserSelectModal = createModal( + ({ actions, innerProps }) => { + const t = useI18n(); + const { data: users } = clientApi.user.selectable.useQuery(); + const form = useForm(); + const handleSubmit = (v: UserSelectFormType) => { + const currentUser = users?.find((user) => user.id === v.userId); + if (!currentUser) return; + innerProps.onSelect({ + id: currentUser.id, + name: currentUser.name ?? "", + }); + actions.closeModal(); + }; + + return ( +
+ + - ); - }, - )} - - - - - - -
- ); -}; + return ( + + ); + }, + )} + + + + + + + + ); + }, +).withOptions({}); diff --git a/packages/widgets/src/widget-integration-select.tsx b/packages/widgets/src/widget-integration-select.tsx index 2b70ec1f4..5074e83b6 100644 --- a/packages/widgets/src/widget-integration-select.tsx +++ b/packages/widgets/src/widget-integration-select.tsx @@ -48,17 +48,17 @@ export const WidgetIntegrationSelect = ({ const handleValueSelect = (selectedValue: string) => onChange( multiSelectValues.includes(selectedValue) - ? multiSelectValues.filter((v) => v !== selectedValue) + ? multiSelectValues.filter((value) => value !== selectedValue) : [...multiSelectValues, selectedValue], ); - const handleValueRemove = (val: string) => - onChange(multiSelectValues.filter((v) => v !== val)); + const handleValueRemove = (valueToRemove: string) => + onChange(multiSelectValues.filter((value) => value !== valueToRemove)); const values = multiSelectValues.map((item) => ( i.id === item)!} + option={data.find((integration) => integration.id === item)!} onRemove={() => handleValueRemove(item)} /> )); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e616d5412..c8f3e1ff4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -162,6 +162,9 @@ importers: '@homarr/log': specifier: workspace:^ version: link:../../packages/log + '@homarr/modals': + specifier: workspace:^0.1.0 + version: link:../../packages/modals '@homarr/notifications': specifier: workspace:^0.1.0 version: link:../../packages/notifications @@ -236,10 +239,7 @@ importers: version: 16.4.5 jotai: specifier: ^2.7.1 - version: 2.7.1(@types/react@18.2.66)(react@18.2.0) - mantine-modal-manager: - specifier: ^7.6.2 - version: 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0) + version: 2.7.1(@types/react@18.2.67)(react@18.2.0) next: specifier: ^14.1.3 version: 14.1.3(@babel/core@7.23.9)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) @@ -279,7 +279,7 @@ importers: version: 20.11.30 '@types/react': specifier: ^18.2.66 - version: 18.2.66 + version: 18.2.67 '@types/react-dom': specifier: ^18.2.22 version: 18.2.22 @@ -452,7 +452,7 @@ importers: version: 0.20.14 drizzle-orm: specifier: ^0.30.2 - version: 0.30.2(@types/better-sqlite3@7.6.9)(better-sqlite3@9.4.3)(mysql2@3.9.2)(react@17.0.2) + version: 0.30.3(@types/better-sqlite3@7.6.9)(better-sqlite3@9.4.3)(mysql2@3.9.2)(react@17.0.2) mysql2: specifier: ^3.9.2 version: 3.9.2 @@ -548,6 +548,31 @@ importers: specifier: ^5.4.2 version: 5.4.2 + packages/modals: + dependencies: + '@homarr/translation': + specifier: workspace:^0.1.0 + version: link:../translation + '@homarr/ui': + specifier: workspace:^0.1.0 + version: link:../ui + devDependencies: + '@homarr/eslint-config': + specifier: workspace:^0.2.0 + version: link:../../tooling/eslint + '@homarr/prettier-config': + specifier: workspace:^0.1.0 + version: link:../../tooling/prettier + '@homarr/tsconfig': + specifier: workspace:^0.1.0 + version: link:../../tooling/typescript + eslint: + specifier: ^8.57.0 + version: 8.57.0 + typescript: + specifier: ^5.4.2 + version: 5.4.2 + packages/notifications: dependencies: '@homarr/ui': @@ -627,7 +652,7 @@ importers: dependencies: '@mantine/core': specifier: ^7.6.2 - version: 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + version: 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/dates': specifier: ^7.6.2 version: 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) @@ -696,6 +721,9 @@ importers: '@homarr/form': specifier: workspace:^0.1.0 version: link:../form + '@homarr/modals': + specifier: workspace:^0.1.0 + version: link:../modals '@homarr/notifications': specifier: workspace:^0.1.0 version: link:../notifications @@ -732,10 +760,10 @@ importers: version: 14.1.3 '@typescript-eslint/eslint-plugin': specifier: ^7.2.0 - version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) + version: 7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/parser': specifier: ^7.2.0 - version: 7.2.0(eslint@8.57.0)(typescript@5.4.2) + version: 7.3.1(eslint@8.57.0)(typescript@5.4.2) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) @@ -744,7 +772,7 @@ importers: version: 1.12.5(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: specifier: ^6.8.0 version: 6.8.0(eslint@8.57.0) @@ -803,8 +831,8 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 /@angular-devkit/core@17.1.2(chokidar@3.6.0): resolution: {integrity: sha512-ku+/W/HMCBacSWFppenr9y6Lx8mDuTuQvn1IkTyBLiJOpWnzgVbx9kHDeaDchGa1PwLlJUBBrv27t3qgJOIDPw==} @@ -945,9 +973,9 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 /@babel/helper-compilation-targets@7.23.6: @@ -969,19 +997,19 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.23.9 - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -1019,13 +1047,13 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -1045,7 +1073,7 @@ packages: dependencies: '@babel/template': 7.23.9 '@babel/traverse': 7.23.9 - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color @@ -1073,7 +1101,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 /@babel/parser@7.24.0: resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} @@ -1081,6 +1109,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.24.0 + dev: false /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} @@ -1121,8 +1150,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} @@ -1143,8 +1172,8 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -1183,6 +1212,7 @@ packages: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: false /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1951,6 +1981,14 @@ packages: '@sinclair/typebox': 0.27.8 dev: true + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1958,14 +1996,20 @@ packages: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 + dev: true /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} @@ -1977,6 +2021,12 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: @@ -2009,7 +2059,7 @@ packages: chroma-js: 2.4.2 dev: false - /@mantine/core@7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + /@mantine/core@7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-qmZhmQVc7ZZ8EKKhPkGuZbfBnLXR0xE45ikxfx+1E6/8hLY5Ypr4nWqh5Pk6p3b+K71yYnBqlbNXbtHLQH0h3g==} peerDependencies: '@mantine/hooks': 7.6.2 @@ -2022,8 +2072,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-number-format: 5.3.1(react-dom@18.2.0)(react@18.2.0) - react-remove-scroll: 2.5.7(@types/react@18.2.66)(react@18.2.0) - react-textarea-autosize: 8.5.3(@types/react@18.2.66)(react@18.2.0) + react-remove-scroll: 2.5.7(@types/react@18.2.67)(react@18.2.0) + react-textarea-autosize: 8.5.3(@types/react@18.2.67)(react@18.2.0) type-fest: 4.12.0 transitivePeerDependencies: - '@types/react' @@ -2038,7 +2088,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.6.2(react@18.2.0) clsx: 2.1.0 dayjs: 1.11.10 @@ -2072,7 +2122,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.6.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2086,7 +2136,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.6.2(react@18.2.0) '@mantine/store': 7.6.2(react@18.2.0) react: 18.2.0 @@ -2102,7 +2152,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.6.2(react@18.2.0) '@mantine/store': 7.6.2(react@18.2.0) react: 18.2.0 @@ -2127,7 +2177,7 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.6.2(react@18.2.0) '@tiptap/extension-link': 2.2.4(@tiptap/core@2.2.4)(@tiptap/pm@2.2.4) '@tiptap/react': 2.2.4(@tiptap/core@2.2.4)(@tiptap/pm@2.2.4)(react-dom@18.2.0)(react@18.2.0) @@ -3241,20 +3291,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 dev: true /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.23.9 dev: true /@types/bcrypt@5.0.2: @@ -3417,11 +3467,11 @@ packages: /@types/react-dom@18.2.22: resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 dev: true - /@types/react@18.2.66: - resolution: {integrity: sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==} + /@types/react@18.2.67: + resolution: {integrity: sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==} dependencies: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 @@ -3488,9 +3538,9 @@ packages: '@types/node': 20.11.30 dev: true - /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 @@ -3500,11 +3550,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.3.1 + '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.3.1 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 @@ -3517,9 +3567,9 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@7.3.1(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -3527,10 +3577,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/scope-manager': 7.3.1 + '@typescript-eslint/types': 7.3.1 + '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.2) + '@typescript-eslint/visitor-keys': 7.3.1 debug: 4.3.4 eslint: 8.57.0 typescript: 5.4.2 @@ -3538,17 +3588,17 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@7.2.0: - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/scope-manager@7.3.1: + resolution: {integrity: sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/types': 7.3.1 + '@typescript-eslint/visitor-keys': 7.3.1 dev: false - /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@7.3.1(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -3556,8 +3606,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.2) + '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.2.1(typescript@5.4.2) @@ -3566,22 +3616,22 @@ packages: - supports-color dev: false - /@typescript-eslint/types@7.2.0: - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/types@7.3.1: + resolution: {integrity: sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==} + engines: {node: ^18.18.0 || >=20.0.0} dev: false - /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@7.3.1(typescript@5.4.2): + resolution: {integrity: sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/types': 7.3.1 + '@typescript-eslint/visitor-keys': 7.3.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -3593,18 +3643,18 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): - resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@7.3.1(eslint@8.57.0)(typescript@5.4.2): + resolution: {integrity: sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.7 - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) + '@typescript-eslint/scope-manager': 7.3.1 + '@typescript-eslint/types': 7.3.1 + '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.2) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -3612,11 +3662,11 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@7.2.0: - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/visitor-keys@7.3.1: + resolution: {integrity: sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/types': 7.3.1 eslint-visitor-keys: 3.4.3 dev: false @@ -5066,8 +5116,8 @@ packages: - supports-color dev: false - /drizzle-orm@0.30.2(@types/better-sqlite3@7.6.9)(better-sqlite3@9.4.3)(mysql2@3.9.2)(react@17.0.2): - resolution: {integrity: sha512-DNd3djg03o+WxZX3pGD8YD+qrWT8gbrbhaZ2W0PVb6yH4rtM/VTB92cTGvumcRh7SSd2KfV0NWYDB70BHIXQTg==} + /drizzle-orm@0.30.3(@types/better-sqlite3@7.6.9)(better-sqlite3@9.4.3)(mysql2@3.9.2)(react@17.0.2): + resolution: {integrity: sha512-tmIUPy71Ca7BUD5M7Tn9bvXESDWoj66d6lTdKCdf30V26xDFFjbx7DMamhOiWU+H1fflBk5rCdtGyt2SiFPgRg==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -5473,7 +5523,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.3.1)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -5494,7 +5544,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -5502,7 +5552,7 @@ packages: - supports-color dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -5512,7 +5562,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 array.prototype.flat: 1.3.2 @@ -5521,7 +5571,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.3.1)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6881,7 +6931,7 @@ packages: resolution: {integrity: sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==} dev: false - /jotai@2.7.1(@types/react@18.2.66)(react@18.2.0): + /jotai@2.7.1(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-bsaTPn02nFgWNP6cBtg/htZhCu4s0wxqoklRHePp6l/vlsypR9eLn7diRliwXYWMXDpPvW/LLA2afI8vwgFFaw==} engines: {node: '>=12.20.0'} peerDependencies: @@ -6893,7 +6943,7 @@ packages: react: optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 react: 18.2.0 dev: false @@ -7206,8 +7256,8 @@ packages: /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 source-map-js: 1.0.2 dev: true @@ -7228,20 +7278,6 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - /mantine-modal-manager@7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tU6nHe8ImEdpBY9WaY4xtVXYc23BTKwJ+0bJ7m3/KkbDw7SSWOXOMevIrcnunlmvZfb5jAwm3CGGmdcS5gYx5w==} - peerDependencies: - '@mantine/core': 7.6.2 - '@mantine/hooks': 7.6.2 - react: ^18.2.0 - react-dom: ^18.2.0 - dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) - '@mantine/hooks': 7.6.2(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /mantine-react-table@2.0.0-beta.0(@mantine/core@7.6.2)(@mantine/dates@7.6.2)(@mantine/hooks@7.6.2)(@tabler/icons-react@3.1.0)(clsx@2.1.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-KZOr7nzoSt4aF0hyWKJJBK9/dxVWB3tdg2fFSNnqns9cbPFlLTGXDKguLSoNE8WkzjWE0ThpYJknIAoraL/7ug==} engines: {node: '>=16'} @@ -7255,7 +7291,7 @@ packages: react: '>=18.0' react-dom: '>=18.0' dependencies: - '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@mantine/core': 7.6.2(@mantine/hooks@7.6.2)(@types/react@18.2.67)(react-dom@18.2.0)(react@18.2.0) '@mantine/dates': 7.6.2(@mantine/core@7.6.2)(@mantine/hooks@7.6.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.6.2(react@18.2.0) '@tabler/icons-react': 3.1.0(react@18.2.0) @@ -8472,7 +8508,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.66)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -8482,13 +8518,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.66)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.67)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.7(@types/react@18.2.66)(react@18.2.0): + /react-remove-scroll@2.5.7(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} engines: {node: '>=10'} peerDependencies: @@ -8498,16 +8534,16 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.66)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.66)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.67)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.67)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.66)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.66)(react@18.2.0) + use-callback-ref: 1.3.1(@types/react@18.2.67)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.67)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.66)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -8517,14 +8553,14 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 dev: false - /react-textarea-autosize@8.5.3(@types/react@18.2.66)(react@18.2.0): + /react-textarea-autosize@8.5.3(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: @@ -8533,7 +8569,7 @@ packages: '@babel/runtime': 7.23.9 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.66)(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.67)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false @@ -9889,7 +9925,7 @@ packages: requires-port: 1.0.0 dev: true - /use-callback-ref@1.3.1(@types/react@18.2.66)(react@18.2.0): + /use-callback-ref@1.3.1(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} engines: {node: '>=10'} peerDependencies: @@ -9899,7 +9935,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 react: 18.2.0 tslib: 2.6.2 dev: false @@ -9923,7 +9959,7 @@ packages: react: 18.2.0 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.66)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -9932,11 +9968,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 react: 18.2.0 dev: false - /use-latest@1.2.1(@types/react@18.2.66)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -9945,12 +9981,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.66)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.67)(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.66)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.67)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -9960,7 +9996,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.66 + '@types/react': 18.2.67 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 diff --git a/turbo/generators/templates/package.json.hbs b/turbo/generators/templates/package.json.hbs index aaaaf7d8f..8c2ed9ff9 100644 --- a/turbo/generators/templates/package.json.hbs +++ b/turbo/generators/templates/package.json.hbs @@ -4,6 +4,6 @@ "format": "prettier --check . --ignore-path ../../.gitignore", "typecheck": "tsc --noEmit" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": -"workspace:^0.1.0", "eslint": "^8.56.0", "typescript": "^5.3.3" }, +"workspace:^0.1.0", "eslint": "^8.57.0", "typescript": "^5.4.2" }, "eslintConfig": { "extends": [ "@homarr/eslint-config/base" ] }, "prettier": "@homarr/prettier-config" } \ No newline at end of file