UNPKG

3.51 kBtext/coffeescriptView Raw
1gulp = require 'gulp'
2path = require 'path'
3inquirer = require 'inquirer'
4fs = require 'fs'
5chalk = require 'chalk'
6{spawn} = require 'child_process'
7
8{log, spinner} = require './util'
9
10# TODO This should move away from here, obviously
11boilerplates =
12 backend:
13 node: 'https://github.com/poi/node'
14 rails: 'https://github.com/poi/rails'
15 frontend:
16 static: 'https://github.com/poi/static'
17 service:
18 redis: 'https://github.com/poi/redis'
19
20
21# TODO Use an actual package?
22git = (args...) ->
23 spawn 'git', args
24
25bootstrap = (repo, name, done) ->
26 # TODO handle failed git clones
27 child = if repo
28 git 'clone', repo, name
29 else
30 git 'init', name
31
32 child.on 'close', (err) ->
33 done err, {repo, name}
34
35confirm = (done) ->
36 inquirer.prompt [
37 type: 'confirm'
38 name: 'ok'
39 message: 'Is that ok?'
40 ], ({ok}) ->
41 if not ok
42 log.error "Aborted."
43 return done "Aborted"
44 done()
45
46
47prompts =
48 name: (default_) ->
49 name: 'name'
50 message: "Name?"
51 default: default_
52 validate: (value) ->
53 switch
54 when not value
55 "Needs a name"
56 when -1 < value.indexOf ' '
57 "No spaces!"
58 when fs.existsSync path.join process.cwd(), value
59 "'#{value}' exists already in this directory"
60 else
61 true
62
63wizards =
64 index: (done) ->
65 log.info "Let's build something!"
66
67 inquirer.prompt [
68 type: 'list'
69 name: 'type'
70 message: 'What do you want to build?'
71 choices: [
72 'app'
73 'module'
74 'clone'
75 ]
76 ], ({type}) ->
77 wizards[type] done
78
79 repo: (done) ->
80 log.info "Let's build a clone!"
81
82 inquirer.prompt [
83 name: 'base'
84 message: "Repository url?"
85 ,
86 prompts.name ({repo}) -> path.basename repo
87 ], ({repo, name}) ->
88 bootstrap repo, name, done
89
90 module: (done) ->
91 log.info "Let's build a module!"
92
93 inquirer.prompt [
94 prompts.name()
95 ,
96 type: 'list'
97 name: 'type'
98 message: 'What for?'
99 choices: [
100 name: 'bower componenet'
101 value: 'bower'
102 ,
103 name: 'npm package'
104 value: 'npm'
105 ,
106 name: 'ruby gem'
107 value: 'gem'
108 ]
109 ], ({type}) ->
110 log.warn "Too bad, can't do that yet!"
111
112
113 app: (done) ->
114 log.info "Let's build an app!"
115
116 inquirer.prompt [
117 name: 'type'
118 type: 'list'
119 message: "Type?"
120 choices: [
121 'frontend'
122 'backend'
123 'split-stack'
124 'service'
125 'repo'
126 'blank'
127 ]
128 ,
129 prompts.name()
130 ,
131 when: ({type}) -> type == 'backend'
132 type: 'list'
133 name: 'repo'
134 message: "Backend?"
135 choices: (name: name, value: boilerplates.backend.node for name in [
136 'node'
137 'rails'
138 ])
139 ,
140 when: ({type}) -> type == 'service'
141 type: 'list'
142 name: 'repo'
143 message: "Service?"
144 choices: [
145 name: 'redis'
146 value: boilerplates.service.redis
147 ]
148 ,
149 when: ({type}) -> type == 'repo'
150 name: 'repo'
151 message: "Repository url?"
152 ], ({name, type, repo}) ->
153
154 log.info "About to create", chalk.white(type), "project", chalk.white(name)
155
156 confirm (err) ->
157 return done err if err
158
159 bootstrap repo, name, done
160
161gulp.task "bootstrap:app", wizards.app
162gulp.task "bootstrap:module", wizards.module
163gulp.task "bootstrap:repo", wizards.repo
164gulp.task "bootstrap:wizard", wizards.index
165
166module.exports = wizards
\No newline at end of file