UNPKG

isv-page-json-to-xtpl

Version:

abs 将页面 json 转换成 html

195 lines (178 loc) 5.18 kB
/** * @fileOverview 工具类 * @author spikelinyu */ var transformLayoutViaFiz = require('isv-fiz-layout-algorithm'); const URL = require('wurl'); const semver = require('semver'); const semverExtra = require('semver-extra'); const Client = require('isv-module-info'); const Promise = require('bluebird'); var _ = require('lodash'); var env = process.env.NODE_ENV || 'production'; const upx = Client.upxClient(env); function GetUrl(url) { return { host: URL('hostname', url), path: URL('path', url) || url.substring(url.indexOf('??') + 2, url.length) || '' } } function formatAssets(data) { var recData = { 'js': [], 'css': [] }; for (var type in data) { var typeData = data[type]; for (var host in typeData) { var paths = typeData[host].join(','); recData[type].push('//' + host + '/??' + paths); } } return recData; } function dealAssets(data, config) { var rec = {}; for (var name in config) { // 存在资源文件 if (data[name]) { // semver match var versions = []; for (var version in data[name]) { semver.satisfies(version, config[name]) && versions.push(version); } // current version var currentVersion = semverExtra.max(versions); //if (data[name][currentVersion]) { var assets = JSON.parse(data[name][currentVersion].value); assets.forEach((v)=> { if (v.url) { var url = GetUrl(v.url); var hostname = url.host; var path = url.path; if (v.type) { !rec[v.type] && (rec[v.type] = {}); !rec[v.type][hostname] && (rec[v.type][hostname] = []); rec[v.type][hostname].push(path); } } }); } } return rec; } var util = { formatAssets: formatAssets, /** * 获取框架 cdn 内容 * @param config * @param assets * @returns {*} */ frameworkCdnPath: function(config, assets) { if (assets) { return new Promise((resolve, reject)=> { resolve(dealAssets(assets, config)); }); } else { return upx.request('assetsService.allVersion', [{}]).then((data)=> { return dealAssets(data, config); }); } }, transformLayout: function(pageData, transformLayoutType) { switch (transformLayoutType) { case 'fiz': pageData = transformLayoutViaFiz(pageData, 'abs', 1); break; default: break; } return pageData; }, /** * * @param assets {"kimi":"6.x.x","kissy":"6.x.x"} * { kimi: { js: [ '//g.alicdn.com/??/kissy/kimi/6.0.1/kimi-min.js,/mtb/3rd/1.0.0/kissy-mod-define.js' ], css: [] }, kissy: { js: [ '//g.alicdn.com/??/kissy/k/6.2.4/seed-min.js' ], css: [] } } */ assetsCdnPath: function(assets){ return upx.request('assetsService.getAssetsVersionBySemVersion', [assets]).then(function(data){ var newAssets = {}; _.each(data,function(asset){ var value = asset.parsedValue; if(value.length){ var cdnAssets = { "js":{}, "css":{} }; _.each(value,function(assetItem){ var oUrl = GetUrl(assetItem.url); if(!cdnAssets[assetItem.type]) cdnAssets[assetItem.type] = {}; if(!cdnAssets[assetItem.type][oUrl.host]) cdnAssets[assetItem.type][oUrl.host] = []; cdnAssets[assetItem.type][oUrl.host].push(oUrl.path); }); newAssets[asset.name] = formatAssets(cdnAssets); } }); return newAssets; }); }, /** * 合并依赖,形成 cdn combo 地址 * @param depNames demo: ['kimi','mmd','kissy-mod-define'] * @param oPath #assetsCdnPath() 返回的 object * @return {js:'',css:''} */ comboAssets: function(depNames,oPath){ var comboJs = {}; var comboCss = {}; function _setComboContent(content,target){ if(!content || !content.length) return false; _.each(content,function(asset){ var section = asset.split('??'); var host = section[0]; //去掉协议头 host = host.replace('http:',''); host = host.replace('https:',''); host = host.replace('//',''); host = host.replace(/\/$/,''); if(!target[host]){ target[host] = []; } target[host].push(section[1]); }); } _.each(depNames,function(depName){ var depContent = oPath[depName]; if(depContent){ _setComboContent(depContent.js,comboJs); _setComboContent(depContent.css,comboCss); } }); _.each(comboJs,function(aPath,host){ comboJs[host] = '//'+host + '??' + aPath.join(','); }); _.each(comboCss,function(aPath,host){ comboCss[host] = '//'+host + '??' + aPath.join(','); }); return {js:comboJs,css:comboCss}; }, /** * 根据终端类型不同,使用不同的 xtpl * @param name * @param terminalType */ fizXtplName: function(name,terminalType){ if(terminalType && terminalType === 'pc'){ name = name.replace('.xtpl','_'+terminalType+'.xtpl'); } return name; } }; module.exports = util;