UNPKG

3.38 kBJavaScriptView Raw
1const Command = require('../utils/command')
2const { flags } = require('@oclif/command')
3const path = require('path')
4const chalk = require('chalk')
5const { ensureNetlifyIgnore } = require('../utils/gitignore')
6const linkPrompt = require('../utils/link/link-by-prompt')
7const { track } = require('../utils/telemetry')
8
9class LinkCommand extends Command {
10 async run() {
11 await this.authenticate()
12
13 const { flags } = this.parse(LinkCommand)
14 const { api, site, state } = this.netlify
15 const siteId = site.id
16
17 await this.config.runHook('analytics', {
18 eventName: 'command',
19 payload: {
20 command: 'link'
21 }
22 })
23
24 let siteData
25 try {
26 siteData = await api.getSite({ siteId })
27 } catch (e) {
28 // silent api error
29 }
30
31 // Add .netlify to .gitignore file
32 await ensureNetlifyIgnore(site.root)
33
34 // Site id is incorrect
35 if (siteId && !siteData) {
36 console.log(`"${siteId}" was not found in your Netlify account.`)
37 console.log(`Please double check your siteID and which account you are logged into via \`netlify status\`.`)
38 return this.exit()
39 }
40
41 // If already linked to site. exit and prompt for unlink
42 if (siteData) {
43 this.log(`Site already linked to "${siteData.name}"`)
44 this.log(`Admin url: ${siteData.admin_url}`)
45 this.log()
46 this.log(`To unlink this site, run: ${chalk.cyanBright('netlify unlink')}`)
47 return this.exit()
48 }
49
50 if (flags.id) {
51 try {
52 siteData = await api.getSite({ site_id: flags.id })
53 } catch (e) {
54 if (e.status === 404) {
55 this.error(new Error(`Site id ${flags.id} not found`))
56 } else {
57 this.error(e)
58 }
59 }
60
61 // Save site ID
62 state.set('siteId', siteData.id)
63 this.log(`Linked to ${siteData.name} in ${state.path}`)
64
65 await track('sites_linked', {
66 siteId: siteData.id,
67 linkType: 'manual',
68 kind: 'byId'
69 })
70
71 return this.exit()
72 }
73
74 if (flags.name) {
75 let results
76 try {
77 results = await api.listSites({
78 name: flags.name,
79 filter: 'all'
80 })
81 } catch (e) {
82 if (e.status === 404) {
83 this.error(new Error(`${flags.name} not found`))
84 } else {
85 this.error(e)
86 }
87 }
88
89 if (results.length === 0) {
90 this.error(new Error(`No sites found named ${flags.name}`))
91 }
92 siteData = results[0]
93 state.set('siteId', siteData.id)
94
95 this.log(`Linked to ${siteData.name} in ${path.relative(path.join(process.cwd(), '..'), state.path)}`)
96
97 await track('sites_linked', {
98 siteId: (siteData && siteData.id) || siteId,
99 linkType: 'manual',
100 kind: 'byName'
101 })
102
103 return this.exit()
104 }
105
106 siteData = await linkPrompt(this, flags)
107 return siteData
108 }
109}
110
111LinkCommand.description = `Link a local repo or project folder to an existing site on Netlify`
112
113LinkCommand.examples = ['netlify link', 'netlify link --id 123-123-123-123', 'netlify link --name my-site-name']
114
115LinkCommand.flags = {
116 id: flags.string({
117 description: 'ID of site to link to'
118 }),
119 name: flags.string({
120 description: 'Name of site to link to'
121 }),
122 gitRemoteName: flags.string({
123 description: 'Name of Git remote to use. e.g. "origin"'
124 }),
125}
126
127module.exports = LinkCommand