123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- const gulp = require('gulp'),
- debug = require('gulp-debug'),
- clean = require('gulp-clean'),
- sass = require('gulp-sass')(require('node-sass')),
- postcss = require('gulp-postcss'),
- header = require('gulp-header'),
- cleanCSS = require('gulp-clean-css'),
- rtlcss = require('gulp-rtlcss'),
- minifyJS = require('gulp-minify'),
- rename = require('gulp-rename'),
- purgecss = require('gulp-purgecss'),
- rollupStream = require('@rollup/stream'),
- rollupBabel = require('rollup-plugin-babel'),
- rollupCleanup = require('rollup-plugin-cleanup'),
- {nodeResolve} = require('@rollup/plugin-node-resolve'),
- rollupCommonjs = require('@rollup/plugin-commonjs'),
- rollupReplace = require('@rollup/plugin-replace'),
- vinylSource = require('vinyl-source-stream'),
- vinylBuffer = require('vinyl-buffer'),
- critical = require('critical').stream,
- browserSync = require('browser-sync'),
- glob = require('glob'),
- spawn = require('cross-spawn'),
- fs = require('fs'),
- path = require('path'),
- YAML = require('yaml'),
- yargs = require('yargs/yargs'),
- cp = require('child_process'),
- pkg = require('./package.json'),
- year = new Date().getFullYear(),
- argv = yargs(process.argv).argv;
- let BUILD = false,
- distDir = './.tmp',
- demoDir = './.tmp',
- srcDir = './src';
- /**
- * Enable BUILD mode and set directories
- */
- gulp.task('build-on', (cb) => {
- BUILD = true;
- distDir = './dist';
- demoDir = './demo';
- cb();
- });
- /**
- * Return banner added to CSS and JS dist files
- */
- const getBanner = () => {
- return `/*!
- * Tabler v${pkg.version} (${pkg.homepage})
- * @version ${pkg.version}
- * @link ${pkg.homepage}
- * Copyright 2018-${year} The Tabler Authors
- * Copyright 2018-${year} codecalm.net Paweł Kuna
- * Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE)
- */
- `;
- };
- /**
- * Array.flat polyfill
- */
- if (!Array.prototype.flat) {
- Object.defineProperty(Array.prototype, 'flat', {
- value: function (depth = 1) {
- return this.reduce(function (flat, toFlatten) {
- return flat.concat((Array.isArray(toFlatten) && (depth > 1)) ? toFlatten.flat(depth - 1) : toFlatten);
- }, []);
- }
- });
- }
- /**
- * Import tabler-icons form npm and generate Jekyll `.yml` data files
- */
- gulp.task('svg-icons', (cb) => {
- const prepareSvgFile = (svg) => {
- return svg.replace(/\n/g, '').replace(/>\s+</g, '><');
- };
- const generateIconsYml = (dir, filename) => {
- const files = glob.sync(dir);
- let svgList = {};
- files.forEach((file) => {
- const basename = path.basename(file, '.svg');
- svgList[basename] = prepareSvgFile(fs.readFileSync(file).toString());
- });
- fs.writeFileSync(filename, YAML.stringify(svgList));
- };
- generateIconsYml("./node_modules/@tabler/icons/icons/*.svg", `${srcDir}/pages/_data/icons.yml`);
- cb();
- });
- /**
- * Check unused Jekyll partials
- */
- gulp.task('unused-files', (cb) => {
- let foundFiles = [];
- glob.sync(`${srcDir}/pages/**/*.{html,md}`).forEach((file) => {
- let fileContent = fs.readFileSync(file);
- fileContent.toString().replace(/\{% include(_cached)? ([a-z0-9\/_-]+\.html)/g, (f, c, filename) => {
- filename = `${srcDir}/pages/_includes/${filename}`;
- if (!foundFiles.includes(filename)) {
- foundFiles.push(filename);
- }
- });
- });
- let includeFiles = glob.sync(`${srcDir}/pages/_includes/**/*.html`);
- includeFiles.forEach((file) => {
- if (!foundFiles.includes(file)) {
- console.log('file', file);
- }
- });
- cb();
- });
- /**
- * Clean `dist` folder before build
- */
- gulp.task('clean-dirs', () => {
- return gulp
- .src(`{${distDir}/*,${demoDir}/*}`, { read: false })
- .pipe(clean());
- });
- gulp.task('clean-jekyll', (cb) => {
- return spawn('bundle', ['exec', 'jekyll', 'clean'], { stdio: 'inherit' })
- .on('close', cb);
- });
- /**
- * Compile SASS to CSS and move it to dist directory
- */
- gulp.task('sass', () => {
- return gulp
- .src(`${srcDir}/scss/!(_)*.scss`)
- .pipe(debug())
- .pipe(sass({
- style: 'expanded',
- precision: 7,
- importer: (url, prev, done) => {
- if (url[0] === '~') {
- url = path.resolve('node_modules', url.substr(1));
- }
- return { file: url };
- },
- }).on('error', sass.logError))
- .pipe(postcss([
- require('autoprefixer'),
- ]))
- .pipe(gulp.dest(`${distDir}/css/`))
- .pipe(browserSync.reload({
- stream: true,
- }))
- .pipe(rtlcss())
- .pipe(rename((path) => {
- path.basename += '.rtl';
- }))
- .pipe(gulp.dest(`${distDir}/css/`));
- });
- /**
- * CSS minify
- */
- gulp.task('css-minify', function(){
- return gulp.src(`${distDir}/css/!(*.min).css`)
- .pipe(debug())
- .pipe(cleanCSS())
- .pipe(rename((path) => {
- path.basename += '.min';
- }))
- .pipe(gulp.dest(`${distDir}/css/`));
- });
- /**
- * Compile JS files to dist directory
- */
- let cache;
- gulp.task('js', () => {
- const g = rollupStream({
- input: `${srcDir}/js/tabler.js`,
- cache,
- output: {
- name: 'tabler.js',
- format: 'umd',
- },
- plugins: [
- rollupReplace({
- 'process.env.NODE_ENV': JSON.stringify(BUILD ? 'production' : 'development'),
- preventAssignment: false
- }),
- rollupBabel({
- exclude: 'node_modules/**'
- }),
- nodeResolve(),
- rollupCommonjs(),
- rollupCleanup()
- ]
- })
- .on('bundle', (bundle) => {
- cache = bundle;
- })
- .pipe(vinylSource('tabler.js'))
- .pipe(vinylBuffer())
- .pipe(rename((path) => {
- path.dirname = '';
- }))
- .pipe(gulp.dest(`${distDir}/js/`))
- .pipe(browserSync.reload({
- stream: true,
- }));
- if (BUILD) {
- g.pipe(minifyJS({
- ext: {
- src: '.js',
- min: '.min.js'
- },
- }))
- .pipe(gulp.dest(`${distDir}/js/`));
- }
- return g;
- });
- /**
- * Compile JS module files to dist directory
- */
- let cacheEsm;
- gulp.task('mjs', () => {
- const g = rollupStream({
- input: `${srcDir}/js/tabler.esm.js`,
- cache: cacheEsm,
- output: {
- name: 'tabler.esm.js',
- format: 'es',
- exports: 'named'
- },
- plugins: [
- rollupReplace({
- 'process.env.NODE_ENV': JSON.stringify(BUILD ? 'production' : 'development'),
- preventAssignment: false
- }),
- rollupBabel({
- exclude: 'node_modules/**'
- }),
- nodeResolve(),
- rollupCommonjs(),
- rollupCleanup()
- ]
- })
- .on('bundle', (bundle) => {
- cacheEsm = bundle;
- })
- .pipe(vinylSource('tabler.esm.js'))
- .pipe(vinylBuffer())
- .pipe(rename((path) => {
- path.dirname = '';
- }))
- .pipe(gulp.dest(`${distDir}/js/`))
- .pipe(browserSync.reload({
- stream: true,
- }));
- if (BUILD) {
- g.pipe(minifyJS({
- ext: {
- src: '.js',
- min: '.min.js'
- },
- }))
- .pipe(gulp.dest(`${distDir}/js/`));
- }
- return g;
- });
- /**
- * Watch Jekyll files and build it to demo directory
- */
- gulp.task('watch-jekyll', (cb) => {
- browserSync.notify('Building Jekyll');
- return spawn('bundle', ['exec', 'jekyll', 'build', '--watch', '--destination', demoDir, '--trace'], { stdio: 'inherit' })
- .on('close', cb);
- });
- /**
- * Build Jekyll files do demo directory
- */
- gulp.task('build-jekyll', (cb) => {
- var env = Object.create(process.env);
- if(argv.preview) {
- env.JEKYLL_ENV = 'preview';
- }
- else {
- env.JEKYLL_ENV = 'production';
- }
- return spawn('bundle', ['exec', 'jekyll', 'build', '--destination', demoDir, '--trace'], { env: env, stdio: 'inherit' })
- .on('close', cb);
- });
- gulp.task('build-cleanup', () => {
- return gulp
- .src(`${demoDir}/redirects.json`, { read: false, allowEmpty: true })
- .pipe(clean());
- });
- gulp.task('build-purgecss', (cb) => {
- if(argv.preview) {
- return gulp.src('demo/dist/{libs,css}/**/*.css')
- .pipe(purgecss({
- content: ['demo/**/*.html']
- }))
- .pipe(gulp.dest('demo/dist/css'))
- }
- cb();
- });
- gulp.task('build-critical', (cb) => {
- if(argv.preview) {
- return gulp
- .src('demo/**/*.html')
- .pipe(
- critical({
- base: 'demo/',
- inline: true,
- css: ['demo/dist/css/tabler.css'],
- ignore: {
- atrule: ['@font-face', '@import'],
- decl: (node, value) => {
- /url\(/.test(value)
- },
- },
- })
- )
- .on('error', err => {
- console.log(err.message);
- })
- .pipe(gulp.dest('demo'));
- }
- cb();
- });
- /**
- * Watch JS and SCSS files
- */
- gulp.task('watch', (cb) => {
- gulp.watch('./src/scss/**/*.scss', gulp.series('sass'));
- gulp.watch('./src/js/**/*.js', gulp.series('js', 'mjs'));
- cb();
- });
- /**
- * Create BrowserSync server
- */
- gulp.task('browser-sync', () => {
- browserSync({
- watch: true,
- server: {
- baseDir: demoDir,
- routes: {
- '/node_modules': 'node_modules',
- '/dist/css': `${distDir}/css`,
- '/dist/js': `${distDir}/js`,
- '/dist/img': `${srcDir}/img`,
- '/static': `${srcDir}/static`,
- },
- },
- port: 3000,
- open: false,
- host: 'localhost',
- notify: false,
- reloadOnRestart: true
- });
- });
- /**
- * Copy libs used in tabler from npm to dist directory
- */
- gulp.task('copy-libs', (cb) => {
- const allLibs = require(`${srcDir}/pages/_data/libs`);
- let files = [];
- Object.keys(allLibs.js).forEach((lib) => {
- files.push(Array.isArray(allLibs.js[lib]) ? allLibs.js[lib] : [allLibs.js[lib]]);
- });
- Object.keys(allLibs.css).forEach((lib) => {
- files.push(Array.isArray(allLibs.css[lib]) ? allLibs.css[lib] : [allLibs.css[lib]]);
- });
- files = files.flat();
- files.forEach((file) => {
- if (!file.match(/^https?/)) {
- let dirname = path.dirname(file).replace('@', '');
- let cmd = `mkdir -p "dist/libs/${dirname}" && cp -r node_modules/${file} ${distDir}/libs/${file.replace('@', '')}`;
- cp.exec(cmd)
- }
- });
- cb();
- });
- /**
- * Copy static files (flags, payments images, etc) to dist directory
- */
- gulp.task('copy-images', () => {
- return gulp
- .src(`${srcDir}/img/**/*`)
- .pipe(gulp.dest(`${distDir}/img`));
- });
- /**
- * Copy static files (demo images, etc) to demo directory
- */
- gulp.task('copy-static', () => {
- return gulp
- .src(`${srcDir}/static/**/*`)
- .pipe(gulp.dest(`${demoDir}/static`));
- });
- /**
- * Copy Tabler dist files to demo directory
- */
- gulp.task('copy-dist', () => {
- return gulp
- .src(`${distDir}/**/*`)
- .pipe(gulp.dest(`${demoDir}/dist/`));
- });
- /**
- * Add banner to build JS and CSS files
- */
- gulp.task('add-banner', () => {
- return gulp.src(`${distDir}/{css,js}/**/*.{js,css}`)
- .pipe(header(getBanner()))
- .pipe(gulp.dest(`${distDir}`))
- });
- gulp.task('clean', gulp.series('clean-dirs', 'clean-jekyll'));
- gulp.task('start', gulp.series('clean', 'sass', 'js', 'mjs', 'build-jekyll', gulp.parallel('watch-jekyll', 'watch', 'browser-sync')));
- gulp.task('build-core', gulp.series('build-on', 'clean', 'sass', 'css-minify', 'js', 'mjs', 'copy-images', 'copy-libs', 'add-banner'));
- gulp.task('build-demo', gulp.series('build-on', 'build-jekyll', 'copy-static', 'copy-dist', 'build-cleanup', 'build-purgecss'/*, 'build-critical'*/));
- gulp.task('build', gulp.series('build-core', 'build-demo'));
|