Files
front/dist/assets/vendor/tom-select/Gruntfile.js
2021-12-28 13:34:18 +01:00

329 lines
7.5 KiB
JavaScript

var fs = require('fs');
var path = require('path');
var process = require('process');
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-replace');
grunt.loadNpmTasks('@lodder/grunt-postcss');
const sass = require('node-sass');
require('load-grunt-tasks')(grunt); //sass
grunt.registerTask('default', [
'build'
]);
grunt.registerTask('build', [
'clean:library',
'shell:buildjs',
'copy:scss',
'copy:scss_plugins',
'sass:build',
'postcss:prefix',
'postcss:min',
'replace:css_post',
]);
grunt.registerTask('serve', [
'build',
'builddocs',
'connect',
'check_doc_links',
'watch'
])
grunt.registerTask('builddocs',[
'clean:builddocs',
'shell:builddocs',
'shell:rollupdocs',
'replace:builddocs',
'sass:builddocs',
'postcss:builddocs',
]);
/**
* Check generated docs for broken links
* https://www.npmjs.com/package/broken-link-checker
*/
grunt.registerTask('check_doc_links','',function(){
var done = this.async();
const {SiteChecker} = require('broken-link-checker');
const options = {
excludeExternalLinks: true,
cacheMaxAge:60,
};
var urls_checked = 0;
var links_checked = 0;
var failures = 0;
const handlers = {
error:function(error){
failures++;
console.log('error',error);
},
page:function(error, page_url, customData){
if( error ){
failures++;
console.log('error!',page_url);
}
urls_checked++;
},
junk:function( result, data ){
links_checked++;
if( result.broken ){
failures++;
console.log('broken junk found',result);
}
},
link:function(link){
if( link.broken ){
failures++;
console.log('broken link',link);
}
},
end:function(){
console.log('urls checked',urls_checked);
console.log('links checked',links_checked);
console.log('failures',failures);
done(failures==0);
}
};
const checker = new SiteChecker(options,handlers)
checker.enqueue('http://localhost:8000/', {});
});
// build tom-select.custom.js
var plugin_arg = grunt.option('plugins');
var custom_file = path.resolve( process.cwd(),'./src/tom-select.custom.ts');
var custom_content = ['/* this file is generated by grunt when calling `npm run build -- --plugins=<plugins> */','import TomSelect from "./tom-select";'];
if( fs.existsSync(custom_file) ){
fs.unlink(custom_file,err => {
if (err) {
console.error(err)
}
});
}
if( plugin_arg ){
var plugin_args = plugin_arg.split(/\s*,\s*/);
plugin_args.map(function(plugin_name){
custom_content.push(`import './plugins/${plugin_name}/plugin.js'; `);
});
custom_content.push('export default TomSelect;');
fs.writeFile(custom_file, custom_content.join("\n"),err => {
if (err) {
console.error(err)
}
});
}
// find all plugin scss files
var scss_plugin_files = [];
var matched_files = grunt.file.expand(['src/plugins/*/plugin.scss']);
for (var i = 0, n = matched_files.length; i < n; i++) {
var plugin_name = matched_files[i].match(/src\/plugins\/(.+?)\//)[1];
scss_plugin_files.push({src: matched_files[i], dest: 'build/scss/plugins/' + plugin_name + '.scss'});
}
// bootstrap browserlist https://github.com/twbs/bootstrap/blob/main/.browserslistrc
var autoprefixer = require('autoprefixer')();
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
// delete old build files
clean: {
library: ['build/scss/*','build/js/*','build/esm/*','build/css/*','build/cjs/*'],
builddocs: ['build/docs/*']
},
// copy scss files to build folder
copy: {
scss:{
files: [{
'build/scss/tom-select.scss': ['src/scss/tom-select.scss'],
'build/scss/tom-select.default.scss': ['src/scss/tom-select.default.scss'],
'build/scss/tom-select.bootstrap3.scss': ['src/scss/tom-select.bootstrap3.scss'],
'build/scss/tom-select.bootstrap4.scss': ['src/scss/tom-select.bootstrap4.scss'],
'build/scss/tom-select.bootstrap5.scss': ['src/scss/tom-select.bootstrap5.scss'],
}]
},
scss_plugins:{
files: scss_plugin_files
},
},
// replace //@@version with current package version
replace: {
options: {
prefix: '//@@',
variables: {
'version': '<%= pkg.version %>',
},
},
// add version to css & scss headers
css_post: {
files: [
{expand: true, flatten: false, src: ['build/css/*.css'], dest: ''},
{expand: true, flatten: false, src: ['build/scss/*.scss'], dest: ''},
]
},
builddocs:{
files:[
{src:['build/docs/js/index.bundle.js'],dest:'build/docs/js/index.bundle.js'},
{src:['build/docs/index.html'],dest:'build/docs/index.html'}
]
}
},
// compile css from scss
sass: {
options:{
implementation: sass,
style:'expanded',
},
build: {
files: [{
'build/css/tom-select.css': ['src/scss/tom-select.scss'],
'build/css/tom-select.default.css': ['src/scss/tom-select.default.scss'],
'build/css/tom-select.bootstrap3.css': ['src/scss/-tom-select.bootstrap3.scss'],
'build/css/tom-select.bootstrap4.css': ['src/scss/-tom-select.bootstrap4.scss'],
'build/css/tom-select.bootstrap5.css': ['src/scss/-tom-select.bootstrap5.scss'],
}]
},
builddocs: {
files: [{
expand: true,
flatten: true,
ext: '.css',
src: ['doc_src/css/*.scss'],
dest: 'build/docs/css'
}],
}
},
// autoprefix && cssnanao
postcss: {
prefix: {
options:{
map: {
inline: false, // save all sourcemaps as separate files...
},
processors: [
//require('pixrem')(), // add fallbacks for rem units
autoprefixer,
]
},
files: [{expand: true, flatten: false, src: ['build/css/*.css'], dest: ''}],
},
min: {
options: {
map: {
inline: false, // save all sourcemaps as separate files...
},
processors: [
require('cssnano')() // minify the result
]
},
files: [{
'build/css/tom-select.min.css': ['build/css/tom-select.css'],
'build/css/tom-select.default.min.css': ['build/css/tom-select.default.css'],
'build/css/tom-select.bootstrap3.min.css': ['build/css/tom-select.bootstrap3.css'],
'build/css/tom-select.bootstrap4.min.css': ['build/css/tom-select.bootstrap4.css'],
'build/css/tom-select.bootstrap5.min.css': ['build/css/tom-select.bootstrap5.css'],
}]
},
builddocs:{
options:{
map: {
inline: false, // save all sourcemaps as separate files...
},
processors: [
autoprefixer,
require('cssnano')() // minify the result
]
},
files: [{
expand: true,
flatten: true,
src: ['build/docs/css/*.css'],
dest: 'build/docs/css'
}],
},
},
// run server at http://localhost:8000 to view documentation and run examples
connect: {
server:{
options: {
base: 'build/docs',
}
}
},
// generate /build/docs
shell: {
builddocs: {
command: 'npx @11ty/eleventy --config=.config/eleventy.js',
},
rollupdocs: {
command: 'npx rollup -c .config/rollup.docs.js',
},
buildjs: {
command: 'npx rollup -c .config/rollup.config.js',
},
},
watch: {
// changes to files in /doc_src: rebuild all of documentation
docs:{
files:[
'doc_src/**',
],
tasks:[
'builddocs',
'check_doc_links',
]
},
// changes to files in /src: rebuild library and copy to docs
src:{
files: [
'src/**',
],
tasks: [
'build',
'shell:builddocs',
]
}
}
});
};