Skip to content

Commit 539aece

Browse files
zigomiryyx990803
authored andcommitted
Tests
* Start with linter. eslint & standard - same as on Vuex. * Make linter happy. * Extract. * More extraction. Get ready to test. * First test. * Refactor. * Skip non-mustache file. * Missing testing dependencies: mocha and chai.
1 parent 0e37f6d commit 539aece

File tree

14 files changed

+364
-170
lines changed

14 files changed

+364
-170
lines changed

.babelrc

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"env": {
3+
"node": true,
4+
"mocha": true,
5+
"development": {
6+
"presets": ["es2015", "stage-2"]
7+
}
8+
}
9+
}

.eslintrc

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "standard",
3+
"rules": {
4+
"arrow-parens": [2, "as-needed"]
5+
}
6+
}

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.DS_Store
22
node_modules
3+
test/e2e/mock-template-build

bin/vue-init

+10-146
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
#!/usr/bin/env node
22

3-
var metadata = require('read-metadata')
4-
var async = require('async')
5-
var Metalsmith = require('metalsmith')
6-
var render = require('consolidate').handlebars.render
73
var download = require('download-git-repo')
84
var program = require('commander')
95
var exists = require('fs').existsSync
@@ -13,7 +9,6 @@ var uid = require('uid')
139
var chalk = require('chalk')
1410
var inquirer = require('inquirer')
1511
var logger = require('../lib/logger')
16-
var getGitUser = require('../lib/git-user')
1712
var Spinner = require('../lib/spinner')
1813

1914
/**
@@ -43,8 +38,11 @@ program.on('--help', function () {
4338
* Help.
4439
*/
4540

46-
program.parse(process.argv)
47-
if (program.args.length < 1) return program.help()
41+
function help () {
42+
program.parse(process.argv)
43+
if (program.args.length < 1) return program.help()
44+
}
45+
help()
4846

4947
/**
5048
* Padding.
@@ -88,6 +86,11 @@ if (exists(to)) {
8886
*/
8987

9088
function run () {
89+
var options = require('../lib/options')(name)
90+
var prompt = require('../lib/prompt')
91+
var ask = require('../lib/ask')(options, prompt)
92+
var generate = require('../lib/generate')(ask)
93+
9194
// check if template is local
9295
if (hasSlash && exists(template)) {
9396
generate(template, to, function (err) {
@@ -116,142 +119,3 @@ function run () {
116119
})
117120
}
118121
}
119-
120-
var promptInquirerTypeMapping = {
121-
string: 'input',
122-
boolean: 'confirm'
123-
}
124-
125-
/**
126-
* Prompt plugin.
127-
*
128-
* @param {Object} files
129-
* @param {Metalsmith} metalsmith
130-
* @param {Function} done
131-
*/
132-
133-
function ask (files, metalsmith, done) {
134-
var opts = options(metalsmith._directory + '/..')
135-
136-
var prompts = Object.keys(opts.schema)
137-
var metalsmithMetadata = metalsmith.metadata()
138-
139-
async.eachSeries(prompts, run, done)
140-
141-
function run(key, done) {
142-
var prompt = opts.schema[key]
143-
144-
inquirer.prompt([{
145-
type: promptInquirerTypeMapping[prompt.type] || prompt.type,
146-
name: key,
147-
message: prompt.label || key,
148-
default: prompt.default,
149-
choices: prompt.choices || []
150-
}], function (answers) {
151-
if (Array.isArray(answers[key])) {
152-
metalsmithMetadata[key] = {}
153-
answers[key].forEach(function (multiChoiceAnswer) {
154-
metalsmithMetadata[key][multiChoiceAnswer] = true
155-
})
156-
} else {
157-
metalsmithMetadata[key] = answers[key]
158-
}
159-
160-
done()
161-
})
162-
}
163-
}
164-
165-
/**
166-
* Template in place plugin.
167-
*
168-
* @param {Object} files
169-
* @param {Metalsmith} metalsmith
170-
* @param {Function} done
171-
*/
172-
173-
function renderTemplateFiles (files, metalsmith, done) {
174-
var keys = Object.keys(files)
175-
var metalsmithMetadata = metalsmith.metadata()
176-
177-
async.each(keys, run, done)
178-
179-
function run (file, done) {
180-
var str = files[file].contents.toString()
181-
// do not attempt to render files that do not have mustaches
182-
if (!/\{\{[#^] *(\w+) *\}\}/.test(str)) {
183-
return done()
184-
}
185-
render(str, metalsmithMetadata, function (err, res) {
186-
if (err) return done(err)
187-
files[file].contents = new Buffer(res)
188-
done()
189-
})
190-
}
191-
}
192-
193-
/**
194-
* Generate a template given a `src` and `dest`.
195-
*
196-
* @param {String} src
197-
* @param {String} dest
198-
* @param {Function} fn
199-
*/
200-
201-
function generate (src, dest, fn) {
202-
var template = path.join(src, 'template')
203-
204-
Metalsmith(template)
205-
.use(ask)
206-
.use(renderTemplateFiles)
207-
.clean(false)
208-
.source('.') // start from template root instead of `./src` which is Metalsmith's default for `source`
209-
.destination(dest)
210-
.build(function (err) {
211-
if (err) throw err
212-
fn()
213-
})
214-
}
215-
216-
/**
217-
* Read prompts metadata.
218-
*
219-
* @param {String} dir
220-
* @return {Object}
221-
*/
222-
223-
function options (dir) {
224-
var file = path.join(dir, 'meta.json')
225-
var opts = exists(file)
226-
? metadata.sync(file)
227-
: {}
228-
229-
setDefault(opts, 'name', name)
230-
231-
var author = getGitUser()
232-
if (author) {
233-
setDefault(opts, 'author', author)
234-
}
235-
236-
return opts
237-
}
238-
239-
/**
240-
* Set the default value for a schema key
241-
*
242-
* @param {Object} opts
243-
* @param {String} key
244-
* @param {String} val
245-
*/
246-
247-
function setDefault (opts, key, val) {
248-
var schema = opts.schema || (opts.schema = {})
249-
if (!schema[key] || typeof schema[key] !== 'object') {
250-
schema[key] = {
251-
'type': 'string',
252-
'default': val
253-
}
254-
} else {
255-
schema[key]['default'] = val
256-
}
257-
}

lib/ask.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
var async = require('async')
2+
3+
/**
4+
* Metalsmith ask plugin.
5+
*
6+
* @param {Function} options
7+
* @param {Function} prompt
8+
*/
9+
10+
function ask (options, prompt) {
11+
return function (files, metalsmith, done) {
12+
var opts = options(metalsmith._directory + '/..')
13+
14+
var prompts = Object.keys(opts.schema)
15+
var metalsmithMetadata = metalsmith.metadata()
16+
17+
async.eachSeries(prompts, run, done)
18+
19+
function run (key, done) {
20+
prompt(metalsmithMetadata, key, opts.schema[key], done)
21+
}
22+
}
23+
}
24+
25+
module.exports = function (options, prompt) {
26+
return ask(options, prompt)
27+
}

lib/generate.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
var Metalsmith = require('metalsmith')
2+
var async = require('async')
3+
var render = require('consolidate').handlebars.render
4+
var path = require('path')
5+
6+
/**
7+
* Template in place plugin.
8+
*
9+
* @param {Object} files
10+
* @param {Metalsmith} metalsmith
11+
* @param {Function} done
12+
*/
13+
14+
function renderTemplateFiles (files, metalsmith, done) {
15+
var keys = Object.keys(files)
16+
var metalsmithMetadata = metalsmith.metadata()
17+
18+
async.each(keys, run, done)
19+
20+
function run (file, done) {
21+
var str = files[file].contents.toString()
22+
23+
// do not attempt to render files that do not have mustaches
24+
if (!/{{([^{}]+)}}/g.test(str)) {
25+
return done()
26+
}
27+
28+
render(str, metalsmithMetadata, function (err, res) {
29+
if (err) return done(err)
30+
files[file].contents = new Buffer(res)
31+
done()
32+
})
33+
}
34+
}
35+
36+
module.exports = function (ask) {
37+
/**
38+
* Generate a template given a `src` and `dest`.
39+
*
40+
* @param {String} src
41+
* @param {String} dest
42+
* @param {Function} fn
43+
*/
44+
45+
function generate (src, dest, fn) {
46+
var template = path.join(src, 'template')
47+
48+
Metalsmith(template)
49+
.use(ask)
50+
.use(renderTemplateFiles)
51+
.clean(false)
52+
.source('.') // start from template root instead of `./src` which is Metalsmith's default for `source`
53+
.destination(dest)
54+
.build(function (err) {
55+
if (err) throw err
56+
fn()
57+
})
58+
}
59+
60+
return generate
61+
}

lib/git-user.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
var exec = require('child_process').execSync
22

33
module.exports = function () {
4-
var name, email
4+
var name
5+
var email
6+
57
try {
6-
var name = exec('git config --get user.name')
7-
var email = exec('git config --get user.email')
8+
name = exec('git config --get user.name')
9+
email = exec('git config --get user.email')
810
} catch (e) {}
11+
912
name = name && name.toString().trim()
1013
email = email && (' <' + email.toString().trim() + '>')
1114
return (name || '') + (email || '')

lib/options.js

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
var path = require('path')
2+
var metadata = require('read-metadata')
3+
var exists = require('fs').existsSync
4+
var getGitUser = require('../lib/git-user')
5+
6+
module.exports = function (name) {
7+
/**
8+
* Read prompts metadata.
9+
*
10+
* @param {String} dir
11+
* @return {Object}
12+
*/
13+
14+
function options (dir) {
15+
var file = path.join(dir, 'meta.json')
16+
var opts = exists(file)
17+
? metadata.sync(file)
18+
: {}
19+
20+
setDefault(opts, 'name', name)
21+
22+
var author = getGitUser()
23+
if (author) {
24+
setDefault(opts, 'author', author)
25+
}
26+
27+
return opts
28+
}
29+
30+
/**
31+
* Set the default value for a schema key
32+
*
33+
* @param {Object} opts
34+
* @param {String} key
35+
* @param {String} val
36+
*/
37+
38+
function setDefault (opts, key, val) {
39+
var schema = opts.schema || (opts.schema = {})
40+
if (!schema[key] || typeof schema[key] !== 'object') {
41+
schema[key] = {
42+
'type': 'string',
43+
'default': val
44+
}
45+
} else {
46+
schema[key]['default'] = val
47+
}
48+
}
49+
50+
return options
51+
}

0 commit comments

Comments
 (0)