@alicd/micro-stark
Version:
cone微应用
113 lines (101 loc) • 3.31 kB
JavaScript
import unescape from 'lodash/unescape';
import { getQueryParams } from './utils';
const supportContext = {
WINDOW:'window',
COOKIES:'cookies',
QUERY:'query',
}
function checkContainContext (exprStr,varnameSign){
return (
exprStr.startsWith(`${varnameSign}.`)
|| exprStr.startsWith(`${varnameSign}[`)
);
}
export function getCookies() {
let map = {};
const decodedCookie = decodeURIComponent(document.cookie);
const ca = decodedCookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1);
}
if (c.indexOf('=')) {
let temp = c.split('=');
if (temp[0]) map[temp[0]] = temp[1];
}
}
return map;
}
function createFn(arg, expressStr) {
let fnStr = `
var data = ${expressStr};
return data;
`
return new Function(arg, fnStr)
}
export default (rawConfig) => {
const isDebug = location.href.includes('debug='); // 当前是否处于debug模式
let processedConfig;
if (!rawConfig) throw Error('没有找到配置');
if (typeof rawConfig === 'string') {
try {
processedConfig = JSON.parse(rawConfig)
} catch (error) {
console.error(error);
}
} else {
processedConfig = rawConfig;
}
const queryMap = getQueryParams();
const debugAppId = queryMap['debug'];
const cookiesMap = getCookies();
// 对配置文件进行处理
processedConfig.forEach(item => {
if (isDebug && item.subapp_id === debugAppId && item.debugPrefix) {
item.isDebug = true;
item.url = item.url.map((it) =>
it.replace(`{prefix}{version}`, item.debugPrefix)
);
} else {
item.url = item.url.map((it) =>
it.replace('{prefix}', item.prefix).replace('{version}', item.version)
);
}
// 可以使用{}模板语法 能够识别window location中的参数 使用方式{window.xxx} {query.xxx},其他方式暂时不识别
item.url = item.url.map((it) => {
let newUrl = deepUnescape(it);
const varTplList = newUrl.match(/\{([^\}]+)\}/g);
if (!varTplList) return newUrl;
const varList = varTplList.map(varTpl => ({ varTpl: varTpl, varExpr: varTpl.replace('{', '').replace('}', '') }));
varList.forEach(varItem => {
if (!varItem.varExpr) return;
try {
if (checkContainContext(varItem.varExpr,supportContext.WINDOW)) {
const fn = createFn(void (0), varItem.varExpr);
varItem.data = fn();
} else if (checkContainContext(varItem.varExpr,supportContext.QUERY)) {
const fn = createFn(supportContext.QUERY, varItem.varExpr);
varItem.data = fn(queryMap);
} else if (checkContainContext(varItem.varExpr,supportContext.COOKIES)) {
const fn = createFn(supportContext.COOKIES, varItem.varExpr);
varItem.data = fn(cookiesMap);
}
} catch (error) {
console.error(error);
}
if (varItem.data) newUrl = newUrl.replace(varItem.varTpl, varItem.data);
})
return newUrl;
}
);
});
return rawConfig;
}
function deepUnescape(str) {
let newStr = unescape(str);
if (newStr.includes(';') && newStr !== str) {
newStr = deepUnescape(newStr);
}
return newStr;
}