Source: debug/Promise.js

/**
 * @author twitter @arcanis
 * @see https://twitter.com/arcanis/status/1235571321263845376/photo/1
 */
'use strict'

/**
 * Liste d'erreurs concernant chaque pending Promise (ajouté à la création de la Promise et viré au resolve/reject)
 * @type {Set<Error>}
 */
const pending = new Set()

// Lors de la sortie, on liste les promesses encore pending
process.on('exit', () => {
  Array.from(pending).forEach(error => {
    console.error(error.stack)
  })
})

// on wrap le constructeur de Promise avec notre code qui ajoute les erreurs de pending promise
global.Promise = class extends Promise {
  constructor (factory) {
    super((resolve, reject) => {
      const hangError = Error('A promise never resolved')
      pending.add(hangError)

      factory(
        result => {
          pending.delete(hangError)
          resolve(result)
        },
        error => {
          pending.delete(hangError)
          reject(error)
        }
      )
    })
  }
}