mirror of
https://github.com/mdbootstrap/mdb-ui-kit.git
synced 2025-02-02 21:04:13 +03:00
wip update babel to 6.x, but demodulized version not working.
This commit is contained in:
parent
9ec932cf72
commit
77e58a2335
223
Gruntfile.js
223
Gruntfile.js
|
@ -59,6 +59,46 @@ module.exports = function (grunt) {
|
||||||
var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js');
|
var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js');
|
||||||
var configBridge = grunt.file.readJSON('./grunt/configBridge.json', {encoding: 'utf8'});
|
var configBridge = grunt.file.readJSON('./grunt/configBridge.json', {encoding: 'utf8'});
|
||||||
|
|
||||||
|
// dynamically create js file list (we do this for several different directories)
|
||||||
|
function coreFileArray(path) {
|
||||||
|
var result = []
|
||||||
|
configBridge.core.files.forEach(
|
||||||
|
function (element, index, array) {
|
||||||
|
result[index] = (path + element)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fileMap(result, fileArray, destPath, sourcPath) {
|
||||||
|
fileArray.forEach(
|
||||||
|
function (element, index, array) {
|
||||||
|
result[destPath + element] = (sourcPath + element)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function coreFileMap(destPath, sourcePath) {
|
||||||
|
var result = {}
|
||||||
|
fileMap(result, configBridge.core.files, destPath, sourcePath)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function docsFileMap() {
|
||||||
|
var result = {}
|
||||||
|
|
||||||
|
var sourcePath = 'docs/assets/js/src/'
|
||||||
|
var destPath = 'docs/assets/js/dist/'
|
||||||
|
fileMap(result, configBridge.docs.files, destPath, sourcePath)
|
||||||
|
|
||||||
|
// generate core so we have local debugging
|
||||||
|
var sourcePath = 'js/src/'
|
||||||
|
var destPath = 'docs/dist/js/demoduled/'
|
||||||
|
fileMap(result, configBridge.core.files, destPath, sourcePath)
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
Object.keys(configBridge.paths).forEach(function (key) {
|
Object.keys(configBridge.paths).forEach(function (key) {
|
||||||
configBridge.paths[key].forEach(function (val, i, arr) {
|
configBridge.paths[key].forEach(function (val, i, arr) {
|
||||||
arr[i] = path.join('./docs/assets', val);
|
arr[i] = path.join('./docs/assets', val);
|
||||||
|
@ -88,101 +128,26 @@ module.exports = function (grunt) {
|
||||||
// Task configuration.
|
// Task configuration.
|
||||||
clean: {
|
clean: {
|
||||||
dist: 'dist',
|
dist: 'dist',
|
||||||
|
'dist-js': 'dist/js',
|
||||||
docs: 'docs/dist'
|
docs: 'docs/dist'
|
||||||
},
|
},
|
||||||
|
|
||||||
// JS build configuration
|
|
||||||
lineremover: {
|
|
||||||
es6Import: {
|
|
||||||
files: {
|
|
||||||
'<%= concat.bootstrap.dest %>': '<%= concat.bootstrap.dest %>'
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
exclusionPattern: /^(import|export)/g
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
babel: {
|
babel: {
|
||||||
core: {
|
|
||||||
options: {
|
options: {
|
||||||
sourceMap: true,
|
sourceMap: true,
|
||||||
modules: 'ignore'
|
presets: ['babel-preset-es2015-rollup'] // the following is the es2015 preset minus the commonjs requirement
|
||||||
},
|
},
|
||||||
files: {
|
core: {
|
||||||
'dist/js/babel/baseInput.js': 'js/src/baseInput.js',
|
files: coreFileMap('dist/js/demoduled/', 'js/src/')
|
||||||
'dist/js/babel/baseSelection.js': 'js/src/baseSelection.js',
|
|
||||||
'dist/js/babel/util.js': 'js/src/util.js',
|
|
||||||
'dist/js/babel/ripples.js': 'js/src/ripples.js',
|
|
||||||
'dist/js/babel/autofill.js': 'js/src/autofill.js',
|
|
||||||
'dist/js/babel/text.js': 'js/src/text.js',
|
|
||||||
'dist/js/babel/textarea.js': 'js/src/textarea.js',
|
|
||||||
'dist/js/babel/select.js': 'js/src/select.js',
|
|
||||||
'dist/js/babel/checkbox.js': 'js/src/checkbox.js',
|
|
||||||
'dist/js/babel/checkboxInline.js': 'js/src/checkboxInline.js',
|
|
||||||
'dist/js/babel/switch.js': 'js/src/switch.js',
|
|
||||||
'dist/js/babel/radio.js': 'js/src/radio.js',
|
|
||||||
'dist/js/babel/radioInline.js': 'js/src/radioInline.js',
|
|
||||||
'dist/js/babel/file.js': 'js/src/file.js',
|
|
||||||
'dist/js/babel/bootstrapMaterialDesign.js': 'js/src/bootstrapMaterialDesign.js',
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
docs: {
|
docs: {
|
||||||
options: {
|
files: docsFileMap()
|
||||||
sourceMap: true,
|
|
||||||
modules: 'ignore'
|
|
||||||
},
|
|
||||||
files: {
|
|
||||||
'docs/assets/js/dist/style.js': 'docs/assets/js/src/style.js',
|
|
||||||
'docs/assets/js/dist/application.js': 'docs/assets/js/src/application.js',
|
|
||||||
|
|
||||||
// generate core so we have local debugging
|
|
||||||
'docs/dist/js/babel/baseInput.js': 'js/src/baseInput.js',
|
|
||||||
'docs/dist/js/babel/baseSelection.js': 'js/src/baseSelection.js',
|
|
||||||
'docs/dist/js/babel/util.js': 'js/src/util.js',
|
|
||||||
'docs/dist/js/babel/ripples.js': 'js/src/ripples.js',
|
|
||||||
'docs/dist/js/babel/autofill.js': 'js/src/autofill.js',
|
|
||||||
'docs/dist/js/babel/text.js': 'js/src/text.js',
|
|
||||||
'docs/dist/js/babel/textarea.js': 'js/src/textarea.js',
|
|
||||||
'docs/dist/js/babel/select.js': 'js/src/select.js',
|
|
||||||
'docs/dist/js/babel/checkbox.js': 'js/src/checkbox.js',
|
|
||||||
'docs/dist/js/babel/checkboxInline.js': 'js/src/checkboxInline.js',
|
|
||||||
'docs/dist/js/babel/switch.js': 'js/src/switch.js',
|
|
||||||
'docs/dist/js/babel/radio.js': 'js/src/radio.js',
|
|
||||||
'docs/dist/js/babel/radioInline.js': 'js/src/radioInline.js',
|
|
||||||
'docs/dist/js/babel/file.js': 'js/src/file.js',
|
|
||||||
'docs/dist/js/babel/bootstrapMaterialDesign.js': 'js/src/bootstrapMaterialDesign.js',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dist: {
|
|
||||||
options: {
|
|
||||||
modules: 'ignore'
|
|
||||||
},
|
|
||||||
files: {
|
|
||||||
'<%= concat.bootstrap.dest %>': '<%= concat.bootstrap.dest %>'
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
umd: {
|
umd: {
|
||||||
options: {
|
options: {
|
||||||
modules: 'umd'
|
plugins: ['transform-es2015-modules-umd']
|
||||||
},
|
},
|
||||||
files: {
|
files: coreFileMap('dist/js/umd/', 'js/src/')
|
||||||
'dist/js/umd/baseInput.js': 'js/src/baseInput.js',
|
|
||||||
'dist/js/umd/baseSelection.js': 'js/src/baseSelection.js',
|
|
||||||
'dist/js/umd/util.js': 'js/src/util.js',
|
|
||||||
'dist/js/umd/ripples.js': 'js/src/ripples.js',
|
|
||||||
'dist/js/umd/autofill.js': 'js/src/autofill.js',
|
|
||||||
'dist/js/umd/text.js': 'js/src/text.js',
|
|
||||||
'dist/js/umd/textarea.js': 'js/src/textarea.js',
|
|
||||||
'dist/js/umd/select.js': 'js/src/select.js',
|
|
||||||
'dist/js/umd/checkbox.js': 'js/src/checkbox.js',
|
|
||||||
'dist/js/umd/checkboxInline.js': 'js/src/checkboxInline.js',
|
|
||||||
'dist/js/umd/switch.js': 'js/src/switch.js',
|
|
||||||
'dist/js/umd/radio.js': 'js/src/radio.js',
|
|
||||||
'dist/js/umd/radioInline.js': 'js/src/radioInline.js',
|
|
||||||
'dist/js/umd/file.js': 'js/src/file.js',
|
|
||||||
'dist/js/umd/bootstrapMaterialDesign.js': 'js/src/bootstrapMaterialDesign.js',
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -220,50 +185,43 @@ module.exports = function (grunt) {
|
||||||
footer: '\n}(jQuery);'
|
footer: '\n}(jQuery);'
|
||||||
//banner: '<%= banner %>\n'
|
//banner: '<%= banner %>\n'
|
||||||
},
|
},
|
||||||
bootstrap: {
|
core: {
|
||||||
files: {
|
files: {
|
||||||
src: '<%= concat.bootstrap.dest %>'
|
src: 'dist/js/<%= pkg.name %>.js'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
concat: {
|
concat: {
|
||||||
|
dist_demoduled: {
|
||||||
options: {
|
options: {
|
||||||
stripBanners: false,
|
stripBanners: false,
|
||||||
sourceMap: true
|
sourceMap: true
|
||||||
},
|
},
|
||||||
bootstrap: {
|
dest: 'dist/js/<%= pkg.name %>.js',
|
||||||
src: [
|
src: coreFileArray('dist/js/demoduled/')
|
||||||
'dist/js/babel/baseInput.js',
|
|
||||||
'dist/js/babel/baseSelection.js',
|
|
||||||
'dist/js/babel/util.js',
|
|
||||||
'dist/js/babel/ripples.js',
|
|
||||||
'dist/js/babel/autofill.js',
|
|
||||||
'dist/js/babel/text.js',
|
|
||||||
'dist/js/babel/textarea.js',
|
|
||||||
'dist/js/babel/select.js',
|
|
||||||
'dist/js/babel/checkbox.js',
|
|
||||||
'dist/js/babel/checkboxInline.js',
|
|
||||||
'dist/js/babel/switch.js',
|
|
||||||
'dist/js/babel/radio.js',
|
|
||||||
'dist/js/babel/radioInline.js',
|
|
||||||
'dist/js/babel/file.js',
|
|
||||||
'dist/js/babel/bootstrapMaterialDesign.js',
|
|
||||||
],
|
|
||||||
dest: 'dist/js/<%= pkg.name %>.js'
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
lineremover: {
|
||||||
|
core: {
|
||||||
|
options: {
|
||||||
|
exclusionPattern: /^(import|export)/g
|
||||||
|
},
|
||||||
|
files: coreFileMap('dist/js/demoduled/', 'dist/js/demoduled/')
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
uglify: {
|
uglify: {
|
||||||
options: {
|
options: {
|
||||||
compress: { // this was causing problems on docs vendor js
|
compress: {
|
||||||
warnings: true
|
warnings: true
|
||||||
},
|
},
|
||||||
mangle: false,
|
mangle: false,
|
||||||
preserveComments: /^!|@preserve|@license|@cc_on/i
|
preserveComments: /^!|@preserve|@license|@cc_on/i
|
||||||
},
|
},
|
||||||
core: {
|
core: {
|
||||||
src: '<%= concat.bootstrap.dest %>',
|
src: 'dist/js/<%= pkg.name %>.js',
|
||||||
dest: 'dist/js/<%= pkg.name %>.min.js'
|
dest: 'dist/js/<%= pkg.name %>.min.js'
|
||||||
},
|
},
|
||||||
docs: {
|
docs: {
|
||||||
|
@ -334,15 +292,13 @@ module.exports = function (grunt) {
|
||||||
advanced: false
|
advanced: false
|
||||||
},
|
},
|
||||||
core: {
|
core: {
|
||||||
files: [
|
files: [{
|
||||||
{
|
|
||||||
expand: true,
|
expand: true,
|
||||||
cwd: 'dist/css',
|
cwd: 'dist/css',
|
||||||
src: ['*.css', '!*.min.css'],
|
src: ['*.css', '!*.min.css'],
|
||||||
dest: 'dist/css',
|
dest: 'dist/css',
|
||||||
ext: '.min.css'
|
ext: '.min.css'
|
||||||
}
|
}]
|
||||||
]
|
|
||||||
},
|
},
|
||||||
docs: {
|
docs: {
|
||||||
src: 'docs/assets/css/docs.css',
|
src: 'docs/assets/css/docs.css',
|
||||||
|
@ -378,10 +334,14 @@ module.exports = function (grunt) {
|
||||||
cwd: 'dist/',
|
cwd: 'dist/',
|
||||||
src: [
|
src: [
|
||||||
'**/*',
|
'**/*',
|
||||||
'!js/babel',
|
'!js/demoduled',
|
||||||
'!js/babel/**/*',
|
'!js/demoduled/**/*',
|
||||||
'!js/umd',
|
'!js/umd',
|
||||||
'!js/umd/**/*',
|
'!js/umd/**/*',
|
||||||
|
//'!js/commonjs',
|
||||||
|
//'!js/commonjs/**/*',
|
||||||
|
//'!js/systemjs',
|
||||||
|
//'!js/systemjs/**/*',
|
||||||
'!js/npm.js'
|
'!js/npm.js'
|
||||||
],
|
],
|
||||||
dest: 'docs/dist/'
|
dest: 'docs/dist/'
|
||||||
|
@ -528,17 +488,6 @@ module.exports = function (grunt) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
//sed: {
|
|
||||||
// versionNumber: {
|
|
||||||
// pattern: (function () {
|
|
||||||
// var old = grunt.option('oldver');
|
|
||||||
// return old ? RegExp.quote(old) : old;
|
|
||||||
// })(),
|
|
||||||
// replacement: grunt.option('newver'),
|
|
||||||
// recursive: true
|
|
||||||
// }
|
|
||||||
//},
|
|
||||||
|
|
||||||
'saucelabs-qunit': {
|
'saucelabs-qunit': {
|
||||||
all: {
|
all: {
|
||||||
options: {
|
options: {
|
||||||
|
@ -651,7 +600,17 @@ module.exports = function (grunt) {
|
||||||
grunt.registerTask('test-js', ['eslint', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']);
|
grunt.registerTask('test-js', ['eslint', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']);
|
||||||
|
|
||||||
// JS distribution task.
|
// JS distribution task.
|
||||||
grunt.registerTask('dist-js', ['eslint', 'babel:core', 'concat', 'lineremover', 'babel:dist', 'stamp', 'uglify:core', 'commonjs', 'copy:dist-to-docs']);
|
grunt.registerTask('dist-js', [
|
||||||
|
'clean:dist-js',
|
||||||
|
'eslint',
|
||||||
|
'babel:core',
|
||||||
|
'lineremover:core',
|
||||||
|
'concat',
|
||||||
|
'stamp',
|
||||||
|
'uglify:core',
|
||||||
|
'commonjs',
|
||||||
|
'copy:dist-to-docs'
|
||||||
|
]);
|
||||||
|
|
||||||
grunt.registerTask('test-scss', ['scsslint']);
|
grunt.registerTask('test-scss', ['scsslint']);
|
||||||
|
|
||||||
|
@ -671,11 +630,6 @@ module.exports = function (grunt) {
|
||||||
// Default task.
|
// Default task.
|
||||||
grunt.registerTask('default', ['clean:dist', 'test']);
|
grunt.registerTask('default', ['clean:dist', 'test']);
|
||||||
|
|
||||||
// Version numbering task.
|
|
||||||
// grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
|
|
||||||
// This can be overzealous, so its changes should always be manually reviewed!
|
|
||||||
//grunt.registerTask('change-version-number', 'sed');
|
|
||||||
|
|
||||||
grunt.registerTask('commonjs', ['babel:umd', 'npm-js']);
|
grunt.registerTask('commonjs', ['babel:umd', 'npm-js']);
|
||||||
|
|
||||||
grunt.registerTask('npm-js', 'Generate npm-js entrypoint module in dist dir.', function () {
|
grunt.registerTask('npm-js', 'Generate npm-js entrypoint module in dist dir.', function () {
|
||||||
|
@ -701,7 +655,13 @@ module.exports = function (grunt) {
|
||||||
]);
|
]);
|
||||||
grunt.registerTask('docs-css', ['sass:docs', 'postcss:docs', 'postcss:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']);
|
grunt.registerTask('docs-css', ['sass:docs', 'postcss:docs', 'postcss:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']);
|
||||||
grunt.registerTask('lint-docs-js', ['jscs:assets']);
|
grunt.registerTask('lint-docs-js', ['jscs:assets']);
|
||||||
grunt.registerTask('docs-js', ['babel:docs', 'uglify:docs', 'lint-docs-js', 'copy:dist-to-docs']);
|
grunt.registerTask('docs-js', [
|
||||||
|
'babel:docs',
|
||||||
|
'lineremover:docs',
|
||||||
|
'uglify:docs',
|
||||||
|
'lint-docs-js',
|
||||||
|
'copy:dist-to-docs'
|
||||||
|
]);
|
||||||
grunt.registerTask('docs', ['clean:docs', 'docs-css', 'docs-js']);
|
grunt.registerTask('docs', ['clean:docs', 'docs-css', 'docs-js']);
|
||||||
//------
|
//------
|
||||||
|
|
||||||
|
@ -727,4 +687,9 @@ module.exports = function (grunt) {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
grunt.registerTask('debug', function () {
|
||||||
|
|
||||||
|
console.log(coreFileArray('dist/js/demoduled/'));
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'babel-polyfill'
|
||||||
import Style from './style'
|
import Style from './style'
|
||||||
import Clipboard from 'clipboard'
|
import Clipboard from 'clipboard'
|
||||||
import anchors from 'anchor'
|
import anchors from 'anchor'
|
||||||
|
|
|
@ -1,4 +1,29 @@
|
||||||
{
|
{
|
||||||
|
"core": {
|
||||||
|
"files": [
|
||||||
|
"baseInput.js",
|
||||||
|
"baseSelection.js",
|
||||||
|
"util.js",
|
||||||
|
"ripples.js",
|
||||||
|
"autofill.js",
|
||||||
|
"text.js",
|
||||||
|
"textarea.js",
|
||||||
|
"select.js",
|
||||||
|
"checkbox.js",
|
||||||
|
"checkboxInline.js",
|
||||||
|
"switch.js",
|
||||||
|
"radio.js",
|
||||||
|
"radioInline.js",
|
||||||
|
"file.js",
|
||||||
|
"bootstrapMaterialDesign.js"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"docs": {
|
||||||
|
"files": [
|
||||||
|
"style.js",
|
||||||
|
"application.js"
|
||||||
|
]
|
||||||
|
},
|
||||||
"paths": {
|
"paths": {
|
||||||
"docsJs": [
|
"docsJs": [
|
||||||
"../assets/js/vendor/anchor.min.js",
|
"../assets/js/vendor/anchor.min.js",
|
||||||
|
@ -7,23 +32,22 @@
|
||||||
"../assets/js/dist/style.js",
|
"../assets/js/dist/style.js",
|
||||||
"../assets/js/dist/application.js"
|
"../assets/js/dist/application.js"
|
||||||
],
|
],
|
||||||
|
|
||||||
"coreJs": [
|
"coreJs": [
|
||||||
"../dist/js/babel/baseInput.js",
|
"../dist/js/demoduled/baseInput.js",
|
||||||
"../dist/js/babel/baseSelection.js",
|
"../dist/js/demoduled/baseSelection.js",
|
||||||
"../dist/js/babel/autofill.js",
|
"../dist/js/demoduled/autofill.js",
|
||||||
"../dist/js/babel/bootstrapMaterialDesign.js",
|
"../dist/js/demoduled/bootstrapMaterialDesign.js",
|
||||||
"../dist/js/babel/checkbox.js",
|
"../dist/js/demoduled/checkbox.js",
|
||||||
"../dist/js/babel/checkboxInline.js",
|
"../dist/js/demoduled/checkboxInline.js",
|
||||||
"../dist/js/babel/file.js",
|
"../dist/js/demoduled/file.js",
|
||||||
"../dist/js/babel/text.js",
|
"../dist/js/demoduled/text.js",
|
||||||
"../dist/js/babel/textarea.js",
|
"../dist/js/demoduled/textarea.js",
|
||||||
"../dist/js/babel/select.js",
|
"../dist/js/demoduled/select.js",
|
||||||
"../dist/js/babel/radio.js",
|
"../dist/js/demoduled/radio.js",
|
||||||
"../dist/js/babel/radioInline.js",
|
"../dist/js/demoduled/radioInline.js",
|
||||||
"../dist/js/babel/ripples.js",
|
"../dist/js/demoduled/ripples.js",
|
||||||
"../dist/js/babel/switch.js",
|
"../dist/js/demoduled/switch.js",
|
||||||
"../dist/js/babel/util.js"
|
"../dist/js/demoduled/util.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
js/src/bootstrapMaterialDesign.js
vendored
2
js/src/bootstrapMaterialDesign.js
vendored
|
@ -1,3 +1,5 @@
|
||||||
|
//import 'babel-polyfill' // necessary for firefox
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* $.bootstrapMaterialDesign(config) is a macro class to configure the components generally
|
* $.bootstrapMaterialDesign(config) is a macro class to configure the components generally
|
||||||
* used in Material Design for Bootstrap. You may pass overrides to the configurations
|
* used in Material Design for Bootstrap. You may pass overrides to the configurations
|
||||||
|
|
|
@ -34,10 +34,15 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^6.0.3",
|
"autoprefixer": "^6.0.3",
|
||||||
"babel-eslint": "^4.1.6",
|
"babel-eslint": "^4.1.6",
|
||||||
|
"babel-plugin-transform-es2015-modules-umd": "^6.0",
|
||||||
|
"babel-polyfill": "^6.0",
|
||||||
|
"babel-preset-es2015-rollup": "*",
|
||||||
|
|
||||||
|
|
||||||
"btoa": "~1.1.2",
|
"btoa": "~1.1.2",
|
||||||
"glob": "~6.0.1",
|
"glob": "~6.0.1",
|
||||||
"grunt": "~0.4.5",
|
"grunt": "~0.4.5",
|
||||||
"grunt-babel": "^5.0.3",
|
"grunt-babel": "^6.0",
|
||||||
"grunt-build-control": "~0.6.0",
|
"grunt-build-control": "~0.6.0",
|
||||||
"grunt-contrib-clean": "~0.7.0",
|
"grunt-contrib-clean": "~0.7.0",
|
||||||
"grunt-contrib-compress": "~0.14.0",
|
"grunt-contrib-compress": "~0.14.0",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user