1 | const Command = require('../utils/command')
|
2 | const { flags } = require('@oclif/command')
|
3 | const path = require('path')
|
4 | const chalk = require('chalk')
|
5 | const { ensureNetlifyIgnore } = require('../utils/gitignore')
|
6 | const linkPrompt = require('../utils/link/link-by-prompt')
|
7 | const { track } = require('../utils/telemetry')
|
8 |
|
9 | class 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 |
|
29 | }
|
30 |
|
31 |
|
32 | await ensureNetlifyIgnore(site.root)
|
33 |
|
34 |
|
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 |
|
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 |
|
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 |
|
111 | LinkCommand.description = `Link a local repo or project folder to an existing site on Netlify`
|
112 |
|
113 | LinkCommand.examples = ['netlify link', 'netlify link --id 123-123-123-123', 'netlify link --name my-site-name']
|
114 |
|
115 | LinkCommand.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 |
|
127 | module.exports = LinkCommand
|