mirror of
https://gitcode.com/github-mirrors/react-native-update-cli.git
synced 2025-11-22 16:26:10 +08:00
* add logic to support SENTRY_PROPERTIES parameter * remove update.json and meta.json files in ppk * udpapte * refactor modles * update * add package-module file * update * update readme file * modifu cli.json file * fix command issues * improve version workflow logic * udpate * update * update * update * udpate * udpate * add example * update readme file * udpate version * change logic to use pushy command uniformly
173 lines
4.1 KiB
JavaScript
173 lines
4.1 KiB
JavaScript
function objectType(o) {
|
|
return Object.prototype.toString.call(o).slice(8, -1).toLowerCase();
|
|
}
|
|
|
|
function isArray(o) {
|
|
return objectType(o) === 'array';
|
|
}
|
|
|
|
function isObject(o) {
|
|
return objectType(o) === 'object';
|
|
}
|
|
|
|
function isPrimitive(o) {
|
|
return (
|
|
o === null ||
|
|
['boolean', 'number', 'string', 'undefined'].includes(objectType(o))
|
|
);
|
|
}
|
|
|
|
function isBrowser() {
|
|
return (
|
|
typeof process === 'undefined' ||
|
|
Object.prototype.toString.call(process) !== '[object process]'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* map file place with resourceMap
|
|
* @param {Object} apkInfo // json info parsed from .apk file
|
|
* @param {Object} resourceMap // resourceMap
|
|
*/
|
|
function mapInfoResource(apkInfo, resourceMap) {
|
|
iteratorObj(apkInfo);
|
|
return apkInfo;
|
|
function iteratorObj(obj) {
|
|
for (const i in obj) {
|
|
if (isArray(obj[i])) {
|
|
iteratorArray(obj[i]);
|
|
} else if (isObject(obj[i])) {
|
|
iteratorObj(obj[i]);
|
|
} else if (isPrimitive(obj[i])) {
|
|
if (isResources(obj[i])) {
|
|
obj[i] = resourceMap[transKeyToMatchResourceMap(obj[i])];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function iteratorArray(array) {
|
|
const l = array.length;
|
|
for (let i = 0; i < l; i++) {
|
|
if (isArray(array[i])) {
|
|
iteratorArray(array[i]);
|
|
} else if (isObject(array[i])) {
|
|
iteratorObj(array[i]);
|
|
} else if (isPrimitive(array[i])) {
|
|
if (isResources(array[i])) {
|
|
array[i] = resourceMap[transKeyToMatchResourceMap(array[i])];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function isResources(attrValue) {
|
|
if (!attrValue) return false;
|
|
if (typeof attrValue !== 'string') {
|
|
attrValue = attrValue.toString();
|
|
}
|
|
return attrValue.indexOf('resourceId:') === 0;
|
|
}
|
|
|
|
function transKeyToMatchResourceMap(resourceId) {
|
|
return '@' + resourceId.replace('resourceId:0x', '').toUpperCase();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* find .apk file's icon path from json info
|
|
* @param info // json info parsed from .apk file
|
|
*/
|
|
function findApkIconPath(info) {
|
|
if (!info.application.icon || !info.application.icon.splice) {
|
|
return '';
|
|
}
|
|
const rulesMap = {
|
|
mdpi: 48,
|
|
hdpi: 72,
|
|
xhdpi: 96,
|
|
xxdpi: 144,
|
|
xxxhdpi: 192,
|
|
};
|
|
const resultMap = {};
|
|
const maxDpiIcon = { dpi: 120, icon: '' };
|
|
|
|
for (const i in rulesMap) {
|
|
info.application.icon.some((icon) => {
|
|
if (icon && icon.indexOf(i) !== -1) {
|
|
resultMap['application-icon-' + rulesMap[i]] = icon;
|
|
return true;
|
|
}
|
|
});
|
|
|
|
// get the maximal size icon
|
|
if (
|
|
resultMap['application-icon-' + rulesMap[i]] &&
|
|
rulesMap[i] >= maxDpiIcon.dpi
|
|
) {
|
|
maxDpiIcon.dpi = rulesMap[i];
|
|
maxDpiIcon.icon = resultMap['application-icon-' + rulesMap[i]];
|
|
}
|
|
}
|
|
|
|
if (Object.keys(resultMap).length === 0 || !maxDpiIcon.icon) {
|
|
maxDpiIcon.dpi = 120;
|
|
maxDpiIcon.icon = info.application.icon[0] || '';
|
|
resultMap['applicataion-icon-120'] = maxDpiIcon.icon;
|
|
}
|
|
return maxDpiIcon.icon;
|
|
}
|
|
|
|
/**
|
|
* find .ipa file's icon path from json info
|
|
* @param info // json info parsed from .ipa file
|
|
*/
|
|
function findIpaIconPath(info) {
|
|
if (
|
|
info.CFBundleIcons &&
|
|
info.CFBundleIcons.CFBundlePrimaryIcon &&
|
|
info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles &&
|
|
info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles.length
|
|
) {
|
|
return info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles[
|
|
info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles.length - 1
|
|
];
|
|
} else if (info.CFBundleIconFiles && info.CFBundleIconFiles.length) {
|
|
return info.CFBundleIconFiles[info.CFBundleIconFiles.length - 1];
|
|
} else {
|
|
return '.app/Icon.png';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* transform buffer to base64
|
|
* @param {Buffer} buffer
|
|
*/
|
|
function getBase64FromBuffer(buffer) {
|
|
return 'data:image/png;base64,' + buffer.toString('base64');
|
|
}
|
|
|
|
/**
|
|
* 去除unicode空字符
|
|
* @param {String} str
|
|
*/
|
|
function decodeNullUnicode(str) {
|
|
if (typeof str === 'string') {
|
|
// eslint-disable-next-line
|
|
str = str.replace(/\u0000/g, '');
|
|
}
|
|
return str;
|
|
}
|
|
|
|
module.exports = {
|
|
isArray,
|
|
isObject,
|
|
isPrimitive,
|
|
isBrowser,
|
|
mapInfoResource,
|
|
findApkIconPath,
|
|
findIpaIconPath,
|
|
getBase64FromBuffer,
|
|
decodeNullUnicode,
|
|
};
|