isv-page-json-to-xtpl
Version:
abs 将页面 json 转换成 html
195 lines (178 loc) • 5.18 kB
JavaScript
/**
* @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;