diff --git a/.eslintrc b/.eslintrc index 7e2d5b354..362f0025a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -26,8 +26,18 @@ "rules": { "eqeqeq": 2, "no-mixed-operators": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "args": "after-used", + "ignoreRestSiblings": true + } + ], "padding-line-between-statements": ["error", { "blankLine": "always", "prev": "*", "next": "export" }], "lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }], + "import/no-named-as-default": "off", + "import/no-named-as-default-member": "off", "import/newline-after-import": 2, "import/order": [ "error", diff --git a/app/components/CollectionDescription.tsx b/app/components/CollectionDescription.tsx index 2a6c62e14..575ffabbc 100644 --- a/app/components/CollectionDescription.tsx +++ b/app/components/CollectionDescription.tsx @@ -84,8 +84,17 @@ function CollectionDescription({ collection }: Props) { {collections.isSaving && } {collection.hasDescription || isEditing || isDirty ? ( - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - Loading…}> + { + // + }} + > + Loading… + + } + > { }; render() { - const { text: _text, onCopy: _onCopy, children, ...rest } = this.props; + const { text, onCopy, children, ...rest } = this.props; const elem = React.Children.only(children); if (!elem) { return null; diff --git a/app/components/LocaleTime.tsx b/app/components/LocaleTime.tsx index 24f12d2f2..dae914715 100644 --- a/app/components/LocaleTime.tsx +++ b/app/components/LocaleTime.tsx @@ -40,8 +40,7 @@ function LocaleTime({ tooltipDelay, }: Props) { const userLocale = useUserLocale(); - const [_, setMinutesMounted] = React.useState(0); // eslint-disable-line no-unused-vars - + const [_, setMinutesMounted] = React.useState(0); // eslint-disable-line @typescript-eslint/no-unused-vars const callback = React.useRef<() => void>(); React.useEffect(() => { diff --git a/app/menus/CollectionSortMenu.tsx b/app/menus/CollectionSortMenu.tsx index 58b0e3e3d..151fdc4ef 100644 --- a/app/menus/CollectionSortMenu.tsx +++ b/app/menus/CollectionSortMenu.tsx @@ -14,7 +14,7 @@ type Props = { onClose?: () => void; }; -function CollectionSortMenu({ collection, onOpen, onClose, ...rest }: Props) { +function CollectionSortMenu({ collection, onOpen, onClose }: Props) { const { t } = useTranslation(); const menu = useMenuState({ modal: true, diff --git a/app/models/Document.ts b/app/models/Document.ts index 7f8995359..e19fd806b 100644 --- a/app/models/Document.ts +++ b/app/models/Document.ts @@ -1,7 +1,7 @@ import { addDays, differenceInDays } from "date-fns"; import invariant from "invariant"; import { floor } from "lodash"; -import { action, computed, observable, set } from "mobx"; +import { action, computed, observable } from "mobx"; import parseTitle from "@shared/utils/parseTitle"; import unescape from "@shared/utils/unescape"; import DocumentsStore from "~/stores/DocumentsStore"; diff --git a/app/stores/BaseStore.ts b/app/stores/BaseStore.ts index f001112de..8f0efd36a 100644 --- a/app/stores/BaseStore.ts +++ b/app/stores/BaseStore.ts @@ -1,6 +1,6 @@ import invariant from "invariant"; import { orderBy } from "lodash"; -import { observable, set, action, computed, runInAction } from "mobx"; +import { observable, action, computed, runInAction } from "mobx"; import { Class } from "utility-types"; import RootStore from "~/stores/RootStore"; import BaseModel from "~/models/BaseModel"; diff --git a/app/utils/download.ts b/app/utils/download.ts index 8e26562f2..94d4a57fe 100644 --- a/app/utils/download.ts +++ b/app/utils/download.ts @@ -59,27 +59,6 @@ export default function download( } } - function d2b(u: string) { - if (typeof u !== "string") { - throw Error("Attempted to pass non-string to d2b"); - } - - const p = u.split(/[:;,]/), - t = p[1], - dec = p[2] === "base64" ? atob : decodeURIComponent, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - bin = dec(p.pop()), - mx = bin.length, - uia = new Uint8Array(mx); - - let i = 0; - for (i; i < mx; ++i) uia[i] = bin.charCodeAt(i); - - return new B([uia], { - type: t, - }); - } - function saver(url: string, winMode = false) { if (typeof url !== "string") { throw Error("Attempted to pass non-string url to saver"); @@ -140,7 +119,7 @@ export default function download( // Blob but not URL: fr = new FileReader(); - fr.onload = function (e) { + fr.onload = function () { // @ts-expect-error ts-migrate(2554) FIXME: Expected 2 arguments, but got 1. saver(this.result); }; diff --git a/server/collaboration/persistence.ts b/server/collaboration/persistence.ts index 9cfa82dcb..f71a4f9b9 100644 --- a/server/collaboration/persistence.ts +++ b/server/collaboration/persistence.ts @@ -2,7 +2,7 @@ import { onChangePayload, onLoadDocumentPayload } from "@hocuspocus/server"; import { debounce } from "lodash"; import * as Y from "yjs"; import Logger from "@server/logging/logger"; -import { Document, User } from "@server/models"; +import { Document } from "@server/models"; import documentUpdater from "../commands/documentUpdater"; import markdownToYDoc from "./utils/markdownToYDoc"; diff --git a/server/commands/documentCreator.ts b/server/commands/documentCreator.ts index 5ad666549..8a7ae0954 100644 --- a/server/commands/documentCreator.ts +++ b/server/commands/documentCreator.ts @@ -11,7 +11,6 @@ export default async function documentCreator({ // allows override for import updatedAt, template, - index, user, editorVersion, source, diff --git a/server/commands/documentImporter.ts b/server/commands/documentImporter.ts index 6a64620e6..b5ce33540 100644 --- a/server/commands/documentImporter.ts +++ b/server/commands/documentImporter.ts @@ -28,7 +28,7 @@ turndownService .use(tables) .addRule("breaks", { filter: ["br"], - replacement: function (content) { + replacement: function () { return "\n"; }, }); diff --git a/server/emails/DocumentNotificationEmail.tsx b/server/emails/DocumentNotificationEmail.tsx index 5a82fffb1..dea2a555a 100644 --- a/server/emails/DocumentNotificationEmail.tsx +++ b/server/emails/DocumentNotificationEmail.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { User, Document, Team, Collection } from "@server/models"; +import { User, Team, Collection } from "@server/models"; import Body from "./components/Body"; import Button from "./components/Button"; import EmailTemplate from "./components/EmailLayout"; diff --git a/server/logging/metrics.ts b/server/logging/metrics.ts index fcd252685..1f7935ae9 100644 --- a/server/logging/metrics.ts +++ b/server/logging/metrics.ts @@ -39,7 +39,7 @@ class Metrics { return ddMetrics.gauge(key, value, [...tags, `instance:${instanceId}`]); } - increment(key: string, tags?: Record): void { + increment(key: string, _tags?: Record): void { if (!this.enabled) { return; } diff --git a/server/models/Group.ts b/server/models/Group.ts index de8aa3232..92977f777 100644 --- a/server/models/Group.ts +++ b/server/models/Group.ts @@ -79,7 +79,7 @@ Group.associate = (models) => { // Cascade deletes to group and collection relations // @ts-expect-error ts-migrate(7006) FIXME: Parameter 'group' implicitly has an 'any' type. -Group.addHook("afterDestroy", async (group, options) => { +Group.addHook("afterDestroy", async (group) => { if (!group.deletedAt) return; await GroupUser.destroy({ where: { diff --git a/shared/embeds/Abstract.tsx b/shared/embeds/Abstract.tsx index ebb1e4acf..4133b1c95 100644 --- a/shared/embeds/Abstract.tsx +++ b/shared/embeds/Abstract.tsx @@ -1,12 +1,6 @@ import * as React from "react"; import Frame from "./components/Frame"; - -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; +import { EmbedProps as Props } from "."; export default class Abstract extends React.Component { static ENABLED = [ @@ -20,7 +14,6 @@ export default class Abstract extends React.Component { return ( diff --git a/shared/embeds/Airtable.tsx b/shared/embeds/Airtable.tsx index af9486fd2..37fff32bb 100644 --- a/shared/embeds/Airtable.tsx +++ b/shared/embeds/Airtable.tsx @@ -1,13 +1,8 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp("https://airtable.com/(?:embed/)?(shr.*)$"); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class Airtable extends React.Component { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class Airtable extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class Vimeo extends React.Component { return ( diff --git a/shared/embeds/Cawemo.tsx b/shared/embeds/Cawemo.tsx index a3b8b1ef3..37d45593f 100644 --- a/shared/embeds/Cawemo.tsx +++ b/shared/embeds/Cawemo.tsx @@ -1,13 +1,8 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp("https?://cawemo.com/(?:share|embed)/(.*)$"); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class Cawemo extends React.Component { static ENABLED = [URL_REGEX]; @@ -18,11 +13,9 @@ export default class Cawemo extends React.Component { return ( ); } diff --git a/shared/embeds/ClickUp.tsx b/shared/embeds/ClickUp.tsx index c457ca332..c0585905f 100644 --- a/shared/embeds/ClickUp.tsx +++ b/shared/embeds/ClickUp.tsx @@ -1,15 +1,10 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp( "^https?://share.clickup.com/[a-z]/[a-z]/(.*)/(.*)$" ); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class ClickUp extends React.Component { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class ClickUp extends React.Component { return ( diff --git a/shared/embeds/Codepen.tsx b/shared/embeds/Codepen.tsx index 0bc4e449e..efe65d6cb 100644 --- a/shared/embeds/Codepen.tsx +++ b/shared/embeds/Codepen.tsx @@ -1,20 +1,14 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp("^https://codepen.io/(.*?)/(pen|embed)/(.*)$"); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class Codepen extends React.Component { static ENABLED = [URL_REGEX]; render() { const normalizedUrl = this.props.attrs.href.replace(/\/pen\//, "/embed/"); - // @ts-expect-error ts-migrate(2322) FIXME: Type '{ src: string; title: string; attrs: { href:... Remove this comment to see the full error message return ; } } diff --git a/shared/embeds/Descript.tsx b/shared/embeds/Descript.tsx index 46af1bc8a..31964d4cc 100644 --- a/shared/embeds/Descript.tsx +++ b/shared/embeds/Descript.tsx @@ -1,12 +1,6 @@ import * as React from "react"; import Frame from "./components/Frame"; - -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; +import { EmbedProps as Props } from "."; export default class Descript extends React.Component { static ENABLED = [new RegExp("https?://share.descript.com/view/(\\w+)$")]; @@ -17,7 +11,6 @@ export default class Descript extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -33,7 +28,6 @@ export default class Diagrams extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class Figma extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -16,7 +11,6 @@ export default class Framer extends React.Component { return ( { static ENABLED = [URL_REGEX]; diff --git a/shared/embeds/GoogleCalendar.tsx b/shared/embeds/GoogleCalendar.tsx index 9b9d0b207..422ebf0b3 100644 --- a/shared/embeds/GoogleCalendar.tsx +++ b/shared/embeds/GoogleCalendar.tsx @@ -1,15 +1,10 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp( "^https?://calendar.google.com/calendar/embed\\?src=(.*)$" ); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class GoogleCalendar extends React.Component { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class GoogleCalendar extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -19,7 +14,6 @@ export default class GoogleDataStudio extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -17,7 +12,6 @@ export default class GoogleDocs extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -19,7 +14,6 @@ export default class GoogleDrawings extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -16,7 +11,6 @@ export default class GoogleDrive extends React.Component { render() { return ( { static ENABLED = [URL_REGEX]; @@ -17,7 +12,6 @@ export default class GoogleSheets extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -17,7 +12,6 @@ export default class GoogleSlides extends React.Component { return ( { static ENABLED = [IFRAME_REGEX, IMAGE_REGEX]; @@ -37,7 +31,6 @@ export default class InVision extends React.Component { return ( diff --git a/shared/embeds/Loom.tsx b/shared/embeds/Loom.tsx index ab5af485f..1dbc8f8b6 100644 --- a/shared/embeds/Loom.tsx +++ b/shared/embeds/Loom.tsx @@ -1,20 +1,14 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = /^https:\/\/(www\.)?(use)?loom.com\/(embed|share)\/(.*)$/; -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class Loom extends React.Component { static ENABLED = [URL_REGEX]; render() { const normalizedUrl = this.props.attrs.href.replace("share", "embed"); - // @ts-expect-error ts-migrate(2322) FIXME: Type '{ src: string; title: string; attrs: { href:... Remove this comment to see the full error message return ; } } diff --git a/shared/embeds/Lucidchart.tsx b/shared/embeds/Lucidchart.tsx index ebbab7cd3..03dcf0216 100644 --- a/shared/embeds/Lucidchart.tsx +++ b/shared/embeds/Lucidchart.tsx @@ -1,12 +1,6 @@ import * as React from "react"; import Frame from "./components/Frame"; - -type Props = { - attrs: { - href: string; - matches: Record; - }; -}; +import { EmbedProps as Props } from "."; export default class Lucidchart extends React.Component { static ENABLED = [ @@ -16,11 +10,11 @@ export default class Lucidchart extends React.Component { render() { const { matches } = this.props.attrs; - const { chartId } = matches.groups; + const chartId = matches.groups?.chartId; + return ( diff --git a/shared/embeds/Marvel.tsx b/shared/embeds/Marvel.tsx index ea64360c1..4f36e234c 100644 --- a/shared/embeds/Marvel.tsx +++ b/shared/embeds/Marvel.tsx @@ -1,13 +1,8 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp("^https://marvelapp.com/([A-Za-z0-9-]{6})/?$"); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class Marvel extends React.Component { static ENABLED = [URL_REGEX]; @@ -16,7 +11,6 @@ export default class Marvel extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -22,7 +17,6 @@ export default class Mindmeister extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -17,10 +12,10 @@ export default class RealtimeBoard extends React.Component { const domain = matches[1]; const boardId = matches[2]; const titleName = domain === "realtimeboard" ? "RealtimeBoard" : "Miro"; + return ( diff --git a/shared/embeds/ModeAnalytics.tsx b/shared/embeds/ModeAnalytics.tsx index b44279532..2ae6b0c7b 100644 --- a/shared/embeds/ModeAnalytics.tsx +++ b/shared/embeds/ModeAnalytics.tsx @@ -1,15 +1,10 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp( "^https://([w.-]+.)?modeanalytics.com/(.*)/reports/(.*)$" ); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class ModeAnalytics extends React.Component { static ENABLED = [URL_REGEX]; @@ -20,7 +15,6 @@ export default class ModeAnalytics extends React.Component { return ( diff --git a/shared/embeds/Pitch.tsx b/shared/embeds/Pitch.tsx index b2006217e..dc4a94002 100644 --- a/shared/embeds/Pitch.tsx +++ b/shared/embeds/Pitch.tsx @@ -1,15 +1,10 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = new RegExp( "^https?://app.pitch.com/app/(?:presentation/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|public/player)/(.*)$" ); -type Props = { - attrs: { - href: string; - matches: any; - }; -}; export default class Pitch extends React.Component { static ENABLED = [URL_REGEX]; @@ -19,7 +14,6 @@ export default class Pitch extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -15,7 +10,6 @@ export default class Prezi extends React.Component { render() { const url = this.props.attrs.href.replace(/\/embed$/, ""); return ( - // @ts-expect-error ts-migrate(2322) FIXME: Type '{ src: string; title: string; border: true; ... Remove this comment to see the full error message ); } diff --git a/shared/embeds/Spotify.tsx b/shared/embeds/Spotify.tsx index 6430f6f5c..616c3d4ac 100644 --- a/shared/embeds/Spotify.tsx +++ b/shared/embeds/Spotify.tsx @@ -2,12 +2,7 @@ import * as React from "react"; import Frame from "./components/Frame"; const URL_REGEX = new RegExp("https?://open.spotify.com/(.*)$"); -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; +import { EmbedProps as Props } from "."; export default class Spotify extends React.Component { static ENABLED = [URL_REGEX]; @@ -36,7 +31,6 @@ export default class Spotify extends React.Component { return ( { static ENABLED = [URL_REGEX]; @@ -19,7 +14,6 @@ export default class Trello extends React.Component { if (matches[1] === "c") { return ( { return ( { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class Typeform extends React.Component { return ( diff --git a/shared/embeds/Vimeo.tsx b/shared/embeds/Vimeo.tsx index 766aedb29..a9b9e1c43 100644 --- a/shared/embeds/Vimeo.tsx +++ b/shared/embeds/Vimeo.tsx @@ -1,13 +1,8 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = /(http|https)?:\/\/(www\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|)(\d+)(?:|\/\?)/; -type Props = { - attrs: { - href: string; - matches: string[]; - }; -}; export default class Vimeo extends React.Component { static ENABLED = [URL_REGEX]; @@ -18,7 +13,6 @@ export default class Vimeo extends React.Component { return ( diff --git a/shared/embeds/YouTube.tsx b/shared/embeds/YouTube.tsx index 7dca110bb..44127a865 100644 --- a/shared/embeds/YouTube.tsx +++ b/shared/embeds/YouTube.tsx @@ -1,14 +1,8 @@ import * as React from "react"; import Frame from "./components/Frame"; +import { EmbedProps as Props } from "."; const URL_REGEX = /(?:https?:\/\/)?(?:www\.)?youtu\.?be(?:\.com)?\/?.*(?:watch|embed)?(?:.*v=|v\/|\/)([a-zA-Z0-9_-]{11})$/i; -type Props = { - isSelected: boolean; - attrs: { - href: string; - matches: string[]; - }; -}; export default class YouTube extends React.Component { static ENABLED = [URL_REGEX]; @@ -19,7 +13,6 @@ export default class YouTube extends React.Component { return ( diff --git a/shared/embeds/components/Frame.tsx b/shared/embeds/components/Frame.tsx index 0848fa102..815d61d5d 100644 --- a/shared/embeds/components/Frame.tsx +++ b/shared/embeds/components/Frame.tsx @@ -13,7 +13,7 @@ const StyledIframe = styled(Iframe)` border-radius: ${(props) => (props.$withBar ? "3px 3px 0 0" : "3px")}; display: block; `; -type Props = { +type Props = React.HTMLAttributes & { src?: string; border?: boolean; title?: string; @@ -22,6 +22,7 @@ type Props = { isSelected?: boolean; width?: string; height?: string; + allow?: string; }; type PropsWithRef = Props & { @@ -147,7 +148,7 @@ const Bar = styled.div` user-select: none; `; -export default React.forwardRef((props, ref) => ( +export default React.forwardRef((props, ref) => ( // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. )); diff --git a/shared/embeds/index.tsx b/shared/embeds/index.tsx index d94825661..88eb0d29a 100644 --- a/shared/embeds/index.tsx +++ b/shared/embeds/index.tsx @@ -34,10 +34,17 @@ import Vimeo from "./Vimeo"; import YouTube from "./YouTube"; import Image from "./components/Image"; -// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'Component' implicitly has an 'any' type... Remove this comment to see the full error message -function matcher(Component) { - // @ts-expect-error ts-migrate(7030) FIXME: Not all code paths return a value. +export type EmbedProps = { + isSelected: boolean; + attrs: { + href: string; + matches: RegExpMatchArray; + }; +}; + +function matcher(Component: React.ComponentType) { return (url: string) => { + // @ts-expect-error not aware of static const regexes = Component.ENABLED; for (const regex of regexes) { @@ -47,6 +54,8 @@ function matcher(Component) { return result; } } + + return undefined; }; } @@ -60,16 +69,15 @@ export default [ { title: "Abstract", keywords: "design", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + defaultHidden: true, + icon: () => Abstract, component: Abstract, matcher: matcher(Abstract), }, { title: "Airtable", keywords: "spreadsheet", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Airtable, component: Airtable, matcher: matcher(Airtable), }, @@ -77,8 +85,7 @@ export default [ title: "Bilibili", keywords: "video", defaultHidden: true, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Bilibili, component: Bilibili, matcher: matcher(Bilibili), }, @@ -86,120 +93,106 @@ export default [ title: "Cawemo", keywords: "bpmn process", defaultHidden: true, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Cawemo, component: Cawemo, matcher: matcher(Cawemo), }, { title: "ClickUp", keywords: "project", - defaultHidden: true, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => ClickUp, component: ClickUp, matcher: matcher(ClickUp), }, { title: "Codepen", keywords: "code editor", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Codepen, component: Codepen, matcher: matcher(Codepen), }, { title: "Descript", keywords: "audio", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Descript, component: Descript, matcher: matcher(Descript), }, { title: "Figma", keywords: "design svg vector", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Figma, component: Figma, matcher: matcher(Figma), }, { title: "Framer", keywords: "design prototyping", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Framer, component: Framer, matcher: matcher(Framer), }, { title: "GitHub Gist", keywords: "code", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => GitHub, component: Gist, matcher: matcher(Gist), }, { title: "Diagrams.net", keywords: "diagrams drawio", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Diagrams.net, component: Diagrams, matcher: matcher(Diagrams), }, { title: "Google Drawings", keywords: "drawings", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Google Drawings, component: GoogleDrawings, matcher: matcher(GoogleDrawings), }, { title: "Google Drive", keywords: "drive", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Google Drive, component: GoogleDrive, matcher: matcher(GoogleDrive), }, { title: "Google Docs", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Google Docs, component: GoogleDocs, matcher: matcher(GoogleDocs), }, { title: "Google Sheets", keywords: "excel spreadsheet", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Google Sheets, component: GoogleSheets, matcher: matcher(GoogleSheets), }, { title: "Google Slides", keywords: "presentation slideshow", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Google Slides, component: GoogleSlides, matcher: matcher(GoogleSlides), }, { title: "Google Calendar", keywords: "calendar", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Google Calendar, component: GoogleCalendar, matcher: matcher(GoogleCalendar), }, { title: "Google Data Studio", - keywords: "business intelligence", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + keywords: "bi business intelligence", + icon: () => ( + Google Data Studio + ), component: GoogleDataStudio, matcher: matcher(GoogleDataStudio), }, @@ -207,48 +200,42 @@ export default [ title: "InVision", keywords: "design prototype", defaultHidden: true, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => InVision, component: InVision, matcher: matcher(InVision), }, { title: "Loom", keywords: "video screencast", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Loom, component: Loom, matcher: matcher(Loom), }, { title: "Lucidchart", keywords: "chart", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Lucidchart, component: Lucidchart, matcher: matcher(Lucidchart), }, { title: "Marvel", keywords: "design prototype", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Marvel, component: Marvel, matcher: matcher(Marvel), }, { title: "Mindmeister", keywords: "mindmap", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Mindmeister, component: Mindmeister, matcher: matcher(Mindmeister), }, { title: "Miro", keywords: "whiteboard", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Miro, component: Miro, matcher: matcher(Miro), }, @@ -256,8 +243,7 @@ export default [ title: "Mode", keywords: "analytics", defaultHidden: true, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Mode, component: ModeAnalytics, matcher: matcher(ModeAnalytics), }, @@ -265,56 +251,49 @@ export default [ title: "Pitch", keywords: "presentation", defaultHidden: true, - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Pitch, component: Pitch, matcher: matcher(Pitch), }, { title: "Prezi", keywords: "presentation", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Prezi, component: Prezi, matcher: matcher(Prezi), }, { title: "Spotify", keywords: "music", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Spotify, component: Spotify, matcher: matcher(Spotify), }, { title: "Trello", keywords: "kanban", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Trello, component: Trello, matcher: matcher(Trello), }, { title: "Typeform", keywords: "form survey", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Typeform, component: Typeform, matcher: matcher(Typeform), }, { title: "Vimeo", keywords: "video", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => Vimeo, component: Vimeo, matcher: matcher(Vimeo), }, { title: "YouTube", keywords: "google video", - // @ts-expect-error ts-migrate(2769) FIXME: No overload matches this call. - icon: () => , + icon: () => YouTube, component: YouTube, matcher: matcher(YouTube), },