diff --git a/packages/codemirror-graphql/src/results/mode.ts b/packages/codemirror-graphql/src/results/mode.ts index aff296baf09..369ed8ecf83 100644 --- a/packages/codemirror-graphql/src/results/mode.ts +++ b/packages/codemirror-graphql/src/results/mode.ts @@ -9,14 +9,8 @@ import CodeMirror from 'codemirror'; -import { - list, - t, - onlineParser, - p, - State, - Token, -} from 'graphql-language-service'; +import { list, t, onlineParser, p, Token } from 'graphql-language-service'; +import indent from '../utils/mode-indent'; /** * This mode defines JSON, but provides a data-laden parser state to enable @@ -44,24 +38,6 @@ CodeMirror.defineMode('graphql-results', config => { }; }); -function indent( - this: CodeMirror.Mode & { - electricInput?: RegExp; - config?: CodeMirror.EditorConfiguration; - }, - state: State, - textAfter: string, -) { - const { levels, indentLevel } = state; - // If there is no stack of levels, use the current level. - // Otherwise, use the top level, preemptively dedenting for close braces. - const level = - !levels || levels.length === 0 - ? indentLevel - : levels.at(-1) - (this.electricInput?.test(textAfter) ? 1 : 0); - return (level || 0) * (this.config?.indentUnit || 0); -} - /** * The lexer rules. These are exactly as described by the spec. */ diff --git a/packages/codemirror-graphql/src/utils/mode-indent.ts b/packages/codemirror-graphql/src/utils/mode-indent.ts index 18f28550e52..10c417df99f 100644 --- a/packages/codemirror-graphql/src/utils/mode-indent.ts +++ b/packages/codemirror-graphql/src/utils/mode-indent.ts @@ -25,6 +25,6 @@ export default function indent( const level = !levels || levels.length === 0 ? indentLevel - : levels.at(-1) - (this.electricInput?.test(textAfter) ? 1 : 0); + : levels.at(-1)! - (this.electricInput?.test(textAfter) ? 1 : 0); return (level || 0) * (this.config?.indentUnit || 0); } diff --git a/packages/codemirror-graphql/src/variables/mode.ts b/packages/codemirror-graphql/src/variables/mode.ts index 3d278eb586d..393fa8a835c 100644 --- a/packages/codemirror-graphql/src/variables/mode.ts +++ b/packages/codemirror-graphql/src/variables/mode.ts @@ -18,6 +18,7 @@ import { State, Token, } from 'graphql-language-service'; +import indent from '../utils/mode-indent'; /** * This mode defines JSON, but provides a data-laden parser state to enable @@ -45,24 +46,6 @@ CodeMirror.defineMode('graphql-variables', config => { }; }); -function indent( - this: CodeMirror.Mode & { - electricInput?: RegExp; - config?: CodeMirror.EditorConfiguration; - }, - state: State, - textAfter: string, -) { - const { levels, indentLevel } = state; - // If there is no stack of levels, use the current level. - // Otherwise, use the top level, preemptively dedenting for close braces. - const level = - !levels || levels.length === 0 - ? indentLevel - : levels.at(-1) - (this.electricInput?.test(textAfter) ? 1 : 0); - return (level || 0) * (this.config?.indentUnit || 0); -} - /** * The lexer rules. These are exactly as described by the spec. */ diff --git a/packages/graphiql-react/src/explorer/components/doc-explorer.tsx b/packages/graphiql-react/src/explorer/components/doc-explorer.tsx index c40e619b9d3..43a1b3c803a 100644 --- a/packages/graphiql-react/src/explorer/components/doc-explorer.tsx +++ b/packages/graphiql-react/src/explorer/components/doc-explorer.tsx @@ -21,7 +21,7 @@ export function DocExplorer() { caller: DocExplorer, }); - const navItem = explorerNavStack.at(-1); + const navItem = explorerNavStack.at(-1)!; let content: ReactNode = null; if (fetchError) { @@ -55,7 +55,7 @@ export function DocExplorer() { let prevName; if (explorerNavStack.length > 1) { - prevName = explorerNavStack.at(-2).name; + prevName = explorerNavStack.at(-2)!.name; } return ( diff --git a/packages/graphiql-react/src/explorer/components/search.tsx b/packages/graphiql-react/src/explorer/components/search.tsx index 3a0c27d3d42..8876397a02e 100644 --- a/packages/graphiql-react/src/explorer/components/search.tsx +++ b/packages/graphiql-react/src/explorer/components/search.tsx @@ -58,7 +58,7 @@ export function Search() { return () => window.removeEventListener('keydown', handleKeyDown); }, []); - const navItem = explorerNavStack.at(-1); + const navItem = explorerNavStack.at(-1)!; const shouldSearchBoxAppear = explorerNavStack.length === 1 || @@ -198,7 +198,7 @@ export function useSearchResults(caller?: Function) { caller: caller || useSearchResults, }); - const navItem = explorerNavStack.at(-1); + const navItem = explorerNavStack.at(-1)!; return useCallback( (searchValue: string) => { diff --git a/packages/graphiql-react/src/explorer/context.tsx b/packages/graphiql-react/src/explorer/context.tsx index b43c4dc7f25..cf545334306 100644 --- a/packages/graphiql-react/src/explorer/context.tsx +++ b/packages/graphiql-react/src/explorer/context.tsx @@ -83,7 +83,7 @@ export function ExplorerContextProvider(props: ExplorerContextProviderProps) { const push = useCallback((item: ExplorerNavStackItem) => { setNavStack(currentState => { - const lastItem = currentState.at(-1); + const lastItem = currentState.at(-1)!; return lastItem.def === item.def ? // Avoid pushing duplicate items currentState diff --git a/packages/graphql-language-service-cli/src/client.ts b/packages/graphql-language-service-cli/src/client.ts index 09e157022a9..bde89aa6eec 100644 --- a/packages/graphql-language-service-cli/src/client.ts +++ b/packages/graphql-language-service-cli/src/client.ts @@ -56,7 +56,7 @@ export default function main( case 'autocomplete': const lines = text.split('\n'); const row = parseInt(argv.row, 10) || lines.length - 1; - const column = parseInt(argv.column, 10) || lines.at(-1).length; + const column = parseInt(argv.column, 10) || lines.at(-1)!.length; const point = new Position(row, column); exitCode = _getAutocompleteSuggestions(text, point, schemaPath); break; diff --git a/packages/graphql-language-service-server/src/MessageProcessor.ts b/packages/graphql-language-service-server/src/MessageProcessor.ts index d010827069f..54410c6e082 100644 --- a/packages/graphql-language-service-server/src/MessageProcessor.ts +++ b/packages/graphql-language-service-server/src/MessageProcessor.ts @@ -419,22 +419,16 @@ export class MessageProcessor { // with version information up-to-date, so that the textDocument contents // may be used during performing language service features, // e.g. auto-completions. - if ( - !params || - !params.textDocument || - !params.contentChanges || - !params.textDocument.uri - ) { + if (!params?.textDocument?.uri || !params.contentChanges) { throw new Error( '`textDocument`, `textDocument.uri`, and `contentChanges` arguments are required.', ); } - const { textDocument } = params; + const { textDocument, contentChanges } = params; const { uri } = textDocument; const project = this._graphQLCache.getProjectForFile(uri); try { - const { contentChanges } = params; - const contentChange = contentChanges.at(-1); + const contentChange = contentChanges.at(-1)!; // As `contentChanges` is an array, and we just want the // latest update to the text, grab the last entry from the array. diff --git a/packages/graphql-language-service-server/src/parseDocument.ts b/packages/graphql-language-service-server/src/parseDocument.ts index add652031d6..a9b809af1c7 100644 --- a/packages/graphql-language-service-server/src/parseDocument.ts +++ b/packages/graphql-language-service-server/src/parseDocument.ts @@ -68,7 +68,7 @@ export function parseDocument( const lines = query.split('\n'); const range = new Range( new Position(0, 0), - new Position(lines.length - 1, lines.at(-1).length - 1), + new Position(lines.length - 1, lines.at(-1)!.length - 1), ); return [{ query, range }]; } diff --git a/packages/graphql-language-service/src/parser/onlineParser.ts b/packages/graphql-language-service/src/parser/onlineParser.ts index 26bbfc97f93..37c9cb98458 100644 --- a/packages/graphql-language-service/src/parser/onlineParser.ts +++ b/packages/graphql-language-service/src/parser/onlineParser.ts @@ -148,7 +148,7 @@ function getToken( if ( state.indentLevel && levels.length > 0 && - levels.at(-1) < state.indentLevel + levels.at(-1)! < state.indentLevel ) { state.indentLevel = levels.at(-1); }