diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..b961a14 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ + +const rules = { +} + +module.exports = { + extends: '@chatie', + rules, +} diff --git a/examples/demo.ts b/examples/demo.ts index c1416d4..caaf6e6 100644 --- a/examples/demo.ts +++ b/examples/demo.ts @@ -33,11 +33,11 @@ const puppet = new PuppetPuppeteer() * */ puppet -.on('logout', onLogout) -.on('login', onLogin) -.on('scan', onScan) -.on('error', onError) -.on('message', onMessage) + .on('logout', onLogout) + .on('login', onLogin) + .on('scan', onScan) + .on('error', onError) + .on('message', onMessage) /** * @@ -45,11 +45,11 @@ puppet * */ puppet.start() -.catch(async e => { - console.error('Bot start() fail:', e) - await puppet.stop() - process.exit(-1) -}) + .catch(async e => { + console.error('Bot start() fail:', e) + await puppet.stop() + process.exit(-1) + }) /** * @@ -71,16 +71,16 @@ function onScan (qrcode: string, status: number) { encodeURIComponent(qrcode), ].join('') - console.log(`[${status}] ${qrcodeImageUrl}\nScan QR Code above to log in: `) + console.info(`[${status}] ${qrcodeImageUrl}\nScan QR Code above to log in: `) } function onLogin (contactId: string) { - console.log(`${contactId} login`) - puppet.messageSendText({ contactId, }, 'Wechaty login').catch(console.error) + console.info(`${contactId} login`) + puppet.messageSendText({ contactId }, 'Wechaty login').catch(console.error) } function onLogout (contactId: string) { - console.log(`${contactId} logouted`) + console.info(`${contactId} logouted`) } function onError (e: string) { @@ -100,7 +100,7 @@ function onError (e: string) { */ async function onMessage (messageId: string) { const payload = await puppet.messagePayload(messageId) - console.log(JSON.stringify(payload)) + console.info(JSON.stringify(payload)) } /** @@ -114,4 +114,4 @@ Puppet Version: ${puppet.version()} Please wait... I'm trying to login in... ` -console.log(welcome) +console.info(welcome) diff --git a/package.json b/package.json index 7b668bf..ee0fd58 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "lint": "npm run lint:es && npm run lint:ts && npm run lint:md", "lint:es": "eslint \"{bin,examples,scripts,src,tests}/**/*.js\" --ignore-pattern=\"tests/fixtures/**\"", "lint:md": "markdownlint README.md", - "lint:ts": "tslint --project tsconfig.json && tsc --noEmit", + "lint:ts": "eslint '{bin,examples,scripts,src,tests}/**/*.ts' --ignore-pattern=tests/fixtures && tsc --noEmit", "start": "ts-node examples/demo.ts", "test": "npm run lint && npm run test:unit:retry", "test:pack": "bash -x scripts/npm-pack-testing.sh", @@ -44,11 +44,9 @@ "@chatie/semver": "^0.4.7", "@chatie/tsconfig": "^0.6.1", "@types/bl": "^2.1.0", - "@types/blue-tape": "^0.1.31", "@types/lru-cache": "^5.1.0", "@types/md5": "^2.1.32", "@types/mime": "^2.0.0", - "@types/node": "^12.0.0", "@types/normalize-package-data": "^2.4.0", "@types/promise-retry": "^1.1.2", "@types/puppeteer": "^1.11.1", @@ -57,32 +55,16 @@ "@types/read-pkg-up": "^3.0.1", "@types/request": "^2.47.1", "@types/retry": "0.12.0", - "@types/semver": "^6.0.0", - "@types/sinon": "^7.0.2", "@types/xml2js": "^0.4.3", "ajv": "^6.5.2", "babel-eslint": "^10.0.0", - "blue-tape": "^1.0.0", - "eslint": "^5.0.1", - "eslint-config-standard": "^12.0.0", - "eslint-plugin-import": "^2.13.0", - "eslint-plugin-node": "^9.1.0", - "eslint-plugin-promise": "^4.0.0", - "eslint-plugin-standard": "^4.0.0", "file-box": "^0.8.24", - "git-scripts": "^0.2.1", "markdownlint-cli": "^0.17.0", "memory-card": "^0.6.2", "normalize-package-data": "^2.4.0", "pkg-jq": "^0.2.2", "pkg-up": "^3.1.0", - "semver": "^6.0.0", "shx": "^0.3.1", - "sinon": "^7.2.2", - "ts-node": "^8.0.2", - "tslint": "^5.11.0", - "tslint-config-standard": "^8.0.0", - "typescript": "^3.0.1", "wechaty-puppet": "^0.15.12" }, "peerDependencies": { @@ -91,6 +73,7 @@ }, "homepage": "https://github.com/Chatie/wechaty-puppet-puppeteer#readme", "dependencies": { + "@chatie/eslint-config": "^0.6.10", "@chatie/git-scripts": "^0.2.4", "bl": "^3.0.0", "brolog": "^1.6.5", @@ -106,6 +89,7 @@ "rx-queue": "^0.8.1", "rxjs": "^6.2.1", "state-switch": "^0.6.2", + "tstest": "^0.4.2", "watchdog": "^0.8.15", "xml2js": "^0.4.19" }, diff --git a/scripts/retry-unit-tests.ts b/scripts/retry-unit-tests.ts index ba9fa48..9a33019 100755 --- a/scripts/retry-unit-tests.ts +++ b/scripts/retry-unit-tests.ts @@ -14,15 +14,15 @@ import { spawn } from 'child_process' const MAX_RETRY_NUM = 3 async function main (): Promise { - console.log('Safe Test: starting...') + console.info('Safe Test: starting...') let round = 0 let succ = false do { - console.log(`Safe Test: running for round #${round}`) + console.info(`Safe Test: running for round #${round}`) succ = await unitTest() if (succ) { // success! - console.log(`Safe Test: successed at round #${round}!`) + console.info(`Safe Test: successed at round #${round}!`) return 0 } } while (round++ < MAX_RETRY_NUM) @@ -50,8 +50,8 @@ async function unitTest () { } main() -.then(process.exit) -.catch((e) => { - console.error(e) - process.exit(1) -}) + .then(process.exit) + .catch((e) => { + console.error(e) + process.exit(1) + }) diff --git a/src/bridge.spec.ts b/src/bridge.spec.ts index 69afe5b..89ba5fd 100755 --- a/src/bridge.spec.ts +++ b/src/bridge.spec.ts @@ -63,6 +63,7 @@ test('PuppetPuppeteerBridge', async (t) => { } }) +/* eslint indent: off */ test('preHtmlToXml()', async (t) => { const BLOCKED_HTML_ZH = [ '
',
@@ -204,6 +205,7 @@ test('WechatyBro.ding()', async t => {
     t.pass('should init Bridge')
 
     const retDing = await bridge.evaluate(() => {
+      // eslint-disable-next-line
       return WechatyBro.ding()
     }) as string
 
diff --git a/src/bridge.ts b/src/bridge.ts
index ff93ecf..205ca1e 100644
--- a/src/bridge.ts
+++ b/src/bridge.ts
@@ -67,6 +67,7 @@ export interface BridgeOptions {
 }
 
 export class Bridge extends EventEmitter {
+
   private browser : undefined | Browser
   private page    : undefined | Page
   private state   : StateSwitch
@@ -119,7 +120,7 @@ export class Bridge extends EventEmitter {
   public async initBrowser (): Promise {
     log.verbose('PuppetPuppeteerBridge', 'initBrowser()')
 
-    const headless = this.options.head ? false : true
+    const headless = !(this.options.head)
     const browser = await launch({
       args: [
         '--audio-output-channels=0',
@@ -144,7 +145,7 @@ export class Bridge extends EventEmitter {
 
   public async onDialog (dialog: Dialog) {
     log.warn('PuppetPuppeteerBridge', 'onDialog() page.on(dialog) type:%s message:%s',
-                                dialog.type, dialog.message())
+      dialog.type, dialog.message())
     try {
       // XXX: Which ONE is better?
       await dialog.accept()
@@ -253,14 +254,14 @@ export class Bridge extends EventEmitter {
 
     try {
       const sourceCode = fs.readFileSync(WECHATY_BRO_JS_FILE)
-                            .toString()
+        .toString()
 
       let retObj = await page.evaluate(sourceCode) as InjectResult
 
       if (retObj && /^(2|3)/.test(retObj.code.toString())) {
         // HTTP Code 2XX & 3XX
         log.silly('PuppetPuppeteerBridge', 'inject() eval(Wechaty) return code[%d] message[%s]',
-                                      retObj.code, retObj.message)
+          retObj.code, retObj.message)
       } else {  // HTTP Code 4XX & 5XX
         throw new Error('execute injectio error: ' + retObj.code + ', ' + retObj.message)
       }
@@ -269,7 +270,7 @@ export class Bridge extends EventEmitter {
       if (retObj && /^(2|3)/.test(retObj.code.toString())) {
         // HTTP Code 2XX & 3XX
         log.silly('PuppetPuppeteerBridge', 'inject() Wechaty.init() return code[%d] message[%s]',
-                                      retObj.code, retObj.message)
+          retObj.code, retObj.message)
       } else {  // HTTP Code 4XX & 5XX
         throw new Error('execute proxyWechaty(init) error: ' + retObj.code + ', ' + retObj.message)
       }
@@ -553,9 +554,9 @@ export class Bridge extends EventEmitter {
     try {
       return await retry(async (retryException, attempt) => {
         log.silly('PuppetPuppeteerBridge', 'getMessage(%s) retry attempt %d',
-                                          id,
-                                          attempt,
-                  )
+          id,
+          attempt,
+        )
         try {
           const rawPayload = await this.proxyWechaty('getMessage', id)
 
@@ -579,9 +580,9 @@ export class Bridge extends EventEmitter {
     try {
       return await retry(async (retryException, attempt) => {
         log.silly('PuppetPuppeteerBridge', 'getContact(%s) retry attempt %d',
-                                          id,
-                                          attempt,
-                  )
+          id,
+          attempt,
+        )
         try {
           const rawPayload = await this.proxyWechaty('getContact', id)
 
@@ -599,7 +600,6 @@ export class Bridge extends EventEmitter {
       log.error('PuppetPuppeteerBridge', 'promiseRetry() getContact() finally FAIL: %s', e.message)
       throw e
     }
-    /////////////////////////////////
   }
 
   public async getBaseRequest (): Promise {
@@ -688,11 +688,11 @@ export class Bridge extends EventEmitter {
     ...args     : any[]
   ): Promise {
     log.silly('PuppetPuppeteerBridge', 'proxyWechaty(%s%s)',
-                                        wechatyFunc,
-                                        args.length === 0
-                                          ? ''
-                                          : ', ' + args.join(', '),
-              )
+      wechatyFunc,
+      args.length === 0
+        ? ''
+        : ', ' + args.join(', '),
+    )
 
     if (!this.page) {
       throw new Error('no page')
@@ -745,13 +745,13 @@ export class Bridge extends EventEmitter {
     log.verbose('PuppetPuppeteerBridge', 'ding(%s)', data || '')
 
     this.proxyWechaty('ding', data)
-    .then(dongData => {
-      this.emit('dong', dongData)
-    })
-    .catch(e => {
-      log.error('PuppetPuppeteerBridge', 'ding(%s) exception: %s', data, e.message)
-      this.emit('error', e)
-    })
+      .then(dongData => {
+        this.emit('dong', dongData)
+      })
+      .catch(e => {
+        log.error('PuppetPuppeteerBridge', 'ding(%s) exception: %s', data, e.message)
+        this.emit('error', e)
+      })
   }
 
   public preHtmlToXml (text: string): string {
@@ -785,7 +785,7 @@ export class Bridge extends EventEmitter {
 
     const textSnip = text.substr(0, 50).replace(/\n/, '')
     log.verbose('PuppetPuppeteerBridge', 'testBlockedMessage(%s)',
-                                  textSnip)
+      textSnip)
 
     interface BlockedMessage {
       error?: {
@@ -903,8 +903,8 @@ export class Bridge extends EventEmitter {
     // TODO: use page.$x() (with puppeteer v1.1 or above) to replace DIY version of listXpath() instead.
     // See: https://github.com/GoogleChrome/puppeteer/blob/v1.1.0/docs/api.md#pagexexpression
 
-    const XPATH_SELECTOR =
-      `//div[contains(@class,'association') and contains(@class,'show')]/a[@ng-click='qrcodeLogin()']`
+    const XPATH_SELECTOR
+      = `//div[contains(@class,'association') and contains(@class,'show')]/a[@ng-click='qrcodeLogin()']`
 
     try {
       // const [button] = await listXpath(page, XPATH_SELECTOR)
@@ -958,7 +958,7 @@ export class Bridge extends EventEmitter {
         log.error('PuppetPuppeteerBridge', 'cookies(%s) reject: %s', cookieList, e)
         this.emit('error', e)
       }
-      return
+      // RETURN
     } else {
       // FIXME: puppeteer typing bug
       cookieList = await this.page.cookies() as any as Cookie[]
@@ -1015,7 +1015,6 @@ export class Bridge extends EventEmitter {
     }
 
     await this.page.reload()
-    return
   }
 
   public async evaluate (fn: () => any, ...args: any[]): Promise {
@@ -1033,6 +1032,7 @@ export class Bridge extends EventEmitter {
       return null
     }
   }
+
 }
 
 export {
diff --git a/src/config.ts b/src/config.ts
index b9d5894..9d619a7 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -1,8 +1,5 @@
-// tslint:disable:no-reference
-
 /// 
 
-import promiseRetry = require('promise-retry')
 import { OperationOptions } from 'retry'
 
 import {
@@ -14,7 +11,7 @@ import qrImage      from 'qr-image'
 
 import { VERSION } from './version'
 
-// export const log = new Brolog()
+import promiseRetry = require('promise-retry')
 
 export async function retry (
   retryableFn: (
diff --git a/src/firer.spec.ts b/src/firer.spec.ts
index fa23d85..eba4beb 100755
--- a/src/firer.spec.ts
+++ b/src/firer.spec.ts
@@ -197,7 +197,7 @@ test('parseRoomTopic()', async (t) => {
   contentList.forEach(([content, changer, topic]) => {
     result = (firer as any).parseRoomTopic(content)
     t.ok(result, 'should check topic right for content: ' + content)
-    t.is(topic  , result[0], 'should get right topic')
+    t.is(topic,   result[0], 'should get right topic')
     t.is(changer, result[1], 'should get right changer')
   })
 
diff --git a/src/firer.ts b/src/firer.ts
index 20c5edb..6a2cca8 100644
--- a/src/firer.ts
+++ b/src/firer.ts
@@ -99,6 +99,7 @@ const REGEX_CONFIG = {
 }
 
 export class Firer {
+
   constructor (
     public puppet: PuppetPuppeteer,
   ) {
@@ -183,9 +184,9 @@ export class Firer {
       return false // not a room join message
     }
     log.silly('PuppetPuppeteerFirer', 'checkRoomJoin() inviteeList: %s, inviter: %s',
-                                      inviteeNameList.join(','),
-                                      inviterName,
-              )
+      inviteeNameList.join(','),
+      inviterName,
+    )
 
     /**
      * Convert the display name to Contact ID
@@ -207,7 +208,7 @@ export class Firer {
       log.silly('PuppetPuppeteerFirer', 'fireRoomJoin() retry() ttl %d', ttl)
 
       if (!ready) {
-        await new Promise(r => setTimeout(r, timeout))
+        await new Promise(resolve => setTimeout(resolve, timeout))
         ready = true
       }
 
@@ -228,9 +229,9 @@ export class Firer {
             await this.puppet.contactPayload(inviteeContactId)
           } catch (e) {
             log.warn('PuppetPuppeteerFirer', 'fireRoomJoin() contactPayload(%s) exception: %s',
-                                              inviteeContactId,
-                                              e.message,
-                    )
+              inviteeContactId,
+              e.message,
+            )
             ready = false
           }
         } else {
@@ -270,9 +271,9 @@ export class Firer {
 
       if (ready) {
         log.silly('PuppetPuppeteerFirer', 'fireRoomJoin() resolve() inviteeContactIdList: %s, inviterContactId: %s',
-                                            inviteeContactIdList.join(','),
-                                            inviterContactId,
-                  )
+          inviteeContactIdList.join(','),
+          inviterContactId,
+        )
         /**
          * Resolve All Payload again to make sure the data is ready.
          */
@@ -354,7 +355,7 @@ export class Firer {
      *                  it will be 2 sys message, instead of 1 sys message contains 2 leavers.
      * @huan 2018 May: we need to generilize the pattern for future usage.
      */
-    this.puppet.emit('room-leave', roomId , [leaverContactId], removerContactId)
+    this.puppet.emit('room-leave', roomId, [leaverContactId], removerContactId)
 
     setTimeout(async () => {
       await this.puppet.roomPayloadDirty(roomId)
@@ -394,7 +395,7 @@ export class Firer {
     }
 
     try {
-      this.puppet.emit('room-topic', roomId , topic, oldTopic, changerContactId)
+      this.puppet.emit('room-topic', roomId, topic, oldTopic, changerContactId)
       return true
     } catch (e) {
       log.error('PuppetPuppeteerFirer', 'fireRoomTopic() co exception: %s', e.stack)
diff --git a/src/index.ts b/src/index.ts
index 485df53..2f1e69f 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -16,13 +16,13 @@
  *   limitations under the License.
  *
  */
+import { PuppetPuppeteer }  from './puppet-puppeteer'
+
 export {
   VERSION,
   log,
 }              from './config'
 
-import { PuppetPuppeteer }  from './puppet-puppeteer'
-
 export {
   PuppetPuppeteer,
 }
diff --git a/src/puppet-puppeteer.spec.ts b/src/puppet-puppeteer.spec.ts
index b87e622..92ef794 100755
--- a/src/puppet-puppeteer.spec.ts
+++ b/src/puppet-puppeteer.spec.ts
@@ -22,9 +22,7 @@
 // tslint:disable:only-arrow-functions
 // tslint:disable:arrow-parens
 
-import test  from 'blue-tape'
-import sinon from 'sinon'
-// const sinonTest   = require('sinon-test')(sinon, {
+import { test, sinon } from 'tstest'// const sinonTest   = require('sinon-test')(sinon, {
 //   useFakeTimers: {  // https://github.com/sinonjs/lolex
 //     advanceTimeDelta  : 10,
 //     shouldAdvanceTime : true,
@@ -39,6 +37,7 @@ import { Event }            from './event'
 import { PuppetPuppeteer }  from './puppet-puppeteer'
 
 class PuppetTest extends PuppetPuppeteer {
+
   public contactRawPayload (id: string) {
     return super.contactRawPayload(id)
   }
@@ -86,10 +85,10 @@ test('login/logout events', async t => {
 
     await puppet.start()
     t.pass('should be inited')
-    t.is(puppet.logonoff() , false  , 'should be not logined')
+    t.is(puppet.logonoff(), false, 'should be not logined')
 
-    const future = new Promise(r => puppet.once('login', r))
-                        .catch(e => t.fail(e))
+    const future = new Promise(resolve => puppet.once('login', resolve))
+      .catch(e => t.fail(e))
     puppet.bridge.emit('login', 'TestPuppetPuppeteer')
     await future
 
diff --git a/src/puppet-puppeteer.ts b/src/puppet-puppeteer.ts
index e4007c5..89c0011 100644
--- a/src/puppet-puppeteer.ts
+++ b/src/puppet-puppeteer.ts
@@ -24,10 +24,10 @@
 import path    from 'path'
 import nodeUrl from 'url'
 
-import bl       from 'bl'
-import md5      from 'md5'
-import mime     from 'mime'
-import request  from 'request'
+import BufferList from 'bl'
+import md5        from 'md5'
+import mime       from 'mime'
+import request    from 'request'
 
 import {
   FileBox,
@@ -104,6 +104,7 @@ import {
 export type ScanFoodType   = 'scan' | 'login' | 'logout'
 
 export class PuppetPuppeteer extends Puppet {
+
   public static readonly VERSION = VERSION
 
   public bridge: Bridge
@@ -227,7 +228,8 @@ export class PuppetPuppeteer extends Puppet {
 
     dog.on('reset', async (food, timePast) => {
       log.warn('PuppetPuppeteer', 'initScanWatchdog() on(reset) lastFood: %s, timePast: %s',
-                            food.data, timePast)
+        food.data, timePast
+      )
       try {
         await this.bridge.reload()
       } catch (e) {
@@ -289,17 +291,17 @@ export class PuppetPuppeteer extends Puppet {
       throw e
     }
 
-    this.bridge.on('dong'     , data => this.emit('dong', data))
+    this.bridge.on('dong',      data => this.emit('dong', data))
     // this.bridge.on('ding'     , Event.onDing.bind(this))
     this.bridge.on('heartbeat', data => this.emit('watchdog', { type: 'bridge ding', data }))
 
-    this.bridge.on('error'    , e => this.emit('error', e))
-    this.bridge.on('log'      , Event.onLog.bind(this))
-    this.bridge.on('login'    , Event.onLogin.bind(this))
-    this.bridge.on('logout'   , Event.onLogout.bind(this))
-    this.bridge.on('message'  , Event.onMessage.bind(this))
-    this.bridge.on('scan'     , Event.onScan.bind(this))
-    this.bridge.on('unload'   , Event.onUnload.bind(this))
+    this.bridge.on('error',     e => this.emit('error', e))
+    this.bridge.on('log',       Event.onLog.bind(this))
+    this.bridge.on('login',     Event.onLogin.bind(this))
+    this.bridge.on('logout',    Event.onLogout.bind(this))
+    this.bridge.on('message',   Event.onMessage.bind(this))
+    this.bridge.on('scan',      Event.onScan.bind(this))
+    this.bridge.on('unload',    Event.onUnload.bind(this))
 
     try {
       await this.bridge.start()
@@ -352,7 +354,7 @@ export class PuppetPuppeteer extends Puppet {
 
     // use http instead of https, because https will only success on the very first request!
     url = url.replace(/^https/i, 'http')
-    const parsedUrl = nodeUrl.parse(url)
+    const parsedUrl = new nodeUrl.URL(url)
 
     const msgFileName = messageFilename(rawPayload)
 
@@ -414,9 +416,9 @@ export class PuppetPuppeteer extends Puppet {
   ): Promise {
 
     log.silly('PuppetPuppeteer', 'forward(receiver=%s, messageId=%s)',
-                                  receiver,
-                                  messageId,
-              )
+      receiver,
+      messageId,
+    )
 
     let rawPayload = await this.messageRawPayload(messageId)
 
@@ -453,16 +455,16 @@ export class PuppetPuppeteer extends Puppet {
     // causing self () to determine the error
     newMsg.Content      = unescapeHtml(
       rawPayload.Content.replace(/^@\w+:/, '')
-    ).replace(/^[\w\-]+:/, '')
-    newMsg.MMIsChatRoom = receiver.roomId ? true : false
+    ).replace(/^[\w-]+:/, '')
+    newMsg.MMIsChatRoom = !!(receiver.roomId)
 
     // The following parameters need to be overridden after calling createMessage()
 
     rawPayload = Object.assign(rawPayload, newMsg)
     // for (let i = 0; i < sendToList.length; i++) {
-      // newMsg.ToUserName = sendToList[i].id
-      // // all call success return true
-      // ret = (i === 0 ? true : ret) && await config.puppetInstance().forward(m, newMsg)
+    // newMsg.ToUserName = sendToList[i].id
+    // // all call success return true
+    // ret = (i === 0 ? true : ret) && await config.puppetInstance().forward(m, newMsg)
     // }
     newMsg.ToUserName = receiver.contactId || receiver.roomId as string
     // ret = await config.puppetInstance().forward(m, newMsg)
@@ -498,9 +500,9 @@ export class PuppetPuppeteer extends Puppet {
     }
 
     log.silly('PuppetPuppeteer', 'messageSendText() destination: %s, text: %s)',
-                                  destinationId,
-                                  text,
-              )
+      destinationId,
+      text,
+    )
 
     try {
       await this.bridge.send(destinationId, text)
@@ -576,12 +578,12 @@ export class PuppetPuppeteer extends Puppet {
     rawPayload: WebContactRawPayload,
   ): Promise {
     log.silly('PuppetPuppeteer', 'contactParseRawPayload(Object.keys(payload).length=%d)',
-                                    Object.keys(rawPayload).length,
-                )
+      Object.keys(rawPayload).length,
+    )
     if (!Object.keys(rawPayload).length) {
       log.error('PuppetPuppeteer', 'contactParseRawPayload(Object.keys(payload).length=%d)',
-                                    Object.keys(rawPayload).length,
-                )
+        Object.keys(rawPayload).length,
+      )
       log.error('PuppetPuppeteer', 'contactParseRawPayload() got empty rawPayload!')
       throw new Error('empty raw payload')
       // return {
@@ -598,8 +600,8 @@ export class PuppetPuppeteer extends Puppet {
     return {
       avatar:     rawPayload.HeadImgUrl,
       friend:     rawPayload.stranger === undefined
-                    ? undefined
-                    : !rawPayload.stranger, // assign by injectio.js
+        ? undefined
+        : !rawPayload.stranger, // assign by injectio.js
       star:       !!rawPayload.StarFriend,
 
       address:    rawPayload.Alias, // XXX: need a stable address for user
@@ -621,8 +623,8 @@ export class PuppetPuppeteer extends Puppet {
        */
       // tslint:disable-next-line
       type:      (!!rawPayload.UserName && !rawPayload.UserName.startsWith('@@') && !!(rawPayload.VerifyFlag & 8))
-                    ? ContactType.Official
-                    : ContactType.Personal,
+        ? ContactType.Official
+        : ContactType.Personal,
 
     }
   }
@@ -699,8 +701,8 @@ export class PuppetPuppeteer extends Puppet {
       const ret = await this.bridge.contactAlias(contactId, alias)
       if (!ret) {
         log.warn('PuppetPuppeteer', 'contactRemark(%s, %s) bridge.contactAlias() return false',
-                              contactId, alias,
-                            )
+          contactId, alias,
+        )
         throw new Error('bridge.contactAlias fail')
       }
     } catch (e) {
@@ -740,10 +742,11 @@ export class PuppetPuppeteer extends Puppet {
         rawPayload = await this.bridge.getContact(id) as undefined | WebRoomRawPayload
 
         if (rawPayload) {
-          const currLength = rawPayload.MemberList && rawPayload.MemberList.length || 0
+          const currLength = (rawPayload.MemberList && rawPayload.MemberList.length) || 0
 
-          log.silly('PuppetPuppeteer', `roomPayload() this.bridge.getContact(%s) `
-                                        + `MemberList.length:(prev:%d, curr:%d) at ttl:%d`,
+          log.silly('PuppetPuppeteer',
+            `roomPayload() this.bridge.getContact(%s) `
+              + `MemberList.length:(prev:%d, curr:%d) at ttl:%d`,
             id,
             prevLength,
             currLength,
@@ -752,24 +755,24 @@ export class PuppetPuppeteer extends Puppet {
 
           if (prevLength === currLength) {
             log.silly('PuppetPuppeteer', `roomPayload() puppet.getContact(%s) done at ttl:%d with length:%d`,
-                                          this.id,
-                                          ttl,
-                                          currLength,
-                      )
+              this.id,
+              ttl,
+              currLength,
+            )
             return rawPayload
           }
           if (currLength >= prevLength) {
             prevLength = currLength
           } else {
             log.warn('PuppetPuppeteer', 'roomRawPayload() currLength(%d) <= prevLength(%d) ???',
-                                        currLength,
-                                        prevLength,
-                    )
+              currLength,
+              prevLength,
+            )
           }
         }
 
         log.silly('PuppetPuppeteer', `roomPayload() puppet.getContact(${id}) retry at ttl:%d`, ttl)
-        await new Promise(r => setTimeout(r, 1000)) // wait for 1 second
+        await new Promise(resolve => setTimeout(resolve, 1000)) // wait for 1 second
       }
 
       throw new Error('no payload')
@@ -817,8 +820,8 @@ export class PuppetPuppeteer extends Puppet {
     // }
 
     const memberIdList = rawPayload.MemberList
-                          ? rawPayload.MemberList.map(m => m.UserName)
-                          : []
+      ? rawPayload.MemberList.map(m => m.UserName)
+      : []
 
     const roomPayload: RoomPayload = {
       id,
@@ -917,7 +920,7 @@ export class PuppetPuppeteer extends Puppet {
   public async roomAnnounce (roomId: string, text: string)  : Promise
 
   public async roomAnnounce (roomId: string, text?: string) : Promise {
-    log.warn('PuppetPuppeteer', 'roomAnnounce(%s, %s) not supported', roomId, text ? text : '')
+    log.warn('PuppetPuppeteer', 'roomAnnounce(%s, %s) not supported', roomId, text || '')
 
     if (text) {
       return
@@ -938,7 +941,7 @@ export class PuppetPuppeteer extends Puppet {
     const rawPayload = await this.roomRawPayload(roomId)
 
     const memberIdList = (rawPayload.MemberList || [])
-                        .map(member => member.UserName)
+      .map(member => member.UserName)
 
     return memberIdList
   }
@@ -1044,10 +1047,10 @@ export class PuppetPuppeteer extends Puppet {
       await this.bridge.verifyUserRequest(contactId, hello)
     } catch (e) {
       log.warn('PuppetPuppeteer', 'friendshipAdd() bridge.verifyUserRequest(%s, %s) rejected: %s',
-                                  contactId,
-                                  hello,
-                                  e.message,
-              )
+        contactId,
+        hello,
+        e.message,
+      )
       throw e
     }
   }
@@ -1061,10 +1064,10 @@ export class PuppetPuppeteer extends Puppet {
       await this.bridge.verifyUserOk(payload.contactId, payload.ticket)
     } catch (e) {
       log.warn('PuppetPuppeteer', 'bridge.verifyUserOk(%s, %s) rejected: %s',
-                                  payload.contactId,
-                                  payload.ticket,
-                                  e.message,
-              )
+        payload.contactId,
+        payload.ticket,
+        e.message,
+      )
       throw e
     }
   }
@@ -1074,7 +1077,6 @@ export class PuppetPuppeteer extends Puppet {
    * For issue #668
    */
   public async waitStable (): Promise {
-    log.level('silly')
     log.verbose('PuppetPuppeteer', 'readyStable()')
 
     let maxNum  = 0
@@ -1103,8 +1105,8 @@ export class PuppetPuppeteer extends Puppet {
       }
 
       log.silly('PuppetPuppeteer', 'readyStable() while() curNum=%s, maxNum=%s, unchangedNum=%s',
-      curNum, maxNum, unchangedNum,
-    )
+        curNum, maxNum, unchangedNum,
+      )
 
     }
 
@@ -1285,7 +1287,7 @@ export class PuppetPuppeteer extends Puppet {
     }
 
     const buffer = await new Promise((resolve, reject) => {
-      file.pipe(new bl((err: Error, data: Buffer) => {
+      file.pipe(new BufferList((err: Error, data: Buffer) => {
         if (err) reject(err)
         else resolve(data)
       }))
@@ -1394,7 +1396,7 @@ export class PuppetPuppeteer extends Puppet {
                 if (typeof obj !== 'object' || obj.BaseResponse.Ret !== 0) {
                   const errMsg = obj.BaseResponse || 'api return err'
                   log.silly('PuppetPuppeteer', 'uploadMedia() checkUpload err:%s \nreq:%s\nret:%s',
-                                                JSON.stringify(errMsg), JSON.stringify(r), body)
+                    JSON.stringify(errMsg), JSON.stringify(r), body)
                   reject(new Error('chackUpload err:' + JSON.stringify(errMsg)))
                 }
                 resolve({
@@ -1484,9 +1486,9 @@ export class PuppetPuppeteer extends Puppet {
     file     : FileBox,
   ): Promise {
     log.verbose('PuppetPuppeteer', 'messageSendFile(receiver=%s, file=%s)',
-                                    JSON.stringify(receiver),
-                                    file.toString(),
-                )
+      JSON.stringify(receiver),
+      file.toString(),
+    )
 
     let destinationId
 
@@ -1575,6 +1577,7 @@ export class PuppetPuppeteer extends Puppet {
 
     // TODO: unref() the puppeteer
   }
+
 }
 
 export default PuppetPuppeteer
diff --git a/src/pure-function-helpers/xml.ts b/src/pure-function-helpers/xml.ts
index 08a452e..3391c45 100644
--- a/src/pure-function-helpers/xml.ts
+++ b/src/pure-function-helpers/xml.ts
@@ -10,11 +10,11 @@ export function unescapeHtml (str?: string): string {
     return ''
   }
   return str
-  .replace(/'/g, "'")
-  .replace(/"/g, '"')
-  .replace(/>/g, '>')
-  .replace(/</g, '<')
-  .replace(/&/g, '&')
+    .replace(/'/g, "'")
+    .replace(/"/g, '"')
+    .replace(/>/g, '>')
+    .replace(/</g, '<')
+    .replace(/&/g, '&')
 }
 
 export function digestEmoji (html?: string): string {
@@ -22,12 +22,12 @@ export function digestEmoji (html?: string): string {
     return ''
   }
   return html
-        .replace(/]+>/g,
-                 '$3',
-               ) // 
-        .replace(/<\/span>/g,
-                 '[$2]',
-               ) // ''
+    .replace(/]+>/g,
+      '$3',
+    ) // 
+    .replace(/<\/span>/g,
+      '[$2]',
+    ) // ''
 }
 
 /**
@@ -42,12 +42,12 @@ export function unifyEmoji (html?: string): string {
     return ''
   }
   return html
-        .replace(/]+>/g,
-                 '',
-               ) // 
-        .replace(/<\/span>/g,
-                 '',
-               ) // ''
+    .replace(/]+>/g,
+      '',
+    ) // 
+    .replace(/<\/span>/g,
+      '',
+    ) // ''
 }
 
 export function stripEmoji (html?: string): string {
@@ -55,12 +55,12 @@ export function stripEmoji (html?: string): string {
     return ''
   }
   return html
-        .replace(/]+>/g,
-                 '',
-               ) // 
-        .replace(/<\/span>/g,
-                 '',
-               ) // ''
+    .replace(/]+>/g,
+      '',
+    ) // 
+    .replace(/<\/span>/g,
+      '',
+    ) // ''
 }
 
 export function plainText (html?: string): string {
diff --git a/src/wechaty-bro.js b/src/wechaty-bro.js
index 383a1f7..7899396 100644
--- a/src/wechaty-bro.js
+++ b/src/wechaty-bro.js
@@ -38,6 +38,7 @@
  * read more about this in puppet-web-bridge.ts
  */
 
+/* eslint no-undef: off */
 (function () {
   function init () {
     if (!angularIsReady()) {
@@ -131,7 +132,7 @@
     var rootScope   = injector.get('$rootScope')
     var loginScope  = angular.element('[ng-controller="loginController"]').scope()
 
-/*
+    /*
     // method 1
     appFactory.syncOrig = appFactory.sync
     appFactory.syncCheckOrig = appFactory.syncCheck
@@ -563,8 +564,8 @@
     }
     var accountFactory = WechatyBro.glue.accountFactory
     return accountFactory
-            ? accountFactory.getUserName()
-            : null
+      ? accountFactory.getUserName()
+      : null
   }
 
   function contactList () {
@@ -579,8 +580,8 @@
       attempt = attempt || 0
 
       var contactIdList = contactFactory
-                          .getAllFriendContact()
-                          .map(c => c.UserName)
+        .getAllFriendContact()
+        .map(c => c.UserName)
 
       if (contactIdList && contactIdList.length) {
         done(contactIdList)
@@ -621,15 +622,15 @@
           count   : 3,
           timeout : 1e4,
           serial  : !0,
-        }
-      })
-      .success(() => {
-        contact.RemarkName = remark
-        return resolve(true)
-      })
-      .error(() => {
-        return resolve(false)  // TODO: use reject???
+        },
       })
+        .success(() => {
+          contact.RemarkName = remark
+          return resolve(true)
+        })
+        .error(() => {
+          return resolve(false)  // TODO: use reject???
+        })
     })
   }
 
@@ -645,8 +646,8 @@
     // }
     // log(match.toString())
     return contactFactory.getAllChatroomContact()
-                        //  .filter(r => match(r.NickName))
-                         .map(r => r.UserName)
+      //  .filter(r => match(r.NickName))
+      .map(r => r.UserName)
   }
 
   function roomDelMember (ChatRoomName, UserName) {
@@ -668,7 +669,7 @@
         return resolve(0)
       }, 10 * 1000)
 
-      chatroomFactory.addMember(ChatRoomName, UserName, function (result) {
+      chatroomFactory.addMember(ChatRoomName, UserName, function (/* result */) {
         clearTimeout(timer)
         return resolve(1)
       })
@@ -680,7 +681,7 @@
     return chatroomFactory.modTopic(ChatRoomName, topic)
   }
 
-  function roomCreate (UserNameList, topic) {
+  function roomCreate (UserNameList/* , topic */) {
     var UserNameListArg = UserNameList.map(function (n) { return { UserName: n } })
 
     var chatroomFactory = WechatyBro.glue.chatroomFactory
@@ -688,36 +689,36 @@
 
     return new Promise(resolve => {
       chatroomFactory.create(UserNameListArg)
-                      .then(function (r) {
-                        // eslint-disable-next-line
-                        if (r.BaseResponse && 0 == r.BaseResponse.Ret || -2013 == r.BaseResponse.Ret) {
-                          state.go('chat', { userName: r.ChatRoomName }) // BE CAREFUL: key name is userName, not UserName! 20161001
-                          // if (topic) {
-                          //   setTimeout(_ => roomModTopic(r.ChatRoomName, topic), 3000)
-                          // }
-                          if (!r.ChatRoomName) {
-                            throw new Error('chatroomFactory.create() got empty r.ChatRoomName')
-                          }
-                          resolve(r.ChatRoomName)
-                        } else {
-                          throw new Error('chatroomFactory.create() error with Ret: '
-                                            + r && r.BaseResponse.Ret
-                                            + 'with ErrMsg: '
-                                            + r && r.BaseResponse.ErrMsg
-                                        )
-                        }
-                      })
-                      .catch(function (e) {
-                        // TODO change to reject (BREAKIKNG CHANGES)
-                        resolve(
-                          JSON.parse(
-                            JSON.stringify(
-                              e
-                              , Object.getOwnPropertyNames(e)
-                            )
-                          )
-                        )
-                      })
+        .then(function (r) {
+          // eslint-disable-next-line
+          if (r.BaseResponse && 0 == r.BaseResponse.Ret || -2013 == r.BaseResponse.Ret) {
+            state.go('chat', { userName: r.ChatRoomName }) // BE CAREFUL: key name is userName, not UserName! 20161001
+            // if (topic) {
+            //   setTimeout(_ => roomModTopic(r.ChatRoomName, topic), 3000)
+            // }
+            if (!r.ChatRoomName) {
+              throw new Error('chatroomFactory.create() got empty r.ChatRoomName')
+            }
+            resolve(r.ChatRoomName)
+          } else {
+            throw new Error('chatroomFactory.create() error with Ret: '
+                              + r && r.BaseResponse.Ret
+                              + 'with ErrMsg: '
+                              + r && r.BaseResponse.ErrMsg
+            )
+          }
+        })
+        .catch(function (e) {
+          // TODO change to reject (BREAKIKNG CHANGES)
+          resolve(
+            JSON.parse(
+              JSON.stringify(
+                e
+                , Object.getOwnPropertyNames(e)
+              )
+            )
+          )
+        })
     })
   }
 
@@ -737,15 +738,15 @@
         Ticket,
         VerifyContent,
       })
-      .then(() => {  // succ
-        // alert('ok')
-        // log('friendAdd(' + UserName + ', ' + VerifyContent + ') done')
-        resolve(true)
-      }, (err) => {    // fail
-        // alert('not ok')
-        log('friendAdd(' + UserName + ', ' + VerifyContent + ') fail: ' + err)
-        resolve(false)
-      })
+        .then(() => {  // succ
+          // alert('ok')
+          // log('friendAdd(' + UserName + ', ' + VerifyContent + ') done')
+          resolve(true)
+        }, (err) => {    // fail
+          // alert('not ok')
+          log('friendAdd(' + UserName + ', ' + VerifyContent + ') fail: ' + err)
+          resolve(false)
+        })
     })
   }
 
diff --git a/tests/fixtures/smoke-testing.ts b/tests/fixtures/smoke-testing.ts
index 0a9eff0..0761544 100644
--- a/tests/fixtures/smoke-testing.ts
+++ b/tests/fixtures/smoke-testing.ts
@@ -21,7 +21,7 @@ async function main () {
   }
 
   const puppet = new PuppetPuppeteer()
-  const future = new Promise(r => puppet.once('scan', r))
+  const future = new Promise(resolve => puppet.once('scan', resolve))
 
   await puppet.start()
   await future
@@ -35,8 +35,8 @@ async function main () {
 }
 
 main()
-.then(process.exit)
-.catch(e => {
-  console.error(e)
-  process.exit(1)
-})
+  .then(process.exit)
+  .catch(e => {
+    console.error(e)
+    process.exit(1)
+  })
diff --git a/tests/puppeteer-contact.spec.ts b/tests/puppeteer-contact.spec.ts
index f1cfc83..15cf7b4 100755
--- a/tests/puppeteer-contact.spec.ts
+++ b/tests/puppeteer-contact.spec.ts
@@ -21,9 +21,7 @@
 // tslint:disable:arrow-parens
 // tslint:disable:no-shadowed-variable
 
-import test  from 'blue-tape'
-import sinon from 'sinon'
-
+import { test, sinon } from 'tstest'
 // import {
 //   cloneClass,
 // }               from 'clone-class'
diff --git a/tests/puppeteer-friendship.spec.ts b/tests/puppeteer-friendship.spec.ts
index a191161..531d986 100755
--- a/tests/puppeteer-friendship.spec.ts
+++ b/tests/puppeteer-friendship.spec.ts
@@ -18,11 +18,10 @@
  *
  */
 
- // tslint:disable:no-shadowed-variable
-// tslint:disable:max-classes-per-file
-
-import test  from 'blue-tape'
-import sinon from 'sinon'
+import {
+  test,
+  sinon,
+}           from 'tstest'
 
 import {
   FriendshipPayload,
@@ -43,6 +42,7 @@ import {
 // }
 
 class PuppetTest extends PuppetPuppeteer {
+
   public contactRawPayload (id: string) {
     return super.contactRawPayload(id)
   }
@@ -52,6 +52,7 @@ class PuppetTest extends PuppetPuppeteer {
   public messageRawPayload (id: string) {
     return super.messageRawPayload(id)
   }
+
 }
 
 test('PuppetPuppeteerFriendship.receive smoke testing', async (t) => {
@@ -118,7 +119,7 @@ test('PuppetPuppeteerFriendship.confirm smoke testing', async (t) => {
 
   const sandbox = sinon.createSandbox()
 
-  sandbox.stub(puppet, 'messageRawPayload')   .resolves(rawMessagePayload)
+  sandbox.stub(puppet, 'messageRawPayload').resolves(rawMessagePayload)
 
   sandbox.stub(puppet, 'contactPayload').resolves({} as any)
   // sandbox.stub(puppet, 'contactPayloadCache') .returns({})
diff --git a/tests/puppeteer-message.spec.ts b/tests/puppeteer-message.spec.ts
index bcd97a6..9c8dfff 100755
--- a/tests/puppeteer-message.spec.ts
+++ b/tests/puppeteer-message.spec.ts
@@ -23,8 +23,10 @@
 // tslint:disable:arrow-parens
 // tslint:disable:ter-no-irregular-whitespace
 
-import test  from 'blue-tape'
-import sinon from 'sinon'
+import {
+  test,
+  sinon,
+}           from 'tstest'
 
 import {
   // config,
@@ -51,6 +53,7 @@ import {
 // }
 
 class PuppetTest extends PuppetPuppeteer {
+
   public contactRawPayload (id: string) {
     return super.contactRawPayload(id)
   }
@@ -60,6 +63,7 @@ class PuppetTest extends PuppetPuppeteer {
   public messageRawPayload (id: string) {
     return super.messageRawPayload(id)
   }
+
 }
 
 // class PuppetPuppeteerTest extends PuppetPuppeteer {
@@ -81,7 +85,7 @@ test('constructor()', async t => {
     id:     '179242112323992762',
   }
   const sandbox = sinon.createSandbox()
-  const mockMessagePayload = async (_: string) => {
+  const mockMessagePayload = async (/* _: string */) => {
     const payload: MessagePayload = {
       fromId    : EXPECTED.from,
       id        : EXPECTED.id,
@@ -105,8 +109,8 @@ test('constructor()', async t => {
 
   const msgPayload = await puppet.messagePayload(rawPayload.MsgId)
 
-  t.is(msgPayload.id      , EXPECTED.id   , 'id right')
-  t.is(msgPayload.fromId  , EXPECTED.from , 'from right')
+  t.is(msgPayload.id,     EXPECTED.id,    'id right')
+  t.is(msgPayload.fromId, EXPECTED.from,  'from right')
 
   sandbox.restore()
 })
@@ -145,7 +149,7 @@ test('ready()', async t => {
           break
         default:
           log.error('TestMessage', `mocked getContact(%s) unknown`, id)
-          t.fail('mocked getContact(${id}) unknown')
+          t.fail(`mocked getContact(${id}) unknown`)
           break
       }
       log.silly('TestMessage', 'setTimeout mocked getContact')
@@ -188,10 +192,10 @@ test('ready()', async t => {
   const fromContactPayload = await puppet.contactPayload(fromId)
   const toContactPayload   = await puppet.contactPayload(toId)
 
-  t.is(fromId                   , expectedFromUserName, 'contact ready for FromUserName')
-  t.is(fromContactPayload.name  , expectedFromNickName, 'contact ready for FromNickName')
-  t.is(toId                     , expectedToUserName  , 'contact ready for ToUserName')
-  t.is(toContactPayload.name    , expectedToNickName  , 'contact ready for ToNickName')
+  t.is(fromId,                  expectedFromUserName, 'contact ready for FromUserName')
+  t.is(fromContactPayload.name, expectedFromNickName, 'contact ready for FromNickName')
+  t.is(toId,                    expectedToUserName,   'contact ready for ToUserName')
+  t.is(toContactPayload.name,   expectedToNickName,   'contact ready for ToNickName')
 
   sandbox.restore()
 })
diff --git a/tests/puppeteer-room.spec.ts b/tests/puppeteer-room.spec.ts
index 77adcd8..4c14750 100755
--- a/tests/puppeteer-room.spec.ts
+++ b/tests/puppeteer-room.spec.ts
@@ -23,9 +23,7 @@
 // tslint:disable:max-classes-per-file
 // tslint:disable:arrow-parens
 
-import test  from 'blue-tape'
-import sinon from 'sinon'
-
+import { test, sinon } from 'tstest'
 import {
   log,
 }                 from '../src/config'
@@ -38,7 +36,9 @@ import {
 }                     from '../src/web-schemas'
 
 class PuppetPuppeteerTest extends PuppetPuppeteer {
+
   public id?: string = undefined
+
 }
 
 // tslint:disable:max-line-length
diff --git a/tests/puppeteer.spec.ts b/tests/puppeteer.spec.ts
index 17a9a40..837a94a 100755
--- a/tests/puppeteer.spec.ts
+++ b/tests/puppeteer.spec.ts
@@ -25,9 +25,7 @@ import fs    from 'fs'
 import path  from 'path'
 
 // tslint:disable:no-shadowed-variable
-import test  from 'blue-tape'
-import sinon from 'sinon'
-
+import { test, sinon } from 'tstest'
 import {
   Cookie,
   launch,
@@ -62,7 +60,7 @@ test('Puppeteer smoke testing', async t => {
     t.is(result, 42, 'should get 42')
 
   } catch (e) {
-    t.fail(e && e.message || e)
+    t.fail((e && e.message) || e)
   } finally {
     if (page) {
       await page.close()
@@ -84,7 +82,7 @@ test('evaluate() a function that returns a Promise', async t => {
     await page.close()
     await browser.close()
   } catch (e) {
-    t.fail(e && e.message || e)
+    t.fail((e && e.message) || e)
   }
 })
 
@@ -117,7 +115,7 @@ test('evaluate() a file and get the returns value', async t => {
     await browser.close()
 
   } catch (e) {
-    t.fail(e && e.message || e)
+    t.fail((e && e.message) || e)
   }
 })
 
@@ -133,17 +131,17 @@ test('page.on(console)', async t => {
 
   page.on('console', spy)
   await page.evaluate((...args) => {
-    console.log.apply(console, args as [any?, ...any[]])
+    console.info.apply(console, args as [any?, ...any[]])
   }, EXPECTED_ARG1, EXPECTED_ARG2) // , EXPECTED_ARG3)
 
   // wait a while to let chrome fire the event
-  await new Promise(r => setTimeout(r, 3))
+  await new Promise(resolve => setTimeout(resolve, 3))
 
   t.ok(spy.calledOnce, 'should be called once')
 
   const consoleMessage = spy.firstCall.args[0]
-  t.equal(consoleMessage.type(), 'log', 'should get log type')
-  t.equal(consoleMessage.text(), EXPECTED_ARG1 + ' ' + EXPECTED_ARG2, 'should get console.log 1st/2nd arg')
+  t.equal(consoleMessage.type(), 'info', 'should get info type for `console.info`')
+  t.equal(consoleMessage.text(), EXPECTED_ARG1 + ' ' + EXPECTED_ARG2, 'should get console.info 1st/2nd arg')
 
   await page.close()
   await browser.close()
@@ -182,8 +180,8 @@ test('other demos', async t => {
     // not the same with the document of ConsoleMessage???
 
     page.on('dialog', async dialog => {
-      console.log(dialog)
-      console.log('dialog:', dialog.type, dialog.message())
+      console.info(dialog)
+      console.info('dialog:', dialog.type, dialog.message())
       await dialog.accept('ok')
     })
 
@@ -197,11 +195,12 @@ test('other demos', async t => {
     })
 
     page.on('load', (e, ...args) => {
-      console.log('load:e:', e)
-      console.log('load:args:', args)
+      console.info('load:e:', e)
+      console.info('load:args:', args)
     })
 
-    // await page.setRequestInterception(true)
+    await page.setRequestInterception(true)
+
     page.on('request', async interceptedRequest => {
       if (interceptedRequest.url().endsWith('.png')
         || interceptedRequest.url().endsWith('.jpg')
@@ -213,12 +212,12 @@ test('other demos', async t => {
     })
 
     page.on('requestfailed', (...args: any[]) => {
-      console.log('requestfailed:args:', args)
+      console.info('requestfailed:args:', args)
     })
 
-    page.on('response', (/*res, ...args*/) => {
-      // console.log('response:res:', res)
-      // console.log('response:args:', args)
+    page.on('response', (/* res, ...args */) => {
+      // console.info('response:res:', res)
+      // console.info('response:args:', args)
     })
 
     // page.click(selector[, options])