1 | gulp = require 'gulp'
|
2 | path = require 'path'
|
3 | inquirer = require 'inquirer'
|
4 | fs = require 'fs'
|
5 | chalk = require 'chalk'
|
6 | {spawn} = require 'child_process'
|
7 |
|
8 | {log, spinner} = require './util'
|
9 |
|
10 |
|
11 | boilerplates =
|
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 |
|
22 | git = (args...) ->
|
23 | spawn 'git', args
|
24 |
|
25 | bootstrap = (repo, name, done) ->
|
26 |
|
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 |
|
35 | confirm = (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 |
|
47 | prompts =
|
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 |
|
63 | wizards =
|
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 |
|
161 | gulp.task "bootstrap:app", wizards.app
|
162 | gulp.task "bootstrap:module", wizards.module
|
163 | gulp.task "bootstrap:repo", wizards.repo
|
164 | gulp.task "bootstrap:wizard", wizards.index
|
165 |
|
166 | module.exports = wizards |
\ | No newline at end of file |