@use-voltra/expo-plugin 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 (236) hide show
  1. package/README.md +9 -29
  2. package/build/cjs/constants.js +3 -43
  3. package/build/cjs/constants.js.map +1 -1
  4. package/build/cjs/index.js +23 -69
  5. package/build/cjs/index.js.map +1 -1
  6. package/build/cjs/types.js +4 -0
  7. package/build/cjs/types.js.map +1 -1
  8. package/build/cjs/utils/localePick.js +48 -0
  9. package/build/cjs/utils/localePick.js.map +1 -0
  10. package/build/cjs/utils/prerender.js +15 -9
  11. package/build/cjs/utils/prerender.js.map +1 -1
  12. package/build/cjs/utils/widgetLabel.js +19 -0
  13. package/build/cjs/utils/widgetLabel.js.map +1 -0
  14. package/build/cjs/validation.js +75 -166
  15. package/build/cjs/validation.js.map +1 -1
  16. package/build/esm/constants.js +2 -42
  17. package/build/esm/constants.js.map +1 -1
  18. package/build/esm/index.js +8 -69
  19. package/build/esm/index.js.map +1 -1
  20. package/build/esm/types.js +4 -0
  21. package/build/esm/types.js.map +1 -1
  22. package/build/esm/utils/localePick.js +44 -0
  23. package/build/esm/utils/localePick.js.map +1 -0
  24. package/build/esm/utils/prerender.js +15 -9
  25. package/build/esm/utils/prerender.js.map +1 -1
  26. package/build/esm/utils/widgetLabel.js +15 -0
  27. package/build/esm/utils/widgetLabel.js.map +1 -0
  28. package/build/esm/validation.js +71 -163
  29. package/build/esm/validation.js.map +1 -1
  30. package/build/types/constants.d.ts +2 -26
  31. package/build/types/constants.d.ts.map +1 -1
  32. package/build/types/index.d.ts +10 -12
  33. package/build/types/index.d.ts.map +1 -1
  34. package/build/types/types.d.ts +9 -260
  35. package/build/types/types.d.ts.map +1 -1
  36. package/build/types/utils/localePick.d.ts +7 -0
  37. package/build/types/utils/localePick.d.ts.map +1 -0
  38. package/build/types/utils/prerender.d.ts +6 -3
  39. package/build/types/utils/prerender.d.ts.map +1 -1
  40. package/build/types/utils/widgetLabel.d.ts +8 -0
  41. package/build/types/utils/widgetLabel.d.ts.map +1 -0
  42. package/build/types/validation.d.ts +6 -14
  43. package/build/types/validation.d.ts.map +1 -1
  44. package/package.json +11 -11
  45. package/build/cjs/android/files/assets.js +0 -259
  46. package/build/cjs/android/files/assets.js.map +0 -1
  47. package/build/cjs/android/files/fonts.js +0 -69
  48. package/build/cjs/android/files/fonts.js.map +0 -1
  49. package/build/cjs/android/files/index.js +0 -81
  50. package/build/cjs/android/files/index.js.map +0 -1
  51. package/build/cjs/android/files/initialStates.js +0 -83
  52. package/build/cjs/android/files/initialStates.js.map +0 -1
  53. package/build/cjs/android/files/kotlin.js +0 -142
  54. package/build/cjs/android/files/kotlin.js.map +0 -1
  55. package/build/cjs/android/files/xml.js +0 -247
  56. package/build/cjs/android/files/xml.js.map +0 -1
  57. package/build/cjs/android/index.js +0 -33
  58. package/build/cjs/android/index.js.map +0 -1
  59. package/build/cjs/android/manifest.js +0 -92
  60. package/build/cjs/android/manifest.js.map +0 -1
  61. package/build/cjs/ios/eas.js +0 -28
  62. package/build/cjs/ios/eas.js.map +0 -1
  63. package/build/cjs/ios/entitlements.js +0 -46
  64. package/build/cjs/ios/entitlements.js.map +0 -1
  65. package/build/cjs/ios/index.js +0 -39
  66. package/build/cjs/ios/index.js.map +0 -1
  67. package/build/cjs/ios/infoPlist.js +0 -51
  68. package/build/cjs/ios/infoPlist.js.map +0 -1
  69. package/build/cjs/ios/pushNotifications.js +0 -22
  70. package/build/cjs/ios/pushNotifications.js.map +0 -1
  71. package/build/cjs/ios-widget/eas.js +0 -66
  72. package/build/cjs/ios-widget/eas.js.map +0 -1
  73. package/build/cjs/ios-widget/files/assets.js +0 -199
  74. package/build/cjs/ios-widget/files/assets.js.map +0 -1
  75. package/build/cjs/ios-widget/files/entitlements.js +0 -77
  76. package/build/cjs/ios-widget/files/entitlements.js.map +0 -1
  77. package/build/cjs/ios-widget/files/index.js +0 -92
  78. package/build/cjs/ios-widget/files/index.js.map +0 -1
  79. package/build/cjs/ios-widget/files/infoPlist.js +0 -91
  80. package/build/cjs/ios-widget/files/infoPlist.js.map +0 -1
  81. package/build/cjs/ios-widget/files/swift.js +0 -256
  82. package/build/cjs/ios-widget/files/swift.js.map +0 -1
  83. package/build/cjs/ios-widget/fonts.js +0 -151
  84. package/build/cjs/ios-widget/fonts.js.map +0 -1
  85. package/build/cjs/ios-widget/index.js +0 -46
  86. package/build/cjs/ios-widget/index.js.map +0 -1
  87. package/build/cjs/ios-widget/podfile.js +0 -43
  88. package/build/cjs/ios-widget/podfile.js.map +0 -1
  89. package/build/cjs/ios-widget/widgetPlist.js +0 -99
  90. package/build/cjs/ios-widget/widgetPlist.js.map +0 -1
  91. package/build/cjs/ios-widget/xcode/buildPhases.js +0 -245
  92. package/build/cjs/ios-widget/xcode/buildPhases.js.map +0 -1
  93. package/build/cjs/ios-widget/xcode/configurationList.js +0 -91
  94. package/build/cjs/ios-widget/xcode/configurationList.js.map +0 -1
  95. package/build/cjs/ios-widget/xcode/groups.js +0 -65
  96. package/build/cjs/ios-widget/xcode/groups.js.map +0 -1
  97. package/build/cjs/ios-widget/xcode/index.js +0 -155
  98. package/build/cjs/ios-widget/xcode/index.js.map +0 -1
  99. package/build/cjs/ios-widget/xcode/mainAppSettings.js +0 -71
  100. package/build/cjs/ios-widget/xcode/mainAppSettings.js.map +0 -1
  101. package/build/cjs/ios-widget/xcode/productFile.js +0 -74
  102. package/build/cjs/ios-widget/xcode/productFile.js.map +0 -1
  103. package/build/cjs/ios-widget/xcode/target.js +0 -113
  104. package/build/cjs/ios-widget/xcode/target.js.map +0 -1
  105. package/build/cjs/utils/fileDiscovery.js +0 -107
  106. package/build/cjs/utils/fileDiscovery.js.map +0 -1
  107. package/build/cjs/utils/urlScheme.js +0 -40
  108. package/build/cjs/utils/urlScheme.js.map +0 -1
  109. package/build/esm/android/files/assets.js +0 -223
  110. package/build/esm/android/files/assets.js.map +0 -1
  111. package/build/esm/android/files/fonts.js +0 -33
  112. package/build/esm/android/files/fonts.js.map +0 -1
  113. package/build/esm/android/files/index.js +0 -77
  114. package/build/esm/android/files/index.js.map +0 -1
  115. package/build/esm/android/files/initialStates.js +0 -44
  116. package/build/esm/android/files/initialStates.js.map +0 -1
  117. package/build/esm/android/files/kotlin.js +0 -103
  118. package/build/esm/android/files/kotlin.js.map +0 -1
  119. package/build/esm/android/files/xml.js +0 -206
  120. package/build/esm/android/files/xml.js.map +0 -1
  121. package/build/esm/android/index.js +0 -29
  122. package/build/esm/android/index.js.map +0 -1
  123. package/build/esm/android/manifest.js +0 -88
  124. package/build/esm/android/manifest.js.map +0 -1
  125. package/build/esm/ios/eas.js +0 -24
  126. package/build/esm/ios/eas.js.map +0 -1
  127. package/build/esm/ios/entitlements.js +0 -42
  128. package/build/esm/ios/entitlements.js.map +0 -1
  129. package/build/esm/ios/index.js +0 -34
  130. package/build/esm/ios/index.js.map +0 -1
  131. package/build/esm/ios/infoPlist.js +0 -47
  132. package/build/esm/ios/infoPlist.js.map +0 -1
  133. package/build/esm/ios/pushNotifications.js +0 -18
  134. package/build/esm/ios/pushNotifications.js.map +0 -1
  135. package/build/esm/ios-widget/eas.js +0 -62
  136. package/build/esm/ios-widget/eas.js.map +0 -1
  137. package/build/esm/ios-widget/files/assets.js +0 -163
  138. package/build/esm/ios-widget/files/assets.js.map +0 -1
  139. package/build/esm/ios-widget/files/entitlements.js +0 -37
  140. package/build/esm/ios-widget/files/entitlements.js.map +0 -1
  141. package/build/esm/ios-widget/files/index.js +0 -55
  142. package/build/esm/ios-widget/files/index.js.map +0 -1
  143. package/build/esm/ios-widget/files/infoPlist.js +0 -55
  144. package/build/esm/ios-widget/files/infoPlist.js.map +0 -1
  145. package/build/esm/ios-widget/files/swift.js +0 -217
  146. package/build/esm/ios-widget/files/swift.js.map +0 -1
  147. package/build/esm/ios-widget/fonts.js +0 -111
  148. package/build/esm/ios-widget/fonts.js.map +0 -1
  149. package/build/esm/ios-widget/index.js +0 -42
  150. package/build/esm/ios-widget/index.js.map +0 -1
  151. package/build/esm/ios-widget/podfile.js +0 -39
  152. package/build/esm/ios-widget/podfile.js.map +0 -1
  153. package/build/esm/ios-widget/widgetPlist.js +0 -92
  154. package/build/esm/ios-widget/widgetPlist.js.map +0 -1
  155. package/build/esm/ios-widget/xcode/buildPhases.js +0 -208
  156. package/build/esm/ios-widget/xcode/buildPhases.js.map +0 -1
  157. package/build/esm/ios-widget/xcode/configurationList.js +0 -87
  158. package/build/esm/ios-widget/xcode/configurationList.js.map +0 -1
  159. package/build/esm/ios-widget/xcode/groups.js +0 -61
  160. package/build/esm/ios-widget/xcode/groups.js.map +0 -1
  161. package/build/esm/ios-widget/xcode/index.js +0 -118
  162. package/build/esm/ios-widget/xcode/index.js.map +0 -1
  163. package/build/esm/ios-widget/xcode/mainAppSettings.js +0 -68
  164. package/build/esm/ios-widget/xcode/mainAppSettings.js.map +0 -1
  165. package/build/esm/ios-widget/xcode/productFile.js +0 -70
  166. package/build/esm/ios-widget/xcode/productFile.js.map +0 -1
  167. package/build/esm/ios-widget/xcode/target.js +0 -108
  168. package/build/esm/ios-widget/xcode/target.js.map +0 -1
  169. package/build/esm/utils/fileDiscovery.js +0 -71
  170. package/build/esm/utils/fileDiscovery.js.map +0 -1
  171. package/build/esm/utils/urlScheme.js +0 -37
  172. package/build/esm/utils/urlScheme.js.map +0 -1
  173. package/build/types/android/files/assets.d.ts +0 -26
  174. package/build/types/android/files/assets.d.ts.map +0 -1
  175. package/build/types/android/files/fonts.d.ts +0 -19
  176. package/build/types/android/files/fonts.d.ts.map +0 -1
  177. package/build/types/android/files/index.d.ts +0 -21
  178. package/build/types/android/files/index.d.ts.map +0 -1
  179. package/build/types/android/files/initialStates.d.ts +0 -14
  180. package/build/types/android/files/initialStates.d.ts.map +0 -1
  181. package/build/types/android/files/kotlin.d.ts +0 -11
  182. package/build/types/android/files/kotlin.d.ts.map +0 -1
  183. package/build/types/android/files/xml.d.ts +0 -25
  184. package/build/types/android/files/xml.d.ts.map +0 -1
  185. package/build/types/android/index.d.ts +0 -12
  186. package/build/types/android/index.d.ts.map +0 -1
  187. package/build/types/android/manifest.d.ts +0 -16
  188. package/build/types/android/manifest.d.ts.map +0 -1
  189. package/build/types/ios/eas.d.ts +0 -12
  190. package/build/types/ios/eas.d.ts.map +0 -1
  191. package/build/types/ios/entitlements.d.ts +0 -14
  192. package/build/types/ios/entitlements.d.ts.map +0 -1
  193. package/build/types/ios/index.d.ts +0 -19
  194. package/build/types/ios/index.d.ts.map +0 -1
  195. package/build/types/ios/infoPlist.d.ts +0 -21
  196. package/build/types/ios/infoPlist.d.ts.map +0 -1
  197. package/build/types/ios/pushNotifications.d.ts +0 -10
  198. package/build/types/ios/pushNotifications.d.ts.map +0 -1
  199. package/build/types/ios-widget/eas.d.ts +0 -15
  200. package/build/types/ios-widget/eas.d.ts.map +0 -1
  201. package/build/types/ios-widget/files/assets.d.ts +0 -13
  202. package/build/types/ios-widget/files/assets.d.ts.map +0 -1
  203. package/build/types/ios-widget/files/entitlements.d.ts +0 -17
  204. package/build/types/ios-widget/files/entitlements.d.ts.map +0 -1
  205. package/build/types/ios-widget/files/index.d.ts +0 -24
  206. package/build/types/ios-widget/files/index.d.ts.map +0 -1
  207. package/build/types/ios-widget/files/infoPlist.d.ts +0 -10
  208. package/build/types/ios-widget/files/infoPlist.d.ts.map +0 -1
  209. package/build/types/ios-widget/files/swift.d.ts +0 -15
  210. package/build/types/ios-widget/files/swift.d.ts.map +0 -1
  211. package/build/types/ios-widget/fonts.d.ts +0 -22
  212. package/build/types/ios-widget/fonts.d.ts.map +0 -1
  213. package/build/types/ios-widget/index.d.ts +0 -31
  214. package/build/types/ios-widget/index.d.ts.map +0 -1
  215. package/build/types/ios-widget/podfile.d.ts +0 -9
  216. package/build/types/ios-widget/podfile.d.ts.map +0 -1
  217. package/build/types/ios-widget/widgetPlist.d.ts +0 -20
  218. package/build/types/ios-widget/widgetPlist.d.ts.map +0 -1
  219. package/build/types/ios-widget/xcode/buildPhases.d.ts +0 -25
  220. package/build/types/ios-widget/xcode/buildPhases.d.ts.map +0 -1
  221. package/build/types/ios-widget/xcode/configurationList.d.ts +0 -20
  222. package/build/types/ios-widget/xcode/configurationList.d.ts.map +0 -1
  223. package/build/types/ios-widget/xcode/groups.d.ts +0 -15
  224. package/build/types/ios-widget/xcode/groups.d.ts.map +0 -1
  225. package/build/types/ios-widget/xcode/index.d.ts +0 -20
  226. package/build/types/ios-widget/xcode/index.d.ts.map +0 -1
  227. package/build/types/ios-widget/xcode/mainAppSettings.d.ts +0 -15
  228. package/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +0 -1
  229. package/build/types/ios-widget/xcode/productFile.d.ts +0 -14
  230. package/build/types/ios-widget/xcode/productFile.d.ts.map +0 -1
  231. package/build/types/ios-widget/xcode/target.d.ts +0 -42
  232. package/build/types/ios-widget/xcode/target.d.ts.map +0 -1
  233. package/build/types/utils/fileDiscovery.d.ts +0 -13
  234. package/build/types/utils/fileDiscovery.d.ts.map +0 -1
  235. package/build/types/utils/urlScheme.d.ts +0 -10
  236. package/build/types/utils/urlScheme.d.ts.map +0 -1
@@ -1,267 +1,16 @@
1
- import { ConfigPlugin } from '@expo/config-plugins';
2
1
  /**
3
- * Type definitions for the Voltra plugin
2
+ * Types shared by iOS and Android Voltra config plugins.
3
+ * Platform widget config types live in each client's expo-plugin package.
4
4
  */
5
5
  /**
6
- * Supported widget size families
6
+ * Per-locale strings for widget picker/gallery labels (`displayName`, `description`).
7
+ * Keys should be BCP-47-style locale tags (e.g. `en`, `pl`, `pt-BR`). Plain `string` is still allowed for a single-language setup.
7
8
  */
8
- export type WidgetFamily = 'systemSmall' | 'systemMedium' | 'systemLarge' | 'systemExtraLarge' | 'accessoryCircular' | 'accessoryRectangular' | 'accessoryInline';
9
+ export type WidgetLocalizedCopy = Record<string, string>;
10
+ export type WidgetLabel = string | WidgetLocalizedCopy;
9
11
  /**
10
- * Configuration for a single home screen widget
12
+ * Build-time widget initial state source: a single file path, or per-locale paths (same key rules as `WidgetLocalizedCopy`).
13
+ * Each path must point to a module that exports the widget variants / default export for prerendering.
11
14
  */
12
- export interface WidgetConfig {
13
- /**
14
- * Unique identifier for the widget (used as the widget kind and in JS API)
15
- * Must be alphanumeric with underscores only
16
- */
17
- id: string;
18
- /**
19
- * Display name shown in the widget gallery
20
- */
21
- displayName: string;
22
- /**
23
- * Description shown in the widget gallery
24
- */
25
- description: string;
26
- /**
27
- * Supported widget sizes
28
- * @default ['systemSmall', 'systemMedium', 'systemLarge']
29
- */
30
- supportedFamilies?: WidgetFamily[];
31
- /**
32
- * Path to a file that default exports a WidgetVariants object for initial widget state.
33
- * This will be pre-rendered at build time and bundled into the iOS app.
34
- */
35
- initialStatePath?: string;
36
- /**
37
- * Configuration for server-driven widget updates.
38
- * When configured, the widget will periodically fetch new content from a remote server
39
- * running Voltra SSR, without requiring the user to open the app.
40
- */
41
- serverUpdate?: WidgetServerUpdateConfig;
42
- }
43
- /**
44
- * Configuration for server-driven widget updates.
45
- * Enables widgets to pull updates from a remote Voltra SSR service.
46
- */
47
- export interface WidgetServerUpdateConfig {
48
- /**
49
- * The URL of the Voltra SSR endpoint that returns widget JSON.
50
- * The widget ID and family will be appended as query parameters.
51
- */
52
- url: string;
53
- /**
54
- * How often the widget should fetch updates, in minutes.
55
- * iOS WidgetKit may throttle requests; minimum effective interval is ~15 minutes.
56
- * @default 15
57
- */
58
- intervalMinutes?: number;
59
- /**
60
- * Whether to show a native refresh button in the top-right corner of the widget.
61
- * When tapped, triggers an immediate server update.
62
- * @default false
63
- */
64
- refresh?: boolean;
65
- }
66
- /**
67
- * Structure describing the files in a widget extension target.
68
- * Used for configuring Xcode build phases and groups.
69
- */
70
- export interface WidgetFiles {
71
- swiftFiles: string[];
72
- entitlementFiles: string[];
73
- plistFiles: string[];
74
- assetDirectories: string[];
75
- intentFiles: string[];
76
- }
77
- /**
78
- * Configuration for a single Android widget
79
- */
80
- export interface AndroidWidgetConfig {
81
- /**
82
- * Unique identifier for the widget
83
- */
84
- id: string;
85
- /**
86
- * Display name shown in the widget picker
87
- */
88
- displayName: string;
89
- /**
90
- * Description shown in the widget picker
91
- */
92
- description: string;
93
- /**
94
- * Minimum width in dp. If provided, takes precedence over minCellWidth.
95
- */
96
- minWidth?: number;
97
- /**
98
- * Minimum height in dp. If provided, takes precedence over minCellHeight.
99
- */
100
- minHeight?: number;
101
- /**
102
- * Minimum width in cells. Used to derive minWidth if not provided: (N * 70) - 30
103
- */
104
- minCellWidth?: number;
105
- /**
106
- * Minimum height in cells. Used to derive minHeight if not provided: (N * 70) - 30
107
- */
108
- minCellHeight?: number;
109
- /**
110
- * Target cell width (Android 12+, 1-5 cells)
111
- */
112
- targetCellWidth: number;
113
- /**
114
- * Target cell height (Android 12+, 1-5 cells)
115
- */
116
- targetCellHeight: number;
117
- /**
118
- * Whether the widget can be resized
119
- * @default 'horizontal|vertical'
120
- */
121
- resizeMode?: 'none' | 'horizontal' | 'vertical' | 'horizontal|vertical';
122
- /**
123
- * Widget category
124
- * @default 'home_screen'
125
- */
126
- widgetCategory?: 'home_screen' | 'keyguard' | 'home_screen|keyguard';
127
- /**
128
- * Path to a file that default exports a WidgetVariants object for initial widget state.
129
- * This will be pre-rendered at build time and bundled into the app.
130
- */
131
- initialStatePath?: string;
132
- /**
133
- * Configuration for server-driven widget updates.
134
- * When configured, the widget will periodically fetch new content from a remote server
135
- * running Voltra SSR, without requiring the user to open the app.
136
- */
137
- serverUpdate?: AndroidWidgetServerUpdateConfig;
138
- /**
139
- * Path to preview image for widget picker (PNG/JPG/WebP).
140
- * Sets android:previewImage attribute. Works on all Android versions.
141
- * On Android 12+, combine with previewLayout for better results.
142
- */
143
- previewImage?: string;
144
- /**
145
- * Path to custom XML layout for RemoteViews preview (Android 12+).
146
- * Sets android:previewLayout attribute for scalable previews.
147
- * If not provided but previewImage is set, an auto-layout will be generated.
148
- */
149
- previewLayout?: string;
150
- }
151
- /**
152
- * Configuration for server-driven Android widget updates.
153
- */
154
- export interface AndroidWidgetServerUpdateConfig {
155
- /**
156
- * The URL of the Voltra SSR endpoint that returns widget JSON.
157
- * The widget ID will be appended as a query parameter.
158
- * Example: "https://api.example.com/widgets/render"
159
- */
160
- url: string;
161
- /**
162
- * How often the widget should fetch updates, in minutes.
163
- * Uses WorkManager PeriodicWorkRequest; minimum interval is 15 minutes.
164
- * @default 60
165
- */
166
- intervalMinutes?: number;
167
- /**
168
- * Whether to show a native refresh button in the top-right corner of the widget.
169
- * When tapped, triggers an immediate server update.
170
- * @default false
171
- */
172
- refresh?: boolean;
173
- }
174
- /**
175
- * Android-specific plugin configuration
176
- */
177
- export interface AndroidPluginConfig {
178
- /**
179
- * Enable Android notification-related manifest plumbing used by Voltra features
180
- * such as Live Updates.
181
- */
182
- enableNotifications?: boolean;
183
- /**
184
- * Android home screen widgets
185
- * Separate from iOS widgets to allow platform-specific configurations
186
- */
187
- widgets?: AndroidWidgetConfig[];
188
- }
189
- /**
190
- * Props for the Voltra config plugin
191
- */
192
- export interface ConfigPluginProps {
193
- /**
194
- * Enable push notification support for Live Activities
195
- */
196
- enablePushNotifications?: boolean;
197
- /**
198
- * App group identifier for sharing data between app and widget extension
199
- */
200
- groupIdentifier?: string;
201
- /**
202
- * Configuration for iOS home screen widgets (uses WidgetFamily sizing)
203
- * Each widget will be available in the widget gallery
204
- */
205
- widgets?: WidgetConfig[];
206
- /**
207
- * iOS deployment target version for the widget extension
208
- * If not provided, will use the main app's deployment target or fall back to the default
209
- */
210
- deploymentTarget?: string;
211
- /**
212
- * Custom target name for the widget extension
213
- * If not provided, defaults to "{AppName}LiveActivity"
214
- * Useful for matching existing provisioning profiles or credentials
215
- */
216
- targetName?: string;
217
- /**
218
- * Custom fonts to include in the Live Activity extension.
219
- * Provide an array of font module specifiers, file paths, or directories containing fonts.
220
- * Supports .ttf, .otf, .woff, and .woff2 formats.
221
- *
222
- * This is equivalent to expo-font but for the Live Activity extension.
223
- * @see https://docs.expo.dev/versions/latest/sdk/font/
224
- */
225
- fonts?: string[];
226
- /**
227
- * Keychain Access Group for sharing credentials between the main app and widget extension.
228
- * Required when using server-driven widget updates with authentication.
229
- * This should match a Keychain Sharing capability group configured in your Apple Developer account.
230
- * Example: "$(AppIdentifierPrefix)com.example.shared"
231
- *
232
- * If not provided and any widget has `serverUpdate` configured, defaults to
233
- * `$(AppIdentifierPrefix)<bundleIdentifier>` (the app's own keychain access group).
234
- */
235
- keychainGroup?: string;
236
- /**
237
- * Android-specific configuration
238
- */
239
- android?: AndroidPluginConfig;
240
- }
241
- /**
242
- * The main Voltra config plugin type
243
- */
244
- export type VoltraConfigPlugin = ConfigPlugin<ConfigPluginProps | undefined>;
245
- /**
246
- * Props passed to iOS-related plugins
247
- */
248
- export interface IOSPluginProps {
249
- targetName: string;
250
- bundleIdentifier: string;
251
- deploymentTarget: string;
252
- widgets?: WidgetConfig[];
253
- groupIdentifier?: string;
254
- projectRoot: string;
255
- platformProjectRoot: string;
256
- fonts?: string[];
257
- }
258
- /**
259
- * Props passed to Android-related plugins
260
- */
261
- export interface AndroidPluginProps {
262
- enableNotifications?: boolean;
263
- widgets: AndroidWidgetConfig[];
264
- userImagesPath?: string;
265
- fonts?: string[];
266
- }
15
+ export type WidgetInitialStatePath = string | WidgetLocalizedCopy;
267
16
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD;;GAEG;AAMH;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,cAAc,GACd,aAAa,GACb,kBAAkB,GAClB,mBAAmB,GACnB,sBAAsB,GACtB,iBAAiB,CAAA;AAErB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,YAAY,EAAE,CAAA;IAClC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,wBAAwB,CAAA;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,qBAAqB,CAAA;IACvE;;;OAGG;IACH,cAAc,CAAC,EAAE,aAAa,GAAG,UAAU,GAAG,sBAAsB,CAAA;IACpE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,+BAA+B,CAAA;IAC9C;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAA;CAChC;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAA;AAE5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAExD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,mBAAmB,CAAA;AAEtD;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,mBAAmB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Picks a localized string value from a locale-keyed map using the same fallback rules as iOS/Android runtimes:
3
+ * preferred language tags (full match, then language-only), then `en`, then `__default`, then first value.
4
+ */
5
+ export declare function normalizeLocaleTag(tag: string): string;
6
+ export declare function pickLocalizedValue(perLocale: Record<string, string>, preferredLanguages: string[]): string | undefined;
7
+ //# sourceMappingURL=localePick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localePick.d.ts","sourceRoot":"","sources":["../../../src/utils/localePick.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,kBAAkB,EAAE,MAAM,EAAE,GAC3B,MAAM,GAAG,SAAS,CAyCpB"}
@@ -1,3 +1,4 @@
1
+ import type { WidgetInitialStatePath } from '../types';
1
2
  /**
2
3
  * Type for the widget renderer function
3
4
  */
@@ -7,8 +8,10 @@ export type WidgetRenderer = (variants: any) => string;
7
8
  */
8
9
  export interface PrerenderableWidget {
9
10
  id: string;
10
- initialStatePath?: string;
11
+ initialStatePath?: WidgetInitialStatePath;
11
12
  }
13
+ /** widgetId -> locale key -> prerendered JSON string (single-file widgets use `__default`) */
14
+ export type PrerenderedWidgetStates = Map<string, Map<string, string>>;
12
15
  /**
13
16
  * Prerender widget initial states for build-time inclusion.
14
17
  *
@@ -19,7 +22,7 @@ export interface PrerenderableWidget {
19
22
  * @param widgets - Array of widget configurations
20
23
  * @param projectRoot - Root directory of the Expo project
21
24
  * @param renderer - The renderer function to use (voltra/server or voltra/android/server)
22
- * @returns Map of widgetId -> prerendered widget state as JSON string
25
+ * @returns Map of widgetId -> (locale key -> prerendered JSON string)
23
26
  */
24
- export declare function prerenderWidgetState(widgets: PrerenderableWidget[], projectRoot: string, renderer: WidgetRenderer): Promise<Map<string, string>>;
27
+ export declare function prerenderWidgetState(widgets: PrerenderableWidget[], projectRoot: string, renderer: WidgetRenderer): Promise<PrerenderedWidgetStates>;
25
28
  //# sourceMappingURL=prerender.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../../src/utils/prerender.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,MAAM,CAAA;AAEtD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AA6ID;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6B9B"}
1
+ {"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../../../src/utils/prerender.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,sBAAsB,EAAe,MAAM,UAAU,CAAA;AAGnE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,MAAM,CAAA;AAEtD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;CAC1C;AAED,8FAA8F;AAC9F,MAAM,MAAM,uBAAuB,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AA6ItE;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,uBAAuB,CAAC,CA+BlC"}
@@ -0,0 +1,8 @@
1
+ import type { WidgetLabel, WidgetLocalizedCopy } from '../types';
2
+ export declare function isWidgetLocalizedMap(label: WidgetLabel): label is WidgetLocalizedCopy;
3
+ /**
4
+ * Development / fallback English copy for LocalizedStringResource.defaultValue.
5
+ * Prefers `en`, then `en-*`, then default fallback order from locale picking.
6
+ */
7
+ export declare function widgetLabelEnglish(label: WidgetLabel): string;
8
+ //# sourceMappingURL=widgetLabel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetLabel.d.ts","sourceRoot":"","sources":["../../../src/utils/widgetLabel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAIhE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,mBAAmB,CAErF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAM7D"}
@@ -1,17 +1,9 @@
1
- import type { AndroidWidgetConfig, ConfigPluginProps, WidgetConfig } from './types';
1
+ import type { WidgetInitialStatePath } from './types';
2
+ export declare function validateHomeScreenWidgetId(widgetId: unknown): asserts widgetId is string;
3
+ export declare function assertValidLocaleKey(localeKey: string, widgetId: string, fieldName: string): void;
4
+ export declare function validateWidgetLabel(value: unknown, widgetId: string, fieldName: string): void;
2
5
  /**
3
- * Validates a widget configuration.
4
- * Throws an error if validation fails.
6
+ * Validates optional initialStatePath: plain string or locale map of project-relative file paths.
5
7
  */
6
- export declare function validateWidgetConfig(widget: WidgetConfig): void;
7
- /**
8
- * Validates an Android widget configuration.
9
- * Throws an error if validation fails.
10
- */
11
- export declare function validateAndroidWidgetConfig(widget: AndroidWidgetConfig, projectRoot?: string): void;
12
- /**
13
- * Validates the plugin props at entry point.
14
- * Throws an error if validation fails.
15
- */
16
- export declare function validateProps(props: ConfigPluginProps): void;
8
+ export declare function validateInitialStatePath(value: WidgetInitialStatePath | undefined, widgetId: string, projectRoot?: string): void;
17
9
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAA;AAoBjG;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAsC/D;AAMD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAiGnG;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAyD5D"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAYrD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAWxF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAuBjG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAmC7F;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,sBAAsB,GAAG,SAAS,EACzC,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAkDN"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@use-voltra/expo-plugin",
3
- "version": "1.4.0",
4
- "description": "Expo config plugin for Voltra",
3
+ "version": "2.0.0-rc.1",
4
+ "description": "Shared utilities for Voltra Expo config plugins",
5
5
  "main": "build/cjs/index.js",
6
6
  "module": "build/esm/index.js",
7
7
  "types": "build/types/index.d.ts",
@@ -22,22 +22,16 @@
22
22
  "build": "node ../../scripts/build-package.mjs packages/expo-plugin",
23
23
  "clean": "rm -rf build",
24
24
  "lint": "oxlint src",
25
+ "test": "jest --config jest.config.js",
25
26
  "typecheck": "tsc -p tsconfig.typecheck.json --noEmit"
26
27
  },
27
28
  "dependencies": {
28
- "@babel/core": "^7.27.4",
29
- "@expo/config-plugins": "~10.1.2",
30
- "@expo/plist": "^0.3.5",
31
- "dedent": "^1.7.1",
32
- "vd-tool": "^4.0.2",
33
- "xcode": "^3.0.1"
29
+ "@babel/core": "^7.27.4"
34
30
  },
35
31
  "keywords": [
36
32
  "voltra",
37
33
  "expo",
38
- "plugin",
39
- "ios",
40
- "android"
34
+ "plugin"
41
35
  ],
42
36
  "author": "Saúl Sharma (https://x.com/saul_sharma), Szymon Chmal (https://x.com/chmalszymon)",
43
37
  "repository": {
@@ -54,5 +48,11 @@
54
48
  "expo": "*",
55
49
  "react": "*",
56
50
  "react-native": "*"
51
+ },
52
+ "devDependencies": {
53
+ "@types/jest": "^29.5.14",
54
+ "@types/node": "^20.19.25",
55
+ "jest": "^29.7.0",
56
+ "ts-jest": "^29.3.4"
57
57
  }
58
58
  }