Skip to content

Commit b1de5bd

Browse files
committed
refactor to make code easier to follow
1 parent 5de46f9 commit b1de5bd

File tree

7 files changed

+126
-151
lines changed

7 files changed

+126
-151
lines changed

bin/vue-init

+3-7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var ora = require('ora')
1010
var chalk = require('chalk')
1111
var inquirer = require('inquirer')
1212
var logger = require('../lib/logger')
13+
var generate = require('../lib/generate')
1314
var checkVersion = require('../lib/check-version')
1415

1516
/**
@@ -87,14 +88,9 @@ if (exists(to)) {
8788
*/
8889

8990
function run () {
90-
var options = require('../lib/options')(name)
91-
var prompt = require('../lib/prompt')
92-
var ask = require('../lib/ask')(options, prompt)
93-
var generate = require('../lib/generate')(ask)
94-
9591
// check if template is local
9692
if (hasSlash && exists(template)) {
97-
generate(template, to, function (err) {
93+
generate(name, template, to, function (err) {
9894
if (err) logger.fatal(err)
9995
console.log()
10096
logger.success('Generated "%s".', name)
@@ -112,7 +108,7 @@ function run () {
112108
download(template, tmp, { clone: clone }, function (err) {
113109
spinner.stop()
114110
if (err) logger.fatal(err)
115-
generate(tmp, to, function (err) {
111+
generate(name, tmp, to, function (err) {
116112
if (err) logger.fatal(err)
117113
rm(tmp)
118114
console.log()

lib/ask.js

+41-17
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,51 @@
11
var async = require('async')
2+
var inquirer = require('inquirer')
3+
4+
// Support types from prompt-for which was used before
5+
var promptMapping = {
6+
string: 'input',
7+
boolean: 'confirm'
8+
}
29

310
/**
4-
* Metalsmith ask plugin.
11+
* Ask questions, return results.
512
*
6-
* @param {Function} options
7-
* @param {Function} prompt
13+
* @param {Object} schema
14+
* @param {Object} data
15+
* @param {Function} done
816
*/
917

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()
18+
module.exports = function ask (schema, data, done) {
19+
async.eachSeries(Object.keys(schema), function (key, next) {
20+
prompt(data, key, schema[key], next)
21+
}, done)
22+
}
1623

17-
async.eachSeries(prompts, run, done)
24+
/**
25+
* Inquirer prompt wrapper.
26+
*
27+
* @param {Object} data
28+
* @param {String} key
29+
* @param {Object} prompt
30+
* @param {Function} done
31+
*/
1832

19-
function run (key, done) {
20-
prompt(metalsmithMetadata, key, opts.schema[key], done)
33+
function prompt (data, key, prompt, done) {
34+
inquirer.prompt([{
35+
type: promptMapping[prompt.type] || prompt.type,
36+
name: key,
37+
message: prompt.label || key,
38+
default: prompt.default,
39+
choices: prompt.choices || []
40+
}], function (answers) {
41+
if (Array.isArray(answers[key])) {
42+
data[key] = {}
43+
answers[key].forEach(function (multiChoiceAnswer) {
44+
data[key][multiChoiceAnswer] = true
45+
})
46+
} else {
47+
data[key] = answers[key]
2148
}
22-
}
23-
}
24-
25-
module.exports = function (options, prompt) {
26-
return ask(options, prompt)
49+
done()
50+
})
2751
}

lib/generate.js

+32-36
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,33 @@ var Metalsmith = require('metalsmith')
22
var async = require('async')
33
var render = require('consolidate').handlebars.render
44
var path = require('path')
5+
var getOptions = require('./options')
6+
var askQuestions = require('./ask')
7+
8+
/**
9+
* Generate a template given a `src` and `dest`.
10+
*
11+
* @param {String} name
12+
* @param {String} src
13+
* @param {String} dest
14+
* @param {Function} done
15+
*/
16+
17+
module.exports = function generate (name, src, dest, done) {
18+
var opts = getOptions(name, src)
19+
Metalsmith(path.join(src, 'template'))
20+
.use(function (files, metalsmith, done) {
21+
askQuestions(opts.schema, metalsmith.metadata(), done)
22+
})
23+
.use(renderTemplateFiles)
24+
.clean(false)
25+
.source('.') // start from template root instead of `./src` which is Metalsmith's default for `source`
26+
.destination(dest)
27+
.build(function (err) {
28+
if (err) throw err
29+
done()
30+
})
31+
}
532

633
/**
734
* Template in place plugin.
@@ -15,47 +42,16 @@ function renderTemplateFiles (files, metalsmith, done) {
1542
var keys = Object.keys(files)
1643
var metalsmithMetadata = metalsmith.metadata()
1744

18-
async.each(keys, run, done)
19-
20-
function run (file, done) {
45+
async.each(keys, function (file, next) {
2146
var str = files[file].contents.toString()
22-
2347
// do not attempt to render files that do not have mustaches
2448
if (!/{{([^{}]+)}}/g.test(str)) {
25-
return done()
49+
return next()
2650
}
27-
2851
render(str, metalsmithMetadata, function (err, res) {
29-
if (err) return done(err)
52+
if (err) return next(err)
3053
files[file].contents = new Buffer(res)
31-
done()
54+
next()
3255
})
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
56+
}, done)
6157
}

lib/options.js

+38-42
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,47 @@
11
var path = require('path')
22
var metadata = require('read-metadata')
33
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
4+
var getGitUser = require('./git-user')
5+
6+
/**
7+
* Read prompts metadata.
8+
*
9+
* @param {String} dir
10+
* @return {Object}
11+
*/
12+
13+
module.exports = function options (name, dir) {
14+
var file = path.join(dir, 'meta.json')
15+
var opts = exists(file)
16+
? metadata.sync(file)
17+
: {}
18+
19+
setDefault(opts, 'name', name)
20+
21+
var author = getGitUser()
22+
if (author) {
23+
setDefault(opts, 'author', author)
2824
}
2925

30-
/**
31-
* Set the default value for a schema key
32-
*
33-
* @param {Object} opts
34-
* @param {String} key
35-
* @param {String} val
36-
*/
26+
return opts
27+
}
3728

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
29+
/**
30+
* Set the default value for a schema key
31+
*
32+
* @param {Object} opts
33+
* @param {String} key
34+
* @param {String} val
35+
*/
36+
37+
function setDefault (opts, key, val) {
38+
var schema = opts.schema || (opts.schema = {})
39+
if (!schema[key] || typeof schema[key] !== 'object') {
40+
schema[key] = {
41+
'type': 'string',
42+
'default': val
4743
}
44+
} else {
45+
schema[key]['default'] = val
4846
}
49-
50-
return options
5147
}

lib/prompt.js

-39
This file was deleted.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"scripts": {
2626
"test": "npm run lint && npm run e2e",
2727
"lint": "eslint test lib bin/* --env mocha",
28-
"e2e": "rimraf test/e2e/mock-template-build/*.* && BABEL_ENV=development mocha test/e2e/test.js --compilers js:babel-core/register"
28+
"e2e": "rimraf test/e2e/mock-template-build/*.* && BABEL_ENV=development mocha test/e2e/test.js --slow 1000 --compilers js:babel-core/register"
2929
},
3030
"dependencies": {
3131
"async": "^2.0.0-rc.2",

test/e2e/test.js

+11-9
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ const { expect } = require('chai')
22
const fs = require('fs')
33
const path = require('path')
44
const rm = require('rimraf').sync
5-
var exists = require('fs').existsSync
5+
const exists = require('fs').existsSync
66
const crypto = require('crypto')
77
const render = require('consolidate').handlebars.render
8+
const inquirer = require('inquirer')
9+
const generate = require('../../lib/generate')
810

911
const MOCK_TEMPLATE_REPO_PATH = './test/e2e/mock-template-repo'
1012
const MOCK_TEMPLATE_BUILD_PATH = path.resolve('./test/e2e/mock-template-build')
1113

1214
describe('vue-cli', () => {
13-
const options = require('../../lib/options')('test')
1415
const answers = {
1516
name: 'vue-cli-test',
1617
author: 'ziga',
@@ -21,15 +22,16 @@ describe('vue-cli', () => {
2122
}
2223
}
2324

24-
const promptFn = (metalsmithMetadata, key, prompt, cb) => {
25-
metalsmithMetadata[key] = answers[key]
26-
cb()
25+
// monkey patch inquirer
26+
inquirer.prompt = (questions, cb) => {
27+
const key = questions[0].name
28+
const _answers = {}
29+
_answers[key] = answers[key]
30+
cb(_answers)
2731
}
28-
const ask = require('../../lib/ask')(options, promptFn)
29-
const generate = require('../../lib/generate')(ask)
3032

3133
it('template generation', done => {
32-
generate(MOCK_TEMPLATE_REPO_PATH, MOCK_TEMPLATE_BUILD_PATH, err => {
34+
generate('test', MOCK_TEMPLATE_REPO_PATH, MOCK_TEMPLATE_BUILD_PATH, err => {
3335
if (err) done()
3436

3537
const handlebarsPackageJsonFile = fs.readFileSync(`${MOCK_TEMPLATE_REPO_PATH}/template/package.json`, 'utf8')
@@ -51,7 +53,7 @@ describe('vue-cli', () => {
5153
wstream.write(crypto.randomBytes(100))
5254
wstream.end()
5355

54-
generate(MOCK_TEMPLATE_REPO_PATH, MOCK_TEMPLATE_BUILD_PATH, err => {
56+
generate('test', MOCK_TEMPLATE_REPO_PATH, MOCK_TEMPLATE_BUILD_PATH, err => {
5557
if (err) done()
5658

5759
const handlebarsPackageJsonFile = fs.readFileSync(`${MOCK_TEMPLATE_REPO_PATH}/template/package.json`, 'utf8')

0 commit comments

Comments
 (0)