@use-voltra/ios-client 2.1.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/README.md +61 -8
  2. package/Voltra.podspec +1 -0
  3. package/build/commonjs/dynamic-widget/api.js +15 -0
  4. package/build/commonjs/dynamic-widget/api.js.map +1 -0
  5. package/build/commonjs/events.js +23 -0
  6. package/build/commonjs/events.js.map +1 -1
  7. package/build/commonjs/index.js +74 -7
  8. package/build/commonjs/index.js.map +1 -1
  9. package/build/commonjs/live-activity/api.js +3 -1
  10. package/build/commonjs/live-activity/api.js.map +1 -1
  11. package/build/commonjs/live-activity/dynamic-api.js +173 -0
  12. package/build/commonjs/live-activity/dynamic-api.js.map +1 -0
  13. package/build/commonjs/native/NativeVoltra.js.map +1 -1
  14. package/build/commonjs/utils/enableDynamicLiveActivityHotReload.js +47 -0
  15. package/build/commonjs/utils/enableDynamicLiveActivityHotReload.js.map +1 -0
  16. package/build/commonjs/utils/enableWidgetHotReload.js +8 -11
  17. package/build/commonjs/utils/enableWidgetHotReload.js.map +1 -1
  18. package/build/commonjs/utils/useUpdateOnHMR.js +3 -7
  19. package/build/commonjs/utils/useUpdateOnHMR.js.map +1 -1
  20. package/build/commonjs/widgets/server-credentials.js +9 -0
  21. package/build/commonjs/widgets/server-credentials.js.map +1 -1
  22. package/build/commonjs/widgets/server-update.js +78 -0
  23. package/build/commonjs/widgets/server-update.js.map +1 -0
  24. package/build/module/dynamic-widget/api.js +10 -0
  25. package/build/module/dynamic-widget/api.js.map +1 -0
  26. package/build/module/events.js +23 -0
  27. package/build/module/events.js.map +1 -1
  28. package/build/module/index.js +4 -0
  29. package/build/module/index.js.map +1 -1
  30. package/build/module/live-activity/api.js +2 -2
  31. package/build/module/live-activity/api.js.map +1 -1
  32. package/build/module/live-activity/dynamic-api.js +167 -0
  33. package/build/module/live-activity/dynamic-api.js.map +1 -0
  34. package/build/module/native/NativeVoltra.js.map +1 -1
  35. package/build/module/utils/enableDynamicLiveActivityHotReload.js +43 -0
  36. package/build/module/utils/enableDynamicLiveActivityHotReload.js.map +1 -0
  37. package/build/module/utils/enableWidgetHotReload.js +9 -11
  38. package/build/module/utils/enableWidgetHotReload.js.map +1 -1
  39. package/build/module/utils/useUpdateOnHMR.js +3 -7
  40. package/build/module/utils/useUpdateOnHMR.js.map +1 -1
  41. package/build/module/widgets/server-credentials.js +9 -0
  42. package/build/module/widgets/server-credentials.js.map +1 -1
  43. package/build/module/widgets/server-update.js +72 -0
  44. package/build/module/widgets/server-update.js.map +1 -0
  45. package/build/typescript/commonjs/dynamic-widget/api.d.ts +8 -0
  46. package/build/typescript/commonjs/dynamic-widget/api.d.ts.map +1 -0
  47. package/build/typescript/commonjs/events.d.ts +7 -0
  48. package/build/typescript/commonjs/events.d.ts.map +1 -1
  49. package/build/typescript/commonjs/index.d.ts +4 -0
  50. package/build/typescript/commonjs/index.d.ts.map +1 -1
  51. package/build/typescript/commonjs/live-activity/api.d.ts +7 -0
  52. package/build/typescript/commonjs/live-activity/api.d.ts.map +1 -1
  53. package/build/typescript/commonjs/live-activity/dynamic-api.d.ts +54 -0
  54. package/build/typescript/commonjs/live-activity/dynamic-api.d.ts.map +1 -0
  55. package/build/typescript/commonjs/native/NativeVoltra.d.ts +21 -0
  56. package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -1
  57. package/build/typescript/commonjs/types.d.ts +1 -1
  58. package/build/typescript/commonjs/types.d.ts.map +1 -1
  59. package/build/typescript/commonjs/utils/enableDynamicLiveActivityHotReload.d.ts +15 -0
  60. package/build/typescript/commonjs/utils/enableDynamicLiveActivityHotReload.d.ts.map +1 -0
  61. package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts +5 -7
  62. package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts.map +1 -1
  63. package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts +0 -3
  64. package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts.map +1 -1
  65. package/build/typescript/commonjs/widgets/server-credentials.d.ts +8 -0
  66. package/build/typescript/commonjs/widgets/server-credentials.d.ts.map +1 -1
  67. package/build/typescript/commonjs/widgets/server-update.d.ts +64 -0
  68. package/build/typescript/commonjs/widgets/server-update.d.ts.map +1 -0
  69. package/build/typescript/module/dynamic-widget/api.d.ts +8 -0
  70. package/build/typescript/module/dynamic-widget/api.d.ts.map +1 -0
  71. package/build/typescript/module/events.d.ts +7 -0
  72. package/build/typescript/module/events.d.ts.map +1 -1
  73. package/build/typescript/module/index.d.ts +4 -0
  74. package/build/typescript/module/index.d.ts.map +1 -1
  75. package/build/typescript/module/live-activity/api.d.ts +7 -0
  76. package/build/typescript/module/live-activity/api.d.ts.map +1 -1
  77. package/build/typescript/module/live-activity/dynamic-api.d.ts +54 -0
  78. package/build/typescript/module/live-activity/dynamic-api.d.ts.map +1 -0
  79. package/build/typescript/module/native/NativeVoltra.d.ts +21 -0
  80. package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -1
  81. package/build/typescript/module/types.d.ts +1 -1
  82. package/build/typescript/module/types.d.ts.map +1 -1
  83. package/build/typescript/module/utils/enableDynamicLiveActivityHotReload.d.ts +15 -0
  84. package/build/typescript/module/utils/enableDynamicLiveActivityHotReload.d.ts.map +1 -0
  85. package/build/typescript/module/utils/enableWidgetHotReload.d.ts +5 -7
  86. package/build/typescript/module/utils/enableWidgetHotReload.d.ts.map +1 -1
  87. package/build/typescript/module/utils/useUpdateOnHMR.d.ts +0 -3
  88. package/build/typescript/module/utils/useUpdateOnHMR.d.ts.map +1 -1
  89. package/build/typescript/module/widgets/server-credentials.d.ts +8 -0
  90. package/build/typescript/module/widgets/server-credentials.d.ts.map +1 -1
  91. package/build/typescript/module/widgets/server-update.d.ts +64 -0
  92. package/build/typescript/module/widgets/server-update.d.ts.map +1 -0
  93. package/expo-plugin/build/cjs/constants.js +20 -1
  94. package/expo-plugin/build/cjs/constants.js.map +1 -1
  95. package/expo-plugin/build/cjs/index.js +9 -1
  96. package/expo-plugin/build/cjs/index.js.map +1 -1
  97. package/expo-plugin/build/cjs/ios/index.js +1 -0
  98. package/expo-plugin/build/cjs/ios/index.js.map +1 -1
  99. package/expo-plugin/build/cjs/ios/infoPlist.js +28 -5
  100. package/expo-plugin/build/cjs/ios/infoPlist.js.map +1 -1
  101. package/expo-plugin/build/cjs/ios/serverUpdate.js +25 -0
  102. package/expo-plugin/build/cjs/ios/serverUpdate.js.map +1 -0
  103. package/expo-plugin/build/cjs/ios-widget/clientRendered.js +4 -4
  104. package/expo-plugin/build/cjs/ios-widget/clientRendered.js.map +1 -1
  105. package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js +5 -5
  106. package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js.map +1 -1
  107. package/expo-plugin/build/cjs/ios-widget/dynamic-live-activity/swift.js +130 -0
  108. package/expo-plugin/build/cjs/ios-widget/dynamic-live-activity/swift.js.map +1 -0
  109. package/expo-plugin/build/cjs/ios-widget/files/index.js +9 -2
  110. package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -1
  111. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js +6 -3
  112. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js.map +1 -1
  113. package/expo-plugin/build/cjs/ios-widget/files/manifest.js +24 -0
  114. package/expo-plugin/build/cjs/ios-widget/files/manifest.js.map +1 -1
  115. package/expo-plugin/build/cjs/ios-widget/files/swift-utils.js +7 -0
  116. package/expo-plugin/build/cjs/ios-widget/files/swift-utils.js.map +1 -0
  117. package/expo-plugin/build/cjs/ios-widget/files/swift.js +56 -26
  118. package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -1
  119. package/expo-plugin/build/cjs/ios-widget/index.js +9 -3
  120. package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -1
  121. package/expo-plugin/build/cjs/ios-widget/podfile.js +38 -12
  122. package/expo-plugin/build/cjs/ios-widget/podfile.js.map +1 -1
  123. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +34 -22
  124. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -1
  125. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +194 -118
  126. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -1
  127. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js +30 -22
  128. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js.map +1 -1
  129. package/expo-plugin/build/cjs/ios-widget/xcode/fileReferences.js +50 -0
  130. package/expo-plugin/build/cjs/ios-widget/xcode/fileReferences.js.map +1 -0
  131. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js +45 -43
  132. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js.map +1 -1
  133. package/expo-plugin/build/cjs/ios-widget/xcode/index.js +93 -91
  134. package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -1
  135. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js +41 -39
  136. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -1
  137. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js +2 -2
  138. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js.map +1 -1
  139. package/expo-plugin/build/cjs/ios-widget/xcode/target.js +29 -63
  140. package/expo-plugin/build/cjs/ios-widget/xcode/target.js.map +1 -1
  141. package/expo-plugin/build/cjs/utils/urlScheme.js +36 -14
  142. package/expo-plugin/build/cjs/utils/urlScheme.js.map +1 -1
  143. package/expo-plugin/build/cjs/validation.js +54 -0
  144. package/expo-plugin/build/cjs/validation.js.map +1 -1
  145. package/expo-plugin/build/esm/constants.js +17 -0
  146. package/expo-plugin/build/esm/constants.js.map +1 -1
  147. package/expo-plugin/build/esm/index.js +9 -1
  148. package/expo-plugin/build/esm/index.js.map +1 -1
  149. package/expo-plugin/build/esm/ios/index.js +1 -0
  150. package/expo-plugin/build/esm/ios/index.js.map +1 -1
  151. package/expo-plugin/build/esm/ios/infoPlist.js +28 -5
  152. package/expo-plugin/build/esm/ios/infoPlist.js.map +1 -1
  153. package/expo-plugin/build/esm/ios/serverUpdate.js +21 -0
  154. package/expo-plugin/build/esm/ios/serverUpdate.js.map +1 -0
  155. package/expo-plugin/build/esm/ios-widget/clientRendered.js +5 -5
  156. package/expo-plugin/build/esm/ios-widget/clientRendered.js.map +1 -1
  157. package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js +6 -6
  158. package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js.map +1 -1
  159. package/expo-plugin/build/esm/ios-widget/dynamic-live-activity/swift.js +122 -0
  160. package/expo-plugin/build/esm/ios-widget/dynamic-live-activity/swift.js.map +1 -0
  161. package/expo-plugin/build/esm/ios-widget/files/index.js +10 -3
  162. package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -1
  163. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js +6 -3
  164. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js.map +1 -1
  165. package/expo-plugin/build/esm/ios-widget/files/manifest.js +23 -1
  166. package/expo-plugin/build/esm/ios-widget/files/manifest.js.map +1 -1
  167. package/expo-plugin/build/esm/ios-widget/files/swift-utils.js +4 -0
  168. package/expo-plugin/build/esm/ios-widget/files/swift-utils.js.map +1 -0
  169. package/expo-plugin/build/esm/ios-widget/files/swift.js +50 -20
  170. package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -1
  171. package/expo-plugin/build/esm/ios-widget/index.js +9 -3
  172. package/expo-plugin/build/esm/ios-widget/index.js.map +1 -1
  173. package/expo-plugin/build/esm/ios-widget/podfile.js +36 -11
  174. package/expo-plugin/build/esm/ios-widget/podfile.js.map +1 -1
  175. package/expo-plugin/build/esm/ios-widget/widgetPlist.js +34 -22
  176. package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -1
  177. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +194 -117
  178. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -1
  179. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js +31 -22
  180. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js.map +1 -1
  181. package/expo-plugin/build/esm/ios-widget/xcode/fileReferences.js +45 -0
  182. package/expo-plugin/build/esm/ios-widget/xcode/fileReferences.js.map +1 -0
  183. package/expo-plugin/build/esm/ios-widget/xcode/groups.js +45 -42
  184. package/expo-plugin/build/esm/ios-widget/xcode/groups.js.map +1 -1
  185. package/expo-plugin/build/esm/ios-widget/xcode/index.js +97 -96
  186. package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -1
  187. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js +41 -39
  188. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -1
  189. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js +3 -2
  190. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js.map +1 -1
  191. package/expo-plugin/build/esm/ios-widget/xcode/target.js +28 -62
  192. package/expo-plugin/build/esm/ios-widget/xcode/target.js.map +1 -1
  193. package/expo-plugin/build/esm/utils/urlScheme.js +34 -14
  194. package/expo-plugin/build/esm/utils/urlScheme.js.map +1 -1
  195. package/expo-plugin/build/esm/validation.js +54 -1
  196. package/expo-plugin/build/esm/validation.js.map +1 -1
  197. package/expo-plugin/build/types/constants.d.ts +10 -1
  198. package/expo-plugin/build/types/constants.d.ts.map +1 -1
  199. package/expo-plugin/build/types/index.d.ts +1 -1
  200. package/expo-plugin/build/types/index.d.ts.map +1 -1
  201. package/expo-plugin/build/types/ios/index.d.ts +2 -0
  202. package/expo-plugin/build/types/ios/index.d.ts.map +1 -1
  203. package/expo-plugin/build/types/ios/infoPlist.d.ts +2 -0
  204. package/expo-plugin/build/types/ios/infoPlist.d.ts.map +1 -1
  205. package/expo-plugin/build/types/ios/serverUpdate.d.ts +11 -0
  206. package/expo-plugin/build/types/ios/serverUpdate.d.ts.map +1 -0
  207. package/expo-plugin/build/types/ios-widget/clientRendered.d.ts.map +1 -1
  208. package/expo-plugin/build/types/ios-widget/clientRenderedPrerender.d.ts.map +1 -1
  209. package/expo-plugin/build/types/ios-widget/dynamic-live-activity/swift.d.ts +7 -0
  210. package/expo-plugin/build/types/ios-widget/dynamic-live-activity/swift.d.ts.map +1 -0
  211. package/expo-plugin/build/types/ios-widget/files/index.d.ts +3 -1
  212. package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -1
  213. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts +2 -1
  214. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts.map +1 -1
  215. package/expo-plugin/build/types/ios-widget/files/manifest.d.ts +9 -2
  216. package/expo-plugin/build/types/ios-widget/files/manifest.d.ts.map +1 -1
  217. package/expo-plugin/build/types/ios-widget/files/swift-utils.d.ts +2 -0
  218. package/expo-plugin/build/types/ios-widget/files/swift-utils.d.ts.map +1 -0
  219. package/expo-plugin/build/types/ios-widget/files/swift.d.ts +6 -2
  220. package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -1
  221. package/expo-plugin/build/types/ios-widget/index.d.ts +3 -1
  222. package/expo-plugin/build/types/ios-widget/index.d.ts.map +1 -1
  223. package/expo-plugin/build/types/ios-widget/podfile.d.ts +19 -1
  224. package/expo-plugin/build/types/ios-widget/podfile.d.ts.map +1 -1
  225. package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts.map +1 -1
  226. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +6 -8
  227. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -1
  228. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts +15 -10
  229. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -1
  230. package/expo-plugin/build/types/ios-widget/xcode/fileReferences.d.ts +16 -0
  231. package/expo-plugin/build/types/ios-widget/xcode/fileReferences.d.ts.map +1 -0
  232. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts +0 -4
  233. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts.map +1 -1
  234. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +23 -3
  235. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -1
  236. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts +16 -4
  237. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -1
  238. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts +0 -4
  239. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts.map +1 -1
  240. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts +11 -26
  241. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts.map +1 -1
  242. package/expo-plugin/build/types/types.d.ts +23 -4
  243. package/expo-plugin/build/types/types.d.ts.map +1 -1
  244. package/expo-plugin/build/types/utils/urlScheme.d.ts +16 -0
  245. package/expo-plugin/build/types/utils/urlScheme.d.ts.map +1 -1
  246. package/expo-plugin/build/types/validation.d.ts +2 -1
  247. package/expo-plugin/build/types/validation.d.ts.map +1 -1
  248. package/expo-plugin/src/constants.ts +24 -1
  249. package/expo-plugin/src/index.ts +14 -1
  250. package/expo-plugin/src/ios/index.ts +3 -0
  251. package/expo-plugin/src/ios/infoPlist.ts +33 -5
  252. package/expo-plugin/src/ios/serverUpdate.ts +29 -0
  253. package/expo-plugin/src/ios-widget/clientRendered.ts +9 -5
  254. package/expo-plugin/src/ios-widget/clientRenderedPrerender.ts +11 -6
  255. package/expo-plugin/src/ios-widget/dynamic-live-activity/swift.ts +138 -0
  256. package/expo-plugin/src/ios-widget/files/index.ts +15 -4
  257. package/expo-plugin/src/ios-widget/files/infoPlist.ts +17 -3
  258. package/expo-plugin/src/ios-widget/files/manifest.ts +42 -2
  259. package/expo-plugin/src/ios-widget/files/swift-utils.ts +3 -0
  260. package/expo-plugin/src/ios-widget/files/swift.ts +69 -22
  261. package/expo-plugin/src/ios-widget/index.ts +13 -3
  262. package/expo-plugin/src/ios-widget/podfile.ts +46 -13
  263. package/expo-plugin/src/ios-widget/widgetPlist.ts +37 -23
  264. package/expo-plugin/src/ios-widget/xcode/__fixtures__/fresh.pbxproj +197 -0
  265. package/expo-plugin/src/ios-widget/xcode/__fixtures__/with-existing-extension.pbxproj +321 -0
  266. package/expo-plugin/src/ios-widget/xcode/__fixtures__/with-per-config-signing.pbxproj +203 -0
  267. package/expo-plugin/src/ios-widget/xcode/__snapshots__/applyXcodeChanges.node.test.ts.snap +363 -0
  268. package/expo-plugin/src/ios-widget/xcode/__tests__/pbxConsistency.ts +130 -0
  269. package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +210 -164
  270. package/expo-plugin/src/ios-widget/xcode/configurationList.ts +52 -35
  271. package/expo-plugin/src/ios-widget/xcode/fileReferences.ts +51 -0
  272. package/expo-plugin/src/ios-widget/xcode/groups.ts +52 -54
  273. package/expo-plugin/src/ios-widget/xcode/index.ts +124 -119
  274. package/expo-plugin/src/ios-widget/xcode/mainAppSettings.ts +59 -54
  275. package/expo-plugin/src/ios-widget/xcode/productFile.ts +3 -2
  276. package/expo-plugin/src/ios-widget/xcode/target.ts +31 -83
  277. package/expo-plugin/src/types.ts +28 -4
  278. package/expo-plugin/src/utils/urlScheme.ts +47 -17
  279. package/expo-plugin/src/validation.ts +76 -1
  280. package/ios/Package.swift +39 -4
  281. package/ios/VoltraWidget.podspec +1 -0
  282. package/ios/app/NativeVoltra.mm +126 -7
  283. package/ios/app/VoltraLiveActivityManager.swift +30 -0
  284. package/ios/app/VoltraLiveActivityService.swift +77 -5
  285. package/ios/app/VoltraModule.swift +117 -1
  286. package/ios/app/VoltraModuleImpl.swift +116 -2
  287. package/ios/app/VoltraViewComponentView.mm +3 -3
  288. package/ios/app/VoltraWidgetService.swift +147 -12
  289. package/ios/app/dynamic-live-activity/VoltraDynamicLiveActivityService.swift +97 -0
  290. package/ios/app/dynamic-live-activity/VoltraLiveActivityChronology.swift +68 -0
  291. package/ios/shared/DynamicWidgetPropsCodec.swift +51 -0
  292. package/ios/shared/DynamicWidgetPropsStorage.swift +53 -0
  293. package/ios/shared/DynamicWidgetPropsStore.swift +117 -0
  294. package/ios/shared/DynamicWidgetRenderCoordinator.swift +31 -0
  295. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerFetchResolver.swift +34 -0
  296. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerProps.swift +55 -0
  297. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerPropsStore.swift +146 -0
  298. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerUpdateRunner.swift +193 -0
  299. package/ios/shared/DynamicWidgetUpdater.swift +30 -0
  300. package/ios/shared/ServerWidgetContentResolver.swift +60 -0
  301. package/ios/shared/ServerWidgetResponseStore.swift +25 -0
  302. package/ios/shared/ShortNames.swift +6 -0
  303. package/ios/shared/VoltraConfig.swift +41 -0
  304. package/ios/shared/VoltraConstants.swift +19 -0
  305. package/ios/shared/VoltraElement.swift +127 -43
  306. package/ios/shared/VoltraEventBus.swift +52 -7
  307. package/ios/shared/VoltraJSRenderer.swift +93 -23
  308. package/ios/shared/VoltraNode.swift +7 -111
  309. package/ios/shared/VoltraRefreshIntent.swift +1 -1
  310. package/ios/shared/VoltraWidgetDefaults.swift +9 -1
  311. package/ios/shared/VoltraWidgetKind.swift +41 -0
  312. package/ios/shared/VoltraWidgetServerFetcher.swift +52 -107
  313. package/ios/shared/WidgetServer/VoltraWidgetAppearance.swift +17 -0
  314. package/ios/shared/WidgetServer/VoltraWidgetServer.swift +138 -0
  315. package/ios/shared/WidgetServer/WidgetCanonicalConfiguration.swift +77 -0
  316. package/ios/shared/WidgetServer/WidgetScope.swift +55 -0
  317. package/ios/shared/WidgetServer/WidgetServerEtagStore.swift +55 -0
  318. package/ios/shared/WidgetServer/WidgetServerFetcher.swift +179 -0
  319. package/ios/shared/WidgetServer/WidgetServerRequestBuilder.swift +114 -0
  320. package/ios/shared/WidgetServer/WidgetServerSettingsCodec.swift +47 -0
  321. package/ios/shared/WidgetServer/WidgetServerSettingsResolver.swift +129 -0
  322. package/ios/shared/WidgetServer/WidgetServerSettingsStore.swift +170 -0
  323. package/ios/shared/WidgetServer/WidgetServerSettingsValidator.swift +73 -0
  324. package/ios/shared/WidgetServer/WidgetServerUpdateSettings.swift +123 -0
  325. package/ios/shared/WidgetServer/WidgetServerUpdateSettingsJson.swift +115 -0
  326. package/ios/shared/dynamic-live-activity/DynamicLiveActivityPropsCodec.swift +13 -0
  327. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityBundleSource.swift +156 -0
  328. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityObserver.swift +97 -0
  329. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityOperations.swift +105 -0
  330. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityPayloadValidator.swift +55 -0
  331. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRegistry.swift +143 -0
  332. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderFailureQueue.swift +158 -0
  333. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderFailureReporter.swift +120 -0
  334. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderer.swift +370 -0
  335. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityTypes.swift +87 -0
  336. package/ios/shared/dynamic-live-activity/VoltraLiveActivityOrder.swift +19 -0
  337. package/ios/target/VoltraClientWidgetRuntime.swift +60 -10
  338. package/ios/target/VoltraDynamicWidgetServerUpdateProvider.swift +204 -0
  339. package/ios/target/VoltraHomeWidget.swift +91 -92
  340. package/ios/target/VoltraWidget.swift +3 -1
  341. package/ios/ui/Extensions/VoltraNode+View.swift +113 -0
  342. package/ios/ui/Generated/Parameters/ChartParameters.swift +3 -0
  343. package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +5 -3
  344. package/ios/ui/Helpers/VoltraProgressDriver.swift +6 -2
  345. package/ios/ui/Layout/VoltraFlexStackLayout.swift +9 -3
  346. package/ios/ui/Style/JSColorParser.swift +24 -8
  347. package/ios/ui/Style/JSGradientParser.swift +36 -12
  348. package/ios/ui/Style/JSStyleParser.swift +36 -12
  349. package/ios/ui/Style/LayoutStyle.swift +12 -4
  350. package/ios/ui/Views/VoltraChart.swift +160 -16
  351. package/ios/ui/Views/VoltraLinearGradient.swift +6 -2
  352. package/package.json +5 -5
  353. package/src/dynamic-widget/api.ts +25 -0
  354. package/src/events.ts +34 -0
  355. package/src/index.ts +23 -0
  356. package/src/live-activity/api.ts +2 -2
  357. package/src/live-activity/dynamic-api.ts +240 -0
  358. package/src/native/NativeVoltra.ts +22 -0
  359. package/src/types.ts +4 -0
  360. package/src/utils/enableDynamicLiveActivityHotReload.ts +50 -0
  361. package/src/utils/enableWidgetHotReload.ts +9 -16
  362. package/src/utils/useUpdateOnHMR.ts +3 -12
  363. package/src/widgets/server-credentials.ts +8 -0
  364. package/src/widgets/server-update.ts +84 -0
  365. /package/ios/shared/{VoltraKeychainHelper.swift → WidgetServer/VoltraKeychainHelper.swift} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { ConfigPlugin, withPlugins } from '@expo/config-plugins'
2
2
 
3
- import type { IOSWidgetConfig } from '../types'
3
+ import type { IOSDynamicLiveActivityConfig, IOSWidgetConfig } from '../types'
4
4
  import { configureEasBuild } from './eas'
5
5
  import { generateWidgetExtensionFiles } from './files'
6
6
  import { withFonts } from './fonts'
@@ -13,11 +13,13 @@ export interface WithIOSProps {
13
13
  bundleIdentifier: string
14
14
  deploymentTarget: string
15
15
  widgets?: IOSWidgetConfig[]
16
+ liveActivities?: IOSDynamicLiveActivityConfig[]
16
17
  groupIdentifier?: string
17
18
  keychainGroup?: string
18
19
  fonts?: string[]
19
20
  version: string
20
21
  buildNumber: string
22
+ voltraVersion: string
21
23
  }
22
24
 
23
25
  /**
@@ -42,11 +44,13 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
42
44
  bundleIdentifier,
43
45
  deploymentTarget,
44
46
  widgets,
47
+ liveActivities,
45
48
  groupIdentifier,
46
49
  keychainGroup,
47
50
  fonts,
48
51
  version,
49
52
  buildNumber,
53
+ voltraVersion,
50
54
  } = props
51
55
 
52
56
  const plugins: [ConfigPlugin<any>, any][] = [
@@ -54,7 +58,10 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
54
58
  ...(fonts && fonts.length > 0 ? [[withFonts, { fonts, targetName }] as [ConfigPlugin<any>, any]] : []),
55
59
 
56
60
  // 2. Configure Xcode project (creates the target - must run before fonts mod executes)
57
- [configureXcodeProject, { targetName, bundleIdentifier, deploymentTarget, widgets }],
61
+ [
62
+ configureXcodeProject,
63
+ { targetName, bundleIdentifier, deploymentTarget, widgets, liveActivities, version, buildNumber },
64
+ ],
58
65
 
59
66
  // 3. Configure Podfile for widget extension target
60
67
  [configurePodfile, { targetName }],
@@ -66,7 +73,10 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
66
73
  [configureEasBuild, { targetName, bundleIdentifier, groupIdentifier }],
67
74
 
68
75
  // 6. Generate widget extension files (dangerous mod should run before plist patchers)
69
- [generateWidgetExtensionFiles, { targetName, widgets, groupIdentifier, keychainGroup, version, buildNumber }],
76
+ [
77
+ generateWidgetExtensionFiles,
78
+ { targetName, widgets, liveActivities, groupIdentifier, keychainGroup, version, buildNumber, voltraVersion },
79
+ ],
70
80
  ]
71
81
 
72
82
  return withPlugins(config, plugins)
@@ -1,11 +1,23 @@
1
1
  import { ConfigPlugin, withPodfile as withExpoPodfile } from '@expo/config-plugins'
2
2
 
3
+ const BEGIN_MARKER = '# @voltra-widget-target BEGIN'
4
+ const END_MARKER = '# @voltra-widget-target END'
5
+
6
+ // Matches a legacy (pre-marker) block emitted by older plugin versions: a bare header comment
7
+ // followed directly by the `target '<name>' do ... end` block, with no surrounding markers.
8
+ // Non-greedy up to the first line-start `end` — our generated block never nests another
9
+ // `do...end`, so this always lands on the block's own closing `end`.
10
+ const LEGACY_BLOCK_RE =
11
+ /\n?# Voltra Widget Extension Target\n# DO NOT MODIFY THIS FILE - IT IS AUTO-GENERATED BY THE VOLTRA PLUGIN\ntarget '[^']*' do\n[\s\S]*?\nend/
12
+
13
+ // Matches a marked block (any target name) end-to-end, inclusive of both markers.
14
+ const MARKED_BLOCK_RE = new RegExp(`${BEGIN_MARKER}[\\s\\S]*?${END_MARKER}`)
15
+
3
16
  /**
4
- * Generates the Podfile target content for the widget extension.
17
+ * Generates the Podfile target content for the widget extension (unwrapped, no markers).
5
18
  */
6
19
  function getTargetContent(targetName: string): string {
7
- return `
8
- # Voltra Widget Extension Target
20
+ return `# Voltra Widget Extension Target
9
21
  # DO NOT MODIFY THIS FILE - IT IS AUTO-GENERATED BY THE VOLTRA PLUGIN
10
22
  target '${targetName}' do
11
23
  use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
@@ -14,31 +26,52 @@ target '${targetName}' do
14
26
  require 'pathname'
15
27
  project_root = "#{Pod::Config.instance.installation_root}/.."
16
28
  voltra_client_root = \`node --print "require.resolve('@use-voltra/ios-client/package.json', {paths: ['#{project_root}']})" 2>/dev/null\`.strip.gsub('/package.json', '')
29
+ raise "Voltra: could not resolve @use-voltra/ios-client from #{project_root}. Is @use-voltra/ios-client installed, and is node on PATH for pod install?" if voltra_client_root.empty?
17
30
  voltra_widget_podspec_root = File.join(voltra_client_root, 'ios')
31
+ voltra_widget_podspec_root = File.realpath(voltra_widget_podspec_root) if File.exist?(voltra_widget_podspec_root)
18
32
  podspec_dir_path = Pathname.new(voltra_widget_podspec_root).relative_path_from(Pathname.new(__dir__)).to_path
19
33
 
20
34
  pod 'VoltraWidget', :path => podspec_dir_path
21
35
  end`
22
36
  }
23
37
 
38
+ function buildMarkedBlock(targetName: string): string {
39
+ return `${BEGIN_MARKER}\n${getTargetContent(targetName)}\n${END_MARKER}`
40
+ }
41
+
42
+ /**
43
+ * Idempotently inserts/upgrades the Voltra widget target block in Podfile contents:
44
+ * - marked block already present → replaced in place (covers renamed targets too, since the
45
+ * markers are name-agnostic)
46
+ * - legacy (pre-marker) block present → replaced with the new marked block
47
+ * - neither present → appended
48
+ */
49
+ export function upsertWidgetTarget(contents: string, targetName: string): string {
50
+ const markedBlock = buildMarkedBlock(targetName)
51
+
52
+ if (MARKED_BLOCK_RE.test(contents)) {
53
+ return contents.replace(MARKED_BLOCK_RE, markedBlock)
54
+ }
55
+
56
+ if (LEGACY_BLOCK_RE.test(contents)) {
57
+ return contents.replace(LEGACY_BLOCK_RE, `\n${markedBlock}`)
58
+ }
59
+
60
+ return `${contents.trimEnd()}\n\n${markedBlock}\n`
61
+ }
62
+
24
63
  export interface ConfigurePodfileProps {
25
64
  targetName: string
26
65
  }
27
66
 
28
67
  /**
29
- * Plugin step that adds the Podfile target for the widget extension.
68
+ * Plugin step that adds (or upgrades) the Podfile target for the widget extension.
30
69
  */
31
70
  export const configurePodfile: ConfigPlugin<ConfigurePodfileProps> = (config, { targetName }) => {
32
71
  return withExpoPodfile(config, (podfile) => {
33
- const targetContent = getTargetContent(targetName)
34
-
35
- // Check if target already exists (avoid duplicates)
36
- const targetMarker = "target '" + targetName + "'"
37
- if (podfile.modResults.contents.includes(targetMarker)) {
38
- return podfile
39
- }
40
-
41
- podfile.modResults.contents = podfile.modResults.contents + '\n' + targetContent
72
+ podfile.modResults.contents = upsertWidgetTarget(podfile.modResults.contents, targetName)
42
73
  return podfile
43
74
  })
44
75
  }
76
+
77
+ export const __test__ = { BEGIN_MARKER, END_MARKER, getTargetContent }
@@ -3,9 +3,12 @@ import plist from '@expo/plist'
3
3
  import { existsSync, readFileSync, writeFileSync } from 'fs'
4
4
  import { join as joinPath } from 'path'
5
5
 
6
+ import { widgetKindOverrides } from '../constants'
6
7
  import type { IOSWidgetConfig } from '../types'
7
8
  import { detectClientRenderedWidgets } from './clientRendered'
8
9
  import { logger } from '@use-voltra/expo-plugin'
10
+ import { resolveIOSWidgetServerUpdate } from '../ios/serverUpdate'
11
+ import { appendMissingURLSchemes, getAppURLSchemes } from '../utils/urlScheme'
9
12
 
10
13
  export interface ConfigureMainAppPlistProps {
11
14
  targetName: string
@@ -35,9 +38,9 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
35
38
  return config
36
39
  }
37
40
 
38
- const scheme = typeof expoConfig.scheme === 'string' ? expoConfig.scheme : expoConfig.ios?.bundleIdentifier
41
+ const schemes = getAppURLSchemes(expoConfig)
39
42
 
40
- if (scheme) {
43
+ if (schemes.length > 0) {
41
44
  const targetPath = joinPath(config.modRequest.platformProjectRoot, targetName)
42
45
  const filePath = joinPath(targetPath, 'Info.plist')
43
46
  if (!existsSync(filePath)) {
@@ -78,20 +81,8 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
78
81
 
79
82
  // Keep URL schemes in the widget extension so Live Activity links can be resolved
80
83
  // from relative to absolute URLs (see VoltraDeepLinkResolver.swift).
81
- const existingTypes = (content.CFBundleURLTypes as any[]) || []
82
- const hasScheme = existingTypes.some(
83
- (t) => Array.isArray(t?.CFBundleURLSchemes) && t.CFBundleURLSchemes.includes(scheme)
84
- )
85
- if (!hasScheme) {
86
- content.CFBundleURLTypes = [
87
- ...existingTypes,
88
- {
89
- CFBundleURLSchemes: [scheme],
90
- },
91
- ]
92
- } else {
93
- content.CFBundleURLTypes = existingTypes
94
- }
84
+ // Uses the same scheme list as the app, so a relative link resolves to the app's first scheme.
85
+ content.CFBundleURLTypes = appendMissingURLSchemes((content.CFBundleURLTypes as any[]) || [], schemes)
95
86
 
96
87
  // Only set group identifier if provided
97
88
  if (groupIdentifier) {
@@ -105,18 +96,31 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
105
96
  const serverRefresh: Record<string, boolean> = {}
106
97
 
107
98
  for (const widget of widgets) {
108
- if (widget.serverUpdate) {
109
- serverUrls[widget.id] = widget.serverUpdate.url
110
- serverIntervals[widget.id] = widget.serverUpdate.intervalMinutes ?? 15
111
- if (widget.serverUpdate.refresh) {
112
- serverRefresh[widget.id] = true
113
- }
99
+ const serverUpdate = resolveIOSWidgetServerUpdate(widget)
100
+
101
+ if (!serverUpdate) {
102
+ continue
103
+ }
104
+
105
+ // Every server-driven widget gets an interval, so this dictionary's keys are the set
106
+ // of server-driven widget ids. A URL is written only when app.json set one.
107
+ serverIntervals[widget.id] = serverUpdate.intervalMinutes
108
+
109
+ if (serverUpdate.url !== undefined) {
110
+ serverUrls[widget.id] = serverUpdate.url
111
+ }
112
+
113
+ if (serverUpdate.refresh) {
114
+ serverRefresh[widget.id] = true
114
115
  }
115
116
  }
116
117
 
118
+ if (Object.keys(serverIntervals).length > 0) {
119
+ ;(content as any)['Voltra_WidgetServerIntervals'] = serverIntervals
120
+ }
121
+
117
122
  if (Object.keys(serverUrls).length > 0) {
118
123
  ;(content as any)['Voltra_WidgetServerUrls'] = serverUrls
119
- ;(content as any)['Voltra_WidgetServerIntervals'] = serverIntervals
120
124
  }
121
125
 
122
126
  if (Object.keys(serverRefresh).length > 0) {
@@ -124,6 +128,16 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
124
128
  }
125
129
  }
126
130
 
131
+ // Custom widget kinds, so the extension maps ids to kinds too (see VoltraWidgetKind.swift).
132
+ // Deleted when no widget pins one, so a `kind` dropped from the config does not linger in
133
+ // an Info.plist that a previous prebuild wrote.
134
+ const widgetKinds = widgetKindOverrides(widgets)
135
+ if (widgetKinds) {
136
+ ;(content as any)['Voltra_WidgetKinds'] = widgetKinds
137
+ } else {
138
+ delete (content as any)['Voltra_WidgetKinds']
139
+ }
140
+
127
141
  // Add Keychain group for shared credential access
128
142
  if (keychainGroup) {
129
143
  ;(content as any)['Voltra_KeychainGroup'] = keychainGroup
@@ -0,0 +1,197 @@
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 54;
7
+ objects = {
8
+
9
+ /* Begin PBXBuildFile section */
10
+ 13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; };
11
+ 13B07FC11A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
12
+ 13B07FC21A68108700A75B9A /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB61A68108700A75B9A /* Info.plist */; };
13
+ /* End PBXBuildFile section */
14
+
15
+ /* Begin PBXFileReference section */
16
+ 13B07F961A680F5B00A75B9A /* voltraexample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = voltraexample.app; sourceTree = BUILT_PRODUCTS_DIR; };
17
+ 13B07FB01A68108700A75B9A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = voltraexample/AppDelegate.swift; sourceTree = "<group>"; };
18
+ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = voltraexample/Images.xcassets; sourceTree = "<group>"; };
19
+ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = voltraexample/Info.plist; sourceTree = "<group>"; };
20
+ /* End PBXFileReference section */
21
+
22
+ /* Begin PBXFrameworksBuildPhase section */
23
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
24
+ isa = PBXFrameworksBuildPhase;
25
+ buildActionMask = 2147483647;
26
+ files = (
27
+ );
28
+ runOnlyForDeploymentPostprocessing = 0;
29
+ };
30
+ /* End PBXFrameworksBuildPhase section */
31
+
32
+ /* Begin PBXGroup section */
33
+ 83CBB9F61A601CBA00E9B192 = {
34
+ isa = PBXGroup;
35
+ children = (
36
+ 13B07FAE1A68108700A75B9A /* voltraexample */,
37
+ 83CBBA001A601CBA00E9B192 /* Products */,
38
+ );
39
+ indentWidth = 2;
40
+ sourceTree = "<group>";
41
+ tabWidth = 2;
42
+ usesTabs = 0;
43
+ };
44
+ 13B07FAE1A68108700A75B9A /* voltraexample */ = {
45
+ isa = PBXGroup;
46
+ children = (
47
+ 13B07FB01A68108700A75B9A /* AppDelegate.swift */,
48
+ 13B07FB51A68108700A75B9A /* Images.xcassets */,
49
+ 13B07FB61A68108700A75B9A /* Info.plist */,
50
+ );
51
+ name = voltraexample;
52
+ sourceTree = "<group>";
53
+ };
54
+ 83CBBA001A601CBA00E9B192 /* Products */ = {
55
+ isa = PBXGroup;
56
+ children = (
57
+ 13B07F961A680F5B00A75B9A /* voltraexample.app */,
58
+ );
59
+ name = Products;
60
+ sourceTree = "<group>";
61
+ };
62
+ /* End PBXGroup section */
63
+
64
+ /* Begin PBXNativeTarget section */
65
+ 13B07F861A680F5B00A75B9A /* voltraexample */ = {
66
+ isa = PBXNativeTarget;
67
+ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "voltraexample" */;
68
+ buildPhases = (
69
+ 13B07F871A680F5B00A75B9A /* Sources */,
70
+ 13B07F8C1A680F5B00A75B9A /* Frameworks */,
71
+ 13B07F8E1A680F5B00A75B9A /* Resources */,
72
+ );
73
+ buildRules = (
74
+ );
75
+ dependencies = (
76
+ );
77
+ name = voltraexample;
78
+ productName = voltraexample;
79
+ productReference = 13B07F961A680F5B00A75B9A /* voltraexample.app */;
80
+ productType = "com.apple.product-type.application";
81
+ };
82
+ /* End PBXNativeTarget section */
83
+
84
+ /* Begin PBXProject section */
85
+ 83CBB9F71A601CBA00E9B192 /* Project object */ = {
86
+ isa = PBXProject;
87
+ attributes = {
88
+ LastUpgradeCheck = 1210;
89
+ TargetAttributes = {
90
+ 13B07F861A680F5B00A75B9A = {
91
+ LastSwiftMigration = 1250;
92
+ };
93
+ };
94
+ };
95
+ buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "voltraexample" */;
96
+ compatibilityVersion = "Xcode 12.0";
97
+ developmentRegion = en;
98
+ hasScannedForEncodings = 0;
99
+ knownRegions = (
100
+ en,
101
+ Base,
102
+ );
103
+ mainGroup = 83CBB9F61A601CBA00E9B192;
104
+ productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
105
+ projectDirPath = "";
106
+ projectRoot = "";
107
+ targets = (
108
+ 13B07F861A680F5B00A75B9A /* voltraexample */,
109
+ );
110
+ };
111
+ /* End PBXProject section */
112
+
113
+ /* Begin PBXResourcesBuildPhase section */
114
+ 13B07F8E1A680F5B00A75B9A /* Resources */ = {
115
+ isa = PBXResourcesBuildPhase;
116
+ buildActionMask = 2147483647;
117
+ files = (
118
+ 13B07FC11A68108700A75B9A /* Images.xcassets in Resources */,
119
+ 13B07FC21A68108700A75B9A /* Info.plist in Resources */,
120
+ );
121
+ runOnlyForDeploymentPostprocessing = 0;
122
+ };
123
+ /* End PBXResourcesBuildPhase section */
124
+
125
+ /* Begin PBXSourcesBuildPhase section */
126
+ 13B07F871A680F5B00A75B9A /* Sources */ = {
127
+ isa = PBXSourcesBuildPhase;
128
+ buildActionMask = 2147483647;
129
+ files = (
130
+ 13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */,
131
+ );
132
+ runOnlyForDeploymentPostprocessing = 0;
133
+ };
134
+ /* End PBXSourcesBuildPhase section */
135
+
136
+ /* Begin XCBuildConfiguration section */
137
+ 13B07F941A680F5B00A75B9A /* Debug */ = {
138
+ isa = XCBuildConfiguration;
139
+ buildSettings = {
140
+ INFOPLIST_FILE = voltraexample/Info.plist;
141
+ PRODUCT_BUNDLE_IDENTIFIER = com.voltra.example;
142
+ PRODUCT_NAME = voltraexample;
143
+ SWIFT_VERSION = 5.0;
144
+ };
145
+ name = Debug;
146
+ };
147
+ 13B07F951A680F5B00A75B9A /* Release */ = {
148
+ isa = XCBuildConfiguration;
149
+ buildSettings = {
150
+ INFOPLIST_FILE = voltraexample/Info.plist;
151
+ PRODUCT_BUNDLE_IDENTIFIER = com.voltra.example;
152
+ PRODUCT_NAME = voltraexample;
153
+ SWIFT_VERSION = 5.0;
154
+ };
155
+ name = Release;
156
+ };
157
+ 83CBBA201A601CBA00E9B192 /* Debug */ = {
158
+ isa = XCBuildConfiguration;
159
+ buildSettings = {
160
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
161
+ SDKROOT = iphoneos;
162
+ };
163
+ name = Debug;
164
+ };
165
+ 83CBBA211A601CBA00E9B192 /* Release */ = {
166
+ isa = XCBuildConfiguration;
167
+ buildSettings = {
168
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
169
+ SDKROOT = iphoneos;
170
+ };
171
+ name = Release;
172
+ };
173
+ /* End XCBuildConfiguration section */
174
+
175
+ /* Begin XCConfigurationList section */
176
+ 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "voltraexample" */ = {
177
+ isa = XCConfigurationList;
178
+ buildConfigurations = (
179
+ 13B07F941A680F5B00A75B9A /* Debug */,
180
+ 13B07F951A680F5B00A75B9A /* Release */,
181
+ );
182
+ defaultConfigurationIsVisible = 0;
183
+ defaultConfigurationName = Release;
184
+ };
185
+ 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "voltraexample" */ = {
186
+ isa = XCConfigurationList;
187
+ buildConfigurations = (
188
+ 83CBBA201A601CBA00E9B192 /* Debug */,
189
+ 83CBBA211A601CBA00E9B192 /* Release */,
190
+ );
191
+ defaultConfigurationIsVisible = 0;
192
+ defaultConfigurationName = Release;
193
+ };
194
+ /* End XCConfigurationList section */
195
+ };
196
+ rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
197
+ }