@vxrn/utils 2.0.0-beta.130.1 → 2.0.0-beta.132.1
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/dist/cjs/nativeAppManifest.cjs +47 -2
- package/dist/cjs/nativeAppManifest.native.cjs +87 -5
- package/dist/cjs/nativeAppManifest.native.js +87 -5
- package/dist/cjs/nativeAppManifest.native.js.map +1 -1
- package/dist/esm/nativeAppManifest.mjs +47 -2
- package/dist/esm/nativeAppManifest.mjs.map +1 -1
- package/dist/esm/nativeAppManifest.native.js +87 -5
- package/dist/esm/nativeAppManifest.native.js.map +1 -1
- package/package.json +3 -3
- package/src/nativeAppManifest.ts +96 -0
- package/types/nativeAppManifest.d.ts +40 -0
- package/types/nativeAppManifest.d.ts.map +1 -1
|
@@ -31,6 +31,7 @@ const BUILD_NUMBER = /^[A-Za-z0-9.]+$/;
|
|
|
31
31
|
const REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/;
|
|
32
32
|
const DEPLOYMENT_TARGET = /^\d+\.\d+$/;
|
|
33
33
|
const HEX_COLOR = /^#[\da-f]{6}$/i;
|
|
34
|
+
const FONT_FILE = /\.(ttf|otf)$/i;
|
|
34
35
|
const ORIENTATIONS = [
|
|
35
36
|
"portrait",
|
|
36
37
|
"landscape",
|
|
@@ -62,6 +63,17 @@ function validateNativeApp(manifest, platform) {
|
|
|
62
63
|
if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {
|
|
63
64
|
fail(`userInterfaceStyle "${manifest.userInterfaceStyle}" must be ${USER_INTERFACE_STYLES.join(", ")}`);
|
|
64
65
|
}
|
|
66
|
+
if (manifest.fonts !== void 0) {
|
|
67
|
+
const names = /* @__PURE__ */ new Set();
|
|
68
|
+
for (const font of manifest.fonts) {
|
|
69
|
+
if (typeof font !== "string" || !FONT_FILE.test(font)) {
|
|
70
|
+
fail(`fonts entry "${font}" must be a .ttf or .otf file path`);
|
|
71
|
+
}
|
|
72
|
+
const name = font.split("/").pop() ?? font;
|
|
73
|
+
if (names.has(name)) fail(`fonts lists ${name} twice`);
|
|
74
|
+
names.add(name);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
65
77
|
if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {
|
|
66
78
|
fail(`version "${manifest.version}" must start with major.minor.patch`);
|
|
67
79
|
}
|
|
@@ -71,6 +83,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
71
83
|
if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {
|
|
72
84
|
fail("splash requires source, a six-digit hex backgroundColor, and width from 1 to 288");
|
|
73
85
|
}
|
|
86
|
+
if (manifest.splash?.dark !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {
|
|
87
|
+
fail("splash.dark requires a six-digit hex backgroundColor");
|
|
88
|
+
}
|
|
74
89
|
if (manifest.splash?.resizeMode !== void 0 && manifest.splash.resizeMode !== "contain" && manifest.splash.resizeMode !== "cover") {
|
|
75
90
|
fail(`splash.resizeMode "${manifest.splash.resizeMode}" must be contain or cover`);
|
|
76
91
|
}
|
|
@@ -172,6 +187,23 @@ function validateNativeApp(manifest, platform) {
|
|
|
172
187
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
173
188
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
174
189
|
}
|
|
190
|
+
for (const key of ["targetSdk", "compileSdk"]) {
|
|
191
|
+
const value = manifest.android[key];
|
|
192
|
+
if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {
|
|
193
|
+
fail(`android.${key} "${value}" must be an api level integer`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (manifest.android.shrinkResources && !manifest.android.minify) {
|
|
197
|
+
fail("android.shrinkResources needs android.minify");
|
|
198
|
+
}
|
|
199
|
+
for (const link of manifest.android.appLinks ?? []) {
|
|
200
|
+
if (!link.host || !REVERSE_DNS.test(link.host)) {
|
|
201
|
+
fail(`android.appLinks host "${link.host}" must be a domain`);
|
|
202
|
+
}
|
|
203
|
+
if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith("/")) {
|
|
204
|
+
fail(`android.appLinks pathPrefix "${link.pathPrefix}" must start with /`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
175
207
|
const adaptiveIcon = manifest.android.adaptiveIcon;
|
|
176
208
|
if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {
|
|
177
209
|
fail("android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex");
|
|
@@ -195,16 +227,29 @@ function expoClientFromNativeApp(app) {
|
|
|
195
227
|
image: app.splash.source,
|
|
196
228
|
backgroundColor: app.splash.backgroundColor,
|
|
197
229
|
imageWidth: app.splash.width,
|
|
198
|
-
resizeMode: app.splash.resizeMode
|
|
230
|
+
resizeMode: app.splash.resizeMode,
|
|
231
|
+
dark: app.splash.dark && {
|
|
232
|
+
image: app.splash.dark.source,
|
|
233
|
+
backgroundColor: app.splash.dark.backgroundColor
|
|
234
|
+
}
|
|
199
235
|
},
|
|
236
|
+
plugins: app.fonts?.length ? [["expo-font", { fonts: app.fonts }]] : void 0,
|
|
200
237
|
ios: app.ios && {
|
|
201
238
|
bundleIdentifier: app.ios.bundleId,
|
|
202
239
|
buildNumber: app.ios.buildNumber,
|
|
203
|
-
supportsTablet: app.ios.tablet
|
|
240
|
+
supportsTablet: app.ios.tablet,
|
|
241
|
+
associatedDomains: app.ios.associatedDomains,
|
|
242
|
+
usesAppleSignIn: app.ios.usesAppleSignIn,
|
|
243
|
+
googleServicesFile: app.ios.googleServicesFile,
|
|
244
|
+
infoPlist: app.ios.infoPlist,
|
|
245
|
+
entitlements: app.ios.entitlements
|
|
204
246
|
},
|
|
205
247
|
android: app.android && {
|
|
206
248
|
package: app.android.applicationId,
|
|
207
249
|
versionCode: app.android.versionCode,
|
|
250
|
+
permissions: app.android.permissions,
|
|
251
|
+
blockedPermissions: app.android.blockedPermissions,
|
|
252
|
+
googleServicesFile: app.android.googleServicesFile,
|
|
208
253
|
adaptiveIcon: app.android.adaptiveIcon && {
|
|
209
254
|
foregroundImage: app.android.adaptiveIcon.foreground,
|
|
210
255
|
backgroundImage: app.android.adaptiveIcon.background,
|
|
@@ -33,6 +33,7 @@ var BUILD_NUMBER = /^[A-Za-z0-9.]+$/;
|
|
|
33
33
|
var REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/;
|
|
34
34
|
var DEPLOYMENT_TARGET = /^\d+\.\d+$/;
|
|
35
35
|
var HEX_COLOR = /^#[\da-f]{6}$/i;
|
|
36
|
+
var FONT_FILE = /\.(ttf|otf)$/i;
|
|
36
37
|
var ORIENTATIONS = [
|
|
37
38
|
"portrait",
|
|
38
39
|
"landscape",
|
|
@@ -47,7 +48,7 @@ function fail(message) {
|
|
|
47
48
|
throw new Error(`[one] invalid native.app: ${message}`);
|
|
48
49
|
}
|
|
49
50
|
function validateNativeApp(manifest, platform) {
|
|
50
|
-
var _manifest_splash, _manifest_imagePicker, _manifest_ios, _manifest_speech;
|
|
51
|
+
var _manifest_splash, _manifest_splash1, _manifest_imagePicker, _manifest_ios, _manifest_speech;
|
|
51
52
|
if (!manifest || typeof manifest !== "object") fail("manifest must be an object");
|
|
52
53
|
if (!manifest.name || typeof manifest.name !== "string") fail("name is required");
|
|
53
54
|
if (!TARGET_NAME.test(manifest.name)) {
|
|
@@ -82,6 +83,35 @@ function validateNativeApp(manifest, platform) {
|
|
|
82
83
|
if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {
|
|
83
84
|
fail(`userInterfaceStyle "${manifest.userInterfaceStyle}" must be ${USER_INTERFACE_STYLES.join(", ")}`);
|
|
84
85
|
}
|
|
86
|
+
if (manifest.fonts !== void 0) {
|
|
87
|
+
var names = /* @__PURE__ */ new Set();
|
|
88
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
|
|
89
|
+
try {
|
|
90
|
+
for (var _iterator1 = manifest.fonts[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
|
|
91
|
+
var font = _step1.value;
|
|
92
|
+
var _font_split_pop;
|
|
93
|
+
if (typeof font !== "string" || !FONT_FILE.test(font)) {
|
|
94
|
+
fail(`fonts entry "${font}" must be a .ttf or .otf file path`);
|
|
95
|
+
}
|
|
96
|
+
var name = (_font_split_pop = font.split("/").pop()) !== null && _font_split_pop !== void 0 ? _font_split_pop : font;
|
|
97
|
+
if (names.has(name)) fail(`fonts lists ${name} twice`);
|
|
98
|
+
names.add(name);
|
|
99
|
+
}
|
|
100
|
+
} catch (err) {
|
|
101
|
+
_didIteratorError1 = true;
|
|
102
|
+
_iteratorError1 = err;
|
|
103
|
+
} finally {
|
|
104
|
+
try {
|
|
105
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
106
|
+
_iterator1.return();
|
|
107
|
+
}
|
|
108
|
+
} finally {
|
|
109
|
+
if (_didIteratorError1) {
|
|
110
|
+
throw _iteratorError1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
85
115
|
if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {
|
|
86
116
|
fail(`version "${manifest.version}" must start with major.minor.patch`);
|
|
87
117
|
}
|
|
@@ -91,7 +121,10 @@ function validateNativeApp(manifest, platform) {
|
|
|
91
121
|
if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {
|
|
92
122
|
fail("splash requires source, a six-digit hex backgroundColor, and width from 1 to 288");
|
|
93
123
|
}
|
|
94
|
-
if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.
|
|
124
|
+
if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.dark) !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {
|
|
125
|
+
fail("splash.dark requires a six-digit hex backgroundColor");
|
|
126
|
+
}
|
|
127
|
+
if (((_manifest_splash1 = manifest.splash) === null || _manifest_splash1 === void 0 ? void 0 : _manifest_splash1.resizeMode) !== void 0 && manifest.splash.resizeMode !== "contain" && manifest.splash.resizeMode !== "cover") {
|
|
95
128
|
fail(`splash.resizeMode "${manifest.splash.resizeMode}" must be contain or cover`);
|
|
96
129
|
}
|
|
97
130
|
if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== "string" || manifest.imagePicker.camera.trim() === "")) {
|
|
@@ -186,6 +219,7 @@ function validateNativeApp(manifest, platform) {
|
|
|
186
219
|
}
|
|
187
220
|
}
|
|
188
221
|
if (!platform || platform === "android") {
|
|
222
|
+
var _manifest_android_appLinks;
|
|
189
223
|
var _manifest_android;
|
|
190
224
|
if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {
|
|
191
225
|
var _manifest_android1;
|
|
@@ -197,6 +231,41 @@ function validateNativeApp(manifest, platform) {
|
|
|
197
231
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
198
232
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
199
233
|
}
|
|
234
|
+
for (var _i = 0, _iter = ["targetSdk", "compileSdk"]; _i < _iter.length; _i++) {
|
|
235
|
+
var key = _iter[_i];
|
|
236
|
+
var value = manifest.android[key];
|
|
237
|
+
if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {
|
|
238
|
+
fail(`android.${key} "${value}" must be an api level integer`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (manifest.android.shrinkResources && !manifest.android.minify) {
|
|
242
|
+
fail("android.shrinkResources needs android.minify");
|
|
243
|
+
}
|
|
244
|
+
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
|
|
245
|
+
try {
|
|
246
|
+
for (var _iterator2 = ((_manifest_android_appLinks = manifest.android.appLinks) !== null && _manifest_android_appLinks !== void 0 ? _manifest_android_appLinks : [])[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
247
|
+
var link = _step2.value;
|
|
248
|
+
if (!link.host || !REVERSE_DNS.test(link.host)) {
|
|
249
|
+
fail(`android.appLinks host "${link.host}" must be a domain`);
|
|
250
|
+
}
|
|
251
|
+
if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith("/")) {
|
|
252
|
+
fail(`android.appLinks pathPrefix "${link.pathPrefix}" must start with /`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} catch (err) {
|
|
256
|
+
_didIteratorError2 = true;
|
|
257
|
+
_iteratorError2 = err;
|
|
258
|
+
} finally {
|
|
259
|
+
try {
|
|
260
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
261
|
+
_iterator2.return();
|
|
262
|
+
}
|
|
263
|
+
} finally {
|
|
264
|
+
if (_didIteratorError2) {
|
|
265
|
+
throw _iteratorError2;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
200
269
|
var adaptiveIcon = manifest.android.adaptiveIcon;
|
|
201
270
|
if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {
|
|
202
271
|
fail("android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex");
|
|
@@ -209,7 +278,7 @@ function validateNativeApp(manifest, platform) {
|
|
|
209
278
|
}
|
|
210
279
|
function expoClientFromNativeApp(app) {
|
|
211
280
|
var _app_displayName;
|
|
212
|
-
var _app_icon;
|
|
281
|
+
var _app_icon, _app_fonts;
|
|
213
282
|
return {
|
|
214
283
|
name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,
|
|
215
284
|
slug: app.name,
|
|
@@ -222,16 +291,29 @@ function expoClientFromNativeApp(app) {
|
|
|
222
291
|
image: app.splash.source,
|
|
223
292
|
backgroundColor: app.splash.backgroundColor,
|
|
224
293
|
imageWidth: app.splash.width,
|
|
225
|
-
resizeMode: app.splash.resizeMode
|
|
294
|
+
resizeMode: app.splash.resizeMode,
|
|
295
|
+
dark: app.splash.dark && {
|
|
296
|
+
image: app.splash.dark.source,
|
|
297
|
+
backgroundColor: app.splash.dark.backgroundColor
|
|
298
|
+
}
|
|
226
299
|
},
|
|
300
|
+
plugins: ((_app_fonts = app.fonts) === null || _app_fonts === void 0 ? void 0 : _app_fonts.length) ? [["expo-font", { fonts: app.fonts }]] : void 0,
|
|
227
301
|
ios: app.ios && {
|
|
228
302
|
bundleIdentifier: app.ios.bundleId,
|
|
229
303
|
buildNumber: app.ios.buildNumber,
|
|
230
|
-
supportsTablet: app.ios.tablet
|
|
304
|
+
supportsTablet: app.ios.tablet,
|
|
305
|
+
associatedDomains: app.ios.associatedDomains,
|
|
306
|
+
usesAppleSignIn: app.ios.usesAppleSignIn,
|
|
307
|
+
googleServicesFile: app.ios.googleServicesFile,
|
|
308
|
+
infoPlist: app.ios.infoPlist,
|
|
309
|
+
entitlements: app.ios.entitlements
|
|
231
310
|
},
|
|
232
311
|
android: app.android && {
|
|
233
312
|
package: app.android.applicationId,
|
|
234
313
|
versionCode: app.android.versionCode,
|
|
314
|
+
permissions: app.android.permissions,
|
|
315
|
+
blockedPermissions: app.android.blockedPermissions,
|
|
316
|
+
googleServicesFile: app.android.googleServicesFile,
|
|
235
317
|
adaptiveIcon: app.android.adaptiveIcon && {
|
|
236
318
|
foregroundImage: app.android.adaptiveIcon.foreground,
|
|
237
319
|
backgroundImage: app.android.adaptiveIcon.background,
|
|
@@ -33,6 +33,7 @@ var BUILD_NUMBER = /^[A-Za-z0-9.]+$/;
|
|
|
33
33
|
var REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/;
|
|
34
34
|
var DEPLOYMENT_TARGET = /^\d+\.\d+$/;
|
|
35
35
|
var HEX_COLOR = /^#[\da-f]{6}$/i;
|
|
36
|
+
var FONT_FILE = /\.(ttf|otf)$/i;
|
|
36
37
|
var ORIENTATIONS = [
|
|
37
38
|
"portrait",
|
|
38
39
|
"landscape",
|
|
@@ -47,7 +48,7 @@ function fail(message) {
|
|
|
47
48
|
throw new Error(`[one] invalid native.app: ${message}`);
|
|
48
49
|
}
|
|
49
50
|
function validateNativeApp(manifest, platform) {
|
|
50
|
-
var _manifest_splash, _manifest_imagePicker, _manifest_ios, _manifest_speech;
|
|
51
|
+
var _manifest_splash, _manifest_splash1, _manifest_imagePicker, _manifest_ios, _manifest_speech;
|
|
51
52
|
if (!manifest || typeof manifest !== "object") fail("manifest must be an object");
|
|
52
53
|
if (!manifest.name || typeof manifest.name !== "string") fail("name is required");
|
|
53
54
|
if (!TARGET_NAME.test(manifest.name)) {
|
|
@@ -82,6 +83,35 @@ function validateNativeApp(manifest, platform) {
|
|
|
82
83
|
if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {
|
|
83
84
|
fail(`userInterfaceStyle "${manifest.userInterfaceStyle}" must be ${USER_INTERFACE_STYLES.join(", ")}`);
|
|
84
85
|
}
|
|
86
|
+
if (manifest.fonts !== void 0) {
|
|
87
|
+
var names = /* @__PURE__ */ new Set();
|
|
88
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
|
|
89
|
+
try {
|
|
90
|
+
for (var _iterator1 = manifest.fonts[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
|
|
91
|
+
var font = _step1.value;
|
|
92
|
+
var _font_split_pop;
|
|
93
|
+
if (typeof font !== "string" || !FONT_FILE.test(font)) {
|
|
94
|
+
fail(`fonts entry "${font}" must be a .ttf or .otf file path`);
|
|
95
|
+
}
|
|
96
|
+
var name = (_font_split_pop = font.split("/").pop()) !== null && _font_split_pop !== void 0 ? _font_split_pop : font;
|
|
97
|
+
if (names.has(name)) fail(`fonts lists ${name} twice`);
|
|
98
|
+
names.add(name);
|
|
99
|
+
}
|
|
100
|
+
} catch (err) {
|
|
101
|
+
_didIteratorError1 = true;
|
|
102
|
+
_iteratorError1 = err;
|
|
103
|
+
} finally {
|
|
104
|
+
try {
|
|
105
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
106
|
+
_iterator1.return();
|
|
107
|
+
}
|
|
108
|
+
} finally {
|
|
109
|
+
if (_didIteratorError1) {
|
|
110
|
+
throw _iteratorError1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
85
115
|
if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {
|
|
86
116
|
fail(`version "${manifest.version}" must start with major.minor.patch`);
|
|
87
117
|
}
|
|
@@ -91,7 +121,10 @@ function validateNativeApp(manifest, platform) {
|
|
|
91
121
|
if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {
|
|
92
122
|
fail("splash requires source, a six-digit hex backgroundColor, and width from 1 to 288");
|
|
93
123
|
}
|
|
94
|
-
if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.
|
|
124
|
+
if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.dark) !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {
|
|
125
|
+
fail("splash.dark requires a six-digit hex backgroundColor");
|
|
126
|
+
}
|
|
127
|
+
if (((_manifest_splash1 = manifest.splash) === null || _manifest_splash1 === void 0 ? void 0 : _manifest_splash1.resizeMode) !== void 0 && manifest.splash.resizeMode !== "contain" && manifest.splash.resizeMode !== "cover") {
|
|
95
128
|
fail(`splash.resizeMode "${manifest.splash.resizeMode}" must be contain or cover`);
|
|
96
129
|
}
|
|
97
130
|
if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== "string" || manifest.imagePicker.camera.trim() === "")) {
|
|
@@ -186,6 +219,7 @@ function validateNativeApp(manifest, platform) {
|
|
|
186
219
|
}
|
|
187
220
|
}
|
|
188
221
|
if (!platform || platform === "android") {
|
|
222
|
+
var _manifest_android_appLinks;
|
|
189
223
|
var _manifest_android;
|
|
190
224
|
if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {
|
|
191
225
|
var _manifest_android1;
|
|
@@ -197,6 +231,41 @@ function validateNativeApp(manifest, platform) {
|
|
|
197
231
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
198
232
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
199
233
|
}
|
|
234
|
+
for (var _i = 0, _iter = ["targetSdk", "compileSdk"]; _i < _iter.length; _i++) {
|
|
235
|
+
var key = _iter[_i];
|
|
236
|
+
var value = manifest.android[key];
|
|
237
|
+
if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {
|
|
238
|
+
fail(`android.${key} "${value}" must be an api level integer`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (manifest.android.shrinkResources && !manifest.android.minify) {
|
|
242
|
+
fail("android.shrinkResources needs android.minify");
|
|
243
|
+
}
|
|
244
|
+
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
|
|
245
|
+
try {
|
|
246
|
+
for (var _iterator2 = ((_manifest_android_appLinks = manifest.android.appLinks) !== null && _manifest_android_appLinks !== void 0 ? _manifest_android_appLinks : [])[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
247
|
+
var link = _step2.value;
|
|
248
|
+
if (!link.host || !REVERSE_DNS.test(link.host)) {
|
|
249
|
+
fail(`android.appLinks host "${link.host}" must be a domain`);
|
|
250
|
+
}
|
|
251
|
+
if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith("/")) {
|
|
252
|
+
fail(`android.appLinks pathPrefix "${link.pathPrefix}" must start with /`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} catch (err) {
|
|
256
|
+
_didIteratorError2 = true;
|
|
257
|
+
_iteratorError2 = err;
|
|
258
|
+
} finally {
|
|
259
|
+
try {
|
|
260
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
261
|
+
_iterator2.return();
|
|
262
|
+
}
|
|
263
|
+
} finally {
|
|
264
|
+
if (_didIteratorError2) {
|
|
265
|
+
throw _iteratorError2;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
200
269
|
var adaptiveIcon = manifest.android.adaptiveIcon;
|
|
201
270
|
if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {
|
|
202
271
|
fail("android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex");
|
|
@@ -209,7 +278,7 @@ function validateNativeApp(manifest, platform) {
|
|
|
209
278
|
}
|
|
210
279
|
function expoClientFromNativeApp(app) {
|
|
211
280
|
var _app_displayName;
|
|
212
|
-
var _app_icon;
|
|
281
|
+
var _app_icon, _app_fonts;
|
|
213
282
|
return {
|
|
214
283
|
name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,
|
|
215
284
|
slug: app.name,
|
|
@@ -222,16 +291,29 @@ function expoClientFromNativeApp(app) {
|
|
|
222
291
|
image: app.splash.source,
|
|
223
292
|
backgroundColor: app.splash.backgroundColor,
|
|
224
293
|
imageWidth: app.splash.width,
|
|
225
|
-
resizeMode: app.splash.resizeMode
|
|
294
|
+
resizeMode: app.splash.resizeMode,
|
|
295
|
+
dark: app.splash.dark && {
|
|
296
|
+
image: app.splash.dark.source,
|
|
297
|
+
backgroundColor: app.splash.dark.backgroundColor
|
|
298
|
+
}
|
|
226
299
|
},
|
|
300
|
+
plugins: ((_app_fonts = app.fonts) === null || _app_fonts === void 0 ? void 0 : _app_fonts.length) ? [["expo-font", { fonts: app.fonts }]] : void 0,
|
|
227
301
|
ios: app.ios && {
|
|
228
302
|
bundleIdentifier: app.ios.bundleId,
|
|
229
303
|
buildNumber: app.ios.buildNumber,
|
|
230
|
-
supportsTablet: app.ios.tablet
|
|
304
|
+
supportsTablet: app.ios.tablet,
|
|
305
|
+
associatedDomains: app.ios.associatedDomains,
|
|
306
|
+
usesAppleSignIn: app.ios.usesAppleSignIn,
|
|
307
|
+
googleServicesFile: app.ios.googleServicesFile,
|
|
308
|
+
infoPlist: app.ios.infoPlist,
|
|
309
|
+
entitlements: app.ios.entitlements
|
|
231
310
|
},
|
|
232
311
|
android: app.android && {
|
|
233
312
|
package: app.android.applicationId,
|
|
234
313
|
versionCode: app.android.versionCode,
|
|
314
|
+
permissions: app.android.permissions,
|
|
315
|
+
blockedPermissions: app.android.blockedPermissions,
|
|
316
|
+
googleServicesFile: app.android.googleServicesFile,
|
|
235
317
|
adaptiveIcon: app.android.adaptiveIcon && {
|
|
236
318
|
foregroundImage: app.android.adaptiveIcon.foreground,
|
|
237
319
|
backgroundImage: app.android.adaptiveIcon.background,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeAppManifest.native.js","names":[],"sources":["cjs/nativeAppManifest.native.js"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar nativeAppManifest_exports = {};\n__export(nativeAppManifest_exports, {\n expoClientFromNativeApp: () => expoClientFromNativeApp,\n validateNativeApp: () => validateNativeApp\n});\nmodule.exports = __toCommonJS(nativeAppManifest_exports);\nvar TARGET_NAME = /^[A-Za-z][A-Za-z0-9_]*$/;\nvar SCHEME = /^[a-z][a-z0-9+.-]*$/i;\nvar VERSION = /^\\d+\\.\\d+\\.\\d+/;\nvar BUILD_NUMBER = /^[A-Za-z0-9.]+$/;\nvar REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/;\nvar DEPLOYMENT_TARGET = /^\\d+\\.\\d+$/;\nvar HEX_COLOR = /^#[\\da-f]{6}$/i;\nvar ORIENTATIONS = [\n \"portrait\",\n \"landscape\",\n \"default\"\n];\nvar USER_INTERFACE_STYLES = [\n \"light\",\n \"dark\",\n \"automatic\"\n];\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_splash, _manifest_imagePicker, _manifest_ios, _manifest_speech;\n if (!manifest || typeof manifest !== \"object\") fail(\"manifest must be an object\");\n if (!manifest.name || typeof manifest.name !== \"string\") fail(\"name is required\");\n if (!TARGET_NAME.test(manifest.name)) {\n fail(`name \"${manifest.name}\" must start with a letter and contain only letters, digits, and underscore`);\n }\n var schemes = manifest.scheme === void 0 ? [] : Array.isArray(manifest.scheme) ? manifest.scheme : [\n manifest.scheme\n ];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = schemes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var scheme = _step.value;\n if (typeof scheme !== \"string\" || !SCHEME.test(scheme)) {\n fail(`scheme \"${scheme}\" must be a valid uri scheme`);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n if (manifest.orientation !== void 0 && !ORIENTATIONS.includes(manifest.orientation)) {\n fail(`orientation \"${manifest.orientation}\" must be ${ORIENTATIONS.join(\", \")}`);\n }\n if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {\n fail(`userInterfaceStyle \"${manifest.userInterfaceStyle}\" must be ${USER_INTERFACE_STYLES.join(\", \")}`);\n }\n if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {\n fail(`version \"${manifest.version}\" must start with major.minor.patch`);\n }\n if (manifest.icon !== void 0 && (!manifest.icon.source || !HEX_COLOR.test(manifest.icon.backgroundColor))) {\n fail(\"icon requires source and a six-digit hex backgroundColor\");\n }\n if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {\n fail(\"splash requires source, a six-digit hex backgroundColor, and width from 1 to 288\");\n }\n if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.resizeMode) !== void 0 && manifest.splash.resizeMode !== \"contain\" && manifest.splash.resizeMode !== \"cover\") {\n fail(`splash.resizeMode \"${manifest.splash.resizeMode}\" must be contain or cover`);\n }\n if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== \"string\" || manifest.imagePicker.camera.trim() === \"\")) {\n fail(\"imagePicker.camera must be a non-empty string\");\n }\n if (manifest.photoLibrary !== void 0 && (!manifest.photoLibrary || typeof manifest.photoLibrary.addOnly !== \"string\" || manifest.photoLibrary.addOnly.trim() === \"\")) {\n fail(\"photoLibrary.addOnly must be a non-empty string\");\n }\n if (manifest.contacts !== void 0 && (!manifest.contacts || typeof manifest.contacts.usage !== \"string\" || manifest.contacts.usage.trim() === \"\")) {\n fail(\"contacts.usage must be a non-empty string\");\n }\n if (manifest.calendar !== void 0) {\n if (!manifest.calendar || manifest.calendar.usage === void 0 && manifest.calendar.remindersUsage === void 0) {\n fail(\"calendar.usage or calendar.remindersUsage must be a non-empty string\");\n }\n if (manifest.calendar.usage !== void 0 && (typeof manifest.calendar.usage !== \"string\" || manifest.calendar.usage.trim() === \"\")) {\n fail(\"calendar.usage must be a non-empty string\");\n }\n if (manifest.calendar.remindersUsage !== void 0 && (typeof manifest.calendar.remindersUsage !== \"string\" || manifest.calendar.remindersUsage.trim() === \"\")) {\n fail(\"calendar.remindersUsage must be a non-empty string\");\n }\n }\n if (manifest.location !== void 0 && (!manifest.location || typeof manifest.location.whenInUse !== \"string\" || manifest.location.whenInUse.trim() === \"\")) {\n fail(\"location.whenInUse must be a non-empty string\");\n }\n if (manifest.audio !== void 0) {\n if (!manifest.audio || typeof manifest.audio !== \"object\") {\n fail(\"audio must configure microphone or background playback\");\n }\n if (manifest.audio.microphone !== void 0 && (typeof manifest.audio.microphone !== \"string\" || manifest.audio.microphone.trim() === \"\")) {\n fail(\"audio.microphone must be a non-empty string\");\n }\n if (manifest.audio.background !== void 0 && typeof manifest.audio.background !== \"boolean\") {\n fail(\"audio.background must be a boolean\");\n }\n if (manifest.audio.microphone === void 0 && manifest.audio.background !== true) {\n fail(\"audio must configure microphone or background playback\");\n }\n }\n if (((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.faceIdUsageDescription) !== void 0 && (typeof manifest.ios.faceIdUsageDescription !== \"string\" || manifest.ios.faceIdUsageDescription.trim() === \"\")) {\n fail(\"ios.faceIdUsageDescription must be a non-empty string\");\n }\n if (manifest.speech !== void 0 && (typeof ((_manifest_speech = manifest.speech) === null || _manifest_speech === void 0 ? void 0 : _manifest_speech.recognition) !== \"string\" || manifest.speech.recognition.trim() === \"\" || typeof manifest.speech.microphone !== \"string\" || manifest.speech.microphone.trim() === \"\")) {\n fail(\"speech.recognition and speech.microphone must be non-empty strings\");\n }\n if (manifest.notifications !== void 0) {\n if (typeof manifest.notifications !== \"object\" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== \"boolean\") {\n fail(\"notifications.push must be a boolean\");\n }\n }\n if (manifest.pictureInPicture !== void 0 && typeof manifest.pictureInPicture !== \"boolean\") {\n fail(\"pictureInPicture must be a boolean\");\n }\n if (manifest.updates !== void 0) {\n if (typeof manifest.updates.runtimeVersion !== \"string\" || manifest.updates.runtimeVersion.trim() === \"\") {\n fail(\"updates.runtimeVersion must be a non-empty string\");\n }\n if (manifest.updates.url !== void 0 && (typeof manifest.updates.url !== \"string\" || manifest.updates.url.trim() === \"\")) {\n fail(\"updates.url must be a non-empty string\");\n }\n }\n if (!platform || platform === \"ios\") {\n var _manifest_ios1;\n if (!((_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios2;\n fail(`ios.bundleId \"${(_manifest_ios2 = manifest.ios) === null || _manifest_ios2 === void 0 ? void 0 : _manifest_ios2.bundleId}\" must be reverse-dns`);\n }\n if (manifest.ios.deploymentTarget !== void 0 && !DEPLOYMENT_TARGET.test(manifest.ios.deploymentTarget)) {\n fail(`ios.deploymentTarget \"${manifest.ios.deploymentTarget}\" must look like \"17.0\"`);\n }\n if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {\n fail(`ios.buildNumber \"${manifest.ios.buildNumber}\" must contain only letters, digits, and dots`);\n }\n var widgets = manifest.ios.widgets;\n if (widgets) {\n var _widgets_displayName, _widgets_description;\n if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {\n fail(\"ios.widgets requires ios.deploymentTarget of 17.0 or newer\");\n }\n if (!/^group\\.[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {\n fail(\"ios.widgets.appGroup must be a reverse-dns App Group beginning with group.\");\n }\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {\n fail(\"ios.widgets.kind must be a non-empty WidgetKit kind\");\n }\n if (!((_widgets_displayName = widgets.displayName) === null || _widgets_displayName === void 0 ? void 0 : _widgets_displayName.trim()) || !((_widgets_description = widgets.description) === null || _widgets_description === void 0 ? void 0 : _widgets_description.trim())) {\n fail(\"ios.widgets.displayName and description must be non-empty strings\");\n }\n if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== \"boolean\") {\n fail(\"ios.widgets.pushNotifications must be a boolean\");\n }\n }\n }\n if (!platform || platform === \"android\") {\n var _manifest_android;\n if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {\n var _manifest_android1;\n fail(`android.applicationId \"${(_manifest_android1 = manifest.android) === null || _manifest_android1 === void 0 ? void 0 : _manifest_android1.applicationId}\" must be reverse-dns`);\n }\n if (manifest.android.minSdk !== void 0 && (!Number.isInteger(manifest.android.minSdk) || manifest.android.minSdk < 21 || manifest.android.minSdk > 36)) {\n fail(`android.minSdk \"${manifest.android.minSdk}\" must be an integer from 21 to 36`);\n }\n if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {\n fail(`android.versionCode \"${manifest.android.versionCode}\" must be a positive integer`);\n }\n var adaptiveIcon = manifest.android.adaptiveIcon;\n if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {\n fail(\"android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex\");\n }\n if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== \"string\" || manifest.android.googleMapsApiKey.trim() === \"\")) {\n fail(\"android.googleMapsApiKey must be a non-empty string\");\n }\n }\n return manifest;\n}\nfunction expoClientFromNativeApp(app) {\n var _app_displayName;\n var _app_icon;\n return {\n name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,\n slug: app.name,\n scheme: app.scheme,\n version: app.version,\n orientation: app.orientation,\n userInterfaceStyle: app.userInterfaceStyle,\n icon: (_app_icon = app.icon) === null || _app_icon === void 0 ? void 0 : _app_icon.source,\n splash: app.splash && {\n image: app.splash.source,\n backgroundColor: app.splash.backgroundColor,\n imageWidth: app.splash.width,\n resizeMode: app.splash.resizeMode\n },\n ios: app.ios && {\n bundleIdentifier: app.ios.bundleId,\n buildNumber: app.ios.buildNumber,\n supportsTablet: app.ios.tablet\n },\n android: app.android && {\n package: app.android.applicationId,\n versionCode: app.android.versionCode,\n adaptiveIcon: app.android.adaptiveIcon && {\n foregroundImage: app.android.adaptiveIcon.foreground,\n backgroundImage: app.android.adaptiveIcon.background,\n backgroundColor: app.android.adaptiveIcon.backgroundColor,\n monochromeImage: app.android.adaptiveIcon.monochrome\n }\n }\n };\n}\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":";;;AACA,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,OAAO;AAC9B,IAAI,oBAAoB,OAAO;AAC/B,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,YAAY,QAAQ,QAAQ;CAC9B,KAAK,IAAI,QAAQ,KACf,UAAU,QAAQ,MAAM;EAAE,KAAK,IAAI;EAAO,YAAY;CAAK,CAAC;AAChE;AACA,IAAI,eAAe,IAAI,MAAM,QAAQ,SAAS;CAC5C,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY;EAClE,KAAK,IAAI,OAAO,kBAAkB,IAAI,GACpC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,QACzC,UAAU,IAAI,KAAK;GAAE,WAAW,KAAK;GAAM,YAAY,EAAE,OAAO,iBAAiB,MAAM,GAAG,MAAM,KAAK;EAAW,CAAC;CACvH;CACA,OAAO;AACT;AACA,IAAI,gBAAgB,QAAQ,YAAY,UAAU,CAAC,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC,GAAG,GAAG;AACzF,IAAI,4BAA4B,CAAC;AACjC,SAAS,2BAA2B;CAClC,+BAA+B;CAC/B,yBAAyB;AAC3B,CAAC;AACD,OAAO,UAAU,aAAa,yBAAyB;AACvD,IAAI,cAAc;AAClB,IAAI,SAAS;AACb,IAAI,UAAU;AACd,IAAI,eAAe;AACnB,IAAI,cAAc;AAClB,IAAI,oBAAoB;AACxB,IAAI,YAAY;AAChB,IAAI,eAAe;CACjB;CACA;CACA;AACF;AACA,IAAI,wBAAwB;CAC1B;CACA;CACA;AACF;AACA,SAAS,KAAK,SAAS;CACrB,MAAM,IAAI,MAAM,6BAA6B,SAAS;AACxD;AACA,SAAS,kBAAkB,UAAU,UAAU;CAC7C,IAAI,kBAAkB,uBAAuB,eAAe;CAC5D,IAAI,CAAC,YAAY,OAAO,aAAa,UAAU,KAAK,4BAA4B;CAChF,IAAI,CAAC,SAAS,QAAQ,OAAO,SAAS,SAAS,UAAU,KAAK,kBAAkB;CAChF,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG;EACpC,KAAK,SAAS,SAAS,KAAK,4EAA4E;CAC1G;CACA,IAAI,UAAU,SAAS,WAAW,KAAK,IAAI,CAAC,IAAI,MAAM,QAAQ,SAAS,MAAM,IAAI,SAAS,SAAS,CACjG,SAAS,MACX;CACA,IAAI,4BAA4B,MAAM,oBAAoB,OAAO,iBAAiB,KAAK;CACvF,IAAI;EACF,KAAK,IAAI,YAAY,QAAQ,OAAO,SAAS,CAAC,GAAG,OAAO,EAAE,6BAA6B,QAAQ,UAAU,KAAK,EAAC,CAAE,OAAO,4BAA4B,MAAM;GACxJ,IAAI,SAAS,MAAM;GACnB,IAAI,OAAO,WAAW,YAAY,CAAC,OAAO,KAAK,MAAM,GAAG;IACtD,KAAK,WAAW,OAAO,6BAA6B;GACtD;EACF;CACF,SAAS,KAAK;EACZ,oBAAoB;EACpB,iBAAiB;CACnB,UAAU;EACR,IAAI;GACF,IAAI,CAAC,6BAA6B,UAAU,UAAU,MAAM;IAC1D,UAAU,OAAO;GACnB;EACF,UAAU;GACR,IAAI,mBAAmB;IACrB,MAAM;GACR;EACF;CACF;CACA,IAAI,SAAS,gBAAgB,KAAK,KAAK,CAAC,aAAa,SAAS,SAAS,WAAW,GAAG;EACnF,KAAK,gBAAgB,SAAS,YAAY,YAAY,aAAa,KAAK,IAAI,GAAG;CACjF;CACA,IAAI,SAAS,uBAAuB,KAAK,KAAK,CAAC,sBAAsB,SAAS,SAAS,kBAAkB,GAAG;EAC1G,KAAK,uBAAuB,SAAS,mBAAmB,YAAY,sBAAsB,KAAK,IAAI,GAAG;CACxG;CACA,IAAI,SAAS,YAAY,KAAK,KAAK,CAAC,QAAQ,KAAK,SAAS,OAAO,GAAG;EAClE,KAAK,YAAY,SAAS,QAAQ,oCAAoC;CACxE;CACA,IAAI,SAAS,SAAS,KAAK,MAAM,CAAC,SAAS,KAAK,UAAU,CAAC,UAAU,KAAK,SAAS,KAAK,eAAe,IAAI;EACzG,KAAK,0DAA0D;CACjE;CACA,IAAI,SAAS,WAAW,KAAK,MAAM,CAAC,SAAS,OAAO,UAAU,CAAC,UAAU,KAAK,SAAS,OAAO,eAAe,KAAK,SAAS,OAAO,UAAU,KAAK,MAAM,CAAC,OAAO,SAAS,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,QAAQ,KAAK,SAAS,OAAO,QAAQ,OAAO;EAC5P,KAAK,kFAAkF;CACzF;CACA,MAAM,mBAAmB,SAAS,YAAY,QAAQ,qBAAqB,KAAK,IAAI,KAAK,IAAI,iBAAiB,gBAAgB,KAAK,KAAK,SAAS,OAAO,eAAe,aAAa,SAAS,OAAO,eAAe,SAAS;EAC1N,KAAK,sBAAsB,SAAS,OAAO,WAAW,2BAA2B;CACnF;CACA,MAAM,wBAAwB,SAAS,iBAAiB,QAAQ,0BAA0B,KAAK,IAAI,KAAK,IAAI,sBAAsB,YAAY,KAAK,MAAM,OAAO,SAAS,YAAY,WAAW,YAAY,SAAS,YAAY,OAAO,KAAK,MAAM,KAAK;EACtP,KAAK,+CAA+C;CACtD;CACA,IAAI,SAAS,iBAAiB,KAAK,MAAM,CAAC,SAAS,gBAAgB,OAAO,SAAS,aAAa,YAAY,YAAY,SAAS,aAAa,QAAQ,KAAK,MAAM,KAAK;EACpK,KAAK,iDAAiD;CACxD;CACA,IAAI,SAAS,aAAa,KAAK,MAAM,CAAC,SAAS,YAAY,OAAO,SAAS,SAAS,UAAU,YAAY,SAAS,SAAS,MAAM,KAAK,MAAM,KAAK;EAChJ,KAAK,2CAA2C;CAClD;CACA,IAAI,SAAS,aAAa,KAAK,GAAG;EAChC,IAAI,CAAC,SAAS,YAAY,SAAS,SAAS,UAAU,KAAK,KAAK,SAAS,SAAS,mBAAmB,KAAK,GAAG;GAC3G,KAAK,sEAAsE;EAC7E;EACA,IAAI,SAAS,SAAS,UAAU,KAAK,MAAM,OAAO,SAAS,SAAS,UAAU,YAAY,SAAS,SAAS,MAAM,KAAK,MAAM,KAAK;GAChI,KAAK,2CAA2C;EAClD;EACA,IAAI,SAAS,SAAS,mBAAmB,KAAK,MAAM,OAAO,SAAS,SAAS,mBAAmB,YAAY,SAAS,SAAS,eAAe,KAAK,MAAM,KAAK;GAC3J,KAAK,oDAAoD;EAC3D;CACF;CACA,IAAI,SAAS,aAAa,KAAK,MAAM,CAAC,SAAS,YAAY,OAAO,SAAS,SAAS,cAAc,YAAY,SAAS,SAAS,UAAU,KAAK,MAAM,KAAK;EACxJ,KAAK,+CAA+C;CACtD;CACA,IAAI,SAAS,UAAU,KAAK,GAAG;EAC7B,IAAI,CAAC,SAAS,SAAS,OAAO,SAAS,UAAU,UAAU;GACzD,KAAK,wDAAwD;EAC/D;EACA,IAAI,SAAS,MAAM,eAAe,KAAK,MAAM,OAAO,SAAS,MAAM,eAAe,YAAY,SAAS,MAAM,WAAW,KAAK,MAAM,KAAK;GACtI,KAAK,6CAA6C;EACpD;EACA,IAAI,SAAS,MAAM,eAAe,KAAK,KAAK,OAAO,SAAS,MAAM,eAAe,WAAW;GAC1F,KAAK,oCAAoC;EAC3C;EACA,IAAI,SAAS,MAAM,eAAe,KAAK,KAAK,SAAS,MAAM,eAAe,MAAM;GAC9E,KAAK,wDAAwD;EAC/D;CACF;CACA,MAAM,gBAAgB,SAAS,SAAS,QAAQ,kBAAkB,KAAK,IAAI,KAAK,IAAI,cAAc,4BAA4B,KAAK,MAAM,OAAO,SAAS,IAAI,2BAA2B,YAAY,SAAS,IAAI,uBAAuB,KAAK,MAAM,KAAK;EACtP,KAAK,uDAAuD;CAC9D;CACA,IAAI,SAAS,WAAW,KAAK,MAAM,SAAS,mBAAmB,SAAS,YAAY,QAAQ,qBAAqB,KAAK,IAAI,KAAK,IAAI,iBAAiB,iBAAiB,YAAY,SAAS,OAAO,YAAY,KAAK,MAAM,MAAM,OAAO,SAAS,OAAO,eAAe,YAAY,SAAS,OAAO,WAAW,KAAK,MAAM,KAAK;EACzT,KAAK,oEAAoE;CAC3E;CACA,IAAI,SAAS,kBAAkB,KAAK,GAAG;EACrC,IAAI,OAAO,SAAS,kBAAkB,YAAY,SAAS,cAAc,SAAS,KAAK,KAAK,OAAO,SAAS,cAAc,SAAS,WAAW;GAC5I,KAAK,sCAAsC;EAC7C;CACF;CACA,IAAI,SAAS,qBAAqB,KAAK,KAAK,OAAO,SAAS,qBAAqB,WAAW;EAC1F,KAAK,oCAAoC;CAC3C;CACA,IAAI,SAAS,YAAY,KAAK,GAAG;EAC/B,IAAI,OAAO,SAAS,QAAQ,mBAAmB,YAAY,SAAS,QAAQ,eAAe,KAAK,MAAM,IAAI;GACxG,KAAK,mDAAmD;EAC1D;EACA,IAAI,SAAS,QAAQ,QAAQ,KAAK,MAAM,OAAO,SAAS,QAAQ,QAAQ,YAAY,SAAS,QAAQ,IAAI,KAAK,MAAM,KAAK;GACvH,KAAK,wCAAwC;EAC/C;CACF;CACA,IAAI,CAAC,YAAY,aAAa,OAAO;EACnC,IAAI;EACJ,IAAI,GAAG,iBAAiB,SAAS,SAAS,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,eAAe,aAAa,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,GAAG;GAC3J,IAAI;GACJ,KAAK,kBAAkB,iBAAiB,SAAS,SAAS,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,eAAe,SAAS,sBAAsB;EACvJ;EACA,IAAI,SAAS,IAAI,qBAAqB,KAAK,KAAK,CAAC,kBAAkB,KAAK,SAAS,IAAI,gBAAgB,GAAG;GACtG,KAAK,yBAAyB,SAAS,IAAI,iBAAiB,wBAAwB;EACtF;EACA,IAAI,SAAS,IAAI,gBAAgB,KAAK,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,WAAW,GAAG;GACvF,KAAK,oBAAoB,SAAS,IAAI,YAAY,8CAA8C;EAClG;EACA,IAAI,UAAU,SAAS,IAAI;EAC3B,IAAI,SAAS;GACX,IAAI,sBAAsB;GAC1B,IAAI,CAAC,SAAS,IAAI,oBAAoB,OAAO,SAAS,IAAI,gBAAgB,IAAI,IAAI;IAChF,KAAK,4DAA4D;GACnE;GACA,IAAI,CAAC,2DAA2D,KAAK,QAAQ,QAAQ,GAAG;IACtF,KAAK,4EAA4E;GACnF;GACA,IAAI,CAAC,4BAA4B,KAAK,QAAQ,IAAI,GAAG;IACnD,KAAK,qDAAqD;GAC5D;GACA,IAAI,GAAG,uBAAuB,QAAQ,iBAAiB,QAAQ,yBAAyB,KAAK,IAAI,KAAK,IAAI,qBAAqB,KAAK,MAAM,GAAG,uBAAuB,QAAQ,iBAAiB,QAAQ,yBAAyB,KAAK,IAAI,KAAK,IAAI,qBAAqB,KAAK,IAAI;IAC5Q,KAAK,mEAAmE;GAC1E;GACA,IAAI,QAAQ,sBAAsB,KAAK,KAAK,OAAO,QAAQ,sBAAsB,WAAW;IAC1F,KAAK,iDAAiD;GACxD;EACF;CACF;CACA,IAAI,CAAC,YAAY,aAAa,WAAW;EACvC,IAAI;EACJ,IAAI,GAAG,oBAAoB,SAAS,aAAa,QAAQ,sBAAsB,KAAK,IAAI,KAAK,IAAI,kBAAkB,kBAAkB,CAAC,YAAY,KAAK,SAAS,QAAQ,aAAa,GAAG;GACtL,IAAI;GACJ,KAAK,2BAA2B,qBAAqB,SAAS,aAAa,QAAQ,uBAAuB,KAAK,IAAI,KAAK,IAAI,mBAAmB,cAAc,sBAAsB;EACrL;EACA,IAAI,SAAS,QAAQ,WAAW,KAAK,MAAM,CAAC,OAAO,UAAU,SAAS,QAAQ,MAAM,KAAK,SAAS,QAAQ,SAAS,MAAM,SAAS,QAAQ,SAAS,KAAK;GACtJ,KAAK,mBAAmB,SAAS,QAAQ,OAAO,mCAAmC;EACrF;EACA,IAAI,SAAS,QAAQ,gBAAgB,KAAK,MAAM,CAAC,OAAO,UAAU,SAAS,QAAQ,WAAW,KAAK,SAAS,QAAQ,cAAc,IAAI;GACpI,KAAK,wBAAwB,SAAS,QAAQ,YAAY,6BAA6B;EACzF;EACA,IAAI,eAAe,SAAS,QAAQ;EACpC,IAAI,iBAAiB,KAAK,MAAM,CAAC,aAAa,cAAc,aAAa,oBAAoB,KAAK,KAAK,CAAC,UAAU,KAAK,aAAa,eAAe,IAAI;GACrJ,KAAK,qFAAqF;EAC5F;EACA,IAAI,SAAS,QAAQ,qBAAqB,KAAK,MAAM,OAAO,SAAS,QAAQ,qBAAqB,YAAY,SAAS,QAAQ,iBAAiB,KAAK,MAAM,KAAK;GAC9J,KAAK,qDAAqD;EAC5D;CACF;CACA,OAAO;AACT;AACA,SAAS,wBAAwB,KAAK;CACpC,IAAI;CACJ,IAAI;CACJ,OAAO;EACL,OAAO,mBAAmB,IAAI,iBAAiB,QAAQ,qBAAqB,KAAK,IAAI,mBAAmB,IAAI;EAC5G,MAAM,IAAI;EACV,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,oBAAoB,IAAI;EACxB,OAAO,YAAY,IAAI,UAAU,QAAQ,cAAc,KAAK,IAAI,KAAK,IAAI,UAAU;EACnF,QAAQ,IAAI,UAAU;GACpB,OAAO,IAAI,OAAO;GAClB,iBAAiB,IAAI,OAAO;GAC5B,YAAY,IAAI,OAAO;GACvB,YAAY,IAAI,OAAO;EACzB;EACA,KAAK,IAAI,OAAO;GACd,kBAAkB,IAAI,IAAI;GAC1B,aAAa,IAAI,IAAI;GACrB,gBAAgB,IAAI,IAAI;EAC1B;EACA,SAAS,IAAI,WAAW;GACtB,SAAS,IAAI,QAAQ;GACrB,aAAa,IAAI,QAAQ;GACzB,cAAc,IAAI,QAAQ,gBAAgB;IACxC,iBAAiB,IAAI,QAAQ,aAAa;IAC1C,iBAAiB,IAAI,QAAQ,aAAa;IAC1C,iBAAiB,IAAI,QAAQ,aAAa;IAC1C,iBAAiB,IAAI,QAAQ,aAAa;GAC5C;EACF;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"nativeAppManifest.native.js","names":[],"sources":["cjs/nativeAppManifest.native.js"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar nativeAppManifest_exports = {};\n__export(nativeAppManifest_exports, {\n expoClientFromNativeApp: () => expoClientFromNativeApp,\n validateNativeApp: () => validateNativeApp\n});\nmodule.exports = __toCommonJS(nativeAppManifest_exports);\nvar TARGET_NAME = /^[A-Za-z][A-Za-z0-9_]*$/;\nvar SCHEME = /^[a-z][a-z0-9+.-]*$/i;\nvar VERSION = /^\\d+\\.\\d+\\.\\d+/;\nvar BUILD_NUMBER = /^[A-Za-z0-9.]+$/;\nvar REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/;\nvar DEPLOYMENT_TARGET = /^\\d+\\.\\d+$/;\nvar HEX_COLOR = /^#[\\da-f]{6}$/i;\nvar FONT_FILE = /\\.(ttf|otf)$/i;\nvar ORIENTATIONS = [\n \"portrait\",\n \"landscape\",\n \"default\"\n];\nvar USER_INTERFACE_STYLES = [\n \"light\",\n \"dark\",\n \"automatic\"\n];\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_splash, _manifest_splash1, _manifest_imagePicker, _manifest_ios, _manifest_speech;\n if (!manifest || typeof manifest !== \"object\") fail(\"manifest must be an object\");\n if (!manifest.name || typeof manifest.name !== \"string\") fail(\"name is required\");\n if (!TARGET_NAME.test(manifest.name)) {\n fail(`name \"${manifest.name}\" must start with a letter and contain only letters, digits, and underscore`);\n }\n var schemes = manifest.scheme === void 0 ? [] : Array.isArray(manifest.scheme) ? manifest.scheme : [\n manifest.scheme\n ];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = schemes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var scheme = _step.value;\n if (typeof scheme !== \"string\" || !SCHEME.test(scheme)) {\n fail(`scheme \"${scheme}\" must be a valid uri scheme`);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n if (manifest.orientation !== void 0 && !ORIENTATIONS.includes(manifest.orientation)) {\n fail(`orientation \"${manifest.orientation}\" must be ${ORIENTATIONS.join(\", \")}`);\n }\n if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {\n fail(`userInterfaceStyle \"${manifest.userInterfaceStyle}\" must be ${USER_INTERFACE_STYLES.join(\", \")}`);\n }\n if (manifest.fonts !== void 0) {\n var names = /* @__PURE__ */ new Set();\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n try {\n for (var _iterator1 = manifest.fonts[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n var font = _step1.value;\n var _font_split_pop;\n if (typeof font !== \"string\" || !FONT_FILE.test(font)) {\n fail(`fonts entry \"${font}\" must be a .ttf or .otf file path`);\n }\n var name = (_font_split_pop = font.split(\"/\").pop()) !== null && _font_split_pop !== void 0 ? _font_split_pop : font;\n if (names.has(name)) fail(`fonts lists ${name} twice`);\n names.add(name);\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally {\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {\n fail(`version \"${manifest.version}\" must start with major.minor.patch`);\n }\n if (manifest.icon !== void 0 && (!manifest.icon.source || !HEX_COLOR.test(manifest.icon.backgroundColor))) {\n fail(\"icon requires source and a six-digit hex backgroundColor\");\n }\n if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {\n fail(\"splash requires source, a six-digit hex backgroundColor, and width from 1 to 288\");\n }\n if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.dark) !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {\n fail(\"splash.dark requires a six-digit hex backgroundColor\");\n }\n if (((_manifest_splash1 = manifest.splash) === null || _manifest_splash1 === void 0 ? void 0 : _manifest_splash1.resizeMode) !== void 0 && manifest.splash.resizeMode !== \"contain\" && manifest.splash.resizeMode !== \"cover\") {\n fail(`splash.resizeMode \"${manifest.splash.resizeMode}\" must be contain or cover`);\n }\n if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== \"string\" || manifest.imagePicker.camera.trim() === \"\")) {\n fail(\"imagePicker.camera must be a non-empty string\");\n }\n if (manifest.photoLibrary !== void 0 && (!manifest.photoLibrary || typeof manifest.photoLibrary.addOnly !== \"string\" || manifest.photoLibrary.addOnly.trim() === \"\")) {\n fail(\"photoLibrary.addOnly must be a non-empty string\");\n }\n if (manifest.contacts !== void 0 && (!manifest.contacts || typeof manifest.contacts.usage !== \"string\" || manifest.contacts.usage.trim() === \"\")) {\n fail(\"contacts.usage must be a non-empty string\");\n }\n if (manifest.calendar !== void 0) {\n if (!manifest.calendar || manifest.calendar.usage === void 0 && manifest.calendar.remindersUsage === void 0) {\n fail(\"calendar.usage or calendar.remindersUsage must be a non-empty string\");\n }\n if (manifest.calendar.usage !== void 0 && (typeof manifest.calendar.usage !== \"string\" || manifest.calendar.usage.trim() === \"\")) {\n fail(\"calendar.usage must be a non-empty string\");\n }\n if (manifest.calendar.remindersUsage !== void 0 && (typeof manifest.calendar.remindersUsage !== \"string\" || manifest.calendar.remindersUsage.trim() === \"\")) {\n fail(\"calendar.remindersUsage must be a non-empty string\");\n }\n }\n if (manifest.location !== void 0 && (!manifest.location || typeof manifest.location.whenInUse !== \"string\" || manifest.location.whenInUse.trim() === \"\")) {\n fail(\"location.whenInUse must be a non-empty string\");\n }\n if (manifest.audio !== void 0) {\n if (!manifest.audio || typeof manifest.audio !== \"object\") {\n fail(\"audio must configure microphone or background playback\");\n }\n if (manifest.audio.microphone !== void 0 && (typeof manifest.audio.microphone !== \"string\" || manifest.audio.microphone.trim() === \"\")) {\n fail(\"audio.microphone must be a non-empty string\");\n }\n if (manifest.audio.background !== void 0 && typeof manifest.audio.background !== \"boolean\") {\n fail(\"audio.background must be a boolean\");\n }\n if (manifest.audio.microphone === void 0 && manifest.audio.background !== true) {\n fail(\"audio must configure microphone or background playback\");\n }\n }\n if (((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.faceIdUsageDescription) !== void 0 && (typeof manifest.ios.faceIdUsageDescription !== \"string\" || manifest.ios.faceIdUsageDescription.trim() === \"\")) {\n fail(\"ios.faceIdUsageDescription must be a non-empty string\");\n }\n if (manifest.speech !== void 0 && (typeof ((_manifest_speech = manifest.speech) === null || _manifest_speech === void 0 ? void 0 : _manifest_speech.recognition) !== \"string\" || manifest.speech.recognition.trim() === \"\" || typeof manifest.speech.microphone !== \"string\" || manifest.speech.microphone.trim() === \"\")) {\n fail(\"speech.recognition and speech.microphone must be non-empty strings\");\n }\n if (manifest.notifications !== void 0) {\n if (typeof manifest.notifications !== \"object\" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== \"boolean\") {\n fail(\"notifications.push must be a boolean\");\n }\n }\n if (manifest.pictureInPicture !== void 0 && typeof manifest.pictureInPicture !== \"boolean\") {\n fail(\"pictureInPicture must be a boolean\");\n }\n if (manifest.updates !== void 0) {\n if (typeof manifest.updates.runtimeVersion !== \"string\" || manifest.updates.runtimeVersion.trim() === \"\") {\n fail(\"updates.runtimeVersion must be a non-empty string\");\n }\n if (manifest.updates.url !== void 0 && (typeof manifest.updates.url !== \"string\" || manifest.updates.url.trim() === \"\")) {\n fail(\"updates.url must be a non-empty string\");\n }\n }\n if (!platform || platform === \"ios\") {\n var _manifest_ios1;\n if (!((_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios2;\n fail(`ios.bundleId \"${(_manifest_ios2 = manifest.ios) === null || _manifest_ios2 === void 0 ? void 0 : _manifest_ios2.bundleId}\" must be reverse-dns`);\n }\n if (manifest.ios.deploymentTarget !== void 0 && !DEPLOYMENT_TARGET.test(manifest.ios.deploymentTarget)) {\n fail(`ios.deploymentTarget \"${manifest.ios.deploymentTarget}\" must look like \"17.0\"`);\n }\n if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {\n fail(`ios.buildNumber \"${manifest.ios.buildNumber}\" must contain only letters, digits, and dots`);\n }\n var widgets = manifest.ios.widgets;\n if (widgets) {\n var _widgets_displayName, _widgets_description;\n if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {\n fail(\"ios.widgets requires ios.deploymentTarget of 17.0 or newer\");\n }\n if (!/^group\\.[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {\n fail(\"ios.widgets.appGroup must be a reverse-dns App Group beginning with group.\");\n }\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {\n fail(\"ios.widgets.kind must be a non-empty WidgetKit kind\");\n }\n if (!((_widgets_displayName = widgets.displayName) === null || _widgets_displayName === void 0 ? void 0 : _widgets_displayName.trim()) || !((_widgets_description = widgets.description) === null || _widgets_description === void 0 ? void 0 : _widgets_description.trim())) {\n fail(\"ios.widgets.displayName and description must be non-empty strings\");\n }\n if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== \"boolean\") {\n fail(\"ios.widgets.pushNotifications must be a boolean\");\n }\n }\n }\n if (!platform || platform === \"android\") {\n var _manifest_android_appLinks;\n var _manifest_android;\n if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {\n var _manifest_android1;\n fail(`android.applicationId \"${(_manifest_android1 = manifest.android) === null || _manifest_android1 === void 0 ? void 0 : _manifest_android1.applicationId}\" must be reverse-dns`);\n }\n if (manifest.android.minSdk !== void 0 && (!Number.isInteger(manifest.android.minSdk) || manifest.android.minSdk < 21 || manifest.android.minSdk > 36)) {\n fail(`android.minSdk \"${manifest.android.minSdk}\" must be an integer from 21 to 36`);\n }\n if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {\n fail(`android.versionCode \"${manifest.android.versionCode}\" must be a positive integer`);\n }\n for (var _i = 0, _iter = [\n \"targetSdk\",\n \"compileSdk\"\n ]; _i < _iter.length; _i++) {\n var key = _iter[_i];\n var value = manifest.android[key];\n if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {\n fail(`android.${key} \"${value}\" must be an api level integer`);\n }\n }\n if (manifest.android.shrinkResources && !manifest.android.minify) {\n fail(\"android.shrinkResources needs android.minify\");\n }\n var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;\n try {\n for (var _iterator2 = ((_manifest_android_appLinks = manifest.android.appLinks) !== null && _manifest_android_appLinks !== void 0 ? _manifest_android_appLinks : [])[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var link = _step2.value;\n if (!link.host || !REVERSE_DNS.test(link.host)) {\n fail(`android.appLinks host \"${link.host}\" must be a domain`);\n }\n if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith(\"/\")) {\n fail(`android.appLinks pathPrefix \"${link.pathPrefix}\" must start with /`);\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n var adaptiveIcon = manifest.android.adaptiveIcon;\n if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {\n fail(\"android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex\");\n }\n if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== \"string\" || manifest.android.googleMapsApiKey.trim() === \"\")) {\n fail(\"android.googleMapsApiKey must be a non-empty string\");\n }\n }\n return manifest;\n}\nfunction expoClientFromNativeApp(app) {\n var _app_displayName;\n var _app_icon, _app_fonts;\n return {\n name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,\n slug: app.name,\n scheme: app.scheme,\n version: app.version,\n orientation: app.orientation,\n userInterfaceStyle: app.userInterfaceStyle,\n icon: (_app_icon = app.icon) === null || _app_icon === void 0 ? void 0 : _app_icon.source,\n splash: app.splash && {\n image: app.splash.source,\n backgroundColor: app.splash.backgroundColor,\n imageWidth: app.splash.width,\n resizeMode: app.splash.resizeMode,\n dark: app.splash.dark && {\n image: app.splash.dark.source,\n backgroundColor: app.splash.dark.backgroundColor\n }\n },\n plugins: ((_app_fonts = app.fonts) === null || _app_fonts === void 0 ? void 0 : _app_fonts.length) ? [\n [\n \"expo-font\",\n {\n fonts: app.fonts\n }\n ]\n ] : void 0,\n ios: app.ios && {\n bundleIdentifier: app.ios.bundleId,\n buildNumber: app.ios.buildNumber,\n supportsTablet: app.ios.tablet,\n associatedDomains: app.ios.associatedDomains,\n usesAppleSignIn: app.ios.usesAppleSignIn,\n googleServicesFile: app.ios.googleServicesFile,\n infoPlist: app.ios.infoPlist,\n entitlements: app.ios.entitlements\n },\n android: app.android && {\n package: app.android.applicationId,\n versionCode: app.android.versionCode,\n permissions: app.android.permissions,\n blockedPermissions: app.android.blockedPermissions,\n googleServicesFile: app.android.googleServicesFile,\n adaptiveIcon: app.android.adaptiveIcon && {\n foregroundImage: app.android.adaptiveIcon.foreground,\n backgroundImage: app.android.adaptiveIcon.background,\n backgroundColor: app.android.adaptiveIcon.backgroundColor,\n monochromeImage: app.android.adaptiveIcon.monochrome\n }\n }\n };\n}\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ const BUILD_NUMBER = /^[A-Za-z0-9.]+$/;
|
|
|
5
5
|
const REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/;
|
|
6
6
|
const DEPLOYMENT_TARGET = /^\d+\.\d+$/;
|
|
7
7
|
const HEX_COLOR = /^#[\da-f]{6}$/i;
|
|
8
|
+
const FONT_FILE = /\.(ttf|otf)$/i;
|
|
8
9
|
const ORIENTATIONS = [
|
|
9
10
|
"portrait",
|
|
10
11
|
"landscape",
|
|
@@ -36,6 +37,17 @@ function validateNativeApp(manifest, platform) {
|
|
|
36
37
|
if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {
|
|
37
38
|
fail(`userInterfaceStyle "${manifest.userInterfaceStyle}" must be ${USER_INTERFACE_STYLES.join(", ")}`);
|
|
38
39
|
}
|
|
40
|
+
if (manifest.fonts !== void 0) {
|
|
41
|
+
const names = /* @__PURE__ */ new Set();
|
|
42
|
+
for (const font of manifest.fonts) {
|
|
43
|
+
if (typeof font !== "string" || !FONT_FILE.test(font)) {
|
|
44
|
+
fail(`fonts entry "${font}" must be a .ttf or .otf file path`);
|
|
45
|
+
}
|
|
46
|
+
const name = font.split("/").pop() ?? font;
|
|
47
|
+
if (names.has(name)) fail(`fonts lists ${name} twice`);
|
|
48
|
+
names.add(name);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
39
51
|
if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {
|
|
40
52
|
fail(`version "${manifest.version}" must start with major.minor.patch`);
|
|
41
53
|
}
|
|
@@ -45,6 +57,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
45
57
|
if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {
|
|
46
58
|
fail("splash requires source, a six-digit hex backgroundColor, and width from 1 to 288");
|
|
47
59
|
}
|
|
60
|
+
if (manifest.splash?.dark !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {
|
|
61
|
+
fail("splash.dark requires a six-digit hex backgroundColor");
|
|
62
|
+
}
|
|
48
63
|
if (manifest.splash?.resizeMode !== void 0 && manifest.splash.resizeMode !== "contain" && manifest.splash.resizeMode !== "cover") {
|
|
49
64
|
fail(`splash.resizeMode "${manifest.splash.resizeMode}" must be contain or cover`);
|
|
50
65
|
}
|
|
@@ -146,6 +161,23 @@ function validateNativeApp(manifest, platform) {
|
|
|
146
161
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
147
162
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
148
163
|
}
|
|
164
|
+
for (const key of ["targetSdk", "compileSdk"]) {
|
|
165
|
+
const value = manifest.android[key];
|
|
166
|
+
if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {
|
|
167
|
+
fail(`android.${key} "${value}" must be an api level integer`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (manifest.android.shrinkResources && !manifest.android.minify) {
|
|
171
|
+
fail("android.shrinkResources needs android.minify");
|
|
172
|
+
}
|
|
173
|
+
for (const link of manifest.android.appLinks ?? []) {
|
|
174
|
+
if (!link.host || !REVERSE_DNS.test(link.host)) {
|
|
175
|
+
fail(`android.appLinks host "${link.host}" must be a domain`);
|
|
176
|
+
}
|
|
177
|
+
if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith("/")) {
|
|
178
|
+
fail(`android.appLinks pathPrefix "${link.pathPrefix}" must start with /`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
149
181
|
const adaptiveIcon = manifest.android.adaptiveIcon;
|
|
150
182
|
if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {
|
|
151
183
|
fail("android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex");
|
|
@@ -169,16 +201,29 @@ function expoClientFromNativeApp(app) {
|
|
|
169
201
|
image: app.splash.source,
|
|
170
202
|
backgroundColor: app.splash.backgroundColor,
|
|
171
203
|
imageWidth: app.splash.width,
|
|
172
|
-
resizeMode: app.splash.resizeMode
|
|
204
|
+
resizeMode: app.splash.resizeMode,
|
|
205
|
+
dark: app.splash.dark && {
|
|
206
|
+
image: app.splash.dark.source,
|
|
207
|
+
backgroundColor: app.splash.dark.backgroundColor
|
|
208
|
+
}
|
|
173
209
|
},
|
|
210
|
+
plugins: app.fonts?.length ? [["expo-font", { fonts: app.fonts }]] : void 0,
|
|
174
211
|
ios: app.ios && {
|
|
175
212
|
bundleIdentifier: app.ios.bundleId,
|
|
176
213
|
buildNumber: app.ios.buildNumber,
|
|
177
|
-
supportsTablet: app.ios.tablet
|
|
214
|
+
supportsTablet: app.ios.tablet,
|
|
215
|
+
associatedDomains: app.ios.associatedDomains,
|
|
216
|
+
usesAppleSignIn: app.ios.usesAppleSignIn,
|
|
217
|
+
googleServicesFile: app.ios.googleServicesFile,
|
|
218
|
+
infoPlist: app.ios.infoPlist,
|
|
219
|
+
entitlements: app.ios.entitlements
|
|
178
220
|
},
|
|
179
221
|
android: app.android && {
|
|
180
222
|
package: app.android.applicationId,
|
|
181
223
|
versionCode: app.android.versionCode,
|
|
224
|
+
permissions: app.android.permissions,
|
|
225
|
+
blockedPermissions: app.android.blockedPermissions,
|
|
226
|
+
googleServicesFile: app.android.googleServicesFile,
|
|
182
227
|
adaptiveIcon: app.android.adaptiveIcon && {
|
|
183
228
|
foregroundImage: app.android.adaptiveIcon.foreground,
|
|
184
229
|
backgroundImage: app.android.adaptiveIcon.background,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeAppManifest.js","names":[],"sources":["esm/nativeAppManifest.js"],"sourcesContent":["const TARGET_NAME = /^[A-Za-z][A-Za-z0-9_]*$/;\nconst SCHEME = /^[a-z][a-z0-9+.-]*$/i;\nconst VERSION = /^\\d+\\.\\d+\\.\\d+/;\nconst BUILD_NUMBER = /^[A-Za-z0-9.]+$/;\nconst REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/;\nconst DEPLOYMENT_TARGET = /^\\d+\\.\\d+$/;\nconst HEX_COLOR = /^#[\\da-f]{6}$/i;\nconst ORIENTATIONS = [\"portrait\", \"landscape\", \"default\"];\nconst USER_INTERFACE_STYLES = [\"light\", \"dark\", \"automatic\"];\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n if (!manifest || typeof manifest !== \"object\") fail(\"manifest must be an object\");\n if (!manifest.name || typeof manifest.name !== \"string\") fail(\"name is required\");\n if (!TARGET_NAME.test(manifest.name)) {\n fail(\n `name \"${manifest.name}\" must start with a letter and contain only letters, digits, and underscore`\n );\n }\n const schemes = manifest.scheme === void 0 ? [] : Array.isArray(manifest.scheme) ? manifest.scheme : [manifest.scheme];\n for (const scheme of schemes) {\n if (typeof scheme !== \"string\" || !SCHEME.test(scheme)) {\n fail(`scheme \"${scheme}\" must be a valid uri scheme`);\n }\n }\n if (manifest.orientation !== void 0 && !ORIENTATIONS.includes(manifest.orientation)) {\n fail(`orientation \"${manifest.orientation}\" must be ${ORIENTATIONS.join(\", \")}`);\n }\n if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {\n fail(\n `userInterfaceStyle \"${manifest.userInterfaceStyle}\" must be ${USER_INTERFACE_STYLES.join(\", \")}`\n );\n }\n if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {\n fail(`version \"${manifest.version}\" must start with major.minor.patch`);\n }\n if (manifest.icon !== void 0 && (!manifest.icon.source || !HEX_COLOR.test(manifest.icon.backgroundColor))) {\n fail(\"icon requires source and a six-digit hex backgroundColor\");\n }\n if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {\n fail(\n \"splash requires source, a six-digit hex backgroundColor, and width from 1 to 288\"\n );\n }\n if (manifest.splash?.resizeMode !== void 0 && manifest.splash.resizeMode !== \"contain\" && manifest.splash.resizeMode !== \"cover\") {\n fail(`splash.resizeMode \"${manifest.splash.resizeMode}\" must be contain or cover`);\n }\n if (manifest.imagePicker?.camera !== void 0 && (typeof manifest.imagePicker.camera !== \"string\" || manifest.imagePicker.camera.trim() === \"\")) {\n fail(\"imagePicker.camera must be a non-empty string\");\n }\n if (manifest.photoLibrary !== void 0 && (!manifest.photoLibrary || typeof manifest.photoLibrary.addOnly !== \"string\" || manifest.photoLibrary.addOnly.trim() === \"\")) {\n fail(\"photoLibrary.addOnly must be a non-empty string\");\n }\n if (manifest.contacts !== void 0 && (!manifest.contacts || typeof manifest.contacts.usage !== \"string\" || manifest.contacts.usage.trim() === \"\")) {\n fail(\"contacts.usage must be a non-empty string\");\n }\n if (manifest.calendar !== void 0) {\n if (!manifest.calendar || manifest.calendar.usage === void 0 && manifest.calendar.remindersUsage === void 0) {\n fail(\"calendar.usage or calendar.remindersUsage must be a non-empty string\");\n }\n if (manifest.calendar.usage !== void 0 && (typeof manifest.calendar.usage !== \"string\" || manifest.calendar.usage.trim() === \"\")) {\n fail(\"calendar.usage must be a non-empty string\");\n }\n if (manifest.calendar.remindersUsage !== void 0 && (typeof manifest.calendar.remindersUsage !== \"string\" || manifest.calendar.remindersUsage.trim() === \"\")) {\n fail(\"calendar.remindersUsage must be a non-empty string\");\n }\n }\n if (manifest.location !== void 0 && (!manifest.location || typeof manifest.location.whenInUse !== \"string\" || manifest.location.whenInUse.trim() === \"\")) {\n fail(\"location.whenInUse must be a non-empty string\");\n }\n if (manifest.audio !== void 0) {\n if (!manifest.audio || typeof manifest.audio !== \"object\") {\n fail(\"audio must configure microphone or background playback\");\n }\n if (manifest.audio.microphone !== void 0 && (typeof manifest.audio.microphone !== \"string\" || manifest.audio.microphone.trim() === \"\")) {\n fail(\"audio.microphone must be a non-empty string\");\n }\n if (manifest.audio.background !== void 0 && typeof manifest.audio.background !== \"boolean\") {\n fail(\"audio.background must be a boolean\");\n }\n if (manifest.audio.microphone === void 0 && manifest.audio.background !== true) {\n fail(\"audio must configure microphone or background playback\");\n }\n }\n if (manifest.ios?.faceIdUsageDescription !== void 0 && (typeof manifest.ios.faceIdUsageDescription !== \"string\" || manifest.ios.faceIdUsageDescription.trim() === \"\")) {\n fail(\"ios.faceIdUsageDescription must be a non-empty string\");\n }\n if (manifest.speech !== void 0 && (typeof manifest.speech?.recognition !== \"string\" || manifest.speech.recognition.trim() === \"\" || typeof manifest.speech.microphone !== \"string\" || manifest.speech.microphone.trim() === \"\")) {\n fail(\"speech.recognition and speech.microphone must be non-empty strings\");\n }\n if (manifest.notifications !== void 0) {\n if (typeof manifest.notifications !== \"object\" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== \"boolean\") {\n fail(\"notifications.push must be a boolean\");\n }\n }\n if (manifest.pictureInPicture !== void 0 && typeof manifest.pictureInPicture !== \"boolean\") {\n fail(\"pictureInPicture must be a boolean\");\n }\n if (manifest.updates !== void 0) {\n if (typeof manifest.updates.runtimeVersion !== \"string\" || manifest.updates.runtimeVersion.trim() === \"\") {\n fail(\"updates.runtimeVersion must be a non-empty string\");\n }\n if (manifest.updates.url !== void 0 && (typeof manifest.updates.url !== \"string\" || manifest.updates.url.trim() === \"\")) {\n fail(\"updates.url must be a non-empty string\");\n }\n }\n if (!platform || platform === \"ios\") {\n if (!manifest.ios?.bundleId || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n fail(`ios.bundleId \"${manifest.ios?.bundleId}\" must be reverse-dns`);\n }\n if (manifest.ios.deploymentTarget !== void 0 && !DEPLOYMENT_TARGET.test(manifest.ios.deploymentTarget)) {\n fail(\n `ios.deploymentTarget \"${manifest.ios.deploymentTarget}\" must look like \"17.0\"`\n );\n }\n if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {\n fail(\n `ios.buildNumber \"${manifest.ios.buildNumber}\" must contain only letters, digits, and dots`\n );\n }\n const widgets = manifest.ios.widgets;\n if (widgets) {\n if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {\n fail(\"ios.widgets requires ios.deploymentTarget of 17.0 or newer\");\n }\n if (!/^group\\.[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {\n fail(\"ios.widgets.appGroup must be a reverse-dns App Group beginning with group.\");\n }\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {\n fail(\"ios.widgets.kind must be a non-empty WidgetKit kind\");\n }\n if (!widgets.displayName?.trim() || !widgets.description?.trim()) {\n fail(\"ios.widgets.displayName and description must be non-empty strings\");\n }\n if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== \"boolean\") {\n fail(\"ios.widgets.pushNotifications must be a boolean\");\n }\n }\n }\n if (!platform || platform === \"android\") {\n if (!manifest.android?.applicationId || !REVERSE_DNS.test(manifest.android.applicationId)) {\n fail(\n `android.applicationId \"${manifest.android?.applicationId}\" must be reverse-dns`\n );\n }\n if (manifest.android.minSdk !== void 0 && (!Number.isInteger(manifest.android.minSdk) || manifest.android.minSdk < 21 || manifest.android.minSdk > 36)) {\n fail(`android.minSdk \"${manifest.android.minSdk}\" must be an integer from 21 to 36`);\n }\n if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {\n fail(\n `android.versionCode \"${manifest.android.versionCode}\" must be a positive integer`\n );\n }\n const adaptiveIcon = manifest.android.adaptiveIcon;\n if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {\n fail(\n \"android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex\"\n );\n }\n if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== \"string\" || manifest.android.googleMapsApiKey.trim() === \"\")) {\n fail(\"android.googleMapsApiKey must be a non-empty string\");\n }\n }\n return manifest;\n}\nfunction expoClientFromNativeApp(app) {\n return {\n name: app.displayName ?? app.name,\n slug: app.name,\n scheme: app.scheme,\n version: app.version,\n orientation: app.orientation,\n userInterfaceStyle: app.userInterfaceStyle,\n icon: app.icon?.source,\n splash: app.splash && {\n image: app.splash.source,\n backgroundColor: app.splash.backgroundColor,\n imageWidth: app.splash.width,\n resizeMode: app.splash.resizeMode\n },\n ios: app.ios && {\n bundleIdentifier: app.ios.bundleId,\n buildNumber: app.ios.buildNumber,\n supportsTablet: app.ios.tablet\n },\n android: app.android && {\n package: app.android.applicationId,\n versionCode: app.android.versionCode,\n adaptiveIcon: app.android.adaptiveIcon && {\n foregroundImage: app.android.adaptiveIcon.foreground,\n backgroundImage: app.android.adaptiveIcon.background,\n backgroundColor: app.android.adaptiveIcon.backgroundColor,\n monochromeImage: app.android.adaptiveIcon.monochrome\n }\n }\n };\n}\nexport {\n expoClientFromNativeApp,\n validateNativeApp\n};\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":";AAAA,MAAM,cAAc;AACpB,MAAM,SAAS;AACf,MAAM,UAAU;AAChB,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,oBAAoB;AAC1B,MAAM,YAAY;AAClB,MAAM,eAAe;CAAC;CAAY;CAAa;AAAS;AACxD,MAAM,wBAAwB;CAAC;CAAS;CAAQ;AAAW;AAC3D,SAAS,KAAK,SAAS;CACrB,MAAM,IAAI,MAAM,6BAA6B,SAAS;AACxD;AACA,SAAS,kBAAkB,UAAU,UAAU;CAC7C,IAAI,CAAC,YAAY,OAAO,aAAa,UAAU,KAAK,4BAA4B;CAChF,IAAI,CAAC,SAAS,QAAQ,OAAO,SAAS,SAAS,UAAU,KAAK,kBAAkB;CAChF,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG;EACpC,KACE,SAAS,SAAS,KAAK,4EACzB;CACF;CACA,MAAM,UAAU,SAAS,WAAW,KAAK,IAAI,CAAC,IAAI,MAAM,QAAQ,SAAS,MAAM,IAAI,SAAS,SAAS,CAAC,SAAS,MAAM;CACrH,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,WAAW,YAAY,CAAC,OAAO,KAAK,MAAM,GAAG;GACtD,KAAK,WAAW,OAAO,6BAA6B;EACtD;CACF;CACA,IAAI,SAAS,gBAAgB,KAAK,KAAK,CAAC,aAAa,SAAS,SAAS,WAAW,GAAG;EACnF,KAAK,gBAAgB,SAAS,YAAY,YAAY,aAAa,KAAK,IAAI,GAAG;CACjF;CACA,IAAI,SAAS,uBAAuB,KAAK,KAAK,CAAC,sBAAsB,SAAS,SAAS,kBAAkB,GAAG;EAC1G,KACE,uBAAuB,SAAS,mBAAmB,YAAY,sBAAsB,KAAK,IAAI,GAChG;CACF;CACA,IAAI,SAAS,YAAY,KAAK,KAAK,CAAC,QAAQ,KAAK,SAAS,OAAO,GAAG;EAClE,KAAK,YAAY,SAAS,QAAQ,oCAAoC;CACxE;CACA,IAAI,SAAS,SAAS,KAAK,MAAM,CAAC,SAAS,KAAK,UAAU,CAAC,UAAU,KAAK,SAAS,KAAK,eAAe,IAAI;EACzG,KAAK,0DAA0D;CACjE;CACA,IAAI,SAAS,WAAW,KAAK,MAAM,CAAC,SAAS,OAAO,UAAU,CAAC,UAAU,KAAK,SAAS,OAAO,eAAe,KAAK,SAAS,OAAO,UAAU,KAAK,MAAM,CAAC,OAAO,SAAS,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,QAAQ,KAAK,SAAS,OAAO,QAAQ,OAAO;EAC5P,KACE,kFACF;CACF;CACA,IAAI,SAAS,QAAQ,eAAe,KAAK,KAAK,SAAS,OAAO,eAAe,aAAa,SAAS,OAAO,eAAe,SAAS;EAChI,KAAK,sBAAsB,SAAS,OAAO,WAAW,2BAA2B;CACnF;CACA,IAAI,SAAS,aAAa,WAAW,KAAK,MAAM,OAAO,SAAS,YAAY,WAAW,YAAY,SAAS,YAAY,OAAO,KAAK,MAAM,KAAK;EAC7I,KAAK,+CAA+C;CACtD;CACA,IAAI,SAAS,iBAAiB,KAAK,MAAM,CAAC,SAAS,gBAAgB,OAAO,SAAS,aAAa,YAAY,YAAY,SAAS,aAAa,QAAQ,KAAK,MAAM,KAAK;EACpK,KAAK,iDAAiD;CACxD;CACA,IAAI,SAAS,aAAa,KAAK,MAAM,CAAC,SAAS,YAAY,OAAO,SAAS,SAAS,UAAU,YAAY,SAAS,SAAS,MAAM,KAAK,MAAM,KAAK;EAChJ,KAAK,2CAA2C;CAClD;CACA,IAAI,SAAS,aAAa,KAAK,GAAG;EAChC,IAAI,CAAC,SAAS,YAAY,SAAS,SAAS,UAAU,KAAK,KAAK,SAAS,SAAS,mBAAmB,KAAK,GAAG;GAC3G,KAAK,sEAAsE;EAC7E;EACA,IAAI,SAAS,SAAS,UAAU,KAAK,MAAM,OAAO,SAAS,SAAS,UAAU,YAAY,SAAS,SAAS,MAAM,KAAK,MAAM,KAAK;GAChI,KAAK,2CAA2C;EAClD;EACA,IAAI,SAAS,SAAS,mBAAmB,KAAK,MAAM,OAAO,SAAS,SAAS,mBAAmB,YAAY,SAAS,SAAS,eAAe,KAAK,MAAM,KAAK;GAC3J,KAAK,oDAAoD;EAC3D;CACF;CACA,IAAI,SAAS,aAAa,KAAK,MAAM,CAAC,SAAS,YAAY,OAAO,SAAS,SAAS,cAAc,YAAY,SAAS,SAAS,UAAU,KAAK,MAAM,KAAK;EACxJ,KAAK,+CAA+C;CACtD;CACA,IAAI,SAAS,UAAU,KAAK,GAAG;EAC7B,IAAI,CAAC,SAAS,SAAS,OAAO,SAAS,UAAU,UAAU;GACzD,KAAK,wDAAwD;EAC/D;EACA,IAAI,SAAS,MAAM,eAAe,KAAK,MAAM,OAAO,SAAS,MAAM,eAAe,YAAY,SAAS,MAAM,WAAW,KAAK,MAAM,KAAK;GACtI,KAAK,6CAA6C;EACpD;EACA,IAAI,SAAS,MAAM,eAAe,KAAK,KAAK,OAAO,SAAS,MAAM,eAAe,WAAW;GAC1F,KAAK,oCAAoC;EAC3C;EACA,IAAI,SAAS,MAAM,eAAe,KAAK,KAAK,SAAS,MAAM,eAAe,MAAM;GAC9E,KAAK,wDAAwD;EAC/D;CACF;CACA,IAAI,SAAS,KAAK,2BAA2B,KAAK,MAAM,OAAO,SAAS,IAAI,2BAA2B,YAAY,SAAS,IAAI,uBAAuB,KAAK,MAAM,KAAK;EACrK,KAAK,uDAAuD;CAC9D;CACA,IAAI,SAAS,WAAW,KAAK,MAAM,OAAO,SAAS,QAAQ,gBAAgB,YAAY,SAAS,OAAO,YAAY,KAAK,MAAM,MAAM,OAAO,SAAS,OAAO,eAAe,YAAY,SAAS,OAAO,WAAW,KAAK,MAAM,KAAK;EAC/N,KAAK,oEAAoE;CAC3E;CACA,IAAI,SAAS,kBAAkB,KAAK,GAAG;EACrC,IAAI,OAAO,SAAS,kBAAkB,YAAY,SAAS,cAAc,SAAS,KAAK,KAAK,OAAO,SAAS,cAAc,SAAS,WAAW;GAC5I,KAAK,sCAAsC;EAC7C;CACF;CACA,IAAI,SAAS,qBAAqB,KAAK,KAAK,OAAO,SAAS,qBAAqB,WAAW;EAC1F,KAAK,oCAAoC;CAC3C;CACA,IAAI,SAAS,YAAY,KAAK,GAAG;EAC/B,IAAI,OAAO,SAAS,QAAQ,mBAAmB,YAAY,SAAS,QAAQ,eAAe,KAAK,MAAM,IAAI;GACxG,KAAK,mDAAmD;EAC1D;EACA,IAAI,SAAS,QAAQ,QAAQ,KAAK,MAAM,OAAO,SAAS,QAAQ,QAAQ,YAAY,SAAS,QAAQ,IAAI,KAAK,MAAM,KAAK;GACvH,KAAK,wCAAwC;EAC/C;CACF;CACA,IAAI,CAAC,YAAY,aAAa,OAAO;EACnC,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,GAAG;GACvE,KAAK,iBAAiB,SAAS,KAAK,SAAS,sBAAsB;EACrE;EACA,IAAI,SAAS,IAAI,qBAAqB,KAAK,KAAK,CAAC,kBAAkB,KAAK,SAAS,IAAI,gBAAgB,GAAG;GACtG,KACE,yBAAyB,SAAS,IAAI,iBAAiB,wBACzD;EACF;EACA,IAAI,SAAS,IAAI,gBAAgB,KAAK,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,WAAW,GAAG;GACvF,KACE,oBAAoB,SAAS,IAAI,YAAY,8CAC/C;EACF;EACA,MAAM,UAAU,SAAS,IAAI;EAC7B,IAAI,SAAS;GACX,IAAI,CAAC,SAAS,IAAI,oBAAoB,OAAO,SAAS,IAAI,gBAAgB,IAAI,IAAI;IAChF,KAAK,4DAA4D;GACnE;GACA,IAAI,CAAC,2DAA2D,KAAK,QAAQ,QAAQ,GAAG;IACtF,KAAK,4EAA4E;GACnF;GACA,IAAI,CAAC,4BAA4B,KAAK,QAAQ,IAAI,GAAG;IACnD,KAAK,qDAAqD;GAC5D;GACA,IAAI,CAAC,QAAQ,aAAa,KAAK,KAAK,CAAC,QAAQ,aAAa,KAAK,GAAG;IAChE,KAAK,mEAAmE;GAC1E;GACA,IAAI,QAAQ,sBAAsB,KAAK,KAAK,OAAO,QAAQ,sBAAsB,WAAW;IAC1F,KAAK,iDAAiD;GACxD;EACF;CACF;CACA,IAAI,CAAC,YAAY,aAAa,WAAW;EACvC,IAAI,CAAC,SAAS,SAAS,iBAAiB,CAAC,YAAY,KAAK,SAAS,QAAQ,aAAa,GAAG;GACzF,KACE,0BAA0B,SAAS,SAAS,cAAc,sBAC5D;EACF;EACA,IAAI,SAAS,QAAQ,WAAW,KAAK,MAAM,CAAC,OAAO,UAAU,SAAS,QAAQ,MAAM,KAAK,SAAS,QAAQ,SAAS,MAAM,SAAS,QAAQ,SAAS,KAAK;GACtJ,KAAK,mBAAmB,SAAS,QAAQ,OAAO,mCAAmC;EACrF;EACA,IAAI,SAAS,QAAQ,gBAAgB,KAAK,MAAM,CAAC,OAAO,UAAU,SAAS,QAAQ,WAAW,KAAK,SAAS,QAAQ,cAAc,IAAI;GACpI,KACE,wBAAwB,SAAS,QAAQ,YAAY,6BACvD;EACF;EACA,MAAM,eAAe,SAAS,QAAQ;EACtC,IAAI,iBAAiB,KAAK,MAAM,CAAC,aAAa,cAAc,aAAa,oBAAoB,KAAK,KAAK,CAAC,UAAU,KAAK,aAAa,eAAe,IAAI;GACrJ,KACE,qFACF;EACF;EACA,IAAI,SAAS,QAAQ,qBAAqB,KAAK,MAAM,OAAO,SAAS,QAAQ,qBAAqB,YAAY,SAAS,QAAQ,iBAAiB,KAAK,MAAM,KAAK;GAC9J,KAAK,qDAAqD;EAC5D;CACF;CACA,OAAO;AACT;AACA,SAAS,wBAAwB,KAAK;CACpC,OAAO;EACL,MAAM,IAAI,eAAe,IAAI;EAC7B,MAAM,IAAI;EACV,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,oBAAoB,IAAI;EACxB,MAAM,IAAI,MAAM;EAChB,QAAQ,IAAI,UAAU;GACpB,OAAO,IAAI,OAAO;GAClB,iBAAiB,IAAI,OAAO;GAC5B,YAAY,IAAI,OAAO;GACvB,YAAY,IAAI,OAAO;EACzB;EACA,KAAK,IAAI,OAAO;GACd,kBAAkB,IAAI,IAAI;GAC1B,aAAa,IAAI,IAAI;GACrB,gBAAgB,IAAI,IAAI;EAC1B;EACA,SAAS,IAAI,WAAW;GACtB,SAAS,IAAI,QAAQ;GACrB,aAAa,IAAI,QAAQ;GACzB,cAAc,IAAI,QAAQ,gBAAgB;IACxC,iBAAiB,IAAI,QAAQ,aAAa;IAC1C,iBAAiB,IAAI,QAAQ,aAAa;IAC1C,iBAAiB,IAAI,QAAQ,aAAa;IAC1C,iBAAiB,IAAI,QAAQ,aAAa;GAC5C;EACF;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"nativeAppManifest.js","names":[],"sources":["esm/nativeAppManifest.js"],"sourcesContent":["const TARGET_NAME = /^[A-Za-z][A-Za-z0-9_]*$/;\nconst SCHEME = /^[a-z][a-z0-9+.-]*$/i;\nconst VERSION = /^\\d+\\.\\d+\\.\\d+/;\nconst BUILD_NUMBER = /^[A-Za-z0-9.]+$/;\nconst REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/;\nconst DEPLOYMENT_TARGET = /^\\d+\\.\\d+$/;\nconst HEX_COLOR = /^#[\\da-f]{6}$/i;\nconst FONT_FILE = /\\.(ttf|otf)$/i;\nconst ORIENTATIONS = [\"portrait\", \"landscape\", \"default\"];\nconst USER_INTERFACE_STYLES = [\"light\", \"dark\", \"automatic\"];\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n if (!manifest || typeof manifest !== \"object\") fail(\"manifest must be an object\");\n if (!manifest.name || typeof manifest.name !== \"string\") fail(\"name is required\");\n if (!TARGET_NAME.test(manifest.name)) {\n fail(\n `name \"${manifest.name}\" must start with a letter and contain only letters, digits, and underscore`\n );\n }\n const schemes = manifest.scheme === void 0 ? [] : Array.isArray(manifest.scheme) ? manifest.scheme : [manifest.scheme];\n for (const scheme of schemes) {\n if (typeof scheme !== \"string\" || !SCHEME.test(scheme)) {\n fail(`scheme \"${scheme}\" must be a valid uri scheme`);\n }\n }\n if (manifest.orientation !== void 0 && !ORIENTATIONS.includes(manifest.orientation)) {\n fail(`orientation \"${manifest.orientation}\" must be ${ORIENTATIONS.join(\", \")}`);\n }\n if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {\n fail(\n `userInterfaceStyle \"${manifest.userInterfaceStyle}\" must be ${USER_INTERFACE_STYLES.join(\", \")}`\n );\n }\n if (manifest.fonts !== void 0) {\n const names = /* @__PURE__ */ new Set();\n for (const font of manifest.fonts) {\n if (typeof font !== \"string\" || !FONT_FILE.test(font)) {\n fail(`fonts entry \"${font}\" must be a .ttf or .otf file path`);\n }\n const name = font.split(\"/\").pop() ?? font;\n if (names.has(name)) fail(`fonts lists ${name} twice`);\n names.add(name);\n }\n }\n if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {\n fail(`version \"${manifest.version}\" must start with major.minor.patch`);\n }\n if (manifest.icon !== void 0 && (!manifest.icon.source || !HEX_COLOR.test(manifest.icon.backgroundColor))) {\n fail(\"icon requires source and a six-digit hex backgroundColor\");\n }\n if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {\n fail(\n \"splash requires source, a six-digit hex backgroundColor, and width from 1 to 288\"\n );\n }\n if (manifest.splash?.dark !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {\n fail(\"splash.dark requires a six-digit hex backgroundColor\");\n }\n if (manifest.splash?.resizeMode !== void 0 && manifest.splash.resizeMode !== \"contain\" && manifest.splash.resizeMode !== \"cover\") {\n fail(`splash.resizeMode \"${manifest.splash.resizeMode}\" must be contain or cover`);\n }\n if (manifest.imagePicker?.camera !== void 0 && (typeof manifest.imagePicker.camera !== \"string\" || manifest.imagePicker.camera.trim() === \"\")) {\n fail(\"imagePicker.camera must be a non-empty string\");\n }\n if (manifest.photoLibrary !== void 0 && (!manifest.photoLibrary || typeof manifest.photoLibrary.addOnly !== \"string\" || manifest.photoLibrary.addOnly.trim() === \"\")) {\n fail(\"photoLibrary.addOnly must be a non-empty string\");\n }\n if (manifest.contacts !== void 0 && (!manifest.contacts || typeof manifest.contacts.usage !== \"string\" || manifest.contacts.usage.trim() === \"\")) {\n fail(\"contacts.usage must be a non-empty string\");\n }\n if (manifest.calendar !== void 0) {\n if (!manifest.calendar || manifest.calendar.usage === void 0 && manifest.calendar.remindersUsage === void 0) {\n fail(\"calendar.usage or calendar.remindersUsage must be a non-empty string\");\n }\n if (manifest.calendar.usage !== void 0 && (typeof manifest.calendar.usage !== \"string\" || manifest.calendar.usage.trim() === \"\")) {\n fail(\"calendar.usage must be a non-empty string\");\n }\n if (manifest.calendar.remindersUsage !== void 0 && (typeof manifest.calendar.remindersUsage !== \"string\" || manifest.calendar.remindersUsage.trim() === \"\")) {\n fail(\"calendar.remindersUsage must be a non-empty string\");\n }\n }\n if (manifest.location !== void 0 && (!manifest.location || typeof manifest.location.whenInUse !== \"string\" || manifest.location.whenInUse.trim() === \"\")) {\n fail(\"location.whenInUse must be a non-empty string\");\n }\n if (manifest.audio !== void 0) {\n if (!manifest.audio || typeof manifest.audio !== \"object\") {\n fail(\"audio must configure microphone or background playback\");\n }\n if (manifest.audio.microphone !== void 0 && (typeof manifest.audio.microphone !== \"string\" || manifest.audio.microphone.trim() === \"\")) {\n fail(\"audio.microphone must be a non-empty string\");\n }\n if (manifest.audio.background !== void 0 && typeof manifest.audio.background !== \"boolean\") {\n fail(\"audio.background must be a boolean\");\n }\n if (manifest.audio.microphone === void 0 && manifest.audio.background !== true) {\n fail(\"audio must configure microphone or background playback\");\n }\n }\n if (manifest.ios?.faceIdUsageDescription !== void 0 && (typeof manifest.ios.faceIdUsageDescription !== \"string\" || manifest.ios.faceIdUsageDescription.trim() === \"\")) {\n fail(\"ios.faceIdUsageDescription must be a non-empty string\");\n }\n if (manifest.speech !== void 0 && (typeof manifest.speech?.recognition !== \"string\" || manifest.speech.recognition.trim() === \"\" || typeof manifest.speech.microphone !== \"string\" || manifest.speech.microphone.trim() === \"\")) {\n fail(\"speech.recognition and speech.microphone must be non-empty strings\");\n }\n if (manifest.notifications !== void 0) {\n if (typeof manifest.notifications !== \"object\" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== \"boolean\") {\n fail(\"notifications.push must be a boolean\");\n }\n }\n if (manifest.pictureInPicture !== void 0 && typeof manifest.pictureInPicture !== \"boolean\") {\n fail(\"pictureInPicture must be a boolean\");\n }\n if (manifest.updates !== void 0) {\n if (typeof manifest.updates.runtimeVersion !== \"string\" || manifest.updates.runtimeVersion.trim() === \"\") {\n fail(\"updates.runtimeVersion must be a non-empty string\");\n }\n if (manifest.updates.url !== void 0 && (typeof manifest.updates.url !== \"string\" || manifest.updates.url.trim() === \"\")) {\n fail(\"updates.url must be a non-empty string\");\n }\n }\n if (!platform || platform === \"ios\") {\n if (!manifest.ios?.bundleId || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n fail(`ios.bundleId \"${manifest.ios?.bundleId}\" must be reverse-dns`);\n }\n if (manifest.ios.deploymentTarget !== void 0 && !DEPLOYMENT_TARGET.test(manifest.ios.deploymentTarget)) {\n fail(\n `ios.deploymentTarget \"${manifest.ios.deploymentTarget}\" must look like \"17.0\"`\n );\n }\n if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {\n fail(\n `ios.buildNumber \"${manifest.ios.buildNumber}\" must contain only letters, digits, and dots`\n );\n }\n const widgets = manifest.ios.widgets;\n if (widgets) {\n if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {\n fail(\"ios.widgets requires ios.deploymentTarget of 17.0 or newer\");\n }\n if (!/^group\\.[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {\n fail(\"ios.widgets.appGroup must be a reverse-dns App Group beginning with group.\");\n }\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {\n fail(\"ios.widgets.kind must be a non-empty WidgetKit kind\");\n }\n if (!widgets.displayName?.trim() || !widgets.description?.trim()) {\n fail(\"ios.widgets.displayName and description must be non-empty strings\");\n }\n if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== \"boolean\") {\n fail(\"ios.widgets.pushNotifications must be a boolean\");\n }\n }\n }\n if (!platform || platform === \"android\") {\n if (!manifest.android?.applicationId || !REVERSE_DNS.test(manifest.android.applicationId)) {\n fail(\n `android.applicationId \"${manifest.android?.applicationId}\" must be reverse-dns`\n );\n }\n if (manifest.android.minSdk !== void 0 && (!Number.isInteger(manifest.android.minSdk) || manifest.android.minSdk < 21 || manifest.android.minSdk > 36)) {\n fail(`android.minSdk \"${manifest.android.minSdk}\" must be an integer from 21 to 36`);\n }\n if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {\n fail(\n `android.versionCode \"${manifest.android.versionCode}\" must be a positive integer`\n );\n }\n for (const key of [\"targetSdk\", \"compileSdk\"]) {\n const value = manifest.android[key];\n if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {\n fail(`android.${key} \"${value}\" must be an api level integer`);\n }\n }\n if (manifest.android.shrinkResources && !manifest.android.minify) {\n fail(\"android.shrinkResources needs android.minify\");\n }\n for (const link of manifest.android.appLinks ?? []) {\n if (!link.host || !REVERSE_DNS.test(link.host)) {\n fail(`android.appLinks host \"${link.host}\" must be a domain`);\n }\n if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith(\"/\")) {\n fail(`android.appLinks pathPrefix \"${link.pathPrefix}\" must start with /`);\n }\n }\n const adaptiveIcon = manifest.android.adaptiveIcon;\n if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {\n fail(\n \"android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex\"\n );\n }\n if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== \"string\" || manifest.android.googleMapsApiKey.trim() === \"\")) {\n fail(\"android.googleMapsApiKey must be a non-empty string\");\n }\n }\n return manifest;\n}\nfunction expoClientFromNativeApp(app) {\n return {\n name: app.displayName ?? app.name,\n slug: app.name,\n scheme: app.scheme,\n version: app.version,\n orientation: app.orientation,\n userInterfaceStyle: app.userInterfaceStyle,\n icon: app.icon?.source,\n splash: app.splash && {\n image: app.splash.source,\n backgroundColor: app.splash.backgroundColor,\n imageWidth: app.splash.width,\n resizeMode: app.splash.resizeMode,\n dark: app.splash.dark && {\n image: app.splash.dark.source,\n backgroundColor: app.splash.dark.backgroundColor\n }\n },\n plugins: app.fonts?.length ? [[\"expo-font\", { fonts: app.fonts }]] : void 0,\n ios: app.ios && {\n bundleIdentifier: app.ios.bundleId,\n buildNumber: app.ios.buildNumber,\n supportsTablet: app.ios.tablet,\n associatedDomains: app.ios.associatedDomains,\n usesAppleSignIn: app.ios.usesAppleSignIn,\n googleServicesFile: app.ios.googleServicesFile,\n infoPlist: app.ios.infoPlist,\n entitlements: app.ios.entitlements\n },\n android: app.android && {\n package: app.android.applicationId,\n versionCode: app.android.versionCode,\n permissions: app.android.permissions,\n blockedPermissions: app.android.blockedPermissions,\n googleServicesFile: app.android.googleServicesFile,\n adaptiveIcon: app.android.adaptiveIcon && {\n foregroundImage: app.android.adaptiveIcon.foreground,\n backgroundImage: app.android.adaptiveIcon.background,\n backgroundColor: app.android.adaptiveIcon.backgroundColor,\n monochromeImage: app.android.adaptiveIcon.monochrome\n }\n }\n };\n}\nexport {\n expoClientFromNativeApp,\n validateNativeApp\n};\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ var BUILD_NUMBER = /^[A-Za-z0-9.]+$/;
|
|
|
5
5
|
var REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/;
|
|
6
6
|
var DEPLOYMENT_TARGET = /^\d+\.\d+$/;
|
|
7
7
|
var HEX_COLOR = /^#[\da-f]{6}$/i;
|
|
8
|
+
var FONT_FILE = /\.(ttf|otf)$/i;
|
|
8
9
|
var ORIENTATIONS = [
|
|
9
10
|
"portrait",
|
|
10
11
|
"landscape",
|
|
@@ -19,7 +20,7 @@ function fail(message) {
|
|
|
19
20
|
throw new Error(`[one] invalid native.app: ${message}`);
|
|
20
21
|
}
|
|
21
22
|
function validateNativeApp(manifest, platform) {
|
|
22
|
-
var _manifest_splash, _manifest_imagePicker, _manifest_ios, _manifest_speech;
|
|
23
|
+
var _manifest_splash, _manifest_splash1, _manifest_imagePicker, _manifest_ios, _manifest_speech;
|
|
23
24
|
if (!manifest || typeof manifest !== "object") fail("manifest must be an object");
|
|
24
25
|
if (!manifest.name || typeof manifest.name !== "string") fail("name is required");
|
|
25
26
|
if (!TARGET_NAME.test(manifest.name)) {
|
|
@@ -54,6 +55,35 @@ function validateNativeApp(manifest, platform) {
|
|
|
54
55
|
if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {
|
|
55
56
|
fail(`userInterfaceStyle "${manifest.userInterfaceStyle}" must be ${USER_INTERFACE_STYLES.join(", ")}`);
|
|
56
57
|
}
|
|
58
|
+
if (manifest.fonts !== void 0) {
|
|
59
|
+
var names = /* @__PURE__ */ new Set();
|
|
60
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
|
|
61
|
+
try {
|
|
62
|
+
for (var _iterator1 = manifest.fonts[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
|
|
63
|
+
var font = _step1.value;
|
|
64
|
+
var _font_split_pop;
|
|
65
|
+
if (typeof font !== "string" || !FONT_FILE.test(font)) {
|
|
66
|
+
fail(`fonts entry "${font}" must be a .ttf or .otf file path`);
|
|
67
|
+
}
|
|
68
|
+
var name = (_font_split_pop = font.split("/").pop()) !== null && _font_split_pop !== void 0 ? _font_split_pop : font;
|
|
69
|
+
if (names.has(name)) fail(`fonts lists ${name} twice`);
|
|
70
|
+
names.add(name);
|
|
71
|
+
}
|
|
72
|
+
} catch (err) {
|
|
73
|
+
_didIteratorError1 = true;
|
|
74
|
+
_iteratorError1 = err;
|
|
75
|
+
} finally {
|
|
76
|
+
try {
|
|
77
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
78
|
+
_iterator1.return();
|
|
79
|
+
}
|
|
80
|
+
} finally {
|
|
81
|
+
if (_didIteratorError1) {
|
|
82
|
+
throw _iteratorError1;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
57
87
|
if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {
|
|
58
88
|
fail(`version "${manifest.version}" must start with major.minor.patch`);
|
|
59
89
|
}
|
|
@@ -63,7 +93,10 @@ function validateNativeApp(manifest, platform) {
|
|
|
63
93
|
if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {
|
|
64
94
|
fail("splash requires source, a six-digit hex backgroundColor, and width from 1 to 288");
|
|
65
95
|
}
|
|
66
|
-
if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.
|
|
96
|
+
if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.dark) !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {
|
|
97
|
+
fail("splash.dark requires a six-digit hex backgroundColor");
|
|
98
|
+
}
|
|
99
|
+
if (((_manifest_splash1 = manifest.splash) === null || _manifest_splash1 === void 0 ? void 0 : _manifest_splash1.resizeMode) !== void 0 && manifest.splash.resizeMode !== "contain" && manifest.splash.resizeMode !== "cover") {
|
|
67
100
|
fail(`splash.resizeMode "${manifest.splash.resizeMode}" must be contain or cover`);
|
|
68
101
|
}
|
|
69
102
|
if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== "string" || manifest.imagePicker.camera.trim() === "")) {
|
|
@@ -158,6 +191,7 @@ function validateNativeApp(manifest, platform) {
|
|
|
158
191
|
}
|
|
159
192
|
}
|
|
160
193
|
if (!platform || platform === "android") {
|
|
194
|
+
var _manifest_android_appLinks;
|
|
161
195
|
var _manifest_android;
|
|
162
196
|
if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {
|
|
163
197
|
var _manifest_android1;
|
|
@@ -169,6 +203,41 @@ function validateNativeApp(manifest, platform) {
|
|
|
169
203
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
170
204
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
171
205
|
}
|
|
206
|
+
for (var _i = 0, _iter = ["targetSdk", "compileSdk"]; _i < _iter.length; _i++) {
|
|
207
|
+
var key = _iter[_i];
|
|
208
|
+
var value = manifest.android[key];
|
|
209
|
+
if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {
|
|
210
|
+
fail(`android.${key} "${value}" must be an api level integer`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (manifest.android.shrinkResources && !manifest.android.minify) {
|
|
214
|
+
fail("android.shrinkResources needs android.minify");
|
|
215
|
+
}
|
|
216
|
+
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;
|
|
217
|
+
try {
|
|
218
|
+
for (var _iterator2 = ((_manifest_android_appLinks = manifest.android.appLinks) !== null && _manifest_android_appLinks !== void 0 ? _manifest_android_appLinks : [])[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
219
|
+
var link = _step2.value;
|
|
220
|
+
if (!link.host || !REVERSE_DNS.test(link.host)) {
|
|
221
|
+
fail(`android.appLinks host "${link.host}" must be a domain`);
|
|
222
|
+
}
|
|
223
|
+
if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith("/")) {
|
|
224
|
+
fail(`android.appLinks pathPrefix "${link.pathPrefix}" must start with /`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
} catch (err) {
|
|
228
|
+
_didIteratorError2 = true;
|
|
229
|
+
_iteratorError2 = err;
|
|
230
|
+
} finally {
|
|
231
|
+
try {
|
|
232
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
233
|
+
_iterator2.return();
|
|
234
|
+
}
|
|
235
|
+
} finally {
|
|
236
|
+
if (_didIteratorError2) {
|
|
237
|
+
throw _iteratorError2;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
172
241
|
var adaptiveIcon = manifest.android.adaptiveIcon;
|
|
173
242
|
if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {
|
|
174
243
|
fail("android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex");
|
|
@@ -181,7 +250,7 @@ function validateNativeApp(manifest, platform) {
|
|
|
181
250
|
}
|
|
182
251
|
function expoClientFromNativeApp(app) {
|
|
183
252
|
var _app_displayName;
|
|
184
|
-
var _app_icon;
|
|
253
|
+
var _app_icon, _app_fonts;
|
|
185
254
|
return {
|
|
186
255
|
name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,
|
|
187
256
|
slug: app.name,
|
|
@@ -194,16 +263,29 @@ function expoClientFromNativeApp(app) {
|
|
|
194
263
|
image: app.splash.source,
|
|
195
264
|
backgroundColor: app.splash.backgroundColor,
|
|
196
265
|
imageWidth: app.splash.width,
|
|
197
|
-
resizeMode: app.splash.resizeMode
|
|
266
|
+
resizeMode: app.splash.resizeMode,
|
|
267
|
+
dark: app.splash.dark && {
|
|
268
|
+
image: app.splash.dark.source,
|
|
269
|
+
backgroundColor: app.splash.dark.backgroundColor
|
|
270
|
+
}
|
|
198
271
|
},
|
|
272
|
+
plugins: ((_app_fonts = app.fonts) === null || _app_fonts === void 0 ? void 0 : _app_fonts.length) ? [["expo-font", { fonts: app.fonts }]] : void 0,
|
|
199
273
|
ios: app.ios && {
|
|
200
274
|
bundleIdentifier: app.ios.bundleId,
|
|
201
275
|
buildNumber: app.ios.buildNumber,
|
|
202
|
-
supportsTablet: app.ios.tablet
|
|
276
|
+
supportsTablet: app.ios.tablet,
|
|
277
|
+
associatedDomains: app.ios.associatedDomains,
|
|
278
|
+
usesAppleSignIn: app.ios.usesAppleSignIn,
|
|
279
|
+
googleServicesFile: app.ios.googleServicesFile,
|
|
280
|
+
infoPlist: app.ios.infoPlist,
|
|
281
|
+
entitlements: app.ios.entitlements
|
|
203
282
|
},
|
|
204
283
|
android: app.android && {
|
|
205
284
|
package: app.android.applicationId,
|
|
206
285
|
versionCode: app.android.versionCode,
|
|
286
|
+
permissions: app.android.permissions,
|
|
287
|
+
blockedPermissions: app.android.blockedPermissions,
|
|
288
|
+
googleServicesFile: app.android.googleServicesFile,
|
|
207
289
|
adaptiveIcon: app.android.adaptiveIcon && {
|
|
208
290
|
foregroundImage: app.android.adaptiveIcon.foreground,
|
|
209
291
|
backgroundImage: app.android.adaptiveIcon.background,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeAppManifest.native.js","names":[],"sources":["esm/nativeAppManifest.native.js"],"sourcesContent":["var TARGET_NAME = /^[A-Za-z][A-Za-z0-9_]*$/;\nvar SCHEME = /^[a-z][a-z0-9+.-]*$/i;\nvar VERSION = /^\\d+\\.\\d+\\.\\d+/;\nvar BUILD_NUMBER = /^[A-Za-z0-9.]+$/;\nvar REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/;\nvar DEPLOYMENT_TARGET = /^\\d+\\.\\d+$/;\nvar HEX_COLOR = /^#[\\da-f]{6}$/i;\nvar ORIENTATIONS = [\n \"portrait\",\n \"landscape\",\n \"default\"\n];\nvar USER_INTERFACE_STYLES = [\n \"light\",\n \"dark\",\n \"automatic\"\n];\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_splash, _manifest_imagePicker, _manifest_ios, _manifest_speech;\n if (!manifest || typeof manifest !== \"object\") fail(\"manifest must be an object\");\n if (!manifest.name || typeof manifest.name !== \"string\") fail(\"name is required\");\n if (!TARGET_NAME.test(manifest.name)) {\n fail(`name \"${manifest.name}\" must start with a letter and contain only letters, digits, and underscore`);\n }\n var schemes = manifest.scheme === void 0 ? [] : Array.isArray(manifest.scheme) ? manifest.scheme : [\n manifest.scheme\n ];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = schemes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var scheme = _step.value;\n if (typeof scheme !== \"string\" || !SCHEME.test(scheme)) {\n fail(`scheme \"${scheme}\" must be a valid uri scheme`);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n if (manifest.orientation !== void 0 && !ORIENTATIONS.includes(manifest.orientation)) {\n fail(`orientation \"${manifest.orientation}\" must be ${ORIENTATIONS.join(\", \")}`);\n }\n if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {\n fail(`userInterfaceStyle \"${manifest.userInterfaceStyle}\" must be ${USER_INTERFACE_STYLES.join(\", \")}`);\n }\n if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {\n fail(`version \"${manifest.version}\" must start with major.minor.patch`);\n }\n if (manifest.icon !== void 0 && (!manifest.icon.source || !HEX_COLOR.test(manifest.icon.backgroundColor))) {\n fail(\"icon requires source and a six-digit hex backgroundColor\");\n }\n if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {\n fail(\"splash requires source, a six-digit hex backgroundColor, and width from 1 to 288\");\n }\n if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.resizeMode) !== void 0 && manifest.splash.resizeMode !== \"contain\" && manifest.splash.resizeMode !== \"cover\") {\n fail(`splash.resizeMode \"${manifest.splash.resizeMode}\" must be contain or cover`);\n }\n if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== \"string\" || manifest.imagePicker.camera.trim() === \"\")) {\n fail(\"imagePicker.camera must be a non-empty string\");\n }\n if (manifest.photoLibrary !== void 0 && (!manifest.photoLibrary || typeof manifest.photoLibrary.addOnly !== \"string\" || manifest.photoLibrary.addOnly.trim() === \"\")) {\n fail(\"photoLibrary.addOnly must be a non-empty string\");\n }\n if (manifest.contacts !== void 0 && (!manifest.contacts || typeof manifest.contacts.usage !== \"string\" || manifest.contacts.usage.trim() === \"\")) {\n fail(\"contacts.usage must be a non-empty string\");\n }\n if (manifest.calendar !== void 0) {\n if (!manifest.calendar || manifest.calendar.usage === void 0 && manifest.calendar.remindersUsage === void 0) {\n fail(\"calendar.usage or calendar.remindersUsage must be a non-empty string\");\n }\n if (manifest.calendar.usage !== void 0 && (typeof manifest.calendar.usage !== \"string\" || manifest.calendar.usage.trim() === \"\")) {\n fail(\"calendar.usage must be a non-empty string\");\n }\n if (manifest.calendar.remindersUsage !== void 0 && (typeof manifest.calendar.remindersUsage !== \"string\" || manifest.calendar.remindersUsage.trim() === \"\")) {\n fail(\"calendar.remindersUsage must be a non-empty string\");\n }\n }\n if (manifest.location !== void 0 && (!manifest.location || typeof manifest.location.whenInUse !== \"string\" || manifest.location.whenInUse.trim() === \"\")) {\n fail(\"location.whenInUse must be a non-empty string\");\n }\n if (manifest.audio !== void 0) {\n if (!manifest.audio || typeof manifest.audio !== \"object\") {\n fail(\"audio must configure microphone or background playback\");\n }\n if (manifest.audio.microphone !== void 0 && (typeof manifest.audio.microphone !== \"string\" || manifest.audio.microphone.trim() === \"\")) {\n fail(\"audio.microphone must be a non-empty string\");\n }\n if (manifest.audio.background !== void 0 && typeof manifest.audio.background !== \"boolean\") {\n fail(\"audio.background must be a boolean\");\n }\n if (manifest.audio.microphone === void 0 && manifest.audio.background !== true) {\n fail(\"audio must configure microphone or background playback\");\n }\n }\n if (((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.faceIdUsageDescription) !== void 0 && (typeof manifest.ios.faceIdUsageDescription !== \"string\" || manifest.ios.faceIdUsageDescription.trim() === \"\")) {\n fail(\"ios.faceIdUsageDescription must be a non-empty string\");\n }\n if (manifest.speech !== void 0 && (typeof ((_manifest_speech = manifest.speech) === null || _manifest_speech === void 0 ? void 0 : _manifest_speech.recognition) !== \"string\" || manifest.speech.recognition.trim() === \"\" || typeof manifest.speech.microphone !== \"string\" || manifest.speech.microphone.trim() === \"\")) {\n fail(\"speech.recognition and speech.microphone must be non-empty strings\");\n }\n if (manifest.notifications !== void 0) {\n if (typeof manifest.notifications !== \"object\" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== \"boolean\") {\n fail(\"notifications.push must be a boolean\");\n }\n }\n if (manifest.pictureInPicture !== void 0 && typeof manifest.pictureInPicture !== \"boolean\") {\n fail(\"pictureInPicture must be a boolean\");\n }\n if (manifest.updates !== void 0) {\n if (typeof manifest.updates.runtimeVersion !== \"string\" || manifest.updates.runtimeVersion.trim() === \"\") {\n fail(\"updates.runtimeVersion must be a non-empty string\");\n }\n if (manifest.updates.url !== void 0 && (typeof manifest.updates.url !== \"string\" || manifest.updates.url.trim() === \"\")) {\n fail(\"updates.url must be a non-empty string\");\n }\n }\n if (!platform || platform === \"ios\") {\n var _manifest_ios1;\n if (!((_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios2;\n fail(`ios.bundleId \"${(_manifest_ios2 = manifest.ios) === null || _manifest_ios2 === void 0 ? void 0 : _manifest_ios2.bundleId}\" must be reverse-dns`);\n }\n if (manifest.ios.deploymentTarget !== void 0 && !DEPLOYMENT_TARGET.test(manifest.ios.deploymentTarget)) {\n fail(`ios.deploymentTarget \"${manifest.ios.deploymentTarget}\" must look like \"17.0\"`);\n }\n if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {\n fail(`ios.buildNumber \"${manifest.ios.buildNumber}\" must contain only letters, digits, and dots`);\n }\n var widgets = manifest.ios.widgets;\n if (widgets) {\n var _widgets_displayName, _widgets_description;\n if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {\n fail(\"ios.widgets requires ios.deploymentTarget of 17.0 or newer\");\n }\n if (!/^group\\.[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {\n fail(\"ios.widgets.appGroup must be a reverse-dns App Group beginning with group.\");\n }\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {\n fail(\"ios.widgets.kind must be a non-empty WidgetKit kind\");\n }\n if (!((_widgets_displayName = widgets.displayName) === null || _widgets_displayName === void 0 ? void 0 : _widgets_displayName.trim()) || !((_widgets_description = widgets.description) === null || _widgets_description === void 0 ? void 0 : _widgets_description.trim())) {\n fail(\"ios.widgets.displayName and description must be non-empty strings\");\n }\n if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== \"boolean\") {\n fail(\"ios.widgets.pushNotifications must be a boolean\");\n }\n }\n }\n if (!platform || platform === \"android\") {\n var _manifest_android;\n if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {\n var _manifest_android1;\n fail(`android.applicationId \"${(_manifest_android1 = manifest.android) === null || _manifest_android1 === void 0 ? void 0 : _manifest_android1.applicationId}\" must be reverse-dns`);\n }\n if (manifest.android.minSdk !== void 0 && (!Number.isInteger(manifest.android.minSdk) || manifest.android.minSdk < 21 || manifest.android.minSdk > 36)) {\n fail(`android.minSdk \"${manifest.android.minSdk}\" must be an integer from 21 to 36`);\n }\n if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {\n fail(`android.versionCode \"${manifest.android.versionCode}\" must be a positive integer`);\n }\n var adaptiveIcon = manifest.android.adaptiveIcon;\n if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {\n fail(\"android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex\");\n }\n if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== \"string\" || manifest.android.googleMapsApiKey.trim() === \"\")) {\n fail(\"android.googleMapsApiKey must be a non-empty string\");\n }\n }\n return manifest;\n}\nfunction expoClientFromNativeApp(app) {\n var _app_displayName;\n var _app_icon;\n return {\n name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,\n slug: app.name,\n scheme: app.scheme,\n version: app.version,\n orientation: app.orientation,\n userInterfaceStyle: app.userInterfaceStyle,\n icon: (_app_icon = app.icon) === null || _app_icon === void 0 ? void 0 : _app_icon.source,\n splash: app.splash && {\n image: app.splash.source,\n backgroundColor: app.splash.backgroundColor,\n imageWidth: app.splash.width,\n resizeMode: app.splash.resizeMode\n },\n ios: app.ios && {\n bundleIdentifier: app.ios.bundleId,\n buildNumber: app.ios.buildNumber,\n supportsTablet: app.ios.tablet\n },\n android: app.android && {\n package: app.android.applicationId,\n versionCode: app.android.versionCode,\n adaptiveIcon: app.android.adaptiveIcon && {\n foregroundImage: app.android.adaptiveIcon.foreground,\n backgroundImage: app.android.adaptiveIcon.background,\n backgroundColor: app.android.adaptiveIcon.backgroundColor,\n monochromeImage: app.android.adaptiveIcon.monochrome\n }\n }\n };\n}\nexport {\n expoClientFromNativeApp,\n validateNativeApp\n};\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nativeAppManifest.native.js","names":[],"sources":["esm/nativeAppManifest.native.js"],"sourcesContent":["var TARGET_NAME = /^[A-Za-z][A-Za-z0-9_]*$/;\nvar SCHEME = /^[a-z][a-z0-9+.-]*$/i;\nvar VERSION = /^\\d+\\.\\d+\\.\\d+/;\nvar BUILD_NUMBER = /^[A-Za-z0-9.]+$/;\nvar REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/;\nvar DEPLOYMENT_TARGET = /^\\d+\\.\\d+$/;\nvar HEX_COLOR = /^#[\\da-f]{6}$/i;\nvar FONT_FILE = /\\.(ttf|otf)$/i;\nvar ORIENTATIONS = [\n \"portrait\",\n \"landscape\",\n \"default\"\n];\nvar USER_INTERFACE_STYLES = [\n \"light\",\n \"dark\",\n \"automatic\"\n];\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_splash, _manifest_splash1, _manifest_imagePicker, _manifest_ios, _manifest_speech;\n if (!manifest || typeof manifest !== \"object\") fail(\"manifest must be an object\");\n if (!manifest.name || typeof manifest.name !== \"string\") fail(\"name is required\");\n if (!TARGET_NAME.test(manifest.name)) {\n fail(`name \"${manifest.name}\" must start with a letter and contain only letters, digits, and underscore`);\n }\n var schemes = manifest.scheme === void 0 ? [] : Array.isArray(manifest.scheme) ? manifest.scheme : [\n manifest.scheme\n ];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = schemes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var scheme = _step.value;\n if (typeof scheme !== \"string\" || !SCHEME.test(scheme)) {\n fail(`scheme \"${scheme}\" must be a valid uri scheme`);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n if (manifest.orientation !== void 0 && !ORIENTATIONS.includes(manifest.orientation)) {\n fail(`orientation \"${manifest.orientation}\" must be ${ORIENTATIONS.join(\", \")}`);\n }\n if (manifest.userInterfaceStyle !== void 0 && !USER_INTERFACE_STYLES.includes(manifest.userInterfaceStyle)) {\n fail(`userInterfaceStyle \"${manifest.userInterfaceStyle}\" must be ${USER_INTERFACE_STYLES.join(\", \")}`);\n }\n if (manifest.fonts !== void 0) {\n var names = /* @__PURE__ */ new Set();\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;\n try {\n for (var _iterator1 = manifest.fonts[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {\n var font = _step1.value;\n var _font_split_pop;\n if (typeof font !== \"string\" || !FONT_FILE.test(font)) {\n fail(`fonts entry \"${font}\" must be a .ttf or .otf file path`);\n }\n var name = (_font_split_pop = font.split(\"/\").pop()) !== null && _font_split_pop !== void 0 ? _font_split_pop : font;\n if (names.has(name)) fail(`fonts lists ${name} twice`);\n names.add(name);\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally {\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n if (manifest.version !== void 0 && !VERSION.test(manifest.version)) {\n fail(`version \"${manifest.version}\" must start with major.minor.patch`);\n }\n if (manifest.icon !== void 0 && (!manifest.icon.source || !HEX_COLOR.test(manifest.icon.backgroundColor))) {\n fail(\"icon requires source and a six-digit hex backgroundColor\");\n }\n if (manifest.splash !== void 0 && (!manifest.splash.source || !HEX_COLOR.test(manifest.splash.backgroundColor) || manifest.splash.width !== void 0 && (!Number.isFinite(manifest.splash.width) || manifest.splash.width < 1 || manifest.splash.width > 288))) {\n fail(\"splash requires source, a six-digit hex backgroundColor, and width from 1 to 288\");\n }\n if (((_manifest_splash = manifest.splash) === null || _manifest_splash === void 0 ? void 0 : _manifest_splash.dark) !== void 0 && !HEX_COLOR.test(manifest.splash.dark.backgroundColor)) {\n fail(\"splash.dark requires a six-digit hex backgroundColor\");\n }\n if (((_manifest_splash1 = manifest.splash) === null || _manifest_splash1 === void 0 ? void 0 : _manifest_splash1.resizeMode) !== void 0 && manifest.splash.resizeMode !== \"contain\" && manifest.splash.resizeMode !== \"cover\") {\n fail(`splash.resizeMode \"${manifest.splash.resizeMode}\" must be contain or cover`);\n }\n if (((_manifest_imagePicker = manifest.imagePicker) === null || _manifest_imagePicker === void 0 ? void 0 : _manifest_imagePicker.camera) !== void 0 && (typeof manifest.imagePicker.camera !== \"string\" || manifest.imagePicker.camera.trim() === \"\")) {\n fail(\"imagePicker.camera must be a non-empty string\");\n }\n if (manifest.photoLibrary !== void 0 && (!manifest.photoLibrary || typeof manifest.photoLibrary.addOnly !== \"string\" || manifest.photoLibrary.addOnly.trim() === \"\")) {\n fail(\"photoLibrary.addOnly must be a non-empty string\");\n }\n if (manifest.contacts !== void 0 && (!manifest.contacts || typeof manifest.contacts.usage !== \"string\" || manifest.contacts.usage.trim() === \"\")) {\n fail(\"contacts.usage must be a non-empty string\");\n }\n if (manifest.calendar !== void 0) {\n if (!manifest.calendar || manifest.calendar.usage === void 0 && manifest.calendar.remindersUsage === void 0) {\n fail(\"calendar.usage or calendar.remindersUsage must be a non-empty string\");\n }\n if (manifest.calendar.usage !== void 0 && (typeof manifest.calendar.usage !== \"string\" || manifest.calendar.usage.trim() === \"\")) {\n fail(\"calendar.usage must be a non-empty string\");\n }\n if (manifest.calendar.remindersUsage !== void 0 && (typeof manifest.calendar.remindersUsage !== \"string\" || manifest.calendar.remindersUsage.trim() === \"\")) {\n fail(\"calendar.remindersUsage must be a non-empty string\");\n }\n }\n if (manifest.location !== void 0 && (!manifest.location || typeof manifest.location.whenInUse !== \"string\" || manifest.location.whenInUse.trim() === \"\")) {\n fail(\"location.whenInUse must be a non-empty string\");\n }\n if (manifest.audio !== void 0) {\n if (!manifest.audio || typeof manifest.audio !== \"object\") {\n fail(\"audio must configure microphone or background playback\");\n }\n if (manifest.audio.microphone !== void 0 && (typeof manifest.audio.microphone !== \"string\" || manifest.audio.microphone.trim() === \"\")) {\n fail(\"audio.microphone must be a non-empty string\");\n }\n if (manifest.audio.background !== void 0 && typeof manifest.audio.background !== \"boolean\") {\n fail(\"audio.background must be a boolean\");\n }\n if (manifest.audio.microphone === void 0 && manifest.audio.background !== true) {\n fail(\"audio must configure microphone or background playback\");\n }\n }\n if (((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.faceIdUsageDescription) !== void 0 && (typeof manifest.ios.faceIdUsageDescription !== \"string\" || manifest.ios.faceIdUsageDescription.trim() === \"\")) {\n fail(\"ios.faceIdUsageDescription must be a non-empty string\");\n }\n if (manifest.speech !== void 0 && (typeof ((_manifest_speech = manifest.speech) === null || _manifest_speech === void 0 ? void 0 : _manifest_speech.recognition) !== \"string\" || manifest.speech.recognition.trim() === \"\" || typeof manifest.speech.microphone !== \"string\" || manifest.speech.microphone.trim() === \"\")) {\n fail(\"speech.recognition and speech.microphone must be non-empty strings\");\n }\n if (manifest.notifications !== void 0) {\n if (typeof manifest.notifications !== \"object\" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== \"boolean\") {\n fail(\"notifications.push must be a boolean\");\n }\n }\n if (manifest.pictureInPicture !== void 0 && typeof manifest.pictureInPicture !== \"boolean\") {\n fail(\"pictureInPicture must be a boolean\");\n }\n if (manifest.updates !== void 0) {\n if (typeof manifest.updates.runtimeVersion !== \"string\" || manifest.updates.runtimeVersion.trim() === \"\") {\n fail(\"updates.runtimeVersion must be a non-empty string\");\n }\n if (manifest.updates.url !== void 0 && (typeof manifest.updates.url !== \"string\" || manifest.updates.url.trim() === \"\")) {\n fail(\"updates.url must be a non-empty string\");\n }\n }\n if (!platform || platform === \"ios\") {\n var _manifest_ios1;\n if (!((_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios2;\n fail(`ios.bundleId \"${(_manifest_ios2 = manifest.ios) === null || _manifest_ios2 === void 0 ? void 0 : _manifest_ios2.bundleId}\" must be reverse-dns`);\n }\n if (manifest.ios.deploymentTarget !== void 0 && !DEPLOYMENT_TARGET.test(manifest.ios.deploymentTarget)) {\n fail(`ios.deploymentTarget \"${manifest.ios.deploymentTarget}\" must look like \"17.0\"`);\n }\n if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {\n fail(`ios.buildNumber \"${manifest.ios.buildNumber}\" must contain only letters, digits, and dots`);\n }\n var widgets = manifest.ios.widgets;\n if (widgets) {\n var _widgets_displayName, _widgets_description;\n if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {\n fail(\"ios.widgets requires ios.deploymentTarget of 17.0 or newer\");\n }\n if (!/^group\\.[A-Za-z][A-Za-z0-9-]*(\\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {\n fail(\"ios.widgets.appGroup must be a reverse-dns App Group beginning with group.\");\n }\n if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {\n fail(\"ios.widgets.kind must be a non-empty WidgetKit kind\");\n }\n if (!((_widgets_displayName = widgets.displayName) === null || _widgets_displayName === void 0 ? void 0 : _widgets_displayName.trim()) || !((_widgets_description = widgets.description) === null || _widgets_description === void 0 ? void 0 : _widgets_description.trim())) {\n fail(\"ios.widgets.displayName and description must be non-empty strings\");\n }\n if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== \"boolean\") {\n fail(\"ios.widgets.pushNotifications must be a boolean\");\n }\n }\n }\n if (!platform || platform === \"android\") {\n var _manifest_android_appLinks;\n var _manifest_android;\n if (!((_manifest_android = manifest.android) === null || _manifest_android === void 0 ? void 0 : _manifest_android.applicationId) || !REVERSE_DNS.test(manifest.android.applicationId)) {\n var _manifest_android1;\n fail(`android.applicationId \"${(_manifest_android1 = manifest.android) === null || _manifest_android1 === void 0 ? void 0 : _manifest_android1.applicationId}\" must be reverse-dns`);\n }\n if (manifest.android.minSdk !== void 0 && (!Number.isInteger(manifest.android.minSdk) || manifest.android.minSdk < 21 || manifest.android.minSdk > 36)) {\n fail(`android.minSdk \"${manifest.android.minSdk}\" must be an integer from 21 to 36`);\n }\n if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {\n fail(`android.versionCode \"${manifest.android.versionCode}\" must be a positive integer`);\n }\n for (var _i = 0, _iter = [\n \"targetSdk\",\n \"compileSdk\"\n ]; _i < _iter.length; _i++) {\n var key = _iter[_i];\n var value = manifest.android[key];\n if (value !== void 0 && (!Number.isInteger(value) || value < 21)) {\n fail(`android.${key} \"${value}\" must be an api level integer`);\n }\n }\n if (manifest.android.shrinkResources && !manifest.android.minify) {\n fail(\"android.shrinkResources needs android.minify\");\n }\n var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;\n try {\n for (var _iterator2 = ((_manifest_android_appLinks = manifest.android.appLinks) !== null && _manifest_android_appLinks !== void 0 ? _manifest_android_appLinks : [])[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var link = _step2.value;\n if (!link.host || !REVERSE_DNS.test(link.host)) {\n fail(`android.appLinks host \"${link.host}\" must be a domain`);\n }\n if (link.pathPrefix !== void 0 && !link.pathPrefix.startsWith(\"/\")) {\n fail(`android.appLinks pathPrefix \"${link.pathPrefix}\" must start with /`);\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n var adaptiveIcon = manifest.android.adaptiveIcon;\n if (adaptiveIcon !== void 0 && (!adaptiveIcon.foreground || adaptiveIcon.backgroundColor !== void 0 && !HEX_COLOR.test(adaptiveIcon.backgroundColor))) {\n fail(\"android.adaptiveIcon requires foreground, and backgroundColor must be six-digit hex\");\n }\n if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== \"string\" || manifest.android.googleMapsApiKey.trim() === \"\")) {\n fail(\"android.googleMapsApiKey must be a non-empty string\");\n }\n }\n return manifest;\n}\nfunction expoClientFromNativeApp(app) {\n var _app_displayName;\n var _app_icon, _app_fonts;\n return {\n name: (_app_displayName = app.displayName) !== null && _app_displayName !== void 0 ? _app_displayName : app.name,\n slug: app.name,\n scheme: app.scheme,\n version: app.version,\n orientation: app.orientation,\n userInterfaceStyle: app.userInterfaceStyle,\n icon: (_app_icon = app.icon) === null || _app_icon === void 0 ? void 0 : _app_icon.source,\n splash: app.splash && {\n image: app.splash.source,\n backgroundColor: app.splash.backgroundColor,\n imageWidth: app.splash.width,\n resizeMode: app.splash.resizeMode,\n dark: app.splash.dark && {\n image: app.splash.dark.source,\n backgroundColor: app.splash.dark.backgroundColor\n }\n },\n plugins: ((_app_fonts = app.fonts) === null || _app_fonts === void 0 ? void 0 : _app_fonts.length) ? [\n [\n \"expo-font\",\n {\n fonts: app.fonts\n }\n ]\n ] : void 0,\n ios: app.ios && {\n bundleIdentifier: app.ios.bundleId,\n buildNumber: app.ios.buildNumber,\n supportsTablet: app.ios.tablet,\n associatedDomains: app.ios.associatedDomains,\n usesAppleSignIn: app.ios.usesAppleSignIn,\n googleServicesFile: app.ios.googleServicesFile,\n infoPlist: app.ios.infoPlist,\n entitlements: app.ios.entitlements\n },\n android: app.android && {\n package: app.android.applicationId,\n versionCode: app.android.versionCode,\n permissions: app.android.permissions,\n blockedPermissions: app.android.blockedPermissions,\n googleServicesFile: app.android.googleServicesFile,\n adaptiveIcon: app.android.adaptiveIcon && {\n foregroundImage: app.android.adaptiveIcon.foreground,\n backgroundImage: app.android.adaptiveIcon.background,\n backgroundColor: app.android.adaptiveIcon.backgroundColor,\n monochromeImage: app.android.adaptiveIcon.monochrome\n }\n }\n };\n}\nexport {\n expoClientFromNativeApp,\n validateNativeApp\n};\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxrn/utils",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.132.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"typecheck": "tsc --noEmit"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@vxrn/debug": "2.0.0-beta.
|
|
45
|
-
"@vxrn/resolve": "2.0.0-beta.
|
|
44
|
+
"@vxrn/debug": "2.0.0-beta.132.1",
|
|
45
|
+
"@vxrn/resolve": "2.0.0-beta.132.1",
|
|
46
46
|
"ws": "^8.21.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
package/src/nativeAppManifest.ts
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
// name is the native target and appregistry key. one canonical definition:
|
|
3
3
|
// one/native re-exports it for apps and vxrn prebuild consumes it, so a new
|
|
4
4
|
// field is added once, here.
|
|
5
|
+
// a property list value, for the ios keys native.app does not model.
|
|
6
|
+
export type PlistValue =
|
|
7
|
+
| string
|
|
8
|
+
| number
|
|
9
|
+
| boolean
|
|
10
|
+
| PlistValue[]
|
|
11
|
+
| { [key: string]: PlistValue }
|
|
12
|
+
|
|
5
13
|
export interface NativeAppManifest {
|
|
6
14
|
name: string
|
|
7
15
|
displayName?: string
|
|
@@ -26,7 +34,17 @@ export interface NativeAppManifest {
|
|
|
26
34
|
// launch screen with it, as expo's resizeMode does. android's system
|
|
27
35
|
// splash shows the centered artwork either way.
|
|
28
36
|
resizeMode?: 'contain' | 'cover'
|
|
37
|
+
// what a dark-appearance launch shows, as expo's splash.dark: its own
|
|
38
|
+
// background, and optionally its own artwork.
|
|
39
|
+
dark?: {
|
|
40
|
+
source?: string
|
|
41
|
+
backgroundColor: string
|
|
42
|
+
}
|
|
29
43
|
}
|
|
44
|
+
// project-relative .ttf or .otf files bundled into the binary, as the
|
|
45
|
+
// expo-font plugin's `fonts`: ios lists them in UIAppFonts, android loads
|
|
46
|
+
// them from assets/fonts. the family name is the file's own.
|
|
47
|
+
fonts?: string[]
|
|
30
48
|
imagePicker?: {
|
|
31
49
|
// ios camera usage description shown at the system prompt. setting it
|
|
32
50
|
// also declares the android camera permission; both are required for
|
|
@@ -93,6 +111,19 @@ export interface NativeAppManifest {
|
|
|
93
111
|
faceIdUsageDescription?: string
|
|
94
112
|
// exposes the app's Documents in the Files app and document pickers.
|
|
95
113
|
fileSharing?: boolean
|
|
114
|
+
// universal links and shared web credentials, as entitlement entries
|
|
115
|
+
// such as `applinks:example.com`.
|
|
116
|
+
associatedDomains?: string[]
|
|
117
|
+
// the sign in with apple entitlement, for One.iOS.AppleAuthentication.
|
|
118
|
+
usesAppleSignIn?: boolean
|
|
119
|
+
// a firebase GoogleService-Info.plist, bundled into the app as expo's
|
|
120
|
+
// ios.googleServicesFile does.
|
|
121
|
+
googleServicesFile?: string
|
|
122
|
+
// Info.plist and entitlement keys native.app does not model (a tracking
|
|
123
|
+
// prompt, an sdk's key). a key native.app or the template already writes
|
|
124
|
+
// is rejected: set it through its field instead.
|
|
125
|
+
infoPlist?: Record<string, PlistValue>
|
|
126
|
+
entitlements?: Record<string, PlistValue>
|
|
96
127
|
widgets?: {
|
|
97
128
|
appGroup: string
|
|
98
129
|
kind: string
|
|
@@ -115,6 +146,23 @@ export interface NativeAppManifest {
|
|
|
115
146
|
backgroundColor?: string
|
|
116
147
|
monochrome?: string
|
|
117
148
|
}
|
|
149
|
+
targetSdk?: number
|
|
150
|
+
compileSdk?: number
|
|
151
|
+
// release builds run R8, as expo-build-properties' minify; shrinkResources
|
|
152
|
+
// also drops unused resources and needs minify. proguardRules are appended
|
|
153
|
+
// to the app's proguard-rules.pro.
|
|
154
|
+
minify?: boolean
|
|
155
|
+
shrinkResources?: boolean
|
|
156
|
+
proguardRules?: string
|
|
157
|
+
// extra manifest permissions: a bare name means android.permission.<name>.
|
|
158
|
+
// blocked ones are removed even when a library's manifest merges them in.
|
|
159
|
+
permissions?: string[]
|
|
160
|
+
blockedPermissions?: string[]
|
|
161
|
+
// a firebase google-services.json; prebuild applies the google-services
|
|
162
|
+
// gradle plugin, as expo's android.googleServicesFile does.
|
|
163
|
+
googleServicesFile?: string
|
|
164
|
+
// verified https app links routed to the app (android:autoVerify).
|
|
165
|
+
appLinks?: Array<{ host: string; pathPrefix?: string }>
|
|
118
166
|
// google maps api key for One.UI.Map. setting it compiles the maps sdk
|
|
119
167
|
// into the app and stamps the key meta-data; without it the maps source
|
|
120
168
|
// set stays out and mounting One.UI.Map throws.
|
|
@@ -129,6 +177,7 @@ const BUILD_NUMBER = /^[A-Za-z0-9.]+$/
|
|
|
129
177
|
const REVERSE_DNS = /^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/
|
|
130
178
|
const DEPLOYMENT_TARGET = /^\d+\.\d+$/
|
|
131
179
|
const HEX_COLOR = /^#[\da-f]{6}$/i
|
|
180
|
+
const FONT_FILE = /\.(ttf|otf)$/i
|
|
132
181
|
const ORIENTATIONS = ['portrait', 'landscape', 'default'] as const
|
|
133
182
|
const USER_INTERFACE_STYLES = ['light', 'dark', 'automatic'] as const
|
|
134
183
|
|
|
@@ -175,6 +224,17 @@ export function validateNativeApp(
|
|
|
175
224
|
`userInterfaceStyle "${manifest.userInterfaceStyle}" must be ${USER_INTERFACE_STYLES.join(', ')}`
|
|
176
225
|
)
|
|
177
226
|
}
|
|
227
|
+
if (manifest.fonts !== undefined) {
|
|
228
|
+
const names = new Set<string>()
|
|
229
|
+
for (const font of manifest.fonts) {
|
|
230
|
+
if (typeof font !== 'string' || !FONT_FILE.test(font)) {
|
|
231
|
+
fail(`fonts entry "${font}" must be a .ttf or .otf file path`)
|
|
232
|
+
}
|
|
233
|
+
const name = font.split('/').pop() ?? font
|
|
234
|
+
if (names.has(name)) fail(`fonts lists ${name} twice`)
|
|
235
|
+
names.add(name)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
178
238
|
if (manifest.version !== undefined && !VERSION.test(manifest.version)) {
|
|
179
239
|
fail(`version "${manifest.version}" must start with major.minor.patch`)
|
|
180
240
|
}
|
|
@@ -197,6 +257,12 @@ export function validateNativeApp(
|
|
|
197
257
|
'splash requires source, a six-digit hex backgroundColor, and width from 1 to 288'
|
|
198
258
|
)
|
|
199
259
|
}
|
|
260
|
+
if (
|
|
261
|
+
manifest.splash?.dark !== undefined &&
|
|
262
|
+
!HEX_COLOR.test(manifest.splash.dark.backgroundColor)
|
|
263
|
+
) {
|
|
264
|
+
fail('splash.dark requires a six-digit hex backgroundColor')
|
|
265
|
+
}
|
|
200
266
|
if (
|
|
201
267
|
manifest.splash?.resizeMode !== undefined &&
|
|
202
268
|
manifest.splash.resizeMode !== 'contain' &&
|
|
@@ -385,6 +451,23 @@ export function validateNativeApp(
|
|
|
385
451
|
`android.versionCode "${manifest.android.versionCode}" must be a positive integer`
|
|
386
452
|
)
|
|
387
453
|
}
|
|
454
|
+
for (const key of ['targetSdk', 'compileSdk'] as const) {
|
|
455
|
+
const value = manifest.android[key]
|
|
456
|
+
if (value !== undefined && (!Number.isInteger(value) || value < 21)) {
|
|
457
|
+
fail(`android.${key} "${value}" must be an api level integer`)
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (manifest.android.shrinkResources && !manifest.android.minify) {
|
|
461
|
+
fail('android.shrinkResources needs android.minify')
|
|
462
|
+
}
|
|
463
|
+
for (const link of manifest.android.appLinks ?? []) {
|
|
464
|
+
if (!link.host || !REVERSE_DNS.test(link.host)) {
|
|
465
|
+
fail(`android.appLinks host "${link.host}" must be a domain`)
|
|
466
|
+
}
|
|
467
|
+
if (link.pathPrefix !== undefined && !link.pathPrefix.startsWith('/')) {
|
|
468
|
+
fail(`android.appLinks pathPrefix "${link.pathPrefix}" must start with /`)
|
|
469
|
+
}
|
|
470
|
+
}
|
|
388
471
|
const adaptiveIcon = manifest.android.adaptiveIcon
|
|
389
472
|
if (
|
|
390
473
|
adaptiveIcon !== undefined &&
|
|
@@ -424,15 +507,28 @@ export function expoClientFromNativeApp(app: NativeAppManifest) {
|
|
|
424
507
|
backgroundColor: app.splash.backgroundColor,
|
|
425
508
|
imageWidth: app.splash.width,
|
|
426
509
|
resizeMode: app.splash.resizeMode,
|
|
510
|
+
dark: app.splash.dark && {
|
|
511
|
+
image: app.splash.dark.source,
|
|
512
|
+
backgroundColor: app.splash.dark.backgroundColor,
|
|
513
|
+
},
|
|
427
514
|
},
|
|
515
|
+
plugins: app.fonts?.length ? [['expo-font', { fonts: app.fonts }]] : undefined,
|
|
428
516
|
ios: app.ios && {
|
|
429
517
|
bundleIdentifier: app.ios.bundleId,
|
|
430
518
|
buildNumber: app.ios.buildNumber,
|
|
431
519
|
supportsTablet: app.ios.tablet,
|
|
520
|
+
associatedDomains: app.ios.associatedDomains,
|
|
521
|
+
usesAppleSignIn: app.ios.usesAppleSignIn,
|
|
522
|
+
googleServicesFile: app.ios.googleServicesFile,
|
|
523
|
+
infoPlist: app.ios.infoPlist,
|
|
524
|
+
entitlements: app.ios.entitlements,
|
|
432
525
|
},
|
|
433
526
|
android: app.android && {
|
|
434
527
|
package: app.android.applicationId,
|
|
435
528
|
versionCode: app.android.versionCode,
|
|
529
|
+
permissions: app.android.permissions,
|
|
530
|
+
blockedPermissions: app.android.blockedPermissions,
|
|
531
|
+
googleServicesFile: app.android.googleServicesFile,
|
|
436
532
|
adaptiveIcon: app.android.adaptiveIcon && {
|
|
437
533
|
foregroundImage: app.android.adaptiveIcon.foreground,
|
|
438
534
|
backgroundImage: app.android.adaptiveIcon.background,
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
export type PlistValue = string | number | boolean | PlistValue[] | {
|
|
2
|
+
[key: string]: PlistValue;
|
|
3
|
+
};
|
|
1
4
|
export interface NativeAppManifest {
|
|
2
5
|
name: string;
|
|
3
6
|
displayName?: string;
|
|
@@ -14,7 +17,12 @@ export interface NativeAppManifest {
|
|
|
14
17
|
backgroundColor: string;
|
|
15
18
|
width?: number;
|
|
16
19
|
resizeMode?: 'contain' | 'cover';
|
|
20
|
+
dark?: {
|
|
21
|
+
source?: string;
|
|
22
|
+
backgroundColor: string;
|
|
23
|
+
};
|
|
17
24
|
};
|
|
25
|
+
fonts?: string[];
|
|
18
26
|
imagePicker?: {
|
|
19
27
|
camera?: string;
|
|
20
28
|
};
|
|
@@ -58,6 +66,11 @@ export interface NativeAppManifest {
|
|
|
58
66
|
usesNonExemptEncryption?: boolean;
|
|
59
67
|
faceIdUsageDescription?: string;
|
|
60
68
|
fileSharing?: boolean;
|
|
69
|
+
associatedDomains?: string[];
|
|
70
|
+
usesAppleSignIn?: boolean;
|
|
71
|
+
googleServicesFile?: string;
|
|
72
|
+
infoPlist?: Record<string, PlistValue>;
|
|
73
|
+
entitlements?: Record<string, PlistValue>;
|
|
61
74
|
widgets?: {
|
|
62
75
|
appGroup: string;
|
|
63
76
|
kind: string;
|
|
@@ -76,6 +89,18 @@ export interface NativeAppManifest {
|
|
|
76
89
|
backgroundColor?: string;
|
|
77
90
|
monochrome?: string;
|
|
78
91
|
};
|
|
92
|
+
targetSdk?: number;
|
|
93
|
+
compileSdk?: number;
|
|
94
|
+
minify?: boolean;
|
|
95
|
+
shrinkResources?: boolean;
|
|
96
|
+
proguardRules?: string;
|
|
97
|
+
permissions?: string[];
|
|
98
|
+
blockedPermissions?: string[];
|
|
99
|
+
googleServicesFile?: string;
|
|
100
|
+
appLinks?: Array<{
|
|
101
|
+
host: string;
|
|
102
|
+
pathPrefix?: string;
|
|
103
|
+
}>;
|
|
79
104
|
googleMapsApiKey?: string;
|
|
80
105
|
};
|
|
81
106
|
}
|
|
@@ -93,15 +118,30 @@ export declare function expoClientFromNativeApp(app: NativeAppManifest): {
|
|
|
93
118
|
backgroundColor: string;
|
|
94
119
|
imageWidth: number | undefined;
|
|
95
120
|
resizeMode: "contain" | "cover" | undefined;
|
|
121
|
+
dark: {
|
|
122
|
+
image: string | undefined;
|
|
123
|
+
backgroundColor: string;
|
|
124
|
+
} | undefined;
|
|
96
125
|
} | undefined;
|
|
126
|
+
plugins: (string | {
|
|
127
|
+
fonts: string[];
|
|
128
|
+
})[][] | undefined;
|
|
97
129
|
ios: {
|
|
98
130
|
bundleIdentifier: string;
|
|
99
131
|
buildNumber: string | undefined;
|
|
100
132
|
supportsTablet: boolean | undefined;
|
|
133
|
+
associatedDomains: string[] | undefined;
|
|
134
|
+
usesAppleSignIn: boolean | undefined;
|
|
135
|
+
googleServicesFile: string | undefined;
|
|
136
|
+
infoPlist: Record<string, PlistValue> | undefined;
|
|
137
|
+
entitlements: Record<string, PlistValue> | undefined;
|
|
101
138
|
} | undefined;
|
|
102
139
|
android: {
|
|
103
140
|
package: string;
|
|
104
141
|
versionCode: number | undefined;
|
|
142
|
+
permissions: string[] | undefined;
|
|
143
|
+
blockedPermissions: string[] | undefined;
|
|
144
|
+
googleServicesFile: string | undefined;
|
|
105
145
|
adaptiveIcon: {
|
|
106
146
|
foregroundImage: string;
|
|
107
147
|
backgroundImage: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeAppManifest.d.ts","sourceRoot":"","sources":["../src/nativeAppManifest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nativeAppManifest.d.ts","sourceRoot":"","sources":["../src/nativeAppManifest.ts"],"names":[],"mappings":"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"}
|