diff --git a/packages/relay-compiler/bin/RelayCompilerMain.js b/packages/relay-compiler/bin/RelayCompilerMain.js index 16d55282e83ce..85775c210319b 100644 --- a/packages/relay-compiler/bin/RelayCompilerMain.js +++ b/packages/relay-compiler/bin/RelayCompilerMain.js @@ -185,7 +185,6 @@ Ensure that one such file exists in ${srcDir} or its parents. verbose: options.verbose, quiet: options.quiet, }); - const useWatchman = options.watchman && (await WatchmanClient.isAvailable()); const schema = getSchema(schemaPath); @@ -270,7 +269,7 @@ Ensure that one such file exists in ${srcDir} or its parents. // TODO: allow passing in a flag or detect? sourceControl: null, }); - if (!options.validate && !options.watch && options.watchman) { + if (!options.validate && !options.watch && useWatchman) { // eslint-disable-next-line no-console console.log('HINT: pass --watch to keep watching for changes.'); } diff --git a/packages/relay-compiler/core/GraphQLWatchmanClient.js b/packages/relay-compiler/core/GraphQLWatchmanClient.js index 58d0f640ba208..b3e8c2fbdc78b 100644 --- a/packages/relay-compiler/core/GraphQLWatchmanClient.js +++ b/packages/relay-compiler/core/GraphQLWatchmanClient.js @@ -11,6 +11,7 @@ 'use strict'; const watchman = require('fb-watchman'); +const childProcess = require('child_process'); const MAX_ATTEMPT_LIMIT = 5; @@ -18,12 +19,30 @@ function delay(delayMs: number): Promise { return new Promise(resolve => setTimeout(resolve, delayMs)); } +function hasWatchmanInstalled(): Promise { + return new Promise(resolve => { + const proc = childProcess.spawn('watchman', ['--version']); + proc.on('error', () => { + resolve(false); + }); + proc.on('close', code => { + if (code === 0) { + resolve(true); + } + }); + }); +} + class GraphQLWatchmanClient { _client: any; _attemptLimit: number; static isAvailable(): Promise { - return new Promise(resolve => { + return new Promise(async resolve => { + const hasWatchman = await hasWatchmanInstalled(); + if (!hasWatchman) { + return resolve(false); + } const client = new GraphQLWatchmanClient(MAX_ATTEMPT_LIMIT); client.on('error', () => { resolve(false);