@use-voltra/ios-client 1.4.0 → 2.0.0-rc.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 (559) hide show
  1. package/README.md +113 -0
  2. package/Voltra.podspec +28 -0
  3. package/build/commonjs/VoltraModule.js +13 -0
  4. package/build/commonjs/VoltraModule.js.map +1 -0
  5. package/build/commonjs/components/VoltraLiveActivityPreview.js +30 -0
  6. package/build/commonjs/components/VoltraLiveActivityPreview.js.map +1 -0
  7. package/build/commonjs/components/VoltraView.js +50 -0
  8. package/build/commonjs/components/VoltraView.js.map +1 -0
  9. package/build/commonjs/components/VoltraWidgetPreview.js +58 -0
  10. package/build/commonjs/components/VoltraWidgetPreview.js.map +1 -0
  11. package/build/commonjs/events.js +32 -0
  12. package/build/commonjs/events.js.map +1 -0
  13. package/build/commonjs/helpers.js +26 -0
  14. package/build/commonjs/helpers.js.map +1 -0
  15. package/build/commonjs/index.js +226 -0
  16. package/build/commonjs/index.js.map +1 -0
  17. package/build/commonjs/live-activity/api.js +168 -0
  18. package/build/commonjs/live-activity/api.js.map +1 -0
  19. package/build/commonjs/logger.js +39 -0
  20. package/build/commonjs/logger.js.map +1 -0
  21. package/build/commonjs/native/NativeVoltra.js +15 -0
  22. package/build/commonjs/native/NativeVoltra.js.map +1 -0
  23. package/build/commonjs/native/VoltraRNNativeComponent.ts +9 -0
  24. package/build/commonjs/package.json +1 -0
  25. package/build/commonjs/preload.js +54 -0
  26. package/build/commonjs/preload.js.map +1 -0
  27. package/build/commonjs/types.js +2 -0
  28. package/build/commonjs/types.js.map +1 -0
  29. package/build/commonjs/utils/assertRunningOnApple.js +16 -0
  30. package/build/commonjs/utils/assertRunningOnApple.js.map +1 -0
  31. package/build/commonjs/utils/helpers.js +19 -0
  32. package/build/commonjs/utils/helpers.js.map +1 -0
  33. package/build/commonjs/utils/index.js +28 -0
  34. package/build/commonjs/utils/index.js.map +1 -0
  35. package/build/commonjs/utils/useUpdateOnHMR.js +25 -0
  36. package/build/commonjs/utils/useUpdateOnHMR.js.map +1 -0
  37. package/build/commonjs/widgets/server-credentials.js +18 -0
  38. package/build/commonjs/widgets/server-credentials.js.map +1 -0
  39. package/build/commonjs/widgets/widget-api.js +55 -0
  40. package/build/commonjs/widgets/widget-api.js.map +1 -0
  41. package/build/module/VoltraModule.js +4 -0
  42. package/build/module/VoltraModule.js.map +1 -0
  43. package/build/module/components/VoltraLiveActivityPreview.js +25 -0
  44. package/build/module/components/VoltraLiveActivityPreview.js.map +1 -0
  45. package/build/module/components/VoltraView.js +44 -0
  46. package/build/module/components/VoltraView.js.map +1 -0
  47. package/build/module/components/VoltraWidgetPreview.js +53 -0
  48. package/build/module/components/VoltraWidgetPreview.js.map +1 -0
  49. package/build/module/events.js +28 -0
  50. package/build/module/events.js.map +1 -0
  51. package/build/module/helpers.js +21 -0
  52. package/build/module/helpers.js.map +1 -0
  53. package/build/module/index.js +17 -0
  54. package/build/module/index.js.map +1 -0
  55. package/build/module/live-activity/api.js +158 -0
  56. package/build/module/live-activity/api.js.map +1 -0
  57. package/build/module/logger.js +35 -0
  58. package/build/module/logger.js.map +1 -0
  59. package/build/module/native/NativeVoltra.js +11 -0
  60. package/build/module/native/NativeVoltra.js.map +1 -0
  61. package/build/module/native/VoltraRNNativeComponent.ts +9 -0
  62. package/build/module/package.json +1 -0
  63. package/build/module/preload.js +48 -0
  64. package/build/module/preload.js.map +1 -0
  65. package/build/module/types.js +2 -0
  66. package/build/module/types.js.map +1 -0
  67. package/build/module/utils/assertRunningOnApple.js +11 -0
  68. package/build/module/utils/assertRunningOnApple.js.map +1 -0
  69. package/build/module/utils/helpers.js +4 -0
  70. package/build/module/utils/helpers.js.map +1 -0
  71. package/build/module/utils/index.js +5 -0
  72. package/build/module/utils/index.js.map +1 -0
  73. package/build/module/utils/useUpdateOnHMR.js +20 -0
  74. package/build/module/utils/useUpdateOnHMR.js.map +1 -0
  75. package/build/module/widgets/server-credentials.js +13 -0
  76. package/build/module/widgets/server-credentials.js.map +1 -0
  77. package/build/module/widgets/widget-api.js +45 -0
  78. package/build/module/widgets/widget-api.js.map +1 -0
  79. package/build/typescript/commonjs/VoltraModule.d.ts +3 -0
  80. package/build/typescript/commonjs/VoltraModule.d.ts.map +1 -0
  81. package/build/typescript/commonjs/components/VoltraLiveActivityPreview.d.ts.map +1 -0
  82. package/build/typescript/commonjs/components/VoltraView.d.ts.map +1 -0
  83. package/build/typescript/commonjs/components/VoltraWidgetPreview.d.ts.map +1 -0
  84. package/build/typescript/commonjs/events.d.ts.map +1 -0
  85. package/build/typescript/commonjs/helpers.d.ts.map +1 -0
  86. package/build/{types → typescript/commonjs}/index.d.ts +5 -0
  87. package/build/typescript/commonjs/index.d.ts.map +1 -0
  88. package/build/typescript/commonjs/live-activity/api.d.ts.map +1 -0
  89. package/build/typescript/commonjs/logger.d.ts.map +1 -0
  90. package/build/typescript/commonjs/native/NativeVoltra.d.ts +100 -0
  91. package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -0
  92. package/build/typescript/commonjs/native/VoltraRNNativeComponent.d.ts +8 -0
  93. package/build/typescript/commonjs/native/VoltraRNNativeComponent.d.ts.map +1 -0
  94. package/build/typescript/commonjs/package.json +1 -0
  95. package/build/typescript/commonjs/preload.d.ts.map +1 -0
  96. package/build/typescript/commonjs/types.d.ts.map +1 -0
  97. package/build/typescript/commonjs/utils/assertRunningOnApple.d.ts.map +1 -0
  98. package/build/typescript/commonjs/utils/helpers.d.ts.map +1 -0
  99. package/build/typescript/commonjs/utils/index.d.ts.map +1 -0
  100. package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts.map +1 -0
  101. package/build/typescript/commonjs/widgets/server-credentials.d.ts.map +1 -0
  102. package/build/typescript/commonjs/widgets/widget-api.d.ts.map +1 -0
  103. package/build/typescript/module/VoltraModule.d.ts +3 -0
  104. package/build/typescript/module/VoltraModule.d.ts.map +1 -0
  105. package/build/typescript/module/components/VoltraLiveActivityPreview.d.ts +7 -0
  106. package/build/typescript/module/components/VoltraLiveActivityPreview.d.ts.map +1 -0
  107. package/build/typescript/module/components/VoltraView.d.ts +12 -0
  108. package/build/typescript/module/components/VoltraView.d.ts.map +1 -0
  109. package/build/typescript/module/components/VoltraWidgetPreview.d.ts +9 -0
  110. package/build/typescript/module/components/VoltraWidgetPreview.d.ts.map +1 -0
  111. package/build/typescript/module/events.d.ts +33 -0
  112. package/build/typescript/module/events.d.ts.map +1 -0
  113. package/build/typescript/module/helpers.d.ts +3 -0
  114. package/build/typescript/module/helpers.d.ts.map +1 -0
  115. package/build/typescript/module/index.d.ts +18 -0
  116. package/build/typescript/module/index.d.ts.map +1 -0
  117. package/build/typescript/module/live-activity/api.d.ts +35 -0
  118. package/build/typescript/module/live-activity/api.d.ts.map +1 -0
  119. package/build/typescript/module/logger.d.ts +16 -0
  120. package/build/typescript/module/logger.d.ts.map +1 -0
  121. package/build/typescript/module/native/NativeVoltra.d.ts +100 -0
  122. package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -0
  123. package/build/typescript/module/native/VoltraRNNativeComponent.d.ts +8 -0
  124. package/build/typescript/module/native/VoltraRNNativeComponent.d.ts.map +1 -0
  125. package/build/typescript/module/package.json +1 -0
  126. package/build/typescript/module/preload.d.ts +6 -0
  127. package/build/typescript/module/preload.d.ts.map +1 -0
  128. package/build/typescript/module/types.d.ts +2 -0
  129. package/build/typescript/module/types.d.ts.map +1 -0
  130. package/build/typescript/module/utils/assertRunningOnApple.d.ts +2 -0
  131. package/build/typescript/module/utils/assertRunningOnApple.d.ts.map +1 -0
  132. package/build/{esm/utils/helpers.js → typescript/module/utils/helpers.d.ts} +1 -1
  133. package/build/typescript/module/utils/helpers.d.ts.map +1 -0
  134. package/build/{esm/utils/index.js → typescript/module/utils/index.d.ts} +1 -1
  135. package/build/typescript/module/utils/index.d.ts.map +1 -0
  136. package/build/typescript/module/utils/useUpdateOnHMR.d.ts +5 -0
  137. package/build/typescript/module/utils/useUpdateOnHMR.d.ts.map +1 -0
  138. package/build/typescript/module/widgets/server-credentials.d.ts +5 -0
  139. package/build/typescript/module/widgets/server-credentials.d.ts.map +1 -0
  140. package/build/typescript/module/widgets/widget-api.d.ts +11 -0
  141. package/build/typescript/module/widgets/widget-api.d.ts.map +1 -0
  142. package/expo-plugin/app.plugin.js +3 -0
  143. package/expo-plugin/build/cjs/constants.js +23 -0
  144. package/expo-plugin/build/cjs/constants.js.map +1 -0
  145. package/expo-plugin/build/cjs/index.js +51 -0
  146. package/expo-plugin/build/cjs/index.js.map +1 -0
  147. package/expo-plugin/build/cjs/ios/eas.js +28 -0
  148. package/expo-plugin/build/cjs/ios/eas.js.map +1 -0
  149. package/expo-plugin/build/cjs/ios/entitlements.js +46 -0
  150. package/expo-plugin/build/cjs/ios/entitlements.js.map +1 -0
  151. package/expo-plugin/build/cjs/ios/index.js +39 -0
  152. package/expo-plugin/build/cjs/ios/index.js.map +1 -0
  153. package/expo-plugin/build/cjs/ios/infoPlist.js +51 -0
  154. package/expo-plugin/build/cjs/ios/infoPlist.js.map +1 -0
  155. package/expo-plugin/build/cjs/ios/pushNotifications.js +22 -0
  156. package/expo-plugin/build/cjs/ios/pushNotifications.js.map +1 -0
  157. package/expo-plugin/build/cjs/ios-widget/eas.js +66 -0
  158. package/expo-plugin/build/cjs/ios-widget/eas.js.map +1 -0
  159. package/expo-plugin/build/cjs/ios-widget/files/assets.js +199 -0
  160. package/expo-plugin/build/cjs/ios-widget/files/assets.js.map +1 -0
  161. package/expo-plugin/build/cjs/ios-widget/files/entitlements.js +77 -0
  162. package/expo-plugin/build/cjs/ios-widget/files/entitlements.js.map +1 -0
  163. package/expo-plugin/build/cjs/ios-widget/files/index.js +92 -0
  164. package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -0
  165. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js +91 -0
  166. package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js.map +1 -0
  167. package/expo-plugin/build/cjs/ios-widget/files/swift.js +443 -0
  168. package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -0
  169. package/expo-plugin/build/cjs/ios-widget/fonts.js +151 -0
  170. package/expo-plugin/build/cjs/ios-widget/fonts.js.map +1 -0
  171. package/expo-plugin/build/cjs/ios-widget/index.js +46 -0
  172. package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -0
  173. package/expo-plugin/build/cjs/ios-widget/podfile.js +41 -0
  174. package/expo-plugin/build/cjs/ios-widget/podfile.js.map +1 -0
  175. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +99 -0
  176. package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -0
  177. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +247 -0
  178. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -0
  179. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js +91 -0
  180. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js.map +1 -0
  181. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js +79 -0
  182. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js.map +1 -0
  183. package/expo-plugin/build/cjs/ios-widget/xcode/index.js +155 -0
  184. package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -0
  185. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js +71 -0
  186. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -0
  187. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js +74 -0
  188. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js.map +1 -0
  189. package/expo-plugin/build/cjs/ios-widget/xcode/target.js +113 -0
  190. package/expo-plugin/build/cjs/ios-widget/xcode/target.js.map +1 -0
  191. package/expo-plugin/build/cjs/utils/fileDiscovery.js +120 -0
  192. package/expo-plugin/build/cjs/utils/fileDiscovery.js.map +1 -0
  193. package/expo-plugin/build/cjs/utils/urlScheme.js +40 -0
  194. package/expo-plugin/build/cjs/utils/urlScheme.js.map +1 -0
  195. package/expo-plugin/build/cjs/validation.js +55 -0
  196. package/expo-plugin/build/cjs/validation.js.map +1 -0
  197. package/expo-plugin/build/esm/constants.js +20 -0
  198. package/expo-plugin/build/esm/constants.js.map +1 -0
  199. package/expo-plugin/build/esm/index.js +49 -0
  200. package/expo-plugin/build/esm/index.js.map +1 -0
  201. package/expo-plugin/build/esm/ios/eas.js +24 -0
  202. package/expo-plugin/build/esm/ios/eas.js.map +1 -0
  203. package/expo-plugin/build/esm/ios/entitlements.js +42 -0
  204. package/expo-plugin/build/esm/ios/entitlements.js.map +1 -0
  205. package/expo-plugin/build/esm/ios/index.js +34 -0
  206. package/expo-plugin/build/esm/ios/index.js.map +1 -0
  207. package/expo-plugin/build/esm/ios/infoPlist.js +47 -0
  208. package/expo-plugin/build/esm/ios/infoPlist.js.map +1 -0
  209. package/expo-plugin/build/esm/ios/pushNotifications.js +18 -0
  210. package/expo-plugin/build/esm/ios/pushNotifications.js.map +1 -0
  211. package/expo-plugin/build/esm/ios-widget/eas.js +62 -0
  212. package/expo-plugin/build/esm/ios-widget/eas.js.map +1 -0
  213. package/expo-plugin/build/esm/ios-widget/files/assets.js +163 -0
  214. package/expo-plugin/build/esm/ios-widget/files/assets.js.map +1 -0
  215. package/expo-plugin/build/esm/ios-widget/files/entitlements.js +37 -0
  216. package/expo-plugin/build/esm/ios-widget/files/entitlements.js.map +1 -0
  217. package/expo-plugin/build/esm/ios-widget/files/index.js +55 -0
  218. package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -0
  219. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js +55 -0
  220. package/expo-plugin/build/esm/ios-widget/files/infoPlist.js.map +1 -0
  221. package/expo-plugin/build/esm/ios-widget/files/swift.js +403 -0
  222. package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -0
  223. package/expo-plugin/build/esm/ios-widget/fonts.js +111 -0
  224. package/expo-plugin/build/esm/ios-widget/fonts.js.map +1 -0
  225. package/expo-plugin/build/esm/ios-widget/index.js +42 -0
  226. package/expo-plugin/build/esm/ios-widget/index.js.map +1 -0
  227. package/expo-plugin/build/esm/ios-widget/podfile.js +37 -0
  228. package/expo-plugin/build/esm/ios-widget/podfile.js.map +1 -0
  229. package/expo-plugin/build/esm/ios-widget/widgetPlist.js +92 -0
  230. package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -0
  231. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +210 -0
  232. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -0
  233. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js +87 -0
  234. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js.map +1 -0
  235. package/expo-plugin/build/esm/ios-widget/xcode/groups.js +75 -0
  236. package/expo-plugin/build/esm/ios-widget/xcode/groups.js.map +1 -0
  237. package/expo-plugin/build/esm/ios-widget/xcode/index.js +118 -0
  238. package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -0
  239. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js +68 -0
  240. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -0
  241. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js +70 -0
  242. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js.map +1 -0
  243. package/expo-plugin/build/esm/ios-widget/xcode/target.js +108 -0
  244. package/expo-plugin/build/esm/ios-widget/xcode/target.js.map +1 -0
  245. package/expo-plugin/build/esm/utils/fileDiscovery.js +83 -0
  246. package/expo-plugin/build/esm/utils/fileDiscovery.js.map +1 -0
  247. package/expo-plugin/build/esm/utils/urlScheme.js +37 -0
  248. package/expo-plugin/build/esm/utils/urlScheme.js.map +1 -0
  249. package/expo-plugin/build/esm/validation.js +51 -0
  250. package/expo-plugin/build/esm/validation.js.map +1 -0
  251. package/expo-plugin/build/types/constants.d.ts +13 -0
  252. package/expo-plugin/build/types/constants.d.ts.map +1 -0
  253. package/expo-plugin/build/types/index.d.ts +10 -0
  254. package/expo-plugin/build/types/index.d.ts.map +1 -0
  255. package/expo-plugin/build/types/ios/eas.d.ts +12 -0
  256. package/expo-plugin/build/types/ios/eas.d.ts.map +1 -0
  257. package/expo-plugin/build/types/ios/entitlements.d.ts +14 -0
  258. package/expo-plugin/build/types/ios/entitlements.d.ts.map +1 -0
  259. package/expo-plugin/build/types/ios/index.d.ts +19 -0
  260. package/expo-plugin/build/types/ios/index.d.ts.map +1 -0
  261. package/expo-plugin/build/types/ios/infoPlist.d.ts +21 -0
  262. package/expo-plugin/build/types/ios/infoPlist.d.ts.map +1 -0
  263. package/expo-plugin/build/types/ios/pushNotifications.d.ts +10 -0
  264. package/expo-plugin/build/types/ios/pushNotifications.d.ts.map +1 -0
  265. package/expo-plugin/build/types/ios-widget/eas.d.ts +15 -0
  266. package/expo-plugin/build/types/ios-widget/eas.d.ts.map +1 -0
  267. package/expo-plugin/build/types/ios-widget/files/assets.d.ts +13 -0
  268. package/expo-plugin/build/types/ios-widget/files/assets.d.ts.map +1 -0
  269. package/expo-plugin/build/types/ios-widget/files/entitlements.d.ts +17 -0
  270. package/expo-plugin/build/types/ios-widget/files/entitlements.d.ts.map +1 -0
  271. package/expo-plugin/build/types/ios-widget/files/index.d.ts +24 -0
  272. package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -0
  273. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts +10 -0
  274. package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts.map +1 -0
  275. package/expo-plugin/build/types/ios-widget/files/swift.d.ts +24 -0
  276. package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -0
  277. package/expo-plugin/build/types/ios-widget/fonts.d.ts +22 -0
  278. package/expo-plugin/build/types/ios-widget/fonts.d.ts.map +1 -0
  279. package/expo-plugin/build/types/ios-widget/index.d.ts +31 -0
  280. package/expo-plugin/build/types/ios-widget/index.d.ts.map +1 -0
  281. package/expo-plugin/build/types/ios-widget/podfile.d.ts +9 -0
  282. package/expo-plugin/build/types/ios-widget/podfile.d.ts.map +1 -0
  283. package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts +20 -0
  284. package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts.map +1 -0
  285. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +25 -0
  286. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -0
  287. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts +20 -0
  288. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -0
  289. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts +15 -0
  290. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts.map +1 -0
  291. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +20 -0
  292. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -0
  293. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts +15 -0
  294. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -0
  295. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts +14 -0
  296. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts.map +1 -0
  297. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts +42 -0
  298. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts.map +1 -0
  299. package/expo-plugin/build/types/types.d.ts +74 -0
  300. package/expo-plugin/build/types/types.d.ts.map +1 -0
  301. package/expo-plugin/build/types/utils/fileDiscovery.d.ts +15 -0
  302. package/expo-plugin/build/types/utils/fileDiscovery.d.ts.map +1 -0
  303. package/expo-plugin/build/types/utils/urlScheme.d.ts +10 -0
  304. package/expo-plugin/build/types/utils/urlScheme.d.ts.map +1 -0
  305. package/expo-plugin/build/types/validation.d.ts +4 -0
  306. package/expo-plugin/build/types/validation.d.ts.map +1 -0
  307. package/expo-plugin/jest.config.js +18 -0
  308. package/expo-plugin/src/constants.ts +25 -0
  309. package/expo-plugin/src/index.ts +72 -0
  310. package/expo-plugin/src/ios/eas.ts +33 -0
  311. package/expo-plugin/src/ios/entitlements.ts +59 -0
  312. package/expo-plugin/src/ios/index.ts +47 -0
  313. package/expo-plugin/src/ios/infoPlist.ts +63 -0
  314. package/expo-plugin/src/ios/pushNotifications.ts +22 -0
  315. package/expo-plugin/src/ios-widget/eas.ts +79 -0
  316. package/expo-plugin/src/ios-widget/files/assets.ts +201 -0
  317. package/expo-plugin/src/ios-widget/files/entitlements.ts +48 -0
  318. package/expo-plugin/src/ios-widget/files/index.ts +74 -0
  319. package/expo-plugin/src/ios-widget/files/infoPlist.ts +57 -0
  320. package/expo-plugin/src/ios-widget/files/swift.node.test.ts +22 -0
  321. package/expo-plugin/src/ios-widget/files/swift.ts +476 -0
  322. package/expo-plugin/src/ios-widget/fonts.ts +132 -0
  323. package/expo-plugin/src/ios-widget/index.ts +73 -0
  324. package/expo-plugin/src/ios-widget/podfile.ts +44 -0
  325. package/expo-plugin/src/ios-widget/widgetPlist.ts +115 -0
  326. package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +301 -0
  327. package/expo-plugin/src/ios-widget/xcode/configurationList.ts +127 -0
  328. package/expo-plugin/src/ios-widget/xcode/groups.ts +101 -0
  329. package/expo-plugin/src/ios-widget/xcode/index.ts +149 -0
  330. package/expo-plugin/src/ios-widget/xcode/mainAppSettings.ts +95 -0
  331. package/expo-plugin/src/ios-widget/xcode/productFile.ts +91 -0
  332. package/expo-plugin/src/ios-widget/xcode/target.ts +148 -0
  333. package/expo-plugin/src/types.ts +89 -0
  334. package/expo-plugin/src/utils/fileDiscovery.ts +96 -0
  335. package/expo-plugin/src/utils/urlScheme.ts +45 -0
  336. package/expo-plugin/src/validation.node.test.ts +19 -0
  337. package/expo-plugin/src/validation.ts +63 -0
  338. package/expo-plugin/tsconfig.base.json +17 -0
  339. package/expo-plugin/tsconfig.cjs.json +9 -0
  340. package/expo-plugin/tsconfig.esm.json +9 -0
  341. package/expo-plugin/tsconfig.jest.json +8 -0
  342. package/expo-plugin/tsconfig.typecheck.json +12 -0
  343. package/expo-plugin/tsconfig.types.json +10 -0
  344. package/ios/Package.swift +68 -0
  345. package/ios/Tests/JSGradientParserTests.swift +201 -0
  346. package/ios/Tests/VoltraSharedTests/SmokeTests.swift +8 -0
  347. package/ios/VoltraWidget.podspec +30 -0
  348. package/ios/app/NativeVoltra.h +5 -0
  349. package/ios/app/NativeVoltra.mm +211 -0
  350. package/ios/app/VoltraActivity.swift +5 -0
  351. package/ios/app/VoltraImagePreload.swift +154 -0
  352. package/ios/app/VoltraLiveActivityManager.swift +228 -0
  353. package/ios/app/VoltraLiveActivityService.swift +306 -0
  354. package/ios/app/VoltraModule.swift +215 -0
  355. package/ios/app/VoltraModuleImpl.swift +331 -0
  356. package/ios/app/VoltraOptions.swift +27 -0
  357. package/ios/app/VoltraViewComponentView.h +10 -0
  358. package/ios/app/VoltraViewComponentView.mm +67 -0
  359. package/ios/app/VoltraViewRoot.swift +63 -0
  360. package/ios/app/VoltraWidgetService.swift +154 -0
  361. package/ios/shared/BrotliCompression.swift +81 -0
  362. package/ios/shared/ComponentTypeID.swift +117 -0
  363. package/ios/shared/Data+hexString.swift +8 -0
  364. package/ios/shared/Date+toTimerInterval.swift +25 -0
  365. package/ios/shared/JSONValue.swift +128 -0
  366. package/ios/shared/ShortNames.swift +180 -0
  367. package/ios/shared/VoltraAttributes.swift +58 -0
  368. package/ios/shared/VoltraConfig.swift +18 -0
  369. package/ios/shared/VoltraConstants.swift +45 -0
  370. package/ios/shared/VoltraElement.swift +153 -0
  371. package/ios/shared/VoltraEvent.swift +72 -0
  372. package/ios/shared/VoltraEventBus.swift +80 -0
  373. package/ios/shared/VoltraImageStore.swift +119 -0
  374. package/ios/shared/VoltraInitialStateLocale.swift +54 -0
  375. package/ios/shared/VoltraInteractionIntent.swift +39 -0
  376. package/ios/shared/VoltraKeychainHelper.swift +178 -0
  377. package/ios/shared/VoltraLiveActivityPayload.swift +113 -0
  378. package/ios/shared/VoltraLogger.swift +30 -0
  379. package/ios/shared/VoltraNode.swift +194 -0
  380. package/ios/shared/VoltraPayloadMigrator.swift +63 -0
  381. package/ios/shared/VoltraPersistentEventQueue.swift +67 -0
  382. package/ios/shared/VoltraRefreshIntent.swift +29 -0
  383. package/ios/shared/VoltraRegion.swift +37 -0
  384. package/ios/shared/VoltraWidgetDefaults.swift +114 -0
  385. package/ios/shared/VoltraWidgetServerFetcher.swift +166 -0
  386. package/ios/target/VoltraHomeWidget.swift +508 -0
  387. package/ios/target/VoltraWidget.swift +158 -0
  388. package/ios/ui/Extensions/View.modifiers.swift +28 -0
  389. package/ios/ui/Extensions/VoltraNode+Parameters.swift +18 -0
  390. package/ios/ui/Generated/Parameters/.generated +8 -0
  391. package/ios/ui/Generated/Parameters/ButtonParameters.swift +15 -0
  392. package/ios/ui/Generated/Parameters/ChartParameters.swift +33 -0
  393. package/ios/ui/Generated/Parameters/CircularProgressViewParameters.swift +59 -0
  394. package/ios/ui/Generated/Parameters/ComponentParameters.swift +12 -0
  395. package/ios/ui/Generated/Parameters/DividerParameters.swift +12 -0
  396. package/ios/ui/Generated/Parameters/GaugeParameters.swift +54 -0
  397. package/ios/ui/Generated/Parameters/GlassContainerParameters.swift +15 -0
  398. package/ios/ui/Generated/Parameters/GroupBoxParameters.swift +12 -0
  399. package/ios/ui/Generated/Parameters/HStackParameters.swift +34 -0
  400. package/ios/ui/Generated/Parameters/ImageParameters.swift +29 -0
  401. package/ios/ui/Generated/Parameters/LabelParameters.swift +18 -0
  402. package/ios/ui/Generated/Parameters/LinearGradientParameters.swift +27 -0
  403. package/ios/ui/Generated/Parameters/LinearProgressViewParameters.swift +64 -0
  404. package/ios/ui/Generated/Parameters/LinkParameters.swift +15 -0
  405. package/ios/ui/Generated/Parameters/MaskParameters.swift +12 -0
  406. package/ios/ui/Generated/Parameters/SpacerParameters.swift +15 -0
  407. package/ios/ui/Generated/Parameters/SymbolParameters.swift +59 -0
  408. package/ios/ui/Generated/Parameters/TextParameters.swift +18 -0
  409. package/ios/ui/Generated/Parameters/TimerParameters.swift +54 -0
  410. package/ios/ui/Generated/Parameters/ToggleParameters.swift +24 -0
  411. package/ios/ui/Generated/Parameters/VStackParameters.swift +34 -0
  412. package/ios/ui/Generated/Parameters/ViewParameters.swift +12 -0
  413. package/ios/ui/Generated/Parameters/ZStackParameters.swift +15 -0
  414. package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +43 -0
  415. package/ios/ui/Helpers/VoltraProgressDriver.swift +52 -0
  416. package/ios/ui/Layout/FlexContainerHelper.swift +114 -0
  417. package/ios/ui/Layout/VoltraFlexStackLayout.swift +417 -0
  418. package/ios/ui/Protocols/VoltraView.swift +29 -0
  419. package/ios/ui/Style/BackgroundValue.swift +27 -0
  420. package/ios/ui/Style/CompositeStyle.swift +81 -0
  421. package/ios/ui/Style/DecorationStyle.swift +207 -0
  422. package/ios/ui/Style/FlexEnvironment.swift +35 -0
  423. package/ios/ui/Style/FontVariant.swift +4 -0
  424. package/ios/ui/Style/GlassEffect.swift +6 -0
  425. package/ios/ui/Style/JSColorParser.swift +517 -0
  426. package/ios/ui/Style/JSGradientParser.swift +674 -0
  427. package/ios/ui/Style/JSStyleParser.swift +223 -0
  428. package/ios/ui/Style/LayoutStyle.swift +184 -0
  429. package/ios/ui/Style/Overflow.swift +4 -0
  430. package/ios/ui/Style/RenderingStyle.swift +33 -0
  431. package/ios/ui/Style/StyleConverter.swift +202 -0
  432. package/ios/ui/Style/TextDecoration.swift +6 -0
  433. package/ios/ui/Style/TextStyle.swift +50 -0
  434. package/ios/ui/Style/View+applyStyle.swift +38 -0
  435. package/ios/ui/Views/VoltraButton.swift +57 -0
  436. package/ios/ui/Views/VoltraChart.swift +840 -0
  437. package/ios/ui/Views/VoltraCircularProgressView.swift +103 -0
  438. package/ios/ui/Views/VoltraDivider.swift +16 -0
  439. package/ios/ui/Views/VoltraFlexView.swift +33 -0
  440. package/ios/ui/Views/VoltraGauge.swift +65 -0
  441. package/ios/ui/Views/VoltraGlassContainer.swift +29 -0
  442. package/ios/ui/Views/VoltraGroupBox.swift +26 -0
  443. package/ios/ui/Views/VoltraHStack.swift +70 -0
  444. package/ios/ui/Views/VoltraImage.swift +109 -0
  445. package/ios/ui/Views/VoltraLabel.swift +24 -0
  446. package/ios/ui/Views/VoltraLinearGradient.swift +115 -0
  447. package/ios/ui/Views/VoltraLinearProgressView.swift +118 -0
  448. package/ios/ui/Views/VoltraLink.swift +25 -0
  449. package/ios/ui/Views/VoltraMask.swift +23 -0
  450. package/ios/ui/Views/VoltraSpacer.swift +16 -0
  451. package/ios/ui/Views/VoltraSymbol.swift +160 -0
  452. package/ios/ui/Views/VoltraText.swift +87 -0
  453. package/ios/ui/Views/VoltraTimer.swift +131 -0
  454. package/ios/ui/Views/VoltraToggle.swift +39 -0
  455. package/ios/ui/Views/VoltraVStack.swift +68 -0
  456. package/ios/ui/Views/VoltraZStack.swift +33 -0
  457. package/ios/ui/Voltra.swift +86 -0
  458. package/package.json +91 -18
  459. package/build/cjs/VoltraModule.js +0 -6
  460. package/build/cjs/VoltraModule.js.map +0 -1
  461. package/build/cjs/components/VoltraLiveActivityPreview.js +0 -20
  462. package/build/cjs/components/VoltraLiveActivityPreview.js.map +0 -1
  463. package/build/cjs/components/VoltraView.js +0 -37
  464. package/build/cjs/components/VoltraView.js.map +0 -1
  465. package/build/cjs/components/VoltraWidgetPreview.js +0 -26
  466. package/build/cjs/components/VoltraWidgetPreview.js.map +0 -1
  467. package/build/cjs/events.js +0 -19
  468. package/build/cjs/events.js.map +0 -1
  469. package/build/cjs/helpers.js +0 -30
  470. package/build/cjs/helpers.js.map +0 -1
  471. package/build/cjs/index.js +0 -49
  472. package/build/cjs/index.js.map +0 -1
  473. package/build/cjs/live-activity/api.js +0 -158
  474. package/build/cjs/live-activity/api.js.map +0 -1
  475. package/build/cjs/logger.js +0 -36
  476. package/build/cjs/logger.js.map +0 -1
  477. package/build/cjs/preload.js +0 -54
  478. package/build/cjs/preload.js.map +0 -1
  479. package/build/cjs/utils/assertRunningOnApple.js +0 -13
  480. package/build/cjs/utils/assertRunningOnApple.js.map +0 -1
  481. package/build/cjs/utils/helpers.js +0 -7
  482. package/build/cjs/utils/helpers.js.map +0 -1
  483. package/build/cjs/utils/index.js +0 -19
  484. package/build/cjs/utils/index.js.map +0 -1
  485. package/build/cjs/utils/useUpdateOnHMR.js +0 -22
  486. package/build/cjs/utils/useUpdateOnHMR.js.map +0 -1
  487. package/build/cjs/widgets/server-credentials.js +0 -18
  488. package/build/cjs/widgets/server-credentials.js.map +0 -1
  489. package/build/cjs/widgets/widget-api.js +0 -59
  490. package/build/cjs/widgets/widget-api.js.map +0 -1
  491. package/build/esm/VoltraModule.js +0 -4
  492. package/build/esm/VoltraModule.js.map +0 -1
  493. package/build/esm/components/VoltraLiveActivityPreview.js +0 -17
  494. package/build/esm/components/VoltraLiveActivityPreview.js.map +0 -1
  495. package/build/esm/components/VoltraView.js +0 -34
  496. package/build/esm/components/VoltraView.js.map +0 -1
  497. package/build/esm/components/VoltraWidgetPreview.js +0 -23
  498. package/build/esm/components/VoltraWidgetPreview.js.map +0 -1
  499. package/build/esm/events.js +0 -13
  500. package/build/esm/events.js.map +0 -1
  501. package/build/esm/helpers.js +0 -23
  502. package/build/esm/helpers.js.map +0 -1
  503. package/build/esm/index.js +0 -10
  504. package/build/esm/index.js.map +0 -1
  505. package/build/esm/live-activity/api.js +0 -146
  506. package/build/esm/live-activity/api.js.map +0 -1
  507. package/build/esm/logger.js +0 -33
  508. package/build/esm/logger.js.map +0 -1
  509. package/build/esm/preload.js +0 -46
  510. package/build/esm/preload.js.map +0 -1
  511. package/build/esm/utils/assertRunningOnApple.js +0 -9
  512. package/build/esm/utils/assertRunningOnApple.js.map +0 -1
  513. package/build/esm/utils/helpers.js.map +0 -1
  514. package/build/esm/utils/index.js.map +0 -1
  515. package/build/esm/utils/useUpdateOnHMR.js +0 -18
  516. package/build/esm/utils/useUpdateOnHMR.js.map +0 -1
  517. package/build/esm/widgets/server-credentials.js +0 -11
  518. package/build/esm/widgets/server-credentials.js.map +0 -1
  519. package/build/esm/widgets/widget-api.js +0 -47
  520. package/build/esm/widgets/widget-api.js.map +0 -1
  521. package/build/types/VoltraModule.d.ts +0 -44
  522. package/build/types/VoltraModule.d.ts.map +0 -1
  523. package/build/types/components/VoltraLiveActivityPreview.d.ts.map +0 -1
  524. package/build/types/components/VoltraView.d.ts.map +0 -1
  525. package/build/types/components/VoltraWidgetPreview.d.ts.map +0 -1
  526. package/build/types/events.d.ts.map +0 -1
  527. package/build/types/helpers.d.ts.map +0 -1
  528. package/build/types/index.d.ts.map +0 -1
  529. package/build/types/live-activity/api.d.ts.map +0 -1
  530. package/build/types/logger.d.ts.map +0 -1
  531. package/build/types/preload.d.ts.map +0 -1
  532. package/build/types/types.d.ts.map +0 -1
  533. package/build/types/utils/assertRunningOnApple.d.ts.map +0 -1
  534. package/build/types/utils/helpers.d.ts.map +0 -1
  535. package/build/types/utils/index.d.ts.map +0 -1
  536. package/build/types/utils/useUpdateOnHMR.d.ts.map +0 -1
  537. package/build/types/widgets/server-credentials.d.ts.map +0 -1
  538. package/build/types/widgets/widget-api.d.ts.map +0 -1
  539. /package/build/{types → typescript/commonjs}/components/VoltraLiveActivityPreview.d.ts +0 -0
  540. /package/build/{types → typescript/commonjs}/components/VoltraView.d.ts +0 -0
  541. /package/build/{types → typescript/commonjs}/components/VoltraWidgetPreview.d.ts +0 -0
  542. /package/build/{types → typescript/commonjs}/events.d.ts +0 -0
  543. /package/build/{types → typescript/commonjs}/helpers.d.ts +0 -0
  544. /package/build/{types → typescript/commonjs}/live-activity/api.d.ts +0 -0
  545. /package/build/{types → typescript/commonjs}/logger.d.ts +0 -0
  546. /package/build/{types → typescript/commonjs}/preload.d.ts +0 -0
  547. /package/build/{types → typescript/commonjs}/types.d.ts +0 -0
  548. /package/build/{types → typescript/commonjs}/utils/assertRunningOnApple.d.ts +0 -0
  549. /package/build/{types → typescript/commonjs}/utils/helpers.d.ts +0 -0
  550. /package/build/{types → typescript/commonjs}/utils/index.d.ts +0 -0
  551. /package/build/{types → typescript/commonjs}/utils/useUpdateOnHMR.d.ts +0 -0
  552. /package/build/{types → typescript/commonjs}/widgets/server-credentials.d.ts +0 -0
  553. /package/build/{types → typescript/commonjs}/widgets/widget-api.d.ts +0 -0
  554. /package/{build → expo-plugin/build}/cjs/package.json +0 -0
  555. /package/{build → expo-plugin/build}/cjs/types.js +0 -0
  556. /package/{build → expo-plugin/build}/cjs/types.js.map +0 -0
  557. /package/{build → expo-plugin/build}/esm/package.json +0 -0
  558. /package/{build → expo-plugin/build}/esm/types.js +0 -0
  559. /package/{build → expo-plugin/build}/esm/types.js.map +0 -0
@@ -0,0 +1,149 @@
1
+ import { ConfigPlugin, withXcodeProject } from '@expo/config-plugins'
2
+ import * as path from 'path'
3
+
4
+ import { getIOSWidgetExtensionFiles } from '../../utils/fileDiscovery'
5
+ import { addBuildPhases, ensureBuildPhases } from './buildPhases'
6
+ import { addXCConfigurationList, ensureXCConfigurationList } from './configurationList'
7
+ import { addPbxGroup, ensurePbxGroup } from './groups'
8
+ import { getMainAppTargetSettings } from './mainAppSettings'
9
+ import { addProductFile, ensureProductFile } from './productFile'
10
+ import { configureTarget, ensureTargetAttributes, ensureTargetDependency } from './target'
11
+
12
+ export interface ConfigureXcodeProjectProps {
13
+ targetName: string
14
+ bundleIdentifier: string
15
+ deploymentTarget: string
16
+ }
17
+
18
+ /**
19
+ * Plugin step that configures the Xcode project for the widget extension.
20
+ *
21
+ * This:
22
+ * - Adds XCConfigurationList with Debug/Release configurations
23
+ * - Adds the product file (.appex)
24
+ * - Configures the native target
25
+ * - Adds build phases (Sources, CopyFiles, Frameworks, Resources)
26
+ * - Adds PBXGroup for widget files
27
+ *
28
+ * This should run after generateWidgetExtensionFiles so the files exist.
29
+ */
30
+ export const configureXcodeProject: ConfigPlugin<ConfigureXcodeProjectProps> = (config, props) => {
31
+ const { targetName, bundleIdentifier, deploymentTarget } = props
32
+
33
+ return withXcodeProject(config, (config) => {
34
+ if (config.modRequest.introspect) {
35
+ return config
36
+ }
37
+
38
+ const xcodeProject = config.modResults
39
+ const groupName = 'Embed Foundation Extensions'
40
+
41
+ // Check if target already exists
42
+ const nativeTargets = xcodeProject.pbxNativeTargetSection()
43
+ const existingTargetKey = xcodeProject.findTargetKey(targetName)
44
+ const existingTarget = existingTargetKey ? nativeTargets[existingTargetKey] : null
45
+
46
+ const { platformProjectRoot } = config.modRequest
47
+ const targetPath = path.join(platformProjectRoot, targetName)
48
+ const widgetFiles = getIOSWidgetExtensionFiles(targetPath, targetName)
49
+
50
+ // Read main app target settings to synchronize code signing
51
+ const mainAppSettings = getMainAppTargetSettings(xcodeProject)
52
+
53
+ // Use the deploymentTarget from plugin config (or default), ignore main app's deployment target
54
+ // This allows the widget extension to have its own deployment target independent of the main app
55
+
56
+ if (existingTarget && existingTargetKey) {
57
+ // Ensure configuration list is up to date
58
+ const xCConfigurationList = ensureXCConfigurationList(
59
+ xcodeProject,
60
+ {
61
+ targetName,
62
+ bundleIdentifier,
63
+ deploymentTarget,
64
+ codeSignStyle: mainAppSettings?.codeSignStyle,
65
+ developmentTeam: mainAppSettings?.developmentTeam,
66
+ provisioningProfileSpecifier: mainAppSettings?.provisioningProfileSpecifier,
67
+ },
68
+ existingTarget.buildConfigurationList
69
+ )
70
+
71
+ // Ensure product file exists
72
+ const productFile = ensureProductFile(xcodeProject, {
73
+ targetName,
74
+ groupName,
75
+ })
76
+
77
+ // Update target references
78
+ existingTarget.productReference = productFile.fileRef
79
+ existingTarget.buildConfigurationList = xCConfigurationList.uuid
80
+ existingTarget.productType = `"com.apple.product-type.app-extension"`
81
+ existingTarget.name = targetName
82
+ existingTarget.productName = targetName
83
+ if (!existingTarget.buildPhases) {
84
+ existingTarget.buildPhases = []
85
+ }
86
+
87
+ // Ensure build phases and groups
88
+ ensureBuildPhases(xcodeProject, {
89
+ targetUuid: existingTargetKey,
90
+ groupName,
91
+ productFile,
92
+ widgetFiles,
93
+ mainTargetUuid: xcodeProject.getFirstTarget().uuid,
94
+ })
95
+
96
+ ensurePbxGroup(xcodeProject, {
97
+ targetName,
98
+ widgetFiles,
99
+ })
100
+
101
+ ensureTargetAttributes(xcodeProject, existingTargetKey)
102
+ ensureTargetDependency(xcodeProject, existingTargetKey)
103
+
104
+ return config
105
+ }
106
+
107
+ // Add configuration list
108
+ const targetUuid = xcodeProject.generateUuid()
109
+
110
+ const xCConfigurationList = addXCConfigurationList(xcodeProject, {
111
+ targetName,
112
+ bundleIdentifier,
113
+ deploymentTarget,
114
+ codeSignStyle: mainAppSettings?.codeSignStyle,
115
+ developmentTeam: mainAppSettings?.developmentTeam,
116
+ provisioningProfileSpecifier: mainAppSettings?.provisioningProfileSpecifier,
117
+ })
118
+
119
+ // Add product file
120
+ const productFile = addProductFile(xcodeProject, {
121
+ targetName,
122
+ groupName,
123
+ })
124
+
125
+ // Configure target (native target, project section, dependency)
126
+ configureTarget(xcodeProject, {
127
+ targetName,
128
+ targetUuid,
129
+ productFile,
130
+ xCConfigurationList,
131
+ })
132
+
133
+ // Add build phases
134
+ addBuildPhases(xcodeProject, {
135
+ targetUuid,
136
+ groupName,
137
+ productFile,
138
+ widgetFiles,
139
+ })
140
+
141
+ // Add PBX group
142
+ addPbxGroup(xcodeProject, {
143
+ targetName,
144
+ widgetFiles,
145
+ })
146
+
147
+ return config
148
+ })
149
+ }
@@ -0,0 +1,95 @@
1
+ import { XcodeProject } from '@expo/config-plugins'
2
+
3
+ export interface MainAppTargetSettings {
4
+ deploymentTarget: string
5
+ codeSignStyle?: string
6
+ developmentTeam?: string
7
+ provisioningProfileSpecifier?: string
8
+ }
9
+
10
+ /**
11
+ * Reads build settings from the main app target to synchronize code signing with the widget extension.
12
+ *
13
+ * @param xcodeProject The Xcode project instance
14
+ * @returns The main app target's build settings, or null if not found
15
+ */
16
+ export function getMainAppTargetSettings(xcodeProject: XcodeProject): MainAppTargetSettings | null {
17
+ try {
18
+ const mainAppTarget = xcodeProject.getFirstTarget()?.firstTarget
19
+
20
+ if (!mainAppTarget) {
21
+ return null
22
+ }
23
+
24
+ // Get the build configuration list for the main app target
25
+ const buildConfigurationListId = mainAppTarget.buildConfigurationList
26
+ if (!buildConfigurationListId) {
27
+ return null
28
+ }
29
+
30
+ // Extract UUID from buildConfigurationListId (it might include a comment like "UUID /* comment */")
31
+ const buildConfigurationListUuid = buildConfigurationListId.split(' ')[0]
32
+
33
+ const buildConfigurationList =
34
+ xcodeProject.hash.project.objects['XCConfigurationList']?.[buildConfigurationListUuid]
35
+ if (!buildConfigurationList || !buildConfigurationList.buildConfigurations) {
36
+ return null
37
+ }
38
+
39
+ // Get the first build configuration (usually Debug) to read settings
40
+ const firstConfigRef = buildConfigurationList.buildConfigurations[0]
41
+ if (!firstConfigRef) {
42
+ return null
43
+ }
44
+
45
+ // Extract UUID from config reference (it might include a comment)
46
+ const firstConfigUuid =
47
+ typeof firstConfigRef === 'string' ? firstConfigRef.split(' ')[0] : firstConfigRef.value?.split(' ')[0]
48
+ if (!firstConfigUuid) {
49
+ return null
50
+ }
51
+
52
+ const buildConfiguration = xcodeProject.hash.project.objects['XCBuildConfiguration']?.[firstConfigUuid]
53
+ if (!buildConfiguration || !buildConfiguration.buildSettings) {
54
+ return null
55
+ }
56
+
57
+ const buildSettings = buildConfiguration.buildSettings
58
+
59
+ // Extract deployment target (remove quotes if present)
60
+ const deploymentTarget =
61
+ buildSettings.IPHONEOS_DEPLOYMENT_TARGET?.replace(/^"|"$/g, '') ||
62
+ buildSettings['IPHONEOS_DEPLOYMENT_TARGET']?.replace(/^"|"$/g, '') ||
63
+ null
64
+
65
+ // Extract code signing settings
66
+ const codeSignStyle =
67
+ buildSettings.CODE_SIGN_STYLE?.replace(/^"|"$/g, '') ||
68
+ buildSettings['CODE_SIGN_STYLE']?.replace(/^"|"$/g, '') ||
69
+ null
70
+
71
+ const developmentTeam =
72
+ buildSettings.DEVELOPMENT_TEAM?.replace(/^"|"$/g, '') ||
73
+ buildSettings['DEVELOPMENT_TEAM']?.replace(/^"|"$/g, '') ||
74
+ null
75
+
76
+ const provisioningProfileSpecifier =
77
+ buildSettings.PROVISIONING_PROFILE_SPECIFIER?.replace(/^"|"$/g, '') ||
78
+ buildSettings['PROVISIONING_PROFILE_SPECIFIER']?.replace(/^"|"$/g, '') ||
79
+ null
80
+
81
+ if (!deploymentTarget) {
82
+ return null
83
+ }
84
+
85
+ return {
86
+ deploymentTarget,
87
+ codeSignStyle: codeSignStyle || undefined,
88
+ developmentTeam: developmentTeam || undefined,
89
+ provisioningProfileSpecifier: provisioningProfileSpecifier || undefined,
90
+ }
91
+ } catch {
92
+ // If we can't read the settings, return null and use fallback values
93
+ return null
94
+ }
95
+ }
@@ -0,0 +1,91 @@
1
+ import { XcodeProject } from '@expo/config-plugins'
2
+
3
+ export interface AddProductFileOptions {
4
+ targetName: string
5
+ groupName: string
6
+ }
7
+
8
+ function findProductFileReference(xcodeProject: XcodeProject, targetName: string): { fileRef: string } | null {
9
+ const fileReferenceSection = xcodeProject.pbxFileReferenceSection()
10
+ const targetProductName = `${targetName}.appex`
11
+
12
+ for (const key of Object.keys(fileReferenceSection)) {
13
+ if (/_comment$/.test(key)) {
14
+ continue
15
+ }
16
+ const entry = fileReferenceSection[key]
17
+ const path = typeof entry?.path === 'string' ? entry.path.replace(/^"|"$/g, '') : ''
18
+ const name = typeof entry?.name === 'string' ? entry.name.replace(/^"|"$/g, '') : ''
19
+
20
+ if (path === targetProductName || name === targetProductName) {
21
+ return { fileRef: key }
22
+ }
23
+ }
24
+
25
+ return null
26
+ }
27
+
28
+ function findBuildFileForFileRef(xcodeProject: XcodeProject, fileRef: string): { uuid: string } | null {
29
+ const buildFileSection = xcodeProject.pbxBuildFileSection()
30
+
31
+ for (const key of Object.keys(buildFileSection)) {
32
+ if (/_comment$/.test(key)) {
33
+ continue
34
+ }
35
+ const entry = buildFileSection[key]
36
+ if (entry?.fileRef === fileRef) {
37
+ return { uuid: key }
38
+ }
39
+ }
40
+
41
+ return null
42
+ }
43
+
44
+ /**
45
+ * Adds the product file (.appex) for the widget extension.
46
+ */
47
+ export function addProductFile(xcodeProject: XcodeProject, options: AddProductFileOptions) {
48
+ const { targetName, groupName } = options
49
+
50
+ const productFileOptions = {
51
+ basename: `${targetName}.appex`,
52
+ group: groupName,
53
+ explicitFileType: 'wrapper.app-extension',
54
+ settings: {
55
+ ATTRIBUTES: ['RemoveHeadersOnCopy'],
56
+ },
57
+ includeInIndex: 0,
58
+ path: `${targetName}.appex`,
59
+ sourceTree: 'BUILT_PRODUCTS_DIR',
60
+ }
61
+
62
+ const productFile = xcodeProject.addProductFile(targetName, productFileOptions)
63
+
64
+ return productFile
65
+ }
66
+
67
+ /**
68
+ * Ensures the product file (.appex) exists and returns it.
69
+ */
70
+ export function ensureProductFile(xcodeProject: XcodeProject, options: AddProductFileOptions) {
71
+ const { targetName, groupName } = options
72
+ const existingFile = findProductFileReference(xcodeProject, targetName)
73
+
74
+ if (!existingFile) {
75
+ return addProductFile(xcodeProject, options)
76
+ }
77
+
78
+ const buildFile = findBuildFileForFileRef(xcodeProject, existingFile.fileRef)
79
+ const productFile = {
80
+ uuid: buildFile?.uuid ?? xcodeProject.generateUuid(),
81
+ fileRef: existingFile.fileRef,
82
+ basename: `${targetName}.appex`,
83
+ group: groupName,
84
+ }
85
+
86
+ if (!buildFile) {
87
+ xcodeProject.addToPbxBuildFileSection(productFile as any)
88
+ }
89
+
90
+ return productFile
91
+ }
@@ -0,0 +1,148 @@
1
+ import { XcodeProject } from '@expo/config-plugins'
2
+
3
+ import { IOS } from '../../constants'
4
+
5
+ // ============================================================================
6
+ // Types
7
+ // ============================================================================
8
+
9
+ export interface ConfigureTargetOptions {
10
+ targetName: string
11
+ targetUuid: string
12
+ productFile: { fileRef: string }
13
+ xCConfigurationList: { uuid: string }
14
+ }
15
+
16
+ interface AddNativeTargetOptions {
17
+ targetName: string
18
+ targetUuid: string
19
+ productFile: { fileRef: string }
20
+ xCConfigurationList: { uuid: string }
21
+ }
22
+
23
+ // ============================================================================
24
+ // Main Function
25
+ // ============================================================================
26
+
27
+ /**
28
+ * Configures the widget extension target in the Xcode project.
29
+ *
30
+ * This:
31
+ * - Adds the target to PBXNativeTarget section
32
+ * - Adds the target to PBXProject section
33
+ * - Adds a dependency from the main app to the widget extension
34
+ */
35
+ export function configureTarget(xcodeProject: XcodeProject, options: ConfigureTargetOptions) {
36
+ const target = addToPbxNativeTargetSection(xcodeProject, options)
37
+ addToPbxProjectSection(xcodeProject, target)
38
+ addTargetDependency(xcodeProject, target)
39
+
40
+ return target
41
+ }
42
+
43
+ /**
44
+ * Ensures target attributes (LastSwiftMigration) exist for the target.
45
+ */
46
+ export function ensureTargetAttributes(xcodeProject: XcodeProject, targetUuid: string): void {
47
+ const projectSection = xcodeProject.pbxProjectSection()
48
+ const firstProject = xcodeProject.getFirstProject()
49
+
50
+ if (!projectSection[firstProject.uuid].attributes.TargetAttributes) {
51
+ projectSection[firstProject.uuid].attributes.TargetAttributes = {}
52
+ }
53
+
54
+ if (!projectSection[firstProject.uuid].attributes.TargetAttributes[targetUuid]) {
55
+ projectSection[firstProject.uuid].attributes.TargetAttributes[targetUuid] = {
56
+ LastSwiftMigration: IOS.LAST_SWIFT_MIGRATION,
57
+ }
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Ensures a target dependency exists so the main app depends on the widget extension.
63
+ */
64
+ export function ensureTargetDependency(xcodeProject: XcodeProject, targetUuid: string): void {
65
+ if (!xcodeProject.hash.project.objects['PBXTargetDependency']) {
66
+ xcodeProject.hash.project.objects['PBXTargetDependency'] = {}
67
+ }
68
+ if (!xcodeProject.hash.project.objects['PBXContainerItemProxy']) {
69
+ xcodeProject.hash.project.objects['PBXContainerItemProxy'] = {}
70
+ }
71
+
72
+ const mainTargetUuid = xcodeProject.getFirstTarget().uuid
73
+ const mainTarget = xcodeProject.pbxNativeTargetSection()[mainTargetUuid]
74
+ const existingDeps = mainTarget?.dependencies ?? []
75
+ const targetDependencySection = xcodeProject.hash.project.objects['PBXTargetDependency'] || {}
76
+
77
+ const alreadyExists = existingDeps.some((dep: any) => {
78
+ const dependency = targetDependencySection[dep.value]
79
+ return dependency?.target === targetUuid
80
+ })
81
+
82
+ if (!alreadyExists) {
83
+ xcodeProject.addTargetDependency(mainTargetUuid, [targetUuid])
84
+ }
85
+ }
86
+
87
+ // ============================================================================
88
+ // Helper Functions
89
+ // ============================================================================
90
+
91
+ /**
92
+ * Adds the widget extension target to the PBXNativeTarget section.
93
+ */
94
+ function addToPbxNativeTargetSection(xcodeProject: XcodeProject, options: AddNativeTargetOptions) {
95
+ const { targetName, targetUuid, productFile, xCConfigurationList } = options
96
+
97
+ const target = {
98
+ uuid: targetUuid,
99
+ pbxNativeTarget: {
100
+ isa: 'PBXNativeTarget',
101
+ name: targetName,
102
+ productName: targetName,
103
+ productReference: productFile.fileRef,
104
+ productType: `"com.apple.product-type.app-extension"`,
105
+ buildConfigurationList: xCConfigurationList.uuid,
106
+ buildPhases: [],
107
+ buildRules: [],
108
+ dependencies: [],
109
+ },
110
+ }
111
+
112
+ xcodeProject.addToPbxNativeTargetSection(target)
113
+
114
+ return target
115
+ }
116
+
117
+ /**
118
+ * Adds the target to the PBXProject section.
119
+ */
120
+ function addToPbxProjectSection(xcodeProject: XcodeProject, target: { uuid: string }): void {
121
+ xcodeProject.addToPbxProjectSection(target)
122
+
123
+ // Add target attributes to project section
124
+ const projectSection = xcodeProject.pbxProjectSection()
125
+ const firstProject = xcodeProject.getFirstProject()
126
+
127
+ if (!projectSection[firstProject.uuid].attributes.TargetAttributes) {
128
+ projectSection[firstProject.uuid].attributes.TargetAttributes = {}
129
+ }
130
+
131
+ projectSection[firstProject.uuid].attributes.TargetAttributes[target.uuid] = {
132
+ LastSwiftMigration: IOS.LAST_SWIFT_MIGRATION,
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Adds a target dependency so the main app depends on the widget extension.
138
+ */
139
+ function addTargetDependency(xcodeProject: XcodeProject, target: { uuid: string }): void {
140
+ if (!xcodeProject.hash.project.objects['PBXTargetDependency']) {
141
+ xcodeProject.hash.project.objects['PBXTargetDependency'] = {}
142
+ }
143
+ if (!xcodeProject.hash.project.objects['PBXContainerItemProxy']) {
144
+ xcodeProject.hash.project.objects['PBXContainerItemProxy'] = {}
145
+ }
146
+
147
+ xcodeProject.addTargetDependency(xcodeProject.getFirstTarget().uuid, [target.uuid])
148
+ }
@@ -0,0 +1,89 @@
1
+ import type { ConfigPlugin } from '@expo/config-plugins'
2
+
3
+ import type { WidgetInitialStatePath, WidgetLabel } from '@use-voltra/expo-plugin'
4
+
5
+ /**
6
+ * Supported iOS Home Screen widget size families.
7
+ */
8
+ export type IOSWidgetFamily =
9
+ | 'systemSmall'
10
+ | 'systemMedium'
11
+ | 'systemLarge'
12
+ | 'systemExtraLarge'
13
+ | 'accessoryCircular'
14
+ | 'accessoryRectangular'
15
+ | 'accessoryInline'
16
+
17
+ /**
18
+ * Configuration for a single iOS home screen widget.
19
+ */
20
+ export interface IOSWidgetConfig {
21
+ /**
22
+ * Unique identifier for the widget (used as the widget kind and in JS API)
23
+ */
24
+ id: string
25
+ displayName: WidgetLabel
26
+ description: WidgetLabel
27
+ /** @default ['systemSmall', 'systemMedium', 'systemLarge'] */
28
+ supportedFamilies?: IOSWidgetFamily[]
29
+ initialStatePath?: WidgetInitialStatePath
30
+ serverUpdate?: IOSWidgetServerUpdateConfig
31
+ }
32
+
33
+ /**
34
+ * Server-driven iOS widget updates (WidgetKit background refresh).
35
+ */
36
+ export interface IOSWidgetServerUpdateConfig {
37
+ url: string
38
+ /** @default 15 */
39
+ intervalMinutes?: number
40
+ /** @default false */
41
+ refresh?: boolean
42
+ }
43
+
44
+ /**
45
+ * Files in the widget extension target (Xcode build phases / groups).
46
+ */
47
+ export interface IOSWidgetExtensionFiles {
48
+ swiftFiles: string[]
49
+ entitlementFiles: string[]
50
+ plistFiles: string[]
51
+ assetDirectories: string[]
52
+ intentFiles: string[]
53
+ /** Paths relative to the widget extension root (e.g. en.lproj/VoltraWidgets.strings) */
54
+ localizedStringResources: string[]
55
+ }
56
+
57
+ /**
58
+ * Options for `@use-voltra/ios-client` Expo config plugin.
59
+ */
60
+ export interface IOSConfigPluginProps {
61
+ enablePushNotifications?: boolean
62
+ groupIdentifier?: string
63
+ widgets?: IOSWidgetConfig[]
64
+ deploymentTarget?: string
65
+ targetName?: string
66
+ fonts?: string[]
67
+ keychainGroup?: string
68
+ }
69
+
70
+ export type VoltraIosConfigPlugin = ConfigPlugin<IOSConfigPluginProps | undefined>
71
+
72
+ export interface IOSMainAppPluginProps {
73
+ groupIdentifier?: string
74
+ widgetIds?: string[]
75
+ widgets?: IOSWidgetConfig[]
76
+ keychainGroup?: string
77
+ }
78
+
79
+ export interface IOSWidgetExtensionPluginProps {
80
+ targetName: string
81
+ bundleIdentifier: string
82
+ deploymentTarget: string
83
+ widgets?: IOSWidgetConfig[]
84
+ groupIdentifier?: string
85
+ keychainGroup?: string
86
+ fonts?: string[]
87
+ version: string
88
+ buildNumber: string
89
+ }
@@ -0,0 +1,96 @@
1
+ import * as fs from 'fs'
2
+ import * as path from 'path'
3
+
4
+ import type { IOSWidgetExtensionFiles } from '../types'
5
+ import { logger } from '@use-voltra/expo-plugin'
6
+
7
+ /** Table name matches basename without extension; co-located per locale in *.lproj */
8
+ export const VOLTRA_WIDGET_STRINGS_BASENAME = 'VoltraWidgets.strings'
9
+
10
+ /**
11
+ * Scans the widget extension target directory and returns categorized file lists.
12
+ *
13
+ * This function only reads the directory structure - it does NOT copy or create files.
14
+ * File generation should be done before this is called.
15
+ *
16
+ * @param targetPath - Path to the widget extension target directory
17
+ * @param targetName - Name of the target (for entitlements file)
18
+ * @returns Categorized lists of files for Xcode project configuration
19
+ */
20
+ export function getIOSWidgetExtensionFiles(targetPath: string, targetName: string): IOSWidgetExtensionFiles {
21
+ const widgetFiles: IOSWidgetExtensionFiles = {
22
+ swiftFiles: [],
23
+ entitlementFiles: [],
24
+ plistFiles: [],
25
+ assetDirectories: [],
26
+ intentFiles: [],
27
+ localizedStringResources: [],
28
+ }
29
+
30
+ if (!fs.existsSync(targetPath)) {
31
+ logger.warn(`Widget target directory does not exist: ${targetPath}`)
32
+ // Still include required generated files even if directory doesn't exist yet
33
+ const initialStatesFile = 'VoltraWidgetInitialStates.swift'
34
+ widgetFiles.swiftFiles.push(initialStatesFile)
35
+ const targetEntitlements = `${targetName}.entitlements`
36
+ widgetFiles.entitlementFiles.push(targetEntitlements)
37
+ return widgetFiles
38
+ }
39
+
40
+ const files = fs.readdirSync(targetPath)
41
+
42
+ for (const entry of files) {
43
+ if (!entry.endsWith('.lproj')) {
44
+ continue
45
+ }
46
+ const stringsPath = path.join(targetPath, entry, VOLTRA_WIDGET_STRINGS_BASENAME)
47
+ if (fs.existsSync(stringsPath)) {
48
+ widgetFiles.localizedStringResources.push(`${entry}/${VOLTRA_WIDGET_STRINGS_BASENAME}`)
49
+ }
50
+ }
51
+
52
+ for (const file of files) {
53
+ const itemPath = path.join(targetPath, file)
54
+ const isDirectory = fs.lstatSync(itemPath).isDirectory()
55
+
56
+ // Handle directories (Assets.xcassets)
57
+ if (isDirectory) {
58
+ if (file === 'Assets.xcassets') {
59
+ widgetFiles.assetDirectories.push(file)
60
+ }
61
+ continue
62
+ }
63
+
64
+ // Categorize files by extension
65
+ const ext = path.extname(file).toLowerCase()
66
+
67
+ switch (ext) {
68
+ case '.swift':
69
+ widgetFiles.swiftFiles.push(file)
70
+ break
71
+ case '.entitlements':
72
+ widgetFiles.entitlementFiles.push(file)
73
+ break
74
+ case '.plist':
75
+ widgetFiles.plistFiles.push(file)
76
+ break
77
+ case '.intentdefinition':
78
+ widgetFiles.intentFiles.push(file)
79
+ break
80
+ }
81
+ }
82
+
83
+ // Always include the target entitlements file
84
+ const targetEntitlements = `${targetName}.entitlements`
85
+ if (!widgetFiles.entitlementFiles.includes(targetEntitlements)) {
86
+ widgetFiles.entitlementFiles.push(targetEntitlements)
87
+ }
88
+
89
+ // Always include VoltraWidgetInitialStates.swift (generated by config plugin)
90
+ const initialStatesFile = 'VoltraWidgetInitialStates.swift'
91
+ if (!widgetFiles.swiftFiles.includes(initialStatesFile)) {
92
+ widgetFiles.swiftFiles.push(initialStatesFile)
93
+ }
94
+
95
+ return widgetFiles
96
+ }