diff --git a/packages/graphql-language-service-interface/src/GraphQLLanguageService.ts b/packages/graphql-language-service-interface/src/GraphQLLanguageService.ts index a2904c9f815..8221a79a9e6 100644 --- a/packages/graphql-language-service-interface/src/GraphQLLanguageService.ts +++ b/packages/graphql-language-service-interface/src/GraphQLLanguageService.ts @@ -125,6 +125,9 @@ export class GraphQLLanguageService { // schema/fragment definitions, even the project configuration. let queryHasExtensions = false; const projectConfig = this.getConfigForURI(uri); + if (!projectConfig) { + return []; + } const { schema: schemaPath, name: projectName, extensions } = projectConfig; try { @@ -208,9 +211,10 @@ export class GraphQLLanguageService { } /* eslint-enable no-implicit-coercion */ } - const schema = await this._graphQLCache - .getSchema(projectName, queryHasExtensions) - .catch(() => null); + const schema = await this._graphQLCache.getSchema( + projectName, + queryHasExtensions, + ); if (!schema) { return []; diff --git a/packages/graphql-language-service-server/src/startServer.ts b/packages/graphql-language-service-server/src/startServer.ts index 1a4016d129d..325cae2deed 100644 --- a/packages/graphql-language-service-server/src/startServer.ts +++ b/packages/graphql-language-service-server/src/startServer.ts @@ -44,10 +44,10 @@ import { import { Logger } from './Logger'; import { parseDocument } from './parseDocument'; -type Options = { - // port for the LSP server to run on +export type ServerOptions = { + // port for the LSP server to run on. required if using method socket port?: number; - // socket, streams, or node (ipc). if socket, port is required + // socket, streams, or node (ipc) method?: 'socket' | 'stream' | 'node'; // the directory where graphql-config is found configDir?: string; @@ -58,17 +58,17 @@ type Options = { config?: GraphQLConfig; parser?: typeof parseDocument; }; -('graphql-language-service-types'); /** * startServer - initialize LSP server with options * - * @param options {Options} server initialization methods + * @param options {ServerOptions} server initialization methods * @returns {Promise} */ -export default async function startServer(options: Options): Promise { +export default async function startServer( + options: ServerOptions, +): Promise { const logger = new Logger(); - if (options && options.method) { let reader; let writer; @@ -94,15 +94,14 @@ export default async function startServer(options: Options): Promise { socket.close(); process.exit(0); }); - const connection = createMessageConnection(reader, writer, logger); - addHandlers( - connection, + const serverWithHandlers = initializeHandlers({ + reader, + writer, logger, - options.configDir, - options?.extensions ?? [], - options.config, - ); - connection.listen(); + options, + }); + + serverWithHandlers.listen(); }) .listen(port); return; @@ -116,17 +115,49 @@ export default async function startServer(options: Options): Promise { writer = new IPCMessageWriter(process); break; } + + try { + const serverWithHandlers = initializeHandlers({ + reader, + writer, + logger, + options, + }); + return serverWithHandlers.listen(); + } catch (err) { + logger.error('There was a Graphql LSP handler exception:'); + logger.error(err); + } + } +} + +function initializeHandlers({ + reader, + writer, + logger, + options = {}, +}: { + reader: SocketMessageReader | StreamMessageReader | IPCMessageReader; + writer: SocketMessageWriter | StreamMessageWriter | IPCMessageWriter; + logger: Logger; + options: ServerOptions; +}): MessageConnection { + try { const connection = createMessageConnection(reader, writer, logger); addHandlers( connection, logger, options.configDir, - options?.extensions ?? [], + options?.extensions || [], options.config, options.parser, options.fileExtensions, ); - connection.listen(); + return connection; + } catch (err) { + logger.error('There was an error initializing the server connection'); + logger.error(err); + process.exit(1); } } diff --git a/packages/graphql-language-service/src/cli.ts b/packages/graphql-language-service/src/cli.ts index 3e2501628b1..dbb14569111 100644 --- a/packages/graphql-language-service/src/cli.ts +++ b/packages/graphql-language-service/src/cli.ts @@ -83,6 +83,7 @@ const { argv } = yargs 'Can be one of: stream, node, socket.\n' + 'Will default to use a node IPC channel for communication.\n', type: 'string', + default: 'node', }) .option('p', { alias: 'port', diff --git a/packages/graphql-language-service/tsconfig.json b/packages/graphql-language-service/tsconfig.json index fbcb4047799..480002d421b 100644 --- a/packages/graphql-language-service/tsconfig.json +++ b/packages/graphql-language-service/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "composite": true, "rootDir": "./src", - "outDir": "./dist" + "outDir": "./dist", + "target": "ES2017" }, "references": [ {