* 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 <ToggleSwitch
value={Boolean(parseInt(enableGitlabConfig))} value={Boolean(parseInt(enableGitlabConfig))}
onChange={() => { onChange={() => {
Boolean(parseInt(enableGitlabConfig)) === true if (Boolean(parseInt(enableGitlabConfig)) === true) {
? updateConfig("IS_GITLAB_ENABLED", "0") updateConfig("IS_GITLAB_ENABLED", "0");
: updateConfig("IS_GITLAB_ENABLED", "1"); } else {
updateConfig("IS_GITLAB_ENABLED", "1");
}
}} }}
size="sm" size="sm"
disabled={isSubmitting || !formattedConfig} disabled={isSubmitting || !formattedConfig}

View file

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

View file

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

View file

@ -10,7 +10,7 @@
"dev": "tsup --watch --onSuccess 'node --env-file=.env dist/server.js'", "dev": "tsup --watch --onSuccess 'node --env-file=.env dist/server.js'",
"build": "tsc --noEmit && tsup", "build": "tsc --noEmit && tsup",
"start": "node --env-file=.env dist/server.js", "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:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix", "fix:lint": "eslint . --fix",
@ -51,14 +51,15 @@
"@types/compression": "1.8.1", "@types/compression": "1.8.1",
"@types/cors": "^2.8.17", "@types/cors": "^2.8.17",
"@types/dotenv": "^8.2.0", "@types/dotenv": "^8.2.0",
"@types/express": "^4.17.21", "@types/express": "^4.17.23",
"@types/express-ws": "^3.0.4", "@types/express-ws": "^3.0.5",
"@types/node": "^20.14.9", "@types/node": "^20.14.9",
"@types/pino-http": "^5.8.4", "@types/pino-http": "^5.8.4",
"concurrently": "^9.0.1", "concurrently": "^9.0.1",
"nodemon": "^3.1.7", "nodemon": "^3.1.7",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tsup": "8.4.0", "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 = { const hooks = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
logMethod(inputArgs: any, method: any): any { logMethod(inputArgs: any, method: any): any {
if (inputArgs.length >= 2) { if (inputArgs.length >= 2) {
const arg1 = inputArgs.shift(); const arg1 = inputArgs.shift();

View file

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

View file

@ -36,7 +36,7 @@ export abstract class APIService {
return this.axiosInstance.patch(url, data, config); 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 }); return this.axiosInstance.delete(url, { data, ...config });
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -39,18 +39,10 @@ export const AppliedFiltersList: React.FC<Props> = observer((props) => {
{filterKey === "priority" && ( {filterKey === "priority" && (
<AppliedPriorityFilters <AppliedPriorityFilters
handleRemove={(val) => handleRemoveFilter("priority", val)} 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" && ( {filterKey === "state" && (
<AppliedStateFilters <AppliedStateFilters
handleRemove={(val) => handleRemoveFilter("state", val)} handleRemove={(val) => handleRemoveFilter("state", val)}

View file

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

View file

@ -7,7 +7,7 @@ import { useRouter } from "next/navigation";
// hooks // hooks
import { useIssueFilter } from "@/hooks/store"; import { useIssueFilter } from "@/hooks/store";
// store // store
import { TIssueQueryFilters } from "@/types/issue"; import type { TIssueLayout, TIssueQueryFilters } from "@/types/issue";
// components // components
import { AppliedFiltersList } from "./filters-list"; 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 priority = key === "priority" ? value : (issueFilters?.filters?.priority ?? []);
const labels = key === "labels" ? value : (issueFilters?.filters?.labels ?? []); const labels = key === "labels" ? value : (issueFilters?.filters?.labels ?? []);
let params: any = { board: activeLayout || "list" }; const params: {
if (priority.length > 0) params = { ...params, priority: priority.join(",") }; board: TIssueLayout | string;
if (state.length > 0) params = { ...params, states: state.join(",") }; priority?: string;
if (labels.length > 0) params = { ...params, labels: labels.join(",") }; states?: string;
params = new URLSearchParams(params).toString(); 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] [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, groupId, subgroupId);
} }
}, },
[fetchNextPublicIssues] [anchor, getIssueLoader, fetchNextPublicIssues]
); );
const debouncedFetchMoreIssues = debounce( const debouncedFetchMoreIssues = debounce(

View file

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

View file

@ -18,7 +18,9 @@ export const useIntersectionObserver = (
const observer = new IntersectionObserver( const observer = new IntersectionObserver(
(entries) => { (entries) => {
if (entries[entries.length - 1].isIntersecting) { 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.instance = instanceInfo.instance;
this.config = instanceInfo.config; this.config = instanceInfo.config;
}); });
} catch (error) { } catch (_error) {
runInAction(() => { runInAction(() => {
this.isLoading = false; this.isLoading = false;
this.error = { this.error = {

View file

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

View file

@ -91,7 +91,7 @@ export class ProfileStore implements IProfileStore {
this.data = userProfile; this.data = userProfile;
}); });
return userProfile; return userProfile;
} catch (error) { } catch (_error) {
runInAction(() => { runInAction(() => {
this.isLoading = false; this.isLoading = false;
this.error = { this.error = {
@ -118,7 +118,7 @@ export class ProfileStore implements IProfileStore {
} }
const userProfile = await this.userService.updateProfile(data); const userProfile = await this.userService.updateProfile(data);
return userProfile; return userProfile;
} catch (error) { } catch (_error) {
if (currentUserProfileData) { if (currentUserProfileData) {
Object.keys(currentUserProfileData).forEach((key: string) => { Object.keys(currentUserProfileData).forEach((key: string) => {
const userKey: keyof TUserProfile = key as keyof TUserProfile; 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; if (!isNumber(year) || !isNumber(month) || !isNumber(day)) return;
return new Date(year, month - 1, day); return new Date(year, month - 1, day);
} catch (e) { } catch (_err) {
return undefined; 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. // 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 // https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
document.execCommand("copy"); document.execCommand("copy");
} catch (err) {} } catch (_err) {}
document.body.removeChild(textArea); document.body.removeChild(textArea);
}; };

View file

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

View file

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

View file

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

View file

@ -14,7 +14,7 @@ import { PasswordStrengthMeter } from "@/components/account";
import { PageHead } from "@/components/core"; import { PageHead } from "@/components/core";
import { ProfileSettingContentHeader } from "@/components/profile"; import { ProfileSettingContentHeader } from "@/components/profile";
// helpers // helpers
import { authErrorHandler } from "@/helpers/authentication.helper"; import { authErrorHandler, type EAuthenticationErrorCodes } from "@/helpers/authentication.helper";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
// services // services
@ -87,8 +87,14 @@ const SecurityPage = observer(() => {
title: t("auth.common.password.toast.change_password.success.title"), title: t("auth.common.password.toast.change_password.success.title"),
message: t("auth.common.password.toast.change_password.success.message"), message: t("auth.common.password.toast.change_password.success.message"),
}); });
} catch (err: any) { } catch (error: unknown) {
const errorInfo = authErrorHandler(err.error_code?.toString()); 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({ setToast({
type: TOAST_TYPE.ERROR, type: TOAST_TYPE.ERROR,
title: errorInfo?.title ?? t("auth.common.password.toast.error.title"), 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"); if (!csrfToken) throw new Error("csrf token not found");
await handleSetPassword(csrfToken, { password: passwordFormData.password }); await handleSetPassword(csrfToken, { password: passwordFormData.password });
router.push("/"); 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({ setToast({
type: TOAST_TYPE.ERROR, type: TOAST_TYPE.ERROR,
title: t("common.errors.default.title"), 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 { data: currentUser } = useUser();
const { updateUserProfile } = useUserProfile(); const { updateUserProfile } = useUserProfile();
// states // states
const [defaultValues, setDefaultValues] = useState({ const [defaultValues, setDefaultValues] = useState<Pick<IWorkspace, "name" | "slug" | "organization_size">>({
name: "", name: "",
slug: "", slug: "",
organization_size: "", organization_size: "",
@ -101,7 +101,7 @@ const CreateWorkspacePage = observer(() => {
<CreateWorkspaceForm <CreateWorkspaceForm
onSubmit={onSubmit} onSubmit={onSubmit}
defaultValues={defaultValues} defaultValues={defaultValues}
setDefaultValues={setDefaultValues as any} setDefaultValues={setDefaultValues}
/> />
</div> </div>
</div> </div>

View file

@ -42,10 +42,14 @@ const OnboardingPage = observer(() => {
// computed values // computed values
const workspacesList = Object.values(workspaces ?? {}); const workspacesList = Object.values(workspaces ?? {});
// fetching workspaces list // fetching workspaces list
const { isLoading: workspaceListLoader } = useSWR(USER_WORKSPACES_LIST, () => { const { isLoading: workspaceListLoader } = useSWR(USER_WORKSPACES_LIST, () => {
user?.id && fetchWorkspaces(); if (user?.id) {
fetchWorkspaces();
}
}); });
// fetching user workspace invitations // fetching user workspace invitations
const { isLoading: invitationsLoader, data: invitations } = useSWR( const { isLoading: invitationsLoader, data: invitations } = useSWR(
`USER_WORKSPACE_INVITATIONS_LIST_${user?.id}`, `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 { PageHead } from "@/components/core/page-title";
import { ProfileSettingContentHeader, ProfileSettingContentWrapper } from "@/components/profile"; import { ProfileSettingContentHeader, ProfileSettingContentWrapper } from "@/components/profile";
// helpers // helpers
import { authErrorHandler } from "@/helpers/authentication.helper"; import { authErrorHandler, type EAuthenticationErrorCodes } from "@/helpers/authentication.helper";
// hooks // hooks
import { useUser } from "@/hooks/store"; import { useUser } from "@/hooks/store";
// services // services
@ -87,8 +87,10 @@ const SecurityPage = observer(() => {
title: t("auth.common.password.toast.change_password.success.title"), title: t("auth.common.password.toast.change_password.success.title"),
message: t("auth.common.password.toast.change_password.success.message"), message: t("auth.common.password.toast.change_password.success.message"),
}); });
} catch (err: any) { } catch (error: unknown) {
const errorInfo = authErrorHandler(err.error_code?.toString()); const err = error as Error & { error_code?: string };
const code = err.error_code?.toString();
const errorInfo = code ? authErrorHandler(code as EAuthenticationErrorCodes) : undefined;
setToast({ setToast({
type: TOAST_TYPE.ERROR, type: TOAST_TYPE.ERROR,
title: errorInfo?.title ?? t("auth.common.password.toast.error.title"), 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 { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
// plane constants // plane constants
import { DRAG_ALLOWED_GROUPS } from "@plane/constants"; import { DRAG_ALLOWED_GROUPS } from "@plane/constants";
// i18n // i18n
import { useTranslation } from "@plane/i18n"; import { useTranslation } from "@plane/i18n";
//types //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 { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
// plane constants // plane constants
import { DRAG_ALLOWED_GROUPS } from "@plane/constants"; import { DRAG_ALLOWED_GROUPS } from "@plane/constants";
// plane i18n // plane i18n
import { useTranslation } from "@plane/i18n"; import { useTranslation } from "@plane/i18n";
// plane ui // plane ui

View file

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

View file

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

View file

@ -8,7 +8,7 @@
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist", "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:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix", "fix:lint": "eslint . --fix",

View file

@ -13,14 +13,15 @@
"build": "turbo run build", "build": "turbo run build",
"dev": "turbo run dev --concurrency=18", "dev": "turbo run dev --concurrency=18",
"start": "turbo run start", "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", "fix": "turbo run fix",
"check": "turbo run check" "check": "turbo run check",
"ci:lint": "turbo run check:lint"
}, },
"devDependencies": { "devDependencies": {
"prettier": "latest", "prettier": "latest",
"prettier-plugin-tailwindcss": "^0.5.4", "prettier-plugin-tailwindcss": "^0.5.4",
"turbo": "^2.5.4" "turbo": "^2.5.5"
}, },
"resolutions": { "resolutions": {
"brace-expansion": "2.0.2", "brace-expansion": "2.0.2",
@ -30,7 +31,8 @@
"@babel/runtime": "7.26.10", "@babel/runtime": "7.26.10",
"chokidar": "3.6.0", "chokidar": "3.6.0",
"tar-fs": "3.0.9", "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" "packageManager": "yarn@1.22.22"
} }

View file

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

View file

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

View file

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

View file

@ -14,7 +14,7 @@ export type TIssueLayoutMap = Record<
export const SITES_ISSUE_LAYOUTS: { export const SITES_ISSUE_LAYOUTS: {
key: TIssueLayout; key: TIssueLayout;
titleTranslationKey: string; titleTranslationKey: string;
icon: any; icon: string;
}[] = [ }[] = [
{ {
key: "list", key: "list",
@ -26,9 +26,6 @@ export const SITES_ISSUE_LAYOUTS: {
icon: "Kanban", icon: "Kanban",
titleTranslationKey: "issue.layouts.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 = { 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"; import { WORKSPACE_SETTINGS } from "./workspace";
export enum WORKSPACE_SETTINGS_CATEGORY { export enum WORKSPACE_SETTINGS_CATEGORY {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -18,7 +18,7 @@ export function tableControls() {
}, },
}, },
props: { props: {
handleTripleClickOn(view, pos, node, nodePos, event, direct) { handleTripleClickOn(view, pos, node, nodePos, event) {
if (node.type.name === CORE_EXTENSIONS.TABLE_CELL) { if (node.type.name === CORE_EXTENSIONS.TABLE_CELL) {
event.preventDefault(); event.preventDefault();
const $pos = view.state.doc.resolve(pos); 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 { h } from "jsx-dom-cjs";
import { icons } from "src/core/extensions/table/table/icons"; import { icons } from "src/core/extensions/table/table/icons";
import tippy, { Instance, Props } from "tippy.js"; import tippy, { Instance, Props } from "tippy.js";
// constants
import { CORE_EXTENSIONS } from "@/constants/extension"; import { CORE_EXTENSIONS } from "@/constants/extension";
// local imports
import { isCellSelection } from "./utilities/helpers"; import { isCellSelection } from "./utilities/helpers";
type ToolboxItem = { type ToolboxItem = {
@ -148,7 +146,7 @@ const columnsToolboxItems: ToolboxItem[] = [
{ {
label: "Pick color", label: "Pick color",
icon: "", // No icon needed for color picker 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", label: "Delete column",
@ -176,7 +174,7 @@ const rowsToolboxItems: ToolboxItem[] = [
{ {
label: "Pick color", label: "Pick color",
icon: "", 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", label: "Delete row",
@ -217,7 +215,7 @@ function createToolbox({
h( h(
"div", "div",
{ className: "grid grid-cols-6 gap-x-1 gap-y-2.5 mt-2" }, { 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", { h("div", {
className: "grid place-items-center size-6 rounded cursor-pointer", className: "grid place-items-center size-6 rounded cursor-pointer",
style: `background-color: ${colorValue.backgroundColor};color: ${colorValue.textColor || "inherit"};`, 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(
export function scrollToNodeViaDOMCoordinates(editor: Editor, pos: number, behavior?: ScrollBehavior): void { editor: Editor,
pos: number,
behavior?: "auto" | "smooth" | "instant"
): void {
const view = editor.view; const view = editor.view;
// Get the coordinates of the position // Get the coordinates of the position

View file

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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
import { CSSProperties } from "react";
import { Editor, Range } from "@tiptap/core"; import { Editor, Range } from "@tiptap/core";
import { CSSProperties } from "react";
// types // types
import { TEditorCommands } from "@/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 // prefix ui lib classes to avoid conflicting with the app
...sharedConfig, ...sharedConfig,
}; };

View file

@ -40,7 +40,14 @@ module.exports = {
"react/jsx-no-duplicate-props": "error", "react/jsx-no-duplicate-props": "error",
"react-hooks/exhaustive-deps": "warn", "react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/no-unused-expressions": "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-explicit-any": "warn",
"@typescript-eslint/no-useless-empty-export": "error", "@typescript-eslint/no-useless-empty-export": "error",
"@typescript-eslint/prefer-ts-expect-error": "warn", "@typescript-eslint/prefer-ts-expect-error": "warn",

View file

@ -39,7 +39,14 @@ module.exports = {
"react/jsx-no-duplicate-props": "error", "react/jsx-no-duplicate-props": "error",
"react-hooks/exhaustive-deps": "warn", "react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/no-unused-expressions": "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-explicit-any": "warn",
"@typescript-eslint/no-useless-empty-export": "error", "@typescript-eslint/no-useless-empty-export": "error",
"@typescript-eslint/prefer-ts-expect-error": "warn", "@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 = { module.exports = {
extends: ["eslint:recommended"], extends: ["prettier", "plugin:@typescript-eslint/recommended"],
env: { env: {
node: true, node: true,
es6: true, es6: true,
}, },
plugins: ["@typescript-eslint", "import"],
settings: {
"import/resolver": {
typescript: {
project,
},
},
},
ignorePatterns: [".*.js", "node_modules/"],
parserOptions: { parserOptions: {
ecmaVersion: "latest", ecmaVersion: "latest",
sourceType: "module", 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": { "scripts": {
"build": "tsup --minify", "build": "tsup --minify",
"dev": "tsup --watch", "dev": "tsup --watch",
"check:lint": "eslint . --max-warnings 0", "check:lint": "eslint . --max-warnings 6",
"check:types": "tsc --noEmit", "check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix", "fix:lint": "eslint . --fix",

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,11 +1,11 @@
// local imports // local imports
import { EInboxIssueSource } from "../../inbox";
import { import {
TIssueActivityWorkspaceDetail, TIssueActivityWorkspaceDetail,
TIssueActivityProjectDetail, TIssueActivityProjectDetail,
TIssueActivityIssueDetail, TIssueActivityIssueDetail,
TIssueActivityUserDetail, TIssueActivityUserDetail,
} from "./base"; } from "./base";
import { EInboxIssueSource } from "../../inbox";
export type TIssueActivity = { export type TIssueActivity = {
id: string; 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 { import {
TIssueActivityWorkspaceDetail, TIssueActivityWorkspaceDetail,
TIssueActivityProjectDetail, TIssueActivityProjectDetail,
TIssueActivityIssueDetail, TIssueActivityIssueDetail,
TIssueActivityUserDetail, TIssueActivityUserDetail,
} from "./base"; } from "./base";
import { EIssueCommentAccessSpecifier } from "../../enums";
import { TFileSignedURLResponse } from "../../file";
import { IUserLite } from "../../users";
import { IWorkspaceLite } from "../../workspace";
export type TCommentReaction = { export type TCommentReaction = {
id: string; id: string;

View file

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

View file

@ -1,6 +1,6 @@
import type { ILinkDetails } from "../issues";
import type { TIssue } from "../issues/issue"; import type { TIssue } from "../issues/issue";
import type { IIssueFilterOptions } from "../view-props"; import type { IIssueFilterOptions } from "../view-props";
import type { ILinkDetails } from "../issues";
export type TModuleStatus = "backlog" | "planned" | "in-progress" | "paused" | "completed" | "cancelled"; 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 { TUserPermissions } from "./enums";
import { IIssueActivity, TIssuePriorities, TStateGroups } from ".";
/** /**
* @description The start of the week for the user * @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 { ENotificationFilterType } from "./enums";
import type { IUserLite } from "./users";
// filters // filters
export type TNotificationFilter = { export type TNotificationFilter = {

View file

@ -17,7 +17,7 @@
"storybook": "storybook dev -p 6006", "storybook": "storybook dev -p 6006",
"build-storybook": "storybook build", "build-storybook": "storybook build",
"postcss": "postcss styles/globals.css -o styles/output.css --watch", "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:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix", "fix:lint": "eslint . --fix",
@ -37,6 +37,7 @@
"@plane/constants": "*", "@plane/constants": "*",
"@plane/hooks": "*", "@plane/hooks": "*",
"@plane/utils": "*", "@plane/utils": "*",
"@plane/types": "*",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-scroll-area": "^1.2.3",
"clsx": "^2.0.0", "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 { AlertCircle, Ban, SignalHigh, SignalLow, SignalMedium } from "lucide-react";
import { cn } from "../../helpers"; import { cn } from "../../helpers";
type TIssuePriorities = "urgent" | "high" | "medium" | "low" | "none"; export type TIssuePriorities = "urgent" | "high" | "medium" | "low" | "none";
interface IPriorityIcon { interface IPriorityIcon {
className?: string; className?: string;

View file

@ -8,7 +8,9 @@ const meta: Meta<typeof Sortable> = {
}; };
export default meta; export default meta;
type Story = StoryObj<typeof Sortable>;
type StoryItem = { id: string; name: string };
type Story = StoryObj<typeof Sortable<StoryItem>>;
const data = [ const data = [
{ id: "1", name: "John Doe" }, { id: "1", name: "John Doe" },
@ -20,14 +22,12 @@ const data = [
export const Default: Story = { export const Default: Story = {
args: { args: {
data, data,
render: (item: any) => ( render: (item: StoryItem) => (
// <Draggable data={item} className="rounded-lg"> // <Draggable data={item} className="rounded-lg">
<div className="border ">{item.name}</div> <div className="border ">{item.name}</div>
// </Draggable> // </Draggable>
), ),
// eslint-disable-next-line @typescript-eslint/no-explicit-any onChange: (data) => console.log(data.map(({ id }) => id)),
onChange: (data) => console.log(data.map(({ id }: any) => id)), keyExtractor: (item) => item.id,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
keyExtractor: (item: any) => 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 { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import React, { Fragment, useEffect, useMemo } from "react";
import { Draggable } from "./draggable"; import { Draggable } from "./draggable";
type TEnhancedData<T> = T & { __uuid__?: string }; type TEnhancedData<T> = T & { __uuid__?: string };

View file

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

View file

@ -102,26 +102,6 @@ export const getNumberCount = (number: number): string => {
return number.toString(); 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 * @description: This function will capitalize the first letter of a string
* @param str String * @param str String
@ -268,7 +248,7 @@ export const substringMatch = (text: string, searchQuery: string): boolean => {
// Not all characters of searchQuery found in order // Not all characters of searchQuery found in order
return false; return false;
} catch (error) { } catch (_err) {
return false; 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. // 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 // https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand
document.execCommand("copy"); document.execCommand("copy");
} catch (err) { } catch (_err) {
// catch fallback error // catch fallback error
} }

159
yarn.lock
View file

@ -574,7 +574,7 @@
dependencies: dependencies:
eslint-visitor-keys "^3.4.3" 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" version "4.12.1"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
@ -2408,7 +2408,7 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== 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" version "5.0.7"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6"
integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==
@ -2428,7 +2428,7 @@
"@types/range-parser" "*" "@types/range-parser" "*"
"@types/send" "*" "@types/send" "*"
"@types/express-ws@^3.0.4": "@types/express-ws@^3.0.5":
version "3.0.5" version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/express-ws/-/express-ws-3.0.5.tgz#5abf3dda3acb0a339351f089c31aca708f234c7c" resolved "https://registry.yarnpkg.com/@types/express-ws/-/express-ws-3.0.5.tgz#5abf3dda3acb0a339351f089c31aca708f234c7c"
integrity sha512-lbWMjoHrm/v85j81UCmb/GNZFO3genxRYBW1Ob7rjRI+zxUBR+4tcFuOpKKsYQ1LYTYiy3356epLeYi/5zxUwA== integrity sha512-lbWMjoHrm/v85j81UCmb/GNZFO3genxRYBW1Ob7rjRI+zxUBR+4tcFuOpKKsYQ1LYTYiy3356epLeYi/5zxUwA==
@ -2437,16 +2437,7 @@
"@types/express-serve-static-core" "*" "@types/express-serve-static-core" "*"
"@types/ws" "*" "@types/ws" "*"
"@types/express@*": "@types/express@*", "@types/express@4.17.23", "@types/express@^4.17.21", "@types/express@^4.17.23":
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":
version "4.17.23" version "4.17.23"
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef"
integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==
@ -2709,7 +2700,7 @@
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8"
integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==
"@types/semver@^7.3.12", "@types/semver@^7.3.4": "@types/semver@^7.3.4":
version "7.7.0" version "7.7.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e"
integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==
@ -2778,7 +2769,7 @@
resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.5.tgz#8ce8623ed7a36e3a76d1c0b539708dfb2e859bc0" resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.5.tgz#8ce8623ed7a36e3a76d1c0b539708dfb2e859bc0"
integrity sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA== 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" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz#332392883f936137cd6252c8eb236d298e514e70" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz#332392883f936137cd6252c8eb236d298e514e70"
integrity sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA== integrity sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==
@ -2793,22 +2784,6 @@
natural-compare "^1.4.0" natural-compare "^1.4.0"
ts-api-utils "^2.1.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": "@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" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.37.0.tgz#b87f6b61e25ad5cc5bbf8baf809b8da889c89804" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.37.0.tgz#b87f6b61e25ad5cc5bbf8baf809b8da889c89804"
@ -2829,14 +2804,6 @@
"@typescript-eslint/types" "^8.37.0" "@typescript-eslint/types" "^8.37.0"
debug "^4.3.4" 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": "@typescript-eslint/scope-manager@8.37.0":
version "8.37.0" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz#a31a3c80ca2ef4ed58de13742debb692e7d4c0a4" 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" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz#47a2760d265c6125f8e7864bc5c8537cad2bd053"
integrity sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg== 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": "@typescript-eslint/type-utils@8.37.0":
version "8.37.0" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz#2a682e4c6ff5886712dad57e9787b5e417124507" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz#2a682e4c6ff5886712dad57e9787b5e417124507"
@ -2871,29 +2828,11 @@
debug "^4.3.4" debug "^4.3.4"
ts-api-utils "^2.1.0" 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": "@typescript-eslint/types@8.37.0", "@typescript-eslint/types@^8.37.0":
version "8.37.0" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.37.0.tgz#09517aa9625eb3c68941dde3ac8835740587b6ff" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.37.0.tgz#09517aa9625eb3c68941dde3ac8835740587b6ff"
integrity sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ== 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": "@typescript-eslint/typescript-estree@8.37.0":
version "8.37.0" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz#a07e4574d8e6e4355a558f61323730c987f5fcbc" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz#a07e4574d8e6e4355a558f61323730c987f5fcbc"
@ -2910,20 +2849,6 @@
semver "^7.6.0" semver "^7.6.0"
ts-api-utils "^2.1.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": "@typescript-eslint/utils@8.37.0":
version "8.37.0" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.37.0.tgz#189ea59b2709f5d898614611f091a776751ee335" 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/types" "8.37.0"
"@typescript-eslint/typescript-estree" "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": "@typescript-eslint/visitor-keys@8.37.0":
version "8.37.0" version "8.37.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz#cdb6a6bd3e8d6dd69bd70c1bdda36e2d18737455" 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" is-string "^1.1.1"
math-intrinsics "^1.1.0" 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: array.prototype.findlast@^1.2.5:
version "1.2.5" version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" 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" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531"
integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== 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: dlv@^1.1.3:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
@ -5235,7 +5140,7 @@ eslint-plugin-turbo@1.13.4:
dependencies: dependencies:
dotenv "16.0.3" dotenv "16.0.3"
eslint-scope@5.1.1, eslint-scope@^5.1.1: eslint-scope@5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@ -5251,7 +5156,7 @@ eslint-scope@^7.2.2:
esrecurse "^4.3.0" esrecurse "^4.3.0"
estraverse "^5.2.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" version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 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== 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" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== 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" version "3.3.3"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
@ -5914,18 +5819,6 @@ globalthis@^1.0.4:
define-properties "^1.2.1" define-properties "^1.2.1"
gopd "^1.0.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: gopd@^1.0.1, gopd@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 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" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
merge2@^1.3.0, merge2@^1.4.1: merge2@^1.3.0:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 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" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.2.tgz#03c62080e88b311c4d7423b0f15f0c920bbcc626"
integrity sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw== 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: natural-compare@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 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" source-map-js "^1.2.1"
posthog-js@^1.131.3: posthog-js@^1.131.3:
version "1.257.0" version "1.257.1"
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.257.0.tgz#7adfffa024756b910ee87a978e0fc6c12a9fa730" resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.257.1.tgz#7f9cb847779d515cdadbf9540378722d33efe4cd"
integrity sha512-Ujg9RGtWVCu+4tmlRpALSy2ZOZI6JtieSYXIDDdgMWm167KYKvTtbMPHdoBaPWcNu0Km+1hAIBnQFygyn30KhA== integrity sha512-29kk3IO/LkPQ8E1cds6a2sWr5iN4BovgL+EMzRK9hQXbI6D3FJnQ7zLU6EUpktt6pHnqGpfO3BTEcflcDYkHBg==
dependencies: dependencies:
core-js "^3.38.1" core-js "^3.38.1"
fflate "^0.4.8" fflate "^0.4.8"
@ -9399,11 +9287,6 @@ simple-update-notifier@^2.0.0:
dependencies: dependencies:
semver "^7.5.3" 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: slash@^5.0.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" 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" minimist "^1.2.6"
strip-bom "^3.0.0" 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: 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" version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
@ -10125,13 +10003,6 @@ tsup@8.4.0:
tinyglobby "^0.2.11" tinyglobby "^0.2.11"
tree-kill "^1.2.2" 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: tunnel-agent@^0.6.0:
version "0.6.0" version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 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" resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-2.5.5.tgz#0ab29d38fcc67ba38652f1cd273df49177cb55b8"
integrity sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q== integrity sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==
turbo@^2.5.4: turbo@^2.5.5:
version "2.5.5" version "2.5.5"
resolved "https://registry.yarnpkg.com/turbo/-/turbo-2.5.5.tgz#6057f87c1262acdfa30cf16d4cf74629623f36c9" resolved "https://registry.yarnpkg.com/turbo/-/turbo-2.5.5.tgz#6057f87c1262acdfa30cf16d4cf74629623f36c9"
integrity sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A== 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" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== 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" version "8.18.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==