UNPKG

@alicd/micro-stark

Version:

cone微应用

113 lines (101 loc) 3.31 kB
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; }