diff --git a/app/index.js b/app/index.js index efd6b1a..416340e 100644 --- a/app/index.js +++ b/app/index.js @@ -101,9 +101,9 @@ module.exports = generators.Base.extend({ this.props.name = _.kebabCase(this.props.name); var validationResults = validate(this.props.name); - var isValid = validationResults.validForNewPackages; + var isValidName = validationResults.validForNewPackages; - if(!isValid) { + if(!isValidName) { var warnings = validationResults.warnings; var error = new Error('Your project name ' + this.props.name + ' is not ' + 'valid. Please try another name. Reason: ' + warnings[0]); @@ -111,6 +111,17 @@ module.exports = generators.Base.extend({ return; } + if (path.isAbsolute(this.props.folder)) { + this.props.folder = path.relative(this.destinationPath(), this.props.folder); + } + var isValidPath = !this.props.folder.includes('../'); + if (!isValidPath) { + var error = new Error('Your project main folder ' + this.props.folder + ' is external ' + + 'to the project folder. Please set to internal path.'); + done(error); + return; + } + done(); }.bind(this)); }.bind(this)); @@ -120,11 +131,6 @@ module.exports = generators.Base.extend({ var pkgName = this.props.name; var pkgMain = pkgName + '/index.stache!done-autorender'; - if (path.isAbsolute(this.props.folder)) { - var cd = __dirname; - this.props.folder = path.relative(cd, this.props.folder); - } - var self = this; var pkgJsonFields = { name: pkgName, diff --git a/test/app.test.js b/test/app.test.js index c5cde4c..1486d4a 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -1,5 +1,7 @@ var assert = require('assert'); var path = require('path'); +var fs = require('fs'); +var os = require('os'); var helpers = require('yeoman-generator').test; var exec = require('child_process').exec; var donejsPackage = require('donejs-cli/package.json'); @@ -41,12 +43,8 @@ describe('generator-donejs', function () { }); it('fails with an invalid package name', function (done) { - var tmpDir; helpers.run(path.join(__dirname, '../app')) - .inTmpDir(function (dir) { - tmpDir = dir; - }) .withOptions({ packages: donejsPackage.donejs, skipInstall: true @@ -63,20 +61,20 @@ describe('generator-donejs', function () { }); describe('Absolute path support', function() { - var tmpDir; - before(function(done) { helpers.run(path.join(__dirname, '../app')) - .inTmpDir(function(dir) { - tmpDir = dir; + .inTmpDir(function (dir) { + this.withPrompts({ + folder: path.join(fs.realpathSync(dir), '/src') + }) }) .withOptions({ packages: donejsPackage.donejs, skipInstall: true }) - .withPrompts({ - folder: path.join(__dirname, "../app/src") - }).on('end', done); + .on('end', function() { + done(); + }) }); it('set relative path name', function() { @@ -90,6 +88,25 @@ describe('generator-donejs', function () { }); }); + describe('External path will error', function() { + it("fails with external path", function(done) { + helpers.run(path.join(__dirname, '../app')) + .withPrompts({ + folder: os.homedir() + }) + .withOptions({ + packages: donejsPackage.donejs, + skipInstall: true + }) + .on('error', function(err){ + var msg = err.message; + console.log(msg); + assert(/is external/.test(msg), 'Error because of invalid external folder path'); + done(); + }); + }); + }); + describe('NPM 3 support', function(){ before(function(done){ var test = this;