@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,259 +0,0 @@
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
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.generateAndroidAssets = generateAndroidAssets;
37
- exports.copyPreviewImagesToAndroid = copyPreviewImagesToAndroid;
38
- const fs = __importStar(require("fs"));
39
- const path = __importStar(require("path"));
40
- const vd_tool_1 = require("vd-tool");
41
- const constants_1 = require("../../constants");
42
- const logger_1 = require("../../utils/logger");
43
- // ============================================================================
44
- // Main Function
45
- // ============================================================================
46
- /**
47
- * Generates all asset files for Android widgets.
48
- *
49
- * This creates:
50
- * - res/drawable/ directory structure
51
- * - Copies user images to drawable resources as Android-compatible resources
52
- * - Copies widget preview images to drawable resources
53
- * - Validates image sizes for widget compatibility
54
- *
55
- * @returns Map of widgetId to preview image drawable resource name
56
- */
57
- async function generateAndroidAssets(options) {
58
- const { platformProjectRoot, projectRoot, userImagesPath = constants_1.DEFAULT_ANDROID_USER_IMAGES_PATH, widgets } = options;
59
- // Create res/drawable directory
60
- const drawablePath = path.join(platformProjectRoot, 'app', 'src', 'main', 'res', 'drawable');
61
- logger_1.logger.info(`Generating Android assets in ${drawablePath}`);
62
- // Collect asset paths from the user images directory (including subdirectories)
63
- const assets = [];
64
- const fullUserImagesPath = path.join(projectRoot, userImagesPath);
65
- function collectAssetsRecursively(dirPath) {
66
- if (!fs.existsSync(dirPath) || !fs.lstatSync(dirPath).isDirectory()) {
67
- return;
68
- }
69
- const files = fs.readdirSync(dirPath);
70
- for (const file of files) {
71
- const sourcePath = path.join(dirPath, file);
72
- const stat = fs.lstatSync(sourcePath);
73
- if (stat.isDirectory()) {
74
- // Recursively collect from subdirectories
75
- collectAssetsRecursively(sourcePath);
76
- }
77
- else {
78
- // Add relative path to assets array
79
- const relativePath = path.relative(projectRoot, sourcePath);
80
- assets.push(relativePath);
81
- }
82
- }
83
- }
84
- collectAssetsRecursively(fullUserImagesPath);
85
- // Copy user images to drawable resources
86
- const copiedImages = await copyUserImagesToAndroid(assets, projectRoot, drawablePath);
87
- if (copiedImages.length > 0) {
88
- logger_1.logger.info(`Copied ${copiedImages.length} user image(s) to Android drawable resources`);
89
- }
90
- // Copy preview images to drawable resources
91
- const previewImageMap = await copyPreviewImagesToAndroid(widgets, projectRoot, drawablePath);
92
- if (previewImageMap.size > 0) {
93
- logger_1.logger.info(`Copied ${previewImageMap.size} preview image(s) to Android drawable resources`);
94
- }
95
- return previewImageMap;
96
- }
97
- // ============================================================================
98
- // Image Handling
99
- // ============================================================================
100
- // Android supports these image/drawable extensions
101
- const VALID_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.xml', '.svg'];
102
- /**
103
- * Checks if an image file exceeds the size limit for widgets.
104
- * Logs a warning if the image is too large.
105
- *
106
- * @param imagePath - Path to the image file
107
- * @returns true if the image is within the size limit, false otherwise
108
- */
109
- function checkImageSize(imagePath) {
110
- const stats = fs.statSync(imagePath);
111
- const imageSizeInBytes = stats.size;
112
- if (imageSizeInBytes >= constants_1.MAX_IMAGE_SIZE_BYTES) {
113
- const fileName = path.basename(imagePath);
114
- logger_1.logger.warnRed(`Image "${fileName}" is ${imageSizeInBytes} bytes (${(imageSizeInBytes / 1024).toFixed(2)}KB). ` +
115
- `This image may not display correctly in Android widgets as images should be kept small for performance.`);
116
- return false;
117
- }
118
- return true;
119
- }
120
- /**
121
- * Flattens path and sanitizes name.
122
- * E.g. "assets/login/User-Icon.png" -> "login_user_icon"
123
- */
124
- function sanitizeDrawableName(filePath) {
125
- const dirName = path.dirname(filePath); // e.g. "assets/login" or "."
126
- const fileName = path.parse(filePath).name; // e.g. "User-Icon"
127
- // Combine directory parts (ignoring '.' or root) with filename
128
- let nameParts = [];
129
- // If the file is in a subfolder relative to the project root, include it
130
- if (dirName !== '.' && dirName !== 'assets') {
131
- // Split path by separator and add to parts
132
- const parts = dirName.split(path.sep);
133
- // Filter out 'assets', 'voltra', 'voltra-android' if they are the top folders to avoid redundant prefixes
134
- const cleanParts = parts.filter((p) => p !== 'assets' && p !== 'voltra' && p !== 'voltra-android' && p !== '.');
135
- nameParts = [...nameParts, ...cleanParts];
136
- }
137
- nameParts.push(fileName);
138
- // Join with underscore
139
- let finalName = nameParts.join('_').toLowerCase();
140
- // Replace invalid characters
141
- finalName = finalName.replace(/[^a-z0-9_]/g, '_');
142
- // Ensure start with letter
143
- if (!/^[a-z]/.test(finalName)) {
144
- finalName = `img_${finalName}`;
145
- }
146
- return finalName;
147
- }
148
- /**
149
- * Process SVG image: Convert to Android Vector Drawable (XML) and write to destination.
150
- */
151
- async function processSvgImage(sourcePath, destinationPath) {
152
- try {
153
- // vd-tool converts a file to XML. We'll copy the SVG to the destination first
154
- // so it has the sanitized name, then convert it there.
155
- fs.copyFileSync(sourcePath, destinationPath);
156
- await (0, vd_tool_1.vdConvert)(destinationPath);
157
- // Remove the temporary SVG file at the destination
158
- fs.unlinkSync(destinationPath);
159
- }
160
- catch (error) {
161
- // Cleanup if something failed
162
- if (fs.existsSync(destinationPath)) {
163
- fs.unlinkSync(destinationPath);
164
- }
165
- throw new Error(`Failed to convert SVG to Vector Drawable: ${sourcePath}. Error: ${error}`);
166
- }
167
- }
168
- /**
169
- * Process Bitmap/XML image: Check size and copy to destination.
170
- */
171
- function processBitmapImage(sourcePath, destinationPath) {
172
- const extension = path.extname(sourcePath).toLowerCase();
173
- // Check image size for widget compatibility (warns if too large) - only for image files
174
- if (extension !== '.xml') {
175
- checkImageSize(sourcePath);
176
- }
177
- fs.copyFileSync(sourcePath, destinationPath);
178
- }
179
- /**
180
- * Copies assets to the Android drawable resources directory.
181
- *
182
- * Assets are validated for existence and extension, then copied to res/drawable/
183
- * with Android-compatible names. SVGs are converted to XML.
184
- *
185
- * @param assets - Array of asset file paths (relative to project root)
186
- * @param projectRoot - Path to the project root
187
- * @param drawablePath - Path to the res/drawable directory in the Android project
188
- * @returns Array of drawable resource names that were copied
189
- */
190
- async function copyUserImagesToAndroid(assets, projectRoot, drawablePath) {
191
- const copiedImages = [];
192
- // Ensure drawable directory exists
193
- if (!fs.existsSync(drawablePath)) {
194
- fs.mkdirSync(drawablePath, { recursive: true });
195
- }
196
- // Iterate over the assets array
197
- for (const assetPath of assets) {
198
- const sourceFile = path.join(projectRoot, assetPath);
199
- const extension = path.extname(assetPath).toLowerCase();
200
- // VALIDATION: Check file existence
201
- if (!fs.existsSync(sourceFile)) {
202
- logger_1.logger.warn(`⚠️ Warning: Asset not found at ${sourceFile}. Skipping.`);
203
- continue;
204
- }
205
- // VALIDATION: Check extension
206
- if (!VALID_EXTENSIONS.includes(extension)) {
207
- throw new Error(`❌ Validating ${assetPath}: '${extension}' is not a supported Android drawable extension. Supported: ${VALID_EXTENSIONS.join(', ')}`);
208
- }
209
- // SANITIZATION: Generate new filename
210
- const cleanName = sanitizeDrawableName(assetPath);
211
- const destinationFile = path.join(drawablePath, `${cleanName}${extension}`);
212
- // Process based on extension
213
- if (extension === '.svg') {
214
- await processSvgImage(sourceFile, destinationFile);
215
- }
216
- else {
217
- processBitmapImage(sourceFile, destinationFile);
218
- }
219
- copiedImages.push(cleanName);
220
- }
221
- return copiedImages;
222
- }
223
- // ============================================================================
224
- // Preview Images
225
- // ============================================================================
226
- /**
227
- * Copies preview images to Android drawable resources.
228
- * Returns a map of widgetId to drawable resource name.
229
- */
230
- async function copyPreviewImagesToAndroid(widgets, projectRoot, drawablePath) {
231
- const previewImageMap = new Map();
232
- // Ensure drawable directory exists
233
- if (!fs.existsSync(drawablePath)) {
234
- fs.mkdirSync(drawablePath, { recursive: true });
235
- }
236
- for (const widget of widgets) {
237
- if (!widget.previewImage) {
238
- continue;
239
- }
240
- const sourcePath = path.join(projectRoot, widget.previewImage);
241
- // Validate file exists
242
- if (!fs.existsSync(sourcePath)) {
243
- logger_1.logger.warn(`Preview image not found for widget '${widget.id}' at ${widget.previewImage}`);
244
- continue;
245
- }
246
- // Warn if image exceeds size limit (does not block copy for Android widgets)
247
- checkImageSize(sourcePath);
248
- // Generate drawable resource name
249
- const ext = path.extname(widget.previewImage).toLowerCase();
250
- const drawableName = `voltra_widget_${widget.id}_preview`;
251
- const destinationPath = path.join(drawablePath, `${drawableName}${ext}`);
252
- // Copy file
253
- fs.copyFileSync(sourcePath, destinationPath);
254
- logger_1.logger.info(`Copied preview image for widget '${widget.id}' to ${drawableName}${ext}`);
255
- previewImageMap.set(widget.id, drawableName);
256
- }
257
- return previewImageMap;
258
- }
259
- //# sourceMappingURL=assets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../../src/android/files/assets.ts"],"names":[],"mappings":"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"}
@@ -1,69 +0,0 @@
1
- "use strict";
2
- /**
3
- * Font configuration for Android widgets.
4
- *
5
- * Copies custom font files to the Android assets/fonts/ directory
6
- * so they can be loaded by TextBitmapRenderer via Typeface.createFromAsset().
7
- */
8
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
- if (k2 === undefined) k2 = k;
10
- var desc = Object.getOwnPropertyDescriptor(m, k);
11
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
- desc = { enumerable: true, get: function() { return m[k]; } };
13
- }
14
- Object.defineProperty(o, k2, desc);
15
- }) : (function(o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- o[k2] = m[k];
18
- }));
19
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
- Object.defineProperty(o, "default", { enumerable: true, value: v });
21
- }) : function(o, v) {
22
- o["default"] = v;
23
- });
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.copyAndroidFonts = copyAndroidFonts;
43
- const fs = __importStar(require("fs"));
44
- const path = __importStar(require("path"));
45
- const fonts_1 = require("../../utils/fonts");
46
- const logger_1 = require("../../utils/logger");
47
- /**
48
- * Copies custom font files to android/app/src/main/assets/fonts/.
49
- *
50
- * Resolves each path relative to the project root.
51
- * If a path points to a directory, all .ttf/.otf files inside it are copied.
52
- */
53
- async function copyAndroidFonts(options) {
54
- const { platformProjectRoot, projectRoot, fonts } = options;
55
- if (!fonts || fonts.length === 0) {
56
- return;
57
- }
58
- const fontsDir = path.join(platformProjectRoot, 'app', 'src', 'main', 'assets', 'fonts');
59
- fs.mkdirSync(fontsDir, { recursive: true });
60
- const resolvedPaths = await (0, fonts_1.resolveFontPaths)(fonts, projectRoot);
61
- for (const fontPath of resolvedPaths) {
62
- const fileName = path.basename(fontPath);
63
- const dest = path.join(fontsDir, fileName);
64
- fs.copyFileSync(fontPath, dest);
65
- logger_1.logger.info(`Copied font to Android assets: ${fileName}`);
66
- }
67
- logger_1.logger.info(`Copied ${resolvedPaths.length} font(s) to Android assets/fonts/`);
68
- }
69
- //# sourceMappingURL=fonts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../../../src/android/files/fonts.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBH,4CAqBC;AAvCD,uCAAwB;AACxB,2CAA4B;AAE5B,6CAAoD;AACpD,+CAA2C;AAQ3C;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CAAC,OAAgC;IACrE,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IAE3D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACxF,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3C,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAgB,EAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IAEhE,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAE1C,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC/B,eAAM,CAAC,IAAI,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,UAAU,aAAa,CAAC,MAAM,mCAAmC,CAAC,CAAA;AAChF,CAAC"}
@@ -1,81 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateAndroidWidgetFiles = void 0;
4
- const config_plugins_1 = require("@expo/config-plugins");
5
- const assets_1 = require("./assets");
6
- const fonts_1 = require("./fonts");
7
- const initialStates_1 = require("./initialStates");
8
- const kotlin_1 = require("./kotlin");
9
- const xml_1 = require("./xml");
10
- /**
11
- * Plugin step that generates all Android widget files.
12
- *
13
- * This creates:
14
- * - Kotlin receiver classes for each widget
15
- * - res/xml/{widget_id}_info.xml (widget provider info)
16
- * - res/layout/voltra_widget_placeholder.xml (placeholder layout)
17
- * - res/values/voltra_widgets.xml (widget descriptions)
18
- * - res/drawable/ images (user images as drawable resources)
19
- *
20
- * This should run before configureAndroidManifest so the files exist when the manifest is configured.
21
- */
22
- const generateAndroidWidgetFiles = (config, props) => {
23
- const { widgets, userImagesPath, fonts } = props;
24
- return (0, config_plugins_1.withDangerousMod)(config, [
25
- 'android',
26
- async (config) => {
27
- if (config.modRequest.introspect) {
28
- return config;
29
- }
30
- const { platformProjectRoot, projectRoot } = config.modRequest;
31
- const packageName = config.android?.package;
32
- if (!packageName) {
33
- throw new Error('Voltra config plugin requires expo.android.package to be set in app.json/app.config.* to configure Android widgets.');
34
- }
35
- // Generate assets (drawable images and preview images)
36
- const previewImageMap = await (0, assets_1.generateAndroidAssets)({
37
- platformProjectRoot,
38
- projectRoot,
39
- userImagesPath,
40
- widgets,
41
- });
42
- // Generate Kotlin receiver classes
43
- await (0, kotlin_1.generateWidgetReceivers)({
44
- platformProjectRoot,
45
- packageName,
46
- widgets,
47
- });
48
- // Generate XML files (widget info, layouts, strings)
49
- await (0, xml_1.generateWidgetInfoFiles)({
50
- platformProjectRoot,
51
- widgets,
52
- });
53
- await (0, xml_1.generateWidgetPlaceholderLayouts)({
54
- platformProjectRoot,
55
- });
56
- await (0, xml_1.generateWidgetPreviewLayouts)({
57
- platformProjectRoot,
58
- projectRoot,
59
- widgets,
60
- previewImageMap,
61
- });
62
- // Copy custom fonts to assets/fonts/
63
- if (fonts && fonts.length > 0) {
64
- await (0, fonts_1.copyAndroidFonts)({
65
- platformProjectRoot,
66
- projectRoot: config.modRequest.projectRoot,
67
- fonts,
68
- });
69
- }
70
- // Generate initial states (pre-rendered widgets)
71
- await (0, initialStates_1.generateAndroidInitialStates)({
72
- platformProjectRoot,
73
- projectRoot: config.modRequest.projectRoot,
74
- widgets,
75
- });
76
- return config;
77
- },
78
- ]);
79
- };
80
- exports.generateAndroidWidgetFiles = generateAndroidWidgetFiles;
81
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/android/files/index.ts"],"names":[],"mappings":";;;AAAA,yDAAqE;AAGrE,qCAAgD;AAChD,mCAA0C;AAC1C,mDAA8D;AAC9D,qCAAkD;AAClD,+BAA+G;AAQ/G;;;;;;;;;;;GAWG;AACI,MAAM,0BAA0B,GAAkD,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACzG,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAEhD,OAAO,IAAA,iCAAgB,EAAC,MAAM,EAAE;QAC9B,SAAS;QACT,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBACjC,OAAO,MAAM,CAAA;YACf,CAAC;YAED,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,UAAU,CAAA;YAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAA;YAE3C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAA;YACH,CAAC;YAED,uDAAuD;YACvD,MAAM,eAAe,GAAG,MAAM,IAAA,8BAAqB,EAAC;gBAClD,mBAAmB;gBACnB,WAAW;gBACX,cAAc;gBACd,OAAO;aACR,CAAC,CAAA;YAEF,mCAAmC;YACnC,MAAM,IAAA,gCAAuB,EAAC;gBAC5B,mBAAmB;gBACnB,WAAW;gBACX,OAAO;aACR,CAAC,CAAA;YAEF,qDAAqD;YACrD,MAAM,IAAA,6BAAuB,EAAC;gBAC5B,mBAAmB;gBACnB,OAAO;aACR,CAAC,CAAA;YAEF,MAAM,IAAA,sCAAgC,EAAC;gBACrC,mBAAmB;aACpB,CAAC,CAAA;YAEF,MAAM,IAAA,kCAA4B,EAAC;gBACjC,mBAAmB;gBACnB,WAAW;gBACX,OAAO;gBACP,eAAe;aAChB,CAAC,CAAA;YAEF,qCAAqC;YACrC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAA,wBAAgB,EAAC;oBACrB,mBAAmB;oBACnB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW;oBAC1C,KAAK;iBACN,CAAC,CAAA;YACJ,CAAC;YAED,iDAAiD;YACjD,MAAM,IAAA,4CAA4B,EAAC;gBACjC,mBAAmB;gBACnB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW;gBAC1C,OAAO;aACR,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAtEY,QAAA,0BAA0B,8BAsEtC"}
@@ -1,83 +0,0 @@
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.generateAndroidInitialStates = generateAndroidInitialStates;
40
- const fs_1 = __importDefault(require("fs"));
41
- const path_1 = __importDefault(require("path"));
42
- const logger_1 = require("../../utils/logger");
43
- const prerender_1 = require("../../utils/prerender");
44
- /**
45
- * Generates the initial states JSON file for Android widgets.
46
- *
47
- * This file (voltra_initial_states.json) is placed in the Android assets directory
48
- * and contains the pre-rendered payloads for all widgets that have an initialStatePath.
49
- */
50
- async function generateAndroidInitialStates(options) {
51
- const { widgets, projectRoot, platformProjectRoot } = options;
52
- // Dynamic import for ESM module compatibility
53
- // voltra/android/server is an ESM module, but the plugin is compiled to CommonJS
54
- const androidServerModuleId = 'voltra/android/server';
55
- const { renderAndroidWidgetToString } = (await Promise.resolve(`${androidServerModuleId}`).then(s => __importStar(require(s))));
56
- // Prerender widget states
57
- const prerenderedStates = await (0, prerender_1.prerenderWidgetState)(widgets, projectRoot, renderAndroidWidgetToString);
58
- if (prerenderedStates.size === 0) {
59
- return;
60
- }
61
- // Create assets directory if it doesn't exist
62
- const assetsDir = path_1.default.join(platformProjectRoot, 'app', 'src', 'main', 'assets');
63
- if (!fs_1.default.existsSync(assetsDir)) {
64
- fs_1.default.mkdirSync(assetsDir, { recursive: true });
65
- }
66
- // Convert Map to Object for JSON serialization
67
- const statesObj = {};
68
- for (const [id, stateJson] of prerenderedStates.entries()) {
69
- try {
70
- // Parse the JSON string so it's embedded as an object in the final JSON
71
- statesObj[id] = JSON.parse(stateJson);
72
- }
73
- catch (e) {
74
- logger_1.logger.warn(`Failed to parse prerendered state for widget ${id}: ${e}`);
75
- // If it's not valid JSON, we might skip it or include it as string?
76
- // renderWidgetToString should return valid JSON.
77
- }
78
- }
79
- const outputFilePath = path_1.default.join(assetsDir, 'voltra_initial_states.json');
80
- fs_1.default.writeFileSync(outputFilePath, JSON.stringify(statesObj, null, 2));
81
- logger_1.logger.info(`Generated voltra_initial_states.json with ${Object.keys(statesObj).length} pre-rendered widget states`);
82
- }
83
- //# sourceMappingURL=initialStates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"initialStates.js","sourceRoot":"","sources":["../../../../src/android/files/initialStates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,oEAwCC;AA7DD,4CAAmB;AACnB,gDAAuB;AAGvB,+CAA2C;AAC3C,qDAA4D;AAU5D;;;;;GAKG;AACI,KAAK,UAAU,4BAA4B,CAAC,OAAqC;IACtF,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAA;IAE7D,8CAA8C;IAC9C,iFAAiF;IACjF,MAAM,qBAAqB,GAAG,uBAAuB,CAAA;IACrD,MAAM,EAAE,2BAA2B,EAAE,GAAG,CAAC,yBAAa,qBAAqB,uCAAC,CAE3E,CAAA;IAED,0BAA0B;IAC1B,MAAM,iBAAiB,GAAG,MAAM,IAAA,gCAAoB,EAAC,OAAO,EAAE,WAAW,EAAE,2BAA2B,CAAC,CAAA;IAEvG,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,OAAM;IACR,CAAC;IAED,8CAA8C;IAC9C,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;IAChF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,+CAA+C;IAC/C,MAAM,SAAS,GAAwB,EAAE,CAAA;IACzC,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,wEAAwE;YACxE,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;YACvE,oEAAoE;YACpE,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAA;IACzE,YAAE,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAEpE,eAAM,CAAC,IAAI,CAAC,6CAA6C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,6BAA6B,CAAC,CAAA;AACtH,CAAC"}
@@ -1,142 +0,0 @@
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