Patch fomantic-ui to workaround build issue (#11244)
* 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>tokarchuk/v1.17
parent
bfda0f3864
commit
310699bca7
@ -0,0 +1,260 @@ |
|||||||
|
/******************************* |
||||||
|
* 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; |
Loading…
Reference in new issue