@vxrn/utils 2.0.0-beta.66.1 → 2.0.0-beta.96.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 +34 -0
- package/dist/cjs/nativeAppManifest.native.cjs +36 -0
- package/dist/cjs/nativeAppManifest.native.js +36 -0
- package/dist/cjs/nativeAppManifest.native.js.map +1 -1
- package/dist/esm/nativeAppManifest.mjs +34 -0
- package/dist/esm/nativeAppManifest.mjs.map +1 -1
- package/dist/esm/nativeAppManifest.native.js +36 -0
- package/dist/esm/nativeAppManifest.native.js.map +1 -1
- package/package.json +4 -4
- package/src/nativeAppManifest.test.ts +82 -10
- package/src/nativeAppManifest.ts +70 -0
- package/types/nativeAppManifest.d.ts +16 -0
- package/types/nativeAppManifest.d.ts.map +1 -1
|
@@ -55,6 +55,11 @@ function validateNativeApp(manifest, platform) {
|
|
|
55
55
|
if (manifest.imagePicker?.camera !== void 0 && (typeof manifest.imagePicker.camera !== "string" || manifest.imagePicker.camera.trim() === "")) {
|
|
56
56
|
fail("imagePicker.camera must be a non-empty string");
|
|
57
57
|
}
|
|
58
|
+
if (manifest.notifications !== void 0) {
|
|
59
|
+
if (typeof manifest.notifications !== "object" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== "boolean") {
|
|
60
|
+
fail("notifications.push must be a boolean");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
58
63
|
if (!platform || platform === "ios") {
|
|
59
64
|
if (!manifest.ios?.bundleId || !REVERSE_DNS.test(manifest.ios.bundleId)) {
|
|
60
65
|
fail(`ios.bundleId "${manifest.ios?.bundleId}" must be reverse-dns`);
|
|
@@ -65,6 +70,32 @@ function validateNativeApp(manifest, platform) {
|
|
|
65
70
|
if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {
|
|
66
71
|
fail(`ios.buildNumber "${manifest.ios.buildNumber}" must contain only letters, digits, and dots`);
|
|
67
72
|
}
|
|
73
|
+
const widgets = manifest.ios.widgets;
|
|
74
|
+
if (widgets) {
|
|
75
|
+
if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {
|
|
76
|
+
fail("ios.widgets requires ios.deploymentTarget of 17.0 or newer");
|
|
77
|
+
}
|
|
78
|
+
if (!/^group\.[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {
|
|
79
|
+
fail("ios.widgets.appGroup must be a reverse-dns App Group beginning with group.");
|
|
80
|
+
}
|
|
81
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {
|
|
82
|
+
fail("ios.widgets.kind must be a non-empty WidgetKit kind");
|
|
83
|
+
}
|
|
84
|
+
if (!widgets.displayName?.trim() || !widgets.description?.trim()) {
|
|
85
|
+
fail("ios.widgets.displayName and description must be non-empty strings");
|
|
86
|
+
}
|
|
87
|
+
if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== "boolean") {
|
|
88
|
+
fail("ios.widgets.pushNotifications must be a boolean");
|
|
89
|
+
}
|
|
90
|
+
if (widgets.jsx) {
|
|
91
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {
|
|
92
|
+
fail("ios.widgets.jsx.id must contain only letters, digits, and underscore");
|
|
93
|
+
}
|
|
94
|
+
if (!widgets.jsx.displayName?.trim() || !widgets.jsx.description?.trim()) {
|
|
95
|
+
fail("ios.widgets.jsx requires displayName and description");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
68
99
|
}
|
|
69
100
|
if (!platform || platform === "android") {
|
|
70
101
|
if (!manifest.android?.applicationId || !REVERSE_DNS.test(manifest.android.applicationId)) {
|
|
@@ -76,6 +107,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
76
107
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
77
108
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
78
109
|
}
|
|
110
|
+
if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== "string" || manifest.android.googleMapsApiKey.trim() === "")) {
|
|
111
|
+
fail("android.googleMapsApiKey must be a non-empty string");
|
|
112
|
+
}
|
|
79
113
|
}
|
|
80
114
|
return manifest;
|
|
81
115
|
}
|
|
@@ -75,6 +75,11 @@ function validateNativeApp(manifest, platform) {
|
|
|
75
75
|
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() === "")) {
|
|
76
76
|
fail("imagePicker.camera must be a non-empty string");
|
|
77
77
|
}
|
|
78
|
+
if (manifest.notifications !== void 0) {
|
|
79
|
+
if (typeof manifest.notifications !== "object" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== "boolean") {
|
|
80
|
+
fail("notifications.push must be a boolean");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
78
83
|
if (!platform || platform === "ios") {
|
|
79
84
|
var _manifest_ios;
|
|
80
85
|
if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {
|
|
@@ -87,6 +92,34 @@ function validateNativeApp(manifest, platform) {
|
|
|
87
92
|
if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {
|
|
88
93
|
fail(`ios.buildNumber "${manifest.ios.buildNumber}" must contain only letters, digits, and dots`);
|
|
89
94
|
}
|
|
95
|
+
var widgets = manifest.ios.widgets;
|
|
96
|
+
if (widgets) {
|
|
97
|
+
var _widgets_displayName, _widgets_description;
|
|
98
|
+
if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {
|
|
99
|
+
fail("ios.widgets requires ios.deploymentTarget of 17.0 or newer");
|
|
100
|
+
}
|
|
101
|
+
if (!/^group\.[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {
|
|
102
|
+
fail("ios.widgets.appGroup must be a reverse-dns App Group beginning with group.");
|
|
103
|
+
}
|
|
104
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {
|
|
105
|
+
fail("ios.widgets.kind must be a non-empty WidgetKit kind");
|
|
106
|
+
}
|
|
107
|
+
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())) {
|
|
108
|
+
fail("ios.widgets.displayName and description must be non-empty strings");
|
|
109
|
+
}
|
|
110
|
+
if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== "boolean") {
|
|
111
|
+
fail("ios.widgets.pushNotifications must be a boolean");
|
|
112
|
+
}
|
|
113
|
+
if (widgets.jsx) {
|
|
114
|
+
var _widgets_jsx_displayName, _widgets_jsx_description;
|
|
115
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {
|
|
116
|
+
fail("ios.widgets.jsx.id must contain only letters, digits, and underscore");
|
|
117
|
+
}
|
|
118
|
+
if (!((_widgets_jsx_displayName = widgets.jsx.displayName) === null || _widgets_jsx_displayName === void 0 ? void 0 : _widgets_jsx_displayName.trim()) || !((_widgets_jsx_description = widgets.jsx.description) === null || _widgets_jsx_description === void 0 ? void 0 : _widgets_jsx_description.trim())) {
|
|
119
|
+
fail("ios.widgets.jsx requires displayName and description");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
90
123
|
}
|
|
91
124
|
if (!platform || platform === "android") {
|
|
92
125
|
var _manifest_android;
|
|
@@ -100,6 +133,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
100
133
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
101
134
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
102
135
|
}
|
|
136
|
+
if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== "string" || manifest.android.googleMapsApiKey.trim() === "")) {
|
|
137
|
+
fail("android.googleMapsApiKey must be a non-empty string");
|
|
138
|
+
}
|
|
103
139
|
}
|
|
104
140
|
return manifest;
|
|
105
141
|
}
|
|
@@ -75,6 +75,11 @@ function validateNativeApp(manifest, platform) {
|
|
|
75
75
|
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() === "")) {
|
|
76
76
|
fail("imagePicker.camera must be a non-empty string");
|
|
77
77
|
}
|
|
78
|
+
if (manifest.notifications !== void 0) {
|
|
79
|
+
if (typeof manifest.notifications !== "object" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== "boolean") {
|
|
80
|
+
fail("notifications.push must be a boolean");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
78
83
|
if (!platform || platform === "ios") {
|
|
79
84
|
var _manifest_ios;
|
|
80
85
|
if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {
|
|
@@ -87,6 +92,34 @@ function validateNativeApp(manifest, platform) {
|
|
|
87
92
|
if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {
|
|
88
93
|
fail(`ios.buildNumber "${manifest.ios.buildNumber}" must contain only letters, digits, and dots`);
|
|
89
94
|
}
|
|
95
|
+
var widgets = manifest.ios.widgets;
|
|
96
|
+
if (widgets) {
|
|
97
|
+
var _widgets_displayName, _widgets_description;
|
|
98
|
+
if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {
|
|
99
|
+
fail("ios.widgets requires ios.deploymentTarget of 17.0 or newer");
|
|
100
|
+
}
|
|
101
|
+
if (!/^group\.[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {
|
|
102
|
+
fail("ios.widgets.appGroup must be a reverse-dns App Group beginning with group.");
|
|
103
|
+
}
|
|
104
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {
|
|
105
|
+
fail("ios.widgets.kind must be a non-empty WidgetKit kind");
|
|
106
|
+
}
|
|
107
|
+
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())) {
|
|
108
|
+
fail("ios.widgets.displayName and description must be non-empty strings");
|
|
109
|
+
}
|
|
110
|
+
if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== "boolean") {
|
|
111
|
+
fail("ios.widgets.pushNotifications must be a boolean");
|
|
112
|
+
}
|
|
113
|
+
if (widgets.jsx) {
|
|
114
|
+
var _widgets_jsx_displayName, _widgets_jsx_description;
|
|
115
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {
|
|
116
|
+
fail("ios.widgets.jsx.id must contain only letters, digits, and underscore");
|
|
117
|
+
}
|
|
118
|
+
if (!((_widgets_jsx_displayName = widgets.jsx.displayName) === null || _widgets_jsx_displayName === void 0 ? void 0 : _widgets_jsx_displayName.trim()) || !((_widgets_jsx_description = widgets.jsx.description) === null || _widgets_jsx_description === void 0 ? void 0 : _widgets_jsx_description.trim())) {
|
|
119
|
+
fail("ios.widgets.jsx requires displayName and description");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
90
123
|
}
|
|
91
124
|
if (!platform || platform === "android") {
|
|
92
125
|
var _manifest_android;
|
|
@@ -100,6 +133,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
100
133
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
101
134
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
102
135
|
}
|
|
136
|
+
if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== "string" || manifest.android.googleMapsApiKey.trim() === "")) {
|
|
137
|
+
fail("android.googleMapsApiKey must be a non-empty string");
|
|
138
|
+
}
|
|
103
139
|
}
|
|
104
140
|
return manifest;
|
|
105
141
|
}
|
|
@@ -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 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;\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_imagePicker;\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.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_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 (!platform || platform === \"ios\") {\n var _manifest_ios;\n if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios1;\n fail(`ios.bundleId \"${(_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.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 }\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 }\n return manifest;\n}\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
|
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 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;\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_imagePicker;\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.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_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.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 (!platform || platform === \"ios\") {\n var _manifest_ios;\n if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios1;\n fail(`ios.bundleId \"${(_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.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 if (widgets.jsx) {\n var _widgets_jsx_displayName, _widgets_jsx_description;\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {\n fail(\"ios.widgets.jsx.id must contain only letters, digits, and underscore\");\n }\n if (!((_widgets_jsx_displayName = widgets.jsx.displayName) === null || _widgets_jsx_displayName === void 0 ? void 0 : _widgets_jsx_displayName.trim()) || !((_widgets_jsx_description = widgets.jsx.description) === null || _widgets_jsx_description === void 0 ? void 0 : _widgets_jsx_description.trim())) {\n fail(\"ios.widgets.jsx requires displayName and description\");\n }\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 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}\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
|
@@ -32,6 +32,11 @@ function validateNativeApp(manifest, platform) {
|
|
|
32
32
|
if (manifest.imagePicker?.camera !== void 0 && (typeof manifest.imagePicker.camera !== "string" || manifest.imagePicker.camera.trim() === "")) {
|
|
33
33
|
fail("imagePicker.camera must be a non-empty string");
|
|
34
34
|
}
|
|
35
|
+
if (manifest.notifications !== void 0) {
|
|
36
|
+
if (typeof manifest.notifications !== "object" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== "boolean") {
|
|
37
|
+
fail("notifications.push must be a boolean");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
35
40
|
if (!platform || platform === "ios") {
|
|
36
41
|
if (!manifest.ios?.bundleId || !REVERSE_DNS.test(manifest.ios.bundleId)) {
|
|
37
42
|
fail(`ios.bundleId "${manifest.ios?.bundleId}" must be reverse-dns`);
|
|
@@ -42,6 +47,32 @@ function validateNativeApp(manifest, platform) {
|
|
|
42
47
|
if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {
|
|
43
48
|
fail(`ios.buildNumber "${manifest.ios.buildNumber}" must contain only letters, digits, and dots`);
|
|
44
49
|
}
|
|
50
|
+
const widgets = manifest.ios.widgets;
|
|
51
|
+
if (widgets) {
|
|
52
|
+
if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {
|
|
53
|
+
fail("ios.widgets requires ios.deploymentTarget of 17.0 or newer");
|
|
54
|
+
}
|
|
55
|
+
if (!/^group\.[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {
|
|
56
|
+
fail("ios.widgets.appGroup must be a reverse-dns App Group beginning with group.");
|
|
57
|
+
}
|
|
58
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {
|
|
59
|
+
fail("ios.widgets.kind must be a non-empty WidgetKit kind");
|
|
60
|
+
}
|
|
61
|
+
if (!widgets.displayName?.trim() || !widgets.description?.trim()) {
|
|
62
|
+
fail("ios.widgets.displayName and description must be non-empty strings");
|
|
63
|
+
}
|
|
64
|
+
if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== "boolean") {
|
|
65
|
+
fail("ios.widgets.pushNotifications must be a boolean");
|
|
66
|
+
}
|
|
67
|
+
if (widgets.jsx) {
|
|
68
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {
|
|
69
|
+
fail("ios.widgets.jsx.id must contain only letters, digits, and underscore");
|
|
70
|
+
}
|
|
71
|
+
if (!widgets.jsx.displayName?.trim() || !widgets.jsx.description?.trim()) {
|
|
72
|
+
fail("ios.widgets.jsx requires displayName and description");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
45
76
|
}
|
|
46
77
|
if (!platform || platform === "android") {
|
|
47
78
|
if (!manifest.android?.applicationId || !REVERSE_DNS.test(manifest.android.applicationId)) {
|
|
@@ -53,6 +84,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
53
84
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
54
85
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
55
86
|
}
|
|
87
|
+
if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== "string" || manifest.android.googleMapsApiKey.trim() === "")) {
|
|
88
|
+
fail("android.googleMapsApiKey must be a non-empty string");
|
|
89
|
+
}
|
|
56
90
|
}
|
|
57
91
|
return manifest;
|
|
58
92
|
}
|
|
@@ -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;\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.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.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 (!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 }\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 }\n return manifest;\n}\nexport {\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,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,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,aAAa,WAAW,KAAK,MAAM,OAAO,SAAS,YAAY,WAAW,YAAY,SAAS,YAAY,OAAO,KAAK,MAAM,KAAK;EAC7I,KAAK,+CAA+C;CACtD;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;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;CACF;CACA,OAAO;AACT"}
|
|
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;\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.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.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.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 (!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 if (widgets.jsx) {\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {\n fail(\"ios.widgets.jsx.id must contain only letters, digits, and underscore\");\n }\n if (!widgets.jsx.displayName?.trim() || !widgets.jsx.description?.trim()) {\n fail(\"ios.widgets.jsx requires displayName and description\");\n }\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 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}\nexport {\n validateNativeApp\n};\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":"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"}
|
|
@@ -50,6 +50,11 @@ function validateNativeApp(manifest, platform) {
|
|
|
50
50
|
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() === "")) {
|
|
51
51
|
fail("imagePicker.camera must be a non-empty string");
|
|
52
52
|
}
|
|
53
|
+
if (manifest.notifications !== void 0) {
|
|
54
|
+
if (typeof manifest.notifications !== "object" || manifest.notifications.push !== void 0 && typeof manifest.notifications.push !== "boolean") {
|
|
55
|
+
fail("notifications.push must be a boolean");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
53
58
|
if (!platform || platform === "ios") {
|
|
54
59
|
var _manifest_ios;
|
|
55
60
|
if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {
|
|
@@ -62,6 +67,34 @@ function validateNativeApp(manifest, platform) {
|
|
|
62
67
|
if (manifest.ios.buildNumber !== void 0 && !BUILD_NUMBER.test(manifest.ios.buildNumber)) {
|
|
63
68
|
fail(`ios.buildNumber "${manifest.ios.buildNumber}" must contain only letters, digits, and dots`);
|
|
64
69
|
}
|
|
70
|
+
var widgets = manifest.ios.widgets;
|
|
71
|
+
if (widgets) {
|
|
72
|
+
var _widgets_displayName, _widgets_description;
|
|
73
|
+
if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {
|
|
74
|
+
fail("ios.widgets requires ios.deploymentTarget of 17.0 or newer");
|
|
75
|
+
}
|
|
76
|
+
if (!/^group\.[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)) {
|
|
77
|
+
fail("ios.widgets.appGroup must be a reverse-dns App Group beginning with group.");
|
|
78
|
+
}
|
|
79
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {
|
|
80
|
+
fail("ios.widgets.kind must be a non-empty WidgetKit kind");
|
|
81
|
+
}
|
|
82
|
+
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())) {
|
|
83
|
+
fail("ios.widgets.displayName and description must be non-empty strings");
|
|
84
|
+
}
|
|
85
|
+
if (widgets.pushNotifications !== void 0 && typeof widgets.pushNotifications !== "boolean") {
|
|
86
|
+
fail("ios.widgets.pushNotifications must be a boolean");
|
|
87
|
+
}
|
|
88
|
+
if (widgets.jsx) {
|
|
89
|
+
var _widgets_jsx_displayName, _widgets_jsx_description;
|
|
90
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {
|
|
91
|
+
fail("ios.widgets.jsx.id must contain only letters, digits, and underscore");
|
|
92
|
+
}
|
|
93
|
+
if (!((_widgets_jsx_displayName = widgets.jsx.displayName) === null || _widgets_jsx_displayName === void 0 ? void 0 : _widgets_jsx_displayName.trim()) || !((_widgets_jsx_description = widgets.jsx.description) === null || _widgets_jsx_description === void 0 ? void 0 : _widgets_jsx_description.trim())) {
|
|
94
|
+
fail("ios.widgets.jsx requires displayName and description");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
65
98
|
}
|
|
66
99
|
if (!platform || platform === "android") {
|
|
67
100
|
var _manifest_android;
|
|
@@ -75,6 +108,9 @@ function validateNativeApp(manifest, platform) {
|
|
|
75
108
|
if (manifest.android.versionCode !== void 0 && (!Number.isInteger(manifest.android.versionCode) || manifest.android.versionCode < 1)) {
|
|
76
109
|
fail(`android.versionCode "${manifest.android.versionCode}" must be a positive integer`);
|
|
77
110
|
}
|
|
111
|
+
if (manifest.android.googleMapsApiKey !== void 0 && (typeof manifest.android.googleMapsApiKey !== "string" || manifest.android.googleMapsApiKey.trim() === "")) {
|
|
112
|
+
fail("android.googleMapsApiKey must be a non-empty string");
|
|
113
|
+
}
|
|
78
114
|
}
|
|
79
115
|
return manifest;
|
|
80
116
|
}
|
|
@@ -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;\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_imagePicker;\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.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_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 (!platform || platform === \"ios\") {\n var _manifest_ios;\n if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios1;\n fail(`ios.bundleId \"${(_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.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 }\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 }\n return manifest;\n}\nexport {\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;\nfunction fail(message) {\n throw new Error(`[one] invalid native.app: ${message}`);\n}\nfunction validateNativeApp(manifest, platform) {\n var _manifest_imagePicker;\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.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_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.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 (!platform || platform === \"ios\") {\n var _manifest_ios;\n if (!((_manifest_ios = manifest.ios) === null || _manifest_ios === void 0 ? void 0 : _manifest_ios.bundleId) || !REVERSE_DNS.test(manifest.ios.bundleId)) {\n var _manifest_ios1;\n fail(`ios.bundleId \"${(_manifest_ios1 = manifest.ios) === null || _manifest_ios1 === void 0 ? void 0 : _manifest_ios1.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 if (widgets.jsx) {\n var _widgets_jsx_displayName, _widgets_jsx_description;\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {\n fail(\"ios.widgets.jsx.id must contain only letters, digits, and underscore\");\n }\n if (!((_widgets_jsx_displayName = widgets.jsx.displayName) === null || _widgets_jsx_displayName === void 0 ? void 0 : _widgets_jsx_displayName.trim()) || !((_widgets_jsx_description = widgets.jsx.description) === null || _widgets_jsx_description === void 0 ? void 0 : _widgets_jsx_description.trim())) {\n fail(\"ios.widgets.jsx requires displayName and description\");\n }\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 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}\nexport {\n validateNativeApp\n};\n//# sourceMappingURL=nativeAppManifest.js.map\n"],"mappings":";AAAA,IAAI,cAAc;AAClB,IAAI,SAAS;AACb,IAAI,UAAU;AACd,IAAI,eAAe;AACnB,IAAI,cAAc;AAClB,IAAI,oBAAoB;AACxB,IAAI,YAAY;AAChB,SAAS,KAAK,SAAS;CACrB,MAAM,IAAI,MAAM,6BAA6B,SAAS;AACxD;AACA,SAAS,kBAAkB,UAAU,UAAU;CAC7C,IAAI;CACJ,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,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,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,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,CAAC,YAAY,aAAa,OAAO;EACnC,IAAI;EACJ,IAAI,GAAG,gBAAgB,SAAS,SAAS,QAAQ,kBAAkB,KAAK,IAAI,KAAK,IAAI,cAAc,aAAa,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,GAAG;GACxJ,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;GACA,IAAI,QAAQ,KAAK;IACf,IAAI,0BAA0B;IAC9B,IAAI,CAAC,0BAA0B,KAAK,QAAQ,IAAI,EAAE,GAAG;KACnD,KAAK,sEAAsE;IAC7E;IACA,IAAI,GAAG,2BAA2B,QAAQ,IAAI,iBAAiB,QAAQ,6BAA6B,KAAK,IAAI,KAAK,IAAI,yBAAyB,KAAK,MAAM,GAAG,2BAA2B,QAAQ,IAAI,iBAAiB,QAAQ,6BAA6B,KAAK,IAAI,KAAK,IAAI,yBAAyB,KAAK,IAAI;KAC5S,KAAK,sDAAsD;IAC7D;GACF;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,SAAS,QAAQ,qBAAqB,KAAK,MAAM,OAAO,SAAS,QAAQ,qBAAqB,YAAY,SAAS,QAAQ,iBAAiB,KAAK,MAAM,KAAK;GAC9J,KAAK,qDAAqD;EAC5D;CACF;CACA,OAAO;AACT"}
|
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.96.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
@@ -41,12 +41,12 @@
|
|
|
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.96.1",
|
|
45
|
+
"@vxrn/resolve": "2.0.0-beta.96.1",
|
|
46
46
|
"ws": "^8.21.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@tamagui/build": "3.0.0-beta.
|
|
49
|
+
"@tamagui/build": "3.0.0-beta.1432.1",
|
|
50
50
|
"@types/ws": "^8.18.1",
|
|
51
51
|
"vitest": "^4.1.0"
|
|
52
52
|
},
|
|
@@ -31,9 +31,7 @@ describe('native.app manifest', () => {
|
|
|
31
31
|
test('rejects invalid target names and schemes', () => {
|
|
32
32
|
expect(() => validateNativeApp({} as any)).toThrow(/name/)
|
|
33
33
|
expect(() => validateNativeApp({ name: 'my-app' } as any)).toThrow(/name/)
|
|
34
|
-
expect(() => validateNativeApp({ ...app, scheme: 'not a scheme' })).toThrow(
|
|
35
|
-
/scheme/
|
|
36
|
-
)
|
|
34
|
+
expect(() => validateNativeApp({ ...app, scheme: 'not a scheme' })).toThrow(/scheme/)
|
|
37
35
|
})
|
|
38
36
|
|
|
39
37
|
test('rejects bad versions, icons, and splashes', () => {
|
|
@@ -66,12 +64,52 @@ describe('native.app manifest', () => {
|
|
|
66
64
|
|
|
67
65
|
test('accepts a camera permission string and rejects empty ones', () => {
|
|
68
66
|
expect(() => validateNativeApp({ ...app, imagePicker: undefined })).not.toThrow()
|
|
67
|
+
expect(() => validateNativeApp({ ...app, imagePicker: { camera: '' } })).toThrow(
|
|
68
|
+
/imagePicker\.camera/
|
|
69
|
+
)
|
|
70
|
+
expect(() => validateNativeApp({ ...app, imagePicker: { camera: ' ' } })).toThrow(
|
|
71
|
+
/imagePicker\.camera/
|
|
72
|
+
)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
test('validates the iOS widget target and App Group before prebuild', () => {
|
|
76
|
+
const widgets = {
|
|
77
|
+
appGroup: 'group.dev.one.myapp',
|
|
78
|
+
kind: 'MyAppStatus',
|
|
79
|
+
displayName: 'Status',
|
|
80
|
+
description: 'Current status',
|
|
81
|
+
jsx: { id: 'status_jsx', displayName: 'JSX status', description: 'Current status' },
|
|
82
|
+
}
|
|
83
|
+
expect(() =>
|
|
84
|
+
validateNativeApp({ ...app, ios: { ...app.ios, widgets } })
|
|
85
|
+
).not.toThrow()
|
|
69
86
|
expect(() =>
|
|
70
|
-
validateNativeApp({
|
|
71
|
-
|
|
87
|
+
validateNativeApp({
|
|
88
|
+
...app,
|
|
89
|
+
ios: { ...app.ios, widgets: { ...widgets, pushNotifications: 'yes' as any } },
|
|
90
|
+
})
|
|
91
|
+
).toThrow(/pushNotifications/)
|
|
72
92
|
expect(() =>
|
|
73
|
-
validateNativeApp({
|
|
74
|
-
|
|
93
|
+
validateNativeApp({
|
|
94
|
+
...app,
|
|
95
|
+
ios: { ...app.ios, deploymentTarget: '16.4', widgets },
|
|
96
|
+
})
|
|
97
|
+
).toThrow(/deploymentTarget/)
|
|
98
|
+
expect(() =>
|
|
99
|
+
validateNativeApp({
|
|
100
|
+
...app,
|
|
101
|
+
ios: { ...app.ios, widgets: { ...widgets, appGroup: 'dev.one.myapp' } },
|
|
102
|
+
})
|
|
103
|
+
).toThrow(/appGroup/)
|
|
104
|
+
expect(() =>
|
|
105
|
+
validateNativeApp({
|
|
106
|
+
...app,
|
|
107
|
+
ios: {
|
|
108
|
+
...app.ios,
|
|
109
|
+
widgets: { ...widgets, jsx: { ...widgets.jsx, id: 'bad id' } },
|
|
110
|
+
},
|
|
111
|
+
})
|
|
112
|
+
).toThrow(/jsx.id/)
|
|
75
113
|
})
|
|
76
114
|
|
|
77
115
|
test('rejects missing platform ids and out-of-range platform values', () => {
|
|
@@ -86,9 +124,9 @@ describe('native.app manifest', () => {
|
|
|
86
124
|
android: app.android,
|
|
87
125
|
} as any)
|
|
88
126
|
).toThrow(/bundleId/)
|
|
89
|
-
expect(() =>
|
|
90
|
-
|
|
91
|
-
)
|
|
127
|
+
expect(() => validateNativeApp({ name: 'MyApp', ios: app.ios } as any)).toThrow(
|
|
128
|
+
/applicationId/
|
|
129
|
+
)
|
|
92
130
|
expect(() =>
|
|
93
131
|
validateNativeApp({
|
|
94
132
|
name: 'MyApp',
|
|
@@ -131,6 +169,40 @@ describe('native.app manifest', () => {
|
|
|
131
169
|
).toThrow(/versionCode/)
|
|
132
170
|
})
|
|
133
171
|
|
|
172
|
+
test('accepts notifications and rejects a non-boolean push', () => {
|
|
173
|
+
expect(() => validateNativeApp({ ...app, notifications: undefined })).not.toThrow()
|
|
174
|
+
expect(() =>
|
|
175
|
+
validateNativeApp({ ...app, notifications: { push: true } })
|
|
176
|
+
).not.toThrow()
|
|
177
|
+
expect(() =>
|
|
178
|
+
validateNativeApp({ ...app, notifications: { push: 'yes' } } as any)
|
|
179
|
+
).toThrow(/notifications\.push/)
|
|
180
|
+
expect(() => validateNativeApp({ ...app, notifications: true } as any)).toThrow(
|
|
181
|
+
/notifications\.push/
|
|
182
|
+
)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
test('accepts a maps key and rejects empty ones', () => {
|
|
186
|
+
expect(() =>
|
|
187
|
+
validateNativeApp({
|
|
188
|
+
...app,
|
|
189
|
+
android: { ...app.android, googleMapsApiKey: 'AIza-test' },
|
|
190
|
+
})
|
|
191
|
+
).not.toThrow()
|
|
192
|
+
expect(() =>
|
|
193
|
+
validateNativeApp({
|
|
194
|
+
...app,
|
|
195
|
+
android: { ...app.android, googleMapsApiKey: '' },
|
|
196
|
+
})
|
|
197
|
+
).toThrow(/googleMapsApiKey/)
|
|
198
|
+
expect(() =>
|
|
199
|
+
validateNativeApp({
|
|
200
|
+
...app,
|
|
201
|
+
android: { ...app.android, googleMapsApiKey: ' ' },
|
|
202
|
+
})
|
|
203
|
+
).toThrow(/googleMapsApiKey/)
|
|
204
|
+
})
|
|
205
|
+
|
|
134
206
|
test('platform scope skips the other platform requirement', () => {
|
|
135
207
|
expect(() =>
|
|
136
208
|
validateNativeApp({ name: 'MyApp', android: app.android } as any, 'android')
|
package/src/nativeAppManifest.ts
CHANGED
|
@@ -22,6 +22,13 @@ export interface NativeAppManifest {
|
|
|
22
22
|
// One.ImagePicker.launchCamera.
|
|
23
23
|
camera?: string
|
|
24
24
|
}
|
|
25
|
+
// present when the app uses local notifications. prebuild stamps the
|
|
26
|
+
// android notification permissions and receiver plus the ios delegate gate.
|
|
27
|
+
// push opts into remote push: the fcm source set and the aps-environment
|
|
28
|
+
// entitlement. without it firebase stays out of the app entirely.
|
|
29
|
+
notifications?: {
|
|
30
|
+
push?: boolean
|
|
31
|
+
}
|
|
25
32
|
ios?: {
|
|
26
33
|
bundleId: string
|
|
27
34
|
buildNumber?: string
|
|
@@ -33,6 +40,18 @@ export interface NativeAppManifest {
|
|
|
33
40
|
usesNonExemptEncryption?: boolean
|
|
34
41
|
// exposes the app's Documents in the Files app and document pickers.
|
|
35
42
|
fileSharing?: boolean
|
|
43
|
+
widgets?: {
|
|
44
|
+
appGroup: string
|
|
45
|
+
kind: string
|
|
46
|
+
displayName: string
|
|
47
|
+
description: string
|
|
48
|
+
pushNotifications?: boolean
|
|
49
|
+
jsx?: {
|
|
50
|
+
id: string
|
|
51
|
+
displayName: string
|
|
52
|
+
description: string
|
|
53
|
+
}
|
|
54
|
+
}
|
|
36
55
|
}
|
|
37
56
|
android?: {
|
|
38
57
|
applicationId: string
|
|
@@ -42,6 +61,10 @@ export interface NativeAppManifest {
|
|
|
42
61
|
foreground?: string
|
|
43
62
|
background?: string
|
|
44
63
|
}
|
|
64
|
+
// google maps api key for One.UI.Map. setting it compiles the maps sdk
|
|
65
|
+
// into the app and stamps the key meta-data; without it the maps source
|
|
66
|
+
// set stays out and mounting One.UI.Map throws.
|
|
67
|
+
googleMapsApiKey?: string
|
|
45
68
|
}
|
|
46
69
|
}
|
|
47
70
|
|
|
@@ -111,6 +134,15 @@ export function validateNativeApp(
|
|
|
111
134
|
) {
|
|
112
135
|
fail('imagePicker.camera must be a non-empty string')
|
|
113
136
|
}
|
|
137
|
+
if (manifest.notifications !== undefined) {
|
|
138
|
+
if (
|
|
139
|
+
typeof manifest.notifications !== 'object' ||
|
|
140
|
+
(manifest.notifications.push !== undefined &&
|
|
141
|
+
typeof manifest.notifications.push !== 'boolean')
|
|
142
|
+
) {
|
|
143
|
+
fail('notifications.push must be a boolean')
|
|
144
|
+
}
|
|
145
|
+
}
|
|
114
146
|
if (!platform || platform === 'ios') {
|
|
115
147
|
if (!manifest.ios?.bundleId || !REVERSE_DNS.test(manifest.ios.bundleId)) {
|
|
116
148
|
fail(`ios.bundleId "${manifest.ios?.bundleId}" must be reverse-dns`)
|
|
@@ -131,6 +163,37 @@ export function validateNativeApp(
|
|
|
131
163
|
`ios.buildNumber "${manifest.ios.buildNumber}" must contain only letters, digits, and dots`
|
|
132
164
|
)
|
|
133
165
|
}
|
|
166
|
+
const widgets = manifest.ios.widgets
|
|
167
|
+
if (widgets) {
|
|
168
|
+
if (!manifest.ios.deploymentTarget || Number(manifest.ios.deploymentTarget) < 17) {
|
|
169
|
+
fail('ios.widgets requires ios.deploymentTarget of 17.0 or newer')
|
|
170
|
+
}
|
|
171
|
+
if (
|
|
172
|
+
!/^group\.[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z][A-Za-z0-9-]*)+$/.test(widgets.appGroup)
|
|
173
|
+
) {
|
|
174
|
+
fail('ios.widgets.appGroup must be a reverse-dns App Group beginning with group.')
|
|
175
|
+
}
|
|
176
|
+
if (!/^[A-Za-z][A-Za-z0-9._-]*$/.test(widgets.kind)) {
|
|
177
|
+
fail('ios.widgets.kind must be a non-empty WidgetKit kind')
|
|
178
|
+
}
|
|
179
|
+
if (!widgets.displayName?.trim() || !widgets.description?.trim()) {
|
|
180
|
+
fail('ios.widgets.displayName and description must be non-empty strings')
|
|
181
|
+
}
|
|
182
|
+
if (
|
|
183
|
+
widgets.pushNotifications !== undefined &&
|
|
184
|
+
typeof widgets.pushNotifications !== 'boolean'
|
|
185
|
+
) {
|
|
186
|
+
fail('ios.widgets.pushNotifications must be a boolean')
|
|
187
|
+
}
|
|
188
|
+
if (widgets.jsx) {
|
|
189
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(widgets.jsx.id)) {
|
|
190
|
+
fail('ios.widgets.jsx.id must contain only letters, digits, and underscore')
|
|
191
|
+
}
|
|
192
|
+
if (!widgets.jsx.displayName?.trim() || !widgets.jsx.description?.trim()) {
|
|
193
|
+
fail('ios.widgets.jsx requires displayName and description')
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
134
197
|
}
|
|
135
198
|
if (!platform || platform === 'android') {
|
|
136
199
|
if (
|
|
@@ -158,6 +221,13 @@ export function validateNativeApp(
|
|
|
158
221
|
`android.versionCode "${manifest.android.versionCode}" must be a positive integer`
|
|
159
222
|
)
|
|
160
223
|
}
|
|
224
|
+
if (
|
|
225
|
+
manifest.android.googleMapsApiKey !== undefined &&
|
|
226
|
+
(typeof manifest.android.googleMapsApiKey !== 'string' ||
|
|
227
|
+
manifest.android.googleMapsApiKey.trim() === '')
|
|
228
|
+
) {
|
|
229
|
+
fail('android.googleMapsApiKey must be a non-empty string')
|
|
230
|
+
}
|
|
161
231
|
}
|
|
162
232
|
return manifest
|
|
163
233
|
}
|
|
@@ -15,6 +15,9 @@ export interface NativeAppManifest {
|
|
|
15
15
|
imagePicker?: {
|
|
16
16
|
camera?: string;
|
|
17
17
|
};
|
|
18
|
+
notifications?: {
|
|
19
|
+
push?: boolean;
|
|
20
|
+
};
|
|
18
21
|
ios?: {
|
|
19
22
|
bundleId: string;
|
|
20
23
|
buildNumber?: string;
|
|
@@ -25,6 +28,18 @@ export interface NativeAppManifest {
|
|
|
25
28
|
ccache?: boolean;
|
|
26
29
|
usesNonExemptEncryption?: boolean;
|
|
27
30
|
fileSharing?: boolean;
|
|
31
|
+
widgets?: {
|
|
32
|
+
appGroup: string;
|
|
33
|
+
kind: string;
|
|
34
|
+
displayName: string;
|
|
35
|
+
description: string;
|
|
36
|
+
pushNotifications?: boolean;
|
|
37
|
+
jsx?: {
|
|
38
|
+
id: string;
|
|
39
|
+
displayName: string;
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
28
43
|
};
|
|
29
44
|
android?: {
|
|
30
45
|
applicationId: string;
|
|
@@ -34,6 +49,7 @@ export interface NativeAppManifest {
|
|
|
34
49
|
foreground?: string;
|
|
35
50
|
background?: string;
|
|
36
51
|
};
|
|
52
|
+
googleMapsApiKey?: string;
|
|
37
53
|
};
|
|
38
54
|
}
|
|
39
55
|
export declare function validateNativeApp(manifest: NativeAppManifest, platform?: 'ios' | 'android' | string): NativeAppManifest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeAppManifest.d.ts","sourceRoot":"","sources":["../src/nativeAppManifest.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,MAAM,CAAA;QACvB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,WAAW,CAAC,EAAE;QAIZ,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,GAAG,CAAC,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,aAAa,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;QACpC,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,uBAAuB,CAAC,EAAE,OAAO,CAAA;QAEjC,WAAW,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"nativeAppManifest.d.ts","sourceRoot":"","sources":["../src/nativeAppManifest.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,MAAM,CAAA;QACvB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,WAAW,CAAC,EAAE;QAIZ,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IAKD,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;IACD,GAAG,CAAC,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,aAAa,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;QACpC,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,uBAAuB,CAAC,EAAE,OAAO,CAAA;QAEjC,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,OAAO,CAAC,EAAE;YACR,QAAQ,EAAE,MAAM,CAAA;YAChB,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,EAAE,MAAM,CAAA;YACnB,WAAW,EAAE,MAAM,CAAA;YACnB,iBAAiB,CAAC,EAAE,OAAO,CAAA;YAC3B,GAAG,CAAC,EAAE;gBACJ,EAAE,EAAE,MAAM,CAAA;gBACV,WAAW,EAAE,MAAM,CAAA;gBACnB,WAAW,EAAE,MAAM,CAAA;aACpB,CAAA;SACF,CAAA;KACF,CAAA;IACD,OAAO,CAAC,EAAE;QACR,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE;YACb,UAAU,CAAC,EAAE,MAAM,CAAA;YACnB,UAAU,CAAC,EAAE,MAAM,CAAA;SACpB,CAAA;QAID,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAA;CACF;AAiBD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,GACpC,iBAAiB,CAgJnB"}
|