* chore: fix lint

* fix: constants check:lint command

* chore(lint): permit unused vars which begin w/ _

* chore: rm dead code

* fix(lint): more lint fixes to constants pkg

* fix(lint): lint the live server

- fix lint issues

* chore: improve clean script

* fix(lint): more lint

* chore: set live server process title

* chore(deps): update to turbo@2.5.5

* chore(live): target node22

* fix(dev): add missing ui pkg dependency

* fix(dev): lint decorators

* fix(dev): lint space app

* fix(dev): address lint issues in types pkg

* fix(dev): lint editor pkg

* chore(dev): moar lint

* fix(dev): live server exit code

* chore: address PR feedback

* fix(lint): better TPageExtended type

* chore: refactor

* chore: revert most live server changes

* fix: few more lint issues

* chore: enable ci checks

Ensure we can build + confirm that lint is not getting worse.

* chore: address PR feedback

* fix: web lint warning added to package.json

* fix: ci:lint command

---------

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
This commit is contained in:
Aaron Heckmann 2025-07-24 13:14:51 -07:00 committed by GitHub
parent 514686d9d5
commit 57479f4554
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
95 changed files with 348 additions and 460 deletions

View File

@ -1,95 +0,0 @@
name: Build and Lint on Pull Request
on:
workflow_dispatch:
pull_request:
types: ["opened", "synchronize", "ready_for_review"]
jobs:
lint-server:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x" # Specify the Python version you need
- name: Install Pylint
run: python -m pip install ruff
- name: Install Server Dependencies
run: cd apps/server && pip install -r requirements.txt
- name: Lint apps/server
run: ruff check --fix apps/server
lint-admin:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- run: yarn install
- run: yarn lint --filter=admin
lint-space:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- run: yarn install
- run: yarn lint --filter=space
lint-web:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- run: yarn install
- run: yarn lint --filter=web
build-admin:
needs: lint-admin
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- run: yarn install
- run: yarn build --filter=admin
build-space:
needs: lint-space
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- run: yarn install
- run: yarn build --filter=space
build-web:
needs: lint-web
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
- run: yarn install
- run: yarn build --filter=web

View File

@ -0,0 +1,29 @@
name: Build and lint API
on:
workflow_dispatch:
pull_request:
branches: ["preview"]
types: ["opened", "synchronize", "ready_for_review", "review_requested", "reopened"]
paths:
- "apps/api/**"
jobs:
lint-api:
runs-on: ubuntu-latest
timeout-minutes: 15
if: |
github.event.pull_request.draft == false &&
github.event.pull_request.requested_reviewers != null
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install Pylint
run: python -m pip install ruff
- name: Install API Dependencies
run: cd apps/api && pip install -r requirements.txt
- name: Lint apps/api
run: ruff check --fix apps/api

View File

@ -0,0 +1,42 @@
name: Build and lint web apps
on:
workflow_dispatch:
pull_request:
branches: ["preview"]
types: ["opened", "synchronize", "ready_for_review", "review_requested", "reopened"]
paths:
- "**.tsx?"
- "**.jsx?"
- "**.css"
- "**.json"
- "!apps/api/**"
jobs:
build-and-lint:
runs-on: ubuntu-latest
timeout-minutes: 15
if: |
github.event.pull_request.draft == false &&
github.event.pull_request.requested_reviewers != null
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build web apps
run: yarn run build
- name: Lint web apps
run: yarn run ci:lint

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
lts/jod

View File

@ -66,9 +66,11 @@ const InstanceGitlabAuthenticationPage = observer(() => {
<ToggleSwitch
value={Boolean(parseInt(enableGitlabConfig))}
onChange={() => {
Boolean(parseInt(enableGitlabConfig)) === true
? updateConfig("IS_GITLAB_ENABLED", "0")
: updateConfig("IS_GITLAB_ENABLED", "1");
if (Boolean(parseInt(enableGitlabConfig)) === true) {
updateConfig("IS_GITLAB_ENABLED", "0");
} else {
updateConfig("IS_GITLAB_ENABLED", "1");
}
}}
size="sm"
disabled={isSubmitting || !formattedConfig}

View File

@ -67,9 +67,11 @@ const InstanceGoogleAuthenticationPage = observer(() => {
<ToggleSwitch
value={Boolean(parseInt(enableGoogleConfig))}
onChange={() => {
Boolean(parseInt(enableGoogleConfig)) === true
? updateConfig("IS_GOOGLE_ENABLED", "0")
: updateConfig("IS_GOOGLE_ENABLED", "1");
if (Boolean(parseInt(enableGoogleConfig)) === true) {
updateConfig("IS_GOOGLE_ENABLED", "0");
} else {
updateConfig("IS_GOOGLE_ENABLED", "1");
}
}}
size="sm"
disabled={isSubmitting || !formattedConfig}

View File

@ -10,7 +10,7 @@
"preview": "next build && next start",
"start": "next start",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 19",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -10,7 +10,7 @@
"dev": "tsup --watch --onSuccess 'node --env-file=.env dist/server.js'",
"build": "tsc --noEmit && tsup",
"start": "node --env-file=.env dist/server.js",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 10",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",
@ -51,14 +51,15 @@
"@types/compression": "1.8.1",
"@types/cors": "^2.8.17",
"@types/dotenv": "^8.2.0",
"@types/express": "^4.17.21",
"@types/express-ws": "^3.0.4",
"@types/express": "^4.17.23",
"@types/express-ws": "^3.0.5",
"@types/node": "^20.14.9",
"@types/pino-http": "^5.8.4",
"concurrently": "^9.0.1",
"nodemon": "^3.1.7",
"ts-node": "^10.9.2",
"tsup": "8.4.0",
"typescript": "5.8.3"
"typescript": "5.8.3",
"ws": "^8.18.3"
}
}

View File

@ -1 +1 @@
export type TAdditionalDocumentTypes = {};
export type TAdditionalDocumentTypes = never;

View File

@ -9,6 +9,7 @@ const transport = {
};
const hooks = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
logMethod(inputArgs: any, method: any): any {
if (inputArgs.length >= 2) {
const arg1 = inputArgs.shift();

View File

@ -52,7 +52,7 @@ export const getHocusPocusServer = async () => {
cookie,
userId,
});
} catch (error) {
} catch (_error) {
throw Error("Authentication unsuccessful!");
}
},

View File

@ -36,7 +36,7 @@ export abstract class APIService {
return this.axiosInstance.patch(url, data, config);
}
delete(url: string, data?: any, config = {}) {
delete(url: string, data?: Record<string, unknown> | null | string, config = {}) {
return this.axiosInstance.delete(url, { data, ...config });
}

View File

@ -10,7 +10,7 @@ type Props = {
workspaceSlug: string;
projectId: string;
};
searchParams: any;
searchParams: Record<"board" | "peekId", string | string[] | undefined>;
};
export default async function IssuesPage(props: Props) {
@ -23,7 +23,7 @@ export default async function IssuesPage(props: Props) {
try {
response = await publishService.retrieveSettingsByProjectId(workspaceSlug, projectId);
} catch (error) {
// redirect to 404 page on error
console.error("Error fetching project publish settings:", error);
notFound();
}
@ -31,8 +31,8 @@ export default async function IssuesPage(props: Props) {
if (response?.entity_name === "project") {
url = `/issues/${response?.anchor}`;
const params = new URLSearchParams();
if (board) params.append("board", board);
if (peekId) params.append("peekId", peekId);
if (board) params.append("board", String(board));
if (peekId) params.append("peekId", String(peekId));
if (params.toString()) url += `?${params.toString()}`;
redirect(url);
} else {

View File

@ -109,7 +109,9 @@ export const AuthPasswordForm: React.FC<Props> = observer((props: Props) => {
onSubmit={async (event) => {
event.preventDefault();
await handleCSRFToken();
formRef.current && formRef.current.submit();
if (formRef.current) {
formRef.current.submit();
}
setIsSubmitting(true);
}}
onError={() => setIsSubmitting(false)}

View File

@ -1,6 +1,6 @@
import { FC } from "react";
import { useSearchParams } from "next/navigation";
import Image from "next/image";
import { useSearchParams } from "next/navigation";
import { useTheme } from "next-themes";
import { API_BASE_URL } from "@plane/constants";
// images

View File

@ -1,6 +1,6 @@
import { FC } from "react";
import { useSearchParams } from "next/navigation";
import Image from "next/image";
import { useSearchParams } from "next/navigation";
import { useTheme } from "next-themes";
import { API_BASE_URL } from "@plane/constants";
// images

View File

@ -1,6 +1,6 @@
import { FC } from "react";
import { useSearchParams } from "next/navigation";
import Image from "next/image";
import { useSearchParams } from "next/navigation";
import { useTheme } from "next-themes";
import { API_BASE_URL } from "@plane/constants";
// images

View File

@ -39,18 +39,10 @@ export const AppliedFiltersList: React.FC<Props> = observer((props) => {
{filterKey === "priority" && (
<AppliedPriorityFilters
handleRemove={(val) => handleRemoveFilter("priority", val)}
values={filterValue ?? []}
values={(filterValue ?? []) as TFilters["priority"]}
/>
)}
{/* {filterKey === "labels" && labels && (
<AppliedLabelsFilters
handleRemove={(val) => handleRemoveFilter("labels", val)}
labels={labels}
values={value}
/>
)} */}
{filterKey === "state" && (
<AppliedStateFilters
handleRemove={(val) => handleRemoveFilter("state", val)}

View File

@ -1,11 +1,11 @@
"use client";
import { X } from "lucide-react";
import { PriorityIcon } from "@plane/ui";
import { PriorityIcon, type TIssuePriorities } from "@plane/ui";
type Props = {
handleRemove: (val: string) => void;
values: string[];
values: TIssuePriorities[];
};
export const AppliedPriorityFilters: React.FC<Props> = (props) => {
@ -17,7 +17,7 @@ export const AppliedPriorityFilters: React.FC<Props> = (props) => {
values.length > 0 &&
values.map((priority) => (
<div key={priority} className="flex items-center gap-1 rounded bg-custom-background-80 p-1 text-xs">
<PriorityIcon priority={priority as any} className={`h-3 w-3`} />
<PriorityIcon priority={priority} className={`h-3 w-3`} />
{priority}
<button
type="button"

View File

@ -7,7 +7,7 @@ import { useRouter } from "next/navigation";
// hooks
import { useIssueFilter } from "@/hooks/store";
// store
import { TIssueQueryFilters } from "@/types/issue";
import type { TIssueLayout, TIssueQueryFilters } from "@/types/issue";
// components
import { AppliedFiltersList } from "./filters-list";
@ -39,13 +39,21 @@ export const IssueAppliedFilters: FC<TIssueAppliedFilters> = observer((props) =>
const priority = key === "priority" ? value : (issueFilters?.filters?.priority ?? []);
const labels = key === "labels" ? value : (issueFilters?.filters?.labels ?? []);
let params: any = { board: activeLayout || "list" };
if (priority.length > 0) params = { ...params, priority: priority.join(",") };
if (state.length > 0) params = { ...params, states: state.join(",") };
if (labels.length > 0) params = { ...params, labels: labels.join(",") };
params = new URLSearchParams(params).toString();
const params: {
board: TIssueLayout | string;
priority?: string;
states?: string;
labels?: string;
} = {
board: activeLayout || "list",
};
router.push(`/issues/${anchor}?${params}`);
if (priority.length > 0) params.priority = priority.join(",");
if (state.length > 0) params.states = state.join(",");
if (labels.length > 0) params.labels = labels.join(",");
const qs = new URLSearchParams(params).toString();
router.push(`/issues/${anchor}?${qs}`);
},
[activeLayout, anchor, issueFilters, router]
);

View File

@ -37,7 +37,7 @@ export const IssueKanbanLayoutRoot: React.FC<Props> = observer((props: Props) =>
fetchNextPublicIssues(anchor, groupId, subgroupId);
}
},
[fetchNextPublicIssues]
[anchor, getIssueLoader, fetchNextPublicIssues]
);
const debouncedFetchMoreIssues = debounce(

View File

@ -41,7 +41,7 @@ export const IssuesListLayoutRoot = observer((props: Props) => {
(groupId?: string) => {
fetchNextPublicIssues(anchor, groupId);
},
[fetchNextPublicIssues]
[anchor, fetchNextPublicIssues]
);
return (

View File

@ -18,7 +18,9 @@ export const useIntersectionObserver = (
const observer = new IntersectionObserver(
(entries) => {
if (entries[entries.length - 1].isIntersecting) {
callback && callback();
if (callback) {
callback();
}
}
},
{

View File

@ -64,7 +64,7 @@ export class InstanceStore implements IInstanceStore {
this.instance = instanceInfo.instance;
this.config = instanceInfo.config;
});
} catch (error) {
} catch (_error) {
runInAction(() => {
this.isLoading = false;
this.error = {

View File

@ -194,7 +194,7 @@ export class IssueDetailStore implements IIssueDetailStore {
});
await this.issueService.updateComment(anchor, issueID, commentID, data);
} catch (error) {
} catch (_error) {
const issueComments = await this.issueService.listComments(anchor, issueID);
runInAction(() => {
@ -222,7 +222,7 @@ export class IssueDetailStore implements IIssueDetailStore {
},
};
});
} catch (error) {
} catch (_error) {
console.log("Failed to add issue vote");
}
};
@ -288,7 +288,7 @@ export class IssueDetailStore implements IIssueDetailStore {
await this.issueService.addCommentReaction(anchor, commentID, {
reaction: reactionHex,
});
} catch (error) {
} catch (_error) {
const issueComments = await this.issueService.listComments(anchor, issueID);
runInAction(() => {
@ -322,7 +322,7 @@ export class IssueDetailStore implements IIssueDetailStore {
});
await this.issueService.removeCommentReaction(anchor, commentID, reactionHex);
} catch (error) {
} catch (_error) {
const issueComments = await this.issueService.listComments(anchor, issueID);
runInAction(() => {
@ -356,7 +356,7 @@ export class IssueDetailStore implements IIssueDetailStore {
await this.issueService.addReaction(anchor, issueID, {
reaction: reactionHex,
});
} catch (error) {
} catch (_error) {
console.log("Failed to add issue vote");
const issueReactions = await this.issueService.listReactions(anchor, issueID);
runInAction(() => {
@ -376,7 +376,7 @@ export class IssueDetailStore implements IIssueDetailStore {
});
await this.issueService.removeReaction(anchor, issueID, reactionHex);
} catch (error) {
} catch (_error) {
console.log("Failed to remove issue reaction");
const reactions = await this.issueService.listReactions(anchor, issueID);
runInAction(() => {
@ -408,7 +408,7 @@ export class IssueDetailStore implements IIssueDetailStore {
});
await this.issueService.addVote(anchor, issueID, data);
} catch (error) {
} catch (_error) {
console.log("Failed to add issue vote");
const issueVotes = await this.issueService.listVotes(anchor, issueID);
@ -429,7 +429,7 @@ export class IssueDetailStore implements IIssueDetailStore {
});
await this.issueService.removeVote(anchor, issueID);
} catch (error) {
} catch (_error) {
console.log("Failed to remove issue vote");
const issueVotes = await this.issueService.listVotes(anchor, issueID);

View File

@ -91,7 +91,7 @@ export class ProfileStore implements IProfileStore {
this.data = userProfile;
});
return userProfile;
} catch (error) {
} catch (_error) {
runInAction(() => {
this.isLoading = false;
this.error = {
@ -118,7 +118,7 @@ export class ProfileStore implements IProfileStore {
}
const userProfile = await this.userService.updateProfile(data);
return userProfile;
} catch (error) {
} catch (_error) {
if (currentUserProfileData) {
Object.keys(currentUserProfileData).forEach((key: string) => {
const userKey: keyof TUserProfile = key as keyof TUserProfile;

View File

@ -35,7 +35,7 @@ export const getDate = (date: string | Date | undefined | null): Date | undefine
if (!isNumber(year) || !isNumber(month) || !isNumber(day)) return;
return new Date(year, month - 1, day);
} catch (e) {
} catch (_err) {
return undefined;
}
};

View File

@ -19,7 +19,7 @@ const fallbackCopyTextToClipboard = (text: string) => {
// FIXME: Even though we are using this as a fallback, execCommand is deprecated 👎. We should find a better way to do this.
// https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
document.execCommand("copy");
} catch (err) {}
} catch (_err) {}
document.body.removeChild(textArea);
};

View File

@ -8,7 +8,7 @@
"build": "next build",
"start": "next start",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 27",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",
@ -64,7 +64,7 @@
"@types/react-dom": "^18.2.18",
"@types/uuid": "^9.0.1",
"@types/zxcvbn": "^4.4.4",
"@typescript-eslint/eslint-plugin": "^5.48.2",
"@typescript-eslint/eslint-plugin": "^8.36.0",
"typescript": "5.8.3"
}
}

View File

@ -1,3 +1,4 @@
.next/*
out/*
public/*
public/*
core/local-db/worker/wa-sqlite/src/*

View File

@ -2,7 +2,7 @@
import { observer } from "mobx-react";
// ui
import { GanttChartSquare, LayoutGrid, List } from "lucide-react";
import { GanttChartSquare, LayoutGrid, List, type LucideIcon } from "lucide-react";
// plane package imports
import { TCycleLayoutOptions } from "@plane/types";
import { CustomMenu } from "@plane/ui";
@ -11,7 +11,7 @@ import { useCycleFilter, useProject } from "@/hooks/store";
const CYCLE_VIEW_LAYOUTS: {
key: TCycleLayoutOptions;
icon: any;
icon: LucideIcon;
title: string;
}[] = [
{

View File

@ -14,7 +14,7 @@ import { PasswordStrengthMeter } from "@/components/account";
import { PageHead } from "@/components/core";
import { ProfileSettingContentHeader } from "@/components/profile";
// helpers
import { authErrorHandler } from "@/helpers/authentication.helper";
import { authErrorHandler, type EAuthenticationErrorCodes } from "@/helpers/authentication.helper";
// hooks
import { useUser } from "@/hooks/store";
// services
@ -87,8 +87,14 @@ const SecurityPage = observer(() => {
title: t("auth.common.password.toast.change_password.success.title"),
message: t("auth.common.password.toast.change_password.success.message"),
});
} catch (err: any) {
const errorInfo = authErrorHandler(err.error_code?.toString());
} catch (error: unknown) {
let errorInfo = undefined;
if (error instanceof Error) {
const err = error as Error & { error_code?: string };
const code = err.error_code?.toString();
errorInfo = code ? authErrorHandler(code as EAuthenticationErrorCodes) : undefined;
}
setToast({
type: TOAST_TYPE.ERROR,
title: errorInfo?.title ?? t("auth.common.password.toast.error.title"),

View File

@ -95,11 +95,17 @@ const SetPasswordPage = observer(() => {
if (!csrfToken) throw new Error("csrf token not found");
await handleSetPassword(csrfToken, { password: passwordFormData.password });
router.push("/");
} catch (err: any) {
} catch (error: unknown) {
let message = undefined;
if (error instanceof Error) {
const err = error as Error & { error?: string };
message = err.error;
}
setToast({
type: TOAST_TYPE.ERROR,
title: t("common.errors.default.title"),
message: err?.error ?? t("common.errors.default.message"),
message: message ?? t("common.errors.default.message"),
});
}
};

View File

@ -30,7 +30,7 @@ const CreateWorkspacePage = observer(() => {
const { data: currentUser } = useUser();
const { updateUserProfile } = useUserProfile();
// states
const [defaultValues, setDefaultValues] = useState({
const [defaultValues, setDefaultValues] = useState<Pick<IWorkspace, "name" | "slug" | "organization_size">>({
name: "",
slug: "",
organization_size: "",
@ -101,7 +101,7 @@ const CreateWorkspacePage = observer(() => {
<CreateWorkspaceForm
onSubmit={onSubmit}
defaultValues={defaultValues}
setDefaultValues={setDefaultValues as any}
setDefaultValues={setDefaultValues}
/>
</div>
</div>

View File

@ -42,10 +42,14 @@ const OnboardingPage = observer(() => {
// computed values
const workspacesList = Object.values(workspaces ?? {});
// fetching workspaces list
const { isLoading: workspaceListLoader } = useSWR(USER_WORKSPACES_LIST, () => {
user?.id && fetchWorkspaces();
if (user?.id) {
fetchWorkspaces();
}
});
// fetching user workspace invitations
const { isLoading: invitationsLoader, data: invitations } = useSWR(
`USER_WORKSPACE_INVITATIONS_LIST_${user?.id}`,

View File

@ -14,7 +14,7 @@ import { PasswordStrengthMeter } from "@/components/account/password-strength-me
import { PageHead } from "@/components/core/page-title";
import { ProfileSettingContentHeader, ProfileSettingContentWrapper } from "@/components/profile";
// helpers
import { authErrorHandler } from "@/helpers/authentication.helper";
import { authErrorHandler, type EAuthenticationErrorCodes } from "@/helpers/authentication.helper";
// hooks
import { useUser } from "@/hooks/store";
// services
@ -87,8 +87,10 @@ const SecurityPage = observer(() => {
title: t("auth.common.password.toast.change_password.success.title"),
message: t("auth.common.password.toast.change_password.success.message"),
});
} catch (err: any) {
const errorInfo = authErrorHandler(err.error_code?.toString());
} catch (error: unknown) {
const err = error as Error & { error_code?: string };
const code = err.error_code?.toString();
const errorInfo = code ? authErrorHandler(code as EAuthenticationErrorCodes) : undefined;
setToast({
type: TOAST_TYPE.ERROR,
title: errorInfo?.title ?? t("auth.common.password.toast.error.title"),

View File

@ -6,7 +6,7 @@ import { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element
import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element";
import { observer } from "mobx-react";
// plane constants
import { DRAG_ALLOWED_GROUPS } from "@plane/constants";
import { DRAG_ALLOWED_GROUPS } from "@plane/constants";
// i18n
import { useTranslation } from "@plane/i18n";
//types

View File

@ -5,7 +5,7 @@ import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
import { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import { observer } from "mobx-react";
// plane constants
import { DRAG_ALLOWED_GROUPS } from "@plane/constants";
import { DRAG_ALLOWED_GROUPS } from "@plane/constants";
// plane i18n
import { useTranslation } from "@plane/i18n";
// plane ui

View File

@ -6,7 +6,7 @@ import { useParams } from "next/navigation";
import { useForm, UseFormRegister } from "react-hook-form";
import { PlusIcon } from "lucide-react";
// plane constants
import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants";
import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants";
// i18n
import { useTranslation } from "@plane/i18n";
import { IProject, TIssue, EIssueLayoutTypes } from "@plane/types";

View File

@ -29,7 +29,7 @@ type Props = {
slug: string;
organization_size: string;
};
setDefaultValues: Dispatch<SetStateAction<IWorkspace>>;
setDefaultValues: Dispatch<SetStateAction<Pick<IWorkspace, "name" | "slug" | "organization_size">>>;
secondaryButton?: React.ReactNode;
primaryButtonText?: {
loading: string;

View File

@ -8,7 +8,7 @@
"build": "next build",
"start": "next start",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 821",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -13,14 +13,15 @@
"build": "turbo run build",
"dev": "turbo run dev --concurrency=18",
"start": "turbo run start",
"clean": "turbo run clean",
"clean": "turbo run clean && rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist",
"fix": "turbo run fix",
"check": "turbo run check"
"check": "turbo run check",
"ci:lint": "turbo run check:lint"
},
"devDependencies": {
"prettier": "latest",
"prettier-plugin-tailwindcss": "^0.5.4",
"turbo": "^2.5.4"
"turbo": "^2.5.5"
},
"resolutions": {
"brace-expansion": "2.0.2",
@ -30,7 +31,8 @@
"@babel/runtime": "7.26.10",
"chokidar": "3.6.0",
"tar-fs": "3.0.9",
"prosemirror-view": "1.40.0"
"prosemirror-view": "1.40.0",
"@types/express": "4.17.23"
},
"packageManager": "yarn@1.22.22"
}

View File

@ -6,7 +6,9 @@ export interface IInsightField {
i18nProps?: {
entity?: string;
entityPlural?: string;
[key: string]: any;
prefix?: string;
suffix?: string;
[key: string]: unknown;
};
}

View File

@ -70,7 +70,7 @@ export type TAuthErrorInfo = {
type: EErrorAlertType;
code: EAuthErrorCodes;
title: string;
message: any;
message: string | React.ReactNode;
};
export enum EAdminAuthErrorCodes {
@ -90,7 +90,7 @@ export type TAdminAuthErrorInfo = {
type: EErrorAlertType;
code: EAdminAuthErrorCodes;
title: string;
message: any;
message: string | React.ReactNode;
};
export enum EAuthErrorCodes {

View File

@ -29,6 +29,7 @@ export enum EIssueGroupByToServerOptions {
"target_date" = "target_date",
"project" = "project_id",
"created_by" = "created_by",
// eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values
"team_project" = "project_id",
}

View File

@ -14,7 +14,7 @@ export type TIssueLayoutMap = Record<
export const SITES_ISSUE_LAYOUTS: {
key: TIssueLayout;
titleTranslationKey: string;
icon: any;
icon: string;
}[] = [
{
key: "list",
@ -26,9 +26,6 @@ export const SITES_ISSUE_LAYOUTS: {
icon: "Kanban",
titleTranslationKey: "issue.layouts.kanban",
},
// { key: "calendar", title: "Calendar", icon: Calendar },
// { key: "spreadsheet", title: "Spreadsheet", icon: Sheet },
// { key: "gantt", title: "Gantt chart", icon: GanttChartSquare },
];
export const ISSUE_LAYOUT_MAP: TIssueLayoutMap = {

View File

@ -1,4 +1,4 @@
import { PROFILE_SETTINGS } from ".";
import { PROFILE_SETTINGS } from "./profile";
import { WORKSPACE_SETTINGS } from "./workspace";
export enum WORKSPACE_SETTINGS_CATEGORY {

View File

@ -16,7 +16,7 @@ interface ControllerInstance {
}
interface ControllerConstructor {
new (...args: any[]): ControllerInstance;
new (...args: unknown[]): ControllerInstance;
prototype: ControllerInstance;
}

View File

@ -10,6 +10,7 @@ type RestMethod = "get" | "post" | "put" | "patch" | "delete";
* @returns
*/
export function Controller(baseRoute: string = ""): ClassDecorator {
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
return function (target: Function) {
Reflect.defineMetadata("baseRoute", baseRoute, target);
};
@ -24,11 +25,7 @@ function createHttpMethodDecorator(
method: RestMethod,
): (route: string) => MethodDecorator {
return function (route: string): MethodDecorator {
return function (
target: object,
propertyKey: string | symbol,
descriptor: PropertyDescriptor,
) {
return function (target: object, propertyKey: string | symbol) {
Reflect.defineMetadata("method", method, target, propertyKey);
Reflect.defineMetadata("route", route, target, propertyKey);
};
@ -48,11 +45,7 @@ export const Delete = createHttpMethodDecorator("delete");
* @returns
*/
export function Middleware(middleware: RequestHandler): MethodDecorator {
return function (
target: object,
propertyKey: string | symbol,
descriptor: PropertyDescriptor,
) {
return function (target: object, propertyKey: string | symbol) {
const middlewares =
Reflect.getMetadata("middlewares", target, propertyKey) || [];
middlewares.push(middleware);

View File

@ -7,7 +7,7 @@ interface ControllerInstance {
}
interface ControllerConstructor {
new (...args: any[]): ControllerInstance;
new (...args: unknown[]): ControllerInstance;
prototype: ControllerInstance;
}
@ -34,27 +34,23 @@ export function registerWebSocketControllers(
if (
typeof handler === "function" &&
typeof (router as any).ws === "function"
"ws" in router &&
typeof router.ws === "function"
) {
(router as any).ws(
`${baseRoute}${route}`,
(ws: WebSocket, req: Request) => {
try {
handler.call(instance, ws, req);
} catch (error) {
console.error(
`WebSocket error in ${Controller.name}.${methodName}`,
error,
);
ws.close(
1011,
error instanceof Error
? error.message
: "Internal server error",
);
}
},
);
router.ws(`${baseRoute}${route}`, (ws: WebSocket, req: Request) => {
try {
handler.call(instance, ws, req);
} catch (error) {
console.error(
`WebSocket error in ${Controller.name}.${methodName}`,
error,
);
ws.close(
1011,
error instanceof Error ? error.message : "Internal server error",
);
}
});
}
}
});

View File

@ -6,11 +6,7 @@ import "reflect-metadata";
* @returns
*/
export function WebSocket(route: string): MethodDecorator {
return function (
target: object,
propertyKey: string | symbol,
descriptor: PropertyDescriptor,
) {
return function (target: object, propertyKey: string | symbol) {
Reflect.defineMetadata("method", "ws", target, propertyKey);
Reflect.defineMetadata("route", route, target, propertyKey);
};

View File

@ -10,6 +10,6 @@
"@/*": ["./src/*"]
}
},
"include": ["./src"],
"include": ["./src", "./*.ts"],
"exclude": ["dist", "build", "node_modules"]
}

View File

@ -24,7 +24,7 @@
"scripts": {
"build": "tsc && tsup --minify",
"dev": "tsup --watch",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 30",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -9,11 +9,11 @@ interface EditorContentProps {
}
export const EditorContentWrapper: FC<EditorContentProps> = (props) => {
const { editor, children, id, tabIndex } = props;
const { editor, children, tabIndex, id } = props;
return (
<div tabIndex={tabIndex} onFocus={() => editor?.chain().focus(undefined, { scrollIntoView: false }).run()}>
<EditorContent editor={editor} />
<EditorContent editor={editor} id={id} />
{children}
</div>
);

View File

@ -43,6 +43,12 @@ export const LinkEditView = ({ viewProps }: LinkEditViewProps) => {
const [linkRemoved, setLinkRemoved] = useState(false);
const hasSubmitted = useRef(false);
const removeLink = useCallback(() => {
editor.view.dispatch(editor.state.tr.removeMark(from, to, editor.schema.marks.link));
setLinkRemoved(true);
closeLinkView();
}, [editor, from, to, closeLinkView]);
// Effects
useEffect(
() =>
@ -56,7 +62,7 @@ export const LinkEditView = ({ viewProps }: LinkEditViewProps) => {
}
}
},
[linkRemoved, initialUrl]
[removeLink, linkRemoved, initialUrl]
);
// Sync state with props
@ -105,13 +111,7 @@ export const LinkEditView = ({ viewProps }: LinkEditViewProps) => {
}
return true;
}, [editor, from, to, initialText, localText, localUrl]);
const removeLink = useCallback(() => {
editor.view.dispatch(editor.state.tr.removeMark(from, to, editor.schema.marks.link));
setLinkRemoved(true);
closeLinkView();
}, [editor, from, to, closeLinkView]);
}, [linkRemoved, positionRef, editor, from, to, initialText, localText, localUrl]);
const handleKeyDown = useCallback(
(e: React.KeyboardEvent) => {

View File

@ -28,7 +28,7 @@ export const LinkView = (props: LinkViewProps & { style: CSSProperties }) => {
setCurrentView("LinkPreview");
setPrevFrom(props.from);
}
}, []);
}, [prevFrom, props.from]);
return (
<>

View File

@ -118,18 +118,18 @@ export function LowlightPlugin({
transaction.steps.some(
(step) =>
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// @ts-expect-error
step.from !== undefined &&
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// @ts-expect-error
step.to !== undefined &&
oldNodes.some(
(node) =>
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// @ts-expect-error
node.pos >= step.from &&
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// @ts-expect-error
node.pos + node.node.nodeSize <= step.to
)
))

View File

@ -52,7 +52,7 @@ export const ImageUploadStatus: React.FC<Props> = (props) => {
cancelAnimationFrame(animationFrameRef.current);
}
};
}, [uploadStatus]);
}, [displayStatus, uploadStatus]);
if (uploadStatus === undefined) return null;

View File

@ -3,13 +3,13 @@ import { ReactRenderer } from "@tiptap/react";
import { SuggestionOptions } from "@tiptap/suggestion";
import tippy, { Instance } from "tippy.js";
// helpers
import { CORE_EXTENSIONS } from "@/constants/extension";
import { getExtensionStorage } from "@/helpers/get-extension-storage";
import { CommandListInstance } from "@/helpers/tippy";
// types
import { TMentionHandler } from "@/types";
// local components
import { MentionsListDropdown, MentionsListDropdownProps } from "./mentions-list-dropdown";
import { getExtensionStorage } from "@/helpers/get-extension-storage";
import { CORE_EXTENSIONS } from "@/constants/extension";
export const renderMentionsDropdown =
(props: Pick<TMentionHandler, "searchCallback">): SuggestionOptions["render"] =>

View File

@ -18,7 +18,7 @@ export function tableControls() {
},
},
props: {
handleTripleClickOn(view, pos, node, nodePos, event, direct) {
handleTripleClickOn(view, pos, node, nodePos, event) {
if (node.type.name === CORE_EXTENSIONS.TABLE_CELL) {
event.preventDefault();
const $pos = view.state.doc.resolve(pos);

View File

@ -5,9 +5,7 @@ import { Decoration, NodeView } from "@tiptap/pm/view";
import { h } from "jsx-dom-cjs";
import { icons } from "src/core/extensions/table/table/icons";
import tippy, { Instance, Props } from "tippy.js";
// constants
import { CORE_EXTENSIONS } from "@/constants/extension";
// local imports
import { isCellSelection } from "./utilities/helpers";
type ToolboxItem = {
@ -148,7 +146,7 @@ const columnsToolboxItems: ToolboxItem[] = [
{
label: "Pick color",
icon: "", // No icon needed for color picker
action: (args: any) => {}, // Placeholder action; actual color picking is handled in `createToolbox`
action: (_args: unknown) => { }, // Placeholder action; actual color picking is handled in `createToolbox`
},
{
label: "Delete column",
@ -176,7 +174,7 @@ const rowsToolboxItems: ToolboxItem[] = [
{
label: "Pick color",
icon: "",
action: (args: any) => {}, // Placeholder action; actual color picking is handled in `createToolbox`
action: (_args: unknown) => { }, // Placeholder action; actual color picking is handled in `createToolbox`
},
{
label: "Delete row",
@ -217,7 +215,7 @@ function createToolbox({
h(
"div",
{ className: "grid grid-cols-6 gap-x-1 gap-y-2.5 mt-2" },
Object.entries(colors).map(([colorName, colorValue]) =>
Object.entries(colors).map(([_, colorValue]) =>
h("div", {
className: "grid place-items-center size-6 rounded cursor-pointer",
style: `background-color: ${colorValue.backgroundColor};color: ${colorValue.textColor || "inherit"};`,

View File

@ -32,8 +32,11 @@ function scrollToNode(editor: Editor, pos: number): void {
}
}
// eslint-disable-next-line no-undef
export function scrollToNodeViaDOMCoordinates(editor: Editor, pos: number, behavior?: ScrollBehavior): void {
export function scrollToNodeViaDOMCoordinates(
editor: Editor,
pos: number,
behavior?: "auto" | "smooth" | "instant"
): void {
const view = editor.view;
// Get the coordinates of the position

View File

@ -271,7 +271,7 @@ export const useEditor = (props: TEditorHookProps) => {
Y.applyUpdate(document, value);
},
}),
[editor]
[editor, provider]
);
if (!editor) {

View File

@ -111,8 +111,7 @@ export interface EditorRefApi extends EditorReadOnlyRefApi {
onDocumentInfoChange: (callback: (documentInfo: TDocumentInfo) => void) => () => void;
onHeadingChange: (callback: (headings: IMarking[]) => void) => () => void;
onStateChange: (callback: () => void) => () => void;
// eslint-disable-next-line no-undef
scrollToNodeViaDOMCoordinates: (behavior?: ScrollBehavior, position?: number) => void;
scrollToNodeViaDOMCoordinates: (behavior?: "auto" | "smooth" | "instant", position?: number) => void;
setEditorValueAtCursorPosition: (content: string) => void;
setFocusAtPosition: (position: number) => void;
setProviderDocument: (value: Uint8Array) => void;

View File

@ -1,5 +1,5 @@
// plane types
import { IUserLite, TSearchEntities } from "@plane/types";
import { TSearchEntities } from "@plane/types";
export type TMentionSuggestion = {
entity_identifier: string;

View File

@ -1,5 +1,5 @@
import { CSSProperties } from "react";
import { Editor, Range } from "@tiptap/core";
import { CSSProperties } from "react";
// types
import { TEditorCommands } from "@/types";

View File

@ -1,6 +1,6 @@
const sharedConfig = require("@plane/tailwind-config/tailwind.config.js");
import sharedConfig from "@plane/tailwind-config/tailwind.config.js";
module.exports = {
export default {
// prefix ui lib classes to avoid conflicting with the app
...sharedConfig,
};

View File

@ -40,7 +40,14 @@ module.exports = {
"react/jsx-no-duplicate-props": "error",
"react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/no-unused-expressions": "warn",
"@typescript-eslint/no-unused-vars": ["warn"],
"@typescript-eslint/no-unused-vars": [
"warn",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_"
}
],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-useless-empty-export": "error",
"@typescript-eslint/prefer-ts-expect-error": "warn",

View File

@ -39,7 +39,14 @@ module.exports = {
"react/jsx-no-duplicate-props": "error",
"react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/no-unused-expressions": "warn",
"@typescript-eslint/no-unused-vars": ["warn"],
"@typescript-eslint/no-unused-vars": [
"warn",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_"
}
],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-useless-empty-export": "error",
"@typescript-eslint/prefer-ts-expect-error": "warn",

View File

@ -1,11 +1,34 @@
const { resolve } = require("node:path");
const project = resolve(process.cwd(), "tsconfig.json");
module.exports = {
extends: ["eslint:recommended"],
extends: ["prettier", "plugin:@typescript-eslint/recommended"],
env: {
node: true,
es6: true,
},
plugins: ["@typescript-eslint", "import"],
settings: {
"import/resolver": {
typescript: {
project,
},
},
},
ignorePatterns: [".*.js", "node_modules/"],
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
},
rules: {
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unused-vars": [
"warn",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_"
}
],
}
};

View File

@ -13,7 +13,7 @@
"scripts": {
"build": "tsup --minify",
"dev": "tsup --watch",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 6",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -5,7 +5,7 @@ import { TranslationContext } from "../context";
import { ILanguageOption, TLanguage } from "../types";
export type TTranslationStore = {
t: (key: string, params?: Record<string, any>) => string;
t: (key: string, params?: Record<string, unknown>) => string;
currentLocale: TLanguage;
changeLanguage: (lng: TLanguage) => void;
languages: ILanguageOption[];

View File

@ -136,7 +136,7 @@ export class TranslationStore {
* @param files - Array of file names to import (without .json extension)
* @returns Promise that resolves to merged translations
*/
private async importAndMergeFiles(language: TLanguage, files: string[]): Promise<any> {
private async importAndMergeFiles(language: TLanguage, files: string[]) {
try {
const importPromises = files.map((file) => import(`../locales/${language}/${file}.json`));
@ -153,7 +153,7 @@ export class TranslationStore {
* @param language - The language to import the translations for
* @returns {Promise<any>}
*/
private async importLanguageFile(language: TLanguage): Promise<any> {
private async importLanguageFile(language: TLanguage) {
const files = Object.values(ETranslationFiles);
return this.importAndMergeFiles(language, files);
}
@ -176,7 +176,6 @@ export class TranslationStore {
/**
* Gets the IntlMessageFormat instance for the given key and locale
* Returns cached instance if available
* Throws an error if the key is not found in the translations
*/
private getMessageInstance(key: string, locale: TLanguage): IntlMessageFormat | null {
const cacheKey = this.getCacheKey(key, locale);
@ -188,10 +187,10 @@ export class TranslationStore {
// Get the message from the translations
const message = get(this.translations[locale], key);
if (!message) return null;
if (typeof message !== "string") return null;
try {
const formatter = new IntlMessageFormat(message as any, locale);
const formatter = new IntlMessageFormat(message, locale);
this.messageCache.set(cacheKey, formatter);
return formatter;
} catch (error) {
@ -208,7 +207,7 @@ export class TranslationStore {
* @param params - The params to format the translation with
* @returns The translated string
*/
t(key: string, params?: Record<string, any>): string {
t(key: string, params?: Record<string, unknown>): string {
try {
// Try current locale
let formatter = this.getMessageInstance(key, this.currentLocale);

View File

@ -7,6 +7,13 @@
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.js"
}
},
"files": [
"dist/**"
],

View File

@ -1,6 +1,6 @@
import path from "path";
import winston from "winston";
import DailyRotateFile from "winston-daily-rotate-file";
import path from "path";
// Define log levels
const levels = {

View File

@ -4,7 +4,7 @@
"private": true,
"license": "AGPL-3.0",
"scripts": {
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 7",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -7,7 +7,7 @@
"scripts": {
"build": "tsc --noEmit && tsup --minify",
"dev": "tsup --watch",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 62",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -7,7 +7,7 @@
"main": "./src/index.ts",
"types": "./src/index.ts",
"scripts": {
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 4",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -19,7 +19,7 @@
"scripts": {
"dev": "tsup --watch",
"build": "tsc --noEmit && tsup --minify",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 36",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -1,8 +1,8 @@
import { EDurationFilters } from "./enums";
import { IIssueActivity, TIssuePriorities } from "./issues";
import { TIssue } from "./issues/issue";
import { TStateGroups } from "./state";
import { TIssueRelationTypes } from "./issues/issue_relation";
import { TStateGroups } from "./state";
export type TWidgetKeys =
| "overview_stats"

View File

@ -1,11 +1,11 @@
// local imports
import { EInboxIssueSource } from "../../inbox";
import {
TIssueActivityWorkspaceDetail,
TIssueActivityProjectDetail,
TIssueActivityIssueDetail,
TIssueActivityUserDetail,
} from "./base";
import { EInboxIssueSource } from "../../inbox";
export type TIssueActivity = {
id: string;

View File

@ -1,13 +1,13 @@
import { EIssueCommentAccessSpecifier } from "../../enums";
import { TFileSignedURLResponse } from "../../file";
import { IUserLite } from "../../users";
import { IWorkspaceLite } from "../../workspace";
import {
TIssueActivityWorkspaceDetail,
TIssueActivityProjectDetail,
TIssueActivityIssueDetail,
TIssueActivityUserDetail,
} from "./base";
import { EIssueCommentAccessSpecifier } from "../../enums";
import { TFileSignedURLResponse } from "../../file";
import { IUserLite } from "../../users";
import { IWorkspaceLite } from "../../workspace";
export type TCommentReaction = {
id: string;

View File

@ -1,9 +1,9 @@
import { TIssuePriorities } from "../issues";
import { TIssuePublicComment } from "./activity/issue_comment";
import { TIssueAttachment } from "./issue_attachment";
import { TIssueLink } from "./issue_link";
import { TIssueReaction, IIssuePublicReaction, IPublicVote } from "./issue_reaction";
import { TIssueRelationTypes } from "./issue_relation";
import { TIssuePublicComment } from "./activity/issue_comment";
export enum EIssueLayoutTypes {
LIST = "list",

View File

@ -1,6 +1,6 @@
import type { ILinkDetails } from "../issues";
import type { TIssue } from "../issues/issue";
import type { IIssueFilterOptions } from "../view-props";
import type { ILinkDetails } from "../issues";
export type TModuleStatus = "backlog" | "planned" | "in-progress" | "paused" | "completed" | "cancelled";

View File

@ -1 +1 @@
export type TPageExtended = {};
export type TPageExtended = object;

View File

@ -1,5 +1,5 @@
import { IIssueActivity, TIssuePriorities, TStateGroups } from ".";
import { TUserPermissions } from "./enums";
import { IIssueActivity, TIssuePriorities, TStateGroups } from ".";
/**
* @description The start of the week for the user

View File

@ -1,5 +1,5 @@
import type { IUserLite } from "./users";
import { ENotificationFilterType } from "./enums";
import type { IUserLite } from "./users";
// filters
export type TNotificationFilter = {

View File

@ -17,7 +17,7 @@
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build",
"postcss": "postcss styles/globals.css -o styles/output.css --watch",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 94",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",
@ -37,6 +37,7 @@
"@plane/constants": "*",
"@plane/hooks": "*",
"@plane/utils": "*",
"@plane/types": "*",
"@popperjs/core": "^2.11.8",
"@radix-ui/react-scroll-area": "^1.2.3",
"clsx": "^2.0.0",

View File

@ -2,7 +2,7 @@ import * as React from "react";
import { AlertCircle, Ban, SignalHigh, SignalLow, SignalMedium } from "lucide-react";
import { cn } from "../../helpers";
type TIssuePriorities = "urgent" | "high" | "medium" | "low" | "none";
export type TIssuePriorities = "urgent" | "high" | "medium" | "low" | "none";
interface IPriorityIcon {
className?: string;

View File

@ -8,7 +8,9 @@ const meta: Meta<typeof Sortable> = {
};
export default meta;
type Story = StoryObj<typeof Sortable>;
type StoryItem = { id: string; name: string };
type Story = StoryObj<typeof Sortable<StoryItem>>;
const data = [
{ id: "1", name: "John Doe" },
@ -20,14 +22,12 @@ const data = [
export const Default: Story = {
args: {
data,
render: (item: any) => (
render: (item: StoryItem) => (
// <Draggable data={item} className="rounded-lg">
<div className="border ">{item.name}</div>
// </Draggable>
),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
onChange: (data) => console.log(data.map(({ id }: any) => id)),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
keyExtractor: (item: any) => item.id,
onChange: (data) => console.log(data.map(({ id }) => id)),
keyExtractor: (item) => item.id,
},
};

View File

@ -1,5 +1,5 @@
import React, { Fragment, useEffect, useMemo } from "react";
import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import React, { Fragment, useEffect, useMemo } from "react";
import { Draggable } from "./draggable";
type TEnhancedData<T> = T & { __uuid__?: string };

View File

@ -13,7 +13,7 @@
"scripts": {
"build": "tsc --noEmit && tsup --minify",
"dev": "tsup --watch",
"check:lint": "eslint . --max-warnings 0",
"check:lint": "eslint . --max-warnings 20",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",

View File

@ -102,26 +102,6 @@ export const getNumberCount = (number: number): string => {
return number.toString();
};
/**
* @description Converts object to URL query parameters string
* @param {Object} obj - Object to convert
* @returns {string} URL query parameters string
* @example
* objToQueryParams({ page: 1, search: "test" }) // returns "page=1&search=test"
* objToQueryParams({ a: null, b: "test" }) // returns "b=test"
*/
export const objToQueryParams = (obj: any) => {
const params = new URLSearchParams();
if (!obj) return params.toString();
for (const [key, value] of Object.entries(obj)) {
if (value !== undefined && value !== null) params.append(key, value as string);
}
return params.toString();
};
/**
* @description: This function will capitalize the first letter of a string
* @param str String
@ -268,7 +248,7 @@ export const substringMatch = (text: string, searchQuery: string): boolean => {
// Not all characters of searchQuery found in order
return false;
} catch (error) {
} catch (_err) {
return false;
}
};
@ -297,7 +277,7 @@ const fallbackCopyTextToClipboard = (text: string) => {
// FIXME: Even though we are using this as a fallback, execCommand is deprecated 👎. We should find a better way to do this.
// https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
document.execCommand("copy");
} catch (err) {
} catch (_err) {
// catch fallback error
}

159
yarn.lock
View File

@ -574,7 +574,7 @@
dependencies:
eslint-visitor-keys "^3.4.3"
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1":
version "4.12.1"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
@ -2408,7 +2408,7 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0":
"@types/express-serve-static-core@*":
version "5.0.7"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6"
integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==
@ -2428,7 +2428,7 @@
"@types/range-parser" "*"
"@types/send" "*"
"@types/express-ws@^3.0.4":
"@types/express-ws@^3.0.5":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/express-ws/-/express-ws-3.0.5.tgz#5abf3dda3acb0a339351f089c31aca708f234c7c"
integrity sha512-lbWMjoHrm/v85j81UCmb/GNZFO3genxRYBW1Ob7rjRI+zxUBR+4tcFuOpKKsYQ1LYTYiy3356epLeYi/5zxUwA==
@ -2437,16 +2437,7 @@
"@types/express-serve-static-core" "*"
"@types/ws" "*"
"@types/express@*":
version "5.0.3"
resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956"
integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==
dependencies:
"@types/body-parser" "*"
"@types/express-serve-static-core" "^5.0.0"
"@types/serve-static" "*"
"@types/express@^4.17.21":
"@types/express@*", "@types/express@4.17.23", "@types/express@^4.17.21", "@types/express@^4.17.23":
version "4.17.23"
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef"
integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==
@ -2709,7 +2700,7 @@
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8"
integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==
"@types/semver@^7.3.12", "@types/semver@^7.3.4":
"@types/semver@^7.3.4":
version "7.7.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e"
integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==
@ -2778,7 +2769,7 @@
resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.5.tgz#8ce8623ed7a36e3a76d1c0b539708dfb2e859bc0"
integrity sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA==
"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/eslint-plugin@^8.6.0":
"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/eslint-plugin@^8.36.0", "@typescript-eslint/eslint-plugin@^8.6.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz#332392883f936137cd6252c8eb236d298e514e70"
integrity sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==
@ -2793,22 +2784,6 @@
natural-compare "^1.4.0"
ts-api-utils "^2.1.0"
"@typescript-eslint/eslint-plugin@^5.48.2":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db"
integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
dependencies:
"@eslint-community/regexpp" "^4.4.0"
"@typescript-eslint/scope-manager" "5.62.0"
"@typescript-eslint/type-utils" "5.62.0"
"@typescript-eslint/utils" "5.62.0"
debug "^4.3.4"
graphemer "^1.4.0"
ignore "^5.2.0"
natural-compare-lite "^1.4.0"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.6.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.37.0.tgz#b87f6b61e25ad5cc5bbf8baf809b8da889c89804"
@ -2829,14 +2804,6 @@
"@typescript-eslint/types" "^8.37.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
dependencies:
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/visitor-keys" "5.62.0"
"@typescript-eslint/scope-manager@8.37.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz#a31a3c80ca2ef4ed58de13742debb692e7d4c0a4"
@ -2850,16 +2817,6 @@
resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz#47a2760d265c6125f8e7864bc5c8537cad2bd053"
integrity sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==
"@typescript-eslint/type-utils@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a"
integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==
dependencies:
"@typescript-eslint/typescript-estree" "5.62.0"
"@typescript-eslint/utils" "5.62.0"
debug "^4.3.4"
tsutils "^3.21.0"
"@typescript-eslint/type-utils@8.37.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz#2a682e4c6ff5886712dad57e9787b5e417124507"
@ -2871,29 +2828,11 @@
debug "^4.3.4"
ts-api-utils "^2.1.0"
"@typescript-eslint/types@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
"@typescript-eslint/types@8.37.0", "@typescript-eslint/types@^8.37.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.37.0.tgz#09517aa9625eb3c68941dde3ac8835740587b6ff"
integrity sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==
"@typescript-eslint/typescript-estree@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b"
integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
dependencies:
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/visitor-keys" "5.62.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/typescript-estree@8.37.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz#a07e4574d8e6e4355a558f61323730c987f5fcbc"
@ -2910,20 +2849,6 @@
semver "^7.6.0"
ts-api-utils "^2.1.0"
"@typescript-eslint/utils@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@types/json-schema" "^7.0.9"
"@types/semver" "^7.3.12"
"@typescript-eslint/scope-manager" "5.62.0"
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/typescript-estree" "5.62.0"
eslint-scope "^5.1.1"
semver "^7.3.7"
"@typescript-eslint/utils@8.37.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.37.0.tgz#189ea59b2709f5d898614611f091a776751ee335"
@ -2934,14 +2859,6 @@
"@typescript-eslint/types" "8.37.0"
"@typescript-eslint/typescript-estree" "8.37.0"
"@typescript-eslint/visitor-keys@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
dependencies:
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
"@typescript-eslint/visitor-keys@8.37.0":
version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz#cdb6a6bd3e8d6dd69bd70c1bdda36e2d18737455"
@ -3425,11 +3342,6 @@ array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9:
is-string "^1.1.1"
math-intrinsics "^1.1.0"
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
array.prototype.findlast@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904"
@ -4643,13 +4555,6 @@ diff@^5.0.0:
resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531"
integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
dependencies:
path-type "^4.0.0"
dlv@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
@ -5235,7 +5140,7 @@ eslint-plugin-turbo@1.13.4:
dependencies:
dotenv "16.0.3"
eslint-scope@5.1.1, eslint-scope@^5.1.1:
eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@ -5251,7 +5156,7 @@ eslint-scope@^7.2.2:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
@ -5459,7 +5364,7 @@ fast-fifo@^1.2.0, fast-fifo@^1.3.2:
resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
fast-glob@^3.2.9, fast-glob@^3.3.2:
fast-glob@^3.3.2:
version "3.3.3"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
@ -5914,18 +5819,6 @@ globalthis@^1.0.4:
define-properties "^1.2.1"
gopd "^1.0.1"
globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
fast-glob "^3.2.9"
ignore "^5.2.0"
merge2 "^1.4.1"
slash "^3.0.0"
gopd@^1.0.1, gopd@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
@ -7103,7 +6996,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
merge2@^1.3.0, merge2@^1.4.1:
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@ -7455,11 +7348,6 @@ napi-postinstall@^0.3.0:
resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.2.tgz#03c62080e88b311c4d7423b0f15f0c920bbcc626"
integrity sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==
natural-compare-lite@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@ -8207,9 +8095,9 @@ postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47, postcss@^8.4.49:
source-map-js "^1.2.1"
posthog-js@^1.131.3:
version "1.257.0"
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.257.0.tgz#7adfffa024756b910ee87a978e0fc6c12a9fa730"
integrity sha512-Ujg9RGtWVCu+4tmlRpALSy2ZOZI6JtieSYXIDDdgMWm167KYKvTtbMPHdoBaPWcNu0Km+1hAIBnQFygyn30KhA==
version "1.257.1"
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.257.1.tgz#7f9cb847779d515cdadbf9540378722d33efe4cd"
integrity sha512-29kk3IO/LkPQ8E1cds6a2sWr5iN4BovgL+EMzRK9hQXbI6D3FJnQ7zLU6EUpktt6pHnqGpfO3BTEcflcDYkHBg==
dependencies:
core-js "^3.38.1"
fflate "^0.4.8"
@ -9399,11 +9287,6 @@ simple-update-notifier@^2.0.0:
dependencies:
semver "^7.5.3"
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
slash@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
@ -10088,11 +9971,6 @@ tsconfig-paths@^4.2.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.7.0, tslib@^2.8.0:
version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
@ -10125,13 +10003,6 @@ tsup@8.4.0:
tinyglobby "^0.2.11"
tree-kill "^1.2.2"
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
dependencies:
tslib "^1.8.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@ -10169,7 +10040,7 @@ turbo-windows-arm64@2.5.5:
resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-2.5.5.tgz#0ab29d38fcc67ba38652f1cd273df49177cb55b8"
integrity sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==
turbo@^2.5.4:
turbo@^2.5.5:
version "2.5.5"
resolved "https://registry.yarnpkg.com/turbo/-/turbo-2.5.5.tgz#6057f87c1262acdfa30cf16d4cf74629623f36c9"
integrity sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==
@ -10863,7 +10734,7 @@ ws@^7.4.6:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
ws@^8.17.1, ws@^8.18.0, ws@^8.2.3, ws@^8.5.0:
ws@^8.17.1, ws@^8.18.0, ws@^8.18.3, ws@^8.2.3, ws@^8.5.0:
version "8.18.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==