@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.
- package/README.md +9 -29
- package/build/cjs/constants.js +3 -43
- package/build/cjs/constants.js.map +1 -1
- package/build/cjs/index.js +23 -69
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/types.js +4 -0
- package/build/cjs/types.js.map +1 -1
- package/build/cjs/utils/localePick.js +48 -0
- package/build/cjs/utils/localePick.js.map +1 -0
- package/build/cjs/utils/prerender.js +15 -9
- package/build/cjs/utils/prerender.js.map +1 -1
- package/build/cjs/utils/widgetLabel.js +19 -0
- package/build/cjs/utils/widgetLabel.js.map +1 -0
- package/build/cjs/validation.js +75 -166
- package/build/cjs/validation.js.map +1 -1
- package/build/esm/constants.js +2 -42
- package/build/esm/constants.js.map +1 -1
- package/build/esm/index.js +8 -69
- package/build/esm/index.js.map +1 -1
- package/build/esm/types.js +4 -0
- package/build/esm/types.js.map +1 -1
- package/build/esm/utils/localePick.js +44 -0
- package/build/esm/utils/localePick.js.map +1 -0
- package/build/esm/utils/prerender.js +15 -9
- package/build/esm/utils/prerender.js.map +1 -1
- package/build/esm/utils/widgetLabel.js +15 -0
- package/build/esm/utils/widgetLabel.js.map +1 -0
- package/build/esm/validation.js +71 -163
- package/build/esm/validation.js.map +1 -1
- package/build/types/constants.d.ts +2 -26
- package/build/types/constants.d.ts.map +1 -1
- package/build/types/index.d.ts +10 -12
- package/build/types/index.d.ts.map +1 -1
- package/build/types/types.d.ts +9 -260
- package/build/types/types.d.ts.map +1 -1
- package/build/types/utils/localePick.d.ts +7 -0
- package/build/types/utils/localePick.d.ts.map +1 -0
- package/build/types/utils/prerender.d.ts +6 -3
- package/build/types/utils/prerender.d.ts.map +1 -1
- package/build/types/utils/widgetLabel.d.ts +8 -0
- package/build/types/utils/widgetLabel.d.ts.map +1 -0
- package/build/types/validation.d.ts +6 -14
- package/build/types/validation.d.ts.map +1 -1
- package/package.json +11 -11
- package/build/cjs/android/files/assets.js +0 -259
- package/build/cjs/android/files/assets.js.map +0 -1
- package/build/cjs/android/files/fonts.js +0 -69
- package/build/cjs/android/files/fonts.js.map +0 -1
- package/build/cjs/android/files/index.js +0 -81
- package/build/cjs/android/files/index.js.map +0 -1
- package/build/cjs/android/files/initialStates.js +0 -83
- package/build/cjs/android/files/initialStates.js.map +0 -1
- package/build/cjs/android/files/kotlin.js +0 -142
- package/build/cjs/android/files/kotlin.js.map +0 -1
- package/build/cjs/android/files/xml.js +0 -247
- package/build/cjs/android/files/xml.js.map +0 -1
- package/build/cjs/android/index.js +0 -33
- package/build/cjs/android/index.js.map +0 -1
- package/build/cjs/android/manifest.js +0 -92
- package/build/cjs/android/manifest.js.map +0 -1
- package/build/cjs/ios/eas.js +0 -28
- package/build/cjs/ios/eas.js.map +0 -1
- package/build/cjs/ios/entitlements.js +0 -46
- package/build/cjs/ios/entitlements.js.map +0 -1
- package/build/cjs/ios/index.js +0 -39
- package/build/cjs/ios/index.js.map +0 -1
- package/build/cjs/ios/infoPlist.js +0 -51
- package/build/cjs/ios/infoPlist.js.map +0 -1
- package/build/cjs/ios/pushNotifications.js +0 -22
- package/build/cjs/ios/pushNotifications.js.map +0 -1
- package/build/cjs/ios-widget/eas.js +0 -66
- package/build/cjs/ios-widget/eas.js.map +0 -1
- package/build/cjs/ios-widget/files/assets.js +0 -199
- package/build/cjs/ios-widget/files/assets.js.map +0 -1
- package/build/cjs/ios-widget/files/entitlements.js +0 -77
- package/build/cjs/ios-widget/files/entitlements.js.map +0 -1
- package/build/cjs/ios-widget/files/index.js +0 -92
- package/build/cjs/ios-widget/files/index.js.map +0 -1
- package/build/cjs/ios-widget/files/infoPlist.js +0 -91
- package/build/cjs/ios-widget/files/infoPlist.js.map +0 -1
- package/build/cjs/ios-widget/files/swift.js +0 -256
- package/build/cjs/ios-widget/files/swift.js.map +0 -1
- package/build/cjs/ios-widget/fonts.js +0 -151
- package/build/cjs/ios-widget/fonts.js.map +0 -1
- package/build/cjs/ios-widget/index.js +0 -46
- package/build/cjs/ios-widget/index.js.map +0 -1
- package/build/cjs/ios-widget/podfile.js +0 -43
- package/build/cjs/ios-widget/podfile.js.map +0 -1
- package/build/cjs/ios-widget/widgetPlist.js +0 -99
- package/build/cjs/ios-widget/widgetPlist.js.map +0 -1
- package/build/cjs/ios-widget/xcode/buildPhases.js +0 -245
- package/build/cjs/ios-widget/xcode/buildPhases.js.map +0 -1
- package/build/cjs/ios-widget/xcode/configurationList.js +0 -91
- package/build/cjs/ios-widget/xcode/configurationList.js.map +0 -1
- package/build/cjs/ios-widget/xcode/groups.js +0 -65
- package/build/cjs/ios-widget/xcode/groups.js.map +0 -1
- package/build/cjs/ios-widget/xcode/index.js +0 -155
- package/build/cjs/ios-widget/xcode/index.js.map +0 -1
- package/build/cjs/ios-widget/xcode/mainAppSettings.js +0 -71
- package/build/cjs/ios-widget/xcode/mainAppSettings.js.map +0 -1
- package/build/cjs/ios-widget/xcode/productFile.js +0 -74
- package/build/cjs/ios-widget/xcode/productFile.js.map +0 -1
- package/build/cjs/ios-widget/xcode/target.js +0 -113
- package/build/cjs/ios-widget/xcode/target.js.map +0 -1
- package/build/cjs/utils/fileDiscovery.js +0 -107
- package/build/cjs/utils/fileDiscovery.js.map +0 -1
- package/build/cjs/utils/urlScheme.js +0 -40
- package/build/cjs/utils/urlScheme.js.map +0 -1
- package/build/esm/android/files/assets.js +0 -223
- package/build/esm/android/files/assets.js.map +0 -1
- package/build/esm/android/files/fonts.js +0 -33
- package/build/esm/android/files/fonts.js.map +0 -1
- package/build/esm/android/files/index.js +0 -77
- package/build/esm/android/files/index.js.map +0 -1
- package/build/esm/android/files/initialStates.js +0 -44
- package/build/esm/android/files/initialStates.js.map +0 -1
- package/build/esm/android/files/kotlin.js +0 -103
- package/build/esm/android/files/kotlin.js.map +0 -1
- package/build/esm/android/files/xml.js +0 -206
- package/build/esm/android/files/xml.js.map +0 -1
- package/build/esm/android/index.js +0 -29
- package/build/esm/android/index.js.map +0 -1
- package/build/esm/android/manifest.js +0 -88
- package/build/esm/android/manifest.js.map +0 -1
- package/build/esm/ios/eas.js +0 -24
- package/build/esm/ios/eas.js.map +0 -1
- package/build/esm/ios/entitlements.js +0 -42
- package/build/esm/ios/entitlements.js.map +0 -1
- package/build/esm/ios/index.js +0 -34
- package/build/esm/ios/index.js.map +0 -1
- package/build/esm/ios/infoPlist.js +0 -47
- package/build/esm/ios/infoPlist.js.map +0 -1
- package/build/esm/ios/pushNotifications.js +0 -18
- package/build/esm/ios/pushNotifications.js.map +0 -1
- package/build/esm/ios-widget/eas.js +0 -62
- package/build/esm/ios-widget/eas.js.map +0 -1
- package/build/esm/ios-widget/files/assets.js +0 -163
- package/build/esm/ios-widget/files/assets.js.map +0 -1
- package/build/esm/ios-widget/files/entitlements.js +0 -37
- package/build/esm/ios-widget/files/entitlements.js.map +0 -1
- package/build/esm/ios-widget/files/index.js +0 -55
- package/build/esm/ios-widget/files/index.js.map +0 -1
- package/build/esm/ios-widget/files/infoPlist.js +0 -55
- package/build/esm/ios-widget/files/infoPlist.js.map +0 -1
- package/build/esm/ios-widget/files/swift.js +0 -217
- package/build/esm/ios-widget/files/swift.js.map +0 -1
- package/build/esm/ios-widget/fonts.js +0 -111
- package/build/esm/ios-widget/fonts.js.map +0 -1
- package/build/esm/ios-widget/index.js +0 -42
- package/build/esm/ios-widget/index.js.map +0 -1
- package/build/esm/ios-widget/podfile.js +0 -39
- package/build/esm/ios-widget/podfile.js.map +0 -1
- package/build/esm/ios-widget/widgetPlist.js +0 -92
- package/build/esm/ios-widget/widgetPlist.js.map +0 -1
- package/build/esm/ios-widget/xcode/buildPhases.js +0 -208
- package/build/esm/ios-widget/xcode/buildPhases.js.map +0 -1
- package/build/esm/ios-widget/xcode/configurationList.js +0 -87
- package/build/esm/ios-widget/xcode/configurationList.js.map +0 -1
- package/build/esm/ios-widget/xcode/groups.js +0 -61
- package/build/esm/ios-widget/xcode/groups.js.map +0 -1
- package/build/esm/ios-widget/xcode/index.js +0 -118
- package/build/esm/ios-widget/xcode/index.js.map +0 -1
- package/build/esm/ios-widget/xcode/mainAppSettings.js +0 -68
- package/build/esm/ios-widget/xcode/mainAppSettings.js.map +0 -1
- package/build/esm/ios-widget/xcode/productFile.js +0 -70
- package/build/esm/ios-widget/xcode/productFile.js.map +0 -1
- package/build/esm/ios-widget/xcode/target.js +0 -108
- package/build/esm/ios-widget/xcode/target.js.map +0 -1
- package/build/esm/utils/fileDiscovery.js +0 -71
- package/build/esm/utils/fileDiscovery.js.map +0 -1
- package/build/esm/utils/urlScheme.js +0 -37
- package/build/esm/utils/urlScheme.js.map +0 -1
- package/build/types/android/files/assets.d.ts +0 -26
- package/build/types/android/files/assets.d.ts.map +0 -1
- package/build/types/android/files/fonts.d.ts +0 -19
- package/build/types/android/files/fonts.d.ts.map +0 -1
- package/build/types/android/files/index.d.ts +0 -21
- package/build/types/android/files/index.d.ts.map +0 -1
- package/build/types/android/files/initialStates.d.ts +0 -14
- package/build/types/android/files/initialStates.d.ts.map +0 -1
- package/build/types/android/files/kotlin.d.ts +0 -11
- package/build/types/android/files/kotlin.d.ts.map +0 -1
- package/build/types/android/files/xml.d.ts +0 -25
- package/build/types/android/files/xml.d.ts.map +0 -1
- package/build/types/android/index.d.ts +0 -12
- package/build/types/android/index.d.ts.map +0 -1
- package/build/types/android/manifest.d.ts +0 -16
- package/build/types/android/manifest.d.ts.map +0 -1
- package/build/types/ios/eas.d.ts +0 -12
- package/build/types/ios/eas.d.ts.map +0 -1
- package/build/types/ios/entitlements.d.ts +0 -14
- package/build/types/ios/entitlements.d.ts.map +0 -1
- package/build/types/ios/index.d.ts +0 -19
- package/build/types/ios/index.d.ts.map +0 -1
- package/build/types/ios/infoPlist.d.ts +0 -21
- package/build/types/ios/infoPlist.d.ts.map +0 -1
- package/build/types/ios/pushNotifications.d.ts +0 -10
- package/build/types/ios/pushNotifications.d.ts.map +0 -1
- package/build/types/ios-widget/eas.d.ts +0 -15
- package/build/types/ios-widget/eas.d.ts.map +0 -1
- package/build/types/ios-widget/files/assets.d.ts +0 -13
- package/build/types/ios-widget/files/assets.d.ts.map +0 -1
- package/build/types/ios-widget/files/entitlements.d.ts +0 -17
- package/build/types/ios-widget/files/entitlements.d.ts.map +0 -1
- package/build/types/ios-widget/files/index.d.ts +0 -24
- package/build/types/ios-widget/files/index.d.ts.map +0 -1
- package/build/types/ios-widget/files/infoPlist.d.ts +0 -10
- package/build/types/ios-widget/files/infoPlist.d.ts.map +0 -1
- package/build/types/ios-widget/files/swift.d.ts +0 -15
- package/build/types/ios-widget/files/swift.d.ts.map +0 -1
- package/build/types/ios-widget/fonts.d.ts +0 -22
- package/build/types/ios-widget/fonts.d.ts.map +0 -1
- package/build/types/ios-widget/index.d.ts +0 -31
- package/build/types/ios-widget/index.d.ts.map +0 -1
- package/build/types/ios-widget/podfile.d.ts +0 -9
- package/build/types/ios-widget/podfile.d.ts.map +0 -1
- package/build/types/ios-widget/widgetPlist.d.ts +0 -20
- package/build/types/ios-widget/widgetPlist.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/buildPhases.d.ts +0 -25
- package/build/types/ios-widget/xcode/buildPhases.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/configurationList.d.ts +0 -20
- package/build/types/ios-widget/xcode/configurationList.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/groups.d.ts +0 -15
- package/build/types/ios-widget/xcode/groups.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/index.d.ts +0 -20
- package/build/types/ios-widget/xcode/index.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/mainAppSettings.d.ts +0 -15
- package/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/productFile.d.ts +0 -14
- package/build/types/ios-widget/xcode/productFile.d.ts.map +0 -1
- package/build/types/ios-widget/xcode/target.d.ts +0 -42
- package/build/types/ios-widget/xcode/target.d.ts.map +0 -1
- package/build/types/utils/fileDiscovery.d.ts +0 -13
- package/build/types/utils/fileDiscovery.d.ts.map +0 -1
- package/build/types/utils/urlScheme.d.ts +0 -10
- package/build/types/utils/urlScheme.d.ts.map +0 -1
package/build/cjs/validation.js
CHANGED
|
@@ -33,202 +33,111 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
37
|
-
exports.
|
|
38
|
-
exports.
|
|
36
|
+
exports.validateHomeScreenWidgetId = validateHomeScreenWidgetId;
|
|
37
|
+
exports.assertValidLocaleKey = assertValidLocaleKey;
|
|
38
|
+
exports.validateWidgetLabel = validateWidgetLabel;
|
|
39
|
+
exports.validateInitialStatePath = validateInitialStatePath;
|
|
39
40
|
const fs = __importStar(require("fs"));
|
|
40
41
|
const path = __importStar(require("path"));
|
|
42
|
+
/** Widget id: Swift / Kotlin identifier fragment and Android XML token fragment */
|
|
43
|
+
const WIDGET_ID_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
41
44
|
/**
|
|
42
|
-
*
|
|
45
|
+
* Locale keys in app.json become iOS `.lproj` folder names and Android `values-*` qualifiers (after mapping).
|
|
43
46
|
*/
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
'systemSmall',
|
|
49
|
-
'systemMedium',
|
|
50
|
-
'systemLarge',
|
|
51
|
-
'systemExtraLarge',
|
|
52
|
-
'accessoryCircular',
|
|
53
|
-
'accessoryRectangular',
|
|
54
|
-
'accessoryInline',
|
|
55
|
-
]);
|
|
56
|
-
/**
|
|
57
|
-
* Validates a widget configuration.
|
|
58
|
-
* Throws an error if validation fails.
|
|
59
|
-
*/
|
|
60
|
-
function validateWidgetConfig(widget) {
|
|
61
|
-
// Validate widget ID
|
|
62
|
-
if (!widget.id || typeof widget.id !== 'string') {
|
|
47
|
+
const LOCALE_KEY_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*([_-][a-zA-Z0-9]+)*$/;
|
|
48
|
+
const MAX_LOCALE_KEY_LENGTH = 32;
|
|
49
|
+
function validateHomeScreenWidgetId(widgetId) {
|
|
50
|
+
if (!widgetId || typeof widgetId !== 'string') {
|
|
63
51
|
throw new Error('Widget ID is required and must be a string');
|
|
64
52
|
}
|
|
65
|
-
if (
|
|
66
|
-
throw new Error(`Widget ID '${
|
|
53
|
+
if (!WIDGET_ID_PATTERN.test(widgetId)) {
|
|
54
|
+
throw new Error(`Widget ID '${widgetId}' is invalid. ` +
|
|
67
55
|
'Must start with a letter or underscore and contain only alphanumeric characters and underscores.');
|
|
68
56
|
}
|
|
69
|
-
// Validate display name
|
|
70
|
-
if (!widget.displayName?.trim()) {
|
|
71
|
-
throw new Error(`Widget '${widget.id}': displayName is required`);
|
|
72
|
-
}
|
|
73
|
-
// Validate description
|
|
74
|
-
if (!widget.description?.trim()) {
|
|
75
|
-
throw new Error(`Widget '${widget.id}': description is required`);
|
|
76
|
-
}
|
|
77
|
-
// Validate supported families if provided
|
|
78
|
-
if (widget.supportedFamilies) {
|
|
79
|
-
if (!Array.isArray(widget.supportedFamilies)) {
|
|
80
|
-
throw new Error(`Widget '${widget.id}': supportedFamilies must be an array`);
|
|
81
|
-
}
|
|
82
|
-
for (const family of widget.supportedFamilies) {
|
|
83
|
-
if (!VALID_FAMILIES.has(family)) {
|
|
84
|
-
throw new Error(`Widget '${widget.id}': Invalid widget family '${family}'. ` +
|
|
85
|
-
`Valid families are: ${Array.from(VALID_FAMILIES).join(', ')}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
57
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Validates an Android widget configuration.
|
|
95
|
-
* Throws an error if validation fails.
|
|
96
|
-
*/
|
|
97
|
-
function validateAndroidWidgetConfig(widget, projectRoot) {
|
|
98
|
-
// Validate widget ID
|
|
99
|
-
if (!widget.id || typeof widget.id !== 'string') {
|
|
100
|
-
throw new Error('Widget ID is required and must be a string');
|
|
101
|
-
}
|
|
102
|
-
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(widget.id)) {
|
|
103
|
-
throw new Error(`Widget ID '${widget.id}' is invalid. ` +
|
|
104
|
-
'Must start with a letter or underscore and contain only alphanumeric characters and underscores.');
|
|
105
|
-
}
|
|
106
|
-
// Validate display name
|
|
107
|
-
if (!widget.displayName?.trim()) {
|
|
108
|
-
throw new Error(`Widget '${widget.id}': displayName is required`);
|
|
109
|
-
}
|
|
110
|
-
// Validate description
|
|
111
|
-
if (!widget.description?.trim()) {
|
|
112
|
-
throw new Error(`Widget '${widget.id}': description is required`);
|
|
58
|
+
function assertValidLocaleKey(localeKey, widgetId, fieldName) {
|
|
59
|
+
if (localeKey.trim() !== localeKey) {
|
|
60
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} locale key '${localeKey}' must not have leading or trailing whitespace`);
|
|
113
61
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
throw new Error(`Widget '${widget.id}': targetCellWidth is required and must be a number`);
|
|
62
|
+
if (!localeKey) {
|
|
63
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} locale map contains an empty locale key`);
|
|
117
64
|
}
|
|
118
|
-
if (
|
|
119
|
-
throw new Error(`Widget '${
|
|
65
|
+
if (localeKey.length > MAX_LOCALE_KEY_LENGTH) {
|
|
66
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} locale key '${localeKey}' exceeds ${MAX_LOCALE_KEY_LENGTH} characters`);
|
|
120
67
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
68
|
+
if (!LOCALE_KEY_PATTERN.test(localeKey)) {
|
|
69
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} locale key '${localeKey}' is invalid. ` +
|
|
70
|
+
'Use BCP-47-style tags (e.g. en, pl, pt-BR, zh-Hans). Letters, digits, single separators _ or - only.');
|
|
124
71
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (typeof widget.minCellWidth !== 'number' || !Number.isInteger(widget.minCellWidth) || widget.minCellWidth < 1) {
|
|
131
|
-
throw new Error(`Widget '${widget.id}': minCellWidth must be a positive integer`);
|
|
72
|
+
}
|
|
73
|
+
function validateWidgetLabel(value, widgetId, fieldName) {
|
|
74
|
+
if (typeof value === 'string') {
|
|
75
|
+
if (!value.trim()) {
|
|
76
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} is required`);
|
|
132
77
|
}
|
|
78
|
+
return;
|
|
133
79
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (typeof widget.minCellHeight !== 'number' ||
|
|
137
|
-
!Number.isInteger(widget.minCellHeight) ||
|
|
138
|
-
widget.minCellHeight < 1) {
|
|
139
|
-
throw new Error(`Widget '${widget.id}': minCellHeight must be a positive integer`);
|
|
140
|
-
}
|
|
80
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
81
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} must be a string or a locale map (e.g. { "en": "...", "pl": "..." })`);
|
|
141
82
|
}
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
throw new Error(`Widget '${widget.id}': previewImage must be a non-empty string`);
|
|
146
|
-
}
|
|
147
|
-
const ext = path.extname(widget.previewImage).toLowerCase();
|
|
148
|
-
const validImageExts = ['.png', '.jpg', '.jpeg', '.webp'];
|
|
149
|
-
if (!validImageExts.includes(ext)) {
|
|
150
|
-
throw new Error(`Widget '${widget.id}': previewImage must be a PNG, JPG, JPEG, or WebP file. Got: ${ext}`);
|
|
151
|
-
}
|
|
152
|
-
// Check file exists if projectRoot is provided
|
|
153
|
-
if (projectRoot) {
|
|
154
|
-
const fullPath = path.join(projectRoot, widget.previewImage);
|
|
155
|
-
if (!fs.existsSync(fullPath)) {
|
|
156
|
-
throw new Error(`Widget '${widget.id}': previewImage file not found at ${widget.previewImage}`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
83
|
+
const entries = Object.entries(value);
|
|
84
|
+
if (entries.length === 0) {
|
|
85
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} locale map must not be empty`);
|
|
159
86
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
87
|
+
const localeKeys = new Set();
|
|
88
|
+
for (const [locale, v] of entries) {
|
|
89
|
+
assertValidLocaleKey(locale, widgetId, fieldName);
|
|
90
|
+
const normalized = locale.toLowerCase().replace(/_/g, '-');
|
|
91
|
+
if (localeKeys.has(normalized)) {
|
|
92
|
+
throw new Error(`Widget '${widgetId}': ${fieldName} duplicates locale '${locale}' (underscore and hyphen forms count as the same, e.g. pt_BR vs pt-BR)`);
|
|
164
93
|
}
|
|
165
|
-
|
|
166
|
-
if (
|
|
167
|
-
throw new Error(`Widget '${
|
|
168
|
-
}
|
|
169
|
-
// Check file exists if projectRoot is provided
|
|
170
|
-
if (projectRoot) {
|
|
171
|
-
const fullPath = path.join(projectRoot, widget.previewLayout);
|
|
172
|
-
if (!fs.existsSync(fullPath)) {
|
|
173
|
-
throw new Error(`Widget '${widget.id}': previewLayout file not found at ${widget.previewLayout}`);
|
|
174
|
-
}
|
|
94
|
+
localeKeys.add(normalized);
|
|
95
|
+
if (typeof v !== 'string' || !v.trim()) {
|
|
96
|
+
throw new Error(`Widget '${widgetId}': ${fieldName}.${locale} must be a non-empty string`);
|
|
175
97
|
}
|
|
176
98
|
}
|
|
177
99
|
}
|
|
178
|
-
// ============================================================================
|
|
179
|
-
// Plugin Props Validation
|
|
180
|
-
// ============================================================================
|
|
181
100
|
/**
|
|
182
|
-
* Validates
|
|
183
|
-
* Throws an error if validation fails.
|
|
101
|
+
* Validates optional initialStatePath: plain string or locale map of project-relative file paths.
|
|
184
102
|
*/
|
|
185
|
-
function
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (typeof props.groupIdentifier !== 'string') {
|
|
189
|
-
throw new Error('groupIdentifier must be a string');
|
|
190
|
-
}
|
|
191
|
-
if (!props.groupIdentifier.startsWith('group.')) {
|
|
192
|
-
throw new Error(`groupIdentifier '${props.groupIdentifier}' must start with 'group.'`);
|
|
193
|
-
}
|
|
103
|
+
function validateInitialStatePath(value, widgetId, projectRoot) {
|
|
104
|
+
if (value === undefined) {
|
|
105
|
+
return;
|
|
194
106
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
throw new Error('widgets must be an array');
|
|
107
|
+
const assertPathExists = (relativePath, ctx) => {
|
|
108
|
+
if (!relativePath.trim()) {
|
|
109
|
+
throw new Error(`Widget '${widgetId}': initialStatePath ${ctx} must be a non-empty path`);
|
|
199
110
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (seenIds.has(widget.id)) {
|
|
205
|
-
throw new Error(`Duplicate widget ID: '${widget.id}'`);
|
|
111
|
+
if (projectRoot) {
|
|
112
|
+
const fullPath = path.join(projectRoot, relativePath);
|
|
113
|
+
if (!fs.existsSync(fullPath)) {
|
|
114
|
+
throw new Error(`Widget '${widgetId}': initialStatePath file not found at ${relativePath}`);
|
|
206
115
|
}
|
|
207
|
-
seenIds.add(widget.id);
|
|
208
116
|
}
|
|
117
|
+
};
|
|
118
|
+
if (typeof value === 'string') {
|
|
119
|
+
assertPathExists(value, '');
|
|
120
|
+
return;
|
|
209
121
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
122
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
123
|
+
throw new Error(`Widget '${widgetId}': initialStatePath must be a string or a locale map of paths (e.g. { "en": "./widgets/en.tsx", "pl": "./widgets/pl.tsx" })`);
|
|
124
|
+
}
|
|
125
|
+
const entries = Object.entries(value);
|
|
126
|
+
if (entries.length === 0) {
|
|
127
|
+
throw new Error(`Widget '${widgetId}': initialStatePath locale map must not be empty`);
|
|
128
|
+
}
|
|
129
|
+
const localeKeys = new Set();
|
|
130
|
+
for (const [locale, v] of entries) {
|
|
131
|
+
assertValidLocaleKey(locale, widgetId, 'initialStatePath');
|
|
132
|
+
const normalized = locale.toLowerCase().replace(/_/g, '-');
|
|
133
|
+
if (localeKeys.has(normalized)) {
|
|
134
|
+
throw new Error(`Widget '${widgetId}': initialStatePath duplicates locale '${locale}' (underscore and hyphen forms count as the same)`);
|
|
217
135
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
// Check for duplicate widget IDs
|
|
223
|
-
const seenIds = new Set();
|
|
224
|
-
for (const widget of props.android.widgets) {
|
|
225
|
-
validateAndroidWidgetConfig(widget);
|
|
226
|
-
if (seenIds.has(widget.id)) {
|
|
227
|
-
throw new Error(`Duplicate Android widget ID: '${widget.id}'`);
|
|
228
|
-
}
|
|
229
|
-
seenIds.add(widget.id);
|
|
230
|
-
}
|
|
136
|
+
localeKeys.add(normalized);
|
|
137
|
+
if (typeof v !== 'string' || !v.trim()) {
|
|
138
|
+
throw new Error(`Widget '${widgetId}': initialStatePath.${locale} must be a non-empty path string`);
|
|
231
139
|
}
|
|
140
|
+
assertPathExists(v, `.${locale}`);
|
|
232
141
|
}
|
|
233
142
|
}
|
|
234
143
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
|
package/build/esm/constants.js
CHANGED
|
@@ -1,45 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constants for the Voltra plugin
|
|
3
|
-
*/
|
|
4
|
-
// ============================================================================
|
|
5
|
-
// iOS Constants
|
|
6
|
-
// ============================================================================
|
|
7
|
-
export const IOS = {
|
|
8
|
-
/** Minimum iOS deployment target version */
|
|
9
|
-
DEPLOYMENT_TARGET: '17.0',
|
|
10
|
-
/** Swift language version */
|
|
11
|
-
SWIFT_VERSION: '5.0',
|
|
12
|
-
/** Target device families (1 = iPhone, 2 = iPad) */
|
|
13
|
-
DEVICE_FAMILY: '1,2',
|
|
14
|
-
/** Last Swift migration version for Xcode */
|
|
15
|
-
LAST_SWIFT_MIGRATION: 1250,
|
|
16
|
-
};
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Path Constants
|
|
19
|
-
// ============================================================================
|
|
20
|
-
/** Default path for user-provided widget images */
|
|
21
|
-
export const DEFAULT_USER_IMAGES_PATH = './assets/voltra';
|
|
22
|
-
/** Default path for user-provided Android widget images */
|
|
23
|
-
export const DEFAULT_ANDROID_USER_IMAGES_PATH = './assets/voltra-android';
|
|
24
|
-
// ============================================================================
|
|
25
|
-
// Widget Constants
|
|
26
|
-
// ============================================================================
|
|
27
|
-
/** Maximum image size in bytes for Live Activities (4KB limit) */
|
|
28
|
-
export const MAX_IMAGE_SIZE_BYTES = 4096;
|
|
29
|
-
/** Supported image extensions for widget assets */
|
|
30
|
-
export const SUPPORTED_IMAGE_EXTENSIONS = /\.(png|jpg|jpeg)$/i;
|
|
31
|
-
/** Default widget families when not specified */
|
|
32
|
-
export const DEFAULT_WIDGET_FAMILIES = ['systemSmall', 'systemMedium', 'systemLarge'];
|
|
33
|
-
/** Maps JS widget family names to SwiftUI WidgetFamily enum cases */
|
|
34
|
-
export const WIDGET_FAMILY_MAP = {
|
|
35
|
-
systemSmall: '.systemSmall',
|
|
36
|
-
systemMedium: '.systemMedium',
|
|
37
|
-
systemLarge: '.systemLarge',
|
|
38
|
-
systemExtraLarge: '.systemExtraLarge',
|
|
39
|
-
accessoryCircular: '.accessoryCircular',
|
|
40
|
-
accessoryRectangular: '.accessoryRectangular',
|
|
41
|
-
accessoryInline: '.accessoryInline',
|
|
42
|
-
};
|
|
43
1
|
/** Extensions to try when resolving module paths for pre-rendering */
|
|
44
2
|
export const MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', ''];
|
|
3
|
+
/** Maximum image size in bytes for widget / Live Activity assets (4KB limit) */
|
|
4
|
+
export const MAX_IMAGE_SIZE_BYTES = 4096;
|
|
45
5
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;AAEnE,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAA"}
|
package/build/esm/index.js
CHANGED
|
@@ -1,70 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* Main Voltra config plugin.
|
|
10
|
-
*
|
|
11
|
-
* This plugin configures your Expo app for:
|
|
12
|
-
* - Live Activities (Dynamic Island + Lock Screen)
|
|
13
|
-
* - Home Screen Widgets (iOS and Android)
|
|
14
|
-
* - Push Notifications for Live Activities (optional)
|
|
15
|
-
*/
|
|
16
|
-
const withVoltra = (config, props = {}) => {
|
|
17
|
-
// Validate props at entry point
|
|
18
|
-
validateProps(props);
|
|
19
|
-
// Configure iOS if bundleIdentifier is available
|
|
20
|
-
if (config.ios?.bundleIdentifier) {
|
|
21
|
-
// Use deploymentTarget from props if provided, otherwise fall back to default
|
|
22
|
-
const deploymentTarget = props.deploymentTarget || IOS.DEPLOYMENT_TARGET;
|
|
23
|
-
// Use custom targetName if provided, otherwise fall back to default "{AppName}LiveActivity"
|
|
24
|
-
const targetName = props.targetName || `${IOSConfig.XcodeUtils.sanitizedName(config.name)}LiveActivity`;
|
|
25
|
-
const bundleIdentifier = `${config.ios.bundleIdentifier}.${targetName}`;
|
|
26
|
-
// Extract version and buildNumber from config, defaulting to Expo defaults
|
|
27
|
-
const version = config.version || '1.0.0';
|
|
28
|
-
const buildNumber = config.ios?.buildNumber || '1';
|
|
29
|
-
// Ensure URL scheme is set for widget deep linking
|
|
30
|
-
config = ensureURLScheme(config);
|
|
31
|
-
// Derive a default keychainGroup from bundle identifier when any widget uses server-driven updates
|
|
32
|
-
const hasServerDrivenWidgets = props?.widgets?.some((w) => w.serverUpdate) ?? false;
|
|
33
|
-
const keychainGroup = props?.keychainGroup ??
|
|
34
|
-
(hasServerDrivenWidgets ? `$(AppIdentifierPrefix)${config.ios?.bundleIdentifier}` : undefined);
|
|
35
|
-
// Configure iOS main app (Info.plist, entitlements, EAS)
|
|
36
|
-
config = withIOS(config, {
|
|
37
|
-
groupIdentifier: props?.groupIdentifier,
|
|
38
|
-
widgetIds: props?.widgets && props.widgets.length > 0 ? props.widgets.map((w) => w.id) : undefined,
|
|
39
|
-
widgets: props?.widgets,
|
|
40
|
-
keychainGroup,
|
|
41
|
-
});
|
|
42
|
-
// Configure iOS widget extension (files, xcode, podfile, plist, eas)
|
|
43
|
-
config = withIOSWidget(config, {
|
|
44
|
-
targetName,
|
|
45
|
-
bundleIdentifier,
|
|
46
|
-
deploymentTarget,
|
|
47
|
-
widgets: props?.widgets,
|
|
48
|
-
version,
|
|
49
|
-
buildNumber,
|
|
50
|
-
...(props?.groupIdentifier ? { groupIdentifier: props.groupIdentifier } : {}),
|
|
51
|
-
...(keychainGroup ? { keychainGroup } : {}),
|
|
52
|
-
...(props?.fonts ? { fonts: props.fonts } : {}),
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
// Apply Android configuration (files, manifest)
|
|
56
|
-
if (props.android) {
|
|
57
|
-
config = withAndroid(config, {
|
|
58
|
-
enableNotifications: props.android.enableNotifications,
|
|
59
|
-
widgets: props.android.widgets ?? [],
|
|
60
|
-
...(props?.fonts ? { fonts: props.fonts } : {}),
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
// Optionally enable push notifications
|
|
64
|
-
if (props.enablePushNotifications) {
|
|
65
|
-
config = withPushNotifications(config);
|
|
66
|
-
}
|
|
67
|
-
return config;
|
|
68
|
-
};
|
|
69
|
-
export default withVoltra;
|
|
1
|
+
export { MAX_IMAGE_SIZE_BYTES, MODULE_EXTENSIONS } from './constants';
|
|
2
|
+
export { assertValidLocaleKey, validateHomeScreenWidgetId, validateInitialStatePath, validateWidgetLabel, } from './validation';
|
|
3
|
+
export { addApplicationGroupsEntitlement } from './utils/entitlements';
|
|
4
|
+
export { resolveFontPaths } from './utils/fonts';
|
|
5
|
+
export { normalizeLocaleTag, pickLocalizedValue } from './utils/localePick';
|
|
6
|
+
export { logger } from './utils/logger';
|
|
7
|
+
export { prerenderWidgetState } from './utils/prerender';
|
|
8
|
+
export { isWidgetLocalizedMap, widgetLabelEnglish } from './utils/widgetLabel';
|
|
70
9
|
//# sourceMappingURL=index.js.map
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAErE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA"}
|
package/build/esm/types.js
CHANGED
package/build/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Picks a localized string value from a locale-keyed map using the same fallback rules as iOS/Android runtimes:
|
|
3
|
+
* preferred language tags (full match, then language-only), then `en`, then `__default`, then first value.
|
|
4
|
+
*/
|
|
5
|
+
export function normalizeLocaleTag(tag) {
|
|
6
|
+
return tag.trim().toLowerCase().replace(/_/g, '-');
|
|
7
|
+
}
|
|
8
|
+
export function pickLocalizedValue(perLocale, preferredLanguages) {
|
|
9
|
+
const entries = Object.entries(perLocale).filter(([, v]) => typeof v === 'string' && v.length > 0);
|
|
10
|
+
if (entries.length === 0) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const byNorm = new Map();
|
|
14
|
+
for (const [k, v] of entries) {
|
|
15
|
+
byNorm.set(normalizeLocaleTag(k), v);
|
|
16
|
+
}
|
|
17
|
+
const DEFAULT_KEY = '__default';
|
|
18
|
+
for (const pref of preferredLanguages) {
|
|
19
|
+
const n = normalizeLocaleTag(pref);
|
|
20
|
+
const direct = byNorm.get(n);
|
|
21
|
+
if (direct !== undefined) {
|
|
22
|
+
return direct;
|
|
23
|
+
}
|
|
24
|
+
const lang = n.split('-')[0] ?? n;
|
|
25
|
+
for (const [key, val] of entries) {
|
|
26
|
+
const kn = normalizeLocaleTag(key);
|
|
27
|
+
const keyLang = kn.split('-')[0] ?? kn;
|
|
28
|
+
if (keyLang === lang) {
|
|
29
|
+
return val;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const en = byNorm.get('en') ?? entries.find(([k]) => normalizeLocaleTag(k) === 'en')?.[1];
|
|
34
|
+
if (en !== undefined) {
|
|
35
|
+
return en;
|
|
36
|
+
}
|
|
37
|
+
const defaultVal = byNorm.get(DEFAULT_KEY) ?? entries.find(([k]) => k === DEFAULT_KEY)?.[1];
|
|
38
|
+
if (defaultVal !== undefined) {
|
|
39
|
+
return defaultVal;
|
|
40
|
+
}
|
|
41
|
+
const sorted = [...entries].sort(([a], [b]) => a.localeCompare(b));
|
|
42
|
+
return sorted[0]?.[1];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=localePick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localePick.js","sourceRoot":"","sources":["../../../src/utils/localePick.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAiC,EACjC,kBAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAClG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAA;IAE/B,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,GAAG,CAAA;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACzF,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3F,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACvB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import vm from 'node:vm';
|
|
4
4
|
import * as babel from '@babel/core';
|
|
5
5
|
import { MODULE_EXTENSIONS } from '../constants';
|
|
6
|
+
import { isWidgetLocalizedMap } from './widgetLabel';
|
|
6
7
|
/**
|
|
7
8
|
* Check if a module specifier is a relative or absolute path (local file)
|
|
8
9
|
*/
|
|
@@ -126,7 +127,7 @@ function evaluateWidgetModule(projectRoot, filePath) {
|
|
|
126
127
|
* @param widgets - Array of widget configurations
|
|
127
128
|
* @param projectRoot - Root directory of the Expo project
|
|
128
129
|
* @param renderer - The renderer function to use (voltra/server or voltra/android/server)
|
|
129
|
-
* @returns Map of widgetId ->
|
|
130
|
+
* @returns Map of widgetId -> (locale key -> prerendered JSON string)
|
|
130
131
|
*/
|
|
131
132
|
export async function prerenderWidgetState(widgets, projectRoot, renderer) {
|
|
132
133
|
const prerenderedStates = new Map();
|
|
@@ -134,17 +135,22 @@ export async function prerenderWidgetState(widgets, projectRoot, renderer) {
|
|
|
134
135
|
if (!widget.initialStatePath) {
|
|
135
136
|
continue;
|
|
136
137
|
}
|
|
138
|
+
const pathSpec = widget.initialStatePath;
|
|
139
|
+
const perLocalePaths = isWidgetLocalizedMap(pathSpec)
|
|
140
|
+
? pathSpec
|
|
141
|
+
: { __default: pathSpec };
|
|
142
|
+
const inner = new Map();
|
|
137
143
|
try {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
prerenderedStates.set(widget.id,
|
|
144
|
+
for (const [localeKey, relativePath] of Object.entries(perLocalePaths)) {
|
|
145
|
+
const absoluteWidgetPath = path.resolve(projectRoot, relativePath);
|
|
146
|
+
const widgetVariants = evaluateWidgetModule(projectRoot, absoluteWidgetPath);
|
|
147
|
+
const prerenderedState = renderer(widgetVariants);
|
|
148
|
+
inner.set(localeKey, prerenderedState);
|
|
149
|
+
}
|
|
150
|
+
prerenderedStates.set(widget.id, inner);
|
|
145
151
|
}
|
|
146
152
|
catch (error) {
|
|
147
|
-
throw new Error(`Failed to prerender widget state for ${widget.id}
|
|
153
|
+
throw new Error(`Failed to prerender widget state for ${widget.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
148
154
|
}
|
|
149
155
|
}
|
|
150
156
|
return prerenderedStates;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.js","sourceRoot":"","sources":["../../../src/utils/prerender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"prerender.js","sourceRoot":"","sources":["../../../src/utils/prerender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { pickLocalizedValue } from './localePick';
|
|
2
|
+
export function isWidgetLocalizedMap(label) {
|
|
3
|
+
return typeof label === 'object' && label !== null && !Array.isArray(label);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Development / fallback English copy for LocalizedStringResource.defaultValue.
|
|
7
|
+
* Prefers `en`, then `en-*`, then default fallback order from locale picking.
|
|
8
|
+
*/
|
|
9
|
+
export function widgetLabelEnglish(label) {
|
|
10
|
+
if (!isWidgetLocalizedMap(label)) {
|
|
11
|
+
return label;
|
|
12
|
+
}
|
|
13
|
+
return pickLocalizedValue(label, ['en']) ?? '';
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=widgetLabel.js.map
|