Skip to content

Commit d917298

Browse files
watildeyyx990803
authored andcommitted
Add validation for package name in vue init (#73)
* npm install --save validate-npm-package-name * Add validation for package name in vue init * Add test case for validation
1 parent fa868e9 commit d917298

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

lib/ask.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ function prompt (data, key, prompt, done) {
4141
name: key,
4242
message: prompt.message || prompt.label || key,
4343
default: prompt.default,
44-
choices: prompt.choices || []
44+
choices: prompt.choices || [],
45+
validate: prompt.validate || function () { return true }
4546
}], function (answers) {
4647
if (Array.isArray(answers[key])) {
4748
data[key] = {}

lib/options.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var path = require('path')
22
var metadata = require('read-metadata')
33
var exists = require('fs').existsSync
44
var getGitUser = require('./git-user')
5+
var validateName = require('validate-npm-package-name')
56

67
/**
78
* Read prompts metadata.
@@ -17,6 +18,7 @@ module.exports = function options (name, dir) {
1718
: {}
1819

1920
setDefault(opts, 'name', name)
21+
setValidateName(opts)
2022

2123
var author = getGitUser()
2224
if (author) {
@@ -49,3 +51,14 @@ function setDefault (opts, key, val) {
4951
prompts[key]['default'] = val
5052
}
5153
}
54+
55+
function setValidateName (opts) {
56+
opts.prompts.name.validate = function (name) {
57+
var its = validateName(name)
58+
if (!its.validForNewPackages) {
59+
var errors = (its.errors || []).concat(its.warnings || [])
60+
return 'Sorry, ' + errors.join(' and ') + '.'
61+
}
62+
return true
63+
}
64+
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
"request": "^2.67.0",
4343
"rimraf": "^2.5.0",
4444
"semver": "^5.1.0",
45-
"uid": "0.0.2"
45+
"uid": "0.0.2",
46+
"validate-npm-package-name": "^2.2.2"
4647
},
4748
"devDependencies": {
4849
"babel-core": "^6.7.4",

test/e2e/test.js

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,27 @@ const crypto = require('crypto')
77
const render = require('consolidate').handlebars.render
88
const inquirer = require('inquirer')
99
const async = require('async')
10+
const extend = Object.assign || require('util')._extend
1011
const generate = require('../../lib/generate')
1112

1213
const MOCK_TEMPLATE_REPO_PATH = './test/e2e/mock-template-repo'
1314
const MOCK_TEMPLATE_BUILD_PATH = path.resolve('./test/e2e/mock-template-build')
1415

16+
function monkeyPatchInquirer(answers) {
17+
// monkey patch inquirer
18+
inquirer.prompt = (questions, cb) => {
19+
const key = questions[0].name
20+
const _answers = {}
21+
const validate = questions[0].validate
22+
const valid = validate(answers[key])
23+
if (valid !== true) {
24+
throw new Error(valid)
25+
}
26+
_answers[key] = answers[key]
27+
cb(_answers)
28+
};
29+
}
30+
1531
describe('vue-cli', () => {
1632
const answers = {
1733
name: 'vue-cli-test',
@@ -24,15 +40,8 @@ describe('vue-cli', () => {
2440
pick: 'no'
2541
}
2642

27-
// monkey patch inquirer
28-
inquirer.prompt = (questions, cb) => {
29-
const key = questions[0].name
30-
const _answers = {}
31-
_answers[key] = answers[key]
32-
cb(_answers)
33-
}
34-
3543
it('template generation', done => {
44+
monkeyPatchInquirer(answers)
3645
generate('test', MOCK_TEMPLATE_REPO_PATH, MOCK_TEMPLATE_BUILD_PATH, err => {
3746
if (err) done(err)
3847

@@ -56,6 +65,7 @@ describe('vue-cli', () => {
5665
})
5766

5867
it('avoid rendering files that do not have mustaches', done => {
68+
monkeyPatchInquirer(answers)
5969
const binFilePath = `${MOCK_TEMPLATE_REPO_PATH}/template/bin.file`
6070
const wstream = fs.createWriteStream(binFilePath)
6171
wstream.write(crypto.randomBytes(100))
@@ -79,4 +89,14 @@ describe('vue-cli', () => {
7989
})
8090
})
8191
})
92+
93+
it('validate input value', done => {
94+
// deep copy
95+
var invalidName = extend({}, answers, {name: 'INVALID-NAME'})
96+
monkeyPatchInquirer(invalidName)
97+
generate('INVALID-NAME', MOCK_TEMPLATE_REPO_PATH, MOCK_TEMPLATE_BUILD_PATH, err => {
98+
expect(err).to.be.an('error');
99+
done()
100+
})
101+
})
82102
})

0 commit comments

Comments
 (0)