@use-voltra/expo-plugin 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +34 -0
  2. package/build/cjs/android/files/assets.js +259 -0
  3. package/build/cjs/android/files/assets.js.map +1 -0
  4. package/build/cjs/android/files/fonts.js +69 -0
  5. package/build/cjs/android/files/fonts.js.map +1 -0
  6. package/build/cjs/android/files/index.js +81 -0
  7. package/build/cjs/android/files/index.js.map +1 -0
  8. package/build/cjs/android/files/initialStates.js +83 -0
  9. package/build/cjs/android/files/initialStates.js.map +1 -0
  10. package/build/cjs/android/files/kotlin.js +142 -0
  11. package/build/cjs/android/files/kotlin.js.map +1 -0
  12. package/build/cjs/android/files/xml.js +247 -0
  13. package/build/cjs/android/files/xml.js.map +1 -0
  14. package/build/cjs/android/index.js +33 -0
  15. package/build/cjs/android/index.js.map +1 -0
  16. package/build/cjs/android/manifest.js +63 -0
  17. package/build/cjs/android/manifest.js.map +1 -0
  18. package/build/cjs/constants.js +48 -0
  19. package/build/cjs/constants.js.map +1 -0
  20. package/build/cjs/index.js +71 -0
  21. package/build/cjs/index.js.map +1 -0
  22. package/build/cjs/ios/eas.js +28 -0
  23. package/build/cjs/ios/eas.js.map +1 -0
  24. package/build/cjs/ios/entitlements.js +46 -0
  25. package/build/cjs/ios/entitlements.js.map +1 -0
  26. package/build/cjs/ios/index.js +39 -0
  27. package/build/cjs/ios/index.js.map +1 -0
  28. package/build/cjs/ios/infoPlist.js +51 -0
  29. package/build/cjs/ios/infoPlist.js.map +1 -0
  30. package/build/cjs/ios/pushNotifications.js +22 -0
  31. package/build/cjs/ios/pushNotifications.js.map +1 -0
  32. package/build/cjs/ios-widget/eas.js +66 -0
  33. package/build/cjs/ios-widget/eas.js.map +1 -0
  34. package/build/cjs/ios-widget/files/assets.js +199 -0
  35. package/build/cjs/ios-widget/files/assets.js.map +1 -0
  36. package/build/cjs/ios-widget/files/entitlements.js +77 -0
  37. package/build/cjs/ios-widget/files/entitlements.js.map +1 -0
  38. package/build/cjs/ios-widget/files/index.js +92 -0
  39. package/build/cjs/ios-widget/files/index.js.map +1 -0
  40. package/build/cjs/ios-widget/files/infoPlist.js +91 -0
  41. package/build/cjs/ios-widget/files/infoPlist.js.map +1 -0
  42. package/build/cjs/ios-widget/files/swift.js +256 -0
  43. package/build/cjs/ios-widget/files/swift.js.map +1 -0
  44. package/build/cjs/ios-widget/fonts.js +151 -0
  45. package/build/cjs/ios-widget/fonts.js.map +1 -0
  46. package/build/cjs/ios-widget/index.js +46 -0
  47. package/build/cjs/ios-widget/index.js.map +1 -0
  48. package/build/cjs/ios-widget/podfile.js +43 -0
  49. package/build/cjs/ios-widget/podfile.js.map +1 -0
  50. package/build/cjs/ios-widget/widgetPlist.js +99 -0
  51. package/build/cjs/ios-widget/widgetPlist.js.map +1 -0
  52. package/build/cjs/ios-widget/xcode/buildPhases.js +245 -0
  53. package/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -0
  54. package/build/cjs/ios-widget/xcode/configurationList.js +91 -0
  55. package/build/cjs/ios-widget/xcode/configurationList.js.map +1 -0
  56. package/build/cjs/ios-widget/xcode/groups.js +65 -0
  57. package/build/cjs/ios-widget/xcode/groups.js.map +1 -0
  58. package/build/cjs/ios-widget/xcode/index.js +155 -0
  59. package/build/cjs/ios-widget/xcode/index.js.map +1 -0
  60. package/build/cjs/ios-widget/xcode/mainAppSettings.js +71 -0
  61. package/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -0
  62. package/build/cjs/ios-widget/xcode/productFile.js +74 -0
  63. package/build/cjs/ios-widget/xcode/productFile.js.map +1 -0
  64. package/build/cjs/ios-widget/xcode/target.js +113 -0
  65. package/build/cjs/ios-widget/xcode/target.js.map +1 -0
  66. package/build/cjs/package.json +3 -0
  67. package/build/cjs/types.js +3 -0
  68. package/build/cjs/types.js.map +1 -0
  69. package/build/cjs/utils/entitlements.js +21 -0
  70. package/build/cjs/utils/entitlements.js.map +1 -0
  71. package/build/cjs/utils/fileDiscovery.js +107 -0
  72. package/build/cjs/utils/fileDiscovery.js.map +1 -0
  73. package/build/cjs/utils/fonts.js +75 -0
  74. package/build/cjs/utils/fonts.js.map +1 -0
  75. package/build/cjs/utils/logger.js +51 -0
  76. package/build/cjs/utils/logger.js.map +1 -0
  77. package/build/cjs/utils/prerender.js +191 -0
  78. package/build/cjs/utils/prerender.js.map +1 -0
  79. package/build/cjs/utils/urlScheme.js +40 -0
  80. package/build/cjs/utils/urlScheme.js.map +1 -0
  81. package/build/cjs/validation.js +231 -0
  82. package/build/cjs/validation.js.map +1 -0
  83. package/build/esm/android/files/assets.js +223 -0
  84. package/build/esm/android/files/assets.js.map +1 -0
  85. package/build/esm/android/files/fonts.js +33 -0
  86. package/build/esm/android/files/fonts.js.map +1 -0
  87. package/build/esm/android/files/index.js +77 -0
  88. package/build/esm/android/files/index.js.map +1 -0
  89. package/build/esm/android/files/initialStates.js +44 -0
  90. package/build/esm/android/files/initialStates.js.map +1 -0
  91. package/build/esm/android/files/kotlin.js +103 -0
  92. package/build/esm/android/files/kotlin.js.map +1 -0
  93. package/build/esm/android/files/xml.js +206 -0
  94. package/build/esm/android/files/xml.js.map +1 -0
  95. package/build/esm/android/index.js +29 -0
  96. package/build/esm/android/index.js.map +1 -0
  97. package/build/esm/android/manifest.js +59 -0
  98. package/build/esm/android/manifest.js.map +1 -0
  99. package/build/esm/constants.js +45 -0
  100. package/build/esm/constants.js.map +1 -0
  101. package/build/esm/index.js +69 -0
  102. package/build/esm/index.js.map +1 -0
  103. package/build/esm/ios/eas.js +24 -0
  104. package/build/esm/ios/eas.js.map +1 -0
  105. package/build/esm/ios/entitlements.js +42 -0
  106. package/build/esm/ios/entitlements.js.map +1 -0
  107. package/build/esm/ios/index.js +34 -0
  108. package/build/esm/ios/index.js.map +1 -0
  109. package/build/esm/ios/infoPlist.js +47 -0
  110. package/build/esm/ios/infoPlist.js.map +1 -0
  111. package/build/esm/ios/pushNotifications.js +18 -0
  112. package/build/esm/ios/pushNotifications.js.map +1 -0
  113. package/build/esm/ios-widget/eas.js +62 -0
  114. package/build/esm/ios-widget/eas.js.map +1 -0
  115. package/build/esm/ios-widget/files/assets.js +163 -0
  116. package/build/esm/ios-widget/files/assets.js.map +1 -0
  117. package/build/esm/ios-widget/files/entitlements.js +37 -0
  118. package/build/esm/ios-widget/files/entitlements.js.map +1 -0
  119. package/build/esm/ios-widget/files/index.js +55 -0
  120. package/build/esm/ios-widget/files/index.js.map +1 -0
  121. package/build/esm/ios-widget/files/infoPlist.js +55 -0
  122. package/build/esm/ios-widget/files/infoPlist.js.map +1 -0
  123. package/build/esm/ios-widget/files/swift.js +217 -0
  124. package/build/esm/ios-widget/files/swift.js.map +1 -0
  125. package/build/esm/ios-widget/fonts.js +111 -0
  126. package/build/esm/ios-widget/fonts.js.map +1 -0
  127. package/build/esm/ios-widget/index.js +42 -0
  128. package/build/esm/ios-widget/index.js.map +1 -0
  129. package/build/esm/ios-widget/podfile.js +39 -0
  130. package/build/esm/ios-widget/podfile.js.map +1 -0
  131. package/build/esm/ios-widget/widgetPlist.js +92 -0
  132. package/build/esm/ios-widget/widgetPlist.js.map +1 -0
  133. package/build/esm/ios-widget/xcode/buildPhases.js +208 -0
  134. package/build/esm/ios-widget/xcode/buildPhases.js.map +1 -0
  135. package/build/esm/ios-widget/xcode/configurationList.js +87 -0
  136. package/build/esm/ios-widget/xcode/configurationList.js.map +1 -0
  137. package/build/esm/ios-widget/xcode/groups.js +61 -0
  138. package/build/esm/ios-widget/xcode/groups.js.map +1 -0
  139. package/build/esm/ios-widget/xcode/index.js +118 -0
  140. package/build/esm/ios-widget/xcode/index.js.map +1 -0
  141. package/build/esm/ios-widget/xcode/mainAppSettings.js +68 -0
  142. package/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -0
  143. package/build/esm/ios-widget/xcode/productFile.js +70 -0
  144. package/build/esm/ios-widget/xcode/productFile.js.map +1 -0
  145. package/build/esm/ios-widget/xcode/target.js +108 -0
  146. package/build/esm/ios-widget/xcode/target.js.map +1 -0
  147. package/build/esm/package.json +3 -0
  148. package/build/esm/types.js +2 -0
  149. package/build/esm/types.js.map +1 -0
  150. package/build/esm/utils/entitlements.js +18 -0
  151. package/build/esm/utils/entitlements.js.map +1 -0
  152. package/build/esm/utils/fileDiscovery.js +71 -0
  153. package/build/esm/utils/fileDiscovery.js.map +1 -0
  154. package/build/esm/utils/fonts.js +39 -0
  155. package/build/esm/utils/fonts.js.map +1 -0
  156. package/build/esm/utils/logger.js +48 -0
  157. package/build/esm/utils/logger.js.map +1 -0
  158. package/build/esm/utils/prerender.js +152 -0
  159. package/build/esm/utils/prerender.js.map +1 -0
  160. package/build/esm/utils/urlScheme.js +37 -0
  161. package/build/esm/utils/urlScheme.js.map +1 -0
  162. package/build/esm/validation.js +193 -0
  163. package/build/esm/validation.js.map +1 -0
  164. package/build/types/android/files/assets.d.ts +26 -0
  165. package/build/types/android/files/assets.d.ts.map +1 -0
  166. package/build/types/android/files/fonts.d.ts +19 -0
  167. package/build/types/android/files/fonts.d.ts.map +1 -0
  168. package/build/types/android/files/index.d.ts +21 -0
  169. package/build/types/android/files/index.d.ts.map +1 -0
  170. package/build/types/android/files/initialStates.d.ts +14 -0
  171. package/build/types/android/files/initialStates.d.ts.map +1 -0
  172. package/build/types/android/files/kotlin.d.ts +11 -0
  173. package/build/types/android/files/kotlin.d.ts.map +1 -0
  174. package/build/types/android/files/xml.d.ts +25 -0
  175. package/build/types/android/files/xml.d.ts.map +1 -0
  176. package/build/types/android/index.d.ts +12 -0
  177. package/build/types/android/index.d.ts.map +1 -0
  178. package/build/types/android/manifest.d.ts +15 -0
  179. package/build/types/android/manifest.d.ts.map +1 -0
  180. package/build/types/constants.d.ts +29 -0
  181. package/build/types/constants.d.ts.map +1 -0
  182. package/build/types/index.d.ts +13 -0
  183. package/build/types/index.d.ts.map +1 -0
  184. package/build/types/ios/eas.d.ts +12 -0
  185. package/build/types/ios/eas.d.ts.map +1 -0
  186. package/build/types/ios/entitlements.d.ts +14 -0
  187. package/build/types/ios/entitlements.d.ts.map +1 -0
  188. package/build/types/ios/index.d.ts +19 -0
  189. package/build/types/ios/index.d.ts.map +1 -0
  190. package/build/types/ios/infoPlist.d.ts +21 -0
  191. package/build/types/ios/infoPlist.d.ts.map +1 -0
  192. package/build/types/ios/pushNotifications.d.ts +10 -0
  193. package/build/types/ios/pushNotifications.d.ts.map +1 -0
  194. package/build/types/ios-widget/eas.d.ts +15 -0
  195. package/build/types/ios-widget/eas.d.ts.map +1 -0
  196. package/build/types/ios-widget/files/assets.d.ts +13 -0
  197. package/build/types/ios-widget/files/assets.d.ts.map +1 -0
  198. package/build/types/ios-widget/files/entitlements.d.ts +17 -0
  199. package/build/types/ios-widget/files/entitlements.d.ts.map +1 -0
  200. package/build/types/ios-widget/files/index.d.ts +24 -0
  201. package/build/types/ios-widget/files/index.d.ts.map +1 -0
  202. package/build/types/ios-widget/files/infoPlist.d.ts +10 -0
  203. package/build/types/ios-widget/files/infoPlist.d.ts.map +1 -0
  204. package/build/types/ios-widget/files/swift.d.ts +15 -0
  205. package/build/types/ios-widget/files/swift.d.ts.map +1 -0
  206. package/build/types/ios-widget/fonts.d.ts +22 -0
  207. package/build/types/ios-widget/fonts.d.ts.map +1 -0
  208. package/build/types/ios-widget/index.d.ts +31 -0
  209. package/build/types/ios-widget/index.d.ts.map +1 -0
  210. package/build/types/ios-widget/podfile.d.ts +9 -0
  211. package/build/types/ios-widget/podfile.d.ts.map +1 -0
  212. package/build/types/ios-widget/widgetPlist.d.ts +20 -0
  213. package/build/types/ios-widget/widgetPlist.d.ts.map +1 -0
  214. package/build/types/ios-widget/xcode/buildPhases.d.ts +25 -0
  215. package/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -0
  216. package/build/types/ios-widget/xcode/configurationList.d.ts +20 -0
  217. package/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -0
  218. package/build/types/ios-widget/xcode/groups.d.ts +15 -0
  219. package/build/types/ios-widget/xcode/groups.d.ts.map +1 -0
  220. package/build/types/ios-widget/xcode/index.d.ts +20 -0
  221. package/build/types/ios-widget/xcode/index.d.ts.map +1 -0
  222. package/build/types/ios-widget/xcode/mainAppSettings.d.ts +15 -0
  223. package/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -0
  224. package/build/types/ios-widget/xcode/productFile.d.ts +14 -0
  225. package/build/types/ios-widget/xcode/productFile.d.ts.map +1 -0
  226. package/build/types/ios-widget/xcode/target.d.ts +42 -0
  227. package/build/types/ios-widget/xcode/target.d.ts.map +1 -0
  228. package/build/types/types.d.ts +261 -0
  229. package/build/types/types.d.ts.map +1 -0
  230. package/build/types/utils/entitlements.d.ts +9 -0
  231. package/build/types/utils/entitlements.d.ts.map +1 -0
  232. package/build/types/utils/fileDiscovery.d.ts +13 -0
  233. package/build/types/utils/fileDiscovery.d.ts.map +1 -0
  234. package/build/types/utils/fonts.d.ts +2 -0
  235. package/build/types/utils/fonts.d.ts.map +1 -0
  236. package/build/types/utils/logger.d.ts +30 -0
  237. package/build/types/utils/logger.d.ts.map +1 -0
  238. package/build/types/utils/prerender.d.ts +25 -0
  239. package/build/types/utils/prerender.d.ts.map +1 -0
  240. package/build/types/utils/urlScheme.d.ts +10 -0
  241. package/build/types/utils/urlScheme.d.ts.map +1 -0
  242. package/build/types/validation.d.ts +17 -0
  243. package/build/types/validation.d.ts.map +1 -0
  244. package/package.json +58 -0
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateWidgetReceivers = generateWidgetReceivers;
40
+ const dedent_1 = __importDefault(require("dedent"));
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ // ============================================================================
44
+ // Main Function
45
+ // ============================================================================
46
+ /**
47
+ * Generates Kotlin receiver classes for all configured widgets
48
+ */
49
+ async function generateWidgetReceivers(props) {
50
+ const { platformProjectRoot, packageName, widgets } = props;
51
+ // Determine the package path (e.g., com.example.app -> com/example/app)
52
+ const packagePath = packageName.replace(/\./g, '/');
53
+ const widgetDir = path.join(platformProjectRoot, 'app', 'src', 'main', 'java', packagePath, 'widget');
54
+ // Ensure the widget directory exists
55
+ if (!fs.existsSync(widgetDir)) {
56
+ fs.mkdirSync(widgetDir, { recursive: true });
57
+ }
58
+ // Generate a receiver class for each widget
59
+ for (const widget of widgets) {
60
+ const className = `VoltraWidget_${widget.id}Receiver`;
61
+ const filePath = path.join(widgetDir, `${className}.kt`);
62
+ const content = generateWidgetReceiverClass(widget, packageName);
63
+ fs.writeFileSync(filePath, content, 'utf8');
64
+ }
65
+ }
66
+ // ============================================================================
67
+ // Widget Receiver
68
+ // ============================================================================
69
+ /**
70
+ * Generates Kotlin code for a single widget receiver class.
71
+ * If the widget has serverUpdate configured, includes WorkManager scheduling.
72
+ */
73
+ function generateWidgetReceiverClass(widget, packageName) {
74
+ const className = `VoltraWidget_${widget.id}Receiver`;
75
+ if (widget.serverUpdate) {
76
+ const refreshEnabled = widget.serverUpdate.refresh === true;
77
+ // Widget with server-driven updates: schedule WorkManager periodic task
78
+ return (0, dedent_1.default) `
79
+ package ${packageName}.widget
80
+
81
+ import android.appwidget.AppWidgetManager
82
+ import android.content.Context
83
+ import voltra.widget.VoltraWidgetReceiver
84
+ import voltra.widget.VoltraWidgetUpdateScheduler
85
+
86
+ /**
87
+ * Auto-generated widget receiver for ${widget.displayName}
88
+ * Widget ID: ${widget.id}
89
+ * Server Update: ${widget.serverUpdate.url} (every ${widget.serverUpdate.intervalMinutes ?? 15} minutes)
90
+ * Refresh Button: ${refreshEnabled}
91
+ */
92
+ class ${className} : VoltraWidgetReceiver() {
93
+ override val widgetId: String = "${widget.id}"
94
+
95
+ override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
96
+ super.onUpdate(context, appWidgetManager, appWidgetIds)
97
+
98
+ // Schedule periodic server updates via WorkManager
99
+ VoltraWidgetUpdateScheduler.schedulePeriodicUpdate(
100
+ context = context,
101
+ widgetId = "${widget.id}",
102
+ serverUrl = "${widget.serverUpdate.url}",
103
+ intervalMinutes = ${widget.serverUpdate.intervalMinutes ?? 15}L,
104
+ refreshEnabled = ${refreshEnabled}
105
+ )
106
+ }
107
+
108
+ override fun onDeleted(context: Context, appWidgetIds: IntArray) {
109
+ super.onDeleted(context, appWidgetIds)
110
+
111
+ // Cancel periodic updates when all instances of this widget are removed
112
+ val remaining = appWidgetManager(context, appWidgetIds)
113
+ if (remaining == 0) {
114
+ VoltraWidgetUpdateScheduler.cancelPeriodicUpdate(context, "${widget.id}")
115
+ }
116
+ }
117
+
118
+ private fun appWidgetManager(context: Context, deletedIds: IntArray): Int {
119
+ val manager = AppWidgetManager.getInstance(context)
120
+ val componentName = android.content.ComponentName(context, this::class.java)
121
+ val allIds = manager.getAppWidgetIds(componentName)
122
+ return allIds.count { it !in deletedIds }
123
+ }
124
+ }
125
+ `;
126
+ }
127
+ // Standard widget without server updates
128
+ return (0, dedent_1.default) `
129
+ package ${packageName}.widget
130
+
131
+ import voltra.widget.VoltraWidgetReceiver
132
+
133
+ /**
134
+ * Auto-generated widget receiver for ${widget.displayName}
135
+ * Widget ID: ${widget.id}
136
+ */
137
+ class ${className} : VoltraWidgetReceiver() {
138
+ override val widgetId: String = "${widget.id}"
139
+ }
140
+ `;
141
+ }
142
+ //# sourceMappingURL=kotlin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kotlin.js","sourceRoot":"","sources":["../../../../src/android/files/kotlin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,0DAoBC;AAvCD,oDAA2B;AAC3B,uCAAwB;AACxB,2CAA4B;AAU5B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACI,KAAK,UAAU,uBAAuB,CAAC,KAA+B;IAC3E,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAE3D,wEAAwE;IACxE,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAErG,qCAAqC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,gBAAgB,MAAM,CAAC,EAAE,UAAU,CAAA;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,KAAK,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAEhE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,2BAA2B,CAAC,MAA2B,EAAE,WAAmB;IACnF,MAAM,SAAS,GAAG,gBAAgB,MAAM,CAAC,EAAE,UAAU,CAAA;IAErD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,KAAK,IAAI,CAAA;QAC3D,wEAAwE;QACxE,OAAO,IAAA,gBAAM,EAAA;gBACD,WAAW;;;;;;;;8CAQmB,MAAM,CAAC,WAAW;sBAC1C,MAAM,CAAC,EAAE;0BACL,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,MAAM,CAAC,YAAY,CAAC,eAAe,IAAI,EAAE;2BAC1E,cAAc;;cAE3B,SAAS;6CACsB,MAAM,CAAC,EAAE;;;;;;;;gCAQtB,MAAM,CAAC,EAAE;iCACR,MAAM,CAAC,YAAY,CAAC,GAAG;sCAClB,MAAM,CAAC,YAAY,CAAC,eAAe,IAAI,EAAE;qCAC1C,cAAc;;;;;;;;;;+EAU4B,MAAM,CAAC,EAAE;;;;;;;;;;;KAWnF,CAAA;IACH,CAAC;IAED,yCAAyC;IACzC,OAAO,IAAA,gBAAM,EAAA;cACD,WAAW;;;;;4CAKmB,MAAM,CAAC,WAAW;oBAC1C,MAAM,CAAC,EAAE;;YAEjB,SAAS;2CACsB,MAAM,CAAC,EAAE;;GAEjD,CAAA;AACH,CAAC"}
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateWidgetInfoFiles = generateWidgetInfoFiles;
40
+ exports.generateWidgetPlaceholderLayouts = generateWidgetPlaceholderLayouts;
41
+ exports.generateWidgetPreviewLayouts = generateWidgetPreviewLayouts;
42
+ const dedent_1 = __importDefault(require("dedent"));
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const logger_1 = require("../../utils/logger");
46
+ // ============================================================================
47
+ // Main Functions
48
+ // ============================================================================
49
+ /**
50
+ * Generates widget info XML files for all widgets
51
+ */
52
+ async function generateWidgetInfoFiles(props) {
53
+ const { platformProjectRoot, widgets } = props;
54
+ const xmlPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'xml');
55
+ const valuesPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'values');
56
+ // Ensure directories exist
57
+ if (!fs.existsSync(xmlPath)) {
58
+ fs.mkdirSync(xmlPath, { recursive: true });
59
+ }
60
+ if (!fs.existsSync(valuesPath)) {
61
+ fs.mkdirSync(valuesPath, { recursive: true });
62
+ }
63
+ // Generate string resources for all widgets
64
+ const stringsPath = path.join(valuesPath, 'voltra_widgets.xml');
65
+ const stringsContent = generateStringResourcesXml(widgets);
66
+ fs.writeFileSync(stringsPath, stringsContent, 'utf8');
67
+ }
68
+ /**
69
+ * Generates placeholder layout XML
70
+ */
71
+ async function generateWidgetPlaceholderLayouts(props) {
72
+ const layoutPath = path.join(props.platformProjectRoot, 'app', 'src', 'main', 'res', 'layout');
73
+ if (!fs.existsSync(layoutPath)) {
74
+ fs.mkdirSync(layoutPath, { recursive: true });
75
+ }
76
+ const placeholderLayoutPath = path.join(layoutPath, 'voltra_widget_placeholder.xml');
77
+ const placeholderLayoutContent = generatePlaceholderLayoutXml();
78
+ fs.writeFileSync(placeholderLayoutPath, placeholderLayoutContent, 'utf8');
79
+ }
80
+ /**
81
+ * Generates preview layouts for widgets
82
+ */
83
+ async function generateWidgetPreviewLayouts(props) {
84
+ const { platformProjectRoot, projectRoot, widgets, previewImageMap } = props;
85
+ const layoutPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'layout');
86
+ const xmlPath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'xml');
87
+ if (!fs.existsSync(layoutPath)) {
88
+ fs.mkdirSync(layoutPath, { recursive: true });
89
+ }
90
+ // Generate preview layouts and get the map
91
+ const previewLayoutMap = await generatePreviewLayouts(widgets, projectRoot, layoutPath, previewImageMap);
92
+ // Write widget info XML for all widgets, including preview references where available
93
+ for (const widget of widgets) {
94
+ const widgetInfoPath = path.join(xmlPath, `voltra_widget_${widget.id}_info.xml`);
95
+ const previewImageResourceName = previewImageMap.get(widget.id);
96
+ const previewLayoutResourceName = previewLayoutMap.get(widget.id);
97
+ const widgetInfoContent = generateWidgetInfoXml(widget, previewImageResourceName, previewLayoutResourceName);
98
+ fs.writeFileSync(widgetInfoPath, widgetInfoContent, 'utf8');
99
+ }
100
+ }
101
+ // ============================================================================
102
+ // Widget Info XML
103
+ // ============================================================================
104
+ /**
105
+ * Generates widget provider info XML for a single widget
106
+ */
107
+ function generateWidgetInfoXml(widget, previewImageResourceName, previewLayoutResourceName) {
108
+ const { targetCellWidth, targetCellHeight } = widget;
109
+ const resizeMode = widget.resizeMode || 'horizontal|vertical';
110
+ const widgetCategory = widget.widgetCategory || 'home_screen';
111
+ let minWidth = widget.minWidth;
112
+ if (minWidth === undefined && widget.minCellWidth !== undefined) {
113
+ minWidth = widget.minCellWidth * 70 - 30;
114
+ }
115
+ let minHeight = widget.minHeight;
116
+ if (minHeight === undefined && widget.minCellHeight !== undefined) {
117
+ minHeight = widget.minCellHeight * 70 - 30;
118
+ }
119
+ const minWidthAttr = minWidth !== undefined ? `\n android:minWidth="${minWidth}dp"` : '';
120
+ const minHeightAttr = minHeight !== undefined ? `\n android:minHeight="${minHeight}dp"` : '';
121
+ const previewImageAttr = previewImageResourceName
122
+ ? `\n android:previewImage="@drawable/${previewImageResourceName}"`
123
+ : '';
124
+ const previewLayoutAttr = previewLayoutResourceName
125
+ ? `\n android:previewLayout="@layout/${previewLayoutResourceName}"`
126
+ : '';
127
+ return (0, dedent_1.default) `
128
+ <?xml version="1.0" encoding="utf-8"?>
129
+ <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"${minWidthAttr}${minHeightAttr}
130
+ android:targetCellWidth="${targetCellWidth}"
131
+ android:targetCellHeight="${targetCellHeight}"
132
+ android:updatePeriodMillis="0"
133
+ android:initialLayout="@layout/voltra_widget_placeholder"
134
+ android:resizeMode="${resizeMode}"
135
+ android:widgetCategory="${widgetCategory}"
136
+ android:description="@string/voltra_widget_${widget.id}_description"${previewImageAttr}${previewLayoutAttr}>
137
+ </appwidget-provider>
138
+ `;
139
+ }
140
+ // ============================================================================
141
+ // String Resources XML
142
+ // ============================================================================
143
+ /**
144
+ * Generates string resources for widget display names and descriptions
145
+ */
146
+ function generateStringResourcesXml(widgets) {
147
+ const stringEntries = widgets
148
+ .map((widget) => `<string name="voltra_widget_${widget.id}_label">${widget.displayName}</string>\n <string name="voltra_widget_${widget.id}_description">${widget.description}</string>`)
149
+ .join('\n ');
150
+ return (0, dedent_1.default) `
151
+ <?xml version="1.0" encoding="utf-8"?>
152
+ <resources>
153
+ <!-- Voltra Widget Labels and Descriptions (Auto-generated) -->
154
+ ${stringEntries}
155
+ </resources>
156
+ `;
157
+ }
158
+ // ============================================================================
159
+ // Placeholder Layout XML
160
+ // ============================================================================
161
+ /**
162
+ * Generates placeholder layout XML for widgets
163
+ * This will be replaced by Glance at runtime
164
+ */
165
+ function generatePlaceholderLayoutXml() {
166
+ return (0, dedent_1.default) `
167
+ <?xml version="1.0" encoding="utf-8"?>
168
+ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
169
+ android:layout_width="match_parent"
170
+ android:layout_height="match_parent"
171
+ android:background="?android:attr/colorBackground">
172
+ <TextView
173
+ android:layout_width="wrap_content"
174
+ android:layout_height="wrap_content"
175
+ android:layout_gravity="center"
176
+ android:text="Loading..."
177
+ android:textColor="?android:attr/textColorPrimary" />
178
+ </FrameLayout>
179
+ `;
180
+ }
181
+ // ============================================================================
182
+ // Preview Layout
183
+ // ============================================================================
184
+ /**
185
+ * Generates an auto-layout XML for image-based preview.
186
+ * This is used when previewImage is provided but no custom previewLayout.
187
+ */
188
+ function generateAutoImagePreviewLayout(widgetId, drawableResourceName) {
189
+ return (0, dedent_1.default) `
190
+ <?xml version="1.0" encoding="utf-8"?>
191
+ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
192
+ android:layout_width="match_parent"
193
+ android:layout_height="match_parent">
194
+ <ImageView
195
+ android:layout_width="match_parent"
196
+ android:layout_height="match_parent"
197
+ android:src="@drawable/${drawableResourceName}"
198
+ android:scaleType="centerCrop"
199
+ android:contentDescription="@string/voltra_widget_${widgetId}_description" />
200
+ </FrameLayout>
201
+ `;
202
+ }
203
+ /**
204
+ * Generates preview layout XML files for all widgets.
205
+ * Returns a map of widgetId to layout resource name.
206
+ *
207
+ * Strategy:
208
+ * - If previewLayout is provided: copy user's custom XML
209
+ * - Else if previewImage is provided: generate auto-layout with ImageView
210
+ * - Otherwise: no preview layout generated
211
+ */
212
+ async function generatePreviewLayouts(widgets, projectRoot, layoutPath, previewImageMap) {
213
+ const previewLayoutMap = new Map();
214
+ // Ensure layout directory exists
215
+ if (!fs.existsSync(layoutPath)) {
216
+ fs.mkdirSync(layoutPath, { recursive: true });
217
+ }
218
+ for (const widget of widgets) {
219
+ let layoutContent = null;
220
+ const layoutResourceName = `voltra_widget_${widget.id}_preview`;
221
+ const layoutFilePath = path.join(layoutPath, `${layoutResourceName}.xml`);
222
+ // Strategy 1: User provided custom preview layout
223
+ if (widget.previewLayout) {
224
+ const sourcePath = path.join(projectRoot, widget.previewLayout);
225
+ if (!fs.existsSync(sourcePath)) {
226
+ logger_1.logger.warn(`Preview layout not found for widget '${widget.id}' at ${widget.previewLayout}`);
227
+ continue;
228
+ }
229
+ // Copy user's custom XML
230
+ layoutContent = fs.readFileSync(sourcePath, 'utf8');
231
+ logger_1.logger.info(`Using custom preview layout for widget '${widget.id}'`);
232
+ }
233
+ // Strategy 2: Auto-generate layout from preview image
234
+ else if (widget.previewImage && previewImageMap.has(widget.id)) {
235
+ const drawableResourceName = previewImageMap.get(widget.id);
236
+ layoutContent = generateAutoImagePreviewLayout(widget.id, drawableResourceName);
237
+ logger_1.logger.info(`Generated auto preview layout for widget '${widget.id}' from preview image`);
238
+ }
239
+ // Write layout file if we have content
240
+ if (layoutContent) {
241
+ fs.writeFileSync(layoutFilePath, layoutContent, 'utf8');
242
+ previewLayoutMap.set(widget.id, layoutResourceName);
243
+ }
244
+ }
245
+ return previewLayoutMap;
246
+ }
247
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../../src/android/files/xml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withAndroid = void 0;
4
+ const config_plugins_1 = require("@expo/config-plugins");
5
+ const validation_1 = require("../validation");
6
+ const files_1 = require("./files");
7
+ const manifest_1 = require("./manifest");
8
+ /**
9
+ * Main Android configuration plugin.
10
+ *
11
+ * This orchestrates all Android-related configuration in the correct order:
12
+ * 1. Validate widget configurations with file existence checks
13
+ * 2. Generate widget files (Kotlin receivers, XML metadata, resources)
14
+ * 3. Configure AndroidManifest (receiver entries)
15
+ */
16
+ const withAndroid = (config, props) => {
17
+ const { widgets, userImagesPath, fonts } = props;
18
+ if (!config.android?.package) {
19
+ throw new Error('Voltra config plugin requires expo.android.package to be set in app.json/app.config.* to configure Android widgets.');
20
+ }
21
+ // Get project root from modRequest if available, otherwise validation will skip file checks
22
+ const projectRoot = config.modRequest?.projectRoot;
23
+ // Validate Android widgets with file existence checks
24
+ widgets.forEach((widget) => (0, validation_1.validateAndroidWidgetConfig)(widget, projectRoot));
25
+ return (0, config_plugins_1.withPlugins)(config, [
26
+ // 1. Generate widget files (must run first so files exist)
27
+ [files_1.generateAndroidWidgetFiles, { widgets, userImagesPath, fonts }],
28
+ // 2. Configure AndroidManifest (must run after files are generated)
29
+ [manifest_1.configureAndroidManifest, { widgets }],
30
+ ]);
31
+ };
32
+ exports.withAndroid = withAndroid;
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/android/index.ts"],"names":[],"mappings":";;;AAAA,yDAAgE;AAGhE,8CAA2D;AAC3D,mCAAoD;AACpD,yCAAqD;AAErD;;;;;;;GAOG;AACI,MAAM,WAAW,GAAqC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IAC7E,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAEhD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAA;IACH,CAAC;IAED,4FAA4F;IAC5F,MAAM,WAAW,GAAI,MAAc,CAAC,UAAU,EAAE,WAAW,CAAA;IAE3D,sDAAsD;IACtD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,wCAA2B,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IAE7E,OAAO,IAAA,4BAAW,EAAC,MAAM,EAAE;QACzB,2DAA2D;QAC3D,CAAC,kCAA0B,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAEhE,oEAAoE;QACpE,CAAC,mCAAwB,EAAE,EAAE,OAAO,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC,CAAA;AAtBY,QAAA,WAAW,eAsBvB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureAndroidManifest = void 0;
4
+ const config_plugins_1 = require("@expo/config-plugins");
5
+ const config_plugins_2 = require("expo/config-plugins");
6
+ /**
7
+ * Plugin step that adds widget receiver entries to AndroidManifest.xml
8
+ *
9
+ * This adds a <receiver> entry for each widget with:
10
+ * - The generated receiver class name
11
+ * - APPWIDGET_UPDATE intent filter
12
+ * - Widget provider metadata reference
13
+ */
14
+ const configureAndroidManifest = (config, props) => {
15
+ const { widgets } = props;
16
+ return (0, config_plugins_1.withAndroidManifest)(config, (config) => {
17
+ const mainApplication = config_plugins_2.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
18
+ // Add a receiver for each widget
19
+ for (const widget of widgets) {
20
+ const receiverClassName = `.widget.VoltraWidget_${widget.id}Receiver`;
21
+ // Check if receiver already exists
22
+ const existingReceivers = (mainApplication.receiver || []);
23
+ const alreadyExists = existingReceivers.some((receiver) => receiver.$?.['android:name'] === receiverClassName);
24
+ if (!alreadyExists) {
25
+ // Create the receiver entry
26
+ const receiver = {
27
+ $: {
28
+ 'android:name': receiverClassName,
29
+ 'android:exported': 'true',
30
+ 'android:label': `@string/voltra_widget_${widget.id}_label`,
31
+ },
32
+ 'intent-filter': [
33
+ {
34
+ action: [
35
+ {
36
+ $: {
37
+ 'android:name': 'android.appwidget.action.APPWIDGET_UPDATE',
38
+ },
39
+ },
40
+ ],
41
+ },
42
+ ],
43
+ 'meta-data': [
44
+ {
45
+ $: {
46
+ 'android:name': 'android.appwidget.provider',
47
+ 'android:resource': `@xml/voltra_widget_${widget.id}_info`,
48
+ },
49
+ },
50
+ ],
51
+ };
52
+ // Add the receiver to the application
53
+ if (!mainApplication.receiver) {
54
+ mainApplication.receiver = [];
55
+ }
56
+ mainApplication.receiver.push(receiver);
57
+ }
58
+ }
59
+ return config;
60
+ });
61
+ };
62
+ exports.configureAndroidManifest = configureAndroidManifest;
63
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/android/manifest.ts"],"names":[],"mappings":";;;AAAA,yDAAwE;AACxE,wDAAmD;AAQnD;;;;;;;GAOG;AACI,MAAM,wBAAwB,GAAgD,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACrG,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAEzB,OAAO,IAAA,oCAAmB,EAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5C,MAAM,eAAe,GAAG,8BAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,MAAM,CAAC,UAAU,CAAQ,CAAA;QAClG,iCAAiC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,iBAAiB,GAAG,wBAAwB,MAAM,CAAC,EAAE,UAAU,CAAA;YAErE,mCAAmC;YACnC,MAAM,iBAAiB,GAAG,CAAC,eAAe,CAAC,QAAQ,IAAI,EAAE,CAAU,CAAA;YACnE,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAC1C,CAAC,QAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,iBAAiB,CACtE,CAAA;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,4BAA4B;gBAC5B,MAAM,QAAQ,GAAG;oBACf,CAAC,EAAE;wBACD,cAAc,EAAE,iBAAiB;wBACjC,kBAAkB,EAAE,MAAe;wBACnC,eAAe,EAAE,yBAAyB,MAAM,CAAC,EAAE,QAAQ;qBAC5D;oBACD,eAAe,EAAE;wBACf;4BACE,MAAM,EAAE;gCACN;oCACE,CAAC,EAAE;wCACD,cAAc,EAAE,2CAA2C;qCAC5D;iCACF;6BACF;yBACF;qBACF;oBACD,WAAW,EAAE;wBACX;4BACE,CAAC,EAAE;gCACD,cAAc,EAAE,4BAA4B;gCAC5C,kBAAkB,EAAE,sBAAsB,MAAM,CAAC,EAAE,OAAO;6BAC3D;yBACF;qBACF;iBACF,CAAA;gBAED,sCAAsC;gBACtC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;oBAC9B,eAAe,CAAC,QAAQ,GAAG,EAAE,CAAA;gBAC/B,CAAC;gBACD,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAtDY,QAAA,wBAAwB,4BAsDpC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MODULE_EXTENSIONS = exports.WIDGET_FAMILY_MAP = exports.DEFAULT_WIDGET_FAMILIES = exports.SUPPORTED_IMAGE_EXTENSIONS = exports.MAX_IMAGE_SIZE_BYTES = exports.DEFAULT_ANDROID_USER_IMAGES_PATH = exports.DEFAULT_USER_IMAGES_PATH = exports.IOS = void 0;
4
+ /**
5
+ * Constants for the Voltra plugin
6
+ */
7
+ // ============================================================================
8
+ // iOS Constants
9
+ // ============================================================================
10
+ exports.IOS = {
11
+ /** Minimum iOS deployment target version */
12
+ DEPLOYMENT_TARGET: '17.0',
13
+ /** Swift language version */
14
+ SWIFT_VERSION: '5.0',
15
+ /** Target device families (1 = iPhone, 2 = iPad) */
16
+ DEVICE_FAMILY: '1,2',
17
+ /** Last Swift migration version for Xcode */
18
+ LAST_SWIFT_MIGRATION: 1250,
19
+ };
20
+ // ============================================================================
21
+ // Path Constants
22
+ // ============================================================================
23
+ /** Default path for user-provided widget images */
24
+ exports.DEFAULT_USER_IMAGES_PATH = './assets/voltra';
25
+ /** Default path for user-provided Android widget images */
26
+ exports.DEFAULT_ANDROID_USER_IMAGES_PATH = './assets/voltra-android';
27
+ // ============================================================================
28
+ // Widget Constants
29
+ // ============================================================================
30
+ /** Maximum image size in bytes for Live Activities (4KB limit) */
31
+ exports.MAX_IMAGE_SIZE_BYTES = 4096;
32
+ /** Supported image extensions for widget assets */
33
+ exports.SUPPORTED_IMAGE_EXTENSIONS = /\.(png|jpg|jpeg)$/i;
34
+ /** Default widget families when not specified */
35
+ exports.DEFAULT_WIDGET_FAMILIES = ['systemSmall', 'systemMedium', 'systemLarge'];
36
+ /** Maps JS widget family names to SwiftUI WidgetFamily enum cases */
37
+ exports.WIDGET_FAMILY_MAP = {
38
+ systemSmall: '.systemSmall',
39
+ systemMedium: '.systemMedium',
40
+ systemLarge: '.systemLarge',
41
+ systemExtraLarge: '.systemExtraLarge',
42
+ accessoryCircular: '.accessoryCircular',
43
+ accessoryRectangular: '.accessoryRectangular',
44
+ accessoryInline: '.accessoryInline',
45
+ };
46
+ /** Extensions to try when resolving module paths for pre-rendering */
47
+ exports.MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', ''];
48
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AAEH,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAElE,QAAA,GAAG,GAAG;IACjB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM;IAEzB,6BAA6B;IAC7B,aAAa,EAAE,KAAK;IAEpB,oDAAoD;IACpD,aAAa,EAAE,KAAK;IAEpB,6CAA6C;IAC7C,oBAAoB,EAAE,IAAI;CAClB,CAAA;AAEV,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,mDAAmD;AACtC,QAAA,wBAAwB,GAAG,iBAAiB,CAAA;AAEzD,2DAA2D;AAC9C,QAAA,gCAAgC,GAAG,yBAAyB,CAAA;AAEzE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,kEAAkE;AACrD,QAAA,oBAAoB,GAAG,IAAI,CAAA;AAExC,mDAAmD;AACtC,QAAA,0BAA0B,GAAG,oBAAoB,CAAA;AAE9D,iDAAiD;AACpC,QAAA,uBAAuB,GAAmB,CAAC,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;AAErG,qEAAqE;AACxD,QAAA,iBAAiB,GAAiC;IAC7D,WAAW,EAAE,cAAc;IAC3B,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,cAAc;IAC3B,gBAAgB,EAAE,mBAAmB;IACrC,iBAAiB,EAAE,oBAAoB;IACvC,oBAAoB,EAAE,uBAAuB;IAC7C,eAAe,EAAE,kBAAkB;CACpC,CAAA;AAED,sEAAsE;AACzD,QAAA,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_plugins_1 = require("expo/config-plugins");
4
+ const android_1 = require("./android");
5
+ const constants_1 = require("./constants");
6
+ const ios_1 = require("./ios");
7
+ const ios_widget_1 = require("./ios-widget");
8
+ const urlScheme_1 = require("./utils/urlScheme");
9
+ const validation_1 = require("./validation");
10
+ /**
11
+ * Main Voltra config plugin.
12
+ *
13
+ * This plugin configures your Expo app for:
14
+ * - Live Activities (Dynamic Island + Lock Screen)
15
+ * - Home Screen Widgets (iOS and Android)
16
+ * - Push Notifications for Live Activities (optional)
17
+ */
18
+ const withVoltra = (config, props = {}) => {
19
+ // Validate props at entry point
20
+ (0, validation_1.validateProps)(props);
21
+ // Configure iOS if bundleIdentifier is available
22
+ if (config.ios?.bundleIdentifier) {
23
+ // Use deploymentTarget from props if provided, otherwise fall back to default
24
+ const deploymentTarget = props.deploymentTarget || constants_1.IOS.DEPLOYMENT_TARGET;
25
+ // Use custom targetName if provided, otherwise fall back to default "{AppName}LiveActivity"
26
+ const targetName = props.targetName || `${config_plugins_1.IOSConfig.XcodeUtils.sanitizedName(config.name)}LiveActivity`;
27
+ const bundleIdentifier = `${config.ios.bundleIdentifier}.${targetName}`;
28
+ // Extract version and buildNumber from config, defaulting to Expo defaults
29
+ const version = config.version || '1.0.0';
30
+ const buildNumber = config.ios?.buildNumber || '1';
31
+ // Ensure URL scheme is set for widget deep linking
32
+ config = (0, urlScheme_1.ensureURLScheme)(config);
33
+ // Derive a default keychainGroup from bundle identifier when any widget uses server-driven updates
34
+ const hasServerDrivenWidgets = props?.widgets?.some((w) => w.serverUpdate) ?? false;
35
+ const keychainGroup = props?.keychainGroup ??
36
+ (hasServerDrivenWidgets ? `$(AppIdentifierPrefix)${config.ios?.bundleIdentifier}` : undefined);
37
+ // Configure iOS main app (Info.plist, entitlements, EAS)
38
+ config = (0, ios_1.withIOS)(config, {
39
+ groupIdentifier: props?.groupIdentifier,
40
+ widgetIds: props?.widgets && props.widgets.length > 0 ? props.widgets.map((w) => w.id) : undefined,
41
+ widgets: props?.widgets,
42
+ keychainGroup,
43
+ });
44
+ // Configure iOS widget extension (files, xcode, podfile, plist, eas)
45
+ config = (0, ios_widget_1.withIOS)(config, {
46
+ targetName,
47
+ bundleIdentifier,
48
+ deploymentTarget,
49
+ widgets: props?.widgets,
50
+ version,
51
+ buildNumber,
52
+ ...(props?.groupIdentifier ? { groupIdentifier: props.groupIdentifier } : {}),
53
+ ...(keychainGroup ? { keychainGroup } : {}),
54
+ ...(props?.fonts ? { fonts: props.fonts } : {}),
55
+ });
56
+ }
57
+ // Apply Android configuration (files, manifest)
58
+ if (props.android) {
59
+ config = (0, android_1.withAndroid)(config, {
60
+ widgets: props.android.widgets ?? [],
61
+ ...(props?.fonts ? { fonts: props.fonts } : {}),
62
+ });
63
+ }
64
+ // Optionally enable push notifications
65
+ if (props.enablePushNotifications) {
66
+ config = (0, ios_1.withPushNotifications)(config);
67
+ }
68
+ return config;
69
+ };
70
+ exports.default = withVoltra;
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;AAAA,wDAA+C;AAE/C,uCAAuC;AACvC,2CAAiC;AACjC,+BAAsD;AACtD,6CAAuD;AAEvD,iDAAmD;AACnD,6CAA4C;AAE5C;;;;;;;GAOG;AACH,MAAM,UAAU,GAAuB,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE;IAC5D,gCAAgC;IAChC,IAAA,0BAAa,EAAC,KAAK,CAAC,CAAA;IAEpB,iDAAiD;IACjD,IAAI,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC;QACjC,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,IAAI,eAAG,CAAC,iBAAiB,CAAA;QACxE,4FAA4F;QAC5F,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,0BAAS,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAA;QACvG,MAAM,gBAAgB,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU,EAAE,CAAA;QAEvE,2EAA2E;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAA;QACzC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,EAAE,WAAW,IAAI,GAAG,CAAA;QAElD,mDAAmD;QACnD,MAAM,GAAG,IAAA,2BAAe,EAAC,MAAM,CAAC,CAAA;QAEhC,mGAAmG;QACnG,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,CAAA;QACnF,MAAM,aAAa,GACjB,KAAK,EAAE,aAAa;YACpB,CAAC,sBAAsB,CAAC,CAAC,CAAC,yBAAyB,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAEhG,yDAAyD;QACzD,MAAM,GAAG,IAAA,aAAO,EAAC,MAAM,EAAE;YACvB,eAAe,EAAE,KAAK,EAAE,eAAe;YACvC,SAAS,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAClG,OAAO,EAAE,KAAK,EAAE,OAAO;YACvB,aAAa;SACd,CAAC,CAAA;QAEF,qEAAqE;QACrE,MAAM,GAAG,IAAA,oBAAa,EAAC,MAAM,EAAE;YAC7B,UAAU;YACV,gBAAgB;YAChB,gBAAgB;YAChB,OAAO,EAAE,KAAK,EAAE,OAAO;YACvB,OAAO;YACP,WAAW;YACX,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAA;IACJ,CAAC;IAED,gDAAgD;IAChD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,GAAG,IAAA,qBAAW,EAAC,MAAM,EAAE;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;YACpC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAA;IACJ,CAAC;IAED,uCAAuC;IACvC,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC;QAClC,MAAM,GAAG,IAAA,2BAAqB,EAAC,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,kBAAe,UAAU,CAAA"}