* Patch fomantic-ui to workaround build issue Better workaround than https://github.com/go-gitea/gitea/issues/10653 for https://github.com/fomantic/Fomantic-UI/issues/1356. It does not seem like we're getting a new Fomantic-UI release anytime soon, so this patches it after node_modules installation. Fixes: https://github.com/go-gitea/gitea/issues/11243 Fixes: https://github.com/go-gitea/gitea/issues/10679 * copy instead of patch * update package-lock.json * Update Makefile Co-Authored-By: Sorien <Sorien@users.noreply.github.com> * Update web_src/fomantic/css.js Co-Authored-By: zeripath <art27@cantab.net> Co-authored-by: Sorien <Sorien@users.noreply.github.com> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
		
			
				
	
	
		
			261 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*******************************
 | |
|  *          Build Task
 | |
|  *******************************/
 | |
| 
 | |
| const
 | |
|   gulp         = require('gulp'),
 | |
| 
 | |
|   // node dependencies
 | |
|   console      = require('better-console'),
 | |
| 
 | |
|   // gulp dependencies
 | |
|   autoprefixer = require('gulp-autoprefixer'),
 | |
|   chmod        = require('gulp-chmod'),
 | |
|   concatCSS    = require('gulp-concat-css'),
 | |
|   dedupe       = require('gulp-dedupe'),
 | |
|   flatten      = require('gulp-flatten'),
 | |
|   gulpif       = require('gulp-if'),
 | |
|   header       = require('gulp-header'),
 | |
|   less         = require('gulp-less'),
 | |
|   minifyCSS    = require('gulp-clean-css'),
 | |
|   normalize    = require('normalize-path'),
 | |
|   plumber      = require('gulp-plumber'),
 | |
|   print        = require('gulp-print').default,
 | |
|   rename       = require('gulp-rename'),
 | |
|   replace      = require('gulp-replace'),
 | |
|   replaceExt   = require('replace-ext'),
 | |
|   rtlcss       = require('gulp-rtlcss'),
 | |
| 
 | |
|   // config
 | |
|   config       = require('./../config/user'),
 | |
|   docsConfig   = require('./../config/docs'),
 | |
|   tasks        = require('../config/tasks'),
 | |
|   install      = require('../config/project/install'),
 | |
| 
 | |
|   // shorthand
 | |
|   globs        = config.globs,
 | |
|   assets       = config.paths.assets,
 | |
| 
 | |
|   banner       = tasks.banner,
 | |
|   filenames    = tasks.filenames,
 | |
|   comments     = tasks.regExp.comments,
 | |
|   log          = tasks.log,
 | |
|   settings     = tasks.settings
 | |
| ;
 | |
| 
 | |
| /**
 | |
|  * Builds the css
 | |
|  * @param src
 | |
|  * @param type
 | |
|  * @param compress
 | |
|  * @param config
 | |
|  * @param opts
 | |
|  * @return {*}
 | |
|  */
 | |
| function build(src, type, compress, config, opts) {
 | |
|   let fileExtension;
 | |
|   if (type === 'rtl' && compress) {
 | |
|     fileExtension = settings.rename.rtlMinCSS;
 | |
|   } else if (type === 'rtl') {
 | |
|     fileExtension = settings.rename.rtlCSS;
 | |
|   } else if (compress) {
 | |
|     fileExtension = settings.rename.minCSS;
 | |
|   }
 | |
| 
 | |
|   return gulp.src(src, opts)
 | |
|     .pipe(plumber(settings.plumber.less))
 | |
|     .pipe(less(settings.less))
 | |
|     .pipe(autoprefixer(settings.prefix))
 | |
|     .pipe(gulpif(type === 'rtl', rtlcss()))
 | |
|     .pipe(replace(comments.variables.in, comments.variables.out))
 | |
|     .pipe(replace(comments.license.in, comments.license.out))
 | |
|     .pipe(replace(comments.large.in, comments.large.out))
 | |
|     .pipe(replace(comments.small.in, comments.small.out))
 | |
|     .pipe(replace(comments.tiny.in, comments.tiny.out))
 | |
|     .pipe(flatten())
 | |
|     .pipe(replace(config.paths.assets.source,
 | |
|       compress ? config.paths.assets.compressed : config.paths.assets.uncompressed))
 | |
|     .pipe(gulpif(compress, minifyCSS(settings.minify)))
 | |
|     .pipe(gulpif(fileExtension, rename(fileExtension)))
 | |
|     .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
 | |
|     .pipe(gulp.dest(compress ? config.paths.output.compressed : config.paths.output.uncompressed))
 | |
|     .pipe(print(log.created))
 | |
|     ;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Packages the css files in dist
 | |
|  * @param {string} type - type of the css processing (none, rtl, docs)
 | |
|  * @param {boolean} compress - should the output be compressed
 | |
|  */
 | |
| function pack(type, compress) {
 | |
|   const output       = type === 'docs' ? docsConfig.paths.output : config.paths.output;
 | |
|   const ignoredGlobs = type === 'rtl' ? globs.ignoredRTL + '.rtl.css' : globs.ignored + '.css';
 | |
| 
 | |
|   let concatenatedCSS;
 | |
|   if (type === 'rtl') {
 | |
|     concatenatedCSS = compress ? filenames.concatenatedMinifiedRTLCSS : filenames.concatenatedRTLCSS;
 | |
|   } else {
 | |
|     concatenatedCSS = compress ? filenames.concatenatedMinifiedCSS : filenames.concatenatedCSS;
 | |
|   }
 | |
| 
 | |
|   return gulp.src(output.uncompressed + '/**/' + globs.components + ignoredGlobs)
 | |
|     .pipe(plumber())
 | |
|     .pipe(dedupe())
 | |
|     .pipe(replace(assets.uncompressed, assets.packaged))
 | |
|     .pipe(concatCSS(concatenatedCSS, settings.concatCSS))
 | |
|     .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions)))
 | |
|     .pipe(gulpif(compress, minifyCSS(settings.concatMinify)))
 | |
|     .pipe(header(banner, settings.header))
 | |
|     .pipe(gulp.dest(output.packaged))
 | |
|     .pipe(print(log.created))
 | |
|     ;
 | |
| }
 | |
| 
 | |
| function buildCSS(src, type, config, opts, callback) {
 | |
|   if (!install.isSetup()) {
 | |
|     console.error('Cannot build CSS files. Run "gulp install" to set-up Semantic');
 | |
|     callback();
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   if (callback === undefined) {
 | |
|     callback = opts;
 | |
|     opts     = config;
 | |
|     config   = type;
 | |
|     type     = src;
 | |
|     src      = config.paths.source.definitions + '/**/' + config.globs.components + '.less';
 | |
|   }
 | |
| 
 | |
|   const buildUncompressed       = () => build(src, type, false, config, opts);
 | |
|   buildUncompressed.displayName = 'Building uncompressed CSS';
 | |
| 
 | |
|   const buildCompressed       = () => build(src, type, true, config, opts);
 | |
|   buildCompressed.displayName = 'Building compressed CSS';
 | |
| 
 | |
|   const packUncompressed       = () => pack(type, false);
 | |
|   packUncompressed.displayName = 'Packing uncompressed CSS';
 | |
| 
 | |
|   const packCompressed       = () => pack(type, true);
 | |
|   packCompressed.displayName = 'Packing compressed CSS';
 | |
| 
 | |
|   gulp.parallel(
 | |
|     gulp.series(
 | |
|       buildUncompressed,
 | |
|       gulp.parallel(packUncompressed, packCompressed)
 | |
|     ),
 | |
|     gulp.series(buildCompressed)
 | |
|   )(callback);
 | |
| }
 | |
| 
 | |
| function rtlAndNormal(src, callback) {
 | |
|   if (callback === undefined) {
 | |
|     callback = src;
 | |
|     src      = config.paths.source.definitions + '/**/' + config.globs.components + '.less';
 | |
|   }
 | |
| 
 | |
|   const rtl       = (callback) => buildCSS(src, 'rtl', config, {}, callback);
 | |
|   rtl.displayName = "CSS Right-To-Left";
 | |
|   const css       = (callback) => buildCSS(src, 'default', config, {}, callback);
 | |
|   css.displayName = "CSS";
 | |
| 
 | |
|   if (config.rtl === true || config.rtl === 'Yes') {
 | |
|     rtl(callback);
 | |
|   } else if (config.rtl === 'both') {
 | |
|     gulp.series(rtl, css)(callback);
 | |
|   } else {
 | |
|     css(callback);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function docs(src, callback) {
 | |
|   if (callback === undefined) {
 | |
|     callback = src;
 | |
|     src      = config.paths.source.definitions + '/**/' + config.globs.components + '.less';
 | |
|   }
 | |
| 
 | |
|   const func       = (callback) => buildCSS(src, 'docs', config, {}, callback);
 | |
|   func.displayName = "CSS Docs";
 | |
| 
 | |
|   func(callback);
 | |
| }
 | |
| 
 | |
| // Default tasks
 | |
| module.exports = rtlAndNormal;
 | |
| 
 | |
| // We keep the changed files in an array to call build with all of them at the same time
 | |
| let timeout, files = [];
 | |
| 
 | |
| /**
 | |
|  * Watch changes in CSS files and call the correct build pipe
 | |
|  * @param type
 | |
|  * @param config
 | |
|  */
 | |
| module.exports.watch = function (type, config) {
 | |
|   const method = type === 'docs' ? docs : rtlAndNormal;
 | |
| 
 | |
|   // Watch theme.config file
 | |
|   gulp.watch([
 | |
|     normalize(config.paths.source.config),
 | |
|     normalize(config.paths.source.site + '/**/site.variables'),
 | |
|     normalize(config.paths.source.themes + '/**/site.variables')
 | |
|   ])
 | |
|     .on('all', function () {
 | |
|       // Clear timeout and reset files
 | |
|       timeout && clearTimeout(timeout);
 | |
|       files = [];
 | |
|       return gulp.series(method)();
 | |
|     });
 | |
| 
 | |
|   // Watch any less / overrides / variables files
 | |
|   gulp.watch([
 | |
|     normalize(config.paths.source.definitions + '/**/*.less'),
 | |
|     normalize(config.paths.source.site + '/**/*.{overrides,variables}'),
 | |
|     normalize(config.paths.source.themes + '/**/*.{overrides,variables}')
 | |
|   ])
 | |
|     .on('all', function (event, path) {
 | |
|       // We don't handle deleted files yet
 | |
|       if (event === 'unlink' || event === 'unlinkDir') {
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       // Clear timeout
 | |
|       timeout && clearTimeout(timeout);
 | |
| 
 | |
|       // Determine which LESS file has to be recompiled
 | |
|       let lessPath;
 | |
|       if(path.indexOf('site.variables') !== -1)  {
 | |
|         return;
 | |
|       } else if (path.indexOf(config.paths.source.themes) !== -1) {
 | |
|         console.log('Change detected in packaged theme');
 | |
|         lessPath = replaceExt(path, '.less');
 | |
|         lessPath = lessPath.replace(tasks.regExp.theme, config.paths.source.definitions);
 | |
|       } else if (path.indexOf(config.paths.source.site) !== -1) {
 | |
|         console.log('Change detected in site theme');
 | |
|         lessPath = replaceExt(path, '.less');
 | |
|         lessPath = lessPath.replace(config.paths.source.site, config.paths.source.definitions);
 | |
|       } else {
 | |
|         console.log('Change detected in definition');
 | |
|         lessPath = path;
 | |
|       }
 | |
| 
 | |
|       // Add file to internal changed files array
 | |
|       if (!files.includes(lessPath)) {
 | |
|         files.push(lessPath);
 | |
|       }
 | |
| 
 | |
|       // Update timeout
 | |
|       timeout = setTimeout(() => {
 | |
|         // Copy files to build in another array
 | |
|         const buildFiles = [...files];
 | |
|         // Call method
 | |
|         gulp.series((callback) => method(buildFiles, callback))();
 | |
|         // Reset internal changed files array
 | |
|         files = [];
 | |
|       }, 1000);
 | |
|     });
 | |
| };
 | |
| 
 | |
| // Expose build css method
 | |
| module.exports.buildCSS = buildCSS;
 |