generator-f6html
Version:
Paquete básico para proyectos Fullsix en HTML5, responsive, bootstrap y con SASS
686 lines (647 loc) • 18.3 kB
JavaScript
// Generado el <%= (new Date).toISOString().split('T')[0] %>
// <%= pkg.name %> <%= pkg.version %>
'use strict';
module.exports = function (grunt) {
// Comprueba lo que tarda cada tarea
require('time-grunt')(grunt);
// Carga cada tarea de grunt sin necesidad de llamarla
require('jit-grunt')(grunt, {
useminPrepare: 'grunt-usemin'
});
// Carpetas de desarrollo
var config = {
app: 'src',
dist: 'dist',
pre: 'pre'
};
// Empieza lo bueno. Tareas.
grunt.initConfig({
// Project settings
config: config,
// Escucha la carpeta src por si hay algún cambio. Si lo hay, corre la tarea correspondiente.
watch: {
bower: {
files: ['bower.json'],
tasks: ['wiredep:pre']
},
js: {
files: ['<%%= config.app %>/script/**/*.js'],
tasks: ['copy:scripts']
},
gruntfile: {
files: ['Gruntfile.js']
},<% if (includeSass) { %>
sass: {
files: ['<%%= config.app %>/styles/**/*.{scss,sass}'],
tasks: ['copy:stylesPre','sass:prueba', 'postcss:scss']
},<% } %>
styles: {
files: ['<%%= config.app %>/styles/**/*.css'],
tasks: ['copy:stylesPre', 'cssjoin:pre']
},
html: {
files: ['<%%= config.app %>/**/*.html','<%%= config.app %>/**/*.shtml'],
tasks: ['copy:html','ssi','copy:ssi','clean:ssi','clean:predashed','wiredep:pre','processhtml:pre']
}
},
browserSync: {
options: {
notify: false,
background: true,
reloadDelay: 2000,
watchOptions: {
ignored: ''
}
},
livereload: {
options: {
files: [
'<%%= config.pre %>/**/*.html',
'<%%= config.pre %>/styles/**/*.css',
'<%%= config.pre %>/imgs/**/*',
'<%%= config.pre %>/script/**/*.js'
],
port: 9000,
server: {
baseDir: ['<%%= config.pre %>', config.app],
routes: {
'/bower_components': './bower_components'
}
}
}
},
dist: {
options: {
background: false,
server: '<%%= config.dist %>'
}
}
},
// Empties folders to start fresh
clean: {
dist: {
options: {
force: true
},
files: [{
dot: true,
src: [
'.tmp',
'<%%= config.dist %>/*',
'!<%%= config.dist %>/.git*'
]
}]
},
pre: {
options: {
force: true
},
files: [{
dot: true,
src: [
'.tmp',
'<%%= config.pre %>/*',
'!<%%= config.pre %>/.git*'
]
}]
},
server: '.tmp',
dashed: {
options: {
force: true
},
files: [{
dot: true,
src: [
'<%%= config.dist %>/_*.*'
]
}]
},
predashed: {
options: {
force: true
},
files: [{
dot: true,
src: [
'<%%= config.pre %>/_*.*'
]
}]
},
ssi: {
options: {
force: true
},
files: [{
dot: true,
src: [
'<%%= config.pre %>/*.shtml'
]
}]
}
},
<% if (includeSass) { %>
// Compiles Sass to CSS and generates necessary files if requested
sass: {
options: {
sourceMap: true,
sourceMapEmbed: true,
sourceMapContents: true,
includePaths: ['.']
},
dist: {
files: [{
expand: true,
cwd: '<%%= config.pre %>/styles',
src: ['*.{scss,sass}'],
dest: '.tmp/styles',
ext: '.css'
}]
},
prueba: {
options: {
style: 'compressed'
},
files: {
'<%%= config.pre %>/styles/main.css': ['<%%= config.pre %>/styles/main.scss']
}
}
},<% } %>
postcss: {
options: {
map: true,
processors: [
// Add vendor prefixed styles
require('autoprefixer')({
browsers: ['> 1%', 'last 2 versions', 'Firefox ESR']
})
]
},
dist: {
files: [{
expand: true,
cwd: '.tmp/styles/',
src: '**/*.css',
dest: '.tmp/styles/'
}]
},
pre: {
files: [{
expand: true,
cwd: '<%%= config.pre %>/styles/',
src: '{,*/}*.css',
dest: '<%%= config.pre %>/styles/'
}]
},
scss: {
files: [{
expand: true,
cwd: '<%%= config.pre %>/styles/',
src: 'main.css',
dest: '<%%= config.pre %>/styles/'
}]
}
},
// Automatically inject Bower components into the HTML file
wiredep: {
pre: {
src: ['<%%= config.pre %>/**/*.html'],
<% if (includeBootstrap) { -%>
exclude: ['bootstrap.js'],
<% } -%>
fileTypes: {
html: {
block: /(([\s\t]*)<!--\s*bower:*(\S*)\s*-->)(\n|\r|.)*?(<!--\s*endbower\s*-->)/gi,
detect: {
js: /<script.*src=['"](.+)['"]>/gi,
css: /<link.*href=['"](.+)['"]/gi
},
replace: {
js: '<script src="{{filePath}}"></script>',
css: '<link rel="stylesheet" href="{{filePath}}" />'
}
}
}
//ignorePath: /^(\.\.\/)*\.\./
}<% if (includeSass) { %>,
sass: {
src: ['<%%= config.pre %>/styles/{,*/}*.{scss,sass}'],
ignorePath: /^(\.\.\/)+/
}<% } %>
},
// Renames files for browser caching purposes
filerev: {
dist: {
src: [
'<%%= config.dist %>/script/{,*/}*.js',
'<%%= config.dist %>/styles/{,*/}*.css',
'<%%= config.dist %>/imgs/**/*.*',
'<%%= config.dist %>/styles/base/fonts/{,*/}*.*',
'<%%= config.dist %>/*.{ico,png}'
]
}
},
// Reads HTML for usemin blocks to enable smart builds that automatically
// concat, minify and revision files. Creates configurations in memory so
// additional tasks can operate on them
useminPrepare: {
options: {
dest: '<%%= config.dist %>'
},
html: '<%%= config.pre %>/index.html'
},
// Performs rewrites based on rev and the useminPrepare configuration
usemin: {
options: {
assetsDirs: [
'<%%= config.dist %>',
'<%%= config.dist %>/imgs',
'<%%= config.dist %>/styles'
]
},
html: ['<%%= config.dist %>/**/*.html'],
css: ['<%%= config.dist %>/styles/{,*/}*.css']
},
// The following *-min tasks produce minified files in the dist folder
imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%%= config.app %>/imgs',
src: '**/*.{gif,jpeg,jpg,png}',
dest: '<%%= config.dist %>/imgs'
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: '<%%= config.app %>/imgs',
src: '**/*.svg',
dest: '<%%= config.dist %>/imgs'
}]
}
},
tinypng: {
options: {
apiKey: "QH_tFrKXadHOXoftg0L2GbofB0AfkKw-",
checkSigs: true,
sigFile: "tinypng.sig",
summarize: true,
showProgress: true
},
dist: {
files: [
{
expand: true,
cwd: '<%%= config.app %>/imgs',
src: ['**/*.png'],
dest: '<%%= config.dist %>/imgs',
ext: '.png'
}
]
}
},
htmlmin: {
dist: {
options: {
collapseBooleanAttributes: true,
collapseWhitespace: true,
conservativeCollapse: true,
removeAttributeQuotes: true,
removeCommentsFromCDATA: true,
removeEmptyAttributes: true,
removeOptionalTags: true,
// true would impact styles with attribute selectors
removeRedundantAttributes: false,
useShortDoctype: true
},
files: [{
expand: true,
cwd: '<%%= config.dist %>',
src: '**/*.html',
dest: '<%%= config.dist %>'
}]
}
},
// By default, your `index.html`'s <!-- Usemin block --> will take care
// of minification. These next options are pre-configured if you do not
// wish to use the Usemin blocks.
cssmin: {
dist: {
files: {
'<%%= config.dist %>/styles/main.css': [
'<%%= config.pre %>/styles/main.css'
]
}
}
},
uglify: {},
concat: {
dist: {}
},
processhtml: {
dist: {
options: {
recursive: true
},
files: [
{
expand: true,
dot: true,
cwd: '<%%= config.app %>',
dest: '<%%= config.dist %>',
src: [
'*.html'
]
}
]
},
pre: {
options: {
recursive: true
},
files: [
{
expand: true,
dot: true,
cwd: '<%%= config.pre %>',
dest: '<%%= config.pre %>',
src: [
'*.html'
]
}
]
},
serve: {
options: {
recursive: true
},
files: [
{
expand: true,
dot: true,
cwd: '<%%= config.app %>',
dest: '.tmp',
src: [
'*.html'
]
}
]
}
},
uncss: {
dist: {
files: {
'<%%= config.pre %>/styles/main.css': ['<%%= config.pre %>/*.html'],
},
}
},
cssjoin: {
join :{
files: {
'<%%= config.dist %>/styles/main.css': ['<%%= config.app %>/styles/main.css'],
},
},
pre :{
options: {
paths : ["<%%= config.pre %>/styles/"]
},
files: {
'<%%= config.pre %>/styles/main.css': ['<%%= config.pre %>/styles/main.css'],
},
},
dist :{
options: {
paths : ["<%%= config.dist %>/styles/"]
},
files: {
'<%%= config.pre %>/styles/main.css': ['<%%= config.pre %>/styles/main.css'],
},
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '<%%= config.pre %>',
dest: '<%%= config.dist %>',
src: [
'*.{ico,png,txt}',
'imgs/**/*.webp',
'**/*.html',
'**/*.json',
'styles/base/fonts/{,*/}*.*',
'styles/**/*.{jpg,png,gif}'
]
}<% if (includeBootstrap) { %>, {
expand: true,
dot: true,
cwd: '<% if (includeSass) {
%>.<%
} else {
%>bower_components/bootstrap/dist<%
} %>',
src: '<% if (includeSass) {
%>bower_components/bootstrap-sass/assets/fonts/bootstrap/*<%
} else {
%>styles/base/fonts/*<%
} %>',
dest: '<%%= config.dist %>'
}<% } %>]
},
pre: {
files: [{
expand: true,
dot: true,
cwd: '<%%= config.app %>',
dest: '<%%= config.pre %>',
src: ['**/*.*']
}<% if (includeBootstrap) { %>, {
expand: true,
dot: true,
cwd: '<% if (includeSass) {
%>.<%
} else {
%>bower_components/bootstrap/dist<%
} %>',
src: '<% if (includeSass) {
%>bower_components/bootstrap-sass/assets/fonts/bootstrap/*<%
} else {
%>styles/base/fonts/*<%
} %>',
dest: '<%%= config.dist %>'
}<% } %>]
},
stylesPre: {
expand: true,
dot: true,
cwd: '<%%= config.app %>/styles',
dest: '<%%= config.pre %>/styles/',
src: ['**/*.scss','**/*.css']
},
html: {
files: [{
expand: true,
dot: true,
cwd: '<%%= config.app %>',
dest: '<%%= config.pre %>/',
src: [
'**/*.shtml', '**/*.html'
]
}]
},
ssi: {
files: [{
expand: true,
dot: true,
cwd: '<%%= config.pre %>',
dest: '<%%= config.pre %>/',
src: [
'**/*.shtml'
],
rename: function(dest, src) {
return dest + src.replace('.shtml','.html');
}
}]
},
scripts: {
expand: true,
dot: true,
cwd: '<%%= config.app %>/script',
dest: '<%%= config.pre %>/script/',
src: '**/*.js'
}<% if (!includeSass) { %>,
styles: {
expand: true,
dot: true,
cwd: '<%%= config.app %>/styles',
dest: '.tmp/styles/',
src: '{,*/}*.css'
}
<% } %>
},<% if (includeModernizr) { %>
// Generates a custom Modernizr build that includes only the tests you
// reference in your app
modernizr: {
dist: {
devFile: 'bower_components/modernizr/modernizr.js',
outputFile: '<%%= config.dist %>/script/vendor/modernizr.js',
files: {
src: [
'<%%= config.dist %>/script/{,*/}*.js',
'<%%= config.dist %>/styles/{,*/}*.css',
'!<%%= config.dist %>/script/vendor/*'
]
},
uglify: true
},
pre: {
devFile: 'bower_components/modernizr/modernizr.js',
outputFile: '<%%= config.pre %>/script/vendor/modernizr.js',
files: {
src: [
'<%%= config.pre %>/script/{,*/}*.js',
'<%%= config.pre %>/styles/{,*/}*.css',
'!<%%= config.pre %>/script/vendor/*'
]
},
uglify: true
}
},<% } %>
// Run some tasks in parallel to speed up build process
concurrent: {
server: [<% if (!includeSass) { %>
'copy:styles'<% } %>
],
dist: [<% if (!includeSass) { %>
'copy:styles',<% } %>
'imagemin',
'svgmin'
]
},
ssi: {
options: {
cache: 'all',
ext: '.html',
baseDir: '<%%= config.app %>',
},
target: {
files: [{
expand: true,
cwd: '<%%= config.app %>',
src: ['**/*.shtml'],
dest: '<%%= config.pre %>'
}]
}
}
});
grunt.registerTask('serve', 'start the server and preview your app', function (target) {
grunt.task.run([
'clean:pre', // Borra carpeta pre
'copy:pre', // Copia carpeta src a pre
'ssi', // En pre, junta los includes en los archivos shtml
'copy:ssi', // En pre, copia los shtml a html
'clean:ssi', // Borra los shtml
'clean:predashed', // Borra el footer y header de pre
'wiredep:pre', // Mete los componentes de bower en los html en pre
'useminPrepare',
<% if (includeSass) { %>
'sass:prueba',
'postcss:scss',
<% } else { %>
'cssjoin:pre', // En la carpeta pre, crea un main.css con todos los css includes de main.css
//'uncss', // En pre, elimina del main.css aquellas clases que no se usan.
<% } %> // Completa el main.css de tmp los prefijos de los navegadores (-moz, etc)
'concat', // Mete todos los js y css en un único archivo. Los nuestros en main. Los componentes en vendor.
<% if (includeSass) { %>
'cssmin:dist',<% } %> // Minimiza el main.css de tmp y lo copia en dist.
<% if (includeModernizr) { %>
'modernizr:pre',<% } %> // Copia el modernizr.js
'processhtml:pre', // Cambia la ruta del css en los html de pre.
'usemin', // Sustituye los href de los html con las nuevas rutas.
'browserSync:livereload', // Escucha los cambios
'watch' //Abre el navegador
]);
});
grunt.registerTask('png', 'Minimize your pngs from app to dist', function (target) {
grunt.task.run([
'tinypng' //Comprime los pngs y los pasa a dist
]);
});
grunt.registerTask('build', [
'clean:dist', // Borra carpeta dist
'clean:pre', // Borra carpeta pre
'copy:pre', // Copia carpeta src a pre
'ssi', // En pre, junta los includes en los archivos shtml
'copy:ssi', // En pre, copia los shtml a html
'clean:ssi', // Borra los shtml
'clean:predashed', // Borra el footer y header de pre
'wiredep:pre', // Mete los componentes de bower en los html en pre
'useminPrepare',
<% if (includeSass) { %>
'sass:prueba',
'postcss:scss',
<% } else { %>
'cssjoin:pre', // En la carpeta pre, crea un main.css con todos los css includes de main.css
//'uncss', // En pre, elimina del main.css aquellas clases que no se usan.
'concurrent:dist', // Varias tareas: copia main.css de pre a tmp, comprime las imágenes de src a dist.
'postcss:dist',<% } %> // Completa el main.css de tmp los prefijos de los navegadores (-moz, etc)
'concat', // Mete todos los js y css en un único archivo. Los nuestros en main. Los componentes en vendor.
'cssmin', // Minimiza el main.css de tmp y lo copia en dist.
'uglify', // Minimiza los dos js concatenados y los copia en dist.
'copy:dist', // Copia los archivos de pre a dist.
<% if (includeModernizr) { %>
'modernizr:dist',<% } %> // Copia el modernizr.js
'processhtml:pre', // Cambia la ruta del css en los html de pre
//'filerev', // Sustituye los nombres de imágenes y archivos aleatoriamente y cambia los enlaces a ellos, para evitar cachés.
'usemin', // Sustituye los href de los html con las nuevas rutas.
'htmlmin' // Comprime los htmls.
]);
grunt.registerTask('default', [
'build'
]);
};