diff --git a/scripts/start-dev-server.ts b/scripts/start-dev-server.ts index 687d85b28..0ab40fade 100644 --- a/scripts/start-dev-server.ts +++ b/scripts/start-dev-server.ts @@ -19,7 +19,7 @@ import http from 'http'; import path from 'path'; import fs from 'fs'; import {compileMain} from './build-utils'; -const Watchman = require('../static/watchman'); +import Watchman from '../static/watchman'; const Metro = require('../static/node_modules/metro'); const MetroResolver = require('../static/node_modules/metro-resolver'); diff --git a/static/compilePlugins.ts b/static/compilePlugins.ts index be2fefaee..8843ddae9 100644 --- a/static/compilePlugins.ts +++ b/static/compilePlugins.ts @@ -16,7 +16,7 @@ import recursiveReaddir from 'recursive-readdir'; import expandTilde from 'expand-tilde'; import pMap from 'p-map'; import {homedir} from 'os'; -const Watchman = require('./watchman'); +import Watchman from './watchman'; const HOME_DIR = homedir(); @@ -87,7 +87,7 @@ async function startWatchingPluginsUsingWatchman( onPluginChanged: (plugin: PluginInfo) => void, ) { // Initializing a watchman for each folder containing plugins - const watchmanRootMap: {[key: string]: any} = {}; + const watchmanRootMap: {[key: string]: Watchman} = {}; await Promise.all( plugins.map(async plugin => { const watchmanRoot = path.resolve(plugin.rootDir, '..'); diff --git a/static/watchman.js b/static/watchman.ts similarity index 58% rename from static/watchman.js rename to static/watchman.ts index cbd9bb3d1..cce6b7b43 100644 --- a/static/watchman.js +++ b/static/watchman.ts @@ -7,37 +7,39 @@ * @format */ -const watchman = require('fb-watchman'); -const uuid = require('uuid'); -const path = require('path'); +import {Client} from 'fb-watchman'; +import uuid from 'uuid'; +import path from 'path'; -module.exports = class Watchman { - constructor(rootDir) { - this.rootDir = rootDir; - } +export default class Watchman { + constructor(private rootDir: string) {} - initialize() { + private client?: Client; + private watch?: any; + private relativeRoot?: string; + + async initialize(): Promise { if (this.client) { return; } - this.client = new watchman.Client(); + this.client = new Client(); this.client.setMaxListeners(250); - return new Promise((resolve, reject) => { - const onError = err => { - this.client.removeAllListeners('error'); + await new Promise((resolve, reject) => { + const onError = (err: Error) => { + this.client!.removeAllListeners('error'); reject(err); - this.client.end(); + this.client!.end(); delete this.client; }; - this.client.once('error', onError); - this.client.capabilityCheck( + this.client!.once('error', onError); + this.client!.capabilityCheck( {optional: [], required: ['relative_root']}, error => { if (error) { onError(error); return; } - this.client.command( + this.client!.command( ['watch-project', this.rootDir], (error, resp) => { if (error) { @@ -57,7 +59,11 @@ module.exports = class Watchman { }); } - async startWatchFiles(relativeDir, handler, options) { + async startWatchFiles( + relativeDir: string, + handler: (resp: any) => void, + options: {excludes: string[]}, + ): Promise { if (!this.watch) { throw new Error( 'Watchman is not initialized, please call "initialize" function and wait for the returned promise completion before calling "startWatchFiles".', @@ -65,7 +71,7 @@ module.exports = class Watchman { } options = Object.assign({excludes: []}, options); return new Promise((resolve, reject) => { - this.client.command(['clock', this.watch], (error, resp) => { + this.client!.command(['clock', this.watch], (error, resp) => { if (error) { return reject(error); } @@ -76,7 +82,7 @@ module.exports = class Watchman { expression: [ 'allof', ['not', ['type', 'd']], - ...options.excludes.map(e => ['not', ['match', e, 'wholename']]), + ...options!.excludes.map(e => ['not', ['match', e, 'wholename']]), ], fields: ['name'], since: clock, @@ -87,22 +93,19 @@ module.exports = class Watchman { const id = uuid.v4(); - this.client.command( - ['subscribe', this.watch, id, sub], - (error, resp) => { - if (error) { - return reject(error); + this.client!.command(['subscribe', this.watch, id, sub], error => { + if (error) { + return reject(error); + } + this.client!.on('subscription', resp => { + if (resp.subscription !== id || !resp.files) { + return; } - this.client.on('subscription', resp => { - if (resp.subscription !== id || !resp.files) { - return; - } - handler(resp); - }); - resolve(); - }, - ); + handler(resp); + }); + resolve(); + }); }); }); } -}; +}