react-native-update-cli 1.30.3 → 1.31.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/lib/index.js CHANGED
@@ -1,55 +1,52 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';
3
-
4
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
5
-
6
- var _api = require('./api');
7
-
8
- var _updateNotifier = require('update-notifier');
9
-
10
- var _updateNotifier2 = _interopRequireDefault(_updateNotifier);
11
-
12
- var _index = require('./utils/index.js');
13
-
14
- var _package = require('../package.json');
15
-
16
- var _package2 = _interopRequireDefault(_package);
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- (0, _updateNotifier2.default)({ pkg: _package2.default }).notify({ isGlobal: true });
21
-
22
- function printUsage({ args }) {
23
- // const commandName = args[0];
24
- // TODO: print usage of commandName, or print global usage.
25
-
26
- console.log('Usage is under development now.');
27
- console.log('Visit `https://github.com/reactnativecn/react-native-pushy` for early document.');
28
- process.exit(1);
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ const _api = require("./api");
7
+ const _updatenotifier = /*#__PURE__*/ _interop_require_default(require("update-notifier"));
8
+ const _index = require("./utils/index.js");
9
+ const _packagejson = /*#__PURE__*/ _interop_require_default(require("../package.json"));
10
+ function _interop_require_default(obj) {
11
+ return obj && obj.__esModule ? obj : {
12
+ default: obj
13
+ };
29
14
  }
30
-
31
- const commands = _extends({}, require('./user').commands, require('./bundle').commands, require('./app').commands, require('./package').commands, require('./versions').commands, {
32
- help: printUsage
15
+ (0, _updatenotifier.default)({
16
+ pkg: _packagejson.default
17
+ }).notify({
18
+ isGlobal: true
33
19
  });
34
-
20
+ function printUsage({ args }) {
21
+ // const commandName = args[0];
22
+ // TODO: print usage of commandName, or print global usage.
23
+ console.log('Usage is under development now.');
24
+ console.log('Visit `https://github.com/reactnativecn/react-native-pushy` for early document.');
25
+ process.exit(1);
26
+ }
27
+ const commands = {
28
+ ...require('./user').commands,
29
+ ...require('./bundle').commands,
30
+ ...require('./app').commands,
31
+ ...require('./package').commands,
32
+ ...require('./versions').commands,
33
+ help: printUsage
34
+ };
35
35
  function run() {
36
- (0, _index.printVersionCommand)();
37
- if (process.argv.indexOf('-v') >= 0 || process.argv[2] === 'version') {
38
- process.exit();
39
- }
40
-
41
- const argv = require('cli-arguments').parse(require('../cli.json'));
42
- global.NO_INTERACTIVE = argv.options['no-interactive'];
43
- global.USE_ACC_OSS = argv.options['acc'];
44
-
45
- (0, _api.loadSession)().then(() => commands[argv.command](argv)).catch(err => {
46
- if (err.status === 401) {
47
- console.log('尚未登录。\n请在项目目录中运行`pushy login`命令来登录');
48
- return;
36
+ (0, _index.printVersionCommand)();
37
+ if (process.argv.indexOf('-v') >= 0 || process.argv[2] === 'version') {
38
+ process.exit();
49
39
  }
50
- console.error(err.stack);
51
- process.exit(-1);
52
- });
40
+ const argv = require('cli-arguments').parse(require('../cli.json'));
41
+ global.NO_INTERACTIVE = argv.options['no-interactive'];
42
+ global.USE_ACC_OSS = argv.options['acc'];
43
+ (0, _api.loadSession)().then(()=>commands[argv.command](argv)).catch((err)=>{
44
+ if (err.status === 401) {
45
+ console.log('尚未登录。\n请在项目目录中运行`pushy login`命令来登录');
46
+ return;
47
+ }
48
+ console.error(err.stack);
49
+ process.exit(-1);
50
+ });
53
51
  }
54
-
55
- run();
52
+ run();
package/lib/package.js CHANGED
@@ -1,145 +1,141 @@
1
- 'use strict';
2
-
1
+ "use strict";
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.commands = undefined;
7
- exports.listPackage = listPackage;
8
- exports.choosePackage = choosePackage;
9
-
10
- var _api = require('./api');
11
-
12
- var _utils = require('./utils');
13
-
14
- var _app = require('./app');
15
-
16
- var _ttyTable = require('tty-table');
17
-
18
- var _ttyTable2 = _interopRequireDefault(_ttyTable);
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
- async function listPackage(appId) {
23
- const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
24
-
25
- const header = [{ value: '原生包 Id' }, { value: '原生版本' }];
26
- const rows = [];
27
- for (const pkg of data) {
28
- const { version } = pkg;
29
- let versionInfo = '';
30
- if (version) {
31
- versionInfo = `, 已绑定:${version.name} (${version.id})`;
32
- } else {
33
- // versionInfo = ' (newest)';
34
- }
35
- let output = pkg.name;
36
- if (pkg.status === 'paused') {
37
- output += '(已暂停)';
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ choosePackage: function() {
13
+ return choosePackage;
14
+ },
15
+ commands: function() {
16
+ return commands;
17
+ },
18
+ listPackage: function() {
19
+ return listPackage;
38
20
  }
39
- if (pkg.status === 'expired') {
40
- output += '(已过期)';
21
+ });
22
+ const _api = require("./api");
23
+ const _utils = require("./utils");
24
+ const _app = require("./app");
25
+ const _ttytable = /*#__PURE__*/ _interop_require_default(require("tty-table"));
26
+ function _interop_require_default(obj) {
27
+ return obj && obj.__esModule ? obj : {
28
+ default: obj
29
+ };
30
+ }
31
+ async function listPackage(appId) {
32
+ const { data } = await (0, _api.get)(`/app/${appId}/package/list?limit=1000`);
33
+ const header = [
34
+ {
35
+ value: '原生包 Id'
36
+ },
37
+ {
38
+ value: '原生版本'
39
+ }
40
+ ];
41
+ const rows = [];
42
+ for (const pkg of data){
43
+ const { version } = pkg;
44
+ let versionInfo = '';
45
+ if (version) {
46
+ versionInfo = `, 已绑定:${version.name} (${version.id})`;
47
+ } else {
48
+ // versionInfo = ' (newest)';
49
+ }
50
+ let output = pkg.name;
51
+ if (pkg.status === 'paused') {
52
+ output += '(已暂停)';
53
+ }
54
+ if (pkg.status === 'expired') {
55
+ output += '(已过期)';
56
+ }
57
+ output += versionInfo;
58
+ rows.push([
59
+ pkg.id,
60
+ output
61
+ ]);
41
62
  }
42
- output += versionInfo;
43
- rows.push([pkg.id, output]);
44
- }
45
-
46
- console.log((0, _ttyTable2.default)(header, rows).render());
47
- console.log(`\n共 ${data.length} 个包`);
48
- return data;
63
+ console.log((0, _ttytable.default)(header, rows).render());
64
+ console.log(`\n共 ${data.length} 个包`);
65
+ return data;
49
66
  }
50
-
51
67
  async function choosePackage(appId) {
52
- const list = await listPackage(appId);
53
-
54
- while (true) {
55
- const id = await (0, _utils.question)('输入原生包 id:');
56
- const app = list.find(v => v.id === (id | 0));
57
- if (app) {
58
- return app;
68
+ const list = await listPackage(appId);
69
+ while(true){
70
+ const id = await (0, _utils.question)('输入原生包 id:');
71
+ const app = list.find((v)=>v.id === (id | 0));
72
+ if (app) {
73
+ return app;
74
+ }
59
75
  }
60
- }
61
76
  }
62
-
63
- const commands = exports.commands = {
64
- uploadIpa: async function ({ args }) {
65
- const fn = args[0];
66
- if (!fn || !fn.endsWith('.ipa')) {
67
- throw new Error('使用方法: pushy uploadIpa ipa后缀文件');
68
- }
69
- const {
70
- versionName,
71
- buildTime,
72
- appId: appIdInPkg,
73
- appKey: appKeyInPkg
74
- } = await (0, _utils.getIpaInfo)(fn);
75
- const { appId, appKey } = await (0, _app.getSelectedApp)('ios');
76
-
77
- if (appIdInPkg && appIdInPkg != appId) {
78
- throw new Error(`appId不匹配!当前ipa: ${appIdInPkg}, 当前update.json: ${appId}`);
79
- }
80
-
81
- if (appKeyInPkg && appKeyInPkg !== appKey) {
82
- throw new Error(`appKey不匹配!当前ipa: ${appKeyInPkg}, 当前update.json: ${appKey}`);
83
- }
84
-
85
- const { hash } = await (0, _api.uploadFile)(fn);
86
-
87
- const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
88
- name: versionName,
89
- hash,
90
- buildTime
91
- });
92
- (0, _utils.saveToLocal)(fn, `${appId}/package/${id}.ipa`);
93
- console.log(`已成功上传ipa原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`);
94
- },
95
- uploadApk: async function ({ args }) {
96
- const fn = args[0];
97
- if (!fn || !fn.endsWith('.apk')) {
98
- throw new Error('使用方法: pushy uploadApk apk后缀文件');
99
- }
100
- const {
101
- versionName,
102
- buildTime,
103
- appId: appIdInPkg,
104
- appKey: appKeyInPkg
105
- } = await (0, _utils.getApkInfo)(fn);
106
- const { appId, appKey } = await (0, _app.getSelectedApp)('android');
107
-
108
- if (appIdInPkg && appIdInPkg != appId) {
109
- throw new Error(`appId不匹配!当前apk: ${appIdInPkg}, 当前update.json: ${appId}`);
110
- }
111
-
112
- if (appKeyInPkg && appKeyInPkg !== appKey) {
113
- throw new Error(`appKey不匹配!当前apk: ${appKeyInPkg}, 当前update.json: ${appKey}`);
114
- }
115
-
116
- const { hash } = await (0, _api.uploadFile)(fn);
117
-
118
- const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
119
- name: versionName,
120
- hash,
121
- buildTime
122
- });
123
- (0, _utils.saveToLocal)(fn, `${appId}/package/${id}.apk`);
124
- console.log(`已成功上传apk原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`);
125
- },
126
- parseIpa: async function ({ args }) {
127
- const fn = args[0];
128
- if (!fn || !fn.endsWith('.ipa')) {
129
- throw new Error('使用方法: pushy parseIpa ipa后缀文件');
130
- }
131
- console.log((await (0, _utils.getIpaInfo)(fn)));
132
- },
133
- parseApk: async function ({ args }) {
134
- const fn = args[0];
135
- if (!fn || !fn.endsWith('.apk')) {
136
- throw new Error('使用方法: pushy parseApk apk后缀文件');
77
+ const commands = {
78
+ uploadIpa: async function({ args }) {
79
+ const fn = args[0];
80
+ if (!fn || !fn.endsWith('.ipa')) {
81
+ throw new Error('使用方法: pushy uploadIpa ipa后缀文件');
82
+ }
83
+ const { versionName, buildTime, appId: appIdInPkg, appKey: appKeyInPkg } = await (0, _utils.getIpaInfo)(fn);
84
+ const { appId, appKey } = await (0, _app.getSelectedApp)('ios');
85
+ if (appIdInPkg && appIdInPkg != appId) {
86
+ throw new Error(`appId不匹配!当前ipa: ${appIdInPkg}, 当前update.json: ${appId}`);
87
+ }
88
+ if (appKeyInPkg && appKeyInPkg !== appKey) {
89
+ throw new Error(`appKey不匹配!当前ipa: ${appKeyInPkg}, 当前update.json: ${appKey}`);
90
+ }
91
+ const { hash } = await (0, _api.uploadFile)(fn);
92
+ const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
93
+ name: versionName,
94
+ hash,
95
+ buildTime
96
+ });
97
+ (0, _utils.saveToLocal)(fn, `${appId}/package/${id}.ipa`);
98
+ console.log(`已成功上传ipa原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`);
99
+ },
100
+ uploadApk: async function({ args }) {
101
+ const fn = args[0];
102
+ if (!fn || !fn.endsWith('.apk')) {
103
+ throw new Error('使用方法: pushy uploadApk apk后缀文件');
104
+ }
105
+ const { versionName, buildTime, appId: appIdInPkg, appKey: appKeyInPkg } = await (0, _utils.getApkInfo)(fn);
106
+ const { appId, appKey } = await (0, _app.getSelectedApp)('android');
107
+ if (appIdInPkg && appIdInPkg != appId) {
108
+ throw new Error(`appId不匹配!当前apk: ${appIdInPkg}, 当前update.json: ${appId}`);
109
+ }
110
+ if (appKeyInPkg && appKeyInPkg !== appKey) {
111
+ throw new Error(`appKey不匹配!当前apk: ${appKeyInPkg}, 当前update.json: ${appKey}`);
112
+ }
113
+ const { hash } = await (0, _api.uploadFile)(fn);
114
+ const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
115
+ name: versionName,
116
+ hash,
117
+ buildTime
118
+ });
119
+ (0, _utils.saveToLocal)(fn, `${appId}/package/${id}.apk`);
120
+ console.log(`已成功上传apk原生包(id: ${id}, version: ${versionName}, buildTime: ${buildTime})`);
121
+ },
122
+ parseIpa: async function({ args }) {
123
+ const fn = args[0];
124
+ if (!fn || !fn.endsWith('.ipa')) {
125
+ throw new Error('使用方法: pushy parseIpa ipa后缀文件');
126
+ }
127
+ console.log(await (0, _utils.getIpaInfo)(fn));
128
+ },
129
+ parseApk: async function({ args }) {
130
+ const fn = args[0];
131
+ if (!fn || !fn.endsWith('.apk')) {
132
+ throw new Error('使用方法: pushy parseApk apk后缀文件');
133
+ }
134
+ console.log(await (0, _utils.getApkInfo)(fn));
135
+ },
136
+ packages: async function({ options }) {
137
+ const platform = (0, _app.checkPlatform)(options.platform || await (0, _utils.question)('平台(ios/android):'));
138
+ const { appId } = await (0, _app.getSelectedApp)(platform);
139
+ await listPackage(appId);
137
140
  }
138
- console.log((await (0, _utils.getApkInfo)(fn)));
139
- },
140
- packages: async function ({ options }) {
141
- const platform = (0, _app.checkPlatform)(options.platform || (await (0, _utils.question)('平台(ios/android):')));
142
- const { appId } = await (0, _app.getSelectedApp)(platform);
143
- await listPackage(appId);
144
- }
145
- };
141
+ };
package/lib/user.js CHANGED
@@ -1,46 +1,48 @@
1
- 'use strict';
2
-
1
+ "use strict";
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.commands = undefined;
7
-
8
- var _utils = require('./utils');
9
-
10
- var _api = require('./api');
11
-
12
- var _crypto = require('crypto');
13
-
14
- var _crypto2 = _interopRequireDefault(_crypto);
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
5
+ Object.defineProperty(exports, "commands", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return commands;
9
+ }
10
+ });
11
+ const _utils = require("./utils");
12
+ const _api = require("./api");
13
+ const _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
14
+ function _interop_require_default(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
18
19
  function md5(str) {
19
- return _crypto2.default.createHash('md5').update(str).digest('hex');
20
+ return _crypto.default.createHash('md5').update(str).digest('hex');
20
21
  }
21
-
22
- const commands = exports.commands = {
23
- login: async function ({ args }) {
24
- const email = args[0] || (await (0, _utils.question)('email:'));
25
- const pwd = args[1] || (await (0, _utils.question)('password:', true));
26
- const { token, info } = await (0, _api.post)('/user/login', {
27
- email,
28
- pwd: md5(pwd)
29
- });
30
- (0, _api.replaceSession)({ token });
31
- await (0, _api.saveSession)();
32
- console.log(`欢迎使用 pushy 热更新服务, ${info.name}.`);
33
- },
34
- logout: async function () {
35
- await (0, _api.closeSession)();
36
- console.log('已退出登录');
37
- },
38
- me: async function () {
39
- const me = await (0, _api.get)('/user/me');
40
- for (const k in me) {
41
- if (k !== 'ok') {
42
- console.log(`${k}: ${me[k]}`);
43
- }
22
+ const commands = {
23
+ login: async function({ args }) {
24
+ const email = args[0] || await (0, _utils.question)('email:');
25
+ const pwd = args[1] || await (0, _utils.question)('password:', true);
26
+ const { token, info } = await (0, _api.post)('/user/login', {
27
+ email,
28
+ pwd: md5(pwd)
29
+ });
30
+ (0, _api.replaceSession)({
31
+ token
32
+ });
33
+ await (0, _api.saveSession)();
34
+ console.log(`欢迎使用 pushy 热更新服务, ${info.name}.`);
35
+ },
36
+ logout: async function() {
37
+ await (0, _api.closeSession)();
38
+ console.log('已退出登录');
39
+ },
40
+ me: async function() {
41
+ const me = await (0, _api.get)('/user/me');
42
+ for(const k in me){
43
+ if (k !== 'ok') {
44
+ console.log(`${k}: ${me[k]}`);
45
+ }
46
+ }
44
47
  }
45
- }
46
- };
48
+ };
@@ -1,86 +1,87 @@
1
- 'use strict';
2
-
1
+ "use strict";
3
2
  const Zip = require('./zip');
4
3
  const { mapInfoResource, findApkIconPath, getBase64FromBuffer } = require('./utils');
5
4
  const ManifestName = /^androidmanifest\.xml$/;
6
5
  const ResourceName = /^resources\.arsc$/;
7
-
8
6
  const ManifestXmlParser = require('./xml-parser/manifest');
9
7
  const ResourceFinder = require('./resource-finder');
10
-
11
8
  class ApkParser extends Zip {
12
- /**
13
- * parser for parsing .apk 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 ApkParser)) {
19
- return new ApkParser(file);
20
- }
21
- }
22
- parse() {
23
- return new Promise((resolve, reject) => {
24
- this.getEntries([ManifestName, ResourceName]).then(buffers => {
25
- if (!buffers[ManifestName]) {
26
- throw new Error('AndroidManifest.xml can\'t be found.');
27
- }
28
- let apkInfo = this._parseManifest(buffers[ManifestName]);
29
- let resourceMap;
30
- if (!buffers[ResourceName]) {
31
- resolve(apkInfo);
32
- } else {
33
- // parse resourceMap
34
- resourceMap = this._parseResourceMap(buffers[ResourceName]);
35
- // update apkInfo with resourceMap
36
- apkInfo = mapInfoResource(apkInfo, resourceMap);
37
-
38
- // find icon path and parse icon
39
- const iconPath = findApkIconPath(apkInfo);
40
- if (iconPath) {
41
- this.getEntry(iconPath).then(iconBuffer => {
42
- apkInfo.icon = iconBuffer ? getBase64FromBuffer(iconBuffer) : null;
43
- resolve(apkInfo);
44
- }).catch(e => {
45
- apkInfo.icon = null;
46
- resolve(apkInfo);
47
- console.warn('[Warning] failed to parse icon: ', e);
9
+ parse() {
10
+ return new Promise((resolve, reject)=>{
11
+ this.getEntries([
12
+ ManifestName,
13
+ ResourceName
14
+ ]).then((buffers)=>{
15
+ if (!buffers[ManifestName]) {
16
+ throw new Error('AndroidManifest.xml can\'t be found.');
17
+ }
18
+ let apkInfo = this._parseManifest(buffers[ManifestName]);
19
+ let resourceMap;
20
+ if (!buffers[ResourceName]) {
21
+ resolve(apkInfo);
22
+ } else {
23
+ // parse resourceMap
24
+ resourceMap = this._parseResourceMap(buffers[ResourceName]);
25
+ // update apkInfo with resourceMap
26
+ apkInfo = mapInfoResource(apkInfo, resourceMap);
27
+ // find icon path and parse icon
28
+ const iconPath = findApkIconPath(apkInfo);
29
+ if (iconPath) {
30
+ this.getEntry(iconPath).then((iconBuffer)=>{
31
+ apkInfo.icon = iconBuffer ? getBase64FromBuffer(iconBuffer) : null;
32
+ resolve(apkInfo);
33
+ }).catch((e)=>{
34
+ apkInfo.icon = null;
35
+ resolve(apkInfo);
36
+ console.warn('[Warning] failed to parse icon: ', e);
37
+ });
38
+ } else {
39
+ apkInfo.icon = null;
40
+ resolve(apkInfo);
41
+ }
42
+ }
43
+ }).catch((e)=>{
44
+ reject(e);
48
45
  });
49
- } else {
50
- apkInfo.icon = null;
51
- resolve(apkInfo);
52
- }
53
- }
54
- }).catch(e => {
55
- reject(e);
56
- });
57
- });
58
- }
59
- /**
46
+ });
47
+ }
48
+ /**
60
49
  * Parse manifest
61
50
  * @param {Buffer} buffer // manifest file's buffer
62
- */
63
- _parseManifest(buffer) {
64
- try {
65
- const parser = new ManifestXmlParser(buffer, {
66
- ignore: ['application.activity', 'application.service', 'application.receiver', 'application.provider', 'permission-group']
67
- });
68
- return parser.parse();
69
- } catch (e) {
70
- throw new Error('Parse AndroidManifest.xml error: ', e);
51
+ */ _parseManifest(buffer) {
52
+ try {
53
+ const parser = new ManifestXmlParser(buffer, {
54
+ ignore: [
55
+ 'application.activity',
56
+ 'application.service',
57
+ 'application.receiver',
58
+ 'application.provider',
59
+ 'permission-group'
60
+ ]
61
+ });
62
+ return parser.parse();
63
+ } catch (e) {
64
+ throw new Error('Parse AndroidManifest.xml error: ', e);
65
+ }
71
66
  }
72
- }
73
- /**
67
+ /**
74
68
  * Parse resourceMap
75
69
  * @param {Buffer} buffer // resourceMap file's buffer
76
- */
77
- _parseResourceMap(buffer) {
78
- try {
79
- return new ResourceFinder().processResourceTable(buffer);
80
- } catch (e) {
81
- throw new Error('Parser resources.arsc error: ' + e);
70
+ */ _parseResourceMap(buffer) {
71
+ try {
72
+ return new ResourceFinder().processResourceTable(buffer);
73
+ } catch (e) {
74
+ throw new Error('Parser resources.arsc error: ' + e);
75
+ }
76
+ }
77
+ /**
78
+ * parser for parsing .apk file
79
+ * @param {String | File | Blob} file // file's path in Node, instance of File or Blob in Browser
80
+ */ constructor(file){
81
+ super(file);
82
+ if (!(this instanceof ApkParser)) {
83
+ return new ApkParser(file);
84
+ }
82
85
  }
83
- }
84
86
  }
85
-
86
- module.exports = ApkParser;
87
+ module.exports = ApkParser;