packages/core/alfa-core/src/utils/index.ts (82 lines of code) (raw):
import { getMainUid, getMD5MainUid } from './uid';
import { IAppConfig, AlfaFeature } from '../types';
export { getEnv } from './env';
export { getLocale } from './locale';
export { getMainUid, getMD5MainUid };
export function getFeatureStatus(feature?: AlfaFeature) {
const uid = getMainUid();
const md5Uid = getMD5MainUid();
if (!feature || !md5Uid) return false;
const {
enableBlockList, enableSampling, enableWhiteList, sampling, blockList, whiteList,
} = feature;
if (enableBlockList && blockList?.includes(md5Uid)) return false;
if (enableWhiteList && whiteList?.includes(md5Uid)) return true;
if (enableSampling && uid) {
const gray = uid.substring(uid.length - 2);
if (Number(gray) >= (sampling ?? 0) * 100 || sampling === 0) return false;
return true;
}
return false;
}
export const getURL = (appConfig: IAppConfig) => {
const { entry } = appConfig;
let url = '';
if (typeof entry === 'string') {
url = entry;
}
return url;
};
export const getManifestFromConfig = (appConfig: IAppConfig) => {
// 定义了 entry 时,优先从 entry 生成 manifest
if (appConfig.entry && typeof appConfig.entry !== 'string') {
return {
name: appConfig.name,
resources: {},
entrypoints: {
index: {
js: appConfig.entry.scripts,
css: appConfig.entry.styles || [],
},
},
};
}
return appConfig.manifest;
};
function trimArray(arr: string[]) {
const lastIndex = arr.length - 1;
let start = 0;
for (; start <= lastIndex; start++) {
if (arr[start]) break;
}
let end = lastIndex;
for (; end >= 0; end--) {
if (arr[end]) break;
}
if (start === 0 && end === lastIndex) return arr;
if (start > end) return [];
return arr.slice(start, end + 1);
}
/**
* return relative path or full url
* @param from
* @param to
* @param base
* @returns
*/
export const getRelativePath = (from: string, to: string, base?: string) => {
try {
const { host: fromHost, pathname: fromPath } = new URL(from, base || from);
const { host: toHost, pathname: toPath } = new URL(to, base || from);
// from 'g.alicdn.com' to 'dev.g.alicdn.com' regarded as same host
if (fromHost !== toHost && (toHost !== 'g.alicdn.com' || fromHost !== 'dev.g.alicdn.com')) return to;
const fromParts = trimArray(fromPath.split('/'));
const toParts = trimArray(toPath.split('/'));
const length = Math.min(fromParts.length, toParts.length);
let samePartsLength = length;
for (let i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
const outputParts = [];
for (let i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
return outputParts.concat(toParts.slice(samePartsLength)).join('/');
} catch (e) {
return to;
}
};