react-native-update-cli 2.5.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh-CN.md +2 -0
- package/cli.json +26 -0
- package/lib/api.js +45 -12
- package/lib/locales/en.js +13 -1
- package/lib/locales/zh.js +13 -1
- package/lib/package.js +53 -6
- package/lib/provider.js +3 -0
- package/lib/utils/app-info-parser/aab.js +165 -201
- package/lib/utils/app-info-parser/apk.js +25 -27
- package/lib/utils/app-info-parser/app.js +10 -11
- package/lib/utils/app-info-parser/index.js +8 -8
- package/lib/utils/app-info-parser/ipa.js +16 -21
- package/lib/utils/app-info-parser/resource-finder.js +365 -305
- package/lib/utils/app-info-parser/utils.js +78 -63
- package/lib/utils/app-info-parser/xml-parser/binary.js +57 -51
- package/lib/utils/app-info-parser/xml-parser/manifest.js +47 -39
- package/lib/utils/app-info-parser/zip.js +21 -11
- package/lib/utils/http-helper.js +1 -1
- package/package.json +1 -1
- package/src/api.ts +45 -19
- package/src/locales/en.ts +17 -0
- package/src/locales/zh.ts +15 -0
- package/src/modules/version-module.ts +1 -1
- package/src/package.ts +102 -11
- package/src/provider.ts +3 -0
- package/src/utils/app-info-parser/aab.ts +240 -0
- package/src/utils/app-info-parser/{apk.js → apk.ts} +30 -41
- package/src/utils/app-info-parser/app.ts +3 -0
- package/src/utils/app-info-parser/index.ts +4 -4
- package/src/utils/app-info-parser/{ipa.js → ipa.ts} +17 -31
- package/src/utils/app-info-parser/resource-finder.ts +508 -0
- package/src/utils/app-info-parser/utils.ts +162 -0
- package/src/utils/app-info-parser/xml-parser/{binary.js → binary.ts} +69 -61
- package/src/utils/app-info-parser/xml-parser/{manifest.js → manifest.ts} +50 -51
- package/src/utils/app-info-parser/zip.ts +86 -0
- package/src/utils/dep-versions.ts +7 -4
- package/src/utils/http-helper.ts +1 -1
- package/src/utils/latest-version/index.ts +2 -1
- package/src/versions.ts +1 -1
- package/src/utils/app-info-parser/aab.js +0 -326
- package/src/utils/app-info-parser/app.js +0 -16
- package/src/utils/app-info-parser/resource-finder.js +0 -495
- package/src/utils/app-info-parser/utils.js +0 -172
- package/src/utils/app-info-parser/zip.js +0 -66
|
@@ -1,54 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} = require('./utils');
|
|
1
|
+
import { ResourceFinder } from './resource-finder';
|
|
2
|
+
import { findApkIconPath, getBase64FromBuffer, mapInfoResource } from './utils';
|
|
3
|
+
import { ManifestParser } from './xml-parser/manifest';
|
|
4
|
+
import { Zip } from './zip';
|
|
5
|
+
|
|
7
6
|
const ManifestName = /^androidmanifest\.xml$/;
|
|
8
7
|
const ResourceName = /^resources\.arsc$/;
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ApkParser extends Zip {
|
|
14
|
-
/**
|
|
15
|
-
* parser for parsing .apk file
|
|
16
|
-
* @param {String | File | Blob} file // file's path in Node, instance of File or Blob in Browser
|
|
17
|
-
*/
|
|
18
|
-
constructor(file) {
|
|
19
|
-
super(file);
|
|
20
|
-
if (!(this instanceof ApkParser)) {
|
|
21
|
-
return new ApkParser(file);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
parse() {
|
|
9
|
+
export class ApkParser extends Zip {
|
|
10
|
+
parse(): Promise<any> {
|
|
25
11
|
return new Promise((resolve, reject) => {
|
|
26
12
|
this.getEntries([ManifestName, ResourceName])
|
|
27
|
-
.then((buffers) => {
|
|
28
|
-
|
|
13
|
+
.then((buffers: any) => {
|
|
14
|
+
const manifestBuffer = buffers[ManifestName];
|
|
15
|
+
if (!manifestBuffer) {
|
|
29
16
|
throw new Error("AndroidManifest.xml can't be found.");
|
|
30
17
|
}
|
|
31
|
-
let apkInfo
|
|
32
|
-
let resourceMap;
|
|
18
|
+
let apkInfo: any;
|
|
19
|
+
let resourceMap: any;
|
|
20
|
+
|
|
21
|
+
apkInfo = this._parseManifest(manifestBuffer as Buffer);
|
|
22
|
+
|
|
33
23
|
if (!buffers[ResourceName]) {
|
|
34
24
|
resolve(apkInfo);
|
|
35
25
|
} else {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
26
|
+
resourceMap = this._parseResourceMap(
|
|
27
|
+
buffers[ResourceName] as Buffer,
|
|
28
|
+
);
|
|
39
29
|
apkInfo = mapInfoResource(apkInfo, resourceMap);
|
|
40
30
|
|
|
41
|
-
// find icon path and parse icon
|
|
42
31
|
const iconPath = findApkIconPath(apkInfo);
|
|
43
32
|
if (iconPath) {
|
|
44
33
|
this.getEntry(iconPath)
|
|
45
|
-
.then((iconBuffer) => {
|
|
34
|
+
.then((iconBuffer: Buffer | null) => {
|
|
46
35
|
apkInfo.icon = iconBuffer
|
|
47
36
|
? getBase64FromBuffer(iconBuffer)
|
|
48
37
|
: null;
|
|
49
38
|
resolve(apkInfo);
|
|
50
39
|
})
|
|
51
|
-
.catch((e) => {
|
|
40
|
+
.catch((e: any) => {
|
|
52
41
|
apkInfo.icon = null;
|
|
53
42
|
resolve(apkInfo);
|
|
54
43
|
console.warn('[Warning] failed to parse icon: ', e);
|
|
@@ -59,18 +48,19 @@ class ApkParser extends Zip {
|
|
|
59
48
|
}
|
|
60
49
|
}
|
|
61
50
|
})
|
|
62
|
-
.catch((e) => {
|
|
51
|
+
.catch((e: any) => {
|
|
63
52
|
reject(e);
|
|
64
53
|
});
|
|
65
54
|
});
|
|
66
55
|
}
|
|
56
|
+
|
|
67
57
|
/**
|
|
68
58
|
* Parse manifest
|
|
69
59
|
* @param {Buffer} buffer // manifest file's buffer
|
|
70
60
|
*/
|
|
71
|
-
_parseManifest(buffer) {
|
|
61
|
+
private _parseManifest(buffer: Buffer) {
|
|
72
62
|
try {
|
|
73
|
-
const parser = new
|
|
63
|
+
const parser = new ManifestParser(buffer, {
|
|
74
64
|
ignore: [
|
|
75
65
|
'application.activity',
|
|
76
66
|
'application.service',
|
|
@@ -80,21 +70,20 @@ class ApkParser extends Zip {
|
|
|
80
70
|
],
|
|
81
71
|
});
|
|
82
72
|
return parser.parse();
|
|
83
|
-
} catch (e) {
|
|
84
|
-
throw new Error(
|
|
73
|
+
} catch (e: any) {
|
|
74
|
+
throw new Error(`Parse AndroidManifest.xml error: ${e.message || e}`);
|
|
85
75
|
}
|
|
86
76
|
}
|
|
77
|
+
|
|
87
78
|
/**
|
|
88
79
|
* Parse resourceMap
|
|
89
80
|
* @param {Buffer} buffer // resourceMap file's buffer
|
|
90
81
|
*/
|
|
91
|
-
_parseResourceMap(buffer) {
|
|
82
|
+
private _parseResourceMap(buffer: Buffer) {
|
|
92
83
|
try {
|
|
93
84
|
return new ResourceFinder().processResourceTable(buffer);
|
|
94
|
-
} catch (e) {
|
|
95
|
-
throw new Error(
|
|
85
|
+
} catch (e: any) {
|
|
86
|
+
throw new Error(`Parser resources.arsc error: ${e}`);
|
|
96
87
|
}
|
|
97
88
|
}
|
|
98
89
|
}
|
|
99
|
-
|
|
100
|
-
module.exports = ApkParser;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { AabParser } from './aab';
|
|
2
|
+
import { ApkParser } from './apk';
|
|
3
|
+
import { AppParser } from './app';
|
|
4
|
+
import { IpaParser } from './ipa';
|
|
5
5
|
const supportFileTypes = ['ipa', 'apk', 'app', 'aab'];
|
|
6
6
|
|
|
7
7
|
class AppInfoParser {
|
|
@@ -2,49 +2,37 @@ const parsePlist = require('plist').parse;
|
|
|
2
2
|
const parseBplist = require('bplist-parser').parseBuffer;
|
|
3
3
|
const cgbiToPng = require('cgbi-to-png');
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import { findIpaIconPath, getBase64FromBuffer, isBrowser } from './utils';
|
|
6
|
+
import { Zip } from './zip';
|
|
7
7
|
|
|
8
8
|
const PlistName = /payload\/[^\/]+?.app\/info.plist$/i;
|
|
9
9
|
const ProvisionName = /payload\/.+?\.app\/embedded.mobileprovision/;
|
|
10
10
|
|
|
11
|
-
class IpaParser extends Zip {
|
|
12
|
-
|
|
13
|
-
* parser for parsing .ipa file
|
|
14
|
-
* @param {String | File | Blob} file // file's path in Node, instance of File or Blob in Browser
|
|
15
|
-
*/
|
|
16
|
-
constructor(file) {
|
|
17
|
-
super(file);
|
|
18
|
-
if (!(this instanceof IpaParser)) {
|
|
19
|
-
return new IpaParser(file);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
parse() {
|
|
11
|
+
export class IpaParser extends Zip {
|
|
12
|
+
parse(): Promise<any> {
|
|
23
13
|
return new Promise((resolve, reject) => {
|
|
24
14
|
this.getEntries([PlistName, ProvisionName])
|
|
25
|
-
.then((buffers) => {
|
|
26
|
-
if (!buffers[PlistName]) {
|
|
15
|
+
.then((buffers: any) => {
|
|
16
|
+
if (!buffers[PlistName as any]) {
|
|
27
17
|
throw new Error("Info.plist can't be found.");
|
|
28
18
|
}
|
|
29
|
-
const plistInfo = this._parsePlist(buffers[PlistName]);
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
const plistInfo = this._parsePlist(buffers[PlistName as any]);
|
|
20
|
+
const provisionInfo = this._parseProvision(
|
|
21
|
+
buffers[ProvisionName as any],
|
|
22
|
+
);
|
|
32
23
|
plistInfo.mobileProvision = provisionInfo;
|
|
33
24
|
|
|
34
|
-
// find icon path and parse icon
|
|
35
25
|
const iconRegex = new RegExp(
|
|
36
26
|
findIpaIconPath(plistInfo).toLowerCase(),
|
|
37
27
|
);
|
|
38
28
|
this.getEntry(iconRegex)
|
|
39
|
-
.then((iconBuffer) => {
|
|
29
|
+
.then((iconBuffer: any) => {
|
|
40
30
|
try {
|
|
41
|
-
// In general, the ipa file's icon has been specially processed, should be converted
|
|
42
31
|
plistInfo.icon = iconBuffer
|
|
43
32
|
? getBase64FromBuffer(cgbiToPng.revert(iconBuffer))
|
|
44
33
|
: null;
|
|
45
34
|
} catch (err) {
|
|
46
35
|
if (isBrowser()) {
|
|
47
|
-
// Normal conversion in other cases
|
|
48
36
|
plistInfo.icon = iconBuffer
|
|
49
37
|
? getBase64FromBuffer(
|
|
50
38
|
window.btoa(String.fromCharCode(...iconBuffer)),
|
|
@@ -57,11 +45,11 @@ class IpaParser extends Zip {
|
|
|
57
45
|
}
|
|
58
46
|
resolve(plistInfo);
|
|
59
47
|
})
|
|
60
|
-
.catch((e) => {
|
|
48
|
+
.catch((e: any) => {
|
|
61
49
|
reject(e);
|
|
62
50
|
});
|
|
63
51
|
})
|
|
64
|
-
.catch((e) => {
|
|
52
|
+
.catch((e: any) => {
|
|
65
53
|
reject(e);
|
|
66
54
|
});
|
|
67
55
|
});
|
|
@@ -70,8 +58,8 @@ class IpaParser extends Zip {
|
|
|
70
58
|
* Parse plist
|
|
71
59
|
* @param {Buffer} buffer // plist file's buffer
|
|
72
60
|
*/
|
|
73
|
-
_parsePlist(buffer) {
|
|
74
|
-
let result;
|
|
61
|
+
private _parsePlist(buffer: Buffer) {
|
|
62
|
+
let result: any;
|
|
75
63
|
const bufferType = buffer[0];
|
|
76
64
|
if (bufferType === 60 || bufferType === '<' || bufferType === 239) {
|
|
77
65
|
result = parsePlist(buffer.toString());
|
|
@@ -86,8 +74,8 @@ class IpaParser extends Zip {
|
|
|
86
74
|
* parse provision
|
|
87
75
|
* @param {Buffer} buffer // provision file's buffer
|
|
88
76
|
*/
|
|
89
|
-
_parseProvision(buffer) {
|
|
90
|
-
let info = {};
|
|
77
|
+
private _parseProvision(buffer: Buffer | undefined) {
|
|
78
|
+
let info: Record<string, any> = {};
|
|
91
79
|
if (buffer) {
|
|
92
80
|
let content = buffer.toString('utf-8');
|
|
93
81
|
const firstIndex = content.indexOf('<?xml');
|
|
@@ -100,5 +88,3 @@ class IpaParser extends Zip {
|
|
|
100
88
|
return info;
|
|
101
89
|
}
|
|
102
90
|
}
|
|
103
|
-
|
|
104
|
-
module.exports = IpaParser;
|