@htyf-mp/cli 0.2.6 → 0.2.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htyf-mp/cli",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "红糖云服app小程序模板-cli",
5
5
  "type": "module",
6
6
  "bin": {
package/src/build.mjs CHANGED
@@ -275,10 +275,10 @@ export async function mpBuildShell(newAppInfo, isGodot = false) {
275
275
 
276
276
  // Godot 项目使用平台特定的文件名(如 dist.ios.dgz 或 dist.android.dgz)
277
277
  const platformName = godotOptions.platform === 'ios' ? 'ios' : 'android';
278
- distPackagePath = path.join(mpOutputPath, `dist.${platformName}.dgz`);
278
+ distPackagePath = path.join(mpOutputPath, `dist.[PLATFORM].dgz`);
279
279
 
280
280
  // 更新 app.json 中的 zipUrl
281
- appJson.zipUrl = newAppInfo.zipUrl || `${newAppInfo.host}/dist.${platformName}.dgz`;
281
+ appJson.zipUrl = newAppInfo.zipUrl || `${newAppInfo.host}/dist.[PLATFORM].dgz`;
282
282
  await fse.writeJson(appJsonPath, appJson, { spaces: 2 });
283
283
  }
284
284
 
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import path from 'node:path';
11
- import { pathToFileURL } from 'node:url';
11
+ import { pathToFileURL, fileURLToPath } from 'node:url';
12
12
  import { accessSync, constants as fsConstants } from 'node:fs';
13
13
  import process from 'node:process';
14
14
  import { homedir } from 'node:os';
@@ -40,6 +40,199 @@ const PRESET_NAMES = {
40
40
  [PLATFORMS.ANDROID]: 'Android'
41
41
  };
42
42
 
43
+ /** 模板 export_presets.cfg 文件路径 */
44
+ const TEMPLATE_EXPORT_PRESETS_PATH = path.join(
45
+ path.dirname(fileURLToPath(import.meta.url)),
46
+ 'export_presets.cfg'
47
+ );
48
+
49
+ /**
50
+ * 查找 Godot 项目根目录(包含 project.godot 的目录)
51
+ *
52
+ * @param {string} projectDir - 项目目录
53
+ * @returns {string|null} 项目根目录,如果未找到则返回 null
54
+ */
55
+ function findGodotProjectRoot(projectDir) {
56
+ let currentDir = path.resolve(projectDir);
57
+
58
+ // 向上查找,直到找到包含 project.godot 的目录
59
+ while (currentDir !== path.dirname(currentDir)) {
60
+ const projectFile = path.join(currentDir, 'project.godot');
61
+ if (fs.existsSync(projectFile)) {
62
+ return currentDir;
63
+ }
64
+ currentDir = path.dirname(currentDir);
65
+ }
66
+
67
+ return null;
68
+ }
69
+
70
+ /**
71
+ * 解析 export_presets.cfg 文件,检查是否包含指定平台的配置
72
+ *
73
+ * @param {string} content - 文件内容
74
+ * @returns {object} 包含 hasAndroid 和 hasIos 的对象
75
+ */
76
+ function parseExportPresets(content) {
77
+ const hasAndroid = /platform\s*=\s*"Android"/i.test(content);
78
+ const hasIos = /platform\s*=\s*"iOS"/i.test(content);
79
+ return { hasAndroid, hasIos };
80
+ }
81
+
82
+ /**
83
+ * 从模板文件中提取指定平台的预设配置
84
+ *
85
+ * @param {string} templateContent - 模板文件内容
86
+ * @param {string} platform - 平台名称('Android' 或 'iOS')
87
+ * @returns {string} 预设配置内容
88
+ */
89
+ function extractPresetFromTemplate(templateContent, platform) {
90
+ const lines = templateContent.split('\n');
91
+ const presetIndex = platform === 'Android' ? 0 : 1;
92
+ const presetSection = `[preset.${presetIndex}]`;
93
+ const optionsSection = `[preset.${presetIndex}.options]`;
94
+
95
+ let startIndex = -1;
96
+ let endIndex = -1;
97
+ let inPreset = false;
98
+ let inOptions = false;
99
+
100
+ // 找到预设开始位置
101
+ for (let i = 0; i < lines.length; i++) {
102
+ if (lines[i].trim() === presetSection) {
103
+ startIndex = i;
104
+ inPreset = true;
105
+ } else if (inPreset && lines[i].trim() === optionsSection) {
106
+ inOptions = true;
107
+ } else if (inOptions && lines[i].trim().startsWith('[') && lines[i].trim() !== optionsSection) {
108
+ // 遇到下一个节,结束
109
+ endIndex = i;
110
+ break;
111
+ }
112
+ }
113
+
114
+ if (startIndex === -1) {
115
+ return '';
116
+ }
117
+
118
+ // 如果没有找到结束位置,取到文件末尾
119
+ if (endIndex === -1) {
120
+ endIndex = lines.length;
121
+ }
122
+
123
+ return lines.slice(startIndex, endIndex).join('\n');
124
+ }
125
+
126
+ /**
127
+ * 获取现有文件中最大的预设索引
128
+ *
129
+ * @param {string} content - 文件内容
130
+ * @returns {number} 最大的预设索引,如果没有找到则返回 -1
131
+ */
132
+ function getMaxPresetIndex(content) {
133
+ const presetRegex = /\[preset\.(\d+)\]/g;
134
+ let maxIndex = -1;
135
+ let match;
136
+
137
+ while ((match = presetRegex.exec(content)) !== null) {
138
+ const index = parseInt(match[1], 10);
139
+ if (index > maxIndex) {
140
+ maxIndex = index;
141
+ }
142
+ }
143
+
144
+ return maxIndex;
145
+ }
146
+
147
+ /**
148
+ * 调整预设配置中的索引
149
+ *
150
+ * @param {string} presetContent - 预设配置内容
151
+ * @param {number} oldIndex - 旧索引
152
+ * @param {number} newIndex - 新索引
153
+ * @returns {string} 调整后的预设配置内容
154
+ */
155
+ function adjustPresetIndex(presetContent, oldIndex, newIndex) {
156
+ return presetContent
157
+ .replace(new RegExp(`\\[preset\\.${oldIndex}\\]`, 'g'), `[preset.${newIndex}]`)
158
+ .replace(new RegExp(`\\[preset\\.${oldIndex}\\.options\\]`, 'g'), `[preset.${newIndex}.options]`);
159
+ }
160
+
161
+ /**
162
+ * 合并预设配置到现有文件
163
+ *
164
+ * @param {string} existingContent - 现有文件内容
165
+ * @param {string} templateContent - 模板文件内容
166
+ * @returns {string} 合并后的内容
167
+ */
168
+ function mergePresets(existingContent, templateContent) {
169
+ const { hasAndroid, hasIos } = parseExportPresets(existingContent);
170
+ let mergedContent = existingContent.trim();
171
+
172
+ // 获取现有文件中最大的预设索引
173
+ const maxIndex = getMaxPresetIndex(mergedContent);
174
+ let nextIndex = maxIndex + 1;
175
+
176
+ // 如果缺少 Android 配置,添加它
177
+ if (!hasAndroid) {
178
+ const androidPreset = extractPresetFromTemplate(templateContent, 'Android');
179
+ if (androidPreset) {
180
+ // 调整预设索引
181
+ const adjustedPreset = adjustPresetIndex(androidPreset, 0, nextIndex);
182
+ mergedContent += '\n\n' + adjustedPreset;
183
+ nextIndex++;
184
+ }
185
+ }
186
+
187
+ // 如果缺少 iOS 配置,添加它
188
+ if (!hasIos) {
189
+ const iosPreset = extractPresetFromTemplate(templateContent, 'iOS');
190
+ if (iosPreset) {
191
+ // 调整预设索引
192
+ const adjustedPreset = adjustPresetIndex(iosPreset, 1, nextIndex);
193
+ mergedContent += '\n\n' + adjustedPreset;
194
+ }
195
+ }
196
+
197
+ return mergedContent;
198
+ }
199
+
200
+ /**
201
+ * 检查并合并 export_presets.cfg 文件
202
+ *
203
+ * @param {string} projectRoot - Godot 项目根目录
204
+ */
205
+ async function checkAndMergeExportPresets(projectRoot) {
206
+ const exportPresetsPath = path.join(projectRoot, 'export_presets.cfg');
207
+ const templateExists = fs.existsSync(TEMPLATE_EXPORT_PRESETS_PATH);
208
+
209
+ if (!templateExists) {
210
+ console.warn(`警告: 模板文件 ${TEMPLATE_EXPORT_PRESETS_PATH} 不存在,跳过配置合并`);
211
+ return;
212
+ }
213
+
214
+ const templateContent = await fs.readFile(TEMPLATE_EXPORT_PRESETS_PATH, 'utf-8');
215
+
216
+ // 如果项目根目录下没有 export_presets.cfg,直接复制模板文件
217
+ if (!fs.existsSync(exportPresetsPath)) {
218
+ await fs.copyFile(TEMPLATE_EXPORT_PRESETS_PATH, exportPresetsPath);
219
+ return;
220
+ }
221
+
222
+ // 如果文件存在,检查是否需要合并
223
+ const existingContent = await fs.readFile(exportPresetsPath, 'utf-8');
224
+ const { hasAndroid, hasIos } = parseExportPresets(existingContent);
225
+
226
+ // 如果两个平台配置都存在,不需要合并
227
+ if (hasAndroid && hasIos) {
228
+ return;
229
+ }
230
+
231
+ // 需要合并配置
232
+ const mergedContent = mergePresets(existingContent, templateContent);
233
+ await fs.writeFile(exportPresetsPath, mergedContent, 'utf-8');
234
+ }
235
+
43
236
  /**
44
237
  * 提示用户输入或确认 Godot 导出选项
45
238
  *
@@ -65,16 +258,24 @@ const PRESET_NAMES = {
65
258
  */
66
259
  export async function promptGodotOptions(defaults = {}) {
67
260
  // 如果所有必需的值都已提供,直接返回,不进行询问(用于自动化场景)
261
+ let projectDir = defaults.projectDir ? String(defaults.projectDir).trim() : null;
262
+
68
263
  if (
69
264
  defaults.targetBaseDir &&
70
- defaults.projectDir &&
265
+ projectDir &&
71
266
  defaults.appid &&
72
267
  defaults.preset &&
73
268
  defaults.platform
74
269
  ) {
270
+ // 在返回前检查并合并 export_presets.cfg
271
+ const projectRoot = findGodotProjectRoot(projectDir);
272
+ if (projectRoot) {
273
+ await checkAndMergeExportPresets(projectRoot);
274
+ }
275
+
75
276
  return {
76
277
  targetBaseDir: String(defaults.targetBaseDir).trim(),
77
- projectDir: String(defaults.projectDir).trim(),
278
+ projectDir: projectDir,
78
279
  name: String(defaults.appid).trim(),
79
280
  preset: String(defaults.preset).trim(),
80
281
  platform: defaults.platform
@@ -123,9 +324,17 @@ export async function promptGodotOptions(defaults = {}) {
123
324
  }
124
325
  ]);
125
326
 
327
+ projectDir = answers.projectDir.trim();
328
+
329
+ // 检查并合并 export_presets.cfg
330
+ const projectRoot = findGodotProjectRoot(projectDir);
331
+ if (projectRoot) {
332
+ await checkAndMergeExportPresets(projectRoot);
333
+ }
334
+
126
335
  return {
127
336
  targetBaseDir: answers.targetBaseDir.trim(),
128
- projectDir: answers.projectDir.trim(),
337
+ projectDir: projectDir,
129
338
  name: answers.name.trim(),
130
339
  preset: answers.preset.trim(),
131
340
  platform: answers.platform
@@ -0,0 +1,423 @@
1
+ [preset.0]
2
+
3
+ name="Android"
4
+ platform="Android"
5
+ runnable=true
6
+ advanced_options=false
7
+ dedicated_server=false
8
+ custom_features=""
9
+ export_filter="all_resources"
10
+ include_filter=""
11
+ exclude_filter=""
12
+ export_path=""
13
+ encryption_include_filters=""
14
+ encryption_exclude_filters=""
15
+ encrypt_pck=false
16
+ encrypt_directory=false
17
+ script_export_mode=2
18
+
19
+ [preset.0.options]
20
+
21
+ custom_template/debug=""
22
+ custom_template/release=""
23
+ gradle_build/use_gradle_build=false
24
+ gradle_build/gradle_build_directory=""
25
+ gradle_build/android_source_template=""
26
+ gradle_build/compress_native_libraries=false
27
+ gradle_build/export_format=0
28
+ gradle_build/min_sdk=""
29
+ gradle_build/target_sdk=""
30
+ architectures/armeabi-v7a=false
31
+ architectures/arm64-v8a=true
32
+ architectures/x86=false
33
+ architectures/x86_64=false
34
+ version/code=1
35
+ version/name=""
36
+ package/unique_name="com.example.$genname"
37
+ package/name=""
38
+ package/signed=true
39
+ package/app_category=2
40
+ package/retain_data_on_uninstall=false
41
+ package/exclude_from_recents=false
42
+ package/show_in_android_tv=false
43
+ package/show_in_app_library=true
44
+ package/show_as_launcher_app=false
45
+ launcher_icons/main_192x192=""
46
+ launcher_icons/adaptive_foreground_432x432=""
47
+ launcher_icons/adaptive_background_432x432=""
48
+ graphics/opengl_debug=false
49
+ xr_features/xr_mode=0
50
+ screen/immersive_mode=true
51
+ screen/support_small=true
52
+ screen/support_normal=true
53
+ screen/support_large=true
54
+ screen/support_xlarge=true
55
+ user_data_backup/allow=false
56
+ command_line/extra_args=""
57
+ apk_expansion/enable=false
58
+ apk_expansion/SALT=""
59
+ apk_expansion/public_key=""
60
+ permissions/custom_permissions=PackedStringArray()
61
+ permissions/access_checkin_properties=false
62
+ permissions/access_coarse_location=false
63
+ permissions/access_fine_location=false
64
+ permissions/access_location_extra_commands=false
65
+ permissions/access_mock_location=false
66
+ permissions/access_network_state=false
67
+ permissions/access_surface_flinger=false
68
+ permissions/access_wifi_state=false
69
+ permissions/account_manager=false
70
+ permissions/add_voicemail=false
71
+ permissions/authenticate_accounts=false
72
+ permissions/battery_stats=false
73
+ permissions/bind_accessibility_service=false
74
+ permissions/bind_appwidget=false
75
+ permissions/bind_device_admin=false
76
+ permissions/bind_input_method=false
77
+ permissions/bind_nfc_service=false
78
+ permissions/bind_notification_listener_service=false
79
+ permissions/bind_print_service=false
80
+ permissions/bind_remoteviews=false
81
+ permissions/bind_text_service=false
82
+ permissions/bind_vpn_service=false
83
+ permissions/bind_wallpaper=false
84
+ permissions/bluetooth=false
85
+ permissions/bluetooth_admin=false
86
+ permissions/bluetooth_privileged=false
87
+ permissions/brick=false
88
+ permissions/broadcast_package_removed=false
89
+ permissions/broadcast_sms=false
90
+ permissions/broadcast_sticky=false
91
+ permissions/broadcast_wap_push=false
92
+ permissions/call_phone=false
93
+ permissions/call_privileged=false
94
+ permissions/camera=false
95
+ permissions/capture_audio_output=false
96
+ permissions/capture_secure_video_output=false
97
+ permissions/capture_video_output=false
98
+ permissions/change_component_enabled_state=false
99
+ permissions/change_configuration=false
100
+ permissions/change_network_state=false
101
+ permissions/change_wifi_multicast_state=false
102
+ permissions/change_wifi_state=false
103
+ permissions/clear_app_cache=false
104
+ permissions/clear_app_user_data=false
105
+ permissions/control_location_updates=false
106
+ permissions/delete_cache_files=false
107
+ permissions/delete_packages=false
108
+ permissions/device_power=false
109
+ permissions/diagnostic=false
110
+ permissions/disable_keyguard=false
111
+ permissions/dump=false
112
+ permissions/expand_status_bar=false
113
+ permissions/factory_test=false
114
+ permissions/flashlight=false
115
+ permissions/force_back=false
116
+ permissions/get_accounts=false
117
+ permissions/get_package_size=false
118
+ permissions/get_tasks=false
119
+ permissions/get_top_activity_info=false
120
+ permissions/global_search=false
121
+ permissions/hardware_test=false
122
+ permissions/inject_events=false
123
+ permissions/install_location_provider=false
124
+ permissions/install_packages=false
125
+ permissions/install_shortcut=false
126
+ permissions/internal_system_window=false
127
+ permissions/internet=false
128
+ permissions/kill_background_processes=false
129
+ permissions/location_hardware=false
130
+ permissions/manage_accounts=false
131
+ permissions/manage_app_tokens=false
132
+ permissions/manage_documents=false
133
+ permissions/manage_external_storage=false
134
+ permissions/master_clear=false
135
+ permissions/media_content_control=false
136
+ permissions/modify_audio_settings=false
137
+ permissions/modify_phone_state=false
138
+ permissions/mount_format_filesystems=false
139
+ permissions/mount_unmount_filesystems=false
140
+ permissions/nfc=false
141
+ permissions/persistent_activity=false
142
+ permissions/post_notifications=false
143
+ permissions/process_outgoing_calls=false
144
+ permissions/read_calendar=false
145
+ permissions/read_call_log=false
146
+ permissions/read_contacts=false
147
+ permissions/read_external_storage=false
148
+ permissions/read_frame_buffer=false
149
+ permissions/read_history_bookmarks=false
150
+ permissions/read_input_state=false
151
+ permissions/read_logs=false
152
+ permissions/read_phone_state=false
153
+ permissions/read_profile=false
154
+ permissions/read_sms=false
155
+ permissions/read_social_stream=false
156
+ permissions/read_sync_settings=false
157
+ permissions/read_sync_stats=false
158
+ permissions/read_user_dictionary=false
159
+ permissions/reboot=false
160
+ permissions/receive_boot_completed=false
161
+ permissions/receive_mms=false
162
+ permissions/receive_sms=false
163
+ permissions/receive_wap_push=false
164
+ permissions/record_audio=false
165
+ permissions/reorder_tasks=false
166
+ permissions/restart_packages=false
167
+ permissions/send_respond_via_message=false
168
+ permissions/send_sms=false
169
+ permissions/set_activity_watcher=false
170
+ permissions/set_alarm=false
171
+ permissions/set_always_finish=false
172
+ permissions/set_animation_scale=false
173
+ permissions/set_debug_app=false
174
+ permissions/set_orientation=false
175
+ permissions/set_pointer_speed=false
176
+ permissions/set_preferred_applications=false
177
+ permissions/set_process_limit=false
178
+ permissions/set_time=false
179
+ permissions/set_time_zone=false
180
+ permissions/set_wallpaper=false
181
+ permissions/set_wallpaper_hints=false
182
+ permissions/signal_persistent_processes=false
183
+ permissions/status_bar=false
184
+ permissions/subscribed_feeds_read=false
185
+ permissions/subscribed_feeds_write=false
186
+ permissions/system_alert_window=false
187
+ permissions/transmit_ir=false
188
+ permissions/uninstall_shortcut=false
189
+ permissions/update_device_stats=false
190
+ permissions/use_credentials=false
191
+ permissions/use_sip=false
192
+ permissions/vibrate=false
193
+ permissions/wake_lock=false
194
+ permissions/write_apn_settings=false
195
+ permissions/write_calendar=false
196
+ permissions/write_call_log=false
197
+ permissions/write_contacts=false
198
+ permissions/write_external_storage=false
199
+ permissions/write_gservices=false
200
+ permissions/write_history_bookmarks=false
201
+ permissions/write_profile=false
202
+ permissions/write_secure_settings=false
203
+ permissions/write_settings=false
204
+ permissions/write_sms=false
205
+ permissions/write_social_stream=false
206
+ permissions/write_sync_settings=false
207
+ permissions/write_user_dictionary=false
208
+
209
+ [preset.1]
210
+
211
+ name="iOS"
212
+ platform="iOS"
213
+ runnable=true
214
+ advanced_options=false
215
+ dedicated_server=false
216
+ custom_features=""
217
+ export_filter="all_resources"
218
+ include_filter=""
219
+ exclude_filter=""
220
+ export_path=""
221
+ encryption_include_filters=""
222
+ encryption_exclude_filters=""
223
+ encrypt_pck=false
224
+ encrypt_directory=false
225
+ script_export_mode=2
226
+
227
+ [preset.1.options]
228
+
229
+ custom_template/debug=""
230
+ custom_template/release=""
231
+ architectures/arm64=true
232
+ application/app_store_team_id=""
233
+ application/code_sign_identity_debug=""
234
+ application/export_method_debug=1
235
+ application/code_sign_identity_release=""
236
+ application/export_method_release=0
237
+ application/targeted_device_family=2
238
+ application/bundle_identifier=""
239
+ application/signature=""
240
+ application/short_version=""
241
+ application/version=""
242
+ application/min_ios_version="12.0"
243
+ application/additional_plist_content=""
244
+ application/icon_interpolation=4
245
+ application/export_project_only=false
246
+ application/delete_old_export_files_unconditionally=false
247
+ application/generate_simulator_library_if_missing=true
248
+ capabilities/access_wifi=false
249
+ capabilities/push_notifications=false
250
+ capabilities/performance_gaming_tier=false
251
+ capabilities/performance_a12=false
252
+ user_data/accessible_from_files_app=false
253
+ user_data/accessible_from_itunes_sharing=false
254
+ privacy/camera_usage_description=""
255
+ privacy/camera_usage_description_localized={}
256
+ privacy/microphone_usage_description=""
257
+ privacy/microphone_usage_description_localized={}
258
+ privacy/photolibrary_usage_description=""
259
+ privacy/photolibrary_usage_description_localized={}
260
+ privacy/file_timestamp_access_reasons=3
261
+ privacy/system_boot_time_access_reasons=1
262
+ privacy/disk_space_access_reasons=3
263
+ privacy/active_keyboard_access_reasons=0
264
+ privacy/user_defaults_access_reasons=0
265
+ privacy/tracking_enabled=false
266
+ privacy/tracking_domains=PackedStringArray()
267
+ privacy/collected_data/name/collected=false
268
+ privacy/collected_data/name/linked_to_user=false
269
+ privacy/collected_data/name/used_for_tracking=false
270
+ privacy/collected_data/name/collection_purposes=0
271
+ privacy/collected_data/email_address/collected=false
272
+ privacy/collected_data/email_address/linked_to_user=false
273
+ privacy/collected_data/email_address/used_for_tracking=false
274
+ privacy/collected_data/email_address/collection_purposes=0
275
+ privacy/collected_data/phone_number/collected=false
276
+ privacy/collected_data/phone_number/linked_to_user=false
277
+ privacy/collected_data/phone_number/used_for_tracking=false
278
+ privacy/collected_data/phone_number/collection_purposes=0
279
+ privacy/collected_data/physical_address/collected=false
280
+ privacy/collected_data/physical_address/linked_to_user=false
281
+ privacy/collected_data/physical_address/used_for_tracking=false
282
+ privacy/collected_data/physical_address/collection_purposes=0
283
+ privacy/collected_data/other_contact_info/collected=false
284
+ privacy/collected_data/other_contact_info/linked_to_user=false
285
+ privacy/collected_data/other_contact_info/used_for_tracking=false
286
+ privacy/collected_data/other_contact_info/collection_purposes=0
287
+ privacy/collected_data/health/collected=false
288
+ privacy/collected_data/health/linked_to_user=false
289
+ privacy/collected_data/health/used_for_tracking=false
290
+ privacy/collected_data/health/collection_purposes=0
291
+ privacy/collected_data/fitness/collected=false
292
+ privacy/collected_data/fitness/linked_to_user=false
293
+ privacy/collected_data/fitness/used_for_tracking=false
294
+ privacy/collected_data/fitness/collection_purposes=0
295
+ privacy/collected_data/payment_info/collected=false
296
+ privacy/collected_data/payment_info/linked_to_user=false
297
+ privacy/collected_data/payment_info/used_for_tracking=false
298
+ privacy/collected_data/payment_info/collection_purposes=0
299
+ privacy/collected_data/credit_info/collected=false
300
+ privacy/collected_data/credit_info/linked_to_user=false
301
+ privacy/collected_data/credit_info/used_for_tracking=false
302
+ privacy/collected_data/credit_info/collection_purposes=0
303
+ privacy/collected_data/other_financial_info/collected=false
304
+ privacy/collected_data/other_financial_info/linked_to_user=false
305
+ privacy/collected_data/other_financial_info/used_for_tracking=false
306
+ privacy/collected_data/other_financial_info/collection_purposes=0
307
+ privacy/collected_data/precise_location/collected=false
308
+ privacy/collected_data/precise_location/linked_to_user=false
309
+ privacy/collected_data/precise_location/used_for_tracking=false
310
+ privacy/collected_data/precise_location/collection_purposes=0
311
+ privacy/collected_data/coarse_location/collected=false
312
+ privacy/collected_data/coarse_location/linked_to_user=false
313
+ privacy/collected_data/coarse_location/used_for_tracking=false
314
+ privacy/collected_data/coarse_location/collection_purposes=0
315
+ privacy/collected_data/sensitive_info/collected=false
316
+ privacy/collected_data/sensitive_info/linked_to_user=false
317
+ privacy/collected_data/sensitive_info/used_for_tracking=false
318
+ privacy/collected_data/sensitive_info/collection_purposes=0
319
+ privacy/collected_data/contacts/collected=false
320
+ privacy/collected_data/contacts/linked_to_user=false
321
+ privacy/collected_data/contacts/used_for_tracking=false
322
+ privacy/collected_data/contacts/collection_purposes=0
323
+ privacy/collected_data/emails_or_text_messages/collected=false
324
+ privacy/collected_data/emails_or_text_messages/linked_to_user=false
325
+ privacy/collected_data/emails_or_text_messages/used_for_tracking=false
326
+ privacy/collected_data/emails_or_text_messages/collection_purposes=0
327
+ privacy/collected_data/photos_or_videos/collected=false
328
+ privacy/collected_data/photos_or_videos/linked_to_user=false
329
+ privacy/collected_data/photos_or_videos/used_for_tracking=false
330
+ privacy/collected_data/photos_or_videos/collection_purposes=0
331
+ privacy/collected_data/audio_data/collected=false
332
+ privacy/collected_data/audio_data/linked_to_user=false
333
+ privacy/collected_data/audio_data/used_for_tracking=false
334
+ privacy/collected_data/audio_data/collection_purposes=0
335
+ privacy/collected_data/gameplay_content/collected=false
336
+ privacy/collected_data/gameplay_content/linked_to_user=false
337
+ privacy/collected_data/gameplay_content/used_for_tracking=false
338
+ privacy/collected_data/gameplay_content/collection_purposes=0
339
+ privacy/collected_data/customer_support/collected=false
340
+ privacy/collected_data/customer_support/linked_to_user=false
341
+ privacy/collected_data/customer_support/used_for_tracking=false
342
+ privacy/collected_data/customer_support/collection_purposes=0
343
+ privacy/collected_data/other_user_content/collected=false
344
+ privacy/collected_data/other_user_content/linked_to_user=false
345
+ privacy/collected_data/other_user_content/used_for_tracking=false
346
+ privacy/collected_data/other_user_content/collection_purposes=0
347
+ privacy/collected_data/browsing_history/collected=false
348
+ privacy/collected_data/browsing_history/linked_to_user=false
349
+ privacy/collected_data/browsing_history/used_for_tracking=false
350
+ privacy/collected_data/browsing_history/collection_purposes=0
351
+ privacy/collected_data/search_hhistory/collected=false
352
+ privacy/collected_data/search_hhistory/linked_to_user=false
353
+ privacy/collected_data/search_hhistory/used_for_tracking=false
354
+ privacy/collected_data/search_hhistory/collection_purposes=0
355
+ privacy/collected_data/user_id/collected=false
356
+ privacy/collected_data/user_id/linked_to_user=false
357
+ privacy/collected_data/user_id/used_for_tracking=false
358
+ privacy/collected_data/user_id/collection_purposes=0
359
+ privacy/collected_data/device_id/collected=false
360
+ privacy/collected_data/device_id/linked_to_user=false
361
+ privacy/collected_data/device_id/used_for_tracking=false
362
+ privacy/collected_data/device_id/collection_purposes=0
363
+ privacy/collected_data/purchase_history/collected=false
364
+ privacy/collected_data/purchase_history/linked_to_user=false
365
+ privacy/collected_data/purchase_history/used_for_tracking=false
366
+ privacy/collected_data/purchase_history/collection_purposes=0
367
+ privacy/collected_data/product_interaction/collected=false
368
+ privacy/collected_data/product_interaction/linked_to_user=false
369
+ privacy/collected_data/product_interaction/used_for_tracking=false
370
+ privacy/collected_data/product_interaction/collection_purposes=0
371
+ privacy/collected_data/advertising_data/collected=false
372
+ privacy/collected_data/advertising_data/linked_to_user=false
373
+ privacy/collected_data/advertising_data/used_for_tracking=false
374
+ privacy/collected_data/advertising_data/collection_purposes=0
375
+ privacy/collected_data/other_usage_data/collected=false
376
+ privacy/collected_data/other_usage_data/linked_to_user=false
377
+ privacy/collected_data/other_usage_data/used_for_tracking=false
378
+ privacy/collected_data/other_usage_data/collection_purposes=0
379
+ privacy/collected_data/crash_data/collected=false
380
+ privacy/collected_data/crash_data/linked_to_user=false
381
+ privacy/collected_data/crash_data/used_for_tracking=false
382
+ privacy/collected_data/crash_data/collection_purposes=0
383
+ privacy/collected_data/performance_data/collected=false
384
+ privacy/collected_data/performance_data/linked_to_user=false
385
+ privacy/collected_data/performance_data/used_for_tracking=false
386
+ privacy/collected_data/performance_data/collection_purposes=0
387
+ privacy/collected_data/other_diagnostic_data/collected=false
388
+ privacy/collected_data/other_diagnostic_data/linked_to_user=false
389
+ privacy/collected_data/other_diagnostic_data/used_for_tracking=false
390
+ privacy/collected_data/other_diagnostic_data/collection_purposes=0
391
+ privacy/collected_data/environment_scanning/collected=false
392
+ privacy/collected_data/environment_scanning/linked_to_user=false
393
+ privacy/collected_data/environment_scanning/used_for_tracking=false
394
+ privacy/collected_data/environment_scanning/collection_purposes=0
395
+ privacy/collected_data/hands/collected=false
396
+ privacy/collected_data/hands/linked_to_user=false
397
+ privacy/collected_data/hands/used_for_tracking=false
398
+ privacy/collected_data/hands/collection_purposes=0
399
+ privacy/collected_data/head/collected=false
400
+ privacy/collected_data/head/linked_to_user=false
401
+ privacy/collected_data/head/used_for_tracking=false
402
+ privacy/collected_data/head/collection_purposes=0
403
+ privacy/collected_data/other_data_types/collected=false
404
+ privacy/collected_data/other_data_types/linked_to_user=false
405
+ privacy/collected_data/other_data_types/used_for_tracking=false
406
+ privacy/collected_data/other_data_types/collection_purposes=0
407
+ icons/iphone_120x120=""
408
+ icons/iphone_180x180=""
409
+ icons/ipad_76x76=""
410
+ icons/ipad_152x152=""
411
+ icons/ipad_167x167=""
412
+ icons/app_store_1024x1024=""
413
+ icons/spotlight_40x40=""
414
+ icons/spotlight_80x80=""
415
+ icons/settings_58x58=""
416
+ icons/settings_87x87=""
417
+ icons/notification_40x40=""
418
+ icons/notification_60x60=""
419
+ storyboard/image_scale_mode=0
420
+ storyboard/custom_image@2x=""
421
+ storyboard/custom_image@3x=""
422
+ storyboard/use_custom_bg_color=false
423
+ storyboard/custom_bg_color=Color(0, 0, 0, 1)
@@ -1,81 +1,100 @@
1
1
  {
2
2
  "@bam.tech/react-native-image-resizer": "3.0.11",
3
- "@dr.pogodin/react-native-fs": "2.34.0",
4
- "@dr.pogodin/react-native-static-server": "0.22.0",
3
+ "@borndotcom/react-native-godot": "1.0.1",
4
+ "@boterop/react-native-background-timer": "2.6.0",
5
+ "@callstack/repack": "5.2.2",
6
+ "@d11/react-native-fast-image": "8.13.0",
7
+ "@dr.pogodin/react-native-fs": "2.36.1",
8
+ "@dr.pogodin/react-native-static-server": "0.25.3",
9
+ "@openim/rn-client-sdk": "3.8.3-patch.10.2",
5
10
  "@react-native-async-storage/async-storage": "2.2.0",
6
- "@react-native-camera-roll/camera-roll": "7.10.1",
11
+ "@react-native-camera-roll/camera-roll": "7.10.2",
7
12
  "@react-native-clipboard/clipboard": "1.16.3",
8
13
  "@react-native-community/blur": "4.4.1",
9
14
  "@react-native-community/checkbox": "0.5.20",
10
- "@react-native-community/datetimepicker": "8.4.2",
15
+ "@react-native-community/datetimepicker": "8.5.1",
11
16
  "@react-native-community/geolocation": "3.4.0",
12
17
  "@react-native-community/netinfo": "11.4.1",
13
- "@react-native-community/slider": "4.5.7",
18
+ "@react-native-community/slider": "5.1.1",
14
19
  "@react-native-cookies/cookies": "6.2.1",
15
- "@react-native-documents/picker": "10.1.5",
20
+ "@react-native-documents/picker": "11.0.3",
16
21
  "@react-native-masked-view/masked-view": "0.3.2",
17
- "@react-native-picker/picker": "2.11.1",
22
+ "@react-native-picker/picker": "2.11.4",
18
23
  "@react-native-segmented-control/segmented-control": "2.5.7",
19
- "@shopify/flash-list": "1.8.3",
20
- "@shopify/react-native-skia": "2.1.1",
21
- "expo": "53.0.20",
22
- "expo-asset": "11.1.7",
23
- "expo-audio": "0.4.8",
24
- "expo-brightness": "13.1.4",
25
- "expo-camera": "16.1.11",
26
- "expo-clipboard": "7.1.5",
27
- "expo-constants": "17.1.7",
28
- "expo-crypto": "14.1.5",
29
- "expo-font": "13.3.2",
30
- "expo-image": "2.4.0",
31
- "expo-linking": "7.1.7",
32
- "expo-router": "5.1.4",
33
- "expo-system-ui": "5.0.10",
34
- "expo-video": "2.2.2",
35
- "jcore-react-native": "2.3.1",
36
- "jpush-react-native": "3.2.0",
37
- "llama.rn": "0.6.2",
38
- "lottie-react-native": "7.2.4",
39
- "open-im-sdk-rn": "3.8.3-patch.3",
24
+ "@sayem314/react-native-keep-awake": "1.4.0",
25
+ "@shopify/react-native-skia": "2.4.6",
26
+ "expo": "54.0.25",
27
+ "expo-asset": "12.0.10",
28
+ "expo-audio": "1.0.15",
29
+ "expo-brightness": "14.0.7",
30
+ "expo-camera": "17.0.9",
31
+ "expo-clipboard": "8.0.7",
32
+ "expo-constants": "18.0.10",
33
+ "expo-crypto": "15.0.7",
34
+ "expo-document-picker": "14.0.7",
35
+ "expo-font": "14.0.9",
36
+ "expo-linear-gradient": "15.0.7",
37
+ "expo-linking": "8.0.9",
38
+ "expo-modules-autolinking": "3.0.22",
39
+ "expo-modules-core": "3.0.26",
40
+ "expo-router": "6.0.15",
41
+ "expo-system-ui": "6.0.8",
42
+ "expo-video": "3.0.14",
43
+ "jcore-react-native": "2.3.2",
44
+ "jpush-react-native": "3.2.1",
45
+ "llama.rn": "0.9.0",
46
+ "lottie-react-native": "7.3.4",
40
47
  "react-airplay": "1.2.0",
41
- "react-native-avoid-softinput": "7.0.2",
48
+ "react-native-agora": "4.5.3",
49
+ "react-native-avoid-softinput": "8.0.2",
42
50
  "react-native-background-actions": "4.0.1",
43
- "react-native-ble-manager": "12.1.5",
44
- "react-native-blob-util": "0.22.2",
45
- "react-native-bootsplash": "6.3.10",
46
- "react-native-compressor": "1.12.0",
47
- "react-native-config": "1.5.5",
48
- "react-native-device-info": "14.0.4",
49
- "react-native-edge-to-edge": "1.6.2",
50
- "react-native-fast-image": "8.6.3",
51
- "react-native-gesture-handler": "2.27.2",
52
- "react-native-get-random-values": "1.11.0",
53
- "react-native-google-mobile-ads": "15.4.0",
51
+ "react-native-ble-manager": "12.4.1",
52
+ "react-native-blob-util": "0.24.4",
53
+ "react-native-compressor": "1.13.0",
54
+ "react-native-config": "1.6.1",
55
+ "react-native-device-info": "15.0.1",
56
+ "react-native-edge-to-edge": "1.7.0",
57
+ "react-native-enriched": "0.1.6",
58
+ "react-native-file-access": "3.2.0",
59
+ "react-native-gesture-handler": "2.29.1",
60
+ "react-native-get-random-values": "2.0.0",
61
+ "react-native-global-exception-handler": "1.0.1",
62
+ "react-native-google-mobile-ads": "16.0.0",
54
63
  "react-native-haptic-feedback": "2.3.3",
55
- "react-native-iap": "13.0.1",
64
+ "react-native-iap": "14.4.46",
65
+ "react-native-image-colors": "2.5.1",
56
66
  "react-native-image-picker": "8.2.1",
57
- "react-native-keyboard-controller": "1.18.0",
67
+ "react-native-keyboard-controller": "1.20.1",
68
+ "react-native-keychain": "10.0.0",
58
69
  "react-native-linear-gradient": "2.8.3",
59
- "react-native-localize": "3.5.1",
60
- "react-native-mmkv": "3.3.0",
70
+ "react-native-localize": "3.6.0",
71
+ "react-native-mmkv": "4.0.1",
72
+ "react-native-nitro-modules": "0.31.10",
61
73
  "react-native-orientation-locker": "1.7.0",
62
- "react-native-permissions": "5.4.2",
63
- "react-native-quick-base64": "2.2.1",
64
- "react-native-quick-crypto": "0.7.15",
65
- "react-native-reanimated": "3.19.0",
74
+ "react-native-pager-view": "7.0.2",
75
+ "react-native-permissions": "5.4.4",
76
+ "react-native-quick-base64": "2.2.2",
77
+ "react-native-quick-crypto": "1.0.0",
78
+ "react-native-reanimated": "4.1.5",
66
79
  "react-native-restart": "0.0.27",
67
- "react-native-safe-area-context": "5.5.2",
68
- "react-native-screens": "4.13.1",
69
- "react-native-share": "12.1.0",
70
- "react-native-svg": "15.13.0",
71
- "react-native-track-player": "4.1.1",
72
- "react-native-vector-icons": "10.2.0",
73
- "react-native-video": "6.16.1",
80
+ "react-native-safe-area-context": "5.6.2",
81
+ "react-native-screens": "4.18.0",
82
+ "react-native-share": "12.2.1",
83
+ "react-native-sound": "0.13.0",
84
+ "react-native-splash-view": "0.0.19",
85
+ "react-native-svg": "15.15.1",
86
+ "react-native-track-player": "5.0.0-alpha0-nightly-359af5a12d712d3b685530aed9b9625865a25d74",
87
+ "react-native-vector-icons": "10.3.0",
88
+ "react-native-video": "6.18.0",
74
89
  "react-native-view-shot": "4.0.3",
75
- "react-native-vlc-media-player": "1.0.89",
90
+ "react-native-vision-camera": "4.7.3",
91
+ "react-native-vlc-media-player": "1.0.98",
76
92
  "react-native-volume-manager": "2.0.8",
77
- "react-native-webview": "13.15.0",
78
- "react-native-wgpu": "0.2.0",
93
+ "react-native-webrtc": "124.0.7",
94
+ "react-native-webview": "13.16.0",
95
+ "react-native-wgpu": "0.4.1",
79
96
  "react-native-wifi-reborn": "4.13.6",
97
+ "react-native-worklets": "0.6.1",
98
+ "react-native-worklets-core": "1.6.2",
80
99
  "react-native-zip-archive": "7.0.2"
81
100
  }