appium-xcuitest-driver 7.15.1 → 7.15.2
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/CHANGELOG.md +7 -0
- package/build/lib/app-infos-cache.d.ts +28 -12
- package/build/lib/app-infos-cache.d.ts.map +1 -1
- package/build/lib/app-infos-cache.js +93 -74
- package/build/lib/app-infos-cache.js.map +1 -1
- package/lib/app-infos-cache.js +94 -72
- package/npm-shrinkwrap.json +32 -27
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [7.15.2](https://github.com/appium/appium-xcuitest-driver/compare/v7.15.1...v7.15.2) (2024-05-07)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Properly cache manifests for .ipa bundles containing multiple apps ([#2394](https://github.com/appium/appium-xcuitest-driver/issues/2394)) ([ffd3bbb](https://github.com/appium/appium-xcuitest-driver/commit/ffd3bbbe8ef3e9ef80c2b9af327d88be6e0f367a))
|
|
7
|
+
|
|
1
8
|
## [7.15.1](https://github.com/appium/appium-xcuitest-driver/compare/v7.15.0...v7.15.1) (2024-04-27)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -6,41 +6,57 @@ export class AppInfosCache {
|
|
|
6
6
|
log: import("@appium/types").AppiumLogger;
|
|
7
7
|
/**
|
|
8
8
|
*
|
|
9
|
-
* @param {string}
|
|
9
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
10
10
|
* @param {string} propertyName
|
|
11
11
|
* @returns {Promise<any>}
|
|
12
12
|
*/
|
|
13
|
-
extractManifestProperty(
|
|
13
|
+
extractManifestProperty(bundlePath: string, propertyName: string): Promise<any>;
|
|
14
14
|
/**
|
|
15
15
|
*
|
|
16
|
-
* @param {string}
|
|
16
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
17
17
|
* @returns {Promise<string>}
|
|
18
18
|
*/
|
|
19
|
-
extractBundleId(
|
|
19
|
+
extractBundleId(bundlePath: string): Promise<string>;
|
|
20
20
|
/**
|
|
21
21
|
*
|
|
22
|
-
* @param {string}
|
|
22
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
23
23
|
* @returns {Promise<string>}
|
|
24
24
|
*/
|
|
25
|
-
extractBundleVersion(
|
|
25
|
+
extractBundleVersion(bundlePath: string): Promise<string>;
|
|
26
26
|
/**
|
|
27
27
|
*
|
|
28
|
-
* @param {string}
|
|
28
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
29
29
|
* @returns {Promise<string[]>}
|
|
30
30
|
*/
|
|
31
|
-
extractAppPlatforms(
|
|
31
|
+
extractAppPlatforms(bundlePath: string): Promise<string[]>;
|
|
32
32
|
/**
|
|
33
33
|
*
|
|
34
|
-
* @param {string}
|
|
34
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
35
35
|
* @returns {Promise<string>}
|
|
36
36
|
*/
|
|
37
|
-
extractExecutableName(
|
|
37
|
+
extractExecutableName(bundlePath: string): Promise<string>;
|
|
38
38
|
/**
|
|
39
39
|
*
|
|
40
|
-
* @param {string}
|
|
40
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
41
41
|
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
42
42
|
* @throws {Error} If the given app is not a valid bundle
|
|
43
43
|
*/
|
|
44
|
-
put(
|
|
44
|
+
put(bundlePath: string): Promise<import('@appium/types').StringRecord>;
|
|
45
|
+
/**
|
|
46
|
+
* @param {string} ipaPath Fill path to the .ipa bundle
|
|
47
|
+
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
48
|
+
*/
|
|
49
|
+
_putIpa(ipaPath: string): Promise<import('@appium/types').StringRecord>;
|
|
50
|
+
/**
|
|
51
|
+
* @param {string} appPath Fill path to the .app bundle
|
|
52
|
+
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
53
|
+
*/
|
|
54
|
+
_putApp(appPath: string): Promise<import('@appium/types').StringRecord>;
|
|
55
|
+
/**
|
|
56
|
+
* @param {string} plistPath Full path to the plist
|
|
57
|
+
* @param {string} bundlePath Full path to .ipa or .app bundle
|
|
58
|
+
* @returns {Promise<any>} The payload of the plist file
|
|
59
|
+
*/
|
|
60
|
+
_readPlist(plistPath: string, bundlePath: string): Promise<any>;
|
|
45
61
|
}
|
|
46
62
|
//# sourceMappingURL=app-infos-cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-infos-cache.d.ts","sourceRoot":"","sources":["../../lib/app-infos-cache.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-infos-cache.d.ts","sourceRoot":"","sources":["../../lib/app-infos-cache.js"],"names":[],"mappings":"AAiBA;IACE;;OAEG;IACH,iBAFW,OAAO,eAAe,EAAE,YAAY,EAI9C;IADC,0CAAc;IAGhB;;;;;OAKG;IACH,oCAJW,MAAM,gBACN,MAAM,GACJ,QAAQ,GAAG,CAAC,CAMxB;IAED;;;;OAIG;IACH,4BAHW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAI3B;IAED;;;;OAIG;IACH,iCAHW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAI3B;IAED;;;;OAIG;IACH,gCAHW,MAAM,GACJ,QAAQ,MAAM,EAAE,CAAC,CAQ7B;IAED;;;;OAIG;IACH,kCAHW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAI3B;IAED;;;;;OAKG;IACH,gBAJW,MAAM,GACJ,QAAQ,OAAO,eAAe,EAAE,YAAY,CAAC,CAOzD;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,QAAQ,OAAO,eAAe,EAAE,YAAY,CAAC,CAmDzD;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,QAAQ,OAAO,eAAe,EAAE,YAAY,CAAC,CAmBzD;IAED;;;;OAIG;IACH,sBAJW,MAAM,cACN,MAAM,GACJ,QAAQ,GAAG,CAAC,CASxB;CACF"}
|
|
@@ -15,6 +15,7 @@ const MANIFEST_CACHE = new lru_cache_1.LRUCache({
|
|
|
15
15
|
updateAgeOnHas: true,
|
|
16
16
|
});
|
|
17
17
|
const MANIFEST_FILE_NAME = 'Info.plist';
|
|
18
|
+
const IPA_ROOT_PLIST_PATH_PATTERN = new RegExp(`^Payload/[^./]+\\.app/${lodash_1.default.escapeRegExp(MANIFEST_FILE_NAME)}$`);
|
|
18
19
|
const MAX_MANIFEST_SIZE = 1024 * 1024; // 1 MiB
|
|
19
20
|
class AppInfosCache {
|
|
20
21
|
/**
|
|
@@ -25,124 +26,128 @@ class AppInfosCache {
|
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
28
|
*
|
|
28
|
-
* @param {string}
|
|
29
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
29
30
|
* @param {string} propertyName
|
|
30
31
|
* @returns {Promise<any>}
|
|
31
32
|
*/
|
|
32
|
-
async extractManifestProperty(
|
|
33
|
-
const result = (await this.put(
|
|
33
|
+
async extractManifestProperty(bundlePath, propertyName) {
|
|
34
|
+
const result = (await this.put(bundlePath))[propertyName];
|
|
34
35
|
this.log.debug(`${propertyName}: ${JSON.stringify(result)}`);
|
|
35
36
|
return result;
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
*
|
|
39
|
-
* @param {string}
|
|
40
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
40
41
|
* @returns {Promise<string>}
|
|
41
42
|
*/
|
|
42
|
-
async extractBundleId(
|
|
43
|
-
return await this.extractManifestProperty(
|
|
43
|
+
async extractBundleId(bundlePath) {
|
|
44
|
+
return await this.extractManifestProperty(bundlePath, 'CFBundleIdentifier');
|
|
44
45
|
}
|
|
45
46
|
/**
|
|
46
47
|
*
|
|
47
|
-
* @param {string}
|
|
48
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
48
49
|
* @returns {Promise<string>}
|
|
49
50
|
*/
|
|
50
|
-
async extractBundleVersion(
|
|
51
|
-
return await this.extractManifestProperty(
|
|
51
|
+
async extractBundleVersion(bundlePath) {
|
|
52
|
+
return await this.extractManifestProperty(bundlePath, 'CFBundleVersion');
|
|
52
53
|
}
|
|
53
54
|
/**
|
|
54
55
|
*
|
|
55
|
-
* @param {string}
|
|
56
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
56
57
|
* @returns {Promise<string[]>}
|
|
57
58
|
*/
|
|
58
|
-
async extractAppPlatforms(
|
|
59
|
-
const result = await this.extractManifestProperty(
|
|
59
|
+
async extractAppPlatforms(bundlePath) {
|
|
60
|
+
const result = await this.extractManifestProperty(bundlePath, 'CFBundleSupportedPlatforms');
|
|
60
61
|
if (!Array.isArray(result)) {
|
|
61
|
-
throw new Error(`${path_1.default.basename(
|
|
62
|
+
throw new Error(`${path_1.default.basename(bundlePath)}': CFBundleSupportedPlatforms is not a valid list`);
|
|
62
63
|
}
|
|
63
64
|
return result;
|
|
64
65
|
}
|
|
65
66
|
/**
|
|
66
67
|
*
|
|
67
|
-
* @param {string}
|
|
68
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
68
69
|
* @returns {Promise<string>}
|
|
69
70
|
*/
|
|
70
|
-
async extractExecutableName(
|
|
71
|
-
return await this.extractManifestProperty(
|
|
71
|
+
async extractExecutableName(bundlePath) {
|
|
72
|
+
return await this.extractManifestProperty(bundlePath, 'CFBundleExecutable');
|
|
72
73
|
}
|
|
73
74
|
/**
|
|
74
75
|
*
|
|
75
|
-
* @param {string}
|
|
76
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
76
77
|
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
77
78
|
* @throws {Error} If the given app is not a valid bundle
|
|
78
79
|
*/
|
|
79
|
-
async put(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
const tmpRoot = await support_1.tempDir.openDir();
|
|
105
|
-
try {
|
|
106
|
-
await extractEntryTo(tmpRoot);
|
|
107
|
-
const plistPath = path_1.default.resolve(tmpRoot, entry.fileName);
|
|
108
|
-
manifestPayload = await readPlist(plistPath);
|
|
109
|
-
if (entry.uncompressedSize <= MAX_MANIFEST_SIZE && lodash_1.default.isPlainObject(manifestPayload)) {
|
|
110
|
-
this.log.debug(`Caching the manifest for ${manifestPayload?.CFBundleIdentifier} app ` +
|
|
111
|
-
`from an archived source using the key '${hash}'`);
|
|
112
|
-
MANIFEST_CACHE.set(hash, manifestPayload);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
this.log.debug(e.stack);
|
|
117
|
-
lastError = e;
|
|
118
|
-
}
|
|
119
|
-
finally {
|
|
120
|
-
await support_1.fs.rimraf(tmpRoot);
|
|
121
|
-
}
|
|
80
|
+
async put(bundlePath) {
|
|
81
|
+
return (await support_1.fs.stat(bundlePath)).isFile()
|
|
82
|
+
? await this._putIpa(bundlePath)
|
|
83
|
+
: await this._putApp(bundlePath);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @param {string} ipaPath Fill path to the .ipa bundle
|
|
87
|
+
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
88
|
+
*/
|
|
89
|
+
async _putIpa(ipaPath) {
|
|
90
|
+
/** @type {import('@appium/types').StringRecord|undefined} */
|
|
91
|
+
let manifestPayload;
|
|
92
|
+
/** @type {Error|undefined} */
|
|
93
|
+
let lastError;
|
|
94
|
+
try {
|
|
95
|
+
await support_1.zip.readEntries(ipaPath, async ({ entry, extractEntryTo }) => {
|
|
96
|
+
// https://github.com/appium/appium/issues/20075
|
|
97
|
+
if (!IPA_ROOT_PLIST_PATH_PATTERN.test(entry.fileName)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
const hash = `${entry.crc32}`;
|
|
101
|
+
if (MANIFEST_CACHE.has(hash)) {
|
|
102
|
+
manifestPayload = MANIFEST_CACHE.get(hash);
|
|
122
103
|
return false;
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
catch (e) {
|
|
126
|
-
this.log.debug(e.stack);
|
|
127
|
-
throw new Error(`Cannot find ${MANIFEST_FILE_NAME} in '${appPath}'. Is it a valid application bundle?`);
|
|
128
|
-
}
|
|
129
|
-
if (!manifestPayload) {
|
|
130
|
-
let errorMessage = `Cannot extract ${MANIFEST_FILE_NAME} from '${appPath}'. Is it a valid application bundle?`;
|
|
131
|
-
if (lastError) {
|
|
132
|
-
errorMessage += ` Original error: ${lastError.message}`;
|
|
133
104
|
}
|
|
134
|
-
|
|
105
|
+
const tmpRoot = await support_1.tempDir.openDir();
|
|
106
|
+
try {
|
|
107
|
+
await extractEntryTo(tmpRoot);
|
|
108
|
+
const plistPath = path_1.default.resolve(tmpRoot, entry.fileName);
|
|
109
|
+
manifestPayload = await this._readPlist(plistPath, ipaPath);
|
|
110
|
+
if (lodash_1.default.isPlainObject(manifestPayload) && entry.uncompressedSize <= MAX_MANIFEST_SIZE) {
|
|
111
|
+
this.log.debug(`Caching the manifest '${entry.fileName}' for ${manifestPayload?.CFBundleIdentifier} app ` +
|
|
112
|
+
`from the compressed source using the key '${hash}'`);
|
|
113
|
+
MANIFEST_CACHE.set(hash, manifestPayload);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
this.log.debug(e.stack);
|
|
118
|
+
lastError = e;
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await support_1.fs.rimraf(tmpRoot);
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
this.log.debug(e.stack);
|
|
128
|
+
throw new Error(`Cannot find ${MANIFEST_FILE_NAME} in '${ipaPath}'. Is it a valid application bundle?`);
|
|
129
|
+
}
|
|
130
|
+
if (!manifestPayload) {
|
|
131
|
+
let errorMessage = `Cannot extract ${MANIFEST_FILE_NAME} from '${ipaPath}'. Is it a valid application bundle?`;
|
|
132
|
+
if (lastError) {
|
|
133
|
+
errorMessage += ` Original error: ${lastError.message}`;
|
|
135
134
|
}
|
|
136
|
-
|
|
135
|
+
throw new Error(errorMessage);
|
|
137
136
|
}
|
|
138
|
-
|
|
137
|
+
return manifestPayload;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* @param {string} appPath Fill path to the .app bundle
|
|
141
|
+
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
142
|
+
*/
|
|
143
|
+
async _putApp(appPath) {
|
|
139
144
|
const manifestPath = path_1.default.join(appPath, MANIFEST_FILE_NAME);
|
|
140
145
|
const hash = await support_1.fs.hash(manifestPath);
|
|
141
146
|
if (MANIFEST_CACHE.has(hash)) {
|
|
142
147
|
return /** @type {import('@appium/types').StringRecord} */ (MANIFEST_CACHE.get(hash));
|
|
143
148
|
}
|
|
144
149
|
const [payload, stat] = await bluebird_1.default.all([
|
|
145
|
-
|
|
150
|
+
this._readPlist(manifestPath, appPath),
|
|
146
151
|
support_1.fs.stat(manifestPath),
|
|
147
152
|
]);
|
|
148
153
|
if (stat.size <= MAX_MANIFEST_SIZE && lodash_1.default.isPlainObject(payload)) {
|
|
@@ -151,6 +156,20 @@ class AppInfosCache {
|
|
|
151
156
|
}
|
|
152
157
|
return payload;
|
|
153
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* @param {string} plistPath Full path to the plist
|
|
161
|
+
* @param {string} bundlePath Full path to .ipa or .app bundle
|
|
162
|
+
* @returns {Promise<any>} The payload of the plist file
|
|
163
|
+
*/
|
|
164
|
+
async _readPlist(plistPath, bundlePath) {
|
|
165
|
+
try {
|
|
166
|
+
return await support_1.plist.parsePlistFile(plistPath);
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
this.log.debug(e.stack);
|
|
170
|
+
throw new Error(`Cannot parse ${MANIFEST_FILE_NAME} of '${bundlePath}'. Is it a valid application bundle?`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
154
173
|
}
|
|
155
174
|
exports.AppInfosCache = AppInfosCache;
|
|
156
175
|
//# sourceMappingURL=app-infos-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-infos-cache.js","sourceRoot":"","sources":["../../lib/app-infos-cache.js"],"names":[],"mappings":";;;;;;AAAA,oDAAuB;AACvB,gDAAwB;AACxB,4CAAuD;AACvD,yCAAmC;AACnC,wDAAyB;AAEzB,qEAAqE;AACrE,MAAM,cAAc,GAAG,IAAI,oBAAQ,CAAC;IAClC,GAAG,EAAE,EAAE;IACP,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE/C,MAAa,aAAa;IACxB;;OAEG;IACH,YAAa,GAAG;QACd,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,uBAAuB,CAAE,
|
|
1
|
+
{"version":3,"file":"app-infos-cache.js","sourceRoot":"","sources":["../../lib/app-infos-cache.js"],"names":[],"mappings":"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"}
|
package/lib/app-infos-cache.js
CHANGED
|
@@ -10,6 +10,9 @@ const MANIFEST_CACHE = new LRUCache({
|
|
|
10
10
|
updateAgeOnHas: true,
|
|
11
11
|
});
|
|
12
12
|
const MANIFEST_FILE_NAME = 'Info.plist';
|
|
13
|
+
const IPA_ROOT_PLIST_PATH_PATTERN = new RegExp(
|
|
14
|
+
`^Payload/[^./]+\\.app/${_.escapeRegExp(MANIFEST_FILE_NAME)}$`
|
|
15
|
+
);
|
|
13
16
|
const MAX_MANIFEST_SIZE = 1024 * 1024; // 1 MiB
|
|
14
17
|
|
|
15
18
|
export class AppInfosCache {
|
|
@@ -22,130 +25,135 @@ export class AppInfosCache {
|
|
|
22
25
|
|
|
23
26
|
/**
|
|
24
27
|
*
|
|
25
|
-
* @param {string}
|
|
28
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
26
29
|
* @param {string} propertyName
|
|
27
30
|
* @returns {Promise<any>}
|
|
28
31
|
*/
|
|
29
|
-
async extractManifestProperty (
|
|
30
|
-
const result = (await this.put(
|
|
32
|
+
async extractManifestProperty (bundlePath, propertyName) {
|
|
33
|
+
const result = (await this.put(bundlePath))[propertyName];
|
|
31
34
|
this.log.debug(`${propertyName}: ${JSON.stringify(result)}`);
|
|
32
35
|
return result;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
/**
|
|
36
39
|
*
|
|
37
|
-
* @param {string}
|
|
40
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
38
41
|
* @returns {Promise<string>}
|
|
39
42
|
*/
|
|
40
|
-
async extractBundleId (
|
|
41
|
-
return await this.extractManifestProperty(
|
|
43
|
+
async extractBundleId (bundlePath) {
|
|
44
|
+
return await this.extractManifestProperty(bundlePath, 'CFBundleIdentifier');
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
/**
|
|
45
48
|
*
|
|
46
|
-
* @param {string}
|
|
49
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
47
50
|
* @returns {Promise<string>}
|
|
48
51
|
*/
|
|
49
|
-
async extractBundleVersion (
|
|
50
|
-
return await this.extractManifestProperty(
|
|
52
|
+
async extractBundleVersion (bundlePath) {
|
|
53
|
+
return await this.extractManifestProperty(bundlePath, 'CFBundleVersion');
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
/**
|
|
54
57
|
*
|
|
55
|
-
* @param {string}
|
|
58
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
56
59
|
* @returns {Promise<string[]>}
|
|
57
60
|
*/
|
|
58
|
-
async extractAppPlatforms (
|
|
59
|
-
const result = await this.extractManifestProperty(
|
|
61
|
+
async extractAppPlatforms (bundlePath) {
|
|
62
|
+
const result = await this.extractManifestProperty(bundlePath, 'CFBundleSupportedPlatforms');
|
|
60
63
|
if (!Array.isArray(result)) {
|
|
61
|
-
throw new Error(`${path.basename(
|
|
64
|
+
throw new Error(`${path.basename(bundlePath)}': CFBundleSupportedPlatforms is not a valid list`);
|
|
62
65
|
}
|
|
63
66
|
return result;
|
|
64
67
|
}
|
|
65
68
|
|
|
66
69
|
/**
|
|
67
70
|
*
|
|
68
|
-
* @param {string}
|
|
71
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
69
72
|
* @returns {Promise<string>}
|
|
70
73
|
*/
|
|
71
|
-
async extractExecutableName (
|
|
72
|
-
return await this.extractManifestProperty(
|
|
74
|
+
async extractExecutableName (bundlePath) {
|
|
75
|
+
return await this.extractManifestProperty(bundlePath, 'CFBundleExecutable');
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
/**
|
|
76
79
|
*
|
|
77
|
-
* @param {string}
|
|
80
|
+
* @param {string} bundlePath Full path to the .ipa or .app bundle
|
|
78
81
|
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
79
82
|
* @throws {Error} If the given app is not a valid bundle
|
|
80
83
|
*/
|
|
81
|
-
async put (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
this.log.debug(e.stack);
|
|
87
|
-
throw new Error(`Cannot parse ${MANIFEST_FILE_NAME} of '${appPath}'. Is it a valid application bundle?`);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
84
|
+
async put (bundlePath) {
|
|
85
|
+
return (await fs.stat(bundlePath)).isFile()
|
|
86
|
+
? await this._putIpa(bundlePath)
|
|
87
|
+
: await this._putApp(bundlePath);
|
|
88
|
+
}
|
|
90
89
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
90
|
+
/**
|
|
91
|
+
* @param {string} ipaPath Fill path to the .ipa bundle
|
|
92
|
+
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
93
|
+
*/
|
|
94
|
+
async _putIpa(ipaPath) {
|
|
95
|
+
/** @type {import('@appium/types').StringRecord|undefined} */
|
|
96
|
+
let manifestPayload;
|
|
97
|
+
/** @type {Error|undefined} */
|
|
98
|
+
let lastError;
|
|
99
|
+
try {
|
|
100
|
+
await zip.readEntries(ipaPath, async ({entry, extractEntryTo}) => {
|
|
101
|
+
// https://github.com/appium/appium/issues/20075
|
|
102
|
+
if (!IPA_ROOT_PLIST_PATH_PATTERN.test(entry.fileName)) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
101
105
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return false;
|
|
106
|
-
}
|
|
107
|
-
const tmpRoot = await tempDir.openDir();
|
|
108
|
-
try {
|
|
109
|
-
await extractEntryTo(tmpRoot);
|
|
110
|
-
const plistPath = path.resolve(tmpRoot, entry.fileName);
|
|
111
|
-
manifestPayload = await readPlist(plistPath);
|
|
112
|
-
if (entry.uncompressedSize <= MAX_MANIFEST_SIZE && _.isPlainObject(manifestPayload)) {
|
|
113
|
-
this.log.debug(
|
|
114
|
-
`Caching the manifest for ${manifestPayload?.CFBundleIdentifier} app ` +
|
|
115
|
-
`from an archived source using the key '${hash}'`
|
|
116
|
-
);
|
|
117
|
-
MANIFEST_CACHE.set(hash, manifestPayload);
|
|
118
|
-
}
|
|
119
|
-
} catch (e) {
|
|
120
|
-
this.log.debug(e.stack);
|
|
121
|
-
lastError = e;
|
|
122
|
-
} finally {
|
|
123
|
-
await fs.rimraf(tmpRoot);
|
|
124
|
-
}
|
|
106
|
+
const hash = `${entry.crc32}`;
|
|
107
|
+
if (MANIFEST_CACHE.has(hash)) {
|
|
108
|
+
manifestPayload = MANIFEST_CACHE.get(hash);
|
|
125
109
|
return false;
|
|
126
|
-
});
|
|
127
|
-
} catch (e) {
|
|
128
|
-
this.log.debug(e.stack);
|
|
129
|
-
throw new Error(`Cannot find ${MANIFEST_FILE_NAME} in '${appPath}'. Is it a valid application bundle?`);
|
|
130
|
-
}
|
|
131
|
-
if (!manifestPayload) {
|
|
132
|
-
let errorMessage = `Cannot extract ${MANIFEST_FILE_NAME} from '${appPath}'. Is it a valid application bundle?`;
|
|
133
|
-
if (lastError) {
|
|
134
|
-
errorMessage += ` Original error: ${lastError.message}`;
|
|
135
110
|
}
|
|
136
|
-
|
|
111
|
+
const tmpRoot = await tempDir.openDir();
|
|
112
|
+
try {
|
|
113
|
+
await extractEntryTo(tmpRoot);
|
|
114
|
+
const plistPath = path.resolve(tmpRoot, entry.fileName);
|
|
115
|
+
manifestPayload = await this._readPlist(plistPath, ipaPath);
|
|
116
|
+
if (_.isPlainObject(manifestPayload) && entry.uncompressedSize <= MAX_MANIFEST_SIZE) {
|
|
117
|
+
this.log.debug(
|
|
118
|
+
`Caching the manifest '${entry.fileName}' for ${manifestPayload?.CFBundleIdentifier} app ` +
|
|
119
|
+
`from the compressed source using the key '${hash}'`
|
|
120
|
+
);
|
|
121
|
+
MANIFEST_CACHE.set(hash, manifestPayload);
|
|
122
|
+
}
|
|
123
|
+
} catch (e) {
|
|
124
|
+
this.log.debug(e.stack);
|
|
125
|
+
lastError = e;
|
|
126
|
+
} finally {
|
|
127
|
+
await fs.rimraf(tmpRoot);
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
});
|
|
131
|
+
} catch (e) {
|
|
132
|
+
this.log.debug(e.stack);
|
|
133
|
+
throw new Error(`Cannot find ${MANIFEST_FILE_NAME} in '${ipaPath}'. Is it a valid application bundle?`);
|
|
134
|
+
}
|
|
135
|
+
if (!manifestPayload) {
|
|
136
|
+
let errorMessage = `Cannot extract ${MANIFEST_FILE_NAME} from '${ipaPath}'. Is it a valid application bundle?`;
|
|
137
|
+
if (lastError) {
|
|
138
|
+
errorMessage += ` Original error: ${lastError.message}`;
|
|
137
139
|
}
|
|
138
|
-
|
|
140
|
+
throw new Error(errorMessage);
|
|
139
141
|
}
|
|
142
|
+
return manifestPayload;
|
|
143
|
+
}
|
|
140
144
|
|
|
141
|
-
|
|
145
|
+
/**
|
|
146
|
+
* @param {string} appPath Fill path to the .app bundle
|
|
147
|
+
* @returns {Promise<import('@appium/types').StringRecord>} The payload of the manifest plist
|
|
148
|
+
*/
|
|
149
|
+
async _putApp(appPath) {
|
|
142
150
|
const manifestPath = path.join(appPath, MANIFEST_FILE_NAME);
|
|
143
151
|
const hash = await fs.hash(manifestPath);
|
|
144
152
|
if (MANIFEST_CACHE.has(hash)) {
|
|
145
153
|
return /** @type {import('@appium/types').StringRecord} */ (MANIFEST_CACHE.get(hash));
|
|
146
154
|
}
|
|
147
155
|
const [payload, stat] = await B.all([
|
|
148
|
-
|
|
156
|
+
this._readPlist(manifestPath, appPath),
|
|
149
157
|
fs.stat(manifestPath),
|
|
150
158
|
]);
|
|
151
159
|
if (stat.size <= MAX_MANIFEST_SIZE && _.isPlainObject(payload)) {
|
|
@@ -156,4 +164,18 @@ export class AppInfosCache {
|
|
|
156
164
|
}
|
|
157
165
|
return payload;
|
|
158
166
|
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* @param {string} plistPath Full path to the plist
|
|
170
|
+
* @param {string} bundlePath Full path to .ipa or .app bundle
|
|
171
|
+
* @returns {Promise<any>} The payload of the plist file
|
|
172
|
+
*/
|
|
173
|
+
async _readPlist(plistPath, bundlePath) {
|
|
174
|
+
try {
|
|
175
|
+
return await plist.parsePlistFile(plistPath);
|
|
176
|
+
} catch (e) {
|
|
177
|
+
this.log.debug(e.stack);
|
|
178
|
+
throw new Error(`Cannot parse ${MANIFEST_FILE_NAME} of '${bundlePath}'. Is it a valid application bundle?`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
159
181
|
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-xcuitest-driver",
|
|
3
|
-
"version": "7.15.
|
|
3
|
+
"version": "7.15.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "appium-xcuitest-driver",
|
|
9
|
-
"version": "7.15.
|
|
9
|
+
"version": "7.15.2",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@colors/colors": "^1.6.0",
|
|
@@ -125,6 +125,11 @@
|
|
|
125
125
|
"spdy": "4.0.2"
|
|
126
126
|
}
|
|
127
127
|
},
|
|
128
|
+
"node_modules/@appium/base-driver/node_modules/@types/lodash": {
|
|
129
|
+
"version": "4.17.0",
|
|
130
|
+
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
|
|
131
|
+
"integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA=="
|
|
132
|
+
},
|
|
128
133
|
"node_modules/@appium/base-driver/node_modules/lru-cache": {
|
|
129
134
|
"version": "10.2.0",
|
|
130
135
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
|
|
@@ -347,19 +352,19 @@
|
|
|
347
352
|
}
|
|
348
353
|
},
|
|
349
354
|
"node_modules/@babel/helper-validator-identifier": {
|
|
350
|
-
"version": "7.
|
|
351
|
-
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.
|
|
352
|
-
"integrity": "sha512-
|
|
355
|
+
"version": "7.24.5",
|
|
356
|
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz",
|
|
357
|
+
"integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==",
|
|
353
358
|
"engines": {
|
|
354
359
|
"node": ">=6.9.0"
|
|
355
360
|
}
|
|
356
361
|
},
|
|
357
362
|
"node_modules/@babel/highlight": {
|
|
358
|
-
"version": "7.24.
|
|
359
|
-
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.
|
|
360
|
-
"integrity": "sha512-
|
|
363
|
+
"version": "7.24.5",
|
|
364
|
+
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz",
|
|
365
|
+
"integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==",
|
|
361
366
|
"dependencies": {
|
|
362
|
-
"@babel/helper-validator-identifier": "^7.
|
|
367
|
+
"@babel/helper-validator-identifier": "^7.24.5",
|
|
363
368
|
"chalk": "^2.4.2",
|
|
364
369
|
"js-tokens": "^4.0.0",
|
|
365
370
|
"picocolors": "^1.0.0"
|
|
@@ -674,9 +679,9 @@
|
|
|
674
679
|
"integrity": "sha512-Q8oFIHJHr+htLrTXN2FuZfg+WXVHQRwU/hC2GpUu+Q8e3FUM9EDkS2pE3R2AO1ZGu56f479ybdMCNF1DAu8cAQ=="
|
|
675
680
|
},
|
|
676
681
|
"node_modules/@types/lodash": {
|
|
677
|
-
"version": "4.17.
|
|
678
|
-
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.
|
|
679
|
-
"integrity": "sha512-
|
|
682
|
+
"version": "4.17.1",
|
|
683
|
+
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz",
|
|
684
|
+
"integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q=="
|
|
680
685
|
},
|
|
681
686
|
"node_modules/@types/method-override": {
|
|
682
687
|
"version": "0.0.35",
|
|
@@ -705,9 +710,9 @@
|
|
|
705
710
|
}
|
|
706
711
|
},
|
|
707
712
|
"node_modules/@types/node": {
|
|
708
|
-
"version": "20.12.
|
|
709
|
-
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.
|
|
710
|
-
"integrity": "sha512-
|
|
713
|
+
"version": "20.12.10",
|
|
714
|
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz",
|
|
715
|
+
"integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==",
|
|
711
716
|
"dependencies": {
|
|
712
717
|
"undici-types": "~5.26.4"
|
|
713
718
|
}
|
|
@@ -1972,9 +1977,9 @@
|
|
|
1972
1977
|
}
|
|
1973
1978
|
},
|
|
1974
1979
|
"node_modules/gauge": {
|
|
1975
|
-
"version": "5.0.
|
|
1976
|
-
"resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.
|
|
1977
|
-
"integrity": "sha512-
|
|
1980
|
+
"version": "5.0.2",
|
|
1981
|
+
"resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.2.tgz",
|
|
1982
|
+
"integrity": "sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==",
|
|
1978
1983
|
"dependencies": {
|
|
1979
1984
|
"aproba": "^1.0.3 || ^2.0.0",
|
|
1980
1985
|
"color-support": "^1.1.3",
|
|
@@ -2540,9 +2545,9 @@
|
|
|
2540
2545
|
}
|
|
2541
2546
|
},
|
|
2542
2547
|
"node_modules/lru-cache": {
|
|
2543
|
-
"version": "10.2.
|
|
2544
|
-
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.
|
|
2545
|
-
"integrity": "sha512-
|
|
2548
|
+
"version": "10.2.2",
|
|
2549
|
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
|
|
2550
|
+
"integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
|
|
2546
2551
|
"engines": {
|
|
2547
2552
|
"node": "14 || >=16.14"
|
|
2548
2553
|
}
|
|
@@ -2657,9 +2662,9 @@
|
|
|
2657
2662
|
}
|
|
2658
2663
|
},
|
|
2659
2664
|
"node_modules/minipass": {
|
|
2660
|
-
"version": "7.0
|
|
2661
|
-
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.
|
|
2662
|
-
"integrity": "sha512-
|
|
2665
|
+
"version": "7.1.0",
|
|
2666
|
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz",
|
|
2667
|
+
"integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==",
|
|
2663
2668
|
"engines": {
|
|
2664
2669
|
"node": ">=16 || 14 >=14.17"
|
|
2665
2670
|
}
|
|
@@ -4130,9 +4135,9 @@
|
|
|
4130
4135
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
|
4131
4136
|
},
|
|
4132
4137
|
"node_modules/ws": {
|
|
4133
|
-
"version": "8.
|
|
4134
|
-
"resolved": "https://registry.npmjs.org/ws/-/ws-8.
|
|
4135
|
-
"integrity": "sha512-
|
|
4138
|
+
"version": "8.17.0",
|
|
4139
|
+
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz",
|
|
4140
|
+
"integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==",
|
|
4136
4141
|
"engines": {
|
|
4137
4142
|
"node": ">=10.0.0"
|
|
4138
4143
|
},
|