aboutsummaryrefslogtreecommitdiff
path: root/deps/npm/lib/hook.js
blob: b0552c74740ea30698be224ecbb448f9d42fb623 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
'use strict'

const BB = require('bluebird')

const crypto = require('crypto')
const hookApi = require('libnpmhook')
const log = require('npmlog')
const npm = require('./npm.js')
const output = require('./utils/output.js')
const pudding = require('figgy-pudding')
const relativeDate = require('tiny-relative-date')
const Table = require('cli-table3')
const usage = require('./utils/usage.js')
const validate = require('aproba')

hook.usage = usage([
  'npm hook add <pkg> <url> <secret> [--type=<type>]',
  'npm hook ls [pkg]',
  'npm hook rm <id>',
  'npm hook update <id> <url> <secret>'
])

hook.completion = (opts, cb) => {
  validate('OF', [opts, cb])
  return cb(null, []) // fill in this array with completion values
}

const npmSession = crypto.randomBytes(8).toString('hex')
const hookConfig = pudding()
function config () {
  return hookConfig({
    refer: npm.refer,
    projectScope: npm.projectScope,
    log,
    npmSession
  }, npm.config)
}

module.exports = (args, cb) => BB.try(() => hook(args)).nodeify(cb)
function hook (args) {
  switch (args[0]) {
    case 'add':
      return add(args[1], args[2], args[3])
    case 'ls':
      return ls(args[1])
    case 'rm':
      return rm(args[1])
    case 'update':
    case 'up':
      return update(args[1], args[2], args[3])
  }
}

function add (pkg, uri, secret) {
  return hookApi.add(pkg, uri, secret, config())
    .then((hook) => {
      if (npm.config.get('json')) {
        output(JSON.stringify(hook, null, 2))
      } else {
        output(`+ ${hookName(hook)} ${
          npm.config.get('unicode') ? ' ➜ ' : ' -> '
        } ${hook.endpoint}`)
      }
    })
}

function ls (pkg) {
  return hookApi.ls(pkg, config())
    .then((hooks) => {
      if (npm.config.get('json')) {
        output(JSON.stringify(hooks, null, 2))
      } else if (!hooks.length) {
        output("You don't have any hooks configured yet.")
      } else {
        if (hooks.length === 1) {
          output('You have one hook configured.')
        } else {
          output(`You have ${hooks.length} hooks configured.`)
        }
        const table = new Table({head: ['id', 'target', 'endpoint']})
        hooks.forEach((hook) => {
          table.push([
            {rowSpan: 2, content: hook.id},
            hookName(hook),
            hook.endpoint
          ])
          if (hook.last_delivery) {
            table.push([
              {
                colSpan: 1,
                content: `triggered ${relativeDate(hook.last_delivery)}`
              },
              hook.response_code
            ])
          } else {
            table.push([{colSpan: 2, content: 'never triggered'}])
          }
        })
        output(table.toString())
      }
    })
}

function rm (id) {
  return hookApi.rm(id, config())
    .then((hook) => {
      if (npm.config.get('json')) {
        output(JSON.stringify(hook, null, 2))
      } else {
        output(`- ${hookName(hook)} ${
          npm.config.get('unicode') ? ' ✘ ' : ' X '
        } ${hook.endpoint}`)
      }
    })
}

function update (id, uri, secret) {
  return hookApi.update(id, uri, secret, config())
    .then((hook) => {
      if (npm.config.get('json')) {
        output(JSON.stringify(hook, null, 2))
      } else {
        output(`+ ${hookName(hook)} ${
          npm.config.get('unicode') ? ' ➜ ' : ' -> '
        } ${hook.endpoint}`)
      }
    })
}

function hookName (hook) {
  let target = hook.name
  if (hook.type === 'scope') { target = '@' + target }
  if (hook.type === 'owner') { target = '~' + target }
  return target
}