diff --git a/.claude/skills/pr-description.md b/.claude/skills/pr-description.md new file mode 100644 index 00000000000..bfbfa78ba9d --- /dev/null +++ b/.claude/skills/pr-description.md @@ -0,0 +1,58 @@ +--- +name: pr-description +description: Generate a PR description following the project's GitHub PR template. Analyzes the current branch's changes against the base branch to produce a complete, filled-out PR description. +user_invocable: true +--- + +# PR Description Generator + +Generate a pull request description based on the project's PR template at `.github/pull_request_template.md`. + +## Steps + +1. **Determine the base branch**: Prefer the PR's actual `baseRefName` (via `gh pr view --json baseRefName`) when a PR exists. Otherwise default by intent — feature PRs target `preview`, release PRs target `master`. If still ambiguous, ask the user. + +2. **Analyze changes**: Run the following to understand what changed: + - `git log ...HEAD --oneline` to see all commits on this branch + - `git diff ...HEAD --stat` to see which files changed + - `git diff ...HEAD` to read the actual diff (use `--no-color`) + - If the diff is very large, focus on the most important files first + +3. **Fill out the PR template** with the following sections: + + ### Description + + Write a clear, concise summary of what the PR does and why. Focus on the "what" and "why", not line-by-line changes. Mention any important implementation decisions. + + ### Type of Change + + Check the appropriate box(es) based on the changes: + - Bug fix (non-breaking change which fixes an issue) + - Feature (non-breaking change which adds functionality) + - Improvement (non-breaking change that improves existing functionality) + - Code refactoring + - Performance improvements + - Documentation update + + ### Screenshots and Media + + Leave this section for the user to fill in, preserving the existing placeholder comment from `.github/pull_request_template.md` verbatim rather than introducing different text. + + ### Test Scenarios + + Based on the code changes, suggest specific test scenarios that should be verified. Be concrete (e.g., "Navigate to project settings and verify the new toggle works") rather than generic. + + ### References + - If commit messages or branch name reference a work item identifier (e.g., `WEB-1234`), include it + - If the user provides a linked issue, include it + - If Sentry issue links or IDs (e.g., `SENTRY-ABC123`, Sentry URLs) were mentioned earlier in the conversation, include them as references + +4. **Output format**: Print the filled-out markdown template so the user can copy it directly. Do NOT wrap it in a code fence — output the raw markdown. + +## Guidelines + +- Keep the description concise but informative +- Use bullet points for multiple changes +- Focus on user-facing impact, not implementation details +- If the branch has a Plane work item ID in its name (e.g., `WEB-1234`), reference it +- Don't fabricate test scenarios that aren't relevant to the actual changes diff --git a/.claude/skills/release-notes.md b/.claude/skills/release-notes.md new file mode 100644 index 00000000000..af8a7680e72 --- /dev/null +++ b/.claude/skills/release-notes.md @@ -0,0 +1,147 @@ +--- +name: release-notes +description: "Generate release notes for a Plane release PR in `makeplane/plane` (semver, e.g. `release: vX.Y.Z`). Reads PR commits, filters out noise, categorizes by conventional-commit type, optionally enriches via Plane MCP, and writes the result as the PR description." +user_invocable: true +--- + +# Release Notes Generator + +Generate structured release notes from a Plane release PR by parsing its commit list, then update the PR description. + +## Versioning + +Plane community uses **semver** (`vX.Y.Z`, major.minor.patch) for releases. + +- PR title format: `release: vX.Y.Z` +- Source branch: `canary` +- Target branch: `master` + +## When to Use + +- User links/mentions a Plane release PR (e.g. `release: v1.3.0`) and asks for release notes +- User asks to "create release notes" / "update PR description" for a release PR in `makeplane/plane` +- The branch is named `canary` or `release/x.y.z` and the base is `master` + +## Steps + +### 1. Fetch commits + +```bash +gh pr view --json title,body,baseRefName,headRefName,commits \ + --jq '.commits[] | .messageHeadline + "\n---BODY---\n" + .messageBody + "\n===END==="' +``` + +For a quick scan first: + +```bash +gh pr view --json commits \ + --jq '.commits[] | {oid: .oid[0:10], message: .messageHeadline}' +``` + +### 2. Filter out noise + +**Always exclude** these commits — mechanical, not user-facing: + +| Pattern | Reason | +| -------------------------------------------- | -------------- | +| `fix: merge conflicts` | Merge artifact | +| `Merge branch '...' of github.com:...` | Merge artifact | +| `Revert "..."` (when immediately re-applied) | Internal churn | + +### 3. Parse work item IDs + +Most meaningful commits begin with a Plane work item identifier in brackets: + +- `[WEB-XXXX]` — web/frontend product items +- `[SILO-XXXX]` — Silo (integrations: Slack, GitHub, GitLab, Jira/Linear) +- `[MOBILE-XXXX]`, `[API-XXXX]`, etc. + +Always preserve these IDs in the release notes — they let readers click through to the source ticket. + +### 4. (Optional) Enrich via Plane MCP + +For larger features where the commit headline is terse, fetch the work item: + +```text +mcp__plane__retrieve_work_item_by_identifier(project_identifier="WEB", issue_identifier=6874) +``` + +Use the returned `name` and `description_stripped` to flesh out the bullet. Skip this for routine fixes — commit body is usually enough. Don't enrich every item (slow + work item descriptions are often empty). + +### 5. Categorize by conventional-commit type + +| Commit prefix | Section | +| -------------------------------- | ------------------- | +| `feat:`, `feat(scope):` | ✨ New Features | +| `fix:`, `fix(scope):` | 🐛 Bug Fixes | +| `refactor:` | 🔧 Refactor & Chore | +| `chore:`, `chore(scope):` | 🔧 Refactor & Chore | +| `chore(deps):`, dependabot bumps | 📦 Dependencies | + +### 6. Format + +```markdown +# Release vX.Y.Z + +## ✨ New Features + +- **** — [WEB-XXXX] (#PR_NUM) + Optional 1–2 sentence elaboration drawn from commit body. + +## 🐛 Bug Fixes + +- **** — [WEB-XXXX] (#PR_NUM) + +## 🔧 Refactor & Chore + +- **** — [WEB-XXXX] (#PR_NUM) + +## 📦 Dependencies + +- Bump `` X.Y.Z → A.B.C (#PR_NUM) +``` + +Rules: + +- Lead with a bold human-readable title (rewrite the commit subject if cryptic) +- Always include the work item ID in brackets and the merge PR number in parens +- Add a sub-line elaboration only when the commit body has substance worth surfacing (acceptance criteria, scope notes, gotchas like "behind feature flag", "requires migration", "requires Vercel setting") +- Drop empty sections + +### 7. Update the PR description + +```bash +gh pr edit --body "$(cat <<'EOF' + +EOF +)" +``` + +Always use a HEREDOC with single-quoted `'EOF'` so backticks/dollars in the notes are preserved. + +## Quick Reference: end-to-end + +```bash +PR=2498 +gh pr view $PR --json commits --jq '.commits[] | .messageHeadline + "\n---\n" + .messageBody + "\n==="' > /tmp/commits.txt +# read /tmp/commits.txt, filter, categorize, draft notes +gh pr edit $PR --body "$(cat <<'EOF' +... release notes ... +EOF +)" +``` + +## Common Mistakes + +- **Including `fix: merge conflicts`** — merge artifact, no functional content +- **Dropping the work item ID** — readers rely on `[WEB-XXXX]` to navigate to the ticket +- **Over-enriching with MCP lookups** — work item descriptions are often empty; commit body is usually richer +- **Missing the merge PR number** — always include `(#NNNN)` from the commit subject so reviewers can audit the source PR +- **Using `--body` without HEREDOC** — backticks/dollar signs get shell-interpreted and corrupt the notes +- **Editing the title** — release PR titles are version markers; only edit the body + +## Plane-Specific Conventions + +- Release PRs go from `canary` → `master` +- PR title format: `release: vX.Y.Z` semver (major.minor.patch) +- Commits coming from feature branches always carry a work item ID; commits without one are usually infra/chores diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a645c192ff3..9414b09008b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -16,6 +16,9 @@ jobs: contents: read security-events: write + env: + CODEQL_ACTION_FILE_COVERAGE_ON_PRS: "false" + strategy: fail-fast: false matrix: diff --git a/CODEOWNERS b/CODEOWNERS index 11c7335b578..8adbaa17197 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1,8 @@ -eslint.config.mjs @lifeiscontent \ No newline at end of file +.oxlintrc.json @sriramveeraghanta @lifeiscontent +.oxfmtrc.json @sriramveeraghanta @lifeiscontent +apps/api/ @dheeru0198 @pablohashescobar +apps/web/ @sriramveeraghanta +apps/space/ @sriramveeraghanta +apps/admin/ @sriramveeraghanta +apps/live/ @Palanikannan1437 +deployments/ @mguptahub \ No newline at end of file diff --git a/README.md b/README.md index d2117149da6..74688cd92c4 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@

WebsiteForum • - Twitter • + XDocumentation

diff --git a/apps/admin/app/(all)/(dashboard)/general/form.tsx b/apps/admin/app/(all)/(dashboard)/general/form.tsx index 0b402b76c7a..e38d7848eb7 100644 --- a/apps/admin/app/(all)/(dashboard)/general/form.tsx +++ b/apps/admin/app/(all)/(dashboard)/general/form.tsx @@ -16,8 +16,6 @@ import { Input, ToggleSwitch } from "@plane/ui"; import { ControllerInput } from "@/components/common/controller-input"; // hooks import { useInstance } from "@/hooks/store"; -// components -import { IntercomConfig } from "./intercom"; export interface IGeneralConfigurationForm { instance: IInstance; @@ -27,14 +25,13 @@ export interface IGeneralConfigurationForm { export const GeneralConfigurationForm = observer(function GeneralConfigurationForm(props: IGeneralConfigurationForm) { const { instance, instanceAdmins } = props; // hooks - const { instanceConfigurations, updateInstanceInfo, updateInstanceConfigurations } = useInstance(); + const { updateInstanceInfo } = useInstance(); // form data const { handleSubmit, control, formState: { errors, isSubmitting }, - watch, } = useForm>({ defaultValues: { instance_name: instance?.instance_name, @@ -45,17 +42,6 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo const onSubmit = async (formData: Partial) => { const payload: Partial = { ...formData }; - // update the intercom configuration - const isIntercomEnabled = - instanceConfigurations?.find((config) => config.key === "IS_INTERCOM_ENABLED")?.value === "1"; - if (!payload.is_telemetry_enabled && isIntercomEnabled) { - try { - await updateInstanceConfigurations({ IS_INTERCOM_ENABLED: "0" }); - } catch (error) { - console.error(error); - } - } - await updateInstanceInfo(payload) .then(() => setToast({ @@ -112,8 +98,7 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo
-
Chat + telemetry
- +
Telemetry
diff --git a/apps/admin/app/(all)/(dashboard)/general/intercom.tsx b/apps/admin/app/(all)/(dashboard)/general/intercom.tsx deleted file mode 100644 index 656e2d69022..00000000000 --- a/apps/admin/app/(all)/(dashboard)/general/intercom.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { useState } from "react"; -import { observer } from "mobx-react"; -import useSWR from "swr"; -import { MessageSquare } from "lucide-react"; -import type { IFormattedInstanceConfiguration } from "@plane/types"; -import { ToggleSwitch } from "@plane/ui"; -// hooks -import { useInstance } from "@/hooks/store"; - -type TIntercomConfig = { - isTelemetryEnabled: boolean; -}; - -export const IntercomConfig = observer(function IntercomConfig(props: TIntercomConfig) { - const { isTelemetryEnabled } = props; - // hooks - const { instanceConfigurations, updateInstanceConfigurations, fetchInstanceConfigurations } = useInstance(); - // states - const [isSubmitting, setIsSubmitting] = useState(false); - - // derived values - const isIntercomEnabled = isTelemetryEnabled - ? instanceConfigurations - ? instanceConfigurations?.find((config) => config.key === "IS_INTERCOM_ENABLED")?.value === "1" - ? true - : false - : undefined - : false; - - const { isLoading } = useSWR(isTelemetryEnabled ? "INSTANCE_CONFIGURATIONS" : null, () => - isTelemetryEnabled ? fetchInstanceConfigurations() : null - ); - - const initialLoader = isLoading && isIntercomEnabled === undefined; - - const submitInstanceConfigurations = async (payload: Partial) => { - try { - await updateInstanceConfigurations(payload); - } catch (error) { - console.error(error); - } finally { - setIsSubmitting(false); - } - }; - - const enableIntercomConfig = () => { - void submitInstanceConfigurations({ IS_INTERCOM_ENABLED: isIntercomEnabled ? "0" : "1" }); - }; - - return ( - <> -
-
-
-
- -
-
- -
-
Chat with us
-
- Let your users chat with us via Intercom or another service. Toggling Telemetry off turns this off - automatically. -
-
- -
- -
-
-
- - ); -}); diff --git a/apps/admin/package.json b/apps/admin/package.json index 8a492643a5e..e9cf80d5ea3 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -1,6 +1,6 @@ { "name": "admin", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Admin UI for Plane", "license": "AGPL-3.0", diff --git a/apps/api/package.json b/apps/api/package.json index 99f5de98794..082853e24a2 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "plane-api", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "API server powering Plane's backend", "license": "AGPL-3.0" diff --git a/apps/api/plane/api/serializers/issue.py b/apps/api/plane/api/serializers/issue.py index 6468ddbc84f..048de6e92b1 100644 --- a/apps/api/plane/api/serializers/issue.py +++ b/apps/api/plane/api/serializers/issue.py @@ -480,44 +480,52 @@ class Meta: ] +class IssueRelationRefSerializer(serializers.Serializer): + """Project-scoped reference to a related work item.""" + + project_id = serializers.UUIDField(help_text="Project containing the related work item") + issue_id = serializers.UUIDField(help_text="ID of the related work item") + + class IssueRelationResponseSerializer(serializers.Serializer): """ Serializer for issue relations response showing grouped relation types. - Returns issue IDs organized by relation type for efficient client-side processing. + Each list contains project_id and issue_id pairs so clients can resolve + cross-project relations. """ blocking = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that are blocking this issue", + child=IssueRelationRefSerializer(), + help_text="Work items blocking this issue", ) blocked_by = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that this issue is blocked by", + child=IssueRelationRefSerializer(), + help_text="Work items this issue is blocked by", ) duplicate = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that are duplicates of this issue", + child=IssueRelationRefSerializer(), + help_text="Duplicate work items", ) relates_to = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that relate to this issue", + child=IssueRelationRefSerializer(), + help_text="Related work items", ) start_after = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that start after this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that start after this issue", ) start_before = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that start before this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that start before this issue", ) finish_after = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that finish after this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that finish after this issue", ) finish_before = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that finish before this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that finish before this issue", ) diff --git a/apps/api/plane/api/views/asset.py b/apps/api/plane/api/views/asset.py index 88c34c37cad..72ce60e6819 100644 --- a/apps/api/plane/api/views/asset.py +++ b/apps/api/plane/api/views/asset.py @@ -17,6 +17,7 @@ # Module Imports from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename from plane.db.models import FileAsset, User, Workspace from plane.api.views.base import BaseAPIView from plane.api.serializers import ( @@ -114,7 +115,7 @@ def post(self, request): This endpoint generates the necessary credentials for direct S3 upload. """ # get the asset key - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) @@ -287,7 +288,7 @@ def post(self, request): necessary credentials for direct S3 upload with server-side authentication. """ # get the asset key - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) @@ -498,7 +499,7 @@ def post(self, request, slug): Create a presigned URL for uploading generic assets that can be bound to entities like work items. Supports various file types and includes external source tracking for integrations. """ - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) type = request.data.get("type") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) project_id = request.data.get("project_id") diff --git a/apps/api/plane/api/views/issue.py b/apps/api/plane/api/views/issue.py index 97e8e7cee0a..b48be56d413 100644 --- a/apps/api/plane/api/views/issue.py +++ b/apps/api/plane/api/views/issue.py @@ -23,11 +23,8 @@ Value, When, Subquery, - UUIDField, ) -from django.db.models.functions import Coalesce -from django.contrib.postgres.aggregates import ArrayAgg -from django.contrib.postgres.fields import ArrayField + from django.utils import timezone from django.conf import settings @@ -82,6 +79,7 @@ Workspace, ) from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from .base import BaseAPIView from plane.utils.host import base_host @@ -1861,7 +1859,7 @@ def post(self, request, slug, project_id, issue_id): status=status.HTTP_403_FORBIDDEN, ) - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) type = request.data.get("type", False) size = request.data.get("size") external_id = request.data.get("external_id") @@ -2292,14 +2290,35 @@ class IssueRelationListCreateAPIEndpoint(BaseAPIView): name="Work Item Relations Response", value={ "blocking": [ - "550e8400-e29b-41d4-a716-446655440000", - "550e8400-e29b-41d4-a716-446655440001", + { + "project_id": "550e8400-e29b-41d4-a716-446655440010", + "issue_id": "550e8400-e29b-41d4-a716-446655440000", + }, + { + "project_id": "550e8400-e29b-41d4-a716-446655440010", + "issue_id": "550e8400-e29b-41d4-a716-446655440001", + }, + ], + "blocked_by": [ + { + "project_id": "550e8400-e29b-41d4-a716-446655440011", + "issue_id": "550e8400-e29b-41d4-a716-446655440002", + }, ], - "blocked_by": ["550e8400-e29b-41d4-a716-446655440002"], "duplicate": [], - "relates_to": ["550e8400-e29b-41d4-a716-446655440003"], + "relates_to": [ + { + "project_id": "550e8400-e29b-41d4-a716-446655440010", + "issue_id": "550e8400-e29b-41d4-a716-446655440003", + }, + ], "start_after": [], - "start_before": ["550e8400-e29b-41d4-a716-446655440004"], + "start_before": [ + { + "project_id": "550e8400-e29b-41d4-a716-446655440012", + "issue_id": "550e8400-e29b-41d4-a716-446655440004", + }, + ], "finish_after": [], "finish_before": [], }, @@ -2316,42 +2335,81 @@ def get(self, request, slug, project_id, issue_id): Retrieve all relationships for a work item organized by relation type. Returns a structured response with relations grouped by type. """ - empty_uuid_array = Value([], output_field=ArrayField(UUIDField())) - - def _agg_ids(field, **filter_kwargs): - return Coalesce( - ArrayAgg(field, filter=Q(**filter_kwargs), distinct=True), - empty_uuid_array, - ) - - issue_relation_qs = IssueRelation.objects.filter( + relations = IssueRelation.objects.filter( Q(issue_id=issue_id) | Q(related_issue_id=issue_id), workspace__slug=slug, - ) - - relation_ids = issue_relation_qs.aggregate( - blocking_ids=_agg_ids("issue_id", relation_type="blocked_by", related_issue_id=issue_id), - blocked_by_ids=_agg_ids("related_issue_id", relation_type="blocked_by", issue_id=issue_id), - duplicate_ids=_agg_ids("related_issue_id", relation_type="duplicate", issue_id=issue_id), - duplicate_ids_related=_agg_ids("issue_id", relation_type="duplicate", related_issue_id=issue_id), - relates_to_ids=_agg_ids("related_issue_id", relation_type="relates_to", issue_id=issue_id), - relates_to_ids_related=_agg_ids("issue_id", relation_type="relates_to", related_issue_id=issue_id), - start_after_ids=_agg_ids("issue_id", relation_type="start_before", related_issue_id=issue_id), - start_before_ids=_agg_ids("related_issue_id", relation_type="start_before", issue_id=issue_id), - finish_after_ids=_agg_ids("issue_id", relation_type="finish_before", related_issue_id=issue_id), - finish_before_ids=_agg_ids("related_issue_id", relation_type="finish_before", issue_id=issue_id), + ).values( + "relation_type", + "issue_id", + "related_issue_id", + issue_project_id=F("issue__project_id"), + related_issue_project_id=F("related_issue__project_id"), ) response_data = { - "blocking": relation_ids["blocking_ids"], - "blocked_by": relation_ids["blocked_by_ids"], - "duplicate": list(set(relation_ids["duplicate_ids"] + relation_ids["duplicate_ids_related"])), - "relates_to": list(set(relation_ids["relates_to_ids"] + relation_ids["relates_to_ids_related"])), - "start_after": relation_ids["start_after_ids"], - "start_before": relation_ids["start_before_ids"], - "finish_after": relation_ids["finish_after_ids"], - "finish_before": relation_ids["finish_before_ids"], + "blocking": [], + "blocked_by": [], + "duplicate": [], + "relates_to": [], + "start_after": [], + "start_before": [], + "finish_after": [], + "finish_before": [], } + seen_duplicate = set() + seen_relates_to = set() + + for rel in relations: + rt = rel["relation_type"] + if rt == "blocked_by": + if str(rel["related_issue_id"]) == str(issue_id): + response_data["blocking"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + if str(rel["issue_id"]) == str(issue_id): + response_data["blocked_by"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + elif rt == "duplicate": + if str(rel["issue_id"]) == str(issue_id) and rel["related_issue_id"] not in seen_duplicate: + seen_duplicate.add(rel["related_issue_id"]) + response_data["duplicate"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + if str(rel["related_issue_id"]) == str(issue_id) and rel["issue_id"] not in seen_duplicate: + seen_duplicate.add(rel["issue_id"]) + response_data["duplicate"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + elif rt == "relates_to": + if str(rel["issue_id"]) == str(issue_id) and rel["related_issue_id"] not in seen_relates_to: + seen_relates_to.add(rel["related_issue_id"]) + response_data["relates_to"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + if str(rel["related_issue_id"]) == str(issue_id) and rel["issue_id"] not in seen_relates_to: + seen_relates_to.add(rel["issue_id"]) + response_data["relates_to"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + elif rt == "start_before": + if str(rel["related_issue_id"]) == str(issue_id): + response_data["start_after"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + if str(rel["issue_id"]) == str(issue_id): + response_data["start_before"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + elif rt == "finish_before": + if str(rel["related_issue_id"]) == str(issue_id): + response_data["finish_after"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + if str(rel["issue_id"]) == str(issue_id): + response_data["finish_before"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) return Response(response_data, status=status.HTTP_200_OK) diff --git a/apps/api/plane/app/serializers/webhook.py b/apps/api/plane/app/serializers/webhook.py index 74ebde89205..c5d0dd41e9a 100644 --- a/apps/api/plane/app/serializers/webhook.py +++ b/apps/api/plane/app/serializers/webhook.py @@ -3,90 +3,55 @@ # See the LICENSE file for details. # Python imports -import socket -import ipaddress +import logging from urllib.parse import urlparse # Third party imports from rest_framework import serializers +# Django imports +from django.conf import settings + # Module imports from .base import DynamicBaseSerializer from plane.db.models import Webhook, WebhookLog from plane.db.models.webhook import validate_domain, validate_schema +from plane.utils.ip_address import validate_url + +logger = logging.getLogger(__name__) class WebhookSerializer(DynamicBaseSerializer): url = serializers.URLField(validators=[validate_schema, validate_domain]) - def create(self, validated_data): - url = validated_data.get("url", None) - - # Extract the hostname from the URL - hostname = urlparse(url).hostname - if not hostname: - raise serializers.ValidationError({"url": "Invalid URL: No hostname found."}) - - # Resolve the hostname to IP addresses + def _validate_webhook_url(self, url): + """Validate a webhook URL against SSRF and disallowed domain rules.""" try: - ip_addresses = socket.getaddrinfo(hostname, None) - except socket.gaierror: - raise serializers.ValidationError({"url": "Hostname could not be resolved."}) - - if not ip_addresses: - raise serializers.ValidationError({"url": "No IP addresses found for the hostname."}) + validate_url(url, allowed_ips=settings.WEBHOOK_ALLOWED_IPS) + except ValueError as e: + logger.warning("Webhook URL validation failed for %s: %s", url, e) + raise serializers.ValidationError({"url": "Invalid or disallowed webhook URL."}) - for addr in ip_addresses: - ip = ipaddress.ip_address(addr[4][0]) - if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: - raise serializers.ValidationError({"url": "URL resolves to a blocked IP address."}) + hostname = (urlparse(url).hostname or "").rstrip(".").lower() - # Additional validation for multiple request domains and their subdomains request = self.context.get("request") - disallowed_domains = ["plane.so"] # Add your disallowed domains here + disallowed_domains = ["plane.so"] if request: - request_host = request.get_host().split(":")[0] # Remove port if present + request_host = request.get_host().split(":")[0].rstrip(".").lower() disallowed_domains.append(request_host) - # Check if hostname is a subdomain or exact match of any disallowed domain if any(hostname == domain or hostname.endswith("." + domain) for domain in disallowed_domains): raise serializers.ValidationError({"url": "URL domain or its subdomain is not allowed."}) + def create(self, validated_data): + url = validated_data.get("url", None) + self._validate_webhook_url(url) return Webhook.objects.create(**validated_data) def update(self, instance, validated_data): url = validated_data.get("url", None) if url: - # Extract the hostname from the URL - hostname = urlparse(url).hostname - if not hostname: - raise serializers.ValidationError({"url": "Invalid URL: No hostname found."}) - - # Resolve the hostname to IP addresses - try: - ip_addresses = socket.getaddrinfo(hostname, None) - except socket.gaierror: - raise serializers.ValidationError({"url": "Hostname could not be resolved."}) - - if not ip_addresses: - raise serializers.ValidationError({"url": "No IP addresses found for the hostname."}) - - for addr in ip_addresses: - ip = ipaddress.ip_address(addr[4][0]) - if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: - raise serializers.ValidationError({"url": "URL resolves to a blocked IP address."}) - - # Additional validation for multiple request domains and their subdomains - request = self.context.get("request") - disallowed_domains = ["plane.so"] # Add your disallowed domains here - if request: - request_host = request.get_host().split(":")[0] # Remove port if present - disallowed_domains.append(request_host) - - # Check if hostname is a subdomain or exact match of any disallowed domain - if any(hostname == domain or hostname.endswith("." + domain) for domain in disallowed_domains): - raise serializers.ValidationError({"url": "URL domain or its subdomain is not allowed."}) - + self._validate_webhook_url(url) return super().update(instance, validated_data) class Meta: diff --git a/apps/api/plane/app/views/analytic/base.py b/apps/api/plane/app/views/analytic/base.py index 2f3f8b5737d..a05712c4ecf 100644 --- a/apps/api/plane/app/views/analytic/base.py +++ b/apps/api/plane/app/views/analytic/base.py @@ -29,7 +29,7 @@ Module, ) -from plane.utils.analytics_plot import build_graph_plot +from plane.utils.analytics_plot import build_graph_plot, VALID_ANALYTICS_FIELDS, VALID_YAXIS from plane.utils.issue_filters import issue_filters from plane.app.permissions import allow_permission, ROLE @@ -41,32 +41,15 @@ def get(self, request, slug): y_axis = request.GET.get("y_axis", False) segment = request.GET.get("segment", False) - valid_xaxis_segment = [ - "state_id", - "state__group", - "labels__id", - "assignees__id", - "estimate_point__value", - "issue_cycle__cycle_id", - "issue_module__module_id", - "priority", - "start_date", - "target_date", - "created_at", - "completed_at", - ] - - valid_yaxis = ["issue_count", "estimate"] - # Check for x-axis and y-axis as thery are required parameters - if not x_axis or not y_axis or x_axis not in valid_xaxis_segment or y_axis not in valid_yaxis: + if not x_axis or not y_axis or x_axis not in VALID_ANALYTICS_FIELDS or y_axis not in VALID_YAXIS: return Response( {"error": "x-axis and y-axis dimensions are required and the values should be valid"}, status=status.HTTP_400_BAD_REQUEST, ) # If segment is present it cannot be same as x-axis - if segment and (segment not in valid_xaxis_segment or x_axis == segment): + if segment and (segment not in VALID_ANALYTICS_FIELDS or x_axis == segment): return Response( {"error": "Both segment and x axis cannot be same and segment should be valid"}, status=status.HTTP_400_BAD_REQUEST, @@ -214,13 +197,20 @@ def get(self, request, slug, analytic_id): x_axis = analytic_view.query_dict.get("x_axis", False) y_axis = analytic_view.query_dict.get("y_axis", False) - if not x_axis or not y_axis: + if not x_axis or not y_axis or x_axis not in VALID_ANALYTICS_FIELDS or y_axis not in VALID_YAXIS: return Response( - {"error": "x-axis and y-axis dimensions are required"}, + {"error": "x-axis and y-axis dimensions are required and the values should be valid"}, status=status.HTTP_400_BAD_REQUEST, ) segment = request.GET.get("segment", False) + + if segment and (segment not in VALID_ANALYTICS_FIELDS or x_axis == segment): + return Response( + {"error": "Both segment and x axis cannot be same and segment should be valid"}, + status=status.HTTP_400_BAD_REQUEST, + ) + distribution = build_graph_plot(queryset=queryset, x_axis=x_axis, y_axis=y_axis, segment=segment) total_issues = queryset.count() return Response( @@ -236,32 +226,15 @@ def post(self, request, slug): y_axis = request.data.get("y_axis", False) segment = request.data.get("segment", False) - valid_xaxis_segment = [ - "state_id", - "state__group", - "labels__id", - "assignees__id", - "estimate_point", - "issue_cycle__cycle_id", - "issue_module__module_id", - "priority", - "start_date", - "target_date", - "created_at", - "completed_at", - ] - - valid_yaxis = ["issue_count", "estimate"] - # Check for x-axis and y-axis as thery are required parameters - if not x_axis or not y_axis or x_axis not in valid_xaxis_segment or y_axis not in valid_yaxis: + if not x_axis or not y_axis or x_axis not in VALID_ANALYTICS_FIELDS or y_axis not in VALID_YAXIS: return Response( {"error": "x-axis and y-axis dimensions are required and the values should be valid"}, status=status.HTTP_400_BAD_REQUEST, ) # If segment is present it cannot be same as x-axis - if segment and (segment not in valid_xaxis_segment or x_axis == segment): + if segment and (segment not in VALID_ANALYTICS_FIELDS or x_axis == segment): return Response( {"error": "Both segment and x axis cannot be same and segment should be valid"}, status=status.HTTP_400_BAD_REQUEST, diff --git a/apps/api/plane/app/views/asset/v2.py b/apps/api/plane/app/views/asset/v2.py index 62c5f84a20b..b21f70d61fc 100644 --- a/apps/api/plane/app/views/asset/v2.py +++ b/apps/api/plane/app/views/asset/v2.py @@ -18,10 +18,11 @@ # Module imports from ..base import BaseAPIView -from plane.db.models import FileAsset, Workspace, Project, User +from plane.db.models import FileAsset, Workspace, Project, User, WorkspaceMember from plane.settings.storage import S3Storage from plane.app.permissions import allow_permission, ROLE from plane.utils.cache import invalidate_cache_directly +from plane.utils.path_validator import sanitize_filename from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.throttles.asset import AssetRateThrottle @@ -108,7 +109,7 @@ def entity_asset_delete(self, entity_type, asset, request): def post(self, request): # get the asset key - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) @@ -311,8 +312,9 @@ def entity_asset_delete(self, entity_type, asset, request): else: return + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def post(self, request, slug): - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type") @@ -376,6 +378,7 @@ def post(self, request, slug): status=status.HTTP_200_OK, ) + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def patch(self, request, slug, asset_id): # get the asset id asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug) @@ -397,6 +400,7 @@ def patch(self, request, slug, asset_id): asset.save(update_fields=["is_uploaded", "attributes"]) return Response(status=status.HTTP_204_NO_CONTENT) + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def delete(self, request, slug, asset_id): asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug) asset.is_deleted = True @@ -406,6 +410,7 @@ def delete(self, request, slug, asset_id): asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def get(self, request, slug, asset_id): # get the asset id asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug) @@ -511,7 +516,7 @@ def get_entity_id_field(self, entity_type, entity_id): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def post(self, request, slug, project_id): - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", "") @@ -752,12 +757,22 @@ def post(self, request, slug, asset_id): return Response({"error": "Project not found"}, status=status.HTTP_404_NOT_FOUND) storage = S3Storage(request=request) - original_asset = FileAsset.objects.filter(id=asset_id, is_uploaded=True).first() + # Scope the source asset lookup to workspaces the caller is a member of + user_workspace_ids = WorkspaceMember.objects.filter( + member=request.user, + is_active=True, + ).values_list("workspace_id", flat=True) + original_asset = FileAsset.objects.filter( + id=asset_id, + is_uploaded=True, + workspace_id__in=user_workspace_ids, + ).first() if not original_asset: return Response({"error": "Asset not found"}, status=status.HTTP_404_NOT_FOUND) - destination_key = f"{workspace.id}/{uuid.uuid4().hex}-{original_asset.attributes.get('name')}" + sanitized_name = sanitize_filename(original_asset.attributes.get("name")) or "unnamed" + destination_key = f"{workspace.id}/{uuid.uuid4().hex}-{sanitized_name}" duplicated_asset = FileAsset.objects.create( attributes={ "name": original_asset.attributes.get("name"), diff --git a/apps/api/plane/app/views/issue/attachment.py b/apps/api/plane/app/views/issue/attachment.py index df027c413b1..51248b8a428 100644 --- a/apps/api/plane/app/views/issue/attachment.py +++ b/apps/api/plane/app/views/issue/attachment.py @@ -24,6 +24,7 @@ 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.utils.path_validator import sanitize_filename from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.utils.host import base_host @@ -97,7 +98,7 @@ class IssueAttachmentV2Endpoint(BaseAPIView): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def post(self, request, slug, project_id, issue_id): - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", False) size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) diff --git a/apps/api/plane/app/views/issue/sub_issue.py b/apps/api/plane/app/views/issue/sub_issue.py index b52e07564f6..5194148dd7b 100644 --- a/apps/api/plane/app/views/issue/sub_issue.py +++ b/apps/api/plane/app/views/issue/sub_issue.py @@ -7,7 +7,7 @@ # Django imports from django.utils import timezone -from django.db.models import OuterRef, Func, F, Q, Value, UUIDField, Subquery +from django.db.models import OuterRef, Func, F, Q, Value, UUIDField, Subquery, Count, IntegerField from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page from django.contrib.postgres.aggregates import ArrayAgg @@ -22,7 +22,7 @@ from .. import BaseAPIView from plane.app.serializers import IssueSerializer from plane.app.permissions import ProjectEntityPermission -from plane.db.models import Issue, IssueLink, FileAsset, CycleIssue +from plane.db.models import Issue, IssueLink, FileAsset, CycleIssue, IssueLabel, IssueAssignee, ModuleIssue from plane.bgtasks.issue_activities_task import issue_activity from plane.utils.timezone_converter import user_timezone_converter from collections import defaultdict @@ -37,70 +37,97 @@ class SubIssuesEndpoint(BaseAPIView): def get(self, request, slug, project_id, issue_id): sub_issues = ( Issue.issue_objects.filter(parent_id=issue_id, workspace__slug=slug) - .select_related("workspace", "project", "state", "parent") - .prefetch_related("assignees", "labels", "issue_module__module") .annotate( cycle_id=Subquery( CycleIssue.objects.filter(issue=OuterRef("id"), deleted_at__isnull=True).values("cycle_id")[:1] ) ) .annotate( - link_count=IssueLink.objects.filter(issue=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") + link_count=Coalesce( + Subquery( + IssueLink.objects.filter(issue=OuterRef("id")) + .order_by() + .values("issue") + .annotate(count=Count("id")) + .values("count"), + output_field=IntegerField(), + ), + 0, + ) ) .annotate( - attachment_count=FileAsset.objects.filter( - issue_id=OuterRef("id"), - entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + attachment_count=Coalesce( + Subquery( + FileAsset.objects.filter( + issue_id=OuterRef("id"), + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + ) + .order_by() + .values("issue_id") + .annotate(count=Count("id")) + .values("count"), + output_field=IntegerField(), + ), + 0, ) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") ) .annotate( - sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") + sub_issues_count=Coalesce( + Subquery( + Issue.issue_objects.filter(parent=OuterRef("id")) + .order_by() + .values("parent") + .annotate(count=Count("id")) + .values("count"), + output_field=IntegerField(), + ), + 0, + ) ) .annotate( label_ids=Coalesce( - ArrayAgg( - "labels__id", - distinct=True, - filter=Q(~Q(labels__id__isnull=True) & Q(label_issue__deleted_at__isnull=True)), + Subquery( + IssueLabel.objects.filter(issue_id=OuterRef("id"), deleted_at__isnull=True) + .order_by() + .values("issue_id") + .annotate(arr=ArrayAgg("label_id", distinct=True)) + .values("arr"), + output_field=ArrayField(UUIDField()), ), Value([], output_field=ArrayField(UUIDField())), ), assignee_ids=Coalesce( - ArrayAgg( - "assignees__id", - distinct=True, - filter=Q( - ~Q(assignees__id__isnull=True) - & Q(assignees__member_project__is_active=True) - & Q(issue_assignee__deleted_at__isnull=True) - ), + Subquery( + IssueAssignee.objects.filter( + issue_id=OuterRef("id"), + assignee__member_project__is_active=True, + deleted_at__isnull=True, + ) + .order_by() + .values("issue_id") + .annotate(arr=ArrayAgg("assignee_id", distinct=True)) + .values("arr"), + output_field=ArrayField(UUIDField()), ), Value([], output_field=ArrayField(UUIDField())), ), module_ids=Coalesce( - ArrayAgg( - "issue_module__module_id", - distinct=True, - filter=Q( - ~Q(issue_module__module_id__isnull=True) - & Q(issue_module__module__archived_at__isnull=True) - & Q(issue_module__deleted_at__isnull=True) - ), + Subquery( + ModuleIssue.objects.filter( + issue_id=OuterRef("id"), + module__archived_at__isnull=True, + deleted_at__isnull=True, + ) + .order_by() + .values("issue_id") + .annotate(arr=ArrayAgg("module_id", distinct=True)) + .values("arr"), + output_field=ArrayField(UUIDField()), ), Value([], output_field=ArrayField(UUIDField())), ), ) .annotate(state_group=F("state__group")) - .order_by("-created_at") ) # Ordering @@ -110,38 +137,42 @@ def get(self, request, slug, project_id, issue_id): if order_by_param: sub_issues, order_by_param = order_issue_queryset(sub_issues, order_by_param) + sub_issues = list( + sub_issues.values( + "id", + "name", + "state_id", + "sort_order", + "completed_at", + "estimate_point", + "priority", + "start_date", + "target_date", + "sequence_id", + "project_id", + "parent_id", + "cycle_id", + "module_ids", + "label_ids", + "assignee_ids", + "sub_issues_count", + "created_at", + "updated_at", + "created_by", + "updated_by", + "attachment_count", + "link_count", + "is_draft", + "archived_at", + "state_group", + ) + ) + # create's a dict with state group name with their respective issue id's result = defaultdict(list) for sub_issue in sub_issues: - result[sub_issue.state_group].append(str(sub_issue.id)) + result[sub_issue["state_group"]].append(str(sub_issue["id"])) - sub_issues = sub_issues.values( - "id", - "name", - "state_id", - "sort_order", - "completed_at", - "estimate_point", - "priority", - "start_date", - "target_date", - "sequence_id", - "project_id", - "parent_id", - "cycle_id", - "module_ids", - "label_ids", - "assignee_ids", - "sub_issues_count", - "created_at", - "updated_at", - "created_by", - "updated_by", - "attachment_count", - "link_count", - "is_draft", - "archived_at", - ) datetime_fields = ["created_at", "updated_at"] sub_issues = user_timezone_converter(sub_issues, datetime_fields, request.user.user_timezone) # Grouping diff --git a/apps/api/plane/bgtasks/webhook_task.py b/apps/api/plane/bgtasks/webhook_task.py index 6543c3845b8..89d98757679 100644 --- a/apps/api/plane/bgtasks/webhook_task.py +++ b/apps/api/plane/bgtasks/webhook_task.py @@ -52,6 +52,7 @@ from plane.license.utils.instance_value import get_email_configuration from plane.utils.email import generate_plain_text_from_html from plane.utils.exception_logger import log_exception +from plane.utils.ip_address import validate_url from plane.settings.mongo import MongoConnection @@ -325,6 +326,9 @@ def webhook_send_task( return try: + # Re-validate the webhook URL at send time to prevent DNS-rebinding attacks + validate_url(webhook.url, allowed_ips=settings.WEBHOOK_ALLOWED_IPS) + # Send the webhook event response = requests.post(webhook.url, headers=headers, json=payload, timeout=30) diff --git a/apps/api/plane/db/models/asset.py b/apps/api/plane/db/models/asset.py index d309135bcac..55efff7f41d 100644 --- a/apps/api/plane/db/models/asset.py +++ b/apps/api/plane/db/models/asset.py @@ -11,10 +11,13 @@ from django.db import models # Module import +from plane.utils.path_validator import sanitize_filename + from .base import BaseModel def get_upload_path(instance, filename): + filename = sanitize_filename(filename) or uuid4().hex if instance.workspace_id is not None: return f"{instance.workspace.id}/{uuid4().hex}-{filename}" return f"user-{uuid4().hex}-{filename}" diff --git a/apps/api/plane/db/models/issue.py b/apps/api/plane/db/models/issue.py index d24efc8a23c..f4175c47852 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -17,6 +17,7 @@ # Module imports from plane.utils.html_processor import strip_tags +from plane.utils.path_validator import sanitize_filename from plane.db.mixins import SoftDeletionManager from plane.utils.exception_logger import log_exception from .project import ProjectBaseModel @@ -376,6 +377,7 @@ def __str__(self): def get_upload_path(instance, filename): + filename = sanitize_filename(filename) or uuid4().hex return f"{instance.workspace.id}/{uuid4().hex}-{filename}" diff --git a/apps/api/plane/license/api/views/configuration.py b/apps/api/plane/license/api/views/configuration.py index bb9a9e00ee6..c5ad5f5788b 100644 --- a/apps/api/plane/license/api/views/configuration.py +++ b/apps/api/plane/license/api/views/configuration.py @@ -45,7 +45,8 @@ def patch(self, request): bulk_configurations = [] for configuration in configurations: - value = request.data.get(configuration.key, configuration.value) + raw_value = request.data.get(configuration.key, configuration.value) + value = "" if raw_value is None else str(raw_value).strip() if configuration.is_encrypted: configuration.value = encrypt_data(value) else: diff --git a/apps/api/plane/license/api/views/instance.py b/apps/api/plane/license/api/views/instance.py index a0d52d4912f..29c2521abd8 100644 --- a/apps/api/plane/license/api/views/instance.py +++ b/apps/api/plane/license/api/views/instance.py @@ -63,8 +63,6 @@ def get(self, request): POSTHOG_HOST, UNSPLASH_ACCESS_KEY, LLM_API_KEY, - IS_INTERCOM_ENABLED, - INTERCOM_APP_ID, ) = get_configuration_value( [ { @@ -124,15 +122,6 @@ def get(self, request): "key": "LLM_API_KEY", "default": os.environ.get("LLM_API_KEY", ""), }, - # Intercom settings - { - "key": "IS_INTERCOM_ENABLED", - "default": os.environ.get("IS_INTERCOM_ENABLED", "1"), - }, - { - "key": "INTERCOM_APP_ID", - "default": os.environ.get("INTERCOM_APP_ID", ""), - }, ] ) @@ -169,10 +158,6 @@ def get(self, request): # is smtp configured data["is_smtp_configured"] = bool(EMAIL_HOST) - # Intercom settings - data["is_intercom_enabled"] = IS_INTERCOM_ENABLED == "1" - data["intercom_app_id"] = INTERCOM_APP_ID - # Base URL data["admin_base_url"] = settings.ADMIN_BASE_URL data["space_base_url"] = settings.SPACE_BASE_URL diff --git a/apps/api/plane/settings/common.py b/apps/api/plane/settings/common.py index 9d651bd1b4c..d90ee10f891 100644 --- a/apps/api/plane/settings/common.py +++ b/apps/api/plane/settings/common.py @@ -5,6 +5,8 @@ """Global Settings""" # Python imports +import ipaddress +import logging import os from urllib.parse import urlparse from urllib.parse import urljoin @@ -32,6 +34,21 @@ # Self-hosted mode IS_SELF_MANAGED = True +# Webhook IP allowlist — comma-separated IPs or CIDR ranges that are allowed as +# webhook targets even if they resolve to private networks. +# Example: "10.0.0.0/8,192.168.1.0/24,172.16.0.5" +_webhook_allowed_ips_raw = os.environ.get("WEBHOOK_ALLOWED_IPS", "") +WEBHOOK_ALLOWED_IPS = [] +_logger = logging.getLogger("plane") +for _cidr in _webhook_allowed_ips_raw.split(","): + _cidr = _cidr.strip() + if not _cidr: + continue + try: + WEBHOOK_ALLOWED_IPS.append(ipaddress.ip_network(_cidr, strict=False)) + except ValueError: + _logger.warning("WEBHOOK_ALLOWED_IPS: skipping invalid entry %r", _cidr) + # Allowed Hosts ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "*").split(",") diff --git a/apps/api/plane/space/views/asset.py b/apps/api/plane/space/views/asset.py index 1749a8fd462..bc20724ca80 100644 --- a/apps/api/plane/space/views/asset.py +++ b/apps/api/plane/space/views/asset.py @@ -18,6 +18,7 @@ from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.db.models import DeployBoard, FileAsset from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename # Module imports from .base import BaseAPIView @@ -73,7 +74,7 @@ def post(self, request, anchor): return Response({"error": "Project is not published"}, status=status.HTTP_404_NOT_FOUND) # Get the asset - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", "") diff --git a/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py b/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py index 2838260e890..67c61c6ccae 100644 --- a/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py +++ b/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py @@ -2,9 +2,12 @@ # SPDX-License-Identifier: AGPL-3.0-only # See the LICENSE file for details. +import ipaddress + import pytest from unittest.mock import patch, MagicMock from plane.bgtasks.work_item_link_task import safe_get, validate_url_ip +from plane.utils.ip_address import validate_url def _make_response(status_code=200, headers=None, is_redirect=False, content=b""): @@ -43,6 +46,49 @@ def test_allows_public_ip(self): validate_url_ip("https://example.com") # Should not raise +@pytest.mark.unit +class TestValidateUrlAllowlist: + """Test validate_url allowlist permits specific private IPs.""" + + def test_allowlist_permits_private_ip(self): + allowed = [ipaddress.ip_network("192.168.1.0/24")] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("192.168.1.50", 0))] + validate_url("http://example.com", allowed_ips=allowed) # Should not raise + + def test_allowlist_does_not_permit_other_private_ip(self): + allowed = [ipaddress.ip_network("192.168.1.0/24")] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("10.0.0.1", 0))] + with pytest.raises(ValueError, match="private/internal"): + validate_url("http://example.com", allowed_ips=allowed) + + def test_allowlist_permits_loopback_when_explicitly_allowed(self): + allowed = [ipaddress.ip_network("127.0.0.0/8")] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("127.0.0.1", 0))] + validate_url("http://example.com", allowed_ips=allowed) # Should not raise + + def test_allowlist_permits_matching_ipv4_with_mixed_version_networks(self): + allowed = [ + ipaddress.ip_network("2001:db8::/32"), + ipaddress.ip_network("192.168.1.0/24"), + ] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("192.168.1.50", 0))] + validate_url("http://example.com", allowed_ips=allowed) # Should not raise + + def test_allowlist_blocks_non_matching_ipv4_with_mixed_version_networks(self): + allowed = [ + ipaddress.ip_network("2001:db8::/32"), + ipaddress.ip_network("192.168.1.0/24"), + ] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("10.0.0.1", 0))] + with pytest.raises(ValueError, match="private/internal"): + validate_url("http://example.com", allowed_ips=allowed) + + @pytest.mark.unit class TestSafeGet: """Test safe_get follows redirects safely and blocks SSRF.""" diff --git a/apps/api/plane/utils/analytics_plot.py b/apps/api/plane/utils/analytics_plot.py index acd86aca868..5a09f12fdb6 100644 --- a/apps/api/plane/utils/analytics_plot.py +++ b/apps/api/plane/utils/analytics_plot.py @@ -22,6 +22,23 @@ # Module imports from plane.db.models import Issue, Project +VALID_ANALYTICS_FIELDS = [ + "state_id", + "state__group", + "labels__id", + "assignees__id", + "estimate_point__value", + "issue_cycle__cycle_id", + "issue_module__module_id", + "priority", + "start_date", + "target_date", + "created_at", + "completed_at", +] + +VALID_YAXIS = ["issue_count", "estimate"] + def annotate_with_monthly_dimension(queryset, field_name, attribute): # Get the year and the months @@ -34,6 +51,8 @@ def annotate_with_monthly_dimension(queryset, field_name, attribute): def extract_axis(queryset, x_axis): + if x_axis not in VALID_ANALYTICS_FIELDS: + raise ValueError(f"Invalid x_axis value: {x_axis}") # Format the dimension when the axis is in date if x_axis in ["created_at", "start_date", "target_date", "completed_at"]: queryset = annotate_with_monthly_dimension(queryset, x_axis, "dimension") @@ -52,6 +71,13 @@ def sort_data(data, temp_axis): def build_graph_plot(queryset, x_axis, y_axis, segment=None): + if x_axis not in VALID_ANALYTICS_FIELDS: + raise ValueError(f"Invalid x_axis value: {x_axis}") + if y_axis not in VALID_YAXIS: + raise ValueError(f"Invalid y_axis value: {y_axis}") + if segment and segment not in VALID_ANALYTICS_FIELDS: + raise ValueError(f"Invalid segment value: {segment}") + # temp x_axis temp_axis = x_axis # Extract the x_axis and queryset diff --git a/apps/api/plane/utils/instance_config_variables/core.py b/apps/api/plane/utils/instance_config_variables/core.py index 274c6539af9..6eebf0b3adb 100644 --- a/apps/api/plane/utils/instance_config_variables/core.py +++ b/apps/api/plane/utils/instance_config_variables/core.py @@ -232,21 +232,6 @@ }, ] -intercom_config_variables = [ - { - "key": "IS_INTERCOM_ENABLED", - "value": os.environ.get("IS_INTERCOM_ENABLED", "1"), - "category": "INTERCOM", - "is_encrypted": False, - }, - { - "key": "INTERCOM_APP_ID", - "value": os.environ.get("INTERCOM_APP_ID", ""), - "category": "INTERCOM", - "is_encrypted": False, - }, -] - core_config_variables = [ *authentication_config_variables, *workspace_management_config_variables, @@ -257,5 +242,4 @@ *smtp_config_variables, *llm_config_variables, *unsplash_config_variables, - *intercom_config_variables, ] diff --git a/apps/api/plane/utils/ip_address.py b/apps/api/plane/utils/ip_address.py index 3a0f171d793..4102ad6f4c2 100644 --- a/apps/api/plane/utils/ip_address.py +++ b/apps/api/plane/utils/ip_address.py @@ -2,6 +2,52 @@ # SPDX-License-Identifier: AGPL-3.0-only # See the LICENSE file for details. +# Python imports +import ipaddress +import socket +from urllib.parse import urlparse + + +def validate_url(url, allowed_ips=None): + """ + Validate that a URL doesn't resolve to a private/internal IP address (SSRF protection). + + Args: + url: The URL to validate. + allowed_ips: Optional list of ipaddress.ip_network objects. IPs falling within + these networks are permitted even if they are private/loopback/reserved. + Typically sourced from the WEBHOOK_ALLOWED_IPS setting. + + Raises: + ValueError: If the URL is invalid or resolves to a blocked IP. + """ + parsed = urlparse(url) + hostname = parsed.hostname + + if not hostname: + raise ValueError("Invalid URL: No hostname found") + + if parsed.scheme not in ("http", "https"): + raise ValueError("Invalid URL scheme. Only HTTP and HTTPS are allowed") + + try: + addr_info = socket.getaddrinfo(hostname, None) + except socket.gaierror: + raise ValueError("Hostname could not be resolved") + + if not addr_info: + raise ValueError("No IP addresses found for the hostname") + + for addr in addr_info: + ip = ipaddress.ip_address(addr[4][0]) + if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: + if allowed_ips and any( + network.version == ip.version and ip in network for network in allowed_ips + ): + continue + raise ValueError("Access to private/internal networks is not allowed") + + def get_client_ip(request): x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") if x_forwarded_for: diff --git a/apps/api/plane/utils/path_validator.py b/apps/api/plane/utils/path_validator.py index f15fb4ca953..901464ee6af 100644 --- a/apps/api/plane/utils/path_validator.py +++ b/apps/api/plane/utils/path_validator.py @@ -7,9 +7,50 @@ from django.conf import settings # Python imports +import os from urllib.parse import urlparse +def sanitize_filename(filename): + """ + Sanitize a filename to prevent path traversal attacks. + + Strips directory components, path traversal sequences, and null bytes + from user-supplied filenames used in upload paths and S3 object keys. + + Returns None for empty/missing input so callers can still validate + that a filename was provided. + """ + if not filename or not isinstance(filename, str): + return None + + # Strip null bytes + filename = filename.replace("\x00", "") + + # Normalize backslashes so os.path.basename handles Windows-style paths on POSIX + filename = filename.replace("\\", "/") + + # Take only the basename to remove any directory components + filename = os.path.basename(filename) + + # Remove any remaining path traversal sequences + filename = filename.replace("..", "") + + # Strip whitespace before removing leading dots so " .env" is caught + filename = filename.strip() + + # Remove leading dots (hidden files) + filename = filename.lstrip(".") + + # Strip any remaining whitespace + filename = filename.strip() + + if not filename: + return None + + return filename + + def _contains_suspicious_patterns(path: str) -> bool: """ Check for suspicious patterns that might indicate malicious intent. diff --git a/apps/api/requirements/base.txt b/apps/api/requirements/base.txt index 865590cb2eb..a691e36efe6 100644 --- a/apps/api/requirements/base.txt +++ b/apps/api/requirements/base.txt @@ -1,7 +1,7 @@ # base requirements # django -Django==4.2.29 +Django==4.2.30 # rest framework djangorestframework==3.15.2 # postgres @@ -51,9 +51,9 @@ beautifulsoup4==4.12.3 # analytics posthog==3.5.0 # crypto -cryptography==46.0.6 +cryptography==46.0.7 # html validator -lxml==6.0.0 +lxml==6.1.0 # s3 boto3==1.34.96 # password validator diff --git a/apps/api/requirements/test.txt b/apps/api/requirements/test.txt index c3149753572..bed38224a2f 100644 --- a/apps/api/requirements/test.txt +++ b/apps/api/requirements/test.txt @@ -1,6 +1,6 @@ -r base.txt # test framework -pytest==9.0.2 +pytest==9.0.3 pytest-django==4.5.2 pytest-cov==4.1.0 pytest-xdist==3.3.1 diff --git a/apps/api/templates/emails/invitations/project_invitation.html b/apps/api/templates/emails/invitations/project_invitation.html index 36aecd60d82..f18579c6459 100644 --- a/apps/api/templates/emails/invitations/project_invitation.html +++ b/apps/api/templates/emails/invitations/project_invitation.html @@ -261,7 +261,7 @@ ­ - + ­ diff --git a/apps/api/templates/emails/notifications/issue-updates.html b/apps/api/templates/emails/notifications/issue-updates.html index c6fe3b2786c..d82614ded61 100644 --- a/apps/api/templates/emails/notifications/issue-updates.html +++ b/apps/api/templates/emails/notifications/issue-updates.html @@ -233,7 +233,7 @@
This email was sent to {{ receiver.email }}. If you'd rather not receive this kind of email, you can unsubscribe to the {{entity_type}} or manage your email preferences. - +
diff --git a/apps/api/templates/emails/notifications/webhook-deactivate.html b/apps/api/templates/emails/notifications/webhook-deactivate.html index 44aca67203a..c094eaa7636 100644 --- a/apps/api/templates/emails/notifications/webhook-deactivate.html +++ b/apps/api/templates/emails/notifications/webhook-deactivate.html @@ -155,7 +155,7 @@ ­
-

Despite our popularity, we are humbly early-stage. We are shipping fast, so please reach out to us with feature requests, major and minor nits, and anything else you find missing. We read every message, tweet, and conversation and update our public roadmap.

+

Despite our popularity, we are humbly early-stage. We are shipping fast, so please reach out to us with feature requests, major and minor nits, and anything else you find missing. We read every message, tweet, and conversation and update our public roadmap.

­ @@ -220,7 +220,7 @@ - + diff --git a/apps/api/templates/emails/user/email_updated.html b/apps/api/templates/emails/user/email_updated.html index cd13347ead2..cb1cad45966 100644 --- a/apps/api/templates/emails/user/email_updated.html +++ b/apps/api/templates/emails/user/email_updated.html @@ -831,7 +831,7 @@ " > , , { @@ -37,7 +40,7 @@ export const OnboardingHeader = observer(function OnboardingHeader(props: Onboar updateCurrentStep(EOnboardingSteps.ROLE_SETUP); break; case EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN: - updateCurrentStep(EOnboardingSteps.USE_CASE_SETUP); + updateCurrentStep(isSelfManaged ? EOnboardingSteps.PROFILE_SETUP : EOnboardingSteps.USE_CASE_SETUP); break; } }; @@ -45,22 +48,18 @@ export const OnboardingHeader = observer(function OnboardingHeader(props: Onboar // can go back const canGoBack = ![EOnboardingSteps.PROFILE_SETUP, EOnboardingSteps.INVITE_MEMBERS].includes(currentStep); - // Get current step number for progress tracking - const getCurrentStepNumber = (): number => { - const stepOrder: TOnboardingStep[] = [ - EOnboardingSteps.PROFILE_SETUP, - EOnboardingSteps.ROLE_SETUP, - EOnboardingSteps.USE_CASE_SETUP, - ...(hasInvitations - ? [EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN] - : [EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN, EOnboardingSteps.INVITE_MEMBERS]), - ]; - return stepOrder.indexOf(currentStep) + 1; - }; + // step order for progress tracking — include INVITE_MEMBERS if user is currently on it + const showInviteStep = !hasInvitations || currentStep === EOnboardingSteps.INVITE_MEMBERS; + const stepOrder: TOnboardingStep[] = [ + EOnboardingSteps.PROFILE_SETUP, + ...(isSelfManaged ? [] : [EOnboardingSteps.ROLE_SETUP, EOnboardingSteps.USE_CASE_SETUP]), + EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN, + ...(showInviteStep ? [EOnboardingSteps.INVITE_MEMBERS] : []), + ]; // derived values - const currentStepNumber = getCurrentStepNumber(); - const totalSteps = hasInvitations ? 4 : 5; // 4 if invites available, 5 if not + const currentStepNumber = stepOrder.indexOf(currentStep) + 1; + const totalSteps = stepOrder.length; const userName = user?.display_name ? user?.display_name : user?.first_name diff --git a/apps/web/core/components/onboarding/root.tsx b/apps/web/core/components/onboarding/root.tsx index cc8e7cfe41f..395e19b0957 100644 --- a/apps/web/core/components/onboarding/root.tsx +++ b/apps/web/core/components/onboarding/root.tsx @@ -11,6 +11,7 @@ import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IWorkspaceMemberInvitation, TOnboardingStep, TOnboardingSteps, TUserProfile } from "@plane/types"; import { EOnboardingSteps } from "@plane/types"; // hooks +import { useInstance } from "@/hooks/store/use-instance"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser, useUserProfile } from "@/hooks/store/user"; // local components @@ -27,8 +28,10 @@ export const OnboardingRoot = observer(function OnboardingRoot({ invitations = [ const { data: user } = useUser(); const { data: userProfile, updateUserProfile, finishUserOnboarding } = useUserProfile(); const { workspaces } = useWorkspace(); + const { config: instanceConfig } = useInstance(); const workspacesList = Object.values(workspaces ?? {}); + const isSelfManaged = instanceConfig?.is_self_managed; // Calculate total steps based on whether invitations are available const hasInvitations = invitations.length > 0; @@ -68,7 +71,14 @@ export const OnboardingRoot = observer(function OnboardingRoot({ invitations = [ (step: EOnboardingSteps, skipInvites?: boolean) => { switch (step) { case EOnboardingSteps.PROFILE_SETUP: - setCurrentStep(EOnboardingSteps.ROLE_SETUP); + if (isSelfManaged) { + // Skip role & use case steps for self-hosted + stepChange({ profile_complete: true }); + if (workspacesList.length > 0) finishOnboarding(); + else setCurrentStep(EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN); + } else { + setCurrentStep(EOnboardingSteps.ROLE_SETUP); + } break; case EOnboardingSteps.ROLE_SETUP: setCurrentStep(EOnboardingSteps.USE_CASE_SETUP); @@ -91,7 +101,7 @@ export const OnboardingRoot = observer(function OnboardingRoot({ invitations = [ break; } }, - [stepChange, finishOnboarding, workspacesList] + [stepChange, finishOnboarding, workspacesList, isSelfManaged] ); const updateCurrentStep = (step: EOnboardingSteps) => setCurrentStep(step); diff --git a/apps/web/core/components/power-k/config/help-commands.ts b/apps/web/core/components/power-k/config/help-commands.ts index 0543e6698df..79e47354d56 100644 --- a/apps/web/core/components/power-k/config/help-commands.ts +++ b/apps/web/core/components/power-k/config/help-commands.ts @@ -9,7 +9,6 @@ import { FileText, GithubIcon, MessageSquare, Rocket } from "lucide-react"; import type { TPowerKCommandConfig } from "@/components/power-k/core/types"; // hooks import { usePowerK } from "@/hooks/store/use-power-k"; -import { useChatSupport } from "@/hooks/use-chat-support"; /** * Help commands - Help related commands @@ -17,7 +16,6 @@ import { useChatSupport } from "@/hooks/use-chat-support"; export const usePowerKHelpCommands = (): TPowerKCommandConfig[] => { // store const { toggleShortcutsListModal } = usePowerK(); - const { isEnabled: isChatSupportEnabled, openChatSupport } = useChatSupport(); return [ { @@ -71,16 +69,5 @@ export const usePowerKHelpCommands = (): TPowerKCommandConfig[] => { isVisible: () => true, closeOnSelect: true, }, - { - id: "chat_with_us", - type: "action", - group: "help", - i18n_title: "power_k.help_actions.chat_with_us", - icon: MessageSquare, - action: () => openChatSupport(), - isEnabled: () => isChatSupportEnabled, - isVisible: () => isChatSupportEnabled, - closeOnSelect: true, - }, ]; }; diff --git a/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx b/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx index 50b0e305098..acf392350cd 100644 --- a/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx +++ b/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx @@ -8,6 +8,7 @@ import { useState, Fragment } from "react"; import { Dialog, Transition } from "@headlessui/react"; // plane imports import { CloseIcon, SearchIcon } from "@plane/propel/icons"; +import { ScrollArea } from "@plane/propel/scrollarea"; import { Input } from "@plane/ui"; // hooks import { usePowerK } from "@/hooks/store/use-power-k"; @@ -61,28 +62,33 @@ export function ShortcutsModal(props: Props) { leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > -
- +
+ Keyboard shortcuts -
- - setQuery(e.target.value)} - placeholder="Search for shortcuts" - className="w-full border-none bg-transparent py-1 text-11 text-secondary outline-none" - autoFocus - tabIndex={1} - /> +
+
+ + setQuery(e.target.value)} + placeholder="Search for shortcuts" + className="w-full border-none bg-transparent py-1 text-11 text-secondary outline-none" + autoFocus + tabIndex={1} + /> +
- + + + +
diff --git a/apps/web/core/components/power-k/ui/renderer/shortcut.tsx b/apps/web/core/components/power-k/ui/renderer/shortcut.tsx index c2a9f04cf6d..9f4d5098430 100644 --- a/apps/web/core/components/power-k/ui/renderer/shortcut.tsx +++ b/apps/web/core/components/power-k/ui/renderer/shortcut.tsx @@ -78,7 +78,7 @@ export function ShortcutRenderer(props: Props) { const isShortcutsEmpty = groupedCommands.length === 0; return ( -
+
{!isShortcutsEmpty ? ( groupedCommands.map((group) => (
diff --git a/apps/web/core/components/project/form.tsx b/apps/web/core/components/project/form.tsx index b14b63cd61f..2d7575436f3 100644 --- a/apps/web/core/components/project/form.tsx +++ b/apps/web/core/components/project/form.tsx @@ -418,7 +418,7 @@ export function ProjectDetailsForm(props: IProjectDetailsForm) { onChange(value); }} error={Boolean(errors.timezone)} - buttonClassName="border-none" + buttonClassName="!border-subtle !shadow-none font-medium rounded-md" disabled={!isAdmin} /> diff --git a/apps/web/core/components/workspace/sidebar/help-section/root.tsx b/apps/web/core/components/workspace/sidebar/help-section/root.tsx index dea70d90aec..48cd1898a6e 100644 --- a/apps/web/core/components/workspace/sidebar/help-section/root.tsx +++ b/apps/web/core/components/workspace/sidebar/help-section/root.tsx @@ -6,7 +6,7 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; -import { HelpCircle, MessagesSquare, User } from "lucide-react"; +import { HelpCircle, User } from "lucide-react"; import { useTranslation } from "@plane/i18n"; import { PageIcon } from "@plane/propel/icons"; // ui @@ -16,7 +16,6 @@ import { ProductUpdatesModal } from "@/components/global"; import { AppSidebarItem } from "@/components/sidebar/sidebar-item"; // hooks import { usePowerK } from "@/hooks/store/use-power-k"; -import { useChatSupport } from "@/hooks/use-chat-support"; // plane web components import { PlaneVersionNumber } from "@/plane-web/components/global"; @@ -24,7 +23,6 @@ export const HelpMenuRoot = observer(function HelpMenuRoot() { // store hooks const { t } = useTranslation(); const { toggleShortcutsListModal } = usePowerK(); - const { openChatSupport, isEnabled: isChatSupportEnabled } = useChatSupport(); // states const [isNeedHelpOpen, setIsNeedHelpOpen] = useState(false); const [isProductUpdatesModalOpen, setProductUpdatesModalOpen] = useState(false); @@ -56,18 +54,6 @@ export const HelpMenuRoot = observer(function HelpMenuRoot() { {t("documentation")}
- {isChatSupportEnabled && ( - - - - )} window.open("mailto:sales@plane.so", "_blank")}>
diff --git a/apps/web/core/custom-events/chat-support.ts b/apps/web/core/custom-events/chat-support.ts deleted file mode 100644 index 8c7d0fa5c35..00000000000 --- a/apps/web/core/custom-events/chat-support.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -type ChatSupportType = "open"; - -type ChatSupportEventType = `chat-support:${ChatSupportType}`; - -export const CHAT_SUPPORT_EVENTS = { - open: "chat-support:open", -} satisfies Record; - -export class ChatSupportEvent extends CustomEvent { - constructor(type: ChatSupportType) { - super(CHAT_SUPPORT_EVENTS[type]); - } -} diff --git a/apps/web/core/hooks/use-chat-support.ts b/apps/web/core/hooks/use-chat-support.ts deleted file mode 100644 index b4e3e70a0cb..00000000000 --- a/apps/web/core/hooks/use-chat-support.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { useCallback } from "react"; -// custom events -import { ChatSupportEvent } from "@/custom-events/chat-support"; -// hooks -import { useInstance } from "@/hooks/store/use-instance"; -import { useUser } from "@/hooks/store/user"; - -export interface IUseChatSupport { - openChatSupport: () => void; - isEnabled: boolean; -} - -export const useChatSupport = (): IUseChatSupport => { - const { data: user } = useUser(); - const { config } = useInstance(); - // derived values - const isEnabled = Boolean(user && config?.is_intercom_enabled && config?.intercom_app_id); - - const openChatSupport = useCallback(() => { - if (!isEnabled) return; - window.dispatchEvent(new ChatSupportEvent("open")); - }, [isEnabled]); - - return { openChatSupport, isEnabled }; -}; diff --git a/apps/web/package.json b/apps/web/package.json index d84d9ff0f58..c0f87e25cd6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "web", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/package.json b/package.json index ec1fdbc00d1..160b4c5749c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plane", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Open-source project management that unlocks customer value", "license": "AGPL-3.0", @@ -62,7 +62,7 @@ "webpack": "5.104.1", "lodash-es": "catalog:", "@isaacs/brace-expansion": "5.0.1", - "lodash": "4.17.23", + "lodash": "4.18.1", "markdown-it": "14.1.1", "rollup": "4.59.0", "minimatch@3": "3.1.4", @@ -76,7 +76,11 @@ "yaml@1": "1.10.3", "yaml@2": "2.8.3", "path-to-regexp": "0.1.13", - "defu": "6.1.5" + "defu": "6.1.5", + "postcss": "8.5.10", + "axios": "catalog:", + "follow-redirects": "1.16.0", + "uuid": "catalog:" }, "onlyBuiltDependencies": [ "@parcel/watcher", diff --git a/packages/codemods/package.json b/packages/codemods/package.json index e335d735b68..e9402ca6333 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@plane/codemods", - "version": "1.3.0", + "version": "1.3.1", "private": true, "scripts": { "test": "vitest run", diff --git a/packages/constants/package.json b/packages/constants/package.json index dabdd16129d..800df400ddf 100644 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "@plane/constants", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/editor/package.json b/packages/editor/package.json index 9235ba0cbca..ae4aa512d42 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@plane/editor", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Core Editor that powers Plane", "keywords": [ diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 2a6076951ef..68429efff88 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "@plane/hooks", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "React hooks that are shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 5fd80fca39d..406a5cea357 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@plane/i18n", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "I18n shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/i18n/src/locales/cs/translations.ts b/packages/i18n/src/locales/cs/translations.ts index 8a0aded99bd..d2a818f3b89 100644 --- a/packages/i18n/src/locales/cs/translations.ts +++ b/packages/i18n/src/locales/cs/translations.ts @@ -395,7 +395,6 @@ export default { time_tracking_description: "Zaznamenávejte čas strávený na pracovních položkách a projektech.", work_management_description: "Spravujte svou práci a projekty snadno.", documentation: "Dokumentace", - message_support: "Kontaktovat podporu", contact_sales: "Kontaktovat prodej", hyper_mode: "Hyper režim", keyboard_shortcuts: "Klávesové zkratky", diff --git a/packages/i18n/src/locales/de/translations.ts b/packages/i18n/src/locales/de/translations.ts index 2d54b10b85a..db4925f1f92 100644 --- a/packages/i18n/src/locales/de/translations.ts +++ b/packages/i18n/src/locales/de/translations.ts @@ -406,7 +406,6 @@ export default { time_tracking_description: "Erfassen Sie die auf Arbeitselemente und Projekte verwendete Zeit.", work_management_description: "Verwalten Sie Ihre Arbeit und Projekte mühelos.", documentation: "Dokumentation", - message_support: "Support kontaktieren", contact_sales: "Vertrieb kontaktieren", hyper_mode: "Hyper-Modus", keyboard_shortcuts: "Tastaturkürzel", diff --git a/packages/i18n/src/locales/en/translations.ts b/packages/i18n/src/locales/en/translations.ts index 9f3eff04d1a..2885fd3f0a1 100644 --- a/packages/i18n/src/locales/en/translations.ts +++ b/packages/i18n/src/locales/en/translations.ts @@ -229,7 +229,6 @@ export default { time_tracking_description: "Log time spent on work items and projects.", work_management_description: "Manage your work and projects with ease.", documentation: "Documentation", - message_support: "Message support", contact_sales: "Contact sales", hyper_mode: "Hyper Mode", keyboard_shortcuts: "Keyboard shortcuts", @@ -2697,7 +2696,6 @@ export default { open_plane_documentation: "Open Plane documentation", join_forum: "Join our Forum", report_bug: "Report a bug", - chat_with_us: "Chat with us", }, page_placeholders: { default: "Type a command or search", diff --git a/packages/i18n/src/locales/es/translations.ts b/packages/i18n/src/locales/es/translations.ts index 0d25038f17b..5ed015d06ca 100644 --- a/packages/i18n/src/locales/es/translations.ts +++ b/packages/i18n/src/locales/es/translations.ts @@ -406,7 +406,6 @@ export default { time_tracking_description: "Registra el tiempo dedicado a elementos de trabajo y proyectos.", work_management_description: "Gestiona tu trabajo y proyectos con facilidad.", documentation: "Documentación", - message_support: "Mensaje al soporte", contact_sales: "Contactar ventas", hyper_mode: "Modo Hyper", keyboard_shortcuts: "Atajos de teclado", diff --git a/packages/i18n/src/locales/fr/translations.ts b/packages/i18n/src/locales/fr/translations.ts index 38ef528359e..f7ace4c6914 100644 --- a/packages/i18n/src/locales/fr/translations.ts +++ b/packages/i18n/src/locales/fr/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Enregistrez le temps passé sur les éléments de travail et les projets.", work_management_description: "Gérez votre travail et vos projets facilement.", documentation: "Documentation", - message_support: "Contacter le support", contact_sales: "Contacter les ventes", hyper_mode: "Mode Hyper", keyboard_shortcuts: "Raccourcis clavier", diff --git a/packages/i18n/src/locales/id/translations.ts b/packages/i18n/src/locales/id/translations.ts index dfe4e198dd3..f933b215e04 100644 --- a/packages/i18n/src/locales/id/translations.ts +++ b/packages/i18n/src/locales/id/translations.ts @@ -398,7 +398,6 @@ export default { time_tracking_description: "Catat waktu yang dihabiskan untuk item kerja dan proyek.", work_management_description: "Kelola pekerjaan dan proyek Anda dengan mudah.", documentation: "Dokumentasi", - message_support: "Pesan dukungan", contact_sales: "Hubungi penjualan", hyper_mode: "Mode Hyper", keyboard_shortcuts: "Pintasan keyboard", diff --git a/packages/i18n/src/locales/it/translations.ts b/packages/i18n/src/locales/it/translations.ts index 247a0edee38..a0cb1b5c54f 100644 --- a/packages/i18n/src/locales/it/translations.ts +++ b/packages/i18n/src/locales/it/translations.ts @@ -400,7 +400,6 @@ export default { time_tracking_description: "Registra il tempo trascorso su elementi di lavoro e progetti.", work_management_description: "Gestisci il tuo lavoro e i tuoi progetti con facilità.", documentation: "Documentazione", - message_support: "Contatta il supporto", contact_sales: "Contatta le vendite", hyper_mode: "Modalità Hyper", keyboard_shortcuts: "Scorciatoie da tastiera", diff --git a/packages/i18n/src/locales/ja/translations.ts b/packages/i18n/src/locales/ja/translations.ts index 513d5e13293..6d79979904e 100644 --- a/packages/i18n/src/locales/ja/translations.ts +++ b/packages/i18n/src/locales/ja/translations.ts @@ -395,7 +395,6 @@ export default { time_tracking_description: "作業項目やプロジェクトに費やした時間を記録します。", work_management_description: "作業とプロジェクトを簡単に管理します。", documentation: "ドキュメント", - message_support: "サポートにメッセージ", contact_sales: "営業に問い合わせ", hyper_mode: "Hyper Mode", keyboard_shortcuts: "キーボードショートカット", diff --git a/packages/i18n/src/locales/ko/translations.ts b/packages/i18n/src/locales/ko/translations.ts index 5f86903d6ba..cf7e68d36a2 100644 --- a/packages/i18n/src/locales/ko/translations.ts +++ b/packages/i18n/src/locales/ko/translations.ts @@ -390,7 +390,6 @@ export default { time_tracking_description: "작업 항목 및 프로젝트에 소요된 시간을 기록하세요.", work_management_description: "작업 및 프로젝트를 쉽게 관리합니다.", documentation: "문서", - message_support: "지원 메시지", contact_sales: "영업 문의", hyper_mode: "하이퍼 모드", keyboard_shortcuts: "키보드 단축키", diff --git a/packages/i18n/src/locales/pl/translations.ts b/packages/i18n/src/locales/pl/translations.ts index fab1b96e85e..225859e9635 100644 --- a/packages/i18n/src/locales/pl/translations.ts +++ b/packages/i18n/src/locales/pl/translations.ts @@ -393,7 +393,6 @@ export default { time_tracking_description: "Rejestruj czas spędzony na elementach pracy i projektach.", work_management_description: "Łatwo zarządzaj swoją pracą i projektami.", documentation: "Dokumentacja", - message_support: "Skontaktuj się z pomocą", contact_sales: "Skontaktuj się z działem sprzedaży", hyper_mode: "Tryb Hyper", keyboard_shortcuts: "Skróty klawiaturowe", diff --git a/packages/i18n/src/locales/pt-BR/translations.ts b/packages/i18n/src/locales/pt-BR/translations.ts index 31b17890e0a..5282692a17b 100644 --- a/packages/i18n/src/locales/pt-BR/translations.ts +++ b/packages/i18n/src/locales/pt-BR/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Registre o tempo gasto em itens de trabalho e projetos.", work_management_description: "Gerencie seu trabalho e projetos com facilidade.", documentation: "Documentação", - message_support: "Suporte por mensagem", contact_sales: "Contatar vendas", hyper_mode: "Modo Hyper", keyboard_shortcuts: "Atalhos do teclado", diff --git a/packages/i18n/src/locales/ro/translations.ts b/packages/i18n/src/locales/ro/translations.ts index be20aa144fd..09a3312b6c8 100644 --- a/packages/i18n/src/locales/ro/translations.ts +++ b/packages/i18n/src/locales/ro/translations.ts @@ -399,7 +399,6 @@ export default { time_tracking_description: "Înregistrează timpul petrecut pe activități și proiecte.", work_management_description: "Gestionează-ți munca și proiectele cu ușurință.", documentation: "Documentație", - message_support: "Trimite mesaj la suport", contact_sales: "Contactează vânzările", hyper_mode: "Mod Hyper", keyboard_shortcuts: "Scurtături tastatură", diff --git a/packages/i18n/src/locales/ru/translations.ts b/packages/i18n/src/locales/ru/translations.ts index cbaa0081d00..52024d06cd1 100644 --- a/packages/i18n/src/locales/ru/translations.ts +++ b/packages/i18n/src/locales/ru/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Записывайте время, потраченное на рабочие элементы и проекты.", work_management_description: "Управление рабочими элементами и проектами", documentation: "Документация", - message_support: "Написать в поддержку", contact_sales: "Связаться с отделом продаж", hyper_mode: "Гиперрежим", keyboard_shortcuts: "Горячие клавиши", @@ -2869,7 +2868,6 @@ export default { open_plane_documentation: "Открыть документацию Plane", join_forum: "Присоединиться к Forum", report_bug: "Сообщить об ошибке", - chat_with_us: "Написать нам", }, page_placeholders: { default: "Введите команду или поиск", diff --git a/packages/i18n/src/locales/sk/translations.ts b/packages/i18n/src/locales/sk/translations.ts index 9d9343d0030..9a0c42e8e9e 100644 --- a/packages/i18n/src/locales/sk/translations.ts +++ b/packages/i18n/src/locales/sk/translations.ts @@ -395,7 +395,6 @@ export default { time_tracking_description: "Zaznamenajte čas strávený na pracovných položkách a projektoch.", work_management_description: "Spravujte svoju prácu a projekty jednoducho.", documentation: "Dokumentácia", - message_support: "Kontaktovať podporu", contact_sales: "Kontaktovať predaj", hyper_mode: "Hyper režim", keyboard_shortcuts: "Klávesové skratky", diff --git a/packages/i18n/src/locales/tr-TR/translations.ts b/packages/i18n/src/locales/tr-TR/translations.ts index 4b1240fba44..4e60e0cfbec 100644 --- a/packages/i18n/src/locales/tr-TR/translations.ts +++ b/packages/i18n/src/locales/tr-TR/translations.ts @@ -396,7 +396,6 @@ export default { time_tracking_description: "İş öğeleri ve projelerde harcanan zamanı kaydedin.", work_management_description: "İşlerinizi ve projelerinizi kolayca yönetin.", documentation: "Dokümantasyon", - message_support: "Destekle iletişim", contact_sales: "Satış Ekibiyle İletişim", hyper_mode: "Hiper Mod", keyboard_shortcuts: "Klavye Kısayolları", diff --git a/packages/i18n/src/locales/ua/translations.ts b/packages/i18n/src/locales/ua/translations.ts index 1da89e4a65d..0c949cf0567 100644 --- a/packages/i18n/src/locales/ua/translations.ts +++ b/packages/i18n/src/locales/ua/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Фіксуйте час, витрачений на робочі одиниці та проєкти.", work_management_description: "Зручно керуйте своєю роботою та проєктами.", documentation: "Документація", - message_support: "Звернутися в підтримку", contact_sales: "Зв’язатися з відділом продажів", hyper_mode: "Гіпер-режим", keyboard_shortcuts: "Гарячі клавіші", @@ -2861,7 +2860,6 @@ export default { open_plane_documentation: "Відкрити документацію Plane", join_forum: "Приєднатися до Forum", report_bug: "Повідомити про помилку", - chat_with_us: "Написати нам", }, page_placeholders: { default: "Введіть команду або виконайте пошук", diff --git a/packages/i18n/src/locales/vi-VN/translations.ts b/packages/i18n/src/locales/vi-VN/translations.ts index 62036fbe8ca..0cc12c75ea0 100644 --- a/packages/i18n/src/locales/vi-VN/translations.ts +++ b/packages/i18n/src/locales/vi-VN/translations.ts @@ -399,7 +399,6 @@ export default { time_tracking_description: "Ghi lại thời gian dành cho các mục công việc và dự án.", work_management_description: "Quản lý công việc và dự án của bạn một cách dễ dàng.", documentation: "Tài liệu", - message_support: "Liên hệ hỗ trợ", contact_sales: "Liên hệ bộ phận bán hàng", hyper_mode: "Chế độ siêu tốc", keyboard_shortcuts: "Phím tắt", diff --git a/packages/i18n/src/locales/zh-CN/translations.ts b/packages/i18n/src/locales/zh-CN/translations.ts index 9963936a36e..585ae13aa68 100644 --- a/packages/i18n/src/locales/zh-CN/translations.ts +++ b/packages/i18n/src/locales/zh-CN/translations.ts @@ -385,7 +385,6 @@ export default { time_tracking_description: "记录在工作项和项目上花费的时间。", work_management_description: "轻松管理您的工作和项目。", documentation: "文档", - message_support: "联系支持", contact_sales: "联系销售", hyper_mode: "超级模式", keyboard_shortcuts: "键盘快捷键", diff --git a/packages/i18n/src/locales/zh-TW/translations.ts b/packages/i18n/src/locales/zh-TW/translations.ts index e65359c4867..1fcf528fb1d 100644 --- a/packages/i18n/src/locales/zh-TW/translations.ts +++ b/packages/i18n/src/locales/zh-TW/translations.ts @@ -384,7 +384,6 @@ export default { time_tracking_description: "記錄在工作事項和專案上花費的時間。", work_management_description: "輕鬆管理您的工作和專案。", documentation: "文件", - message_support: "聯絡支援", contact_sales: "聯絡業務", hyper_mode: "極速模式", keyboard_shortcuts: "鍵盤快速鍵", diff --git a/packages/logger/package.json b/packages/logger/package.json index 82a149c6d70..bb57e368223 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@plane/logger", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Logger shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/propel/package.json b/packages/propel/package.json index fd0c162ef9f..a6c6ed642c6 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -1,6 +1,6 @@ { "name": "@plane/propel", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/services/package.json b/packages/services/package.json index e4590d17958..40df0f0be51 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -1,6 +1,6 @@ { "name": "@plane/services", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/shared-state/package.json b/packages/shared-state/package.json index 87a2df2ab43..4ebb0aa3fd5 100644 --- a/packages/shared-state/package.json +++ b/packages/shared-state/package.json @@ -1,6 +1,6 @@ { "name": "@plane/shared-state", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Shared state shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/tailwind-config/package.json b/packages/tailwind-config/package.json index 80ab13ff008..b99a90f9c5a 100644 --- a/packages/tailwind-config/package.json +++ b/packages/tailwind-config/package.json @@ -1,6 +1,6 @@ { "name": "@plane/tailwind-config", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "common tailwind configuration across monorepo", "license": "AGPL-3.0", diff --git a/packages/types/package.json b/packages/types/package.json index 4ce05a2c7ea..487cdcaacc8 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@plane/types", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/types/src/instance/base.ts b/packages/types/src/instance/base.ts index 431b09ac0f3..a93baef524f 100644 --- a/packages/types/src/instance/base.ts +++ b/packages/types/src/instance/base.ts @@ -65,9 +65,6 @@ export interface IInstanceConfig { space_base_url: string | undefined; admin_base_url: string | undefined; is_self_managed: boolean; - // intercom - is_intercom_enabled: boolean; - intercom_app_id: string | undefined; instance_changelog_url?: string; } @@ -83,14 +80,11 @@ export interface IInstanceAdmin { user_detail: IUserLite; } -export type TInstanceIntercomConfigurationKeys = "IS_INTERCOM_ENABLED" | "INTERCOM_APP_ID"; - export type TInstanceConfigurationKeys = | TInstanceAIConfigurationKeys | TInstanceEmailConfigurationKeys | TInstanceImageConfigurationKeys | TInstanceAuthenticationKeys - | TInstanceIntercomConfigurationKeys | TInstanceWorkspaceConfigurationKeys; export interface IInstanceConfiguration { diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 4fc7797f587..85383c1a0b8 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@plane/typescript-config", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "files": [ diff --git a/packages/ui/package.json b/packages/ui/package.json index 5801ff7052f..d0bd6f312c3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@plane/ui", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "UI components shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index 712c0a3cfa0..6baa7bcd546 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@plane/utils", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Helper functions shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e048c47f888..aba4b9f488b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,9 +45,6 @@ catalogs: '@types/react-dom': specifier: 18.3.1 version: 18.3.1 - axios: - specifier: 1.13.5 - version: 1.13.5 dotenv: specifier: 16.4.7 version: 16.4.7 @@ -78,9 +75,6 @@ catalogs: tsdown: specifier: 0.16.0 version: 0.16.0 - uuid: - specifier: 13.0.0 - version: 13.0.0 overrides: express: 4.22.0 @@ -99,13 +93,13 @@ overrides: prosemirror-view: 1.40.0 '@types/express': 4.17.23 typescript: 5.8.3 - vite: 7.3.1 + vite: 7.3.2 qs: 6.14.2 diff: 5.2.2 webpack: 5.104.1 lodash-es: 4.18.0 '@isaacs/brace-expansion': 5.0.1 - lodash: 4.17.23 + lodash: 4.18.1 markdown-it: 14.1.1 rollup: 4.59.0 minimatch@3: 3.1.4 @@ -120,6 +114,10 @@ overrides: yaml@2: 2.8.3 path-to-regexp: 0.1.13 defu: 6.1.5 + postcss: 8.5.10 + axios: 1.15.2 + follow-redirects: 1.16.0 + uuid: 14.0.0 importers: @@ -189,8 +187,8 @@ importers: specifier: ^3.13.12 version: 3.13.12 axios: - specifier: 'catalog:' - version: 1.13.5 + specifier: 1.15.2 + version: 1.15.2 isbot: specifier: ^5.1.31 version: 5.1.31 @@ -228,8 +226,8 @@ importers: specifier: 'catalog:' version: 2.2.4(react@18.3.1) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/tailwind-config': specifier: workspace:* @@ -239,7 +237,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) + version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -259,11 +257,11 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + specifier: 7.3.2 + version: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) apps/live: dependencies: @@ -316,8 +314,8 @@ importers: specifier: 'catalog:' version: 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6) axios: - specifier: 'catalog:' - version: 1.13.5 + specifier: 1.15.2 + version: 1.15.2 compression: specifier: 1.8.1 version: 1.8.1 @@ -349,8 +347,8 @@ importers: specifier: ^0.34.3 version: 0.34.3 uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 ws: specifier: ^8.18.3 version: 8.18.3 @@ -461,8 +459,8 @@ importers: specifier: 'catalog:' version: 7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) axios: - specifier: 'catalog:' - version: 1.13.5 + specifier: 1.15.2 + version: 1.15.2 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -512,8 +510,8 @@ importers: specifier: 'catalog:' version: 2.2.4(react@18.3.1) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/tailwind-config': specifier: workspace:* @@ -523,7 +521,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) + version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) '@tailwindcss/typography': specifier: 0.5.19 version: 0.5.19 @@ -546,11 +544,11 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + specifier: 7.3.2 + version: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) apps/web: dependencies: @@ -621,8 +619,8 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: - specifier: 'catalog:' - version: 1.13.5 + specifier: 1.15.2 + version: 1.15.2 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -714,8 +712,8 @@ importers: specifier: ^1.2.2 version: 1.3.0(react@18.3.1) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/tailwind-config': specifier: workspace:* @@ -725,7 +723,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) + version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) '@tailwindcss/typography': specifier: 0.5.19 version: 0.5.19 @@ -751,11 +749,11 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + specifier: 7.3.2 + version: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) packages/codemods: devDependencies: @@ -962,8 +960,8 @@ importers: specifier: ^0.8.10 version: 0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 y-indexeddb: specifier: ^9.0.12 version: 9.0.12(yjs@13.6.27) @@ -996,8 +994,8 @@ importers: specifier: 'catalog:' version: 18.3.1 postcss: - specifier: ^8.4.38 - version: 8.5.6 + specifier: 8.5.10 + version: 8.5.10 tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3)(unrun@0.2.34) @@ -1157,13 +1155,13 @@ importers: version: link:../typescript-config '@storybook/addon-designs': specifier: 10.0.2 - version: 10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-docs': specifier: 9.1.10 - version: 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/react-vite': specifier: 9.1.10 - version: 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@types/react': specifier: 'catalog:' version: 18.3.11 @@ -1172,7 +1170,7 @@ importers: version: 18.3.1 storybook: specifier: 9.1.19 - version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3)(unrun@0.2.34) @@ -1189,8 +1187,8 @@ importers: specifier: workspace:* version: link:../types axios: - specifier: 'catalog:' - version: 1.13.5 + specifier: 1.15.2 + version: 1.15.2 file-type: specifier: ^21.3.1 version: 21.3.3 @@ -1226,8 +1224,8 @@ importers: specifier: 'catalog:' version: 6.0.8(mobx@6.12.0) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 zod: specifier: ^3.22.2 version: 3.25.76 @@ -1254,8 +1252,8 @@ importers: specifier: 4.1.17 version: 4.1.17 postcss: - specifier: 8.5.6 - version: 8.5.6 + specifier: 8.5.10 + version: 8.5.10 devDependencies: tailwindcss: specifier: 4.1.17 @@ -1371,34 +1369,34 @@ importers: version: link:../typescript-config '@storybook/addon-essentials': specifier: ^8.1.1 - version: 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-interactions': specifier: ^8.1.1 - version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-links': specifier: ^8.1.1 - version: 8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-onboarding': specifier: ^8.1.1 - version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-styling-webpack': specifier: ^1.0.0 - version: 1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) + version: 1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@storybook/addon-webpack5-compiler-swc': specifier: ^1.0.2 version: 1.0.6(@swc/helpers@0.5.17)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@storybook/blocks': specifier: ^8.1.1 - version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/react': specifier: ^8.1.1 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) '@storybook/react-webpack5': specifier: ^8.1.1 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) '@storybook/test': specifier: ^8.1.1 - version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -1416,16 +1414,16 @@ importers: version: 18.3.1 autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.6) + version: 10.4.21(postcss@8.5.10) postcss-cli: specifier: ^11.0.0 - version: 11.0.1(jiti@2.6.1)(postcss@8.5.6) + version: 11.0.1(jiti@2.6.1)(postcss@8.5.10) postcss-nested: specifier: ^6.0.1 - version: 6.2.0(postcss@8.5.6) + version: 6.2.0(postcss@8.5.10) storybook: specifier: 9.1.19 - version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3)(unrun@0.2.34) @@ -1490,8 +1488,8 @@ importers: specifier: ^11.0.5 version: 11.0.5 uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/typescript-config': specifier: workspace:* @@ -2321,7 +2319,7 @@ packages: resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} peerDependencies: typescript: 5.8.3 - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: typescript: optional: true @@ -3103,7 +3101,7 @@ packages: react-router: ^7.13.1 react-server-dom-webpack: ^19.2.3 typescript: 5.8.3 - vite: 7.3.1 + vite: 7.3.2 wrangler: ^3.28.2 || ^4.0.0 peerDependenciesMeta: '@react-router/serve': @@ -3603,7 +3601,7 @@ packages: resolution: {integrity: sha512-0ogI+toZJYaFptcFpRcRPOZ9/NrFUYhiaI09ggeEB1FF9ygHMVsobp4eaj4HjZI6V3x7cQwkd2ZmxAMQDBQuMA==} peerDependencies: storybook: ^9.1.10 - vite: 7.3.1 + vite: 7.3.2 '@storybook/builder-webpack5@8.6.14': resolution: {integrity: sha512-YZYAqc6NBKoMTKZpjxnkMch6zDtMkBZdS/yaji1+wJX2QPFBwTbSh7SpeBxDp1S11gXSAJ4f1btUWeqSqo8nJA==} @@ -3703,7 +3701,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^9.1.10 - vite: 7.3.1 + vite: 7.3.2 '@storybook/react-webpack5@8.6.14': resolution: {integrity: sha512-ka0q9tQBLruhO38sybP/MkZzejqAltce7HJTJ2KKbUYUlbvuG7m56tBX7DVC5JaImbsO3b8fqOrKH7gRt4KYrQ==} @@ -4467,7 +4465,7 @@ packages: resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: msw: optional: true @@ -4478,7 +4476,7 @@ packages: resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} peerDependencies: msw: ^2.4.9 - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: msw: optional: true @@ -4734,14 +4732,14 @@ packages: engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.15.2: + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} babel-dead-code-elimination@1.0.10: resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} @@ -5722,8 +5720,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6044,7 +6042,7 @@ packages: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6457,8 +6455,8 @@ packages: lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} @@ -7225,14 +7223,14 @@ packages: engines: {node: '>=18'} hasBin: true peerDependencies: - postcss: ^8.0.0 + postcss: 8.5.10 postcss-load-config@5.1.0: resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} engines: {node: '>= 18'} peerDependencies: jiti: '>=1.21.0' - postcss: '>=8.0.9' + postcss: 8.5.10 tsx: ^4.8.1 peerDependenciesMeta: jiti: @@ -7246,37 +7244,37 @@ packages: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-modules-local-by-default@4.2.0: resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-modules-scope@3.2.1: resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-modules-values@4.0.0: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: - postcss: ^8.2.14 + postcss: 8.5.10 postcss-reporter@7.1.0: resolution: {integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==} engines: {node: '>=10'} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -7293,8 +7291,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} prettier@3.7.4: @@ -7396,8 +7394,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -8430,16 +8429,8 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true uvu@0.5.6: @@ -8489,13 +8480,13 @@ packages: vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: vite: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -9194,7 +9185,7 @@ snapshots: dependencies: '@effect/platform': 0.94.1(effect@3.20.0) effect: 3.20.0 - uuid: 11.1.0 + uuid: 14.0.0 optionalDependencies: ioredis: 5.7.0 @@ -9245,7 +9236,7 @@ snapshots: '@effect/experimental': 0.58.0(@effect/platform@0.94.1(effect@3.20.0))(effect@3.20.0)(ioredis@5.7.0) '@effect/platform': 0.94.1(effect@3.20.0) effect: 3.20.0 - uuid: 11.1.0 + uuid: 14.0.0 '@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.20.0))(effect@3.20.0)(ioredis@5.7.0))(@effect/platform@0.94.1(effect@3.20.0))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.20.0))(effect@3.20.0))(effect@3.20.0)': dependencies: @@ -9458,7 +9449,7 @@ snapshots: kleur: 4.1.5 lodash.debounce: 4.0.8 redlock: 4.2.0 - uuid: 11.1.0 + uuid: 14.0.0 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 transitivePeerDependencies: @@ -9484,7 +9475,7 @@ snapshots: async-lock: 1.4.1 kleur: 4.1.5 lib0: 0.2.114 - uuid: 11.1.0 + uuid: 14.0.0 ws: 8.18.3 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -9615,12 +9606,12 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: glob: 11.1.0 magic-string: 0.30.21 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) optionalDependencies: typescript: 5.8.3 @@ -10298,7 +10289,7 @@ snapshots: '@react-pdf/primitives': 4.1.1 '@react-pdf/stylesheet': 6.1.2 - '@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3)': + '@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.5 @@ -10317,7 +10308,7 @@ snapshots: exit-hook: 2.2.1 isbot: 5.1.31 jsesc: 3.0.2 - lodash: 4.17.23 + lodash: 4.18.1 p-map: 7.0.3 pathe: 1.1.2 picocolors: 1.1.1 @@ -10328,7 +10319,7 @@ snapshots: semver: 7.7.4 tinyglobby: 0.2.15 valibot: 1.2.0(typescript@5.8.3) - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) optionalDependencies: '@react-router/serve': 7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) @@ -10563,133 +10554,133 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@storybook/addon-actions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-actions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - uuid: 9.0.1 + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + uuid: 14.0.0 - '@storybook/addon-backgrounds@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-backgrounds@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-controls@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@figspec/react': 1.0.4(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: - '@storybook/addon-docs': 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-docs': 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) - '@storybook/blocks': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/csf-plugin': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/blocks': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/csf-plugin': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) - '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-controls': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-docs': 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-highlight': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-measure': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-outline': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-toolbars': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-viewport': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@storybook/addon-essentials@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + dependencies: + '@storybook/addon-actions': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-controls': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-docs': 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-highlight': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-measure': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-outline': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-toolbars': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-viewport': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-highlight@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-highlight@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/addon-interactions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-interactions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) polished: 4.3.1 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-links@8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-links@8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 - '@storybook/addon-measure@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-measure@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tiny-invariant: 1.3.3 - '@storybook/addon-onboarding@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-onboarding@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/addon-outline@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-outline@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-styling-webpack@1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': + '@storybook/addon-styling-webpack@1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: - '@storybook/node-logger': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/node-logger': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) transitivePeerDependencies: - storybook - '@storybook/addon-toolbars@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-toolbars@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/addon-viewport@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-viewport@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: memoizerific: 1.11.3 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@storybook/addon-webpack5-compiler-swc@1.0.6(@swc/helpers@0.5.17)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: @@ -10699,25 +10690,25 @@ snapshots: - '@swc/helpers' - webpack - '@storybook/blocks@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/blocks@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@storybook/builder-vite@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: - '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) - '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@types/semver': 7.7.1 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -10731,7 +10722,7 @@ snapshots: path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.4 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) terser-webpack-plugin: 5.3.16(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 @@ -10751,23 +10742,23 @@ snapshots: - uglify-js - webpack-cli - '@storybook/components@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/components@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/core-webpack@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/core-webpack@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/csf-plugin@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/csf-plugin@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/csf-plugin@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -10777,24 +10768,24 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/instrumenter@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/instrumenter@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/manager-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/manager-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/node-logger@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/node-logger@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@types/semver': 7.7.1 find-up: 5.0.0 @@ -10804,7 +10795,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 semver: 7.7.4 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsconfig-paths: 4.2.0 webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) optionalDependencies: @@ -10817,9 +10808,9 @@ snapshots: - uglify-js - webpack-cli - '@storybook/preview-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/preview-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: @@ -10835,46 +10826,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/react-dom-shim@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/react-dom-shim@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/react-dom-shim@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/react-dom-shim@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/react-vite@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@storybook/react-vite@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@rollup/pluginutils': 5.2.0(rollup@4.59.0) - '@storybook/builder-vite': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/builder-vite': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) find-up: 7.0.0 magic-string: 0.30.21 react: 18.3.1 react-docgen: 8.0.1 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsconfig-paths: 4.2.0 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/builder-webpack5': 8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10886,45 +10877,45 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/components': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/preview-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/theming': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/manager-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/preview-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/theming': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: - '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) typescript: 5.8.3 - '@storybook/react@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/react@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: typescript: 5.8.3 - '@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/theming@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/theming@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@swc/core-darwin-arm64@1.13.5': optional: true @@ -11049,7 +11040,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.1.17 '@tailwindcss/oxide': 4.1.17 - postcss: 8.5.6 + postcss: 8.5.10 tailwindcss: 4.1.17 '@tailwindcss/typography@0.5.19': @@ -11090,7 +11081,7 @@ snapshots: chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.23 + lodash: 4.18.1 redent: 3.0.0 '@testing-library/jest-dom@6.9.1': @@ -11678,21 +11669,21 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) - '@vitest/mocker@4.0.15(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@vitest/mocker@4.0.15(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) '@vitest/pretty-format@2.0.5': dependencies: @@ -11969,25 +11960,25 @@ snapshots: attr-accept@2.2.5: {} - autoprefixer@10.4.21(postcss@8.5.6): + autoprefixer@10.4.21(postcss@8.5.10): dependencies: browserslist: 4.28.1 caniuse-lite: 1.0.30001759 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.10 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axios@1.13.5: + axios@1.15.2: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -12410,12 +12401,12 @@ snapshots: css-loader@6.11.0(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) + postcss-modules-scope: 3.2.1(postcss@8.5.10) + postcss-modules-values: 4.0.0(postcss@8.5.10) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: @@ -12836,7 +12827,7 @@ snapshots: express-winston@4.2.0(winston@3.17.0): dependencies: chalk: 2.4.2 - lodash: 4.17.23 + lodash: 4.18.1 winston: 3.17.0 express-ws@5.0.2(express@4.22.0): @@ -12990,7 +12981,7 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.11: {} + follow-redirects@1.16.0: {} fontfaceobserver@2.1.0: {} @@ -13315,7 +13306,7 @@ snapshots: dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.17.23 + lodash: 4.18.1 pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: @@ -13374,9 +13365,9 @@ snapshots: safer-buffer: 2.1.2 optional: true - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 ieee754@1.2.1: {} @@ -13783,7 +13774,7 @@ snapshots: lodash.isarguments@3.1.0: {} - lodash@4.17.23: {} + lodash@4.18.1: {} log-update@6.1.0: dependencies: @@ -14774,15 +14765,15 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-cli@11.0.1(jiti@2.6.1)(postcss@8.5.6): + postcss-cli@11.0.1(jiti@2.6.1)(postcss@8.5.10): dependencies: chokidar: 3.6.0 dependency-graph: 1.0.0 fs-extra: 11.3.1 picocolors: 1.1.1 - postcss: 8.5.6 - postcss-load-config: 5.1.0(jiti@2.6.1)(postcss@8.5.6) - postcss-reporter: 7.1.0(postcss@8.5.6) + postcss: 8.5.10 + postcss-load-config: 5.1.0(jiti@2.6.1)(postcss@8.5.10) + postcss-reporter: 7.1.0(postcss@8.5.10) pretty-hrtime: 1.0.3 read-cache: 1.0.0 slash: 5.1.0 @@ -14792,44 +14783,44 @@ snapshots: - jiti - tsx - postcss-load-config@5.1.0(jiti@2.6.1)(postcss@8.5.6): + postcss-load-config@5.1.0(jiti@2.6.1)(postcss@8.5.10): dependencies: lilconfig: 3.1.3 yaml: 2.8.3 optionalDependencies: jiti: 2.6.1 - postcss: 8.5.6 + postcss: 8.5.10 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.10): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-values@4.0.0(postcss@8.5.10): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 - postcss-nested@6.2.0(postcss@8.5.6): + postcss-nested@6.2.0(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 postcss-selector-parser: 6.1.2 - postcss-reporter@7.1.0(postcss@8.5.6): + postcss-reporter@7.1.0(postcss@8.5.10): dependencies: picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.10 thenby: 1.3.4 postcss-selector-parser@6.0.10: @@ -14849,7 +14840,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.10: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -14859,7 +14850,7 @@ snapshots: pretty-error@4.0.0: dependencies: - lodash: 4.17.23 + lodash: 4.18.1 renderkid: 3.0.0 pretty-format@27.5.1: @@ -14997,7 +14988,7 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} punycode.js@2.3.1: {} @@ -15040,7 +15031,7 @@ snapshots: react-color@2.19.3(react@18.3.1): dependencies: '@icons/material': 0.2.4(react@18.3.1) - lodash: 4.17.23 + lodash: 4.18.1 lodash-es: 4.18.0 material-colors: 1.2.6 prop-types: 15.8.1 @@ -15146,7 +15137,7 @@ snapshots: create-react-class: 15.7.0 element-resize-detector: 1.2.4 imagesloaded: 4.1.4 - lodash: 4.17.23 + lodash: 4.18.1 masonry-layout: 4.2.2 prop-types: 15.8.1 react: 18.3.1 @@ -15237,7 +15228,7 @@ snapshots: reactcss@1.2.3(react@18.3.1): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 18.3.1 read-cache@1.0.0: @@ -15270,7 +15261,7 @@ snapshots: dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 - lodash: 4.17.23 + lodash: 4.18.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 @@ -15383,7 +15374,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.17.23 + lodash: 4.18.1 strip-ansi: 6.0.1 require-directory@2.1.1: {} @@ -15535,7 +15526,7 @@ snapshots: htmlparser2: 8.0.2 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.5.6 + postcss: 8.5.10 saxes@6.0.0: dependencies: @@ -15771,13 +15762,13 @@ snapshots: std-env@3.10.0: {} - storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): + storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.25.0 @@ -16249,11 +16240,7 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.0: {} - - uuid@13.0.0: {} - - uuid@9.0.1: {} + uuid@14.0.0: {} uvu@0.5.6: dependencies: @@ -16324,7 +16311,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -16339,23 +16326,23 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3): + vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@2.3.2) picomatch: 2.3.2 - postcss: 8.5.6 + postcss: 8.5.10 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: @@ -16369,7 +16356,7 @@ snapshots: vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@vitest/mocker': 4.0.15(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -16386,7 +16373,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b20c3be19de..07774acb972 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,7 +19,7 @@ catalog: "@types/node": 22.12.0 "@types/react-dom": 18.3.1 "@types/react": 18.3.11 - axios: 1.13.5 + axios: 1.15.2 express: 4.22.0 lodash-es: 4.18.0 lucide-react: 0.469.0 @@ -32,8 +32,8 @@ catalog: swr: 2.2.4 tsdown: 0.16.0 typescript: 5.8.3 - uuid: 13.0.0 - vite: 7.3.1 + uuid: 14.0.0 + vite: 7.3.2 onlyBuiltDependencies: - turbo