Skip to content

Commit a8210d6

Browse files
committed
package - updated project info
gruntfile - replaced connect based tasks with express compatible tasks _package - updated generated dependencies tests - made tests compatible with windows, updated commands to new project name templates - added server starter file
1 parent 73f8019 commit a8210d6

File tree

7 files changed

+117
-64
lines changed

7 files changed

+117
-64
lines changed

app/index.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ var Generator = module.exports = function Generator(args, options) {
4040
args.push('--minsafe');
4141
}
4242

43-
this.hookFor('angular:common', {
43+
this.hookFor('angular-fullstack:common', {
4444
args: args
4545
});
4646

47-
this.hookFor('angular:main', {
47+
this.hookFor('angular-fullstack:main', {
4848
args: args
4949
});
5050

51-
this.hookFor('angular:controller', {
51+
this.hookFor('angular-fullstack:controller', {
5252
args: args
5353
});
5454

@@ -258,3 +258,7 @@ Generator.prototype.packageFiles = function () {
258258
this.template('../../templates/common/_package.json', 'package.json');
259259
this.template('../../templates/common/Gruntfile.js', 'Gruntfile.js');
260260
};
261+
262+
Generator.prototype.serverFiles = function () {
263+
this.template('../../templates/express/server.js', 'server.js');
264+
};

package.json

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
{
2-
"name": "generator-angular",
3-
"version": "0.5.1",
4-
"description": "Yeoman generator for AngularJS",
2+
"name": "generator-angular-fullstack",
3+
"version": "0.0.1",
4+
"description": "Yeoman generator for AngularJS with Express server",
55
"keywords": [
66
"yeoman-generator",
77
"scaffold",
8+
"express",
9+
"fullstack",
810
"framework",
911
"component",
1012
"front-end",
1113
"app"
1214
],
13-
"homepage": "https://github.com/yeoman/generator-angular",
14-
"bugs": "https://github.com/yeoman/generator-angular/issues",
15-
"author": "Chrome Developer Relations",
15+
"homepage": "https://github.com/DaftMonk/generator-angular-fullstack",
16+
"bugs": "https://github.com/DaftMonk/generator-angular-fullstack/issues",
17+
"author": "Tyler Henkel",
1618
"main": "app/index.js",
1719
"repository": {
1820
"type": "git",
19-
"url": "git://github.com/yeoman/generator-angular.git"
21+
"url": "git://github.com/DaftMonk/generator-angular-fullstack.git"
2022
},
2123
"scripts": {
2224
"test": "mocha"

templates/common/Gruntfile.js

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,27 @@ module.exports = function (grunt) {
1717
app: require('./bower.json').appPath || 'app',
1818
dist: 'dist'
1919
},
20+
express: {
21+
options: {
22+
port: process.env.PORT || 9000
23+
},
24+
dev: {
25+
options: {
26+
script: 'server.js'
27+
}
28+
},
29+
prod: {
30+
options: {
31+
script: 'server.js',
32+
node_env: 'production'
33+
}
34+
}
35+
},
36+
open: {
37+
server: {
38+
url: 'http://localhost:<%%= express.options.port %>'
39+
}
40+
},
2041
watch: {
2142
coffee: {
2243
files: ['<%%= yeoman.app %>/scripts/{,*/}*.coffee'],
@@ -30,20 +51,24 @@ module.exports = function (grunt) {
3051
files: ['<%%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
3152
tasks: ['compass:server', 'autoprefixer']
3253
},<% } %>
54+
express: {
55+
files: [
56+
'<%%= yeoman.app %>/{,*//*}*.html',
57+
'{.tmp,<%= yeoman.app %>}/styles/{,*//*}*.css',
58+
'{.tmp,<%= yeoman.app %>}/scripts/{,*//*}*.js',
59+
'<%%= yeoman.app %>/images/{,*//*}*.{png,jpg,jpeg,gif,webp,svg}',
60+
'server.js',
61+
'server/{,*//*}*.{js,json}'
62+
],
63+
tasks: ['express:dev'],
64+
options: {
65+
livereload: true,
66+
nospawn: true //Without this option specified express won't be reloaded
67+
}
68+
},
3369
styles: {
3470
files: ['<%%= yeoman.app %>/styles/{,*/}*.css'],
3571
tasks: ['copy:styles', 'autoprefixer']
36-
},
37-
livereload: {
38-
options: {
39-
livereload: '<%%= connect.options.livereload %>'
40-
},
41-
files: [
42-
'<%%= yeoman.app %>/{,*/}*.html',
43-
'.tmp/styles/{,*/}*.css',
44-
'{.tmp,<%%= yeoman.app %>}/scripts/{,*/}*.js',
45-
'<%%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
46-
]
4772
}
4873
},
4974
autoprefixer: {
@@ -57,38 +82,6 @@ module.exports = function (grunt) {
5782
}]
5883
}
5984
},
60-
connect: {
61-
options: {
62-
port: 9000,
63-
// Change this to '0.0.0.0' to access the server from outside.
64-
hostname: 'localhost',
65-
livereload: 35729
66-
},
67-
livereload: {
68-
options: {
69-
open: true,
70-
base: [
71-
'.tmp',
72-
'<%%= yeoman.app %>'
73-
]
74-
}
75-
},
76-
test: {
77-
options: {
78-
port: 9001,
79-
base: [
80-
'.tmp',
81-
'test',
82-
'<%%= yeoman.app %>'
83-
]
84-
}
85-
},
86-
dist: {
87-
options: {
88-
base: '<%%= yeoman.dist %>'
89-
}
90-
}
91-
},
9285
clean: {
9386
dist: {
9487
files: [{
@@ -324,16 +317,21 @@ module.exports = function (grunt) {
324317
}
325318
});
326319

320+
grunt.registerTask('express-keepalive', 'Keep grunt running', function() {
321+
this.async();
322+
});
323+
327324
grunt.registerTask('server', function (target) {
328325
if (target === 'dist') {
329-
return grunt.task.run(['build', 'connect:dist:keepalive']);
326+
return grunt.task.run(['build', 'express:prod', 'open', 'express-keepalive']);
330327
}
331328

332329
grunt.task.run([
333330
'clean:server',
334331
'concurrent:server',
335332
'autoprefixer',
336-
'connect:livereload',
333+
'express:dev',
334+
'open',
337335
'watch'
338336
]);
339337
});
@@ -342,7 +340,6 @@ module.exports = function (grunt) {
342340
'clean:server',
343341
'concurrent:test',
344342
'autoprefixer',
345-
'connect:test',
346343
'karma'
347344
]);
348345

templates/common/_package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
{
22
"name": "<%= _.slugify(appname) %>",
33
"version": "0.0.0",
4-
"dependencies": {},
4+
"dependencies": {
5+
"express": "~3.4.3"
6+
},
57
"devDependencies": {
68
"grunt": "~0.4.1",
79
"grunt-contrib-copy": "~0.4.1",
@@ -11,7 +13,8 @@
1113
"grunt-contrib-compass": "~0.5.0",
1214
"grunt-contrib-jshint": "~0.6.0",
1315
"grunt-contrib-cssmin": "~0.6.0",
14-
"grunt-contrib-connect": "~0.5.0",
16+
"grunt-express-server": "~0.4.5",
17+
"grunt-open": "~0.2.0",
1518
"grunt-contrib-clean": "~0.5.0",
1619
"grunt-contrib-htmlmin": "~0.1.3",
1720
"grunt-contrib-imagemin": "~0.2.0",

templates/express/server.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Module dependencies.
3+
*/
4+
5+
var express = require('express')
6+
, http = require('http')
7+
, path = require('path');
8+
9+
var app = express();
10+
11+
// all environments
12+
app.set('port', process.env.PORT || 3000);
13+
14+
app.use(express.favicon());
15+
app.use(express.logger('dev'));
16+
app.use(express.bodyParser());
17+
app.use(express.methodOverride());
18+
app.use(app.router);
19+
20+
// development only
21+
if ('production' == app.get('env')) {
22+
app.use(express.static(path.join(__dirname, 'dist')));
23+
} else {
24+
app.use(express.static(path.join(__dirname, '.tmp')));
25+
app.use(express.static(path.join(__dirname, 'app')));
26+
app.use(express.errorHandler());
27+
}
28+
29+
http.createServer(app).listen(app.get('port'), function () {
30+
console.log("Express server listening on port %d in %s mode", app.get('port'), app.get('env'));
31+
});

test/test-appname-substitution.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('Angular generator template mechanism', function () {
2727
if (err) {
2828
done(err);
2929
}
30-
angular = helpers.createGenerator('angular:app', deps);
30+
angular = helpers.createGenerator('angular-fullstack:app', deps);
3131
angular.options['skip-install'] = true;
3232
done();
3333
});

test/test-file-creation.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,26 @@ describe('Angular generator', function () {
2121
'karma:app'
2222
]
2323
];
24-
helpers.testDirectory(path.join(__dirname, 'temp'), function (err) {
24+
var p = path.join(__dirname, 'temp');
25+
var busyTries = 0;
26+
var busyTriesMax = 3;
27+
helpers.testDirectory(p, function CB (err) {
2528
if (err) {
29+
//For Windows users
30+
if (err.code === "EBUSY" && busyTries < busyTriesMax) {
31+
if(process.cwd() === p && process.platform === "win32"){
32+
process.chdir(path.join(p, '..'));
33+
}
34+
busyTries++;
35+
var time = busyTries * 100;
36+
// try again, with the same exact callback as this one.
37+
return setTimeout(function () {
38+
helpers.testDirectory(p, CB)
39+
}, time)
40+
}
2641
done(err);
2742
}
28-
angular = helpers.createGenerator('angular:app', deps);
43+
angular = helpers.createGenerator('angular-fullstack:app', deps);
2944
angular.options['skip-install'] = true;
3045
done();
3146
});
@@ -54,6 +69,7 @@ describe('Angular generator', function () {
5469
['.bowerrc', /"directory": "app\/bower_components"/],
5570
'Gruntfile.js',
5671
'package.json',
72+
'server.js',
5773
['bower.json', /"name":\s+"temp"/],
5874
'app/scripts/app.js',
5975
'app/index.html',
@@ -129,7 +145,7 @@ describe('Angular generator', function () {
129145
var angularGenerator;
130146
var name = 'foo';
131147
var deps = [path.join('../..', generatorType)];
132-
angularGenerator = helpers.createGenerator('angular:' + generatorType, deps, [name]);
148+
angularGenerator = helpers.createGenerator('angular-fullstack:' + generatorType, deps, [name]);
133149

134150
helpers.mockPrompt(angular, {
135151
bootstrap: true,
@@ -195,7 +211,7 @@ describe('Angular generator', function () {
195211
it('should generate a new view', function (done) {
196212
var angularView;
197213
var deps = ['../../view'];
198-
angularView = helpers.createGenerator('angular:view', deps, ['foo']);
214+
angularView = helpers.createGenerator('angular-fullstack:view', deps, ['foo']);
199215

200216
helpers.mockPrompt(angular, {
201217
bootstrap: true,
@@ -215,7 +231,7 @@ describe('Angular generator', function () {
215231
it('should generate a new view in subdirectories', function (done) {
216232
var angularView;
217233
var deps = ['../../view'];
218-
angularView = helpers.createGenerator('angular:view', deps, ['foo/bar']);
234+
angularView = helpers.createGenerator('angular-fullstack:view', deps, ['foo/bar']);
219235

220236
helpers.mockPrompt(angular, {
221237
bootstrap: true,

0 commit comments

Comments
 (0)