Support ngmin

This commit is contained in:
Amos Haviv
2014-05-20 18:58:10 +03:00
parent 6354178e12
commit 30f977cb38
3 changed files with 469 additions and 372 deletions

View File

@@ -1,7 +1,6 @@
'use strict';
module.exports = function(grunt) {
<<<<<<< HEAD
// Project Configuration
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
@@ -62,7 +61,7 @@ module.exports = function(grunt) {
mangle: false
},
files: {
'public/dist/application.min.js': '<%= applicationJavaScriptFiles %>'
'public/dist/application.min.js': 'public/dist/application.js'
}
}
},
@@ -94,6 +93,13 @@ module.exports = function(grunt) {
}
}
},
ngmin: {
production: {
files: {
'public/dist/application.js': '<%= applicationJavaScriptFiles %>'
}
}
},
concurrent: {
default: ['nodemon', 'watch'],
debug: ['nodemon', 'watch', 'node-inspector'],
@@ -119,118 +125,6 @@ module.exports = function(grunt) {
}
}
});
=======
// Project Configuration
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
serverViews: {
files: ['app/views/**'],
options: {
livereload: true,
}
},
serverJS: {
files: ['gruntfile.js', 'server.js', 'config/**/*.js', 'app/**/*.js'],
tasks: ['jshint'],
options: {
livereload: true,
}
},
clientViews: {
files: ['public/modules/**/views/*.html'],
options: {
livereload: true,
}
},
clientJS: {
files: ['public/js/**/*.js', 'public/modules/**/*.js'],
tasks: ['jshint'],
options: {
livereload: true,
}
},
clientCSS: {
files: ['public/**/css/*.css'],
tasks: ['csslint'],
options: {
livereload: true,
}
}
},
jshint: {
all: {
src: ['gruntfile.js', 'server.js', 'config/**/*.js', 'app/**/*.js', 'public/js/**/*.js', 'public/modules/**/*.js'],
options: {
jshintrc: true
}
}
},
csslint: {
options: {
csslintrc: '.csslintrc',
},
all: {
src: ['public/modules/**/css/*.css']
}
},
ngmin: {
production: {
files: {
'public/dist/application.js': '<%= applicationJavaScriptFiles %>'
}
}
},
uglify: {
production: {
options: {
mangle: false
},
files: {
'public/dist/application.min.js': 'public/dist/application.js'
}
}
},
cssmin: {
combine: {
files: {
'public/dist/application.min.css': '<%= applicationCSSFiles %>'
}
}
},
nodemon: {
dev: {
script: 'server.js',
options: {
nodeArgs: ['--debug']
}
}
},
concurrent: {
tasks: ['nodemon', 'watch'],
options: {
logConcurrentOutput: true
}
},
env: {
test: {
NODE_ENV: 'test'
}
},
mochaTest: {
src: ['app/tests/**/*.js'],
options: {
reporter: 'spec',
require: 'server.js'
}
},
karma: {
unit: {
configFile: 'karma.conf.js'
}
}
});
>>>>>>> pr/72
// Load NPM tasks
require('load-grunt-tasks')(grunt);
@@ -248,26 +142,17 @@ module.exports = function(grunt) {
});
// Default task(s).
grunt.registerTask('default', ['jshint', 'csslint', 'concurrent:default']);
grunt.registerTask('default', ['lint', 'concurrent:default']);
// Debug task.
grunt.registerTask('debug', ['jshint', 'csslint', 'concurrent:debug']);
grunt.registerTask('debug', ['lint', 'concurrent:debug']);
<<<<<<< HEAD
// Lint task(s).
grunt.registerTask('lint', ['jshint', 'csslint']);
// Build task(s).
grunt.registerTask('build', ['jshint', 'csslint', 'loadConfig', 'uglify', 'cssmin']);
grunt.registerTask('build', ['lint', 'loadConfig', 'ngmin', 'uglify', 'cssmin']);
// Test task.
grunt.registerTask('test', ['env:test', 'mochaTest', 'karma:unit']);
};
=======
// Build task(s).
grunt.registerTask('build', ['jshint', 'csslint', 'loadConfig', 'ngmin', 'uglify', 'cssmin']);
// Test task.
grunt.registerTask('test', ['env:test', 'mochaTest', 'karma:unit']);
};
>>>>>>> pr/72
};

456
public/dist/application.js vendored Normal file
View File

@@ -0,0 +1,456 @@
'use strict';
// Init the application configuration module for AngularJS application
var ApplicationConfiguration = function () {
// Init module configuration options
var applicationModuleName = 'mean';
var applicationModuleVendorDependencies = [
'ngResource',
'ngAnimate',
'ui.router',
'ui.bootstrap',
'ui.utils'
];
// Add a new vertical module
var registerModule = function (moduleName) {
// Create angular module
angular.module(moduleName, []);
// Add the module to the AngularJS configuration file
angular.module(applicationModuleName).requires.push(moduleName);
};
return {
applicationModuleName: applicationModuleName,
applicationModuleVendorDependencies: applicationModuleVendorDependencies,
registerModule: registerModule
};
}();'use strict';
//Start by defining the main module and adding the module dependencies
angular.module(ApplicationConfiguration.applicationModuleName, ApplicationConfiguration.applicationModuleVendorDependencies);
// Setting HTML5 Location Mode
angular.module(ApplicationConfiguration.applicationModuleName).config([
'$locationProvider',
function ($locationProvider) {
$locationProvider.hashPrefix('!');
}
]);
//Then define the init function for starting up the application
angular.element(document).ready(function () {
//Fixing facebook bug with redirect
if (window.location.hash === '#_=_')
window.location.hash = '#!';
//Then init the app
angular.bootstrap(document, [ApplicationConfiguration.applicationModuleName]);
});'use strict';
// Use Applicaion configuration module to register a new module
ApplicationConfiguration.registerModule('articles');'use strict';
// Use Applicaion configuration module to register a new module
ApplicationConfiguration.registerModule('core');'use strict';
// Use Applicaion configuration module to register a new module
ApplicationConfiguration.registerModule('users');'use strict';
// Configuring the Articles module
angular.module('articles').run([
'Menus',
function (Menus) {
// Set top bar menu items
Menus.addMenuItem('topbar', 'Articles', 'articles', 'dropdown');
Menus.addSubMenuItem('topbar', 'articles', 'List Articles', 'articles');
Menus.addSubMenuItem('topbar', 'articles', 'New Article', 'articles/create');
}
]);'use strict';
// Setting up route
angular.module('articles').config([
'$stateProvider',
function ($stateProvider) {
// Articles state routing
$stateProvider.state('listArticles', {
url: '/articles',
templateUrl: 'modules/articles/views/list-articles.client.view.html'
}).state('createArticle', {
url: '/articles/create',
templateUrl: 'modules/articles/views/create-article.client.view.html'
}).state('viewArticle', {
url: '/articles/:articleId',
templateUrl: 'modules/articles/views/view-article.client.view.html'
}).state('editArticle', {
url: '/articles/:articleId/edit',
templateUrl: 'modules/articles/views/edit-article.client.view.html'
});
}
]);'use strict';
angular.module('articles').controller('ArticlesController', [
'$scope',
'$stateParams',
'$location',
'Authentication',
'Articles',
function ($scope, $stateParams, $location, Authentication, Articles) {
$scope.authentication = Authentication;
$scope.create = function () {
var article = new Articles({
title: this.title,
content: this.content
});
article.$save(function (response) {
$location.path('articles/' + response._id);
}, function (errorResponse) {
$scope.error = errorResponse.data.message;
});
this.title = '';
this.content = '';
};
$scope.remove = function (article) {
if (article) {
article.$remove();
for (var i in $scope.articles) {
if ($scope.articles[i] === article) {
$scope.articles.splice(i, 1);
}
}
} else {
$scope.article.$remove(function () {
$location.path('articles');
});
}
};
$scope.update = function () {
var article = $scope.article;
article.$update(function () {
$location.path('articles/' + article._id);
}, function (errorResponse) {
$scope.error = errorResponse.data.message;
});
};
$scope.find = function () {
$scope.articles = Articles.query();
};
$scope.findOne = function () {
$scope.article = Articles.get({ articleId: $stateParams.articleId });
};
}
]);'use strict';
//Articles service used for communicating with the articles REST endpoints
angular.module('articles').factory('Articles', [
'$resource',
function ($resource) {
return $resource('articles/:articleId', { articleId: '@_id' }, { update: { method: 'PUT' } });
}
]);'use strict';
// Setting up route
angular.module('core').config([
'$stateProvider',
'$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
// Redirect to home view when route not found
$urlRouterProvider.otherwise('/');
// Home state routing
$stateProvider.state('home', {
url: '/',
templateUrl: 'modules/core/views/home.client.view.html'
});
}
]);'use strict';
angular.module('core').controller('HeaderController', [
'$scope',
'Authentication',
'Menus',
function ($scope, Authentication, Menus) {
$scope.authentication = Authentication;
$scope.isCollapsed = false;
$scope.menu = Menus.getMenu('topbar');
$scope.toggleCollapsibleMenu = function () {
$scope.isCollapsed = !$scope.isCollapsed;
};
}
]);'use strict';
angular.module('core').controller('HomeController', [
'$scope',
'Authentication',
function ($scope, Authentication) {
// This provides Authentication context.
$scope.authentication = Authentication;
}
]);'use strict';
//Menu service used for managing menus
angular.module('core').service('Menus', [function () {
// Define a set of default roles
this.defaultRoles = ['user'];
// Define the menus object
this.menus = {};
// A private function for rendering decision
var shouldRender = function (user) {
if (user) {
for (var userRoleIndex in user.roles) {
for (var roleIndex in this.roles) {
if (this.roles[roleIndex] === user.roles[userRoleIndex]) {
return true;
}
}
}
} else {
return this.isPublic;
}
return false;
};
// Validate menu existance
this.validateMenuExistance = function (menuId) {
if (menuId && menuId.length) {
if (this.menus[menuId]) {
return true;
} else {
throw new Error('Menu does not exists');
}
} else {
throw new Error('MenuId was not provided');
}
return false;
};
// Get the menu object by menu id
this.getMenu = function (menuId) {
// Validate that the menu exists
this.validateMenuExistance(menuId);
// Return the menu object
return this.menus[menuId];
};
// Add new menu object by menu id
this.addMenu = function (menuId, isPublic, roles) {
// Create the new menu
this.menus[menuId] = {
isPublic: isPublic || false,
roles: roles || this.defaultRoles,
items: [],
shouldRender: shouldRender
};
// Return the menu object
return this.menus[menuId];
};
// Remove existing menu object by menu id
this.removeMenu = function (menuId) {
// Validate that the menu exists
this.validateMenuExistance(menuId);
// Return the menu object
delete this.menus[menuId];
};
// Add menu item object
this.addMenuItem = function (menuId, menuItemTitle, menuItemURL, menuClass, menuItemUIRoute, isPublic, roles) {
// Validate that the menu exists
this.validateMenuExistance(menuId);
// Push new menu item
this.menus[menuId].items.push({
title: menuItemTitle,
link: menuItemURL,
menuClass: menuClass || '',
uiRoute: menuItemUIRoute || '/' + menuItemURL,
isPublic: isPublic || this.menus[menuId].isPublic,
roles: roles || this.defaultRoles,
items: [],
shouldRender: shouldRender
});
// Return the menu object
return this.menus[menuId];
};
// Add submenu item object
this.addSubMenuItem = function (menuId, rootMenuItemURL, menuItemTitle, menuItemURL, menuItemUIRoute, isPublic, roles) {
// Validate that the menu exists
this.validateMenuExistance(menuId);
// Search for menu item
for (var itemIndex in this.menus[menuId].items) {
if (this.menus[menuId].items[itemIndex].link === rootMenuItemURL) {
// Push new submenu item
this.menus[menuId].items[itemIndex].items.push({
title: menuItemTitle,
link: menuItemURL,
uiRoute: menuItemUIRoute || '/' + menuItemURL,
isPublic: isPublic || this.menus[menuId].isPublic,
roles: roles || this.defaultRoles,
shouldRender: shouldRender
});
}
}
// Return the menu object
return this.menus[menuId];
};
// Remove existing menu object by menu id
this.removeMenuItem = function (menuId, menuItemURL) {
// Validate that the menu exists
this.validateMenuExistance(menuId);
// Search for menu item to remove
for (var itemIndex in this.menus[menuId].items) {
if (this.menus[menuId].items[itemIndex].link === menuItemURL) {
this.menus[menuId].items.splice(itemIndex, 1);
}
}
// Return the menu object
return this.menus[menuId];
};
// Remove existing menu object by menu id
this.removeSubMenuItem = function (menuId, submenuItemURL) {
// Validate that the menu exists
this.validateMenuExistance(menuId);
// Search for menu item to remove
for (var itemIndex in this.menus[menuId].items) {
for (var subitemIndex in this.menus[menuId].items[itemIndex].items) {
if (this.menus[menuId].items[itemIndex].items[subitemIndex].link === submenuItemURL) {
this.menus[menuId].items[itemIndex].items.splice(subitemIndex, 1);
}
}
}
// Return the menu object
return this.menus[menuId];
};
//Adding the topbar menu
this.addMenu('topbar');
}]);'use strict';
// Config HTTP Error Handling
angular.module('users').config([
'$httpProvider',
function ($httpProvider) {
// Set the httpProvider "not authorized" interceptor
$httpProvider.interceptors.push([
'$q',
'$location',
'Authentication',
function ($q, $location, Authentication) {
return {
responseError: function (rejection) {
switch (rejection.status) {
case 401:
// Deauthenticate the global user
Authentication.user = null;
// Redirect to signin page
$location.path('signin');
break;
case 403:
// Add unauthorized behaviour
break;
}
return $q.reject(rejection);
}
};
}
]);
}
]);'use strict';
// Setting up route
angular.module('users').config([
'$stateProvider',
function ($stateProvider) {
// Users state routing
$stateProvider.state('profile', {
url: '/settings/profile',
templateUrl: 'modules/users/views/settings/edit-profile.client.view.html'
}).state('password', {
url: '/settings/password',
templateUrl: 'modules/users/views/settings/change-password.client.view.html'
}).state('accounts', {
url: '/settings/accounts',
templateUrl: 'modules/users/views/settings/social-accounts.client.view.html'
}).state('signup', {
url: '/signup',
templateUrl: 'modules/users/views/signup.client.view.html'
}).state('signin', {
url: '/signin',
templateUrl: 'modules/users/views/signin.client.view.html'
});
}
]);'use strict';
angular.module('users').controller('AuthenticationController', [
'$scope',
'$http',
'$location',
'Authentication',
function ($scope, $http, $location, Authentication) {
$scope.authentication = Authentication;
//If user is signed in then redirect back home
if ($scope.authentication.user)
$location.path('/');
$scope.signup = function () {
$http.post('/auth/signup', $scope.credentials).success(function (response) {
//If successful we assign the response to the global user model
$scope.authentication.user = response;
//And redirect to the index page
$location.path('/');
}).error(function (response) {
$scope.error = response.message;
});
};
$scope.signin = function () {
$http.post('/auth/signin', $scope.credentials).success(function (response) {
//If successful we assign the response to the global user model
$scope.authentication.user = response;
//And redirect to the index page
$location.path('/');
}).error(function (response) {
$scope.error = response.message;
});
};
}
]);'use strict';
angular.module('users').controller('SettingsController', [
'$scope',
'$http',
'$location',
'Users',
'Authentication',
function ($scope, $http, $location, Users, Authentication) {
$scope.user = Authentication.user;
// If user is not signed in then redirect back home
if (!$scope.user)
$location.path('/');
// Check if there are additional accounts
$scope.hasConnectedAdditionalSocialAccounts = function (provider) {
for (var i in $scope.user.additionalProvidersData) {
return true;
}
return false;
};
// Check if provider is already in use with current user
$scope.isConnectedSocialAccount = function (provider) {
return $scope.user.provider === provider || $scope.user.additionalProvidersData && $scope.user.additionalProvidersData[provider];
};
// Remove a user social account
$scope.removeUserSocialAccount = function (provider) {
$scope.success = $scope.error = null;
$http.delete('/users/accounts', { params: { provider: provider } }).success(function (response) {
// If successful show success message and clear form
$scope.success = true;
$scope.user = Authentication.user = response;
}).error(function (response) {
$scope.error = response.message;
});
};
// Update a user profile
$scope.updateUserProfile = function () {
$scope.success = $scope.error = null;
var user = new Users($scope.user);
user.$update(function (response) {
$scope.success = true;
Authentication.user = response;
}, function (response) {
$scope.error = response.data.message;
});
};
// Change user password
$scope.changeUserPassword = function () {
$scope.success = $scope.error = null;
$http.post('/users/password', $scope.passwordDetails).success(function (response) {
// If successful show success message and clear form
$scope.success = true;
$scope.passwordDetails = null;
}).error(function (response) {
$scope.error = response.message;
});
};
}
]);'use strict';
// Authentication service for user variables
angular.module('users').factory('Authentication', [function () {
var _this = this;
_this._data = { user: window.user };
return _this._data;
}]);'use strict';
// Users service used for communicating with the users REST endpoint
angular.module('users').factory('Users', [
'$resource',
function ($resource) {
return $resource('users', {}, { update: { method: 'PUT' } });
}
]);

File diff suppressed because one or more lines are too long