@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetLabel.js","sourceRoot":"","sources":["../../../src/utils/widgetLabel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,kBAAkB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AAChD,CAAC"}
@@ -1,196 +1,104 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+ /** Widget id: Swift / Kotlin identifier fragment and Android XML token fragment */
4
+ const WIDGET_ID_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
3
5
  /**
4
- * Validation functions for the Voltra plugin
6
+ * Locale keys in app.json become iOS `.lproj` folder names and Android `values-*` qualifiers (after mapping).
5
7
  */
6
- // ============================================================================
7
- // iOS Widget Validation
8
- // ============================================================================
9
- const VALID_FAMILIES = new Set([
10
- 'systemSmall',
11
- 'systemMedium',
12
- 'systemLarge',
13
- 'systemExtraLarge',
14
- 'accessoryCircular',
15
- 'accessoryRectangular',
16
- 'accessoryInline',
17
- ]);
18
- /**
19
- * Validates a widget configuration.
20
- * Throws an error if validation fails.
21
- */
22
- export function validateWidgetConfig(widget) {
23
- // Validate widget ID
24
- if (!widget.id || typeof widget.id !== 'string') {
8
+ const LOCALE_KEY_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*([_-][a-zA-Z0-9]+)*$/;
9
+ const MAX_LOCALE_KEY_LENGTH = 32;
10
+ export function validateHomeScreenWidgetId(widgetId) {
11
+ if (!widgetId || typeof widgetId !== 'string') {
25
12
  throw new Error('Widget ID is required and must be a string');
26
13
  }
27
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(widget.id)) {
28
- throw new Error(`Widget ID '${widget.id}' is invalid. ` +
14
+ if (!WIDGET_ID_PATTERN.test(widgetId)) {
15
+ throw new Error(`Widget ID '${widgetId}' is invalid. ` +
29
16
  'Must start with a letter or underscore and contain only alphanumeric characters and underscores.');
30
17
  }
31
- // Validate display name
32
- if (!widget.displayName?.trim()) {
33
- throw new Error(`Widget '${widget.id}': displayName is required`);
34
- }
35
- // Validate description
36
- if (!widget.description?.trim()) {
37
- throw new Error(`Widget '${widget.id}': description is required`);
38
- }
39
- // Validate supported families if provided
40
- if (widget.supportedFamilies) {
41
- if (!Array.isArray(widget.supportedFamilies)) {
42
- throw new Error(`Widget '${widget.id}': supportedFamilies must be an array`);
43
- }
44
- for (const family of widget.supportedFamilies) {
45
- if (!VALID_FAMILIES.has(family)) {
46
- throw new Error(`Widget '${widget.id}': Invalid widget family '${family}'. ` +
47
- `Valid families are: ${Array.from(VALID_FAMILIES).join(', ')}`);
48
- }
49
- }
50
- }
51
18
  }
52
- // ============================================================================
53
- // Android Widget Validation
54
- // ============================================================================
55
- /**
56
- * Validates an Android widget configuration.
57
- * Throws an error if validation fails.
58
- */
59
- export function validateAndroidWidgetConfig(widget, projectRoot) {
60
- // Validate widget ID
61
- if (!widget.id || typeof widget.id !== 'string') {
62
- throw new Error('Widget ID is required and must be a string');
63
- }
64
- if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(widget.id)) {
65
- throw new Error(`Widget ID '${widget.id}' is invalid. ` +
66
- 'Must start with a letter or underscore and contain only alphanumeric characters and underscores.');
67
- }
68
- // Validate display name
69
- if (!widget.displayName?.trim()) {
70
- throw new Error(`Widget '${widget.id}': displayName is required`);
71
- }
72
- // Validate description
73
- if (!widget.description?.trim()) {
74
- throw new Error(`Widget '${widget.id}': description is required`);
19
+ export function assertValidLocaleKey(localeKey, widgetId, fieldName) {
20
+ if (localeKey.trim() !== localeKey) {
21
+ throw new Error(`Widget '${widgetId}': ${fieldName} locale key '${localeKey}' must not have leading or trailing whitespace`);
75
22
  }
76
- // Validate targetCellWidth
77
- if (typeof widget.targetCellWidth !== 'number') {
78
- throw new Error(`Widget '${widget.id}': targetCellWidth is required and must be a number`);
23
+ if (!localeKey) {
24
+ throw new Error(`Widget '${widgetId}': ${fieldName} locale map contains an empty locale key`);
79
25
  }
80
- if (!Number.isInteger(widget.targetCellWidth) || widget.targetCellWidth < 1) {
81
- throw new Error(`Widget '${widget.id}': targetCellWidth must be a positive integer (typically 1-5)`);
26
+ if (localeKey.length > MAX_LOCALE_KEY_LENGTH) {
27
+ throw new Error(`Widget '${widgetId}': ${fieldName} locale key '${localeKey}' exceeds ${MAX_LOCALE_KEY_LENGTH} characters`);
82
28
  }
83
- // Validate targetCellHeight
84
- if (typeof widget.targetCellHeight !== 'number') {
85
- throw new Error(`Widget '${widget.id}': targetCellHeight is required and must be a number`);
29
+ if (!LOCALE_KEY_PATTERN.test(localeKey)) {
30
+ throw new Error(`Widget '${widgetId}': ${fieldName} locale key '${localeKey}' is invalid. ` +
31
+ 'Use BCP-47-style tags (e.g. en, pl, pt-BR, zh-Hans). Letters, digits, single separators _ or - only.');
86
32
  }
87
- if (!Number.isInteger(widget.targetCellHeight) || widget.targetCellHeight < 1) {
88
- throw new Error(`Widget '${widget.id}': targetCellHeight must be a positive integer (typically 1-5)`);
89
- }
90
- // Validate minCellWidth if provided
91
- if (widget.minCellWidth !== undefined) {
92
- if (typeof widget.minCellWidth !== 'number' || !Number.isInteger(widget.minCellWidth) || widget.minCellWidth < 1) {
93
- throw new Error(`Widget '${widget.id}': minCellWidth must be a positive integer`);
33
+ }
34
+ export function validateWidgetLabel(value, widgetId, fieldName) {
35
+ if (typeof value === 'string') {
36
+ if (!value.trim()) {
37
+ throw new Error(`Widget '${widgetId}': ${fieldName} is required`);
94
38
  }
39
+ return;
95
40
  }
96
- // Validate minCellHeight if provided
97
- if (widget.minCellHeight !== undefined) {
98
- if (typeof widget.minCellHeight !== 'number' ||
99
- !Number.isInteger(widget.minCellHeight) ||
100
- widget.minCellHeight < 1) {
101
- throw new Error(`Widget '${widget.id}': minCellHeight must be a positive integer`);
102
- }
41
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
42
+ throw new Error(`Widget '${widgetId}': ${fieldName} must be a string or a locale map (e.g. { "en": "...", "pl": "..." })`);
103
43
  }
104
- // Validate previewImage if provided
105
- if (widget.previewImage !== undefined) {
106
- if (typeof widget.previewImage !== 'string' || !widget.previewImage.trim()) {
107
- throw new Error(`Widget '${widget.id}': previewImage must be a non-empty string`);
108
- }
109
- const ext = path.extname(widget.previewImage).toLowerCase();
110
- const validImageExts = ['.png', '.jpg', '.jpeg', '.webp'];
111
- if (!validImageExts.includes(ext)) {
112
- throw new Error(`Widget '${widget.id}': previewImage must be a PNG, JPG, JPEG, or WebP file. Got: ${ext}`);
113
- }
114
- // Check file exists if projectRoot is provided
115
- if (projectRoot) {
116
- const fullPath = path.join(projectRoot, widget.previewImage);
117
- if (!fs.existsSync(fullPath)) {
118
- throw new Error(`Widget '${widget.id}': previewImage file not found at ${widget.previewImage}`);
119
- }
120
- }
44
+ const entries = Object.entries(value);
45
+ if (entries.length === 0) {
46
+ throw new Error(`Widget '${widgetId}': ${fieldName} locale map must not be empty`);
121
47
  }
122
- // Validate previewLayout if provided
123
- if (widget.previewLayout !== undefined) {
124
- if (typeof widget.previewLayout !== 'string' || !widget.previewLayout.trim()) {
125
- throw new Error(`Widget '${widget.id}': previewLayout must be a non-empty string`);
48
+ const localeKeys = new Set();
49
+ for (const [locale, v] of entries) {
50
+ assertValidLocaleKey(locale, widgetId, fieldName);
51
+ const normalized = locale.toLowerCase().replace(/_/g, '-');
52
+ if (localeKeys.has(normalized)) {
53
+ throw new Error(`Widget '${widgetId}': ${fieldName} duplicates locale '${locale}' (underscore and hyphen forms count as the same, e.g. pt_BR vs pt-BR)`);
126
54
  }
127
- const ext = path.extname(widget.previewLayout).toLowerCase();
128
- if (ext !== '.xml') {
129
- throw new Error(`Widget '${widget.id}': previewLayout must be an XML file. Got: ${ext}`);
130
- }
131
- // Check file exists if projectRoot is provided
132
- if (projectRoot) {
133
- const fullPath = path.join(projectRoot, widget.previewLayout);
134
- if (!fs.existsSync(fullPath)) {
135
- throw new Error(`Widget '${widget.id}': previewLayout file not found at ${widget.previewLayout}`);
136
- }
55
+ localeKeys.add(normalized);
56
+ if (typeof v !== 'string' || !v.trim()) {
57
+ throw new Error(`Widget '${widgetId}': ${fieldName}.${locale} must be a non-empty string`);
137
58
  }
138
59
  }
139
60
  }
140
- // ============================================================================
141
- // Plugin Props Validation
142
- // ============================================================================
143
61
  /**
144
- * Validates the plugin props at entry point.
145
- * Throws an error if validation fails.
62
+ * Validates optional initialStatePath: plain string or locale map of project-relative file paths.
146
63
  */
147
- export function validateProps(props) {
148
- // Validate group identifier format if provided
149
- if (props.groupIdentifier !== undefined) {
150
- if (typeof props.groupIdentifier !== 'string') {
151
- throw new Error('groupIdentifier must be a string');
152
- }
153
- if (!props.groupIdentifier.startsWith('group.')) {
154
- throw new Error(`groupIdentifier '${props.groupIdentifier}' must start with 'group.'`);
155
- }
64
+ export function validateInitialStatePath(value, widgetId, projectRoot) {
65
+ if (value === undefined) {
66
+ return;
156
67
  }
157
- // Validate iOS widgets if provided
158
- if (props.widgets !== undefined) {
159
- if (!Array.isArray(props.widgets)) {
160
- throw new Error('widgets must be an array');
68
+ const assertPathExists = (relativePath, ctx) => {
69
+ if (!relativePath.trim()) {
70
+ throw new Error(`Widget '${widgetId}': initialStatePath ${ctx} must be a non-empty path`);
161
71
  }
162
- // Check for duplicate widget IDs
163
- const seenIds = new Set();
164
- for (const widget of props.widgets) {
165
- validateWidgetConfig(widget);
166
- if (seenIds.has(widget.id)) {
167
- throw new Error(`Duplicate widget ID: '${widget.id}'`);
72
+ if (projectRoot) {
73
+ const fullPath = path.join(projectRoot, relativePath);
74
+ if (!fs.existsSync(fullPath)) {
75
+ throw new Error(`Widget '${widgetId}': initialStatePath file not found at ${relativePath}`);
168
76
  }
169
- seenIds.add(widget.id);
170
77
  }
78
+ };
79
+ if (typeof value === 'string') {
80
+ assertPathExists(value, '');
81
+ return;
171
82
  }
172
- // Validate Android configuration if provided
173
- if (props.android !== undefined) {
174
- if (typeof props.android !== 'object' || props.android === null) {
175
- throw new Error('android configuration must be an object');
176
- }
177
- if (props.android.enableNotifications !== undefined && typeof props.android.enableNotifications !== 'boolean') {
178
- throw new Error('android.enableNotifications must be a boolean');
83
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
84
+ throw new Error(`Widget '${widgetId}': initialStatePath must be a string or a locale map of paths (e.g. { "en": "./widgets/en.tsx", "pl": "./widgets/pl.tsx" })`);
85
+ }
86
+ const entries = Object.entries(value);
87
+ if (entries.length === 0) {
88
+ throw new Error(`Widget '${widgetId}': initialStatePath locale map must not be empty`);
89
+ }
90
+ const localeKeys = new Set();
91
+ for (const [locale, v] of entries) {
92
+ assertValidLocaleKey(locale, widgetId, 'initialStatePath');
93
+ const normalized = locale.toLowerCase().replace(/_/g, '-');
94
+ if (localeKeys.has(normalized)) {
95
+ throw new Error(`Widget '${widgetId}': initialStatePath duplicates locale '${locale}' (underscore and hyphen forms count as the same)`);
179
96
  }
180
- if (props.android.widgets !== undefined) {
181
- if (!Array.isArray(props.android.widgets)) {
182
- throw new Error('android.widgets must be an array');
183
- }
184
- // Check for duplicate widget IDs
185
- const seenIds = new Set();
186
- for (const widget of props.android.widgets) {
187
- validateAndroidWidgetConfig(widget);
188
- if (seenIds.has(widget.id)) {
189
- throw new Error(`Duplicate Android widget ID: '${widget.id}'`);
190
- }
191
- seenIds.add(widget.id);
192
- }
97
+ localeKeys.add(normalized);
98
+ if (typeof v !== 'string' || !v.trim()) {
99
+ throw new Error(`Widget '${widgetId}': initialStatePath.${locale} must be a non-empty path string`);
193
100
  }
101
+ assertPathExists(v, `.${locale}`);
194
102
  }
195
103
  }
196
104
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,5 @@
1
- import type { WidgetFamily } from './types';
2
- /**
3
- * Constants for the Voltra plugin
4
- */
5
- export declare const IOS: {
6
- /** Minimum iOS deployment target version */
7
- readonly DEPLOYMENT_TARGET: "17.0";
8
- /** Swift language version */
9
- readonly SWIFT_VERSION: "5.0";
10
- /** Target device families (1 = iPhone, 2 = iPad) */
11
- readonly DEVICE_FAMILY: "1,2";
12
- /** Last Swift migration version for Xcode */
13
- readonly LAST_SWIFT_MIGRATION: 1250;
14
- };
15
- /** Default path for user-provided widget images */
16
- export declare const DEFAULT_USER_IMAGES_PATH = "./assets/voltra";
17
- /** Default path for user-provided Android widget images */
18
- export declare const DEFAULT_ANDROID_USER_IMAGES_PATH = "./assets/voltra-android";
19
- /** Maximum image size in bytes for Live Activities (4KB limit) */
20
- export declare const MAX_IMAGE_SIZE_BYTES = 4096;
21
- /** Supported image extensions for widget assets */
22
- export declare const SUPPORTED_IMAGE_EXTENSIONS: RegExp;
23
- /** Default widget families when not specified */
24
- export declare const DEFAULT_WIDGET_FAMILIES: WidgetFamily[];
25
- /** Maps JS widget family names to SwiftUI WidgetFamily enum cases */
26
- export declare const WIDGET_FAMILY_MAP: Record<WidgetFamily, string>;
27
1
  /** Extensions to try when resolving module paths for pre-rendering */
28
2
  export declare const MODULE_EXTENSIONS: string[];
3
+ /** Maximum image size in bytes for widget / Live Activity assets (4KB limit) */
4
+ export declare const MAX_IMAGE_SIZE_BYTES = 4096;
29
5
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;GAEG;AAMH,eAAO,MAAM,GAAG;IACd,4CAA4C;;IAG5C,6BAA6B;;IAG7B,oDAAoD;;IAGpD,6CAA6C;;CAErC,CAAA;AAMV,mDAAmD;AACnD,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAEzD,2DAA2D;AAC3D,eAAO,MAAM,gCAAgC,4BAA4B,CAAA;AAMzE,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,OAAO,CAAA;AAExC,mDAAmD;AACnD,eAAO,MAAM,0BAA0B,QAAuB,CAAA;AAE9D,iDAAiD;AACjD,eAAO,MAAM,uBAAuB,EAAE,YAAY,EAAmD,CAAA;AAErG,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAQ1D,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,UAAqC,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,UAAqC,CAAA;AAEnE,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,OAAO,CAAA"}
@@ -1,13 +1,11 @@
1
- import type { VoltraConfigPlugin } from './types';
2
- /**
3
- * Main Voltra config plugin.
4
- *
5
- * This plugin configures your Expo app for:
6
- * - Live Activities (Dynamic Island + Lock Screen)
7
- * - Home Screen Widgets (iOS and Android)
8
- * - Push Notifications for Live Activities (optional)
9
- */
10
- declare const withVoltra: VoltraConfigPlugin;
11
- export default withVoltra;
12
- export type { AndroidPluginConfig, AndroidWidgetConfig, AndroidWidgetServerUpdateConfig, ConfigPluginProps, VoltraConfigPlugin, WidgetConfig, WidgetFamily, WidgetServerUpdateConfig, } from './types';
1
+ export { MAX_IMAGE_SIZE_BYTES, MODULE_EXTENSIONS } from './constants';
2
+ export type { WidgetInitialStatePath, WidgetLabel, WidgetLocalizedCopy } from './types';
3
+ export { assertValidLocaleKey, validateHomeScreenWidgetId, validateInitialStatePath, validateWidgetLabel, } from './validation';
4
+ export { addApplicationGroupsEntitlement } from './utils/entitlements';
5
+ export { resolveFontPaths } from './utils/fonts';
6
+ export { normalizeLocaleTag, pickLocalizedValue } from './utils/localePick';
7
+ export { logger } from './utils/logger';
8
+ export type { PrerenderableWidget, PrerenderedWidgetStates, WidgetRenderer } from './utils/prerender';
9
+ export { prerenderWidgetState } from './utils/prerender';
10
+ export { isWidgetLocalizedMap, widgetLabelEnglish } from './utils/widgetLabel';
13
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAIjD;;;;;;;GAOG;AACH,QAAA,MAAM,UAAU,EAAE,kBA8DjB,CAAA;AAED,eAAe,UAAU,CAAA;AAGzB,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,+BAA+B,EAC/B,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,wBAAwB,GACzB,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACrE,YAAY,EAAE,sBAAsB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AACvF,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA"}