diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..e7f565b --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,220 @@ +{ + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + // http://eslint.org/docs/rules/ + + "ecmaFeatures": { + "binaryLiterals": false, // enable binary literals + "blockBindings": true, // enable let and const (aka block bindings) + "defaultParams": true, // enable default function parameters + "forOf": true, // enable for-of loops + "generators": true, // enable generators + "objectLiteralComputedProperties": false, // enable computed object literal property names + "objectLiteralDuplicateProperties": false, // enable duplicate object literal properties in strict mode + "objectLiteralShorthandMethods": false, // enable object literal shorthand methods + "objectLiteralShorthandProperties": false, // enable object literal shorthand properties + "octalLiterals": false, // enable octal literals + "regexUFlag": false, // enable the regular expression u flag + "regexYFlag": false, // enable the regular expression y flag + "templateStrings": true, // enable template strings + "unicodeCodePointEscapes": false, // enable code point escapes + "jsx": false // enable JSX + }, + + "env": { + "browser": false, // browser global variables. + "node": true, // Node.js global variables and Node.js-specific rules. + "amd": false, // defines require() and define() as global variables as per the amd spec. + "mocha": true, // adds all of the Mocha testing global variables. + "jasmine": false, // adds all of the Jasmine testing global variables for version 1.3 and 2.0. + "phantomjs": false, // phantomjs global variables. + "jquery": false, // jquery global variables. + "prototypejs": false, // prototypejs global variables. + "shelljs": false // shelljs global variables. + }, + + "globals": { + // e.g. "angular": true + }, + + "plugins": [ + // e.g. "react" (must run `npm install eslint-plugin-react` first) + ], + + "rules": { + ////////// Possible Errors ////////// + + "comma-dangle": 2, // disallow trailing commas in object literals + "no-cond-assign": 2, // disallow assignment in conditional expressions + "no-console": 0, // disallow use of console (off by default in the node environment) + "no-constant-condition": 0, // disallow use of constant expressions in conditions + "no-control-regex": 0, // disallow control characters in regular expressions + "no-debugger": 0, // disallow use of debugger + "no-dupe-keys": 2, // disallow duplicate keys when creating object literals + "no-empty": 2, // disallow empty statements + "no-empty-character-class": 2,// disallow the use of empty character classes in regular expressions + "no-ex-assign": 2, // disallow assigning to the exception in a catch block + "no-extra-boolean-cast": 2, // disallow double-negation boolean casts in a boolean context + "no-extra-parens": 2, // disallow unnecessary parentheses (off by default) + "no-extra-semi": 2, // disallow unnecessary semicolons + "no-func-assign": 2, // disallow overwriting functions written as function declarations + "no-inner-declarations": 0, // disallow function or variable declarations in nested blocks + "no-invalid-regexp": 2, // disallow invalid regular expression strings in the RegExp constructor + "no-irregular-whitespace": 2, // disallow irregular whitespace outside of strings and comments + "no-negated-in-lhs": 0, // disallow negation of the left operand of an in expression + "no-obj-calls": 0, // disallow the use of object properties of the global object (Math and JSON) as functions + "no-regex-spaces": 2, // disallow multiple spaces in a regular expression literal + "no-sparse-arrays": 2, // disallow sparse arrays + "no-unreachable": 2, // disallow unreachable statements after a return, throw, continue, or break statement + "use-isnan": 0, // disallow comparisons with the value NaN + "valid-jsdoc": 0, // Ensure JSDoc comments are valid (off by default) + "valid-typeof": 0, // Ensure that the results of typeof are compared against a valid string + + + ////////// Best Practices ////////// + + "block-scoped-var": 0, // treat var statements as if they were block scoped (off by default) + "complexity": 0, // specify the maximum cyclomatic complexity allowed in a program (off by default) + "consistent-return": 0, // require return statements to either always or never specify values + "curly": 0, // specify curly brace conventions for all control statements + "default-case": 0, // require default case in switch statements (off by default) + "dot-notation": 0, // encourages use of dot notation whenever possible + "eqeqeq": 0, // require the use of === and !== + "guard-for-in": 0, // make sure for-in loops have an if statement (off by default) + "no-alert": 0, // disallow the use of alert, confirm, and prompt + "no-caller": 0, // disallow use of arguments.caller or arguments.callee + "no-div-regex": 0, // disallow division operators explicitly at beginning of regular expression (off by default) + "no-else-return": 0, // disallow else after a return in an if (off by default) + "no-empty-label": 0, // disallow use of labels for anything other then loops and switches + "no-eq-null": 0, // disallow comparisons to null without a type-checking operator (off by default) + "no-eval": 0, // disallow use of eval() + "no-extend-native": 0, // disallow adding to native types + "no-extra-bind": 0, // disallow unnecessary function binding + "no-fallthrough": 0, // disallow fallthrough of case statements + "no-floating-decimal": 0, // disallow the use of leading or trailing decimal points in numeric literals (off by default) + "no-implied-eval": 0, // disallow use of eval()-like methods + "no-iterator": 0, // disallow usage of __iterator__ property + "no-labels": 0, // disallow use of labeled statements + "no-lone-blocks": 0, // disallow unnecessary nested blocks + "no-loop-func": 0, // disallow creation of functions within loops + "no-multi-spaces": 0, // disallow use of multiple spaces + "no-multi-str": 0, // disallow use of multiline strings + "no-native-reassign": 0, // disallow reassignments of native objects + "no-new": 0, // disallow use of new operator when not part of the assignment or comparison + "no-new-func": 0, // disallow use of new operator for Function object + "no-new-wrappers": 0, // disallows creating new instances of String, Number, and Boolean + "no-octal": 0, // disallow use of octal literals + "no-octal-escape": 0, // disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251"; + "no-process-env": 0, // disallow use of process.env (off by default) + "no-proto": 2, // disallow usage of __proto__ property + "no-redeclare": 2, // disallow declaring the same variable more then once + "no-return-assign": 2, // disallow use of assignment in return statement + "no-script-url": 0, // disallow use of javascript: urls. + "no-self-compare": 2, // disallow comparisons where both sides are exactly the same (off by default) + "no-sequences": 2, // disallow use of comma operator + "no-unused-expressions": 2, // disallow usage of expressions in statement position + "no-void": 2, // disallow use of void operator (off by default) + "no-warning-comments": 1, // disallow usage of configurable warning terms in comments, e.g. TODO or FIXME (off by default) + "no-with": 0, // disallow use of the with statement + "radix": 2, // require use of the second argument for parseInt() (off by default) + "vars-on-top": 2, // requires to declare all vars on top of their containing scope (off by default) + "wrap-iife": 0, // require immediate function invocation to be wrapped in parentheses (off by default) + "yoda": 0, // require or disallow Yoda conditions + + + ////////// Strict Mode ////////// + + "global-strict": 0, // (deprecated) require or disallow the "use strict" pragma in the global scope (off by default in the node environment) + "no-extra-strict": 0, // (deprecated) disallow unnecessary use of "use strict"; when already in strict mode + "strict": 0, // controls location of Use Strict Directives + + + ////////// Variables ////////// + + "no-catch-shadow": 0, // disallow the catch clause parameter name being the same as a variable in the outer scope (off by default in the node environment) + "no-delete-var": 0, // disallow deletion of variables + "no-label-var": 0, // disallow labels that share a name with a variable + "no-shadow": 0, // disallow declaration of variables already declared in the outer scope + "no-shadow-restricted-names": 0, // disallow shadowing of names such as arguments + "no-undef": 0, // disallow use of undeclared variables unless mentioned in a /*global */ block + "no-undef-init": 0, // disallow use of undefined when initializing variables + "no-undefined": 0, // disallow use of undefined variable (off by default) + "no-unused-vars": 0, // disallow declaration of variables that are not used in the code + "no-use-before-define": 0, // disallow use of variables before they are defined + + + ////////// Node.js ////////// + + "handle-callback-err": 0, // enforces error handling in callbacks (off by default) (on by default in the node environment) + "no-mixed-requires": 0, // disallow mixing regular variable and require declarations (off by default) (on by default in the node environment) + "no-new-require": 0, // disallow use of new operator with the require function (off by default) (on by default in the node environment) + "no-path-concat": 0, // disallow string concatenation with __dirname and __filename (off by default) (on by default in the node environment) + "no-process-exit": 0, // disallow process.exit() (on by default in the node environment) + "no-restricted-modules": 0, // restrict usage of specified node modules (off by default) + "no-sync": 0, // disallow use of synchronous methods (off by default) + + + ////////// Stylistic Issues ////////// + + "brace-style": 0, // enforce one true brace style (off by default) + "camelcase": 0, // require camel case names + "comma-spacing": 0, // enforce spacing before and after comma + "comma-style": 0, // enforce one true comma style (off by default) + "consistent-this": 0, // enforces consistent naming when capturing the current execution context (off by default) + "eol-last": 0, // enforce newline at the end of file, with no multiple empty lines + "func-names": 0, // require function expressions to have a name (off by default) + "func-style": 0, // enforces use of function declarations or expressions (off by default) + "key-spacing": 0, // enforces spacing between keys and values in object literal properties + "max-nested-callbacks": 0, // specify the maximum depth callbacks can be nested (off by default) + "new-cap": 0, // require a capital letter for constructors + "new-parens": 0, // disallow the omission of parentheses when invoking a constructor with no arguments + "no-array-constructor": 0, // disallow use of the Array constructor + "no-inline-comments": 0, // disallow comments inline after code (off by default) + "no-lonely-if": 0, // disallow if as the only statement in an else block (off by default) + "no-mixed-spaces-and-tabs": 0, // disallow mixed spaces and tabs for indentation + "no-multiple-empty-lines": 0, // disallow multiple empty lines (off by default) + "no-nested-ternary": 0, // disallow nested ternary expressions (off by default) + "no-new-object": 0, // disallow use of the Object constructor + "no-space-before-semi": 0, // disallow space before semicolon + "no-spaced-func": 0, // disallow space between function identifier and application + "no-ternary": 0, // disallow the use of ternary operators (off by default) + "no-trailing-spaces": 0, // disallow trailing whitespace at the end of lines + "no-underscore-dangle": 0, // disallow dangling underscores in identifiers + "no-wrap-func": 0, // disallow wrapping of non-IIFE statements in parens + "one-var": 0, // allow just one var statement per function (off by default) + "operator-assignment": 0, // require assignment operator shorthand where possible or prohibit it entirely (off by default) + "padded-blocks": 0, // enforce padding within blocks (off by default) + "quote-props": 0, // require quotes around object literal property names (off by default) + "quotes": 0, // specify whether double or single quotes should be used + "semi": 0, // require or disallow use of semicolons instead of ASI + "sort-vars": 0, // sort variables within the same declaration block (off by default) + "space-after-function-name": 0, // require a space after function names (off by default) + "space-after-keywords": 0, // require a space after certain keywords (off by default) + "space-before-blocks": 0, // require or disallow space before blocks (off by default) + "space-in-brackets": 0, // require or disallow spaces inside brackets (off by default) + "space-in-parens": 0, // require or disallow spaces inside parentheses (off by default) + "space-infix-ops": 0, // require spaces around operators + "space-return-throw-case": 0, // require a space after return, throw, and case + "space-unary-ops": 0, // Require or disallow spaces before/after unary operators (words on by default, nonwords off by default) + "spaced-line-comment": 0, // require or disallow a space immediately following the // in a line comment (off by default) + "wrap-regex": 0, // require regex literals to be wrapped in parentheses (off by default) + + + ////////// ECMAScript 6 ////////// + + "no-var": 2, // require let or const instead of var (off by default) + "generator-star-spacing": 2, // enforce the position of the * in generator functions (off by default) + + + ////////// Legacy ////////// + + "max-depth": 0, // specify the maximum depth that blocks can be nested (off by default) + "max-len": 0, // specify the maximum length of a line in your program (off by default) + "max-params": 0, // limits the number of parameters that can be used in the function declaration. (off by default) + "max-statements": 0, // specify the maximum number of statement allowed in a function (off by default) + "no-bitwise": 0, // disallow use of bitwise operators (off by default) + "no-plusplus": 0 // disallow use of unary operators, ++ and -- (off by default) + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 98f9955..c027a97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules coverage .idea +temp \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..58ba2ad --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "node" + - "6" + - "5" + - "4" \ No newline at end of file diff --git a/README.md b/README.md index c468b69..c0f7838 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ -# Generator-NExT [![NPM version][npm-image]][npm-url] +# Generator-NExT +[![NPM version][npm-image]][npm-url] [![Coverage Status][coveralls-image]][coveralls-url] [![Build Status][travis-image]][travis-url] > Generator that provides a basic setup for a **N**ode project with **Ex**press and **T**ypescript. +![alt tag](assets/generator-next.gif) + ## Installation First, install [Yeoman](http://yeoman.io) and Generator-NExT using [npm](https://www.npmjs.com/) (we assume you have pre-installed [node.js](https://nodejs.org/)). @@ -55,9 +58,12 @@ Check here for available [releases](https://github.com/ommsolutions/generator-ne ## Roadmap - Version 0.3.x: Implement sub generator which adds [pug](https://github.com/pugjs/pug) - Version 0.4.x: Implement sub generator which adds [mongoose](https://github.com/Automattic/mongoose) - Version 1.x.x: Combine all sub generators on demand. + Version 0.3.x: Add test coverage for generator with travis and coveralls + Version 0.4.x: Implement sub generator which adds [typedoc](https://github.com/TypeStrong/typedoc) + Version 0.5.x: Implement sub generator which adds [rxjs](https://github.com/Reactive-Extensions/RxJS) + Version 0.6.x: Implement sub generator which adds [mongoose](https://github.com/Automattic/mongoose) + Version 0.5.x: Implement sub generator which adds [pug](https://github.com/pugjs/pug) + Version 1.x.x: Combine all sub generators combined depending on the user's responses. ## License @@ -65,5 +71,7 @@ MIT [npm-image]: https://badge.fury.io/js/generator-next.svg [npm-url]: https://npmjs.org/package/generator-next -[coveralls-image]: https://coveralls.io/repos/enenkel/generator-next/badge.svg -[coveralls-url]: https://coveralls.io/r/enenkel/generator-next +[coveralls-image]:https://coveralls.io/repos/github/ommsolutions/generator-next/badge.svg?branch=master +[coveralls-url]: https://coveralls.io/github/ommsolutions/generator-next?branch=master +[travis-image]:https://travis-ci.org/ommsolutions/generator-next.svg?branch=master +[travis-url]:https://travis-ci.org/ommsolutions/generator-next?branch=master diff --git a/assets/generator-next.gif b/assets/generator-next.gif new file mode 100644 index 0000000..f41454c Binary files /dev/null and b/assets/generator-next.gif differ diff --git a/generators/app/templates/gulpfile.js b/generators/app/templates/gulpfile.js index a2be584..4e3f510 100644 --- a/generators/app/templates/gulpfile.js +++ b/generators/app/templates/gulpfile.js @@ -1,15 +1,15 @@ -var gulp = require("gulp"); -var sourcemaps = require("gulp-sourcemaps"); -var typescript = require("gulp-typescript"); -var nodemon = require("gulp-nodemon"); -var tslint = require("gulp-tslint"); -var runSequence = require("run-sequence"); -var rimraf = require("rimraf"); -var typedoc = require("gulp-typedoc"); -var mocha = require("gulp-mocha"); -var istanbul = require("gulp-istanbul"); -var plumber = require("gulp-plumber"); -var remapIstanbul = require("remap-istanbul/lib/gulpRemapIstanbul"); +let gulp = require("gulp"); +let sourcemaps = require("gulp-sourcemaps"); +let typescript = require("gulp-typescript"); +let nodemon = require("gulp-nodemon"); +let tslint = require("gulp-tslint"); +let runSequence = require("run-sequence"); +let rimraf = require("rimraf"); +let typedoc = require("gulp-typedoc"); +let mocha = require("gulp-mocha"); +let istanbul = require("gulp-istanbul"); +let plumber = require("gulp-plumber"); +let remapIstanbul = require("remap-istanbul/lib/gulpRemapIstanbul"); const CLEAN_BUILD = "clean:build"; const CLEAN_COVERAGE = "clean:coverage"; @@ -91,7 +91,7 @@ gulp.task(PRETEST, function() { // Run the tests via mocha and generate a istanbul json report. gulp.task(RUN_TESTS, function(callback) { - var mochaError; + let mochaError; gulp.src(JS_TEST_GLOB) .pipe(plumber()) .pipe(mocha({reporter: "spec"})) diff --git a/gulpfile.js b/gulpfile.js index 4840c9d..75aed0e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,28 +1,28 @@ -'use strict'; -var path = require('path'); -var gulp = require('gulp'); -var eslint = require('gulp-eslint'); -var excludeGitignore = require('gulp-exclude-gitignore'); -var mocha = require('gulp-mocha'); -var istanbul = require('gulp-istanbul'); -var nsp = require('gulp-nsp'); -var plumber = require('gulp-plumber'); -var coveralls = require('gulp-coveralls'); - -gulp.task('static', function () { - return gulp.src('**/*.js') +"use strict"; +let path = require("path"); +let gulp = require("gulp"); +let eslint = require("gulp-eslint"); +let excludeGitignore = require("gulp-exclude-gitignore"); +let mocha = require("gulp-mocha"); +let istanbul = require("gulp-istanbul"); +let nsp = require("gulp-nsp"); +let plumber = require("gulp-plumber"); +let coveralls = require("gulp-coveralls"); + +gulp.task("static", function () { + return gulp.src("**/*.js") .pipe(excludeGitignore()) - .pipe(eslint()) + .pipe(eslint(".eslintrc.json")) .pipe(eslint.format()) .pipe(eslint.failAfterError()); }); -gulp.task('nsp', function (cb) { - nsp({package: path.resolve('package.json')}, cb); +gulp.task("nsp", function (cb) { + nsp({package: path.resolve("package.json")}, cb); }); -gulp.task('pre-test', function () { - return gulp.src('generators/**/*.js') +gulp.task("pre-test", function () { + return gulp.src(["generators/**/*.js", "!**/gulpfile.js"]) .pipe(excludeGitignore()) .pipe(istanbul({ includeUntested: true @@ -30,33 +30,34 @@ gulp.task('pre-test', function () { .pipe(istanbul.hookRequire()); }); -gulp.task('test', ['pre-test'], function (cb) { - var mochaErr; +gulp.task("test", ["pre-test"], function (cb) { + let mochaErr; - gulp.src('test/**/*.js') + gulp.src("test/**/*.js") .pipe(plumber()) - .pipe(mocha({reporter: 'spec'})) - .on('error', function (err) { + .pipe(mocha({reporter: "spec"})) + .on("error", function (err) { mochaErr = err; }) .pipe(istanbul.writeReports()) - .on('end', function () { + .on("end", function () { cb(mochaErr); }); }); -gulp.task('watch', function () { - gulp.watch(['generators/**/*.js', 'test/**'], ['test']); +gulp.task("watch", function () { + gulp.watch(["generators/**/*.js", "test/**"], ["test"]); }); -gulp.task('coveralls', ['test'], function () { +gulp.task("coveralls", ["test"], function () { if (!process.env.CI) { + console.log("Not running on CI server -> skipped coveralls"); return; } - return gulp.src(path.join(__dirname, 'coverage/lcov.info')) + return gulp.src(path.join(__dirname, "coverage/lcov.info")) .pipe(coveralls()); }); -gulp.task('prepublish', ['nsp']); -gulp.task('default', ['static', 'test', 'coveralls']); +gulp.task("prepublish", ["nsp"]); +gulp.task("default", ["static", "test", "coveralls"]); diff --git a/package.json b/package.json index 37ffdf5..cd63818 100644 --- a/package.json +++ b/package.json @@ -1,52 +1,48 @@ { - "name": "generator-next", - "version": "0.2.1", - "description": "Generator that provides a basic setup for a Node project with Express and Typescript.", - "homepage": "https://github.com/ommsolutions/generator-next", - "author": { - "name": "Andreas Enenkel", - "email": "ae@omm-solutions.de" - }, - "files": [ - "generators" - ], - "main": "generators/index.js", - "keywords": [ - "Node", - "Express", - "Typescript", - "yeoman-generator" - ], - "dependencies": { - "chalk": "^1.1.3", - "yeoman-generator": "^1.1.0", - "yosay": "^1.2.1" - }, - "devDependencies": { - "eslint": "^3.15.0", - "eslint-config-xo-space": "^0.15.0", - "gulp": "^3.9.1", - "gulp-coveralls": "^0.1.4", - "gulp-eslint": "^3.0.1", - "gulp-exclude-gitignore": "^1.0.0", - "gulp-istanbul": "^1.1.1", - "gulp-line-ending-corrector": "^1.0.1", - "gulp-mocha": "^3.0.1", - "gulp-nsp": "^2.4.2", - "gulp-plumber": "^1.1.0", - "yeoman-assert": "^2.2.3", - "yeoman-test": "^1.6.0" - }, - "eslintConfig": { - "extends": "xo-space", - "env": { - "mocha": true - } - }, - "repository": "https://github.com/ommsolutions/generator-next", - "scripts": { - "prepublish": "gulp prepublish", - "test": "gulp" - }, - "license": "MIT" + "name": "generator-next", + "version": "0.3.0", + "description": "Generator that provides a basic setup for a Node project with Express and Typescript.", + "homepage": "https://github.com/ommsolutions/generator-next", + "author": { + "name": "Andreas Enenkel", + "email": "ae@omm-solutions.de" + }, + "files": [ + "generators" + ], + "main": "generators/index.js", + "keywords": [ + "Node", + "Express", + "Typescript", + "yeoman-generator" + ], + "dependencies": { + "chalk": "^1.1.3", + "yeoman-generator": "^1.1.0", + "yosay": "^1.2.1" + }, + "devDependencies": { + "eslint": "^3.15.0", + "eslint-config-xo-space": "^0.15.0", + "fs-extra": "2.0.0", + "gulp": "^3.9.1", + "gulp-coveralls": "^0.1.4", + "gulp-eslint": "^3.0.1", + "gulp-exclude-gitignore": "^1.0.0", + "gulp-istanbul": "^1.1.1", + "gulp-line-ending-corrector": "^1.0.1", + "gulp-mocha": "^3.0.1", + "gulp-nsp": "^2.4.2", + "gulp-plumber": "^1.1.0", + "rimraf": "2.5.4", + "yeoman-assert": "^2.2.3", + "yeoman-test": "^1.6.0" + }, + "repository": "https://github.com/ommsolutions/generator-next", + "scripts": { + "prepublish": "gulp prepublish", + "test": "gulp" + }, + "license": "MIT" } diff --git a/test/app.js b/test/app.js deleted file mode 100644 index 8a2dc97..0000000 --- a/test/app.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; -var path = require('path'); -var assert = require('yeoman-assert'); -var helpers = require('yeoman-test'); - -describe('generator-next:app', function () { - before(function () { - return helpers.run(path.join(__dirname, '../generators/app')) - .withPrompts({someAnswer: true}) - .toPromise(); - }); - - it('creates files', function () { - assert.file([ - 'package.json' - ]); - }); -}); diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..187bde1 --- /dev/null +++ b/test/test.js @@ -0,0 +1,106 @@ +"use strict"; +const path = require("path"); +const assert = require("yeoman-assert"); +const helpers = require("yeoman-test"); +const fs = require("fs-extra"); +const TEMP_DIR = path.join(__dirname, "temp"); + +/** + * Test suite for the whole project + */ +describe("-- generator-next --", function () { + + /** + * Test suite for the default generator with some mocked prompt responses. + */ + describe("-> generator-next:default", function () { + + let defaultPrompts = { + "project-root": TEMP_DIR, + "user": "John Doe", + "email": "john.doe@testmail.com" + }; + + /** + * Execute the generator in the default temporary directory with the provided prompt responses. + * @param mockedPrompts The responses to each of the generator's prompt. + * @returns {Promise} Resolves when generator has finished with the directory the generator was + * run in. + */ + function generateNExT(mockedPrompts) { + return helpers.run(require.resolve("../generators/app"), false) + .inDir(TEMP_DIR) + .withArguments(["temp"]) + .withPrompts(mockedPrompts) + .withOptions({"skipInstall": true}); + } + + /** + * Clear the contents of the test/temp directory + */ + function cleanUp() { + try { + fs.emptyDirSync(TEMP_DIR); + } catch (e) { + console.log("error", e); + process.exit(1); + } + } + + /** + * Sets mocha timeout for each test to 15 seconds. + */ + beforeEach(function () { + this.timeout(15000); + }); + + afterEach(function () { + cleanUp(); + }); + + /** + * Checks if all files were generated. + */ + describe("Checking file generation", function () { + + /** + * Execute generator and assert that the provided file was generated + * @param relFilePath the file's relative path which should be checked for. + * @returns {Promise} Resolves if file was found, otherwise rejects with stack trace. + */ + function wrapAssertFile(relFilePath) { + return generateNExT(defaultPrompts).then((dir) => assert.file(path.join(dir, relFilePath))); + } + + it("should have generated package.json", () => wrapAssertFile("package.json")); + it("should have generated src/server.ts", () => wrapAssertFile(path.join("src", "server.ts"))); + it("should have generated src/test.ts", () => wrapAssertFile(path.join("src", "test.ts"))); + it("should have generated test/index.ts", () => wrapAssertFile(path.join("test", "index.ts"))); + it("should have generated gulpfile.js", () => wrapAssertFile("gulpfile.js")); + it("should have generated tsconfig.json", () => wrapAssertFile("tsconfig.json")); + it("should have generated tslint.json", () => wrapAssertFile("tslint.json")); + it("should have generated .gitignore", () => wrapAssertFile(".gitignore")); + it("should have generated README.md", () => wrapAssertFile("README.md")); + }); + + /** + * Checks if the files' contents are correct. + */ + describe("Checking file content", function () { + + /** + * Assert some regex content for the file at the provided relative path + * @param relFilePath The file's relative path to match with the regex. + * @param regexToExpect The regex to match with + * @returns {Promise} Resolves if the regex matches, rejects with the stack otherwise. + */ + function wrapAssertFileContent(relFilePath, regexToExpect) { + return generateNExT(defaultPrompts).then((dir) => + assert.fileContent(path.join(dir, relFilePath), regexToExpect)); + } + + it("should have set author name", () => + wrapAssertFileContent("package.json", new RegExp(defaultPrompts.name))); + }); + }); +});