@use-voltra/ios-client 2.2.0 → 2.3.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.
Files changed (289) hide show
  1. package/Voltra.podspec +1 -0
  2. package/build/commonjs/events.js +23 -0
  3. package/build/commonjs/events.js.map +1 -1
  4. package/build/commonjs/index.js +59 -0
  5. package/build/commonjs/index.js.map +1 -1
  6. package/build/commonjs/live-activity/api.js +3 -1
  7. package/build/commonjs/live-activity/api.js.map +1 -1
  8. package/build/commonjs/live-activity/dynamic-api.js +173 -0
  9. package/build/commonjs/live-activity/dynamic-api.js.map +1 -0
  10. package/build/commonjs/native/NativeVoltra.js.map +1 -1
  11. package/build/commonjs/utils/enableDynamicLiveActivityHotReload.js +47 -0
  12. package/build/commonjs/utils/enableDynamicLiveActivityHotReload.js.map +1 -0
  13. package/build/commonjs/utils/enableWidgetHotReload.js +8 -11
  14. package/build/commonjs/utils/enableWidgetHotReload.js.map +1 -1
  15. package/build/commonjs/utils/useUpdateOnHMR.js +3 -7
  16. package/build/commonjs/utils/useUpdateOnHMR.js.map +1 -1
  17. package/build/commonjs/widgets/server-credentials.js +9 -0
  18. package/build/commonjs/widgets/server-credentials.js.map +1 -1
  19. package/build/commonjs/widgets/server-update.js +78 -0
  20. package/build/commonjs/widgets/server-update.js.map +1 -0
  21. package/build/module/events.js +23 -0
  22. package/build/module/events.js.map +1 -1
  23. package/build/module/index.js +3 -0
  24. package/build/module/index.js.map +1 -1
  25. package/build/module/live-activity/api.js +2 -2
  26. package/build/module/live-activity/api.js.map +1 -1
  27. package/build/module/live-activity/dynamic-api.js +167 -0
  28. package/build/module/live-activity/dynamic-api.js.map +1 -0
  29. package/build/module/native/NativeVoltra.js.map +1 -1
  30. package/build/module/utils/enableDynamicLiveActivityHotReload.js +43 -0
  31. package/build/module/utils/enableDynamicLiveActivityHotReload.js.map +1 -0
  32. package/build/module/utils/enableWidgetHotReload.js +9 -11
  33. package/build/module/utils/enableWidgetHotReload.js.map +1 -1
  34. package/build/module/utils/useUpdateOnHMR.js +3 -7
  35. package/build/module/utils/useUpdateOnHMR.js.map +1 -1
  36. package/build/module/widgets/server-credentials.js +9 -0
  37. package/build/module/widgets/server-credentials.js.map +1 -1
  38. package/build/module/widgets/server-update.js +72 -0
  39. package/build/module/widgets/server-update.js.map +1 -0
  40. package/build/typescript/commonjs/events.d.ts +7 -0
  41. package/build/typescript/commonjs/events.d.ts.map +1 -1
  42. package/build/typescript/commonjs/index.d.ts +3 -0
  43. package/build/typescript/commonjs/index.d.ts.map +1 -1
  44. package/build/typescript/commonjs/live-activity/api.d.ts +7 -0
  45. package/build/typescript/commonjs/live-activity/api.d.ts.map +1 -1
  46. package/build/typescript/commonjs/live-activity/dynamic-api.d.ts +54 -0
  47. package/build/typescript/commonjs/live-activity/dynamic-api.d.ts.map +1 -0
  48. package/build/typescript/commonjs/native/NativeVoltra.d.ts +20 -0
  49. package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -1
  50. package/build/typescript/commonjs/types.d.ts +1 -1
  51. package/build/typescript/commonjs/types.d.ts.map +1 -1
  52. package/build/typescript/commonjs/utils/enableDynamicLiveActivityHotReload.d.ts +15 -0
  53. package/build/typescript/commonjs/utils/enableDynamicLiveActivityHotReload.d.ts.map +1 -0
  54. package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts +5 -7
  55. package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts.map +1 -1
  56. package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts +0 -3
  57. package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts.map +1 -1
  58. package/build/typescript/commonjs/widgets/server-credentials.d.ts +8 -0
  59. package/build/typescript/commonjs/widgets/server-credentials.d.ts.map +1 -1
  60. package/build/typescript/commonjs/widgets/server-update.d.ts +64 -0
  61. package/build/typescript/commonjs/widgets/server-update.d.ts.map +1 -0
  62. package/build/typescript/module/events.d.ts +7 -0
  63. package/build/typescript/module/events.d.ts.map +1 -1
  64. package/build/typescript/module/index.d.ts +3 -0
  65. package/build/typescript/module/index.d.ts.map +1 -1
  66. package/build/typescript/module/live-activity/api.d.ts +7 -0
  67. package/build/typescript/module/live-activity/api.d.ts.map +1 -1
  68. package/build/typescript/module/live-activity/dynamic-api.d.ts +54 -0
  69. package/build/typescript/module/live-activity/dynamic-api.d.ts.map +1 -0
  70. package/build/typescript/module/native/NativeVoltra.d.ts +20 -0
  71. package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -1
  72. package/build/typescript/module/types.d.ts +1 -1
  73. package/build/typescript/module/types.d.ts.map +1 -1
  74. package/build/typescript/module/utils/enableDynamicLiveActivityHotReload.d.ts +15 -0
  75. package/build/typescript/module/utils/enableDynamicLiveActivityHotReload.d.ts.map +1 -0
  76. package/build/typescript/module/utils/enableWidgetHotReload.d.ts +5 -7
  77. package/build/typescript/module/utils/enableWidgetHotReload.d.ts.map +1 -1
  78. package/build/typescript/module/utils/useUpdateOnHMR.d.ts +0 -3
  79. package/build/typescript/module/utils/useUpdateOnHMR.d.ts.map +1 -1
  80. package/build/typescript/module/widgets/server-credentials.d.ts +8 -0
  81. package/build/typescript/module/widgets/server-credentials.d.ts.map +1 -1
  82. package/build/typescript/module/widgets/server-update.d.ts +64 -0
  83. package/build/typescript/module/widgets/server-update.d.ts.map +1 -0
  84. package/expo-plugin/build/cjs/constants.js +20 -1
  85. package/expo-plugin/build/cjs/constants.js.map +1 -1
  86. package/expo-plugin/build/cjs/index.js +6 -0
  87. package/expo-plugin/build/cjs/index.js.map +1 -1
  88. package/expo-plugin/build/cjs/ios/index.js +1 -0
  89. package/expo-plugin/build/cjs/ios/index.js.map +1 -1
  90. package/expo-plugin/build/cjs/ios/infoPlist.js +28 -5
  91. package/expo-plugin/build/cjs/ios/infoPlist.js.map +1 -1
  92. package/expo-plugin/build/cjs/ios/serverUpdate.js +25 -0
  93. package/expo-plugin/build/cjs/ios/serverUpdate.js.map +1 -0
  94. package/expo-plugin/build/cjs/ios-widget/clientRendered.js +4 -4
  95. package/expo-plugin/build/cjs/ios-widget/clientRendered.js.map +1 -1
  96. package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js +5 -5
  97. package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js.map +1 -1
  98. package/expo-plugin/build/cjs/ios-widget/dynamic-live-activity/swift.js +130 -0
  99. package/expo-plugin/build/cjs/ios-widget/dynamic-live-activity/swift.js.map +1 -0
  100. package/expo-plugin/build/cjs/ios-widget/files/index.js +9 -2
  101. package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -1
  102. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js +6 -3
  103. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js.map +1 -1
  104. package/expo-plugin/build/cjs/ios-widget/files/manifest.js +24 -0
  105. package/expo-plugin/build/cjs/ios-widget/files/manifest.js.map +1 -1
  106. package/expo-plugin/build/cjs/ios-widget/files/swift-utils.js +7 -0
  107. package/expo-plugin/build/cjs/ios-widget/files/swift-utils.js.map +1 -0
  108. package/expo-plugin/build/cjs/ios-widget/files/swift.js +56 -26
  109. package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -1
  110. package/expo-plugin/build/cjs/ios-widget/index.js +9 -3
  111. package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -1
  112. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +34 -22
  113. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -1
  114. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +51 -11
  115. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -1
  116. package/expo-plugin/build/cjs/ios-widget/xcode/index.js +21 -5
  117. package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -1
  118. package/expo-plugin/build/cjs/utils/urlScheme.js +36 -14
  119. package/expo-plugin/build/cjs/utils/urlScheme.js.map +1 -1
  120. package/expo-plugin/build/cjs/validation.js +54 -0
  121. package/expo-plugin/build/cjs/validation.js.map +1 -1
  122. package/expo-plugin/build/esm/constants.js +17 -0
  123. package/expo-plugin/build/esm/constants.js.map +1 -1
  124. package/expo-plugin/build/esm/index.js +6 -0
  125. package/expo-plugin/build/esm/index.js.map +1 -1
  126. package/expo-plugin/build/esm/ios/index.js +1 -0
  127. package/expo-plugin/build/esm/ios/index.js.map +1 -1
  128. package/expo-plugin/build/esm/ios/infoPlist.js +28 -5
  129. package/expo-plugin/build/esm/ios/infoPlist.js.map +1 -1
  130. package/expo-plugin/build/esm/ios/serverUpdate.js +21 -0
  131. package/expo-plugin/build/esm/ios/serverUpdate.js.map +1 -0
  132. package/expo-plugin/build/esm/ios-widget/clientRendered.js +5 -5
  133. package/expo-plugin/build/esm/ios-widget/clientRendered.js.map +1 -1
  134. package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js +6 -6
  135. package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js.map +1 -1
  136. package/expo-plugin/build/esm/ios-widget/dynamic-live-activity/swift.js +122 -0
  137. package/expo-plugin/build/esm/ios-widget/dynamic-live-activity/swift.js.map +1 -0
  138. package/expo-plugin/build/esm/ios-widget/files/index.js +10 -3
  139. package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -1
  140. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js +6 -3
  141. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js.map +1 -1
  142. package/expo-plugin/build/esm/ios-widget/files/manifest.js +23 -1
  143. package/expo-plugin/build/esm/ios-widget/files/manifest.js.map +1 -1
  144. package/expo-plugin/build/esm/ios-widget/files/swift-utils.js +4 -0
  145. package/expo-plugin/build/esm/ios-widget/files/swift-utils.js.map +1 -0
  146. package/expo-plugin/build/esm/ios-widget/files/swift.js +50 -20
  147. package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -1
  148. package/expo-plugin/build/esm/ios-widget/index.js +9 -3
  149. package/expo-plugin/build/esm/ios-widget/index.js.map +1 -1
  150. package/expo-plugin/build/esm/ios-widget/widgetPlist.js +34 -22
  151. package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -1
  152. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +51 -11
  153. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -1
  154. package/expo-plugin/build/esm/ios-widget/xcode/index.js +21 -5
  155. package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -1
  156. package/expo-plugin/build/esm/utils/urlScheme.js +34 -14
  157. package/expo-plugin/build/esm/utils/urlScheme.js.map +1 -1
  158. package/expo-plugin/build/esm/validation.js +54 -1
  159. package/expo-plugin/build/esm/validation.js.map +1 -1
  160. package/expo-plugin/build/types/constants.d.ts +10 -1
  161. package/expo-plugin/build/types/constants.d.ts.map +1 -1
  162. package/expo-plugin/build/types/index.d.ts +1 -1
  163. package/expo-plugin/build/types/index.d.ts.map +1 -1
  164. package/expo-plugin/build/types/ios/index.d.ts +2 -0
  165. package/expo-plugin/build/types/ios/index.d.ts.map +1 -1
  166. package/expo-plugin/build/types/ios/infoPlist.d.ts +2 -0
  167. package/expo-plugin/build/types/ios/infoPlist.d.ts.map +1 -1
  168. package/expo-plugin/build/types/ios/serverUpdate.d.ts +11 -0
  169. package/expo-plugin/build/types/ios/serverUpdate.d.ts.map +1 -0
  170. package/expo-plugin/build/types/ios-widget/clientRendered.d.ts.map +1 -1
  171. package/expo-plugin/build/types/ios-widget/clientRenderedPrerender.d.ts.map +1 -1
  172. package/expo-plugin/build/types/ios-widget/dynamic-live-activity/swift.d.ts +7 -0
  173. package/expo-plugin/build/types/ios-widget/dynamic-live-activity/swift.d.ts.map +1 -0
  174. package/expo-plugin/build/types/ios-widget/files/index.d.ts +3 -1
  175. package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -1
  176. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts +2 -1
  177. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts.map +1 -1
  178. package/expo-plugin/build/types/ios-widget/files/manifest.d.ts +9 -2
  179. package/expo-plugin/build/types/ios-widget/files/manifest.d.ts.map +1 -1
  180. package/expo-plugin/build/types/ios-widget/files/swift-utils.d.ts +2 -0
  181. package/expo-plugin/build/types/ios-widget/files/swift-utils.d.ts.map +1 -0
  182. package/expo-plugin/build/types/ios-widget/files/swift.d.ts +6 -2
  183. package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -1
  184. package/expo-plugin/build/types/ios-widget/index.d.ts +3 -1
  185. package/expo-plugin/build/types/ios-widget/index.d.ts.map +1 -1
  186. package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts.map +1 -1
  187. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +3 -1
  188. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -1
  189. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +2 -1
  190. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -1
  191. package/expo-plugin/build/types/types.d.ts +23 -4
  192. package/expo-plugin/build/types/types.d.ts.map +1 -1
  193. package/expo-plugin/build/types/utils/urlScheme.d.ts +16 -0
  194. package/expo-plugin/build/types/utils/urlScheme.d.ts.map +1 -1
  195. package/expo-plugin/build/types/validation.d.ts +2 -1
  196. package/expo-plugin/build/types/validation.d.ts.map +1 -1
  197. package/expo-plugin/src/constants.ts +24 -1
  198. package/expo-plugin/src/index.ts +9 -0
  199. package/expo-plugin/src/ios/index.ts +3 -0
  200. package/expo-plugin/src/ios/infoPlist.ts +33 -5
  201. package/expo-plugin/src/ios/serverUpdate.ts +29 -0
  202. package/expo-plugin/src/ios-widget/clientRendered.ts +9 -5
  203. package/expo-plugin/src/ios-widget/clientRenderedPrerender.ts +11 -6
  204. package/expo-plugin/src/ios-widget/dynamic-live-activity/swift.ts +138 -0
  205. package/expo-plugin/src/ios-widget/files/index.ts +15 -4
  206. package/expo-plugin/src/ios-widget/files/infoPlist.ts +17 -3
  207. package/expo-plugin/src/ios-widget/files/manifest.ts +42 -2
  208. package/expo-plugin/src/ios-widget/files/swift-utils.ts +3 -0
  209. package/expo-plugin/src/ios-widget/files/swift.ts +69 -22
  210. package/expo-plugin/src/ios-widget/index.ts +13 -3
  211. package/expo-plugin/src/ios-widget/widgetPlist.ts +37 -23
  212. package/expo-plugin/src/ios-widget/xcode/__snapshots__/applyXcodeChanges.node.test.ts.snap +34 -28
  213. package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +59 -12
  214. package/expo-plugin/src/ios-widget/xcode/index.ts +23 -6
  215. package/expo-plugin/src/types.ts +28 -4
  216. package/expo-plugin/src/utils/urlScheme.ts +47 -17
  217. package/expo-plugin/src/validation.ts +76 -1
  218. package/ios/Package.swift +32 -3
  219. package/ios/VoltraWidget.podspec +1 -0
  220. package/ios/app/NativeVoltra.mm +107 -7
  221. package/ios/app/VoltraLiveActivityManager.swift +30 -0
  222. package/ios/app/VoltraLiveActivityService.swift +77 -5
  223. package/ios/app/VoltraModule.swift +99 -1
  224. package/ios/app/VoltraModuleImpl.swift +100 -2
  225. package/ios/app/VoltraViewComponentView.mm +3 -3
  226. package/ios/app/VoltraWidgetService.swift +147 -12
  227. package/ios/app/dynamic-live-activity/VoltraDynamicLiveActivityService.swift +97 -0
  228. package/ios/app/dynamic-live-activity/VoltraLiveActivityChronology.swift +68 -0
  229. package/ios/shared/DynamicWidgetPropsStore.swift +73 -6
  230. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerFetchResolver.swift +34 -0
  231. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerProps.swift +55 -0
  232. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerPropsStore.swift +146 -0
  233. package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerUpdateRunner.swift +193 -0
  234. package/ios/shared/ServerWidgetContentResolver.swift +60 -0
  235. package/ios/shared/ServerWidgetResponseStore.swift +25 -0
  236. package/ios/shared/ShortNames.swift +6 -0
  237. package/ios/shared/VoltraConfig.swift +41 -0
  238. package/ios/shared/VoltraConstants.swift +15 -0
  239. package/ios/shared/VoltraElement.swift +127 -43
  240. package/ios/shared/VoltraEventBus.swift +52 -7
  241. package/ios/shared/VoltraJSRenderer.swift +90 -22
  242. package/ios/shared/VoltraNode.swift +1 -109
  243. package/ios/shared/VoltraRefreshIntent.swift +1 -1
  244. package/ios/shared/VoltraWidgetKind.swift +41 -0
  245. package/ios/shared/VoltraWidgetServerFetcher.swift +52 -107
  246. package/ios/shared/WidgetServer/VoltraWidgetAppearance.swift +17 -0
  247. package/ios/shared/WidgetServer/VoltraWidgetServer.swift +138 -0
  248. package/ios/shared/WidgetServer/WidgetCanonicalConfiguration.swift +77 -0
  249. package/ios/shared/WidgetServer/WidgetScope.swift +55 -0
  250. package/ios/shared/WidgetServer/WidgetServerEtagStore.swift +55 -0
  251. package/ios/shared/WidgetServer/WidgetServerFetcher.swift +179 -0
  252. package/ios/shared/WidgetServer/WidgetServerRequestBuilder.swift +114 -0
  253. package/ios/shared/WidgetServer/WidgetServerSettingsCodec.swift +47 -0
  254. package/ios/shared/WidgetServer/WidgetServerSettingsResolver.swift +129 -0
  255. package/ios/shared/WidgetServer/WidgetServerSettingsStore.swift +170 -0
  256. package/ios/shared/WidgetServer/WidgetServerSettingsValidator.swift +73 -0
  257. package/ios/shared/WidgetServer/WidgetServerUpdateSettings.swift +123 -0
  258. package/ios/shared/WidgetServer/WidgetServerUpdateSettingsJson.swift +115 -0
  259. package/ios/shared/dynamic-live-activity/DynamicLiveActivityPropsCodec.swift +13 -0
  260. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityBundleSource.swift +156 -0
  261. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityObserver.swift +97 -0
  262. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityOperations.swift +105 -0
  263. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityPayloadValidator.swift +55 -0
  264. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRegistry.swift +143 -0
  265. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderFailureQueue.swift +158 -0
  266. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderFailureReporter.swift +120 -0
  267. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderer.swift +370 -0
  268. package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityTypes.swift +87 -0
  269. package/ios/shared/dynamic-live-activity/VoltraLiveActivityOrder.swift +19 -0
  270. package/ios/target/VoltraClientWidgetRuntime.swift +44 -6
  271. package/ios/target/VoltraDynamicWidgetServerUpdateProvider.swift +204 -0
  272. package/ios/target/VoltraHomeWidget.swift +85 -90
  273. package/ios/ui/Extensions/VoltraNode+View.swift +113 -0
  274. package/ios/ui/Generated/Parameters/ChartParameters.swift +3 -0
  275. package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +2 -2
  276. package/ios/ui/Views/VoltraChart.swift +108 -0
  277. package/package.json +4 -4
  278. package/src/events.ts +34 -0
  279. package/src/index.ts +22 -0
  280. package/src/live-activity/api.ts +2 -2
  281. package/src/live-activity/dynamic-api.ts +240 -0
  282. package/src/native/NativeVoltra.ts +21 -0
  283. package/src/types.ts +4 -0
  284. package/src/utils/enableDynamicLiveActivityHotReload.ts +50 -0
  285. package/src/utils/enableWidgetHotReload.ts +9 -16
  286. package/src/utils/useUpdateOnHMR.ts +3 -12
  287. package/src/widgets/server-credentials.ts +8 -0
  288. package/src/widgets/server-update.ts +84 -0
  289. /package/ios/shared/{VoltraKeychainHelper.swift → WidgetServer/VoltraKeychainHelper.swift} +0 -0
@@ -11,16 +11,24 @@ import {
11
11
  type WidgetLabel,
12
12
  } from '@use-voltra/expo-plugin'
13
13
 
14
- import { DEFAULT_WIDGET_FAMILIES, WIDGET_FAMILY_MAP } from '../../constants'
15
- import type { IOSWidgetConfig } from '../../types'
14
+ import { DEFAULT_WIDGET_FAMILIES, WIDGET_FAMILY_MAP, widgetKind } from '../../constants'
15
+ import type { IOSDynamicLiveActivityConfig, IOSWidgetConfig } from '../../types'
16
16
  import { VOLTRA_WIDGET_STRINGS_BASENAME } from '../../utils/fileDiscovery'
17
17
  import { detectClientRenderedWidgets, type DetectedIOSWidget } from '../clientRendered'
18
18
  import { prerenderClientRenderedWidgets } from '../clientRenderedPrerender'
19
+ import {
20
+ generateDynamicLiveActivitiesSwift,
21
+ generateDynamicLiveActivityTypesSwift,
22
+ generateDynamicLiveActivityWidgetInstances,
23
+ } from '../dynamic-live-activity/swift'
24
+
25
+ import { escapeForSwiftStringLiteral } from './swift-utils'
19
26
 
20
27
  export interface GenerateSwiftFilesOptions {
21
28
  targetPath: string
22
29
  projectRoot: string
23
30
  widgets?: IOSWidgetConfig[]
31
+ liveActivities?: IOSDynamicLiveActivityConfig[]
24
32
  }
25
33
 
26
34
  type RenderWidgetToString = (variants: unknown) => string
@@ -37,7 +45,7 @@ type RenderWidgetToString = (variants: unknown) => string
37
45
  * - VoltraWidgetBundle.swift (widget bundle definition)
38
46
  */
39
47
  export async function generateSwiftFiles(options: GenerateSwiftFilesOptions): Promise<void> {
40
- const { targetPath, projectRoot, widgets } = options
48
+ const { targetPath, projectRoot, widgets, liveActivities } = options
41
49
 
42
50
  // Dynamic import keeps the plugin CommonJS-compatible while resolving the current package entry.
43
51
  const serverModuleId = '@use-voltra/ios/server'
@@ -59,7 +67,7 @@ export async function generateSwiftFiles(options: GenerateSwiftFilesOptions): Pr
59
67
  // stringify). Both produce entries in the same map shape so
60
68
  // VoltraWidgetInitialStates.swift can read either via the same lookup at runtime.
61
69
  const serverWidgets = detectedWidgets.filter((w) => !w.clientRendered)
62
- const serverStates = await prerenderWidgetState(serverWidgets, projectRoot, renderWidgetToString)
70
+ const serverStates = await prerenderWidgetState(serverWidgets, projectRoot, renderWidgetToString, 'ios')
63
71
  const clientStates = await prerenderClientRenderedWidgets(detectedWidgets, projectRoot)
64
72
  const prerenderedStates = new Map([...serverStates, ...clientStates])
65
73
 
@@ -76,12 +84,24 @@ export async function generateSwiftFiles(options: GenerateSwiftFilesOptions): Pr
76
84
 
77
85
  // Generate the widget bundle Swift file
78
86
  const widgetBundleContent =
79
- detectedWidgets.length > 0 ? generateWidgetBundleSwift(detectedWidgets) : generateDefaultWidgetBundleSwift()
87
+ detectedWidgets.length > 0 || (liveActivities?.length ?? 0) > 0
88
+ ? generateWidgetBundleSwift(detectedWidgets, liveActivities ?? [])
89
+ : generateDefaultWidgetBundleSwift()
80
90
 
81
91
  const widgetBundlePath = path.join(targetPath, 'VoltraWidgetBundle.swift')
82
92
  fs.writeFileSync(widgetBundlePath, widgetBundleContent)
83
93
 
84
94
  logger.info(`Generated VoltraWidgetBundle.swift with ${widgets?.length ?? 0} home screen widgets`)
95
+
96
+ fs.writeFileSync(
97
+ path.join(targetPath, 'VoltraDynamicLiveActivityTypes.swift'),
98
+ generateDynamicLiveActivityTypesSwift(liveActivities ?? [])
99
+ )
100
+ fs.writeFileSync(
101
+ path.join(targetPath, 'VoltraDynamicLiveActivities.swift'),
102
+ generateDynamicLiveActivitiesSwift(liveActivities ?? [])
103
+ )
104
+ logger.info(`Generated Dynamic Live Activity Swift scaffolding with ${liveActivities?.length ?? 0} definition(s)`)
85
105
  }
86
106
 
87
107
  const GENERATED_INITIAL_STATE_LOCALE_HELPER = dedent`
@@ -155,10 +175,6 @@ const GENERATED_INITIAL_STATE_LOCALE_HELPER = dedent`
155
175
  // https://developer.apple.com/documentation/foundation/localizedstringresource
156
176
  // ============================================================================
157
177
 
158
- function escapeForSwiftStringLiteral(s: string): string {
159
- return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r')
160
- }
161
-
162
178
  function escapeDotStringsValue(s: string): string {
163
179
  return escapeForSwiftStringLiteral(s)
164
180
  }
@@ -285,6 +301,12 @@ function iosWidgetGalleryLabelSwiftExpr(
285
301
  * - Dynamic Widget → `VoltraClientWidgetProvider` + `VoltraClientWidgetContentView`
286
302
  * (the content view internally renders via VoltraHomeWidgetView so the UI layer is
287
303
  * identical to the fallback state path — see VoltraClientWidgetRuntime.swift)
304
+ * - Dynamic Widget with a `serverUpdate` → `VoltraDynamicWidgetServerUpdateProvider`, which wraps
305
+ * the one above and adds the fetch, the commit and the schedule
306
+ *
307
+ * `entry` picks the render engine and `serverUpdate` picks where the data comes from, so the two
308
+ * keys together select one of four providers. Runtime code never asks "is this server-driven?" —
309
+ * the answer is baked in here, once, at generate time.
288
310
  */
289
311
  function widgetUsesAppIntent(widget: DetectedIOSWidget): boolean {
290
312
  return widget.clientRendered && !!widget.appIntent && widget.appIntent.parameters.length > 0
@@ -306,9 +328,13 @@ function generateWidgetStruct(widget: DetectedIOSWidget): string {
306
328
  const displayNameExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'displayName', widget.displayName)
307
329
  const descriptionExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'description', widget.description)
308
330
 
331
+ const clientProviderName = widget.serverUpdate
332
+ ? 'VoltraDynamicWidgetServerUpdateProvider'
333
+ : 'VoltraClientWidgetProvider'
334
+
309
335
  const providerAndContent = widget.clientRendered
310
336
  ? dedent`
311
- provider: VoltraClientWidgetProvider(
337
+ provider: ${clientProviderName}(
312
338
  widgetId: widgetId,
313
339
  initialState: VoltraWidgetInitialStates.getInitialState(for: widgetId)
314
340
  )
@@ -335,7 +361,7 @@ function generateWidgetStruct(widget: DetectedIOSWidget): string {
335
361
 
336
362
  public var body: some WidgetConfiguration {
337
363
  StaticConfiguration(
338
- kind: "Voltra_Widget_${widget.id}",
364
+ kind: "${widgetKind(widget)}",
339
365
  ${providerAndContent}
340
366
  .configurationDisplayName(${displayNameExpr})
341
367
  .description(${descriptionExpr})
@@ -377,6 +403,18 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
377
403
  const initBody = params.map((p) => ` self.${p.name} = ${p.name}`).join('\n')
378
404
  const configuredDict = dictLiteral(params.map((p) => `"${p.name}": configuration.${p.name}`))
379
405
  const defaultDict = dictLiteral(params.map((p) => `"${p.name}": ${swiftDefault(p)}`))
406
+ // A server-driven Dynamic Widget fetches on every timeline request and schedules the next one
407
+ // from its resolved interval; a plain one has nothing to ask again for, so its policy is .never.
408
+ const appIntentTimelineBody = widget.serverUpdate
409
+ ? dedent`
410
+ return await VoltraDynamicWidgetServerUpdateProvider.timeline(
411
+ widgetId: widgetId,
412
+ family: context.family,
413
+ configuration: ${configuredDict}
414
+ )`
415
+ : dedent`
416
+ let entry = await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
417
+ return Timeline(entries: [entry], policy: .never)`
380
418
 
381
419
  return dedent`
382
420
  // MARK: - Client-rendered AppIntent widget: ${widget.id}
@@ -408,9 +446,8 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
408
446
  await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
409
447
  }
410
448
 
411
- func timeline(for configuration: ${intentName}, in _: Context) async -> Timeline<VoltraClientWidgetEntry> {
412
- let entry = await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
413
- return Timeline(entries: [entry], policy: .never)
449
+ func timeline(for configuration: ${intentName}, in context: Context) async -> Timeline<VoltraClientWidgetEntry> {
450
+ ${appIntentTimelineBody}
414
451
  }
415
452
  }
416
453
 
@@ -422,7 +459,7 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
422
459
 
423
460
  public var body: some WidgetConfiguration {
424
461
  AppIntentConfiguration(
425
- kind: "Voltra_Widget_${widget.id}",
462
+ kind: "${widgetKind(widget)}",
426
463
  intent: ${intentName}.self,
427
464
  provider: ${providerName}()
428
465
  ) { entry in
@@ -443,7 +480,10 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
443
480
  /**
444
481
  * Generates the VoltraWidgetBundle.swift file content with configured widgets
445
482
  */
446
- function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
483
+ function generateWidgetBundleSwift(
484
+ widgets: DetectedIOSWidget[],
485
+ liveActivities: IOSDynamicLiveActivityConfig[] = []
486
+ ): string {
447
487
  // Generate widget structs
448
488
  const widgetStructs = widgets.map((w) => generateWidgetStruct(w)).join('\n\n')
449
489
 
@@ -457,7 +497,12 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
457
497
  .map((w) => `VoltraWidget_${w.id}()`)
458
498
  .join('\n ')}\n }`
459
499
  : ''
460
- const widgetInstances = [plainInstances, appIntentInstances].filter(Boolean).join('\n ')
500
+ const dynamicLiveActivityInstances = generateDynamicLiveActivityWidgetInstances(liveActivities)
501
+ const widgetInstances = [plainInstances, appIntentInstances, dynamicLiveActivityInstances]
502
+ .filter(Boolean)
503
+ .join('\n ')
504
+ const widgetSectionTitle =
505
+ liveActivities.length > 0 ? 'Home Screen Widgets and Dynamic Live Activities' : 'Home Screen Widgets'
461
506
 
462
507
  const needsFoundation = widgets.some(widgetUsesGalleryLocalization)
463
508
  const foundationImport = needsFoundation ? 'import Foundation\n' : ''
@@ -473,7 +518,7 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
473
518
 
474
519
  ${foundationImport}${appIntentsImport}import SwiftUI
475
520
  import WidgetKit
476
- import VoltraWidget
521
+ import VoltraRuntime
477
522
 
478
523
  @main
479
524
  struct VoltraWidgetBundle: WidgetBundle {
@@ -481,7 +526,7 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
481
526
  // Live Activity (with Watch/CarPlay support)
482
527
  VoltraWidget()
483
528
 
484
- // Home Screen Widgets
529
+ // ${widgetSectionTitle}
485
530
  ${widgetInstances}
486
531
  }
487
532
  }
@@ -493,8 +538,8 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
493
538
  }
494
539
 
495
540
  /**
496
- * Generates the VoltraWidgetBundle.swift file content when no widgets are configured
497
- * (only Live Activities)
541
+ * Generates the VoltraWidgetBundle.swift file content when no Home Screen widgets or Dynamic
542
+ * Live Activities are configured. Keep this legacy output stable for existing projects.
498
543
  */
499
544
  function generateDefaultWidgetBundleSwift(): string {
500
545
  return dedent`
@@ -507,7 +552,7 @@ function generateDefaultWidgetBundleSwift(): string {
507
552
 
508
553
  import SwiftUI
509
554
  import WidgetKit
510
- import VoltraWidget // Import Voltra widgets
555
+ import VoltraRuntime // Import Voltra widgets
511
556
 
512
557
  @main
513
558
  struct VoltraWidgetBundle: WidgetBundle {
@@ -624,4 +669,6 @@ function getSwiftRawStringDelimiter(str: string): string {
624
669
  export const __test__ = {
625
670
  generateInitialStatesSwift,
626
671
  generateWidgetBundleSwift,
672
+ generateDynamicLiveActivityTypesSwift,
673
+ generateDynamicLiveActivitiesSwift,
627
674
  }
@@ -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, version, buildNumber }],
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)
@@ -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
@@ -13,11 +13,13 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
13
13
  13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; };
14
14
  13B07FC11A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
15
15
  13B07FC21A68108700A75B9A /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB61A68108700A75B9A /* Info.plist */; };
16
- F1D00000000000000000000F /* VoltraWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000008 /* VoltraWidget.swift */; };
17
- F1D000000000000000000010 /* VoltraWidgetInitialStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */; };
16
+ F1D000000000000000000010 /* VoltraWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000008 /* VoltraWidget.swift */; };
17
+ F1D000000000000000000011 /* VoltraWidgetInitialStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */; };
18
+ F1D000000000000000000012 /* VoltraDynamicLiveActivityTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */; };
19
+ F1D000000000000000000013 /* VoltraDynamicLiveActivityTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */; };
18
20
  F1D000000000000000000006 /* VoltraWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000005 /* VoltraWidgetExtension.appex */; };
19
- F1D000000000000000000014 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000C /* Assets.xcassets */; };
20
- F1D000000000000000000015 /* VoltraWidgets.strings in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000D /* VoltraWidgets.strings */; };
21
+ F1D000000000000000000017 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000D /* Assets.xcassets */; };
22
+ F1D000000000000000000018 /* VoltraWidgets.strings in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000E /* VoltraWidgets.strings */; };
21
23
  /* End PBXBuildFile section */
22
24
 
23
25
  /* Begin PBXFileReference section */
@@ -28,10 +30,11 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
28
30
  F1D000000000000000000005 /* VoltraWidgetExtension.appex */ = {isa = PBXFileReference; name = "VoltraWidgetExtension.appex"; path = "VoltraWidgetExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; fileEncoding = undefined; lastKnownFileType = undefined; explicitFileType = wrapper.app-extension; includeInIndex = 0; };
29
31
  F1D000000000000000000008 /* VoltraWidget.swift */ = {isa = PBXFileReference; name = "VoltraWidget.swift"; path = "VoltraWidget.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
30
32
  F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */ = {isa = PBXFileReference; name = "VoltraWidgetInitialStates.swift"; path = "VoltraWidgetInitialStates.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
31
- F1D00000000000000000000A /* VoltraWidgetExtension.entitlements */ = {isa = PBXFileReference; name = "VoltraWidgetExtension.entitlements"; path = "VoltraWidgetExtension.entitlements"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
32
- F1D00000000000000000000B /* VoltraWidgetExtension-Info.plist */ = {isa = PBXFileReference; name = "VoltraWidgetExtension-Info.plist"; path = "VoltraWidgetExtension-Info.plist"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = text.plist.xml; explicitFileType = undefined; includeInIndex = 0; };
33
- F1D00000000000000000000C /* Assets.xcassets */ = {isa = PBXFileReference; name = "Assets.xcassets"; path = "Assets.xcassets"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = folder.assetcatalog; explicitFileType = undefined; includeInIndex = 0; };
34
- F1D00000000000000000000D /* VoltraWidgets.strings */ = {isa = PBXFileReference; name = "VoltraWidgets.strings"; path = "en.lproj/VoltraWidgets.strings"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = text.plist.strings; explicitFileType = undefined; includeInIndex = 0; };
33
+ F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */ = {isa = PBXFileReference; name = "VoltraDynamicLiveActivityTypes.swift"; path = "VoltraDynamicLiveActivityTypes.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
34
+ F1D00000000000000000000B /* VoltraWidgetExtension.entitlements */ = {isa = PBXFileReference; name = "VoltraWidgetExtension.entitlements"; path = "VoltraWidgetExtension.entitlements"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
35
+ F1D00000000000000000000C /* VoltraWidgetExtension-Info.plist */ = {isa = PBXFileReference; name = "VoltraWidgetExtension-Info.plist"; path = "VoltraWidgetExtension-Info.plist"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = text.plist.xml; explicitFileType = undefined; includeInIndex = 0; };
36
+ F1D00000000000000000000D /* Assets.xcassets */ = {isa = PBXFileReference; name = "Assets.xcassets"; path = "Assets.xcassets"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = folder.assetcatalog; explicitFileType = undefined; includeInIndex = 0; };
37
+ F1D00000000000000000000E /* VoltraWidgets.strings */ = {isa = PBXFileReference; name = "VoltraWidgets.strings"; path = "en.lproj/VoltraWidgets.strings"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = text.plist.strings; explicitFileType = undefined; includeInIndex = 0; };
35
38
  /* End PBXFileReference section */
36
39
 
37
40
  /* Begin PBXFrameworksBuildPhase section */
@@ -42,7 +45,7 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
42
45
  );
43
46
  runOnlyForDeploymentPostprocessing = 0;
44
47
  };
45
- F1D000000000000000000012 /* Frameworks */ = {
48
+ F1D000000000000000000015 /* Frameworks */ = {
46
49
  isa = PBXFrameworksBuildPhase;
47
50
  buildActionMask = 2147483647;
48
51
  files = (
@@ -88,10 +91,11 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
88
91
  children = (
89
92
  F1D000000000000000000008 /* VoltraWidget.swift */,
90
93
  F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */,
91
- F1D00000000000000000000A /* VoltraWidgetExtension.entitlements */,
92
- F1D00000000000000000000B /* VoltraWidgetExtension-Info.plist */,
93
- F1D00000000000000000000C /* Assets.xcassets */,
94
- F1D00000000000000000000D /* VoltraWidgets.strings */,
94
+ F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */,
95
+ F1D00000000000000000000B /* VoltraWidgetExtension.entitlements */,
96
+ F1D00000000000000000000C /* VoltraWidgetExtension-Info.plist */,
97
+ F1D00000000000000000000D /* Assets.xcassets */,
98
+ F1D00000000000000000000E /* VoltraWidgets.strings */,
95
99
  );
96
100
  name = VoltraWidgetExtension;
97
101
  path = VoltraWidgetExtension;
@@ -107,12 +111,12 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
107
111
  13B07F871A680F5B00A75B9A /* Sources */,
108
112
  13B07F8C1A680F5B00A75B9A /* Frameworks */,
109
113
  13B07F8E1A680F5B00A75B9A /* Resources */,
110
- F1D000000000000000000011 /* Embed Foundation Extensions */,
114
+ F1D000000000000000000014 /* Embed Foundation Extensions */,
111
115
  );
112
116
  buildRules = (
113
117
  );
114
118
  dependencies = (
115
- F1D000000000000000000016 /* PBXTargetDependency */,
119
+ F1D000000000000000000019 /* PBXTargetDependency */,
116
120
  );
117
121
  name = voltraexample;
118
122
  productName = voltraexample;
@@ -127,9 +131,9 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
127
131
  buildConfigurationList = F1D000000000000000000002;
128
132
  productReference = F1D000000000000000000005;
129
133
  buildPhases = (
130
- F1D00000000000000000000E /* Sources */,
131
- F1D000000000000000000012 /* Frameworks */,
132
- F1D000000000000000000013 /* Resources */,
134
+ F1D00000000000000000000F /* Sources */,
135
+ F1D000000000000000000015 /* Frameworks */,
136
+ F1D000000000000000000016 /* Resources */,
133
137
  );
134
138
  buildRules = (
135
139
  );
@@ -181,12 +185,12 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
181
185
  );
182
186
  runOnlyForDeploymentPostprocessing = 0;
183
187
  };
184
- F1D000000000000000000013 /* Resources */ = {
188
+ F1D000000000000000000016 /* Resources */ = {
185
189
  isa = PBXResourcesBuildPhase;
186
190
  buildActionMask = 2147483647;
187
191
  files = (
188
- F1D000000000000000000014 /* Assets.xcassets in Resources */,
189
- F1D000000000000000000015 /* VoltraWidgets.strings in Resources */,
192
+ F1D000000000000000000017 /* Assets.xcassets in Resources */,
193
+ F1D000000000000000000018 /* VoltraWidgets.strings in Resources */,
190
194
  );
191
195
  runOnlyForDeploymentPostprocessing = 0;
192
196
  };
@@ -198,15 +202,17 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
198
202
  buildActionMask = 2147483647;
199
203
  files = (
200
204
  13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */,
205
+ F1D000000000000000000013 /* VoltraDynamicLiveActivityTypes.swift in Sources */,
201
206
  );
202
207
  runOnlyForDeploymentPostprocessing = 0;
203
208
  };
204
- F1D00000000000000000000E /* Sources */ = {
209
+ F1D00000000000000000000F /* Sources */ = {
205
210
  isa = PBXSourcesBuildPhase;
206
211
  buildActionMask = 2147483647;
207
212
  files = (
208
- F1D00000000000000000000F /* VoltraWidget.swift in Sources */,
209
- F1D000000000000000000010 /* VoltraWidgetInitialStates.swift in Sources */,
213
+ F1D000000000000000000010 /* VoltraWidget.swift in Sources */,
214
+ F1D000000000000000000011 /* VoltraWidgetInitialStates.swift in Sources */,
215
+ F1D000000000000000000012 /* VoltraDynamicLiveActivityTypes.swift in Sources */,
210
216
  );
211
217
  runOnlyForDeploymentPostprocessing = 0;
212
218
  };
@@ -320,7 +326,7 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
320
326
  /* End XCConfigurationList section */
321
327
 
322
328
  /* Begin PBXCopyFilesBuildPhase section */
323
- F1D000000000000000000011 /* Embed Foundation Extensions */ = {
329
+ F1D000000000000000000014 /* Embed Foundation Extensions */ = {
324
330
  isa = PBXCopyFilesBuildPhase;
325
331
  buildActionMask = 2147483647;
326
332
  files = (
@@ -334,15 +340,15 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
334
340
  /* End PBXCopyFilesBuildPhase section */
335
341
 
336
342
  /* Begin PBXTargetDependency section */
337
- F1D000000000000000000016 /* PBXTargetDependency */ = {
343
+ F1D000000000000000000019 /* PBXTargetDependency */ = {
338
344
  isa = PBXTargetDependency;
339
345
  target = F1D000000000000000000001 /* VoltraWidgetExtension */;
340
- targetProxy = F1D000000000000000000017 /* PBXContainerItemProxy */;
346
+ targetProxy = F1D00000000000000000001A /* PBXContainerItemProxy */;
341
347
  };
342
348
  /* End PBXTargetDependency section */
343
349
 
344
350
  /* Begin PBXContainerItemProxy section */
345
- F1D000000000000000000017 /* PBXContainerItemProxy */ = {
351
+ F1D00000000000000000001A /* PBXContainerItemProxy */ = {
346
352
  isa = PBXContainerItemProxy;
347
353
  containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
348
354
  proxyType = 1;