From 57479f45544d654370e7b8b1ecc25587942de583 Mon Sep 17 00:00:00 2001 From: Aaron Heckmann Date: Thu, 24 Jul 2025 13:14:51 -0700 Subject: [PATCH] fix: lint (#7433) * 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 --- .github/workflows/build-test-pull-request.yml | 95 ----------- .../workflows/pull-request-build-lint-api.yml | 29 ++++ .../pull-request-build-lint-web-apps.yml | 42 +++++ .nvmrc | 1 + .../authentication/gitlab/page.tsx | 8 +- .../authentication/google/page.tsx | 8 +- apps/admin/package.json | 2 +- apps/live/package.json | 9 +- apps/live/src/ce/types/common.d.ts | 2 +- apps/live/src/core/helpers/logger.ts | 1 + apps/live/src/core/hocuspocus-server.ts | 2 +- apps/live/src/core/services/api.service.ts | 2 +- .../app/[workspaceSlug]/[projectId]/page.ts | 8 +- .../account/auth-forms/password.tsx | 4 +- .../account/oauth/github-button.tsx | 2 +- .../account/oauth/gitlab-button.tsx | 2 +- .../account/oauth/google-button.tsx | 2 +- .../filters/applied-filters/filters-list.tsx | 10 +- .../filters/applied-filters/priority.tsx | 6 +- .../issues/filters/applied-filters/root.tsx | 22 ++- .../issue-layouts/kanban/base-kanban-root.tsx | 2 +- .../issue-layouts/list/base-list-root.tsx | 2 +- .../core/hooks/use-intersection-observer.tsx | 4 +- apps/space/core/store/instance.store.ts | 2 +- apps/space/core/store/issue-detail.store.ts | 16 +- apps/space/core/store/profile.store.ts | 4 +- apps/space/helpers/date-time.helper.ts | 2 +- apps/space/helpers/string.helper.ts | 2 +- apps/space/package.json | 4 +- apps/web/.eslintignore | 3 +- .../cycles/(list)/mobile-header.tsx | 4 +- .../settings/account/security/page.tsx | 12 +- .../app/(all)/accounts/set-password/page.tsx | 10 +- apps/web/app/(all)/create-workspace/page.tsx | 4 +- apps/web/app/(all)/onboarding/page.tsx | 6 +- apps/web/app/(all)/profile/security/page.tsx | 8 +- .../issue-layouts/kanban/kanban-group.tsx | 2 +- .../issues/issue-layouts/list/list-group.tsx | 2 +- .../issues/issue-layouts/quick-add/root.tsx | 2 +- .../workspace/create-workspace-form.tsx | 2 +- apps/web/package.json | 2 +- package.json | 10 +- .../constants/{.eslintrc.js => .eslintrc.cjs} | 0 packages/constants/src/analytics/common.ts | 4 +- packages/constants/src/auth.ts | 4 +- packages/constants/src/issue/common.ts | 1 + packages/constants/src/issue/layout.ts | 5 +- packages/constants/src/settings.ts | 2 +- packages/decorators/src/controller.ts | 2 +- packages/decorators/src/rest.ts | 13 +- .../decorators/src/websocket-controller.ts | 38 ++--- packages/decorators/src/websocket.ts | 6 +- packages/decorators/tsconfig.json | 2 +- packages/editor/package.json | 2 +- .../components/editors/editor-content.tsx | 4 +- .../core/components/links/link-edit-view.tsx | 16 +- .../src/core/components/links/link-view.tsx | 2 +- .../core/extensions/code/lowlight-plugin.ts | 8 +- .../custom-image/components/upload-status.tsx | 2 +- .../src/core/extensions/mentions/utils.ts | 4 +- .../extensions/table/table/table-controls.ts | 2 +- .../extensions/table/table/table-view.tsx | 8 +- .../editor/src/core/helpers/scroll-to-node.ts | 7 +- packages/editor/src/core/hooks/use-editor.ts | 2 +- packages/editor/src/core/types/editor.ts | 3 +- packages/editor/src/core/types/mention.ts | 2 +- .../core/types/slash-commands-suggestion.ts | 2 +- packages/editor/tailwind.config.js | 4 +- packages/eslint-config/library.js | 9 +- packages/eslint-config/next.js | 9 +- packages/eslint-config/server.js | 25 ++- packages/hooks/package.json | 2 +- packages/i18n/src/hooks/use-translation.ts | 2 +- packages/i18n/src/store/index.ts | 11 +- packages/logger/package.json | 7 + packages/logger/src/config.ts | 2 +- packages/propel/package.json | 2 +- packages/services/package.json | 2 +- packages/shared-state/package.json | 2 +- packages/types/package.json | 2 +- packages/types/src/dashboard.ts | 2 +- .../src/issues/activity/issue_activity.ts | 2 +- .../src/issues/activity/issue_comment.ts | 8 +- packages/types/src/issues/issue.ts | 2 +- packages/types/src/module/modules.ts | 2 +- packages/types/src/page/extended.ts | 2 +- packages/types/src/users.ts | 2 +- packages/types/src/workspace-notifications.ts | 2 +- packages/ui/package.json | 3 +- packages/ui/src/icons/priority-icon.tsx | 2 +- packages/ui/src/sortable/sortable.stories.tsx | 12 +- packages/ui/src/sortable/sortable.tsx | 2 +- packages/utils/package.json | 2 +- packages/utils/src/string.ts | 24 +-- yarn.lock | 159 ++---------------- 95 files changed, 348 insertions(+), 460 deletions(-) delete mode 100644 .github/workflows/build-test-pull-request.yml create mode 100644 .github/workflows/pull-request-build-lint-api.yml create mode 100644 .github/workflows/pull-request-build-lint-web-apps.yml create mode 100644 .nvmrc rename packages/constants/{.eslintrc.js => .eslintrc.cjs} (100%) diff --git a/.github/workflows/build-test-pull-request.yml b/.github/workflows/build-test-pull-request.yml deleted file mode 100644 index acbd9d26eb..0000000000 --- a/.github/workflows/build-test-pull-request.yml +++ /dev/null @@ -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 diff --git a/.github/workflows/pull-request-build-lint-api.yml b/.github/workflows/pull-request-build-lint-api.yml new file mode 100644 index 0000000000..93619b03d3 --- /dev/null +++ b/.github/workflows/pull-request-build-lint-api.yml @@ -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 diff --git a/.github/workflows/pull-request-build-lint-web-apps.yml b/.github/workflows/pull-request-build-lint-web-apps.yml new file mode 100644 index 0000000000..8afe78c49d --- /dev/null +++ b/.github/workflows/pull-request-build-lint-web-apps.yml @@ -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 + + diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..deed13c016 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/jod diff --git a/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx b/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx index cdcfcd61bb..f0b464acb1 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx @@ -66,9 +66,11 @@ const InstanceGitlabAuthenticationPage = observer(() => { { - Boolean(parseInt(enableGitlabConfig)) === true - ? updateConfig("IS_GITLAB_ENABLED", "0") - : updateConfig("IS_GITLAB_ENABLED", "1"); + if (Boolean(parseInt(enableGitlabConfig)) === true) { + updateConfig("IS_GITLAB_ENABLED", "0"); + } else { + updateConfig("IS_GITLAB_ENABLED", "1"); + } }} size="sm" disabled={isSubmitting || !formattedConfig} diff --git a/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx b/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx index 6ac4ea09b9..7cf42cb57e 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx @@ -67,9 +67,11 @@ const InstanceGoogleAuthenticationPage = observer(() => { { - Boolean(parseInt(enableGoogleConfig)) === true - ? updateConfig("IS_GOOGLE_ENABLED", "0") - : updateConfig("IS_GOOGLE_ENABLED", "1"); + if (Boolean(parseInt(enableGoogleConfig)) === true) { + updateConfig("IS_GOOGLE_ENABLED", "0"); + } else { + updateConfig("IS_GOOGLE_ENABLED", "1"); + } }} size="sm" disabled={isSubmitting || !formattedConfig} diff --git a/apps/admin/package.json b/apps/admin/package.json index 4e7cea25d7..f4c293977b 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -10,7 +10,7 @@ "preview": "next build && next start", "start": "next start", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 19", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/apps/live/package.json b/apps/live/package.json index d8d1de6ad2..f0bb5158eb 100644 --- a/apps/live/package.json +++ b/apps/live/package.json @@ -10,7 +10,7 @@ "dev": "tsup --watch --onSuccess 'node --env-file=.env dist/server.js'", "build": "tsc --noEmit && tsup", "start": "node --env-file=.env dist/server.js", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 10", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", @@ -51,14 +51,15 @@ "@types/compression": "1.8.1", "@types/cors": "^2.8.17", "@types/dotenv": "^8.2.0", - "@types/express": "^4.17.21", - "@types/express-ws": "^3.0.4", + "@types/express": "^4.17.23", + "@types/express-ws": "^3.0.5", "@types/node": "^20.14.9", "@types/pino-http": "^5.8.4", "concurrently": "^9.0.1", "nodemon": "^3.1.7", "ts-node": "^10.9.2", "tsup": "8.4.0", - "typescript": "5.8.3" + "typescript": "5.8.3", + "ws": "^8.18.3" } } diff --git a/apps/live/src/ce/types/common.d.ts b/apps/live/src/ce/types/common.d.ts index 2f51c6ff5c..ffc9e1053d 100644 --- a/apps/live/src/ce/types/common.d.ts +++ b/apps/live/src/ce/types/common.d.ts @@ -1 +1 @@ -export type TAdditionalDocumentTypes = {}; +export type TAdditionalDocumentTypes = never; diff --git a/apps/live/src/core/helpers/logger.ts b/apps/live/src/core/helpers/logger.ts index 07efaea6e2..a821797fa8 100644 --- a/apps/live/src/core/helpers/logger.ts +++ b/apps/live/src/core/helpers/logger.ts @@ -9,6 +9,7 @@ const transport = { }; const hooks = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any logMethod(inputArgs: any, method: any): any { if (inputArgs.length >= 2) { const arg1 = inputArgs.shift(); diff --git a/apps/live/src/core/hocuspocus-server.ts b/apps/live/src/core/hocuspocus-server.ts index 072d45cbc2..ceea6548be 100644 --- a/apps/live/src/core/hocuspocus-server.ts +++ b/apps/live/src/core/hocuspocus-server.ts @@ -52,7 +52,7 @@ export const getHocusPocusServer = async () => { cookie, userId, }); - } catch (error) { + } catch (_error) { throw Error("Authentication unsuccessful!"); } }, diff --git a/apps/live/src/core/services/api.service.ts b/apps/live/src/core/services/api.service.ts index 1aa5cf9e53..abc53c1113 100644 --- a/apps/live/src/core/services/api.service.ts +++ b/apps/live/src/core/services/api.service.ts @@ -36,7 +36,7 @@ export abstract class APIService { return this.axiosInstance.patch(url, data, config); } - delete(url: string, data?: any, config = {}) { + delete(url: string, data?: Record | null | string, config = {}) { return this.axiosInstance.delete(url, { data, ...config }); } diff --git a/apps/space/app/[workspaceSlug]/[projectId]/page.ts b/apps/space/app/[workspaceSlug]/[projectId]/page.ts index 5fbb835dcd..0badbe64f5 100644 --- a/apps/space/app/[workspaceSlug]/[projectId]/page.ts +++ b/apps/space/app/[workspaceSlug]/[projectId]/page.ts @@ -10,7 +10,7 @@ type Props = { workspaceSlug: string; projectId: string; }; - searchParams: any; + searchParams: Record<"board" | "peekId", string | string[] | undefined>; }; export default async function IssuesPage(props: Props) { @@ -23,7 +23,7 @@ export default async function IssuesPage(props: Props) { try { response = await publishService.retrieveSettingsByProjectId(workspaceSlug, projectId); } catch (error) { - // redirect to 404 page on error + console.error("Error fetching project publish settings:", error); notFound(); } @@ -31,8 +31,8 @@ export default async function IssuesPage(props: Props) { if (response?.entity_name === "project") { url = `/issues/${response?.anchor}`; const params = new URLSearchParams(); - if (board) params.append("board", board); - if (peekId) params.append("peekId", peekId); + if (board) params.append("board", String(board)); + if (peekId) params.append("peekId", String(peekId)); if (params.toString()) url += `?${params.toString()}`; redirect(url); } else { diff --git a/apps/space/core/components/account/auth-forms/password.tsx b/apps/space/core/components/account/auth-forms/password.tsx index 08ff7f1421..08db783e39 100644 --- a/apps/space/core/components/account/auth-forms/password.tsx +++ b/apps/space/core/components/account/auth-forms/password.tsx @@ -109,7 +109,9 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { onSubmit={async (event) => { event.preventDefault(); await handleCSRFToken(); - formRef.current && formRef.current.submit(); + if (formRef.current) { + formRef.current.submit(); + } setIsSubmitting(true); }} onError={() => setIsSubmitting(false)} diff --git a/apps/space/core/components/account/oauth/github-button.tsx b/apps/space/core/components/account/oauth/github-button.tsx index eaa83ebbbd..b37cea956f 100644 --- a/apps/space/core/components/account/oauth/github-button.tsx +++ b/apps/space/core/components/account/oauth/github-button.tsx @@ -1,6 +1,6 @@ import { FC } from "react"; -import { useSearchParams } from "next/navigation"; import Image from "next/image"; +import { useSearchParams } from "next/navigation"; import { useTheme } from "next-themes"; import { API_BASE_URL } from "@plane/constants"; // images diff --git a/apps/space/core/components/account/oauth/gitlab-button.tsx b/apps/space/core/components/account/oauth/gitlab-button.tsx index ba1880ae97..40834b3cfa 100644 --- a/apps/space/core/components/account/oauth/gitlab-button.tsx +++ b/apps/space/core/components/account/oauth/gitlab-button.tsx @@ -1,6 +1,6 @@ import { FC } from "react"; -import { useSearchParams } from "next/navigation"; import Image from "next/image"; +import { useSearchParams } from "next/navigation"; import { useTheme } from "next-themes"; import { API_BASE_URL } from "@plane/constants"; // images diff --git a/apps/space/core/components/account/oauth/google-button.tsx b/apps/space/core/components/account/oauth/google-button.tsx index dc28bdae48..1c699674f4 100644 --- a/apps/space/core/components/account/oauth/google-button.tsx +++ b/apps/space/core/components/account/oauth/google-button.tsx @@ -1,6 +1,6 @@ import { FC } from "react"; -import { useSearchParams } from "next/navigation"; import Image from "next/image"; +import { useSearchParams } from "next/navigation"; import { useTheme } from "next-themes"; import { API_BASE_URL } from "@plane/constants"; // images diff --git a/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx b/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx index 65ac296022..d9d03de15e 100644 --- a/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx +++ b/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx @@ -39,18 +39,10 @@ export const AppliedFiltersList: React.FC = observer((props) => { {filterKey === "priority" && ( handleRemoveFilter("priority", val)} - values={filterValue ?? []} + values={(filterValue ?? []) as TFilters["priority"]} /> )} - {/* {filterKey === "labels" && labels && ( - handleRemoveFilter("labels", val)} - labels={labels} - values={value} - /> - )} */} - {filterKey === "state" && ( handleRemoveFilter("state", val)} diff --git a/apps/space/core/components/issues/filters/applied-filters/priority.tsx b/apps/space/core/components/issues/filters/applied-filters/priority.tsx index 6fdf5c6532..33af39e21c 100644 --- a/apps/space/core/components/issues/filters/applied-filters/priority.tsx +++ b/apps/space/core/components/issues/filters/applied-filters/priority.tsx @@ -1,11 +1,11 @@ "use client"; import { X } from "lucide-react"; -import { PriorityIcon } from "@plane/ui"; +import { PriorityIcon, type TIssuePriorities } from "@plane/ui"; type Props = { handleRemove: (val: string) => void; - values: string[]; + values: TIssuePriorities[]; }; export const AppliedPriorityFilters: React.FC = (props) => { @@ -17,7 +17,7 @@ export const AppliedPriorityFilters: React.FC = (props) => { values.length > 0 && values.map((priority) => (
- + {priority}
diff --git a/apps/web/app/(all)/onboarding/page.tsx b/apps/web/app/(all)/onboarding/page.tsx index 7e7d15a10e..45ef3c5dd0 100644 --- a/apps/web/app/(all)/onboarding/page.tsx +++ b/apps/web/app/(all)/onboarding/page.tsx @@ -42,10 +42,14 @@ const OnboardingPage = observer(() => { // computed values const workspacesList = Object.values(workspaces ?? {}); + // fetching workspaces list const { isLoading: workspaceListLoader } = useSWR(USER_WORKSPACES_LIST, () => { - user?.id && fetchWorkspaces(); + if (user?.id) { + fetchWorkspaces(); + } }); + // fetching user workspace invitations const { isLoading: invitationsLoader, data: invitations } = useSWR( `USER_WORKSPACE_INVITATIONS_LIST_${user?.id}`, diff --git a/apps/web/app/(all)/profile/security/page.tsx b/apps/web/app/(all)/profile/security/page.tsx index eec52f994e..017be3b52a 100644 --- a/apps/web/app/(all)/profile/security/page.tsx +++ b/apps/web/app/(all)/profile/security/page.tsx @@ -14,7 +14,7 @@ import { PasswordStrengthMeter } from "@/components/account/password-strength-me import { PageHead } from "@/components/core/page-title"; import { ProfileSettingContentHeader, ProfileSettingContentWrapper } from "@/components/profile"; // helpers -import { authErrorHandler } from "@/helpers/authentication.helper"; +import { authErrorHandler, type EAuthenticationErrorCodes } from "@/helpers/authentication.helper"; // hooks import { useUser } from "@/hooks/store"; // services @@ -87,8 +87,10 @@ const SecurityPage = observer(() => { title: t("auth.common.password.toast.change_password.success.title"), message: t("auth.common.password.toast.change_password.success.message"), }); - } catch (err: any) { - const errorInfo = authErrorHandler(err.error_code?.toString()); + } catch (error: unknown) { + const err = error as Error & { error_code?: string }; + const code = err.error_code?.toString(); + const errorInfo = code ? authErrorHandler(code as EAuthenticationErrorCodes) : undefined; setToast({ type: TOAST_TYPE.ERROR, title: errorInfo?.title ?? t("auth.common.password.toast.error.title"), diff --git a/apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx b/apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx index a95109ad54..ed834eea7d 100644 --- a/apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx +++ b/apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx @@ -6,7 +6,7 @@ import { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element import { autoScrollForElements } from "@atlaskit/pragmatic-drag-and-drop-auto-scroll/element"; import { observer } from "mobx-react"; // plane constants -import { DRAG_ALLOWED_GROUPS } from "@plane/constants"; +import { DRAG_ALLOWED_GROUPS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; //types diff --git a/apps/web/core/components/issues/issue-layouts/list/list-group.tsx b/apps/web/core/components/issues/issue-layouts/list/list-group.tsx index 5d43fec4d7..577a52adc8 100644 --- a/apps/web/core/components/issues/issue-layouts/list/list-group.tsx +++ b/apps/web/core/components/issues/issue-layouts/list/list-group.tsx @@ -5,7 +5,7 @@ import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine"; import { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter"; import { observer } from "mobx-react"; // plane constants -import { DRAG_ALLOWED_GROUPS } from "@plane/constants"; +import { DRAG_ALLOWED_GROUPS } from "@plane/constants"; // plane i18n import { useTranslation } from "@plane/i18n"; // plane ui diff --git a/apps/web/core/components/issues/issue-layouts/quick-add/root.tsx b/apps/web/core/components/issues/issue-layouts/quick-add/root.tsx index 701083663f..066db20886 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-add/root.tsx +++ b/apps/web/core/components/issues/issue-layouts/quick-add/root.tsx @@ -6,7 +6,7 @@ import { useParams } from "next/navigation"; import { useForm, UseFormRegister } from "react-hook-form"; import { PlusIcon } from "lucide-react"; // plane constants -import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; +import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; import { IProject, TIssue, EIssueLayoutTypes } from "@plane/types"; diff --git a/apps/web/core/components/workspace/create-workspace-form.tsx b/apps/web/core/components/workspace/create-workspace-form.tsx index d7d54c6614..f760cd1d9c 100644 --- a/apps/web/core/components/workspace/create-workspace-form.tsx +++ b/apps/web/core/components/workspace/create-workspace-form.tsx @@ -29,7 +29,7 @@ type Props = { slug: string; organization_size: string; }; - setDefaultValues: Dispatch>; + setDefaultValues: Dispatch>>; secondaryButton?: React.ReactNode; primaryButtonText?: { loading: string; diff --git a/apps/web/package.json b/apps/web/package.json index 62f455a961..336c59802c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,7 +8,7 @@ "build": "next build", "start": "next start", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 821", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/package.json b/package.json index 2aeeeb5333..fd58a5887c 100644 --- a/package.json +++ b/package.json @@ -13,14 +13,15 @@ "build": "turbo run build", "dev": "turbo run dev --concurrency=18", "start": "turbo run start", - "clean": "turbo run clean", + "clean": "turbo run clean && rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist", "fix": "turbo run fix", - "check": "turbo run check" + "check": "turbo run check", + "ci:lint": "turbo run check:lint" }, "devDependencies": { "prettier": "latest", "prettier-plugin-tailwindcss": "^0.5.4", - "turbo": "^2.5.4" + "turbo": "^2.5.5" }, "resolutions": { "brace-expansion": "2.0.2", @@ -30,7 +31,8 @@ "@babel/runtime": "7.26.10", "chokidar": "3.6.0", "tar-fs": "3.0.9", - "prosemirror-view": "1.40.0" + "prosemirror-view": "1.40.0", + "@types/express": "4.17.23" }, "packageManager": "yarn@1.22.22" } diff --git a/packages/constants/.eslintrc.js b/packages/constants/.eslintrc.cjs similarity index 100% rename from packages/constants/.eslintrc.js rename to packages/constants/.eslintrc.cjs diff --git a/packages/constants/src/analytics/common.ts b/packages/constants/src/analytics/common.ts index 4192cef8cc..001391314d 100644 --- a/packages/constants/src/analytics/common.ts +++ b/packages/constants/src/analytics/common.ts @@ -6,7 +6,9 @@ export interface IInsightField { i18nProps?: { entity?: string; entityPlural?: string; - [key: string]: any; + prefix?: string; + suffix?: string; + [key: string]: unknown; }; } diff --git a/packages/constants/src/auth.ts b/packages/constants/src/auth.ts index 16ee1f3e74..953375c0e5 100644 --- a/packages/constants/src/auth.ts +++ b/packages/constants/src/auth.ts @@ -70,7 +70,7 @@ export type TAuthErrorInfo = { type: EErrorAlertType; code: EAuthErrorCodes; title: string; - message: any; + message: string | React.ReactNode; }; export enum EAdminAuthErrorCodes { @@ -90,7 +90,7 @@ export type TAdminAuthErrorInfo = { type: EErrorAlertType; code: EAdminAuthErrorCodes; title: string; - message: any; + message: string | React.ReactNode; }; export enum EAuthErrorCodes { diff --git a/packages/constants/src/issue/common.ts b/packages/constants/src/issue/common.ts index 0f47e767cd..b6fa8368ac 100644 --- a/packages/constants/src/issue/common.ts +++ b/packages/constants/src/issue/common.ts @@ -29,6 +29,7 @@ export enum EIssueGroupByToServerOptions { "target_date" = "target_date", "project" = "project_id", "created_by" = "created_by", + // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values "team_project" = "project_id", } diff --git a/packages/constants/src/issue/layout.ts b/packages/constants/src/issue/layout.ts index 9f983aee4e..88b7406063 100644 --- a/packages/constants/src/issue/layout.ts +++ b/packages/constants/src/issue/layout.ts @@ -14,7 +14,7 @@ export type TIssueLayoutMap = Record< export const SITES_ISSUE_LAYOUTS: { key: TIssueLayout; titleTranslationKey: string; - icon: any; + icon: string; }[] = [ { key: "list", @@ -26,9 +26,6 @@ export const SITES_ISSUE_LAYOUTS: { icon: "Kanban", titleTranslationKey: "issue.layouts.kanban", }, - // { key: "calendar", title: "Calendar", icon: Calendar }, - // { key: "spreadsheet", title: "Spreadsheet", icon: Sheet }, - // { key: "gantt", title: "Gantt chart", icon: GanttChartSquare }, ]; export const ISSUE_LAYOUT_MAP: TIssueLayoutMap = { diff --git a/packages/constants/src/settings.ts b/packages/constants/src/settings.ts index f42374dc73..2c55a6a2dd 100644 --- a/packages/constants/src/settings.ts +++ b/packages/constants/src/settings.ts @@ -1,4 +1,4 @@ -import { PROFILE_SETTINGS } from "."; +import { PROFILE_SETTINGS } from "./profile"; import { WORKSPACE_SETTINGS } from "./workspace"; export enum WORKSPACE_SETTINGS_CATEGORY { diff --git a/packages/decorators/src/controller.ts b/packages/decorators/src/controller.ts index a9185a8480..60112658c5 100644 --- a/packages/decorators/src/controller.ts +++ b/packages/decorators/src/controller.ts @@ -16,7 +16,7 @@ interface ControllerInstance { } interface ControllerConstructor { - new (...args: any[]): ControllerInstance; + new (...args: unknown[]): ControllerInstance; prototype: ControllerInstance; } diff --git a/packages/decorators/src/rest.ts b/packages/decorators/src/rest.ts index e643e26a93..5a80a9f519 100644 --- a/packages/decorators/src/rest.ts +++ b/packages/decorators/src/rest.ts @@ -10,6 +10,7 @@ type RestMethod = "get" | "post" | "put" | "patch" | "delete"; * @returns */ export function Controller(baseRoute: string = ""): ClassDecorator { + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type return function (target: Function) { Reflect.defineMetadata("baseRoute", baseRoute, target); }; @@ -24,11 +25,7 @@ function createHttpMethodDecorator( method: RestMethod, ): (route: string) => MethodDecorator { return function (route: string): MethodDecorator { - return function ( - target: object, - propertyKey: string | symbol, - descriptor: PropertyDescriptor, - ) { + return function (target: object, propertyKey: string | symbol) { Reflect.defineMetadata("method", method, target, propertyKey); Reflect.defineMetadata("route", route, target, propertyKey); }; @@ -48,11 +45,7 @@ export const Delete = createHttpMethodDecorator("delete"); * @returns */ export function Middleware(middleware: RequestHandler): MethodDecorator { - return function ( - target: object, - propertyKey: string | symbol, - descriptor: PropertyDescriptor, - ) { + return function (target: object, propertyKey: string | symbol) { const middlewares = Reflect.getMetadata("middlewares", target, propertyKey) || []; middlewares.push(middleware); diff --git a/packages/decorators/src/websocket-controller.ts b/packages/decorators/src/websocket-controller.ts index 85a018da08..776d2d7a33 100644 --- a/packages/decorators/src/websocket-controller.ts +++ b/packages/decorators/src/websocket-controller.ts @@ -7,7 +7,7 @@ interface ControllerInstance { } interface ControllerConstructor { - new (...args: any[]): ControllerInstance; + new (...args: unknown[]): ControllerInstance; prototype: ControllerInstance; } @@ -34,27 +34,23 @@ export function registerWebSocketControllers( if ( typeof handler === "function" && - typeof (router as any).ws === "function" + "ws" in router && + typeof router.ws === "function" ) { - (router as any).ws( - `${baseRoute}${route}`, - (ws: WebSocket, req: Request) => { - try { - handler.call(instance, ws, req); - } catch (error) { - console.error( - `WebSocket error in ${Controller.name}.${methodName}`, - error, - ); - ws.close( - 1011, - error instanceof Error - ? error.message - : "Internal server error", - ); - } - }, - ); + router.ws(`${baseRoute}${route}`, (ws: WebSocket, req: Request) => { + try { + handler.call(instance, ws, req); + } catch (error) { + console.error( + `WebSocket error in ${Controller.name}.${methodName}`, + error, + ); + ws.close( + 1011, + error instanceof Error ? error.message : "Internal server error", + ); + } + }); } } }); diff --git a/packages/decorators/src/websocket.ts b/packages/decorators/src/websocket.ts index 5b6b6a7b18..282df89709 100644 --- a/packages/decorators/src/websocket.ts +++ b/packages/decorators/src/websocket.ts @@ -6,11 +6,7 @@ import "reflect-metadata"; * @returns */ export function WebSocket(route: string): MethodDecorator { - return function ( - target: object, - propertyKey: string | symbol, - descriptor: PropertyDescriptor, - ) { + return function (target: object, propertyKey: string | symbol) { Reflect.defineMetadata("method", "ws", target, propertyKey); Reflect.defineMetadata("route", route, target, propertyKey); }; diff --git a/packages/decorators/tsconfig.json b/packages/decorators/tsconfig.json index 72638244b8..0fd863c96a 100644 --- a/packages/decorators/tsconfig.json +++ b/packages/decorators/tsconfig.json @@ -10,6 +10,6 @@ "@/*": ["./src/*"] } }, - "include": ["./src"], + "include": ["./src", "./*.ts"], "exclude": ["dist", "build", "node_modules"] } diff --git a/packages/editor/package.json b/packages/editor/package.json index b495b629b7..0d9390bef2 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -24,7 +24,7 @@ "scripts": { "build": "tsc && tsup --minify", "dev": "tsup --watch", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 30", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/editor/src/core/components/editors/editor-content.tsx b/packages/editor/src/core/components/editors/editor-content.tsx index 8171d06d9d..89ebde53bc 100644 --- a/packages/editor/src/core/components/editors/editor-content.tsx +++ b/packages/editor/src/core/components/editors/editor-content.tsx @@ -9,11 +9,11 @@ interface EditorContentProps { } export const EditorContentWrapper: FC = (props) => { - const { editor, children, id, tabIndex } = props; + const { editor, children, tabIndex, id } = props; return (
editor?.chain().focus(undefined, { scrollIntoView: false }).run()}> - + {children}
); diff --git a/packages/editor/src/core/components/links/link-edit-view.tsx b/packages/editor/src/core/components/links/link-edit-view.tsx index 1e9a62b0e1..db6ac3f5ca 100644 --- a/packages/editor/src/core/components/links/link-edit-view.tsx +++ b/packages/editor/src/core/components/links/link-edit-view.tsx @@ -43,6 +43,12 @@ export const LinkEditView = ({ viewProps }: LinkEditViewProps) => { const [linkRemoved, setLinkRemoved] = useState(false); const hasSubmitted = useRef(false); + const removeLink = useCallback(() => { + editor.view.dispatch(editor.state.tr.removeMark(from, to, editor.schema.marks.link)); + setLinkRemoved(true); + closeLinkView(); + }, [editor, from, to, closeLinkView]); + // Effects useEffect( () => @@ -56,7 +62,7 @@ export const LinkEditView = ({ viewProps }: LinkEditViewProps) => { } } }, - [linkRemoved, initialUrl] + [removeLink, linkRemoved, initialUrl] ); // Sync state with props @@ -105,13 +111,7 @@ export const LinkEditView = ({ viewProps }: LinkEditViewProps) => { } return true; - }, [editor, from, to, initialText, localText, localUrl]); - - const removeLink = useCallback(() => { - editor.view.dispatch(editor.state.tr.removeMark(from, to, editor.schema.marks.link)); - setLinkRemoved(true); - closeLinkView(); - }, [editor, from, to, closeLinkView]); + }, [linkRemoved, positionRef, editor, from, to, initialText, localText, localUrl]); const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { diff --git a/packages/editor/src/core/components/links/link-view.tsx b/packages/editor/src/core/components/links/link-view.tsx index 699f94e400..05d430df30 100644 --- a/packages/editor/src/core/components/links/link-view.tsx +++ b/packages/editor/src/core/components/links/link-view.tsx @@ -28,7 +28,7 @@ export const LinkView = (props: LinkViewProps & { style: CSSProperties }) => { setCurrentView("LinkPreview"); setPrevFrom(props.from); } - }, []); + }, [prevFrom, props.from]); return ( <> diff --git a/packages/editor/src/core/extensions/code/lowlight-plugin.ts b/packages/editor/src/core/extensions/code/lowlight-plugin.ts index 0b8ed71ad7..f5bbde612d 100644 --- a/packages/editor/src/core/extensions/code/lowlight-plugin.ts +++ b/packages/editor/src/core/extensions/code/lowlight-plugin.ts @@ -118,18 +118,18 @@ export function LowlightPlugin({ transaction.steps.some( (step) => // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + // @ts-expect-error step.from !== undefined && // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + // @ts-expect-error step.to !== undefined && oldNodes.some( (node) => // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + // @ts-expect-error node.pos >= step.from && // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore + // @ts-expect-error node.pos + node.node.nodeSize <= step.to ) )) diff --git a/packages/editor/src/core/extensions/custom-image/components/upload-status.tsx b/packages/editor/src/core/extensions/custom-image/components/upload-status.tsx index f88c69c6f3..4660536503 100644 --- a/packages/editor/src/core/extensions/custom-image/components/upload-status.tsx +++ b/packages/editor/src/core/extensions/custom-image/components/upload-status.tsx @@ -52,7 +52,7 @@ export const ImageUploadStatus: React.FC = (props) => { cancelAnimationFrame(animationFrameRef.current); } }; - }, [uploadStatus]); + }, [displayStatus, uploadStatus]); if (uploadStatus === undefined) return null; diff --git a/packages/editor/src/core/extensions/mentions/utils.ts b/packages/editor/src/core/extensions/mentions/utils.ts index 5fa356059c..b788d84cc6 100644 --- a/packages/editor/src/core/extensions/mentions/utils.ts +++ b/packages/editor/src/core/extensions/mentions/utils.ts @@ -3,13 +3,13 @@ import { ReactRenderer } from "@tiptap/react"; import { SuggestionOptions } from "@tiptap/suggestion"; import tippy, { Instance } from "tippy.js"; // helpers +import { CORE_EXTENSIONS } from "@/constants/extension"; +import { getExtensionStorage } from "@/helpers/get-extension-storage"; import { CommandListInstance } from "@/helpers/tippy"; // types import { TMentionHandler } from "@/types"; // local components import { MentionsListDropdown, MentionsListDropdownProps } from "./mentions-list-dropdown"; -import { getExtensionStorage } from "@/helpers/get-extension-storage"; -import { CORE_EXTENSIONS } from "@/constants/extension"; export const renderMentionsDropdown = (props: Pick): SuggestionOptions["render"] => diff --git a/packages/editor/src/core/extensions/table/table/table-controls.ts b/packages/editor/src/core/extensions/table/table/table-controls.ts index d499b1b6a7..5cd3506d31 100644 --- a/packages/editor/src/core/extensions/table/table/table-controls.ts +++ b/packages/editor/src/core/extensions/table/table/table-controls.ts @@ -18,7 +18,7 @@ export function tableControls() { }, }, props: { - handleTripleClickOn(view, pos, node, nodePos, event, direct) { + handleTripleClickOn(view, pos, node, nodePos, event) { if (node.type.name === CORE_EXTENSIONS.TABLE_CELL) { event.preventDefault(); const $pos = view.state.doc.resolve(pos); diff --git a/packages/editor/src/core/extensions/table/table/table-view.tsx b/packages/editor/src/core/extensions/table/table/table-view.tsx index 2ccdc3c6df..c4e723f0e4 100644 --- a/packages/editor/src/core/extensions/table/table/table-view.tsx +++ b/packages/editor/src/core/extensions/table/table/table-view.tsx @@ -5,9 +5,7 @@ import { Decoration, NodeView } from "@tiptap/pm/view"; import { h } from "jsx-dom-cjs"; import { icons } from "src/core/extensions/table/table/icons"; import tippy, { Instance, Props } from "tippy.js"; -// constants import { CORE_EXTENSIONS } from "@/constants/extension"; -// local imports import { isCellSelection } from "./utilities/helpers"; type ToolboxItem = { @@ -148,7 +146,7 @@ const columnsToolboxItems: ToolboxItem[] = [ { label: "Pick color", icon: "", // No icon needed for color picker - action: (args: any) => {}, // Placeholder action; actual color picking is handled in `createToolbox` + action: (_args: unknown) => { }, // Placeholder action; actual color picking is handled in `createToolbox` }, { label: "Delete column", @@ -176,7 +174,7 @@ const rowsToolboxItems: ToolboxItem[] = [ { label: "Pick color", icon: "", - action: (args: any) => {}, // Placeholder action; actual color picking is handled in `createToolbox` + action: (_args: unknown) => { }, // Placeholder action; actual color picking is handled in `createToolbox` }, { label: "Delete row", @@ -217,7 +215,7 @@ function createToolbox({ h( "div", { className: "grid grid-cols-6 gap-x-1 gap-y-2.5 mt-2" }, - Object.entries(colors).map(([colorName, colorValue]) => + Object.entries(colors).map(([_, colorValue]) => h("div", { className: "grid place-items-center size-6 rounded cursor-pointer", style: `background-color: ${colorValue.backgroundColor};color: ${colorValue.textColor || "inherit"};`, diff --git a/packages/editor/src/core/helpers/scroll-to-node.ts b/packages/editor/src/core/helpers/scroll-to-node.ts index 7e5aa0979a..d74e7532c5 100644 --- a/packages/editor/src/core/helpers/scroll-to-node.ts +++ b/packages/editor/src/core/helpers/scroll-to-node.ts @@ -32,8 +32,11 @@ function scrollToNode(editor: Editor, pos: number): void { } } -// eslint-disable-next-line no-undef -export function scrollToNodeViaDOMCoordinates(editor: Editor, pos: number, behavior?: ScrollBehavior): void { +export function scrollToNodeViaDOMCoordinates( + editor: Editor, + pos: number, + behavior?: "auto" | "smooth" | "instant" +): void { const view = editor.view; // Get the coordinates of the position diff --git a/packages/editor/src/core/hooks/use-editor.ts b/packages/editor/src/core/hooks/use-editor.ts index 1979d46b14..1b82e0246c 100644 --- a/packages/editor/src/core/hooks/use-editor.ts +++ b/packages/editor/src/core/hooks/use-editor.ts @@ -271,7 +271,7 @@ export const useEditor = (props: TEditorHookProps) => { Y.applyUpdate(document, value); }, }), - [editor] + [editor, provider] ); if (!editor) { diff --git a/packages/editor/src/core/types/editor.ts b/packages/editor/src/core/types/editor.ts index b91d5fdeee..d409b88283 100644 --- a/packages/editor/src/core/types/editor.ts +++ b/packages/editor/src/core/types/editor.ts @@ -111,8 +111,7 @@ export interface EditorRefApi extends EditorReadOnlyRefApi { onDocumentInfoChange: (callback: (documentInfo: TDocumentInfo) => void) => () => void; onHeadingChange: (callback: (headings: IMarking[]) => void) => () => void; onStateChange: (callback: () => void) => () => void; - // eslint-disable-next-line no-undef - scrollToNodeViaDOMCoordinates: (behavior?: ScrollBehavior, position?: number) => void; + scrollToNodeViaDOMCoordinates: (behavior?: "auto" | "smooth" | "instant", position?: number) => void; setEditorValueAtCursorPosition: (content: string) => void; setFocusAtPosition: (position: number) => void; setProviderDocument: (value: Uint8Array) => void; diff --git a/packages/editor/src/core/types/mention.ts b/packages/editor/src/core/types/mention.ts index b7a65f8b4c..529d64bde1 100644 --- a/packages/editor/src/core/types/mention.ts +++ b/packages/editor/src/core/types/mention.ts @@ -1,5 +1,5 @@ // plane types -import { IUserLite, TSearchEntities } from "@plane/types"; +import { TSearchEntities } from "@plane/types"; export type TMentionSuggestion = { entity_identifier: string; diff --git a/packages/editor/src/core/types/slash-commands-suggestion.ts b/packages/editor/src/core/types/slash-commands-suggestion.ts index d6dfae076f..b5e8068849 100644 --- a/packages/editor/src/core/types/slash-commands-suggestion.ts +++ b/packages/editor/src/core/types/slash-commands-suggestion.ts @@ -1,5 +1,5 @@ -import { CSSProperties } from "react"; import { Editor, Range } from "@tiptap/core"; +import { CSSProperties } from "react"; // types import { TEditorCommands } from "@/types"; diff --git a/packages/editor/tailwind.config.js b/packages/editor/tailwind.config.js index de93a571f8..4e0b7684ec 100644 --- a/packages/editor/tailwind.config.js +++ b/packages/editor/tailwind.config.js @@ -1,6 +1,6 @@ -const sharedConfig = require("@plane/tailwind-config/tailwind.config.js"); +import sharedConfig from "@plane/tailwind-config/tailwind.config.js"; -module.exports = { +export default { // prefix ui lib classes to avoid conflicting with the app ...sharedConfig, }; diff --git a/packages/eslint-config/library.js b/packages/eslint-config/library.js index b868b35a44..30049d361e 100644 --- a/packages/eslint-config/library.js +++ b/packages/eslint-config/library.js @@ -40,7 +40,14 @@ module.exports = { "react/jsx-no-duplicate-props": "error", "react-hooks/exhaustive-deps": "warn", "@typescript-eslint/no-unused-expressions": "warn", - "@typescript-eslint/no-unused-vars": ["warn"], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ], "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-useless-empty-export": "error", "@typescript-eslint/prefer-ts-expect-error": "warn", diff --git a/packages/eslint-config/next.js b/packages/eslint-config/next.js index a2da660105..0685b8f814 100644 --- a/packages/eslint-config/next.js +++ b/packages/eslint-config/next.js @@ -39,7 +39,14 @@ module.exports = { "react/jsx-no-duplicate-props": "error", "react-hooks/exhaustive-deps": "warn", "@typescript-eslint/no-unused-expressions": "warn", - "@typescript-eslint/no-unused-vars": ["warn"], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ], "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-useless-empty-export": "error", "@typescript-eslint/prefer-ts-expect-error": "warn", diff --git a/packages/eslint-config/server.js b/packages/eslint-config/server.js index 824e253757..38a08d4aba 100644 --- a/packages/eslint-config/server.js +++ b/packages/eslint-config/server.js @@ -1,11 +1,34 @@ +const { resolve } = require("node:path"); +const project = resolve(process.cwd(), "tsconfig.json"); + module.exports = { - extends: ["eslint:recommended"], + extends: ["prettier", "plugin:@typescript-eslint/recommended"], env: { node: true, es6: true, }, + plugins: ["@typescript-eslint", "import"], + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [".*.js", "node_modules/"], parserOptions: { ecmaVersion: "latest", sourceType: "module", }, + rules: { + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ], + } }; diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 89f24ac38d..5a9ed4f3d4 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "tsup --minify", "dev": "tsup --watch", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 6", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/i18n/src/hooks/use-translation.ts b/packages/i18n/src/hooks/use-translation.ts index c233ebcbf1..fb98864222 100644 --- a/packages/i18n/src/hooks/use-translation.ts +++ b/packages/i18n/src/hooks/use-translation.ts @@ -5,7 +5,7 @@ import { TranslationContext } from "../context"; import { ILanguageOption, TLanguage } from "../types"; export type TTranslationStore = { - t: (key: string, params?: Record) => string; + t: (key: string, params?: Record) => string; currentLocale: TLanguage; changeLanguage: (lng: TLanguage) => void; languages: ILanguageOption[]; diff --git a/packages/i18n/src/store/index.ts b/packages/i18n/src/store/index.ts index c75d7b8a32..2873c87d14 100644 --- a/packages/i18n/src/store/index.ts +++ b/packages/i18n/src/store/index.ts @@ -136,7 +136,7 @@ export class TranslationStore { * @param files - Array of file names to import (without .json extension) * @returns Promise that resolves to merged translations */ - private async importAndMergeFiles(language: TLanguage, files: string[]): Promise { + private async importAndMergeFiles(language: TLanguage, files: string[]) { try { const importPromises = files.map((file) => import(`../locales/${language}/${file}.json`)); @@ -153,7 +153,7 @@ export class TranslationStore { * @param language - The language to import the translations for * @returns {Promise} */ - private async importLanguageFile(language: TLanguage): Promise { + private async importLanguageFile(language: TLanguage) { const files = Object.values(ETranslationFiles); return this.importAndMergeFiles(language, files); } @@ -176,7 +176,6 @@ export class TranslationStore { /** * Gets the IntlMessageFormat instance for the given key and locale * Returns cached instance if available - * Throws an error if the key is not found in the translations */ private getMessageInstance(key: string, locale: TLanguage): IntlMessageFormat | null { const cacheKey = this.getCacheKey(key, locale); @@ -188,10 +187,10 @@ export class TranslationStore { // Get the message from the translations const message = get(this.translations[locale], key); - if (!message) return null; + if (typeof message !== "string") return null; try { - const formatter = new IntlMessageFormat(message as any, locale); + const formatter = new IntlMessageFormat(message, locale); this.messageCache.set(cacheKey, formatter); return formatter; } catch (error) { @@ -208,7 +207,7 @@ export class TranslationStore { * @param params - The params to format the translation with * @returns The translated string */ - t(key: string, params?: Record): string { + t(key: string, params?: Record): string { try { // Try current locale let formatter = this.getMessageInstance(key, this.currentLocale); diff --git a/packages/logger/package.json b/packages/logger/package.json index 40a37bb086..6657f893aa 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -7,6 +7,13 @@ "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + }, "files": [ "dist/**" ], diff --git a/packages/logger/src/config.ts b/packages/logger/src/config.ts index fd918e59ef..84bb98e5f1 100644 --- a/packages/logger/src/config.ts +++ b/packages/logger/src/config.ts @@ -1,6 +1,6 @@ +import path from "path"; import winston from "winston"; import DailyRotateFile from "winston-daily-rotate-file"; -import path from "path"; // Define log levels const levels = { diff --git a/packages/propel/package.json b/packages/propel/package.json index 3cb12405c7..63bd0f8597 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -4,7 +4,7 @@ "private": true, "license": "AGPL-3.0", "scripts": { - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 7", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/services/package.json b/packages/services/package.json index 916909696e..5d5102b65d 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -7,7 +7,7 @@ "scripts": { "build": "tsc --noEmit && tsup --minify", "dev": "tsup --watch", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 62", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/shared-state/package.json b/packages/shared-state/package.json index b9096eb6cc..722194a27f 100644 --- a/packages/shared-state/package.json +++ b/packages/shared-state/package.json @@ -7,7 +7,7 @@ "main": "./src/index.ts", "types": "./src/index.ts", "scripts": { - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 4", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/types/package.json b/packages/types/package.json index 78eeeddd79..c836987a9e 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -19,7 +19,7 @@ "scripts": { "dev": "tsup --watch", "build": "tsc --noEmit && tsup --minify", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 36", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/types/src/dashboard.ts b/packages/types/src/dashboard.ts index ac2339d1c0..b928430bab 100644 --- a/packages/types/src/dashboard.ts +++ b/packages/types/src/dashboard.ts @@ -1,8 +1,8 @@ import { EDurationFilters } from "./enums"; import { IIssueActivity, TIssuePriorities } from "./issues"; import { TIssue } from "./issues/issue"; -import { TStateGroups } from "./state"; import { TIssueRelationTypes } from "./issues/issue_relation"; +import { TStateGroups } from "./state"; export type TWidgetKeys = | "overview_stats" diff --git a/packages/types/src/issues/activity/issue_activity.ts b/packages/types/src/issues/activity/issue_activity.ts index 15a37a4a73..bb71864e41 100644 --- a/packages/types/src/issues/activity/issue_activity.ts +++ b/packages/types/src/issues/activity/issue_activity.ts @@ -1,11 +1,11 @@ // local imports +import { EInboxIssueSource } from "../../inbox"; import { TIssueActivityWorkspaceDetail, TIssueActivityProjectDetail, TIssueActivityIssueDetail, TIssueActivityUserDetail, } from "./base"; -import { EInboxIssueSource } from "../../inbox"; export type TIssueActivity = { id: string; diff --git a/packages/types/src/issues/activity/issue_comment.ts b/packages/types/src/issues/activity/issue_comment.ts index 1a4b557b5a..9507a49349 100644 --- a/packages/types/src/issues/activity/issue_comment.ts +++ b/packages/types/src/issues/activity/issue_comment.ts @@ -1,13 +1,13 @@ +import { EIssueCommentAccessSpecifier } from "../../enums"; +import { TFileSignedURLResponse } from "../../file"; +import { IUserLite } from "../../users"; +import { IWorkspaceLite } from "../../workspace"; import { TIssueActivityWorkspaceDetail, TIssueActivityProjectDetail, TIssueActivityIssueDetail, TIssueActivityUserDetail, } from "./base"; -import { EIssueCommentAccessSpecifier } from "../../enums"; -import { TFileSignedURLResponse } from "../../file"; -import { IUserLite } from "../../users"; -import { IWorkspaceLite } from "../../workspace"; export type TCommentReaction = { id: string; diff --git a/packages/types/src/issues/issue.ts b/packages/types/src/issues/issue.ts index 695b3ebc8e..dbcb952181 100644 --- a/packages/types/src/issues/issue.ts +++ b/packages/types/src/issues/issue.ts @@ -1,9 +1,9 @@ import { TIssuePriorities } from "../issues"; +import { TIssuePublicComment } from "./activity/issue_comment"; import { TIssueAttachment } from "./issue_attachment"; import { TIssueLink } from "./issue_link"; import { TIssueReaction, IIssuePublicReaction, IPublicVote } from "./issue_reaction"; import { TIssueRelationTypes } from "./issue_relation"; -import { TIssuePublicComment } from "./activity/issue_comment"; export enum EIssueLayoutTypes { LIST = "list", diff --git a/packages/types/src/module/modules.ts b/packages/types/src/module/modules.ts index 50e9e8af0d..2078ae7d19 100644 --- a/packages/types/src/module/modules.ts +++ b/packages/types/src/module/modules.ts @@ -1,6 +1,6 @@ +import type { ILinkDetails } from "../issues"; import type { TIssue } from "../issues/issue"; import type { IIssueFilterOptions } from "../view-props"; -import type { ILinkDetails } from "../issues"; export type TModuleStatus = "backlog" | "planned" | "in-progress" | "paused" | "completed" | "cancelled"; diff --git a/packages/types/src/page/extended.ts b/packages/types/src/page/extended.ts index 7edfae8286..92f1b995d0 100644 --- a/packages/types/src/page/extended.ts +++ b/packages/types/src/page/extended.ts @@ -1 +1 @@ -export type TPageExtended = {}; +export type TPageExtended = object; diff --git a/packages/types/src/users.ts b/packages/types/src/users.ts index 3258d14dcd..29357e1a50 100644 --- a/packages/types/src/users.ts +++ b/packages/types/src/users.ts @@ -1,5 +1,5 @@ -import { IIssueActivity, TIssuePriorities, TStateGroups } from "."; import { TUserPermissions } from "./enums"; +import { IIssueActivity, TIssuePriorities, TStateGroups } from "."; /** * @description The start of the week for the user diff --git a/packages/types/src/workspace-notifications.ts b/packages/types/src/workspace-notifications.ts index 0e0e15af17..b6856154eb 100644 --- a/packages/types/src/workspace-notifications.ts +++ b/packages/types/src/workspace-notifications.ts @@ -1,5 +1,5 @@ -import type { IUserLite } from "./users"; import { ENotificationFilterType } from "./enums"; +import type { IUserLite } from "./users"; // filters export type TNotificationFilter = { diff --git a/packages/ui/package.json b/packages/ui/package.json index e688e800e3..2d6c718e35 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -17,7 +17,7 @@ "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "postcss": "postcss styles/globals.css -o styles/output.css --watch", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 94", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", @@ -37,6 +37,7 @@ "@plane/constants": "*", "@plane/hooks": "*", "@plane/utils": "*", + "@plane/types": "*", "@popperjs/core": "^2.11.8", "@radix-ui/react-scroll-area": "^1.2.3", "clsx": "^2.0.0", diff --git a/packages/ui/src/icons/priority-icon.tsx b/packages/ui/src/icons/priority-icon.tsx index b2fb2d5342..a6ea01329d 100644 --- a/packages/ui/src/icons/priority-icon.tsx +++ b/packages/ui/src/icons/priority-icon.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { AlertCircle, Ban, SignalHigh, SignalLow, SignalMedium } from "lucide-react"; import { cn } from "../../helpers"; -type TIssuePriorities = "urgent" | "high" | "medium" | "low" | "none"; +export type TIssuePriorities = "urgent" | "high" | "medium" | "low" | "none"; interface IPriorityIcon { className?: string; diff --git a/packages/ui/src/sortable/sortable.stories.tsx b/packages/ui/src/sortable/sortable.stories.tsx index b701af95d7..bc834bfd03 100644 --- a/packages/ui/src/sortable/sortable.stories.tsx +++ b/packages/ui/src/sortable/sortable.stories.tsx @@ -8,7 +8,9 @@ const meta: Meta = { }; export default meta; -type Story = StoryObj; + +type StoryItem = { id: string; name: string }; +type Story = StoryObj>; const data = [ { id: "1", name: "John Doe" }, @@ -20,14 +22,12 @@ const data = [ export const Default: Story = { args: { data, - render: (item: any) => ( + render: (item: StoryItem) => ( //
{item.name}
//
), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onChange: (data) => console.log(data.map(({ id }: any) => id)), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - keyExtractor: (item: any) => item.id, + onChange: (data) => console.log(data.map(({ id }) => id)), + keyExtractor: (item) => item.id, }, }; diff --git a/packages/ui/src/sortable/sortable.tsx b/packages/ui/src/sortable/sortable.tsx index b437f1df1c..29198ed8b5 100644 --- a/packages/ui/src/sortable/sortable.tsx +++ b/packages/ui/src/sortable/sortable.tsx @@ -1,5 +1,5 @@ -import React, { Fragment, useEffect, useMemo } from "react"; import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter"; +import React, { Fragment, useEffect, useMemo } from "react"; import { Draggable } from "./draggable"; type TEnhancedData = T & { __uuid__?: string }; diff --git a/packages/utils/package.json b/packages/utils/package.json index d1c4231207..2efb420928 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "tsc --noEmit && tsup --minify", "dev": "tsup --watch", - "check:lint": "eslint . --max-warnings 0", + "check:lint": "eslint . --max-warnings 20", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", diff --git a/packages/utils/src/string.ts b/packages/utils/src/string.ts index 7bcaa9db42..6ffb4ea041 100644 --- a/packages/utils/src/string.ts +++ b/packages/utils/src/string.ts @@ -102,26 +102,6 @@ export const getNumberCount = (number: number): string => { return number.toString(); }; -/** - * @description Converts object to URL query parameters string - * @param {Object} obj - Object to convert - * @returns {string} URL query parameters string - * @example - * objToQueryParams({ page: 1, search: "test" }) // returns "page=1&search=test" - * objToQueryParams({ a: null, b: "test" }) // returns "b=test" - */ -export const objToQueryParams = (obj: any) => { - const params = new URLSearchParams(); - - if (!obj) return params.toString(); - - for (const [key, value] of Object.entries(obj)) { - if (value !== undefined && value !== null) params.append(key, value as string); - } - - return params.toString(); -}; - /** * @description: This function will capitalize the first letter of a string * @param str String @@ -268,7 +248,7 @@ export const substringMatch = (text: string, searchQuery: string): boolean => { // Not all characters of searchQuery found in order return false; - } catch (error) { + } catch (_err) { return false; } }; @@ -297,7 +277,7 @@ const fallbackCopyTextToClipboard = (text: string) => { // FIXME: Even though we are using this as a fallback, execCommand is deprecated 👎. We should find a better way to do this. // https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand document.execCommand("copy"); - } catch (err) { + } catch (_err) { // catch fallback error } diff --git a/yarn.lock b/yarn.lock index eaab6478cc..2613f6abc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -574,7 +574,7 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": version "4.12.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== @@ -2408,7 +2408,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": +"@types/express-serve-static-core@*": version "5.0.7" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6" integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== @@ -2428,7 +2428,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express-ws@^3.0.4": +"@types/express-ws@^3.0.5": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/express-ws/-/express-ws-3.0.5.tgz#5abf3dda3acb0a339351f089c31aca708f234c7c" integrity sha512-lbWMjoHrm/v85j81UCmb/GNZFO3genxRYBW1Ob7rjRI+zxUBR+4tcFuOpKKsYQ1LYTYiy3356epLeYi/5zxUwA== @@ -2437,16 +2437,7 @@ "@types/express-serve-static-core" "*" "@types/ws" "*" -"@types/express@*": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956" - integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "*" - -"@types/express@^4.17.21": +"@types/express@*", "@types/express@4.17.23", "@types/express@^4.17.21", "@types/express@^4.17.23": version "4.17.23" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== @@ -2709,7 +2700,7 @@ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== -"@types/semver@^7.3.12", "@types/semver@^7.3.4": +"@types/semver@^7.3.4": version "7.7.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== @@ -2778,7 +2769,7 @@ resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.5.tgz#8ce8623ed7a36e3a76d1c0b539708dfb2e859bc0" integrity sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA== -"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/eslint-plugin@^8.6.0": +"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/eslint-plugin@^8.36.0", "@typescript-eslint/eslint-plugin@^8.6.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz#332392883f936137cd6252c8eb236d298e514e70" integrity sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA== @@ -2793,22 +2784,6 @@ natural-compare "^1.4.0" ts-api-utils "^2.1.0" -"@typescript-eslint/eslint-plugin@^5.48.2": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.6.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.37.0.tgz#b87f6b61e25ad5cc5bbf8baf809b8da889c89804" @@ -2829,14 +2804,6 @@ "@typescript-eslint/types" "^8.37.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - "@typescript-eslint/scope-manager@8.37.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz#a31a3c80ca2ef4ed58de13742debb692e7d4c0a4" @@ -2850,16 +2817,6 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz#47a2760d265c6125f8e7864bc5c8537cad2bd053" integrity sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg== -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - "@typescript-eslint/type-utils@8.37.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz#2a682e4c6ff5886712dad57e9787b5e417124507" @@ -2871,29 +2828,11 @@ debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - "@typescript-eslint/types@8.37.0", "@typescript-eslint/types@^8.37.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.37.0.tgz#09517aa9625eb3c68941dde3ac8835740587b6ff" integrity sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - "@typescript-eslint/typescript-estree@8.37.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz#a07e4574d8e6e4355a558f61323730c987f5fcbc" @@ -2910,20 +2849,6 @@ semver "^7.6.0" ts-api-utils "^2.1.0" -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - "@typescript-eslint/utils@8.37.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.37.0.tgz#189ea59b2709f5d898614611f091a776751ee335" @@ -2934,14 +2859,6 @@ "@typescript-eslint/types" "8.37.0" "@typescript-eslint/typescript-estree" "8.37.0" -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - "@typescript-eslint/visitor-keys@8.37.0": version "8.37.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz#cdb6a6bd3e8d6dd69bd70c1bdda36e2d18737455" @@ -3425,11 +3342,6 @@ array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: is-string "^1.1.1" math-intrinsics "^1.1.0" -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" @@ -4643,13 +4555,6 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dlv@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" @@ -5235,7 +5140,7 @@ eslint-plugin-turbo@1.13.4: dependencies: dotenv "16.0.3" -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5251,7 +5156,7 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -5459,7 +5364,7 @@ fast-fifo@^1.2.0, fast-fifo@^1.3.2: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -5914,18 +5819,6 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -7103,7 +6996,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -7455,11 +7348,6 @@ napi-postinstall@^0.3.0: resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.2.tgz#03c62080e88b311c4d7423b0f15f0c920bbcc626" integrity sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8207,9 +8095,9 @@ postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47, postcss@^8.4.49: source-map-js "^1.2.1" posthog-js@^1.131.3: - version "1.257.0" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.257.0.tgz#7adfffa024756b910ee87a978e0fc6c12a9fa730" - integrity sha512-Ujg9RGtWVCu+4tmlRpALSy2ZOZI6JtieSYXIDDdgMWm167KYKvTtbMPHdoBaPWcNu0Km+1hAIBnQFygyn30KhA== + version "1.257.1" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.257.1.tgz#7f9cb847779d515cdadbf9540378722d33efe4cd" + integrity sha512-29kk3IO/LkPQ8E1cds6a2sWr5iN4BovgL+EMzRK9hQXbI6D3FJnQ7zLU6EUpktt6pHnqGpfO3BTEcflcDYkHBg== dependencies: core-js "^3.38.1" fflate "^0.4.8" @@ -9399,11 +9287,6 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slash@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" @@ -10088,11 +9971,6 @@ tsconfig-paths@^4.2.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.7.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" @@ -10125,13 +10003,6 @@ tsup@8.4.0: tinyglobby "^0.2.11" tree-kill "^1.2.2" -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -10169,7 +10040,7 @@ turbo-windows-arm64@2.5.5: resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-2.5.5.tgz#0ab29d38fcc67ba38652f1cd273df49177cb55b8" integrity sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q== -turbo@^2.5.4: +turbo@^2.5.5: version "2.5.5" resolved "https://registry.yarnpkg.com/turbo/-/turbo-2.5.5.tgz#6057f87c1262acdfa30cf16d4cf74629623f36c9" integrity sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A== @@ -10863,7 +10734,7 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.17.1, ws@^8.18.0, ws@^8.2.3, ws@^8.5.0: +ws@^8.17.1, ws@^8.18.0, ws@^8.18.3, ws@^8.2.3, ws@^8.5.0: version "8.18.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==