diff --git a/apiserver/plane/app/views/asset/v2.py b/apiserver/plane/app/views/asset/v2.py index dfb5a23311..de518b8d63 100644 --- a/apiserver/plane/app/views/asset/v2.py +++ b/apiserver/plane/app/views/asset/v2.py @@ -21,6 +21,8 @@ from plane.db.models import ( ) from plane.settings.storage import S3Storage from plane.app.permissions import allow_permission, ROLE +from plane.payment.flags.flag_decorator import check_workspace_feature_flag +from plane.payment.flags.flag import FeatureFlag class UserAssetsV2Endpoint(BaseAPIView): @@ -82,6 +84,9 @@ class UserAssetsV2Endpoint(BaseAPIView): size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) + # Check if the file size is within the limit + size_limit = min(size, settings.FILE_SIZE_LIMIT) + # Check if the entity type is allowed if not entity_type or entity_type not in ["USER_AVATAR", "USER_COVER"]: return Response( @@ -103,9 +108,6 @@ class UserAssetsV2Endpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - # Get the size limit - size_limit = min(settings.FILE_SIZE_LIMIT, size) - # asset key asset_key = f"{uuid.uuid4().hex}-{name}" @@ -174,16 +176,19 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): """This endpoint is used to upload cover images/logos etc for workspace, projects and users.""" def get_entity_id_field(self, entity_type, entity_id): + # Workspace Logo if entity_type == FileAsset.EntityTypeContext.WORKSPACE_LOGO: return { "workspace_id": entity_id, } + # Project Cover if entity_type == FileAsset.EntityTypeContext.PROJECT_COVER: return { "project_id": entity_id, } + # User Avatar and Cover if entity_type in [ FileAsset.EntityTypeContext.USER_AVATAR, FileAsset.EntityTypeContext.USER_COVER, @@ -192,6 +197,7 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): "user_id": entity_id, } + # Issue Attachment and Description if entity_type in [ FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, FileAsset.EntityTypeContext.ISSUE_DESCRIPTION, @@ -200,11 +206,13 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): "issue_id": entity_id, } + # Page Description if entity_type == FileAsset.EntityTypeContext.PAGE_DESCRIPTION: return { "page_id": entity_id, } + # Comment Description if entity_type == FileAsset.EntityTypeContext.COMMENT_DESCRIPTION: return { "comment_id": entity_id, @@ -301,8 +309,20 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - # Get the size limit - size_limit = min(settings.FILE_SIZE_LIMIT, size) + if entity_type in [ + FileAsset.EntityTypeContext.WORKSPACE_LOGO, + FileAsset.EntityTypeContext.PROJECT_COVER, + ]: + size_limit = min(size, settings.FILE_SIZE_LIMIT) + else: + if settings.IS_MULTI_TENANT and check_workspace_feature_flag( + feature_key=FeatureFlag.FILE_SIZE_LIMIT_PRO, + slug=slug, + user_id=str(request.user.id), + ): + size_limit = min(size, settings.PRO_FILE_SIZE_LIMIT) + else: + size_limit = min(size, settings.FILE_SIZE_LIMIT) # Get the workspace workspace = Workspace.objects.get(slug=slug) @@ -454,7 +474,7 @@ class AssetRestoreEndpoint(BaseAPIView): class ProjectAssetEndpoint(BaseAPIView): """This endpoint is used to upload cover images/logos etc for workspace, projects and users.""" - def get_entity_id_fiekd(self, entity_type, entity_id): + def get_entity_id_field(self, entity_type, entity_id): if entity_type == FileAsset.EntityTypeContext.WORKSPACE_LOGO: return { "workspace_id": entity_id, @@ -513,7 +533,7 @@ class ProjectAssetEndpoint(BaseAPIView): ) # Check if the file type is allowed - allowed_types = ["image/jpeg", "image/png", "image/webp"] + allowed_types = ["image/jpeg", "image/png", "image/webp", "image/jpg"] if type not in allowed_types: return Response( { @@ -523,8 +543,20 @@ class ProjectAssetEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - # Get the size limit - size_limit = min(settings.FILE_SIZE_LIMIT, size) + if entity_type in [ + FileAsset.EntityTypeContext.WORKSPACE_LOGO, + FileAsset.EntityTypeContext.PROJECT_COVER, + ]: + size_limit = min(size, settings.FILE_SIZE_LIMIT) + else: + if check_workspace_feature_flag( + feature_key=FeatureFlag.FILE_SIZE_LIMIT_PRO, + slug=slug, + user_id=str(request.user.id), + ): + size_limit = min(size, settings.PRO_FILE_SIZE_LIMIT) + else: + size_limit = min(size, settings.FILE_SIZE_LIMIT) # Get the workspace workspace = Workspace.objects.get(slug=slug) @@ -545,7 +577,7 @@ class ProjectAssetEndpoint(BaseAPIView): created_by=request.user, entity_type=entity_type, project_id=project_id, - **self.get_entity_id_fiekd(entity_type, entity_identifier), + **self.get_entity_id_field(entity_type, entity_identifier), ) # Get the presigned URL @@ -633,7 +665,6 @@ class ProjectAssetEndpoint(BaseAPIView): class ProjectBulkAssetEndpoint(BaseAPIView): - @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def post(self, request, slug, project_id, entity_id): asset_ids = request.data.get("asset_ids", []) diff --git a/apiserver/plane/app/views/issue/attachment.py b/apiserver/plane/app/views/issue/attachment.py index 521e7e7b28..55876dd557 100644 --- a/apiserver/plane/app/views/issue/attachment.py +++ b/apiserver/plane/app/views/issue/attachment.py @@ -20,6 +20,8 @@ from plane.db.models import FileAsset, Workspace from plane.bgtasks.issue_activities_task import issue_activity from plane.app.permissions import allow_permission, ROLE from plane.settings.storage import S3Storage +from plane.payment.flags.flag_decorator import check_workspace_feature_flag +from plane.payment.flags.flag import FeatureFlag class IssueAttachmentEndpoint(BaseAPIView): @@ -71,7 +73,6 @@ class IssueAttachmentEndpoint(BaseAPIView): notification=True, origin=request.META.get("HTTP_ORIGIN"), ) - return Response(status=status.HTTP_204_NO_CONTENT) @allow_permission( @@ -97,7 +98,27 @@ class IssueAttachmentV2Endpoint(BaseAPIView): def post(self, request, slug, project_id, issue_id): name = request.data.get("name") type = request.data.get("type", False) - size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) + size = request.data.get("size") + + # Check if the request is valid + if not name or not size: + return Response( + { + "error": "Invalid request.", + "status": False, + }, + status=status.HTTP_400_BAD_REQUEST, + ) + + # Check if the file size is greater than the limit + if check_workspace_feature_flag( + feature_key=FeatureFlag.FILE_SIZE_LIMIT_PRO, + slug=slug, + user_id=str(request.user.id), + ): + size_limit = min(size, settings.PRO_FILE_SIZE_LIMIT) + else: + size_limit = min(size, settings.FILE_SIZE_LIMIT) if not type or type not in settings.ATTACHMENT_MIME_TYPES: return Response( @@ -114,9 +135,6 @@ class IssueAttachmentV2Endpoint(BaseAPIView): # asset key asset_key = f"{workspace.id}/{uuid.uuid4().hex}-{name}" - # Get the size limit - size_limit = min(size, settings.FILE_SIZE_LIMIT) - # Create a File Asset asset = FileAsset.objects.create( attributes={ diff --git a/apiserver/plane/ee/views/app/cycle/active_cycle.py b/apiserver/plane/ee/views/app/cycle/active_cycle.py index f51c0aff63..e0635e2dd4 100644 --- a/apiserver/plane/ee/views/app/cycle/active_cycle.py +++ b/apiserver/plane/ee/views/app/cycle/active_cycle.py @@ -1,9 +1,5 @@ # Django imports -from django.db.models import ( - Exists, - OuterRef, - Prefetch, -) +from django.db.models import Exists, OuterRef, Prefetch, Q from django.utils import timezone # Module imports @@ -69,6 +65,15 @@ class WorkspaceActiveCycleEndpoint(BaseAPIView): .order_by("-is_favorite", "name") .distinct() ) + + active_cycles = active_cycles.filter( + ~Q( + project__project_projectmember__role=5, + project__project_projectmember__member=self.request.user, + project__project_projectmember__is_active=True, + ) + ) + return self.paginate( request=request, queryset=active_cycles, diff --git a/apiserver/plane/ee/views/space/views.py b/apiserver/plane/ee/views/space/views.py index 2f7ae30698..5e5391cf72 100644 --- a/apiserver/plane/ee/views/space/views.py +++ b/apiserver/plane/ee/views/space/views.py @@ -27,7 +27,7 @@ from plane.db.models import ( IssueVote, IssueView, IssueLink, - IssueAttachment, + FileAsset, ) from plane.utils.issue_filters import issue_filters from plane.ee.serializers import ( @@ -131,8 +131,9 @@ class IssueViewsPublicEndpoint(BaseAPIView): .values("count") ) .annotate( - attachment_count=IssueAttachment.objects.filter( - issue=OuterRef("id") + attachment_count=FileAsset.objects.filter( + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + entity_identifier=OuterRef("id"), ) .order_by() .annotate(count=Func(F("id"), function="Count")) diff --git a/apiserver/plane/graphql/mutations/issue.py b/apiserver/plane/graphql/mutations/issue.py index 8232d0303b..dc09435f1f 100644 --- a/apiserver/plane/graphql/mutations/issue.py +++ b/apiserver/plane/graphql/mutations/issue.py @@ -24,7 +24,7 @@ from plane.db.models import ( IssueAssignee, IssueLabel, Workspace, - IssueAttachment, + FileAsset, IssueSubscriber, ) @@ -291,9 +291,10 @@ class IssueAttachmentMutation: issue: strawberry.ID, attachment: strawberry.ID, ) -> bool: - issue_attachment = await sync_to_async(IssueAttachment.objects.get)( + issue_attachment = await sync_to_async(FileAsset.objects.get)( id=attachment, - issue_id=issue, + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + entity_identifier=issue, project_id=project, workspace__slug=slug, ) diff --git a/apiserver/plane/graphql/queries/attachment.py b/apiserver/plane/graphql/queries/attachment.py index f611ab9acf..7b6cf6abc1 100644 --- a/apiserver/plane/graphql/queries/attachment.py +++ b/apiserver/plane/graphql/queries/attachment.py @@ -9,7 +9,7 @@ from strawberry.types import Info from strawberry.permission import PermissionExtension # Module Imports -from plane.db.models import IssueAttachment +from plane.db.models import FileAsset from plane.graphql.types.attachment import IssueAttachmentType from plane.graphql.permissions.project import ProjectBasePermission @@ -28,8 +28,11 @@ class IssueAttachmentQuery: ) -> list[IssueAttachmentType]: issue_attachments = await sync_to_async(list)( - IssueAttachment.objects.filter( - issue_id=issue, workspace__slug=slug, project_id=project + FileAsset.objects.filter( + entity_identifier=issue, + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + workspace__slug=slug, + project_id=project, ) ) return issue_attachments diff --git a/apiserver/plane/graphql/types/attachment.py b/apiserver/plane/graphql/types/attachment.py index a1c24b220c..acb151fc1b 100644 --- a/apiserver/plane/graphql/types/attachment.py +++ b/apiserver/plane/graphql/types/attachment.py @@ -8,10 +8,10 @@ import strawberry_django from strawberry.scalars import JSON # Module Imports -from plane.db.models import IssueAttachment +from plane.db.models import FileAsset -@strawberry_django.type(IssueAttachment) +@strawberry_django.type(FileAsset) class IssueAttachmentType: id: strawberry.ID created_at: datetime @@ -24,7 +24,8 @@ class IssueAttachmentType: updated_by: strawberry.ID project: strawberry.ID workspace: strawberry.ID - issue: strawberry.ID + entity_identifier: strawberry.ID + entity_type: str @strawberry.field def workspace(self) -> int: @@ -36,7 +37,7 @@ class IssueAttachmentType: @strawberry.field def issue(self) -> int: - return self.issue_id + return self.entity_identifier @strawberry.field def created_by(self) -> int: diff --git a/apiserver/plane/payment/flags/flag.py b/apiserver/plane/payment/flags/flag.py index ce26d97b70..8a7ff62ee5 100644 --- a/apiserver/plane/payment/flags/flag.py +++ b/apiserver/plane/payment/flags/flag.py @@ -30,6 +30,8 @@ class FeatureFlag(Enum): PROJECT_GROUPING = "PROJECT_GROUPING" # Active cycle progress ACTIVE_CYCLE_PRO = "ACTIVE_CYCLE_PRO" + # Pro file size limit + FILE_SIZE_LIMIT_PRO = "FILE_SIZE_LIMIT_PRO" class AdminFeatureFlag(Enum): diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index 52a2bdb032..65c77d0d46 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -340,6 +340,7 @@ if bool(os.environ.get("SENTRY_DSN", False)) and os.environ.get( # Application Envs SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN", False) FILE_SIZE_LIMIT = int(os.environ.get("FILE_SIZE_LIMIT", 5242880)) +PRO_FILE_SIZE_LIMIT = int(os.environ.get("PRO_FILE_SIZE_LIMIT", 104857600)) # Unsplash Access key UNSPLASH_ACCESS_KEY = os.environ.get("UNSPLASH_ACCESS_KEY") diff --git a/packages/editor/src/core/components/editors/document/read-only-editor.tsx b/packages/editor/src/core/components/editors/document/read-only-editor.tsx index 37850dd115..2c411b5284 100644 --- a/packages/editor/src/core/components/editors/document/read-only-editor.tsx +++ b/packages/editor/src/core/components/editors/document/read-only-editor.tsx @@ -20,8 +20,8 @@ interface IDocumentReadOnlyEditor { containerClassName: string; displayConfig?: TDisplayConfig; editorClassName?: string; - fileHandler: Pick; embedHandler: TReadOnlyEmbedConfig; + fileHandler: Pick; tabIndex?: number; handleEditorReady?: (value: boolean) => void; mentionHandler: { diff --git a/space/ee/components/pages/main-content.tsx b/space/ee/components/pages/main-content.tsx index 013bed8502..d853aab160 100644 --- a/space/ee/components/pages/main-content.tsx +++ b/space/ee/components/pages/main-content.tsx @@ -6,6 +6,8 @@ import { FileText } from "lucide-react"; import { DocumentReadOnlyEditorWithRef, EditorRefApi } from "@plane/editor"; // ui import { Logo } from "@plane/ui"; +// helpers +import { getReadOnlyEditorFileHandlers } from "@/helpers/editor.helper"; // hooks import { usePublish } from "@/hooks/store"; import { useMention } from "@/hooks/use-mention"; @@ -63,6 +65,9 @@ export const PageDetailsMainContent: React.FC = observer((props) => { id={pageDetails.id} initialValue={pageDetails.description_html ?? "

"} containerClassName="p-0 pb-64 border-none" + fileHandler={getReadOnlyEditorFileHandlers({ + anchor, + })} mentionHandler={{ highlights: mentionHighlights, }} diff --git a/web/ee/components/active-cycles/cycle-stats.tsx b/web/ee/components/active-cycles/cycle-stats.tsx index 3f28c18df5..916fe4091c 100644 --- a/web/ee/components/active-cycles/cycle-stats.tsx +++ b/web/ee/components/active-cycles/cycle-stats.tsx @@ -21,11 +21,11 @@ import { EIssuesStoreType } from "@/constants/issue"; // helpers import { cn } from "@/helpers/common.helper"; import { renderFormattedDate, renderFormattedDateWithoutYear } from "@/helpers/date-time.helper"; +import { getFileURL } from "@/helpers/file.helper"; // hooks import { useIssues, useProjectState } from "@/hooks/store"; import useLocalStorage from "@/hooks/use-local-storage"; - export type ActiveCycleStatsProps = { workspaceSlug: string; projectId: string; @@ -165,7 +165,7 @@ export const ActiveCycleStats: FC = observer((props) => {
{ }} + onChange={() => {}} projectId={projectId?.toString() ?? ""} disabled buttonVariant="background-with-text" @@ -216,7 +216,10 @@ export const ActiveCycleStats: FC = observer((props) => { key={assignee.assignee_id} title={
- + {assignee.display_name}
diff --git a/web/ee/components/active-cycles/header.tsx b/web/ee/components/active-cycles/header.tsx index cf9b764c83..6717138397 100644 --- a/web/ee/components/active-cycles/header.tsx +++ b/web/ee/components/active-cycles/header.tsx @@ -6,6 +6,7 @@ import { ICycle, TCycleGroups } from "@plane/types"; import { Tooltip, CycleGroupIcon, getButtonStyling, Avatar, AvatarGroup } from "@plane/ui"; // helpers import { renderFormattedDate, findHowManyDaysLeft } from "@/helpers/date-time.helper"; +import { getFileURL } from "@/helpers/file.helper"; import { truncateText } from "@/helpers/string.helper"; // hooks import { useMember } from "@/hooks/store"; @@ -48,7 +49,7 @@ export const ActiveCycleHeader: FC = (props) => {
- + {cycleAssignee.length > 0 && ( @@ -56,7 +57,7 @@ export const ActiveCycleHeader: FC = (props) => { ))} diff --git a/web/ee/components/cycles/active-cycles/header.tsx b/web/ee/components/cycles/active-cycles/header.tsx new file mode 100644 index 0000000000..6ab4d11fea --- /dev/null +++ b/web/ee/components/cycles/active-cycles/header.tsx @@ -0,0 +1,80 @@ +import { FC } from "react"; +import Link from "next/link"; +// icons +import { UserCircle2 } from "lucide-react"; +// types +import { ICycle, TCycleGroups } from "@plane/types"; +// ui +import { Tooltip, CycleGroupIcon, getButtonStyling } from "@plane/ui"; +// helpers +import { renderFormattedDate, findHowManyDaysLeft } from "@/helpers/date-time.helper"; +import { getFileURL } from "@/helpers/file.helper"; +import { truncateText } from "@/helpers/string.helper"; +// hooks +import { useMember } from "@/hooks/store"; + +export type ActiveCycleHeaderProps = { + cycle: ICycle; + workspaceSlug: string; + projectId: string; +}; + +export const ActiveCycleHeader: FC = (props) => { + const { cycle, workspaceSlug, projectId } = props; + // store + const { getUserDetails } = useMember(); + const cycleOwnerDetails = cycle && cycle.owned_by_id ? getUserDetails(cycle.owned_by_id) : undefined; + + const daysLeft = findHowManyDaysLeft(cycle.end_date) ?? 0; + const currentCycleStatus = cycle?.status?.toLocaleLowerCase() as TCycleGroups; + return ( +
+
+ + +

{truncateText(cycle.name, 70)}

+
+ + + {`${daysLeft} ${daysLeft > 1 ? "days" : "day"} left`} + + +
+
+
+
+ + + Lead + +
+ {cycleOwnerDetails?.avatar_url && cycleOwnerDetails?.avatar_url !== "" ? ( + {cycleOwnerDetails?.display_name} + ) : ( + + {cycleOwnerDetails?.display_name.charAt(0)} + + )} + {cycleOwnerDetails?.display_name} +
+
+
+ + View Cycle + +
+
+ ); +}; diff --git a/web/ee/components/global/product-updates-modal.tsx b/web/ee/components/global/product-updates-modal.tsx index da08cc9595..3439a5e529 100644 --- a/web/ee/components/global/product-updates-modal.tsx +++ b/web/ee/components/global/product-updates-modal.tsx @@ -1,15 +1,18 @@ import { FC, useRef, useState } from "react"; import { observer } from "mobx-react-lite"; import Image from "next/image"; +import { useParams } from "next/navigation"; import useSWR from "swr"; import { ExternalLink, RefreshCw } from "lucide-react"; -// editor +// plane editor import { DocumentReadOnlyEditorWithRef, EditorRefApi } from "@plane/editor"; -// ui +// plane ui import { Button, EModalPosition, EModalWidth, getButtonStyling, ModalCore, setToast, TOAST_TYPE } from "@plane/ui"; -// helpers +// components import { LogoSpinner } from "@/components/common"; +// helpers import { cn } from "@/helpers/common.helper"; +import { getReadOnlyEditorFileHandlers } from "@/helpers/editor.helper"; // hooks import { useInstance } from "@/hooks/store"; // assets @@ -29,6 +32,8 @@ export const ProductUpdatesModal: FC = observer((props const { isOpen, handleClose } = props; // states const [isCheckingForUpdates, setIsCheckingForUpdates] = useState(false); + // params + const { workspaceSlug, projectId } = useParams(); // store const { isUpdateAvailable, updateInstanceInfo } = useInstance(); const { currentWorkspaceSubscribedPlanDetail: subscriptionDetail } = useWorkspaceSubscription(); @@ -137,6 +142,10 @@ export const ProductUpdatesModal: FC = observer((props id={data.id} initialValue={data.description_html ?? "

"} containerClassName="p-0 border-none" + fileHandler={getReadOnlyEditorFileHandlers({ + projectId: projectId?.toString() ?? "", + workspaceSlug: workspaceSlug?.toString() ?? "", + })} mentionHandler={{ highlights: () => Promise.resolve([]), }} diff --git a/web/ee/components/issues/worklog/activity/root.tsx b/web/ee/components/issues/worklog/activity/root.tsx index 7fc1b5491e..2b5d64ad95 100644 --- a/web/ee/components/issues/worklog/activity/root.tsx +++ b/web/ee/components/issues/worklog/activity/root.tsx @@ -12,6 +12,7 @@ import { renderFormattedDate, renderFormattedTime, } from "@/helpers/date-time.helper"; +import { getFileURL } from "@/helpers/file.helper"; // hooks import { useMember } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; @@ -69,9 +70,9 @@ export const IssueActivityWorklog: FC = observer((props) >
- {currentUser?.member?.avatar && currentUser?.member?.avatar !== "" ? ( + {currentUser?.member?.avatar_url && currentUser?.member?.avatar_url !== "" ? ( {currentUser?.member?.display_name}; isOpen: boolean; onClose: () => void; + projectId?: string; + workspaceSlug: string; }; const MENU_ITEMS: { @@ -93,15 +94,13 @@ const TONES_LIST = [ ]; export const EditorAIMenu: React.FC = (props) => { - const { editorRef, isOpen, onClose } = props; + const { editorRef, isOpen, onClose, projectId, workspaceSlug } = props; // states const [activeTask, setActiveTask] = useState(null); const [response, setResponse] = useState(undefined); const [isRegenerating, setIsRegenerating] = useState(false); // refs const responseContainerRef = useRef(null); - // params - const { workspaceSlug } = useParams(); const handleGenerateResponse = async (payload: TTaskPayload) => { if (!workspaceSlug) return; await aiService.performEditorTask(workspaceSlug.toString(), payload).then((res) => setResponse(res.response)); @@ -235,6 +234,8 @@ export const EditorAIMenu: React.FC = (props) => { initialValue={response} containerClassName="!p-0 border-none" editorClassName="!pl-0" + projectId={projectId} + workspaceSlug={workspaceSlug} />
diff --git a/web/ee/components/projects/layouts/board/utils.tsx b/web/ee/components/projects/layouts/board/utils.tsx index 7baf8abd48..1cb2312c18 100644 --- a/web/ee/components/projects/layouts/board/utils.tsx +++ b/web/ee/components/projects/layouts/board/utils.tsx @@ -3,6 +3,7 @@ import smoothScrollIntoView from "smooth-scroll-into-view-if-needed"; import { IWorkspace, IWorkspaceMember } from "@plane/types"; import { Avatar, PriorityIcon } from "@plane/ui"; +import { getFileURL } from "@/helpers/file.helper"; import { ProjectStateIcon } from "@/plane-web/components/workspace-project-states"; import { PROJECT_PRIORITY_MAP } from "@/plane-web/constants/project"; import { WORKSPACE_PROJECT_STATE_GROUPS } from "@/plane-web/constants/workspace-project-states"; @@ -82,7 +83,12 @@ export const groupDetails = ( return { title: memberDetails?.display_name || "Created By", icon: memberDetails ? ( - + ) : ( <> ), diff --git a/web/ee/components/projects/layouts/gallery/details.tsx b/web/ee/components/projects/layouts/gallery/details.tsx index 988d8a7e39..a6046fbd4f 100644 --- a/web/ee/components/projects/layouts/gallery/details.tsx +++ b/web/ee/components/projects/layouts/gallery/details.tsx @@ -16,6 +16,7 @@ import { import { Logo } from "@/components/common"; // constants // helpers +import { getFileURL } from "@/helpers/file.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper"; // hooks import { useProject, useUserPermissions } from "@/hooks/store"; @@ -140,10 +141,10 @@ const Details: React.FC = observer((props) => {
{project.name} = observer((props: Props) => > {lead ? ( <> - {lead.member.avatar && lead.member.avatar.trim() !== "" ? ( + {lead.member.avatar_url && lead.member.avatar_url.trim() !== "" ? ( {lead.member.display_name diff --git a/web/ee/components/worklogs/workspace/header/applied-filters/users.tsx b/web/ee/components/worklogs/workspace/header/applied-filters/users.tsx index fc13e7ae25..536eac2898 100644 --- a/web/ee/components/worklogs/workspace/header/applied-filters/users.tsx +++ b/web/ee/components/worklogs/workspace/header/applied-filters/users.tsx @@ -2,7 +2,10 @@ import { FC } from "react"; import { observer } from "mobx-react"; +// plane ui import { Avatar } from "@plane/ui"; +// helpers +import { getFileURL } from "@/helpers/file.helper"; // hooks import { useMember } from "@/hooks/store"; // plane web components @@ -46,7 +49,7 @@ export const WorkspaceWorklogAppliedFilterUsers: FC = obs
= (prop
= obs

Activate diff --git a/web/ee/constants/common.ts b/web/ee/constants/common.ts new file mode 100644 index 0000000000..d76be9cdaa --- /dev/null +++ b/web/ee/constants/common.ts @@ -0,0 +1 @@ +export const MAX_PRO_FILE_SIZE = 100 * 1024 * 1024; // 100MB diff --git a/web/ee/constants/issues.ts b/web/ee/constants/issues.ts index 00431b714a..0a3432e69e 100644 --- a/web/ee/constants/issues.ts +++ b/web/ee/constants/issues.ts @@ -47,4 +47,4 @@ export const filterActivityOnSelectedFilters = ( export { EActivityFilterType }; -export const ENABLE_LOCAL_DB_CACHE = true; +export const ENABLE_LOCAL_DB_CACHE = false; diff --git a/web/ee/hooks/store/use-flag.ts b/web/ee/hooks/store/use-flag.ts index a87ab48b8c..238fb4d255 100644 --- a/web/ee/hooks/store/use-flag.ts +++ b/web/ee/hooks/store/use-flag.ts @@ -22,6 +22,7 @@ export enum E_FEATURE_FLAGS { PROJECT_GROUPING = "PROJECT_GROUPING", ACTIVE_CYCLE_PRO = "ACTIVE_CYCLE_PRO", NO_LOAD = "NO_LOAD", + FILE_SIZE_LIMIT_PRO = "FILE_SIZE_LIMIT_PRO", // integrations SILO_INTEGRATION = "SILO_INTEGRATION", SILO_JIRA_INTEGRATION = "SILO_JIRA_INTEGRATION", diff --git a/web/ee/hooks/use-file-size.ts b/web/ee/hooks/use-file-size.ts index 715ab8b901..5ab3f212e0 100644 --- a/web/ee/hooks/use-file-size.ts +++ b/web/ee/hooks/use-file-size.ts @@ -1 +1,33 @@ -export * from "ce/hooks/use-file-size"; +import { useMemo } from "react"; +import { useParams } from "next/navigation"; +// constants +import { MAX_STATIC_FILE_SIZE } from "@/constants/common"; +// hooks +import { useInstance } from "@/hooks/store"; +// local constants +import { MAX_PRO_FILE_SIZE } from "../constants/common"; +// local hooks +import { useFlag, useWorkspaceSubscription } from "./store"; + +type TReturnProps = { + maxFileSize: number; +}; + +export const useFileSize = (): TReturnProps => { + // params + const { workspaceSlug } = useParams(); + // store hooks + const { config } = useInstance(); + const { currentWorkspaceSubscribedPlanDetail: planDetails } = useWorkspaceSubscription(); + // derived values + const isProPlanEnabled = useFlag(workspaceSlug?.toString() ?? "", "FILE_SIZE_LIMIT_PRO"); + + let maxFileSize: number | undefined = useMemo(() => config?.file_size_limit, [config?.file_size_limit]); + if (!planDetails?.is_self_managed && isProPlanEnabled) { + maxFileSize = MAX_PRO_FILE_SIZE; + } + + return { + maxFileSize: maxFileSize ?? MAX_STATIC_FILE_SIZE, + }; +}; diff --git a/web/ee/hooks/use-workspace-mention.ts b/web/ee/hooks/use-workspace-mention.ts index ee95636401..e50f9c7c68 100644 --- a/web/ee/hooks/use-workspace-mention.ts +++ b/web/ee/hooks/use-workspace-mention.ts @@ -75,7 +75,7 @@ export const useWorkspaceMention = (props: Props) => { type: "User", title: `${memberDetails?.display_name}`, subtitle: memberDetails?.email ?? "", - avatar: `${memberDetails?.avatar}`, + avatar: `${memberDetails?.avatar_url}`, redirect_uri: `/${workspaceSlug}/profile/${memberDetails?.id}`, })); } else { @@ -88,7 +88,7 @@ export const useWorkspaceMention = (props: Props) => { type: "User", title: `${memberDetails?.display_name}`, subtitle: memberDetails?.email ?? "", - avatar: `${memberDetails?.avatar}`, + avatar: `${memberDetails?.avatar_url}`, redirect_uri: `/${workspaceSlug}/profile/${memberDetails?.id}`, })); } diff --git a/web/next.config.js b/web/next.config.js index e5562d16bf..1cbc5509e3 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -92,7 +92,6 @@ const nextConfig = { destination: `${GOD_MODE_BASE_URL}/:path*`, }); } - return rewrites; }, }; diff --git a/yarn.lock b/yarn.lock index 56d1bbaedb..b7c43fdec1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1749,33 +1749,33 @@ "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" -"@hocuspocus/common@^2.13.6": - version "2.13.6" - resolved "https://registry.yarnpkg.com/@hocuspocus/common/-/common-2.13.6.tgz#952076654d2497a9c9de63e9a33b1b9307ccb294" - integrity sha512-jeEawHoaBckfbjMRPqjANjtQkeHgCBsk3XN7CEs/1jvUm60d86FT4y5fp3MWTEE18qkZacbZldn32za+72RBdg== +"@hocuspocus/common@^2.13.7": + version "2.13.7" + resolved "https://registry.yarnpkg.com/@hocuspocus/common/-/common-2.13.7.tgz#fe5530757f0937865e6188c633c9e52f997a1485" + integrity sha512-ROqYfW15XlAGd+qb/FVyp0zUC9Rosv7kdcck9LRMdfW3jT66wK9pDDWL2ily4Qj/zhbLCFtjAUPB4UKln/GYNQ== dependencies: lib0 "^0.2.87" "@hocuspocus/extension-database@^2.11.3": - version "2.13.6" - resolved "https://registry.yarnpkg.com/@hocuspocus/extension-database/-/extension-database-2.13.6.tgz#8d30b66348e58851bad691a8548d750ac0b50715" - integrity sha512-lFt9yKzQ8VeErPyaRvqJsoNa6rBFISq5FehqjblsfrfIZvOvBiVwsyc+3d5gQnnQmJJ0rShGCIuLRGJi+MmUaA== + version "2.13.7" + resolved "https://registry.yarnpkg.com/@hocuspocus/extension-database/-/extension-database-2.13.7.tgz#d71aee885a91a050efacf85c2fec763c8dae65db" + integrity sha512-GMSnluhmfpy3V+P8uCyR/dwh7nNqIERSAf+Jpkg0GVSeOuGdDuoWTJr+gkQWTAVDVMwNAqlp+ZLpzc0Y/L34mg== dependencies: - "@hocuspocus/server" "^2.13.6" + "@hocuspocus/server" "^2.13.7" "@hocuspocus/extension-logger@^2.11.3": - version "2.13.6" - resolved "https://registry.yarnpkg.com/@hocuspocus/extension-logger/-/extension-logger-2.13.6.tgz#32ac413ba2d44d433235c1d7a8516953f341111e" - integrity sha512-DQ1zBGFdRBCEmGfo3bcR2W3P/6SQmMmSYq4iqKB98U54901fKJz7cI+vrp6Xfr447Z1j2sfdlN9YTPaVMjv4rQ== + version "2.13.7" + resolved "https://registry.yarnpkg.com/@hocuspocus/extension-logger/-/extension-logger-2.13.7.tgz#22443cc4df445b923416e168633636ef5978943a" + integrity sha512-mjlY0RjocWg4Qe1uVVL5lYXQs9yy80/5vrSuHMh9oFaXGGBOiVM7sOoM2IWl9k3ehBvlCid1xgNnNkNIJKDOPw== dependencies: - "@hocuspocus/server" "^2.13.6" + "@hocuspocus/server" "^2.13.7" "@hocuspocus/extension-redis@^2.13.5": - version "2.13.6" - resolved "https://registry.yarnpkg.com/@hocuspocus/extension-redis/-/extension-redis-2.13.6.tgz#b1410b63b197ef863bee24c86565a215e000ed7b" - integrity sha512-9H2MpXsSbHEUPvRTkm7kxsD7Ia0G4JbM5L5klN9+RqUecOAnQknx7GUfvjr7/6PLGVEymXK2e+NJVCvrx6N9Vg== + version "2.13.7" + resolved "https://registry.yarnpkg.com/@hocuspocus/extension-redis/-/extension-redis-2.13.7.tgz#eaee70944b9446d1fd17c4b313b0f7624e0ba50e" + integrity sha512-th6fo7LfTQKgOenJHbW55PWPZTv95bGgiDh7zOr+WSIiyKPHKXv4dXYUN5e2lcKr2MV76FJYheaW5uNE1hnkDQ== dependencies: - "@hocuspocus/server" "^2.13.6" + "@hocuspocus/server" "^2.13.7" ioredis "^4.28.2" kleur "^4.1.4" lodash.debounce "^4.0.8" @@ -1783,21 +1783,21 @@ uuid "^10.0.0" "@hocuspocus/provider@^2.13.5": - version "2.13.6" - resolved "https://registry.yarnpkg.com/@hocuspocus/provider/-/provider-2.13.6.tgz#feef3a3732897a4e70262ce71299e8a0b42ccc68" - integrity sha512-84tBdGU8275SXQirRQ5FbBGwsQ6iLNuIbmV2SV6/f361phBoAVUSobJ+CYAzdIJPlfIYSL2BwGJSRbbDhqJdJw== + version "2.13.7" + resolved "https://registry.yarnpkg.com/@hocuspocus/provider/-/provider-2.13.7.tgz#2595a85b78318bf6f927247d9d76f18ee6bbcec1" + integrity sha512-BjZIIV8tWf/MD/8IcEMSFA+sW4wtR/M9MmhN+XSssYJOZxnszw44Gdwda23TmhsXvCV+qggS8lGEs+SfZSzEag== dependencies: - "@hocuspocus/common" "^2.13.6" + "@hocuspocus/common" "^2.13.7" "@lifeomic/attempt" "^3.0.2" lib0 "^0.2.87" ws "^8.17.1" -"@hocuspocus/server@^2.11.3", "@hocuspocus/server@^2.13.6": - version "2.13.6" - resolved "https://registry.yarnpkg.com/@hocuspocus/server/-/server-2.13.6.tgz#a39b0eef7cdb4cf23aaf3abb032d330fdd90e273" - integrity sha512-VqiHkkQlfa2A5mFTe+rdePLt3kHJrk9ZzqDqWJfqQDlYHdyAXpW53cddsXYYDWQ/tZjYj3zQgZAT+78AHrnb/A== +"@hocuspocus/server@^2.11.3", "@hocuspocus/server@^2.13.7": + version "2.13.7" + resolved "https://registry.yarnpkg.com/@hocuspocus/server/-/server-2.13.7.tgz#e794382952337110c3283ee31bbf2db610b33596" + integrity sha512-D9juGX9NZoKT9/Ty/HGhaimHJe71DyKbYssC831oetYF33x3WSYV6GY82RhHo9xjKZE6r0Le7jgxgQb+u08slw== dependencies: - "@hocuspocus/common" "^2.13.6" + "@hocuspocus/common" "^2.13.7" async-lock "^1.3.1" kleur "^4.1.4" lib0 "^0.2.47" @@ -2136,62 +2136,62 @@ prop-types "^15.8.1" react-is "^18.3.1" -"@next/env@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.14.tgz#08f5175dab727102da02301ba61f7239773670fa" - integrity sha512-/0hWQfiaD5//LvGNgc8PjvyqV50vGK0cADYzaoOOGN8fxzBn3iAiaq3S0tCRnFBldq0LVveLcxCTi41ZoYgAgg== +"@next/env@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.15.tgz#06d984e37e670d93ddd6790af1844aeb935f332f" + integrity sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ== -"@next/eslint-plugin-next@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.14.tgz#091581faecd7f2c434b2ba85dbe935d743d542a2" - integrity sha512-kV+OsZ56xhj0rnTn6HegyTGkoa16Mxjrpk7pjWumyB2P8JVQb8S9qtkjy/ye0GnTr4JWtWG4x/2qN40lKZ3iVQ== +"@next/eslint-plugin-next@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.15.tgz#796ae942a95b859e1add58e5b7ae78cfd55d59bb" + integrity sha512-pKU0iqKRBlFB/ocOI1Ip2CkKePZpYpnw5bEItEkuZ/Nr9FQP1+p7VDWr4VfOdff4i9bFmrOaeaU1bFEyAcxiMQ== dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.14.tgz#6dde2dac699dfe948b527385f2b350b3151989f4" - integrity sha512-bsxbSAUodM1cjYeA4o6y7sp9wslvwjSkWw57t8DtC8Zig8aG8V6r+Yc05/9mDzLKcybb6EN85k1rJDnMKBd9Gw== +"@next/swc-darwin-arm64@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.15.tgz#6386d585f39a1c490c60b72b1f76612ba4434347" + integrity sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA== -"@next/swc-darwin-x64@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.14.tgz#25800213c4dc0f8cd765c88073d28a3144698e31" - integrity sha512-cC9/I+0+SK5L1k9J8CInahduTVWGMXhQoXFeNvF0uNs3Bt1Ub0Azb8JzTU9vNCr0hnaMqiWu/Z0S1hfKc3+dww== +"@next/swc-darwin-x64@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.15.tgz#b7baeedc6a28f7545ad2bc55adbab25f7b45cb89" + integrity sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg== -"@next/swc-linux-arm64-gnu@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.14.tgz#9c66bd1287d0c3633e7bf354f9c01e1b79747615" - integrity sha512-RMLOdA2NU4O7w1PQ3Z9ft3PxD6Htl4uB2TJpocm+4jcllHySPkFaUIFacQ3Jekcg6w+LBaFvjSPthZHiPmiAUg== +"@next/swc-linux-arm64-gnu@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.15.tgz#fa13c59d3222f70fb4cb3544ac750db2c6e34d02" + integrity sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw== -"@next/swc-linux-arm64-musl@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.14.tgz#da2ae16a24bb2b2a46447154e95da85c557ab09a" - integrity sha512-WgLOA4hT9EIP7jhlkPnvz49iSOMdZgDJVvbpb8WWzJv5wBD07M2wdJXLkDYIpZmCFfo/wPqFsFR4JS4V9KkQ2A== +"@next/swc-linux-arm64-musl@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.15.tgz#30e45b71831d9a6d6d18d7ac7d611a8d646a17f9" + integrity sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ== -"@next/swc-linux-x64-gnu@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.14.tgz#635c62109b9cf0464e6322955a36931ebb9ed3e2" - integrity sha512-lbn7svjUps1kmCettV/R9oAvEW+eUI0lo0LJNFOXoQM5NGNxloAyFRNByYeZKL3+1bF5YE0h0irIJfzXBq9Y6w== +"@next/swc-linux-x64-gnu@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.15.tgz#5065db17fc86f935ad117483f21f812dc1b39254" + integrity sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA== -"@next/swc-linux-x64-musl@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.14.tgz#1565caf6fa77c3280d8b05ffc8c542ff144a4855" - integrity sha512-7TcQCvLQ/hKfQRgjxMN4TZ2BRB0P7HwrGAYL+p+m3u3XcKTraUFerVbV3jkNZNwDeQDa8zdxkKkw2els/S5onQ== +"@next/swc-linux-x64-musl@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.15.tgz#3c4a4568d8be7373a820f7576cf33388b5dab47e" + integrity sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ== -"@next/swc-win32-arm64-msvc@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.14.tgz#8df4feb3c9280155e9299f3cdfa32f3cface336a" - integrity sha512-8i0Ou5XjTLEje0oj0JiI0Xo9L/93ghFtAUYZ24jARSeTMXLUx8yFIdhS55mTExq5Tj4/dC2fJuaT4e3ySvXU1A== +"@next/swc-win32-arm64-msvc@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.15.tgz#fb812cc4ca0042868e32a6a021da91943bb08b98" + integrity sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g== -"@next/swc-win32-ia32-msvc@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.14.tgz#1f0a2bafbb63147c8db102ca1524db9ffa959d0c" - integrity sha512-2u2XcSaDEOj+96eXpyjHjtVPLhkAFw2nlaz83EPeuK4obF+HmtDJHqgR1dZB7Gb6V/d55FL26/lYVd0TwMgcOQ== +"@next/swc-win32-ia32-msvc@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.15.tgz#ec26e6169354f8ced240c1427be7fd485c5df898" + integrity sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ== -"@next/swc-win32-x64-msvc@14.2.14": - version "14.2.14" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.14.tgz#9d6446b3a8d5e67e199049d59ce7c0b8bd33ab51" - integrity sha512-MZom+OvZ1NZxuRovKt1ApevjiUJTcU2PmdJKL66xUPaJeRywnbGGRWUlaAOwunD6dX+pm83vj979NTC8QXjGWg== +"@next/swc-win32-x64-msvc@14.2.15": + version "14.2.15" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.15.tgz#18d68697002b282006771f8d92d79ade9efd35c4" + integrity sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -6498,10 +6498,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== core-js-compat@^3.38.0, core-js-compat@^3.38.1: version "3.38.1" @@ -7404,9 +7404,9 @@ es-get-iterator@^1.1.3: stop-iteration-iterator "^1.0.0" es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" + integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -7415,12 +7415,12 @@ es-iterator-helpers@^1.0.19: es-set-tostringtag "^2.0.3" function-bind "^1.1.2" get-intrinsic "^1.2.4" - globalthis "^1.0.3" + globalthis "^1.0.4" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" internal-slot "^1.0.7" - iterator.prototype "^1.1.2" + iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" es-module-lexer@^1.2.1, es-module-lexer@^1.5.0: @@ -7586,11 +7586,11 @@ escodegen@^2.1.0: source-map "~0.6.1" eslint-config-next@^14.1.0: - version "14.2.14" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.14.tgz#b2b5dedadd4afe20e2103b0ec44eb2f1d211fc63" - integrity sha512-TXwyjGICAlWC9O0OufS3koTsBKQH8l1xt3SY/aDuvtKHIwjTHplJKWVb1WOEX0OsDaxGbFXmfD2EY1sNfG0Y/w== + version "14.2.15" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.15.tgz#ff9661835eaf9f2ef1717ace55073a8f71037fab" + integrity sha512-mKg+NC/8a4JKLZRIOBplxXNdStgxy7lzWuedUaCc8tev+Al9mwDUTujQH6W6qXDH9kycWiVo28tADWGvpBsZcQ== dependencies: - "@next/eslint-plugin-next" "14.2.14" + "@next/eslint-plugin-next" "14.2.15" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -7957,16 +7957,16 @@ express-ws@^5.0.2: ws "^7.4.6" express@^4.19.2, express@^4.20.0: - version "4.21.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" - integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== + version "4.21.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" + integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.6.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -8534,7 +8534,7 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globalthis@^1.0.3: +globalthis@^1.0.3, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -9319,7 +9319,7 @@ isomorphic.js@^0.2.4: resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== -iterator.prototype@^1.1.2: +iterator.prototype@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== @@ -10342,11 +10342,11 @@ next-themes@^0.2.1: integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== next@^14.2.12: - version "14.2.14" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.14.tgz#115f29443dfb96d23b4b5ab5c4547de339202ba7" - integrity sha512-Q1coZG17MW0Ly5x76shJ4dkC23woLAhhnDnw+DfTc7EpZSGuWrlsZ3bZaO8t6u1Yu8FVfhkqJE+U8GC7E0GLPQ== + version "14.2.15" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.15.tgz#348e5603e22649775d19c785c09a89c9acb5189a" + integrity sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw== dependencies: - "@next/env" "14.2.14" + "@next/env" "14.2.15" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -10354,15 +10354,15 @@ next@^14.2.12: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.14" - "@next/swc-darwin-x64" "14.2.14" - "@next/swc-linux-arm64-gnu" "14.2.14" - "@next/swc-linux-arm64-musl" "14.2.14" - "@next/swc-linux-x64-gnu" "14.2.14" - "@next/swc-linux-x64-musl" "14.2.14" - "@next/swc-win32-arm64-msvc" "14.2.14" - "@next/swc-win32-ia32-msvc" "14.2.14" - "@next/swc-win32-x64-msvc" "14.2.14" + "@next/swc-darwin-arm64" "14.2.15" + "@next/swc-darwin-x64" "14.2.15" + "@next/swc-linux-arm64-gnu" "14.2.15" + "@next/swc-linux-arm64-musl" "14.2.15" + "@next/swc-linux-x64-gnu" "14.2.15" + "@next/swc-linux-x64-musl" "14.2.15" + "@next/swc-win32-arm64-msvc" "14.2.15" + "@next/swc-win32-ia32-msvc" "14.2.15" + "@next/swc-win32-x64-msvc" "14.2.15" no-case@^3.0.4: version "3.0.4" @@ -13503,9 +13503,9 @@ typescript@^4.7.2: integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^5.2.2, typescript@^5.3.3: - version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" - integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0"