mirror of
				https://gitcode.com/github-mirrors/react-native-update-cli.git
				synced 2025-10-31 14:53:11 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			168 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
 | |
| }
 | 
