UNPKG

magix-combine

Version:

合并Magix View的html,js,css成一个js文件,并检测html,js,css中可能存在的问题

284 lines (281 loc) 9.76 kB
let fs = require('fs'); let path = require('path'); let configs = require('./plugins/util-config'); let fd = require('./plugins/util-fd'); let initEnv = require('./plugins/util-init'); let js = require('./plugins/js'); let jsContent = require('./plugins/js-content'); let deps = require('./plugins/util-deps'); let checker = require('./plugins/checker'); let cssGlobal = require('./plugins/css-global'); let jsFileCache = require('./plugins/js-fcache'); let tmplNaked = require('./plugins/tmpl-naked'); let md5 = require('./plugins/util-md5'); let slog = require('./plugins/util-log'); let chalk = require('chalk'); let util = require('util'); let cssSelector = require('./plugins/css-selector'); if (!Object.values) { Object.values = object => { let result = []; if (object) { for (let p in object) { if (object.hasOwnProperty(p)) { result.push(object[p]); } } } return result; }; } // let loading='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'; let genMsg = (completed, total) => { let len = 40; if (completed > total) completed = total; let percent = completed / total; let cell = Math.round(percent * len); let barLeft = ''; for (let i = 0; i < cell; i++) { barLeft += '━'; } let barRight = ''; for (let i = cell; i < len; i++) { barRight += '━'; } let sc = completed + ''; let st = total + ''; let diff = st.length - sc.length; while (diff) { sc = ' ' + sc; diff--; } return sc + '/' + st + ' ' + chalk.blue(barLeft) + chalk.grey(barRight) + ' ' + (percent * 100).toFixed(2) + '%'; }; module.exports = { walk: fd.walk, readFile: fd.read, copyFile: fd.copy, writeFile: fd.write, removeFile(from) { initEnv(); from = path.resolve(from); deps.removeFileDepend(from); let to = path.resolve(configs.compiledFolder + from.replace(configs.moduleIdRemovedPath, '')); if (fs.existsSync(to)) { fs.unlinkSync(to); } }, removeCache(from) { from = path.resolve(from); checker.CSS.reset(); jsFileCache.clear(from); cssGlobal.reset(from); }, config(cfg) { if (cfg) { for (let p in cfg) { if (p !== 'checker' && p != 'tmplConstVars' && p != 'tmplUnchangableVars' && p != 'tmplGlobalVars' && p != 'galleries' && p != 'cssSelectorPrefix') { configs[p] = cfg[p]; } } if (cfg) { if (cfg.hasOwnProperty('checker')) { if (cfg.checker) { if (util.isObject(cfg.checker)) { configs.checker = Object.assign(configs.checker, cfg.checker); } } else { configs.checker = {}; } } } let scopedCssMap = Object.create(null); let globalCssMap = Object.create(null); configs.globalCss = configs.globalCss.map(p => { p = path.resolve(p); globalCssMap[p] = 1; return p; }); configs.scopedCss = configs.scopedCss.map(p => { p = path.resolve(p); scopedCssMap[p] = 1; return p; }); configs.scopedCssMap = scopedCssMap; configs.globalCssMap = globalCssMap; configs.uncheckGlobalCss = configs.uncheckGlobalCss.map(p => path.resolve(p)); let specials = [{ src: 'tmplConstVars' }, { src: 'tmplUnchangableVars', to: 'tmplConstVars' }, { src: 'tmplGlobalVars' }, { src: 'galleries' }, { src: 'cssSelectorPrefix', to: 'projectName' }]; let merge = (aim, src) => { if (util.isObject(src)) { if (!aim) aim = {}; for (let p in src) { aim[p] = merge(aim[p], src[p]); } return aim; } else { return src; } }; if (cfg) { for (let s of specials) { if (cfg[s.src] !== undefined) { if (Array.isArray(cfg[s.src])) { for (let v of cfg[s.src]) { configs[s.to || s.src][v] = 1; } } else { configs[s.to || s.src] = merge(configs[s.to || s.src], cfg[s.src]); } } } } } return configs; }, combine() { slog.hook(); return new Promise((resolve, reject) => { initEnv(); setTimeout(() => { let ps = []; let total = 0; let completed = 0; let tasks = []; fd.walk(configs.commonFolder, filepath => { if (configs.jsFileExtNamesReg.test(filepath)) { let from = path.resolve(filepath); let to = path.resolve(configs.compiledFolder + from.replace(configs.moduleIdRemovedPath, '')); total++; tasks.push({ from, to }); } }); if (configs.log) { slog.log(genMsg(++completed, total)); } let errorOccured = false; let current = 0; let run = () => { errorOccured = false; let tks = tasks.slice(current, current += configs.concurrentTask); if (tks.length) { ps = []; tks.forEach(it => { ps.push(js.process(it.from, it.to).then(() => { if (!errorOccured && configs.log) { slog.log(genMsg(++completed, total)); } })); }); Promise.all(ps).then(run).catch(ex => { errorOccured = true; slog.clear(true); reject(ex); }); } else { setTimeout(() => { checker.output(); slog.clear(true); slog.unhook(); resolve(); }, 100); } }; run(); }, 0); }); }, processFile(from) { initEnv(); from = path.resolve(from); this.removeCache(from); let to = path.resolve(configs.compiledFolder + from.replace(configs.moduleIdRemovedPath, '')); return js.process(from, to, true).then(() => { checker.output(); return Promise.resolve(); }); }, processContent(from, to, content) { initEnv(); from = path.resolve(from); this.removeCache(from); return jsContent.process(from, to, content, false, false); }, processTmpl() { slog.hook(); return new Promise((resolve, reject) => { initEnv(); let ps = []; let total = 0; let completed = 0; let tasks = []; fd.walk(configs.commonFolder, filepath => { //if (filepath.indexOf('/nav') >= 0) { let from = path.resolve(filepath); total++; tasks.push(from); //} }); let errorOccured = false; let current = 0; let run = () => { errorOccured = false; let tks = tasks.slice(current, current += configs.concurrentTask); if (tks.length) { ps = []; tks.forEach(from => { //if (configs.tmplFileExtNamesReg.test(from)) { ps.push(tmplNaked.process(from).then(() => { if (!errorOccured && configs.log) { slog.log(genMsg(++completed, total)); } })); //} }); Promise.all(ps).then(run).catch(ex => { errorOccured = true; slog.clear(true); reject(ex); }); } else { setTimeout(() => { slog.clear(true); slog.unhook(); resolve(); }, 100); } }; run(); }); }, getFileDependents(file) { return deps.getDependents(file); }, getStyleFileUniqueKey(file, ignoreProjectName) { return cssSelector.genCssNamesKey(file, ignoreProjectName); }, clearConfig() { delete configs.$inited; cssGlobal.clear(); md5.clear(); } };