UNPKG

2.86 kBJavaScriptView Raw
1var downloadUrl = require('download')
2var gitclone = require('git-clone')
3var rm = require('rimraf').sync
4
5/**
6 * Expose `download`.
7 */
8
9module.exports = download
10
11/**
12 * Download `repo` to `dest` and callback `fn(err)`.
13 *
14 * @param {String} repo
15 * @param {String} dest
16 * @param {Object} opts
17 * @param {Function} fn
18 */
19
20function download (repo, dest, opts, fn) {
21 if (typeof opts === 'function') {
22 fn = opts
23 opts = null
24 }
25 opts = opts || {}
26 var clone = opts.clone || false
27
28 repo = normalize(repo)
29 var url = getUrl(repo, clone)
30
31 if (clone) {
32 gitclone(url, dest, { checkout: repo.checkout, shallow: repo.checkout === 'master' }, function (err) {
33 if (err === undefined) {
34 rm(dest + '/.git')
35 fn()
36 } else {
37 fn(err)
38 }
39 })
40 } else {
41 downloadUrl(url, dest, { extract: true, strip: 1, mode: '666', headers: { accept: 'application/zip' } }).then(data => {
42 fn()
43 }).catch(err => {
44 fn(err)
45 })
46 }
47}
48
49/**
50 * Normalize a repo string.
51 *
52 * @param {String} repo
53 * @return {Object}
54 */
55
56function normalize (repo) {
57 var regex = /^((github|gitlab|bitbucket):)?((.+):)?([^/]+)\/([^#]+)(#(.+))?$/
58 var match = regex.exec(repo)
59 var type = match[2] || 'github'
60 var origin = match[4] || null
61 var owner = match[5]
62 var name = match[6]
63 var checkout = match[8] || 'master'
64
65 if (origin == null) {
66 if (type === 'github')
67 origin = 'github.com'
68 else if (type === 'gitlab')
69 origin = 'gitlab.com'
70 else if (type === 'bitbucket')
71 origin = 'bitbucket.org'
72 }
73
74 return {
75 type: type,
76 origin: origin,
77 owner: owner,
78 name: name,
79 checkout: checkout
80 }
81}
82
83/**
84 * Adds protocol to url in none specified
85 *
86 * @param {String} url
87 * @return {String}
88 */
89
90function addProtocol (origin, clone) {
91 if (!/^(f|ht)tps?:\/\//i.test(origin)) {
92 if (clone)
93 origin = 'git@' + origin
94 else
95 origin = 'https://' + origin
96 }
97
98 return origin
99}
100
101/**
102 * Return a zip or git url for a given `repo`.
103 *
104 * @param {Object} repo
105 * @return {String}
106 */
107
108function getUrl (repo, clone) {
109 var url
110
111 // Get origin with protocol and add trailing slash or colon (for ssh)
112 var origin = addProtocol(repo.origin, clone)
113 if (/^git\@/i.test(origin))
114 origin = origin + ':'
115 else
116 origin = origin + '/'
117
118 // Build url
119 if (clone) {
120 url = origin + repo.owner + '/' + repo.name + '.git'
121 } else {
122 if (repo.type === 'github')
123 url = origin + repo.owner + '/' + repo.name + '/archive/' + repo.checkout + '.zip'
124 else if (repo.type === 'gitlab')
125 url = origin + repo.owner + '/' + repo.name + '/repository/archive.zip?ref=' + repo.checkout
126 else if (repo.type === 'bitbucket')
127 url = origin + repo.owner + '/' + repo.name + '/get/' + repo.checkout + '.zip'
128 else
129 url = github(repo)
130 }
131
132 return url
133}