UNPKG

3.24 kBJavaScriptView Raw
1'use strict'
2
3let _ = require('lodash')
4let AppTransfer = require('../../lib/app_transfer')
5let cli = require('heroku-cli-util')
6let co = require('co')
7let extend = require('util')._extend
8let inquirer = require('inquirer')
9let lock = require('./lock.js').apps
10let Utils = require('../../lib/utils')
11
12function getAppsToTransfer (apps) {
13 return inquirer.prompt([{
14 type: 'checkbox',
15 name: 'choices',
16 pageSize: 20,
17 message: 'Select applications you would like to transfer',
18 choices: apps.map(function (app) {
19 return {
20 name: `${app.name} (${Utils.getOwner(app.owner.email)})`,
21 value: { name: app.name, owner: app.owner.email }
22 }
23 })
24 }])
25}
26
27function * run (context, heroku) {
28 let app = context.app
29 let recipient = context.args.recipient
30
31 // App transfers in bulk
32 if (context.flags.bulk) {
33 let allApps = yield heroku.get('/apps')
34 let selectedApps = yield getAppsToTransfer(_.sortBy(allApps, 'name'))
35 cli.console.error(`Transferring applications to ${cli.color.magenta(recipient)}...
36`)
37
38 for (let app of selectedApps.choices) {
39 try {
40 let appTransfer = new AppTransfer({
41 heroku: heroku,
42 appName: app.name,
43 recipient: recipient,
44 personalToPersonal: Utils.isValidEmail(recipient) && !Utils.isOrgApp(app.owner),
45 bulk: true
46 })
47 yield appTransfer.start()
48 } catch (err) {
49 cli.error(err)
50 }
51 }
52 } else { // Single app transfer
53 let appInfo = yield heroku.get(`/apps/${app}`)
54
55 // Shows warning when app is transferred from a team/org to a personal account
56 if (Utils.isValidEmail(recipient) && Utils.isOrgApp(appInfo.owner.email)) {
57 yield cli.confirmApp(app, context.flags.confirm, 'All collaborators will be removed from this app')
58 }
59
60 let appTransfer = new AppTransfer({
61 heroku: heroku,
62 appName: appInfo.name,
63 recipient: recipient,
64 personalToPersonal: Utils.isValidEmail(recipient) && !Utils.isOrgApp(appInfo.owner.email)
65 })
66 yield appTransfer.start()
67
68 if (context.flags.locked) {
69 yield lock.run(context)
70 }
71 }
72}
73
74let cmd = {
75 topic: 'apps',
76 command: 'transfer',
77 description: 'transfer applications to another user, organization or team',
78 needsAuth: true,
79 wantsApp: true,
80 run: cli.command(co.wrap(run)),
81 args: [
82 {name: 'recipient', description: 'user, organization or team to transfer applications to'}
83 ],
84 flags: [
85 {name: 'locked', char: 'l', hasValue: false, required: false, description: 'lock the app upon transfer'},
86 {name: 'bulk', hasValue: false, required: false, description: 'transfer applications in bulk'}
87 ],
88 help: `
89Examples:
90
91 $ heroku apps:transfer collaborator@example.com
92 Transferring example to collaborator@example.com... done
93
94 $ heroku apps:transfer acme-widgets
95 Transferring example to acme-widgets... done
96
97 $ heroku apps:transfer --bulk acme-widgets
98 ...
99 `
100}
101
102module.exports = cmd
103module.exports.sharing = extend({}, cmd)
104module.exports.sharing.hidden = true
105module.exports.sharing.topic = 'sharing'
106module.exports.sharing.run = function () {
107 cli.error(`This command is now ${cli.color.cyan('heroku apps:transfer')}`)
108 process.exit(1)
109}