diff --git a/.eslintrc b/.eslintrc index c2f3da6e..1317ad4f 100755 --- a/.eslintrc +++ b/.eslintrc @@ -41,11 +41,11 @@ "react/no-string-refs": 2, "react/no-typos": 1, "react/no-unknown-property": 1, - "react/no-unused-prop-types": 1, + "react/no-unused-prop-types": 0, "react/no-unused-state": 1, "react/prefer-stateless-function": 1, "react/prop-types": 2, - "react/require-default-props": 1, + "react/require-default-props": 0, "react/require-render-return": 2, "react/self-closing-comp": 1, "react/sort-comp": 1, @@ -63,7 +63,8 @@ "react/jsx-uses-react": 1, "react/jsx-uses-vars": 1, "jsx-a11y/alt-text": 1, - "jsx-a11y/no-static-element-interactions": 2 + "jsx-a11y/no-static-element-interactions": 2, + "react-hooks/rules-of-hooks": 1 }, "overrides": [ { @@ -73,7 +74,10 @@ "rules": { "no-undef": 0, "no-unused-vars": 0, - "@typescript-eslint/no-unused-vars": 2, + "@typescript-eslint/no-unused-vars": [ + "warn", + { "argsIgnorePattern": "^_" } + ], "no-unused-expressions": 0, "@typescript-eslint/no-unused-expressions": ["error"] } diff --git a/Makefile b/Makefile index e8252b7e..9de7b0b6 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,16 @@ format: $(info Task: format:check) $(EXEC) sh -c 'npm run format:check:app || exit 255' +.PHONY: types +format: + $(info Task: types) + $(EXEC) sh -c 'npm run types || exit 255' + +.PHONY: lint +format: + $(info Task: lint) + $(EXEC) sh -c 'npm run lint || exit 255' + .PHONY: build build: $(info Task: build production) diff --git a/package.json b/package.json index 1942964e..d727e26c 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "lint": "eslint --ext .js,.jsx,.ts,.tsx src", "start-docker": "docker run -e FLOW_DEBUG=true -e FLOW_SESSIONCOOKIESSECURE=false -p 8080:8080 gcr.io/dl-flow/playground-api:latest ?", "snyk-protect": "snyk protect", - "tsc": "tsc", - "ci:check": "npm run format:check:app && npm run lint && npm run tsc" + "types": "tsc", + "ci:check": "npm run format:check:app && npm run lint && npm run types" }, "dependencies": { "@apollo/react-hooks": "^3.1.3", diff --git a/src/components/AccountAvatars.tsx b/src/components/AccountAvatars.tsx index a6615ad8..e0ead936 100644 --- a/src/components/AccountAvatars.tsx +++ b/src/components/AccountAvatars.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { useThemeUI, Flex, Box, Badge } from 'theme-ui'; +import Avatar from 'components/Avatar'; import { motion } from 'framer-motion'; +import React from 'react'; import { Account, Project } from 'src/api/apollo/generated/graphql'; -import Avatar from 'components/Avatar'; +import { Badge, Box, Flex, useThemeUI } from 'theme-ui'; export const AccountAvatar: React.FC<{ onClick: (e: any, i: number) => void; @@ -11,7 +11,7 @@ export const AccountAvatar: React.FC<{ return ( = ({ maxSelection={maxSelection} /> { const { theme } = useThemeUI(); @@ -11,7 +11,7 @@ export const Outline: React.FC = ({ children }) => { return ( = (props) => { - const { multi, selectedAccounts, accounts, project, onChange, maxSelection } = - props; + const { + multi, + selectedAccounts, + accounts, + project, + onChange, + maxSelection, + } = props; if (!multi) { throw new Error('Must include multi prop.'); } @@ -94,7 +100,7 @@ const AccountSigners: React.FC<{ }} /> = (props) => { const [processingStatus, setProcessingStatus] = useState(false); const [setResult] = useSetExecutionResultsMutation(); - const { scriptFactory, transactionFactory, contractDeployment } = - useTemplateType(); + const { + scriptFactory, + transactionFactory, + contractDeployment, + } = useTemplateType(); const { project, active, @@ -226,9 +229,9 @@ const Arguments: React.FC = (props) => { const [notifications, setNotifications] = useState<{ [identifier: string]: string[]; }>({}); - /* eslint-disable */ // compare 'state' field for each account, set 'notifications' state for new data - // @ts-ignore: <- this state is only used to compare and render notifications + // <- this state is only used to compare and render notifications + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, setProjectAccts] = useState(project.accounts); const [counter, setCounter] = useState(0); useEffect(() => { diff --git a/src/components/Avatar.tsx b/src/components/Avatar.tsx index 91ca2262..f29d39f6 100644 --- a/src/components/Avatar.tsx +++ b/src/components/Avatar.tsx @@ -16,7 +16,12 @@ const Avatar: React.FC = ({ seed, index, style }) => { } return ( - + Avatar ); }; diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 5cbaecba..79e3bab5 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -1,9 +1,9 @@ -import React from 'react'; -import { Button as ThemedButton } from 'theme-ui'; import styled from '@emotion/styled'; import { motion } from 'framer-motion'; +import React from 'react'; import { FaSpinner } from 'react-icons/fa'; import { CSSProperties } from 'styled-components'; +import { Button as ThemedButton } from 'theme-ui'; interface StyledButtonProps { style?: CSSProperties; @@ -58,7 +58,7 @@ const StyledButton: React.FC = styled(ThemedButton)` `; interface ButtonProps { - children?: any; + children?: React.ReactNode; onClick?: any; className?: string; style?: CSSProperties; diff --git a/src/components/CadenceEditor/ControlPanel/index.tsx b/src/components/CadenceEditor/ControlPanel/index.tsx index 2b1c4ed9..5d53c8eb 100644 --- a/src/components/CadenceEditor/ControlPanel/index.tsx +++ b/src/components/CadenceEditor/ControlPanel/index.tsx @@ -1,4 +1,9 @@ // External Modules +import { + editor as monacoEditor, + IPosition, +} from 'monaco-editor/esm/vs/editor/editor.api'; +import { ExecuteCommandRequest } from 'monaco-languageclient'; import React, { useContext, useEffect, useMemo, useRef, useState } from 'react'; import { FaExclamationTriangle, @@ -6,16 +11,12 @@ import { FaRegTimesCircle, FaSpinner, } from 'react-icons/fa'; -import { ExecuteCommandRequest } from 'monaco-languageclient'; -import { - IPosition, - editor as monacoEditor, -} from 'monaco-editor/esm/vs/editor/editor.api'; // Project Modules import { CadenceCheckerContext } from 'providers/CadenceChecker'; import { EntityType } from 'providers/Project'; import { useProject } from 'providers/Project/projectHooks'; +import { CadenceCheckCompleted } from 'util/language-server'; import { CadenceProblem, formatMarker, @@ -26,7 +27,6 @@ import { ProblemsList, } from 'util/language-syntax-errors'; import { extractSigners } from 'util/parser'; -import { CadenceCheckCompleted } from 'util/language-server'; // Local Generated Modules import { @@ -35,15 +35,15 @@ import { } from 'api/apollo/generated/graphql'; // Component Scoped Files -import { getLabel, validateByType, useTemplateType } from './utils'; -import { ControlPanelProps, IValue } from './types'; import { - MotionBox, - Confirm, Cancel, + Confirm, + MotionBox, PromptActionsContainer, StatusIcon, } from './components'; +import { ControlPanelProps, IValue } from './types'; +import { getLabel, useTemplateType, validateByType } from './utils'; // Other import { @@ -56,13 +56,12 @@ import { } from '../../Arguments/components'; import { ControlContainer, - HoverPanel, Hidable, + HoverPanel, StatusMessage, } from '../../Arguments/styles'; const ControlPanel: React.FC = (props) => { - /* eslint-disable */ // We should not render this component if editor is non-existent if (!props.editor) { return null; @@ -77,8 +76,11 @@ const ControlPanel: React.FC = (props) => { const [executionArguments, setExecutionArguments] = useState({}); const [processingStatus, setProcessingStatus] = useState(false); const [setResult] = useSetExecutionResultsMutation(); - const { scriptFactory, transactionFactory, contractDeployment } = - useTemplateType(); + const { + scriptFactory, + transactionFactory, + contractDeployment, + } = useTemplateType(); const [selected, updateSelectedAccounts] = useState([]); const [expanded, setExpanded] = useState(true); @@ -255,7 +257,7 @@ const ControlPanel: React.FC = (props) => { // Language server throws "input is not literal" without quotes if (type === `String`) { - value = `\"${value.replace(/"/g, '\\"')}\"`; + value = `"${value.replace(/"/g, '\\"')}"`; } return value; diff --git a/src/components/CadenceEditor/Notifications/components.tsx b/src/components/CadenceEditor/Notifications/components.tsx index f0fac273..a63766eb 100644 --- a/src/components/CadenceEditor/Notifications/components.tsx +++ b/src/components/CadenceEditor/Notifications/components.tsx @@ -1,6 +1,6 @@ +import { motion } from 'framer-motion'; import React from 'react'; import styled from 'styled-components'; -import { motion } from 'framer-motion'; import { Box, Flex, Text } from 'theme-ui'; import theme from '../../../theme'; @@ -26,7 +26,11 @@ export const RemoveToastButton = styled.button` } `; -export const ButtonContainer = ({ children }: any) => { +export const ButtonContainer = ({ + children, +}: { + children: React.ReactNode; +}) => { return ( { ); }; -export const ContentBox = ({ children }: any) => { +export const ContentBox = ({ children }: { children: React.ReactNode }) => { const sx = { marginTop: '0.0rem', padding: '0.8rem 0.5rem', @@ -56,14 +60,14 @@ export const ContentBox = ({ children }: any) => { ); }; -export const Content = ({ children }: any) => { +export const Content = ({ children }: { children: React.ReactNode }) => { const sx = { padding: '0.75rem', }; return {children}; }; -export const SingleToast = (props: any) => { +export const SingleToast = (props: { children: React.ReactNode }) => { const { children } = props; const toastProps = { layout: true, diff --git a/src/components/CadenceEditor/Notifications/index.tsx b/src/components/CadenceEditor/Notifications/index.tsx index 4159eec8..dfbc57a1 100644 --- a/src/components/CadenceEditor/Notifications/index.tsx +++ b/src/components/CadenceEditor/Notifications/index.tsx @@ -1,23 +1,24 @@ -import React, { useEffect, useState } from 'react'; import { useProject } from 'providers/Project/projectHooks'; +import React, { useEffect, useState } from 'react'; +import { AiFillCloseCircle } from 'react-icons/ai'; import { - SingleToast, - ToastContainer, - RemoveToastButton, ButtonContainer, - ContentBox, Content, + ContentBox, + RemoveToastButton, + SingleToast, + ToastContainer, } from './components'; -import { AiFillCloseCircle } from 'react-icons/ai'; const Notifications = () => { - /* eslint-disable */ // =========================================================================== // GLOBAL HOOKS const { project, lastSigners } = useProject(); // HOOKS ------------------------------------------------------------------- + + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, setProjectAccounts] = useState(project.accounts); const [counter, setCounter] = useState(0); const [notifications, setNotifications] = useState<{ diff --git a/src/components/CadenceEditor/index.tsx b/src/components/CadenceEditor/index.tsx index a006c033..07e259b1 100644 --- a/src/components/CadenceEditor/index.tsx +++ b/src/components/CadenceEditor/index.tsx @@ -1,13 +1,13 @@ -import React, { useEffect, useRef, useState } from 'react'; import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; +import React, { useEffect, useRef, useState } from 'react'; -import { useProject } from 'providers/Project/projectHooks'; import { EntityType } from 'providers/Project'; +import { useProject } from 'providers/Project/projectHooks'; import configureCadence, { CADENCE_LANGUAGE_ID } from 'util/cadence'; -import Notifications from './Notifications'; -import ControlPanel from './ControlPanel'; import { EditorContainer } from './components'; +import ControlPanel from './ControlPanel'; +import Notifications from './Notifications'; import { EditorState } from './types'; @@ -83,7 +83,6 @@ const CadenceEditor = (props: any) => { return [code, id]; }; - //@ts-ignore const setupEditor = () => { const projectExist = project && project.project.accounts; if (editor && projectExist) { @@ -128,8 +127,6 @@ const CadenceEditor = (props: any) => { } editorOnChange.current = editor.onDidChangeModelContent(() => { if (project.project?.accounts) { - // we will ignore text line, cause onChange is based on active type - // @ts-ignore project.active.onChange(editor.getValue()); } }); @@ -174,8 +171,7 @@ const CadenceEditor = (props: any) => { editor.layout(); window.addEventListener('resize', () => { - /* eslint-disable */ - editor && editor.layout(); + if (editor) editor.layout(); }); // Save editor in component state @@ -190,10 +186,9 @@ const CadenceEditor = (props: any) => { // Do it once, when CadenceEditor component is instantiated useEffect(() => { - /* eslint-disable */ initEditor().then(); // drop returned Promise as we are not going to use it return () => { - editor && destroyEditor(); + if (editor) destroyEditor(); }; }, []); diff --git a/src/components/CadenceVersion.tsx b/src/components/CadenceVersion.tsx index 6ffbe881..625bd439 100644 --- a/src/components/CadenceVersion.tsx +++ b/src/components/CadenceVersion.tsx @@ -1,5 +1,5 @@ -import React, { useState, useEffect, useContext } from 'react'; import { CadenceCheckerContext } from 'providers/CadenceChecker'; +import React, { useContext, useEffect, useState } from 'react'; import styled from 'styled-components'; import theme from '../theme'; @@ -52,7 +52,7 @@ const TwoToneWarningIcon = () => ( void }> = ({ animate={open && children ? 'open' : 'closed'} > {_example.emoji} diff --git a/src/components/ExportButton.tsx b/src/components/ExportButton.tsx index d27fe6b9..4da4b5a1 100644 --- a/src/components/ExportButton.tsx +++ b/src/components/ExportButton.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import useClipboard from 'react-use-clipboard'; -import { FaClipboard, FaClipboardCheck } from 'react-icons/fa'; import { SidebarItemExport } from 'layout/SidebarItemExport'; import { useProject } from 'providers/Project/projectHooks'; +import React from 'react'; +import { FaClipboard, FaClipboardCheck } from 'react-icons/fa'; +import useClipboard from 'react-use-clipboard'; import { generateCode } from '../util/generate-code'; import { LOCAL_PROJECT_ID } from '../util/url'; @@ -22,7 +22,7 @@ export const ExportButton = (props: ExportButtonProps) => { return project.id === LOCAL_PROJECT_ID ? null : ( {isCopied ? : } diff --git a/src/components/ExportPopup.tsx b/src/components/ExportPopup.tsx index 8be9c2db..68455026 100644 --- a/src/components/ExportPopup.tsx +++ b/src/components/ExportPopup.tsx @@ -1,13 +1,13 @@ -import React, { useState, useRef, useEffect } from 'react'; -import { useProject } from 'providers/Project/projectHooks'; import { default as FlowButton } from 'components/Button'; +import { useProject } from 'providers/Project/projectHooks'; +import React, { useEffect, useRef, useState } from 'react'; import { FullScreenContainer, PopupContainer, PopupHeader, - WhiteOverlay, SpaceBetween, + WhiteOverlay, } from 'components/Common'; import { createZip } from 'util/generator'; @@ -31,7 +31,7 @@ const ExportPopup: React.FC<{ useEffect(() => { firstInput.current.focus(); - }, [firstInput.current]); + }, []); const containerFrames = { visible: { @@ -85,7 +85,7 @@ const ExportPopup: React.FC<{ Export Project - + clear + clear ); }; diff --git a/src/containers/AppMobileWrapper.tsx b/src/containers/AppMobileWrapper.tsx index 4a81d32a..336891e8 100644 --- a/src/containers/AppMobileWrapper.tsx +++ b/src/containers/AppMobileWrapper.tsx @@ -1,6 +1,6 @@ -import React from 'react'; import styled from '@emotion/styled'; -import { Text, Box, Button } from 'theme-ui'; +import React from 'react'; +import { Box, Button, Text } from 'theme-ui'; const AppMobileWrapperDiv = styled.div` display: block; @@ -26,7 +26,7 @@ const AppMobileWrapperMessageDiv = styled.div` `; interface AppMobileWrapperProps { - children: any; + children: React.ReactNode; } const AppMobileWrapper: React.FC = ({ children }) => { diff --git a/src/containers/Editor/components.tsx b/src/containers/Editor/components.tsx index d85f2f7f..c510db00 100644 --- a/src/containers/Editor/components.tsx +++ b/src/containers/Editor/components.tsx @@ -1,46 +1,46 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { Flex, Button, Box, Divider } from 'theme-ui'; import styled from '@emotion/styled'; -import { FaShareSquare } from 'react-icons/fa'; import { motion } from 'framer-motion'; +import React, { useEffect, useRef, useState } from 'react'; +import { FaShareSquare } from 'react-icons/fa'; import useClipboard from 'react-use-clipboard'; +import { Box, Button, Divider, Flex } from 'theme-ui'; -import { Main as MainRoot } from 'layout/Main'; +import { Account, Project } from 'api/apollo/generated/graphql'; import { Editor as EditorRoot } from 'layout/Editor'; import { Heading } from 'layout/Heading'; -import { EntityType, ActiveEditor } from 'providers/Project'; -import { useProject } from 'providers/Project/projectHooks'; +import { Main as MainRoot } from 'layout/Main'; +import { ActiveEditor, EntityType } from 'providers/Project'; import { PLACEHOLDER_DESCRIPTION, PLACEHOLDER_TITLE, } from 'providers/Project/projectDefault'; -import { Account, Project } from 'api/apollo/generated/graphql'; +import { useProject } from 'providers/Project/projectHooks'; import Mixpanel from 'util/mixpanel'; import { default as FlowButton } from 'components/Button'; // import CadenceEditor from 'components/CadenceEditor'; -import TransactionBottomBar from 'components/TransactionBottomBar'; -import ScriptBottomBar from 'components/ScriptBottomBar'; -import { Version } from 'components/CadenceVersion'; -import DeploymentBottomBar from 'components/DeploymentBottomBar'; -import ResourcesBar from 'components/ResourcesBar'; -import { MdeEditor } from 'components/MdeEditor'; import { Input, InputBlock, Label, } from 'components/Arguments/SingleArgument/styles'; +import { Version } from 'components/CadenceVersion'; +import DeploymentBottomBar from 'components/DeploymentBottomBar'; import { Markdown } from 'components/Markdown'; +import { MdeEditor } from 'components/MdeEditor'; +import ResourcesBar from 'components/ResourcesBar'; +import ScriptBottomBar from 'components/ScriptBottomBar'; +import TransactionBottomBar from 'components/TransactionBottomBar'; import { - ProjectInfoContainer, ProjectDescription, ProjectHeading, + ProjectInfoContainer, ReadmeHtmlContainer, } from './layout-components'; -import { decodeText } from 'util/readme'; import CadenceEditor from 'components/CadenceEditor'; +import { decodeText } from 'util/readme'; export interface WithShowProps { show: boolean; @@ -136,40 +136,6 @@ type EditorContainerProps = { active: ActiveEditor; }; -function getActiveCode(project: Project, active: ActiveEditor): string { - switch (active.type) { - case EntityType.Account: - return project.accounts[active.index].draftCode; - case EntityType.TransactionTemplate: - return project.transactionTemplates[active.index] - ? project.transactionTemplates[active.index].script - : ''; - case EntityType.ScriptTemplate: - return project.scriptTemplates[active.index] - ? project.scriptTemplates[active.index].script - : ''; - default: - return ''; - } -} - -function getActiveId(project: Project, active: ActiveEditor): string { - switch (active.type) { - case EntityType.Account: - return project.accounts[active.index].id; - case EntityType.TransactionTemplate: - return project.transactionTemplates[active.index] - ? project.transactionTemplates[active.index].id - : ''; - case EntityType.ScriptTemplate: - return project.scriptTemplates[active.index] - ? project.scriptTemplates[active.index].id - : ''; - default: - return ''; - } -} - const usePrevious = (value: any) => { const ref = useRef(); useEffect(() => { @@ -199,7 +165,6 @@ const EditorContainer: React.FC = ({ project, active, }) => { - /* eslint-disable */ const [title, setTitle] = useState( decodeText(project.title), ); @@ -208,11 +173,6 @@ const EditorContainer: React.FC = ({ ); const [readme, setReadme] = useState(project.readme); - //@ts-ignore - const [code, setCode] = useState(''); - //@ts-ignore - const [activeId, setActiveId] = useState(null); - const projectAccess = useProject(); const [descriptionOverflow, setDescriptionOverflow] = useState( @@ -221,16 +181,12 @@ const EditorContainer: React.FC = ({ useEffect(() => { if (isLoading) { - setCode(''); setTitle(''); setDescription(''); - setActiveId(null); } else { - setCode(getActiveCode(project, active)); setTitle(title); setDescription(description); setReadme(readme); - setActiveId(getActiveId(project, active)); } }, [isLoading, active, projectAccess.project]); @@ -240,7 +196,7 @@ const EditorContainer: React.FC = ({ // it will reload language server useEffect(() => { if (previousProjectState !== undefined) { - // @ts-ignore + // @ts-expect-error TODO: add typing const previousAccounts = previousProjectState.accounts || []; const equal = compareContracts(previousAccounts, project.accounts); if (!equal) { @@ -282,12 +238,12 @@ const EditorContainer: React.FC = ({ sx={{ marginX: '1.0rem', marginY: '2.25rem', opacity: '0.3' }} /> - + ) : ( <> - + = ({ }} /> - + { const location = useLocation(); const params = getParams(location.search); useEffect(() => { - /* eslint-disable */ - params.storage && setSelectedResourceAccount(params.storage); + if (params.storage) setSelectedResourceAccount(params.storage); }, [params]); const [helmetTitle, setHelmetTitle] = useState(decodeText(project.title)); @@ -99,7 +98,7 @@ const EditorLayout: React.FC = () => { <> Flow - {helmetTitle} - +
@@ -149,31 +148,31 @@ const EditorLayout: React.FC = () => { > - + - + diff --git a/src/hooks/useKeyPress.ts b/src/hooks/useKeyPress.ts index 052efa3c..6f71c551 100644 --- a/src/hooks/useKeyPress.ts +++ b/src/hooks/useKeyPress.ts @@ -1,11 +1,10 @@ -import { useState, useEffect } from 'react'; +import { useEffect, useState } from 'react'; export default function useKeyPress(targetKey: string) { // State for keeping track of whether key is pressed const [keyPressed, setKeyPressed] = useState(false); // If pressed key is our target key then set to true - //@ts-ignore function downHandler({ key }) { if (key === targetKey) { setKeyPressed(true); @@ -13,7 +12,6 @@ export default function useKeyPress(targetKey: string) { } // If released key is our target key then set to false - //@ts-ignore const upHandler = ({ key }) => { if (key === targetKey) { setKeyPressed(false); diff --git a/src/hooks/useLanguageServer.ts b/src/hooks/useLanguageServer.ts index 917cfa77..d2fb6794 100644 --- a/src/hooks/useLanguageServer.ts +++ b/src/hooks/useLanguageServer.ts @@ -1,9 +1,9 @@ -import { useEffect, useState } from 'react'; -import { CadenceLanguageServer, Callbacks } from 'util/language-server'; -import { MonacoServices } from 'monaco-languageclient/lib/monaco-services'; import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; -import { createCadenceLanguageClient } from 'util/language-client'; +import { MonacoServices } from 'monaco-languageclient/lib/monaco-services'; import { useProject } from 'providers/Project/projectHooks'; +import { useEffect, useState } from 'react'; +import { createCadenceLanguageClient } from 'util/language-client'; +import { CadenceLanguageServer, Callbacks } from 'util/language-server'; let monacoServicesInstalled = false; @@ -33,14 +33,12 @@ const launchLanguageClient = async ( if (languageServer) { const newClient = createCadenceLanguageClient(callbacks); newClient.start(); - //@ts-ignore await newClient.onReady(); setLanguageClient(newClient); } }; export default function useLanguageServer() { - /* eslint-disable */ const project = useProject(); // Language Server Callbacks @@ -57,9 +55,9 @@ export default function useLanguageServer() { // The actual callback will be set as soon as the language client is initialized toClient: null, - //@ts-ignore - getAddressCode(address: string): string | undefined { + getAddressCode(_address: string): string | undefined { // we will set it once it is instantiated + return undefined; }, }; @@ -106,7 +104,6 @@ export default function useLanguageServer() { console.log('Installing monaco services'); if (!monacoServicesInstalled) { - //@ts-ignore MonacoServices.install(monaco); monacoServicesInstalled = true; } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 0c70e40a..9dc7925f 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,7 +1,8 @@ import React from 'react'; -/* eslint-disable */ -export default () => ( -
-

Flow Playground

-
-); +export default function Pages() { + return ( +
+

Flow Playground

+
+ ); +} diff --git a/src/providers/CadenceChecker/index.tsx b/src/providers/CadenceChecker/index.tsx index 4ba42f4d..70e14ea7 100644 --- a/src/providers/CadenceChecker/index.tsx +++ b/src/providers/CadenceChecker/index.tsx @@ -2,7 +2,7 @@ import React, { createContext } from 'react'; import useLanguageServer from '../../hooks/useLanguageServer'; export const CadenceCheckerContext: React.Context = createContext(null); -type Prop = { children: any }; +type Prop = { children: React.ReactNode }; export default function CadenceChecker(props: Prop) { // Connect project to cadence checker hook const cadenceChecker = useLanguageServer(); diff --git a/src/providers/Project/index.tsx b/src/providers/Project/index.tsx index 9aa3f458..63ca013c 100644 --- a/src/providers/Project/index.tsx +++ b/src/providers/Project/index.tsx @@ -1,11 +1,11 @@ -import React, { createContext, useState } from 'react'; import { useApolloClient, useQuery } from '@apollo/react-hooks'; -import { navigate, useLocation, Redirect } from '@reach/router'; -import ProjectMutator from './projectMutator'; +import { navigate, Redirect, useLocation } from '@reach/router'; +import React, { createContext, useState } from 'react'; import useGetProject from './projectHooks'; +import ProjectMutator from './projectMutator'; +import { Account, Project } from 'api/apollo/generated/graphql'; import { GET_ACTIVE_PROJECT } from 'api/apollo/queries'; -import { Project, Account } from 'api/apollo/generated/graphql'; import { getParams } from 'util/url'; export enum EntityType { @@ -67,11 +67,12 @@ export interface ProjectContextValue { isSavingCode: boolean; } -export const ProjectContext: React.Context = - createContext(null); +export const ProjectContext: React.Context = createContext( + null, +); interface ProjectProviderProps { - children: any; + children: React.ReactNode; urlProjectId: string | null; } @@ -79,7 +80,6 @@ export const ProjectProvider: React.FC = ({ children, urlProjectId, }) => { - /* eslint-disable */ const client = useApolloClient(); const { diff --git a/src/providers/Project/projectDefault.ts b/src/providers/Project/projectDefault.ts index d421f81f..66b0fd1e 100644 --- a/src/providers/Project/projectDefault.ts +++ b/src/providers/Project/projectDefault.ts @@ -188,8 +188,8 @@ export function createLocalProject( }; }); - const transactionTemplatesEntities: TransactionTemplate[] = - transactionTemplates.map((script, i) => { + const transactionTemplatesEntities: TransactionTemplate[] = transactionTemplates.map( + (script, i) => { const { title, code } = script; return { __typename: 'TransactionTemplate', @@ -198,7 +198,8 @@ export function createLocalProject( script: code, index: i, }; - }); + }, + ); const scriptsTemplatesEntities: ScriptTemplate[] = scriptTemplates.map( (script, i) => { diff --git a/src/util/cadence.ts b/src/util/cadence.ts index c86df177..2692a725 100644 --- a/src/util/cadence.ts +++ b/src/util/cadence.ts @@ -1,3 +1,5 @@ +/* eslint-disable */ + import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; import { languages } from 'monaco-editor/esm/vs/editor/editor.api'; import IMonarchLanguage = languages.IMonarchLanguage; @@ -5,7 +7,6 @@ import IMonarchLanguage = languages.IMonarchLanguage; export const CADENCE_LANGUAGE_ID = 'cadence'; export default function configureCadence() { - /* eslint-disable */ monaco.languages.register({ id: CADENCE_LANGUAGE_ID, extensions: ['.cdc'], @@ -114,8 +115,7 @@ export default function configureCadence() { // we include these common regular expressions symbols: /[=> { - const pattern = - /(?:transaction\s*\()(.*)(?:\).*)|(?:fun main\()(.*)(?:\).*)/g; + const pattern = /(?:transaction\s*\()(.*)(?:\).*)|(?:fun main\()(.*)(?:\).*)/g; const result = pattern.exec(template); if (result) { diff --git a/src/util/language-client.ts b/src/util/language-client.ts index 68fe773e..cd684a01 100644 --- a/src/util/language-client.ts +++ b/src/util/language-client.ts @@ -1,5 +1,11 @@ -import { CADENCE_LANGUAGE_ID } from './cadence'; -import { Callbacks } from './language-server'; +import { + CloseAction, + ConnectionCloseHandler, + createConnection, + ErrorAction, + MonacoLanguageClient, +} from 'monaco-languageclient'; +import { ConnectionErrorHandler } from 'monaco-languageclient/src/connection'; import { createMessageConnection, DataCallback, @@ -10,17 +16,8 @@ import { MessageWriter, PartialMessageInfo, } from 'vscode-jsonrpc'; -//@ts-ignore -import { ConnectionErrorHandler } from 'monaco-languageclient/src/connection'; -import { - //@ts-ignore - ConnectionCloseHandler, - CloseAction, - //@ts-ignore - createConnection, - ErrorAction, - MonacoLanguageClient, -} from 'monaco-languageclient'; +import { CADENCE_LANGUAGE_ID } from './cadence'; +import { Callbacks } from './language-server'; export function createCadenceLanguageClient(callbacks: Callbacks) { const logger: Logger = { @@ -39,7 +36,6 @@ export function createCadenceLanguageClient(callbacks: Callbacks) { }; const writer: MessageWriter = { - /* eslint-disable */ onClose(_: (_: void) => void): Disposable { return Disposable.create(() => {}); }, @@ -56,7 +52,6 @@ export function createCadenceLanguageClient(callbacks: Callbacks) { }; const reader: MessageReader = { - /* eslint-disable */ onError(_: (error: Error) => void): Disposable { return Disposable.create(() => {}); }, @@ -86,15 +81,12 @@ export function createCadenceLanguageClient(callbacks: Callbacks) { clientOptions: { documentSelector: [CADENCE_LANGUAGE_ID], errorHandler: { - //@ts-ignore error: () => ErrorAction.Continue, - //@ts-ignore closed: () => CloseAction.DoNotRestart, }, }, // Create a language client connection from the JSON-RPC connection on demand connectionProvider: { - //@ts-ignore get: ( errorHandler: ConnectionErrorHandler, closeHandler: ConnectionCloseHandler, diff --git a/src/util/normalize-interaction-response.ts b/src/util/normalize-interaction-response.ts index ea584f8a..ca81da9a 100644 --- a/src/util/normalize-interaction-response.ts +++ b/src/util/normalize-interaction-response.ts @@ -12,10 +12,7 @@ export type Line = { label?: string; }; -export const is = - (tag: Tag) => - (line: Line): Boolean => - line.tag === tag; +export const is = (tag: Tag) => (line: Line): Boolean => line.tag === tag; export const isError = is(Tag.ERROR); export const isLog = is(Tag.LOG); export const isValue = is(Tag.VALUE); diff --git a/src/util/storage.ts b/src/util/storage.ts index 8c45ebb0..3e0e28c7 100644 --- a/src/util/storage.ts +++ b/src/util/storage.ts @@ -12,7 +12,7 @@ export const getStorageData = (state: string = ''): any => { const parsed = JSON.parse(state); for (let key in parsed) { - /* eslint-disable */ + // eslint-disable-next-line no-prototype-builtins if (!parsed.hasOwnProperty(key)) { continue; } diff --git a/src/wasm_exec.js b/src/wasm_exec.js index 466f227d..14346bbd 100644 --- a/src/wasm_exec.js +++ b/src/wasm_exec.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + // Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -306,7 +308,6 @@ // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) 'runtime.wasmWrite': (sp) => { - /* eslint-disable */ sp >>>= 0; const fd = getInt64(sp + 8); const p = getInt64(sp + 16); diff --git a/tsconfig.json b/tsconfig.json index 704c44da..841872a9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "target": "es6", "module": "esnext", "jsx": "react", + "noEmit": true, "allowJs": false, "moduleResolution": "node", "allowSyntheticDefaultImports": true, diff --git a/webpack.config.js b/webpack.config.js index e0b8771c..6750260e 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -36,7 +36,12 @@ module.exports = { rules: [ { test: /\.tsx?$/, - use: 'ts-loader', + use: { + loader: 'ts-loader', + options: { + transpileOnly: true, + }, + }, exclude: /node_modules/, }, {