@use-voltra/ios-client 2.0.0 → 2.1.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 +20 -1
- package/build/commonjs/index.js +8 -0
- package/build/commonjs/index.js.map +1 -1
- package/build/commonjs/utils/enableWidgetHotReload.js +39 -0
- package/build/commonjs/utils/enableWidgetHotReload.js.map +1 -0
- package/build/module/index.js +1 -0
- package/build/module/index.js.map +1 -1
- package/build/module/utils/enableWidgetHotReload.js +35 -0
- package/build/module/utils/enableWidgetHotReload.js.map +1 -0
- package/build/typescript/commonjs/index.d.ts +1 -0
- package/build/typescript/commonjs/index.d.ts.map +1 -1
- package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts +23 -0
- package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts.map +1 -0
- package/build/typescript/module/index.d.ts +1 -0
- package/build/typescript/module/index.d.ts.map +1 -1
- package/build/typescript/module/utils/enableWidgetHotReload.d.ts +23 -0
- package/build/typescript/module/utils/enableWidgetHotReload.d.ts.map +1 -0
- package/expo-plugin/build/cjs/index.js +2 -1
- package/expo-plugin/build/cjs/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/clientRendered.js +82 -0
- package/expo-plugin/build/cjs/ios-widget/clientRendered.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js +118 -0
- package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/index.js +6 -0
- package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/files/manifest.js +67 -0
- package/expo-plugin/build/cjs/ios-widget/files/manifest.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/swift.js +149 -12
- package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/index.js +1 -1
- package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +22 -0
- package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +88 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js +12 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -1
- package/expo-plugin/build/cjs/validation.js +7 -4
- package/expo-plugin/build/cjs/validation.js.map +1 -1
- package/expo-plugin/build/esm/index.js +2 -1
- package/expo-plugin/build/esm/index.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/clientRendered.js +46 -0
- package/expo-plugin/build/esm/ios-widget/clientRendered.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js +82 -0
- package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/index.js +6 -0
- package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/files/manifest.js +30 -0
- package/expo-plugin/build/esm/ios-widget/files/manifest.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/swift.js +149 -12
- package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/index.js +1 -1
- package/expo-plugin/build/esm/ios-widget/index.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/widgetPlist.js +22 -0
- package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +87 -0
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/index.js +13 -2
- package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -1
- package/expo-plugin/build/esm/validation.js +8 -5
- package/expo-plugin/build/esm/validation.js.map +1 -1
- package/expo-plugin/build/types/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/clientRendered.d.ts +24 -0
- package/expo-plugin/build/types/ios-widget/clientRendered.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/clientRenderedPrerender.d.ts +9 -0
- package/expo-plugin/build/types/ios-widget/clientRenderedPrerender.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/files/manifest.d.ts +9 -0
- package/expo-plugin/build/types/ios-widget/files/manifest.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/swift.d.ts +6 -0
- package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/widgetPlist.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +5 -0
- package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +2 -0
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -1
- package/expo-plugin/build/types/types.d.ts +30 -2
- package/expo-plugin/build/types/types.d.ts.map +1 -1
- package/expo-plugin/build/types/validation.d.ts +2 -2
- package/expo-plugin/build/types/validation.d.ts.map +1 -1
- package/expo-plugin/src/index.ts +3 -2
- package/expo-plugin/src/ios-widget/clientRendered.ts +88 -0
- package/expo-plugin/src/ios-widget/clientRenderedPrerender.ts +103 -0
- package/expo-plugin/src/ios-widget/files/index.ts +7 -0
- package/expo-plugin/src/ios-widget/files/manifest.ts +47 -0
- package/expo-plugin/src/ios-widget/files/swift.ts +166 -15
- package/expo-plugin/src/ios-widget/index.ts +1 -1
- package/expo-plugin/src/ios-widget/widgetPlist.ts +22 -0
- package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +93 -0
- package/expo-plugin/src/ios-widget/xcode/index.ts +19 -2
- package/expo-plugin/src/types.ts +32 -2
- package/expo-plugin/src/validation.ts +14 -5
- package/ios/app/VoltraModuleImpl.swift +26 -1
- package/ios/shared/VoltraConstants.swift +4 -0
- package/ios/shared/VoltraJSRenderer.swift +201 -0
- package/ios/shared/VoltraWidgetDefaults.swift +14 -0
- package/ios/target/VoltraClientWidgetRuntime.swift +379 -0
- package/package.json +5 -16
- package/src/index.ts +1 -0
- package/src/utils/enableWidgetHotReload.ts +39 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { evaluateWidgetModuleExports } from '@use-voltra/expo-plugin';
|
|
4
|
+
// Emit the experimental notice at most once per prebuild process (detection runs from several
|
|
5
|
+
// plugin steps).
|
|
6
|
+
let hasWarnedExperimental = false;
|
|
7
|
+
/** Inspect every widget once and tag entry-backed widgets as Dynamic Widgets. */
|
|
8
|
+
export function detectClientRenderedWidgets(widgets, projectRoot) {
|
|
9
|
+
const detected = widgets.map((widget) => detectSingleWidget(widget, projectRoot));
|
|
10
|
+
if (!hasWarnedExperimental) {
|
|
11
|
+
const clientWidgetIds = detected.filter((widget) => widget.clientRendered).map((widget) => widget.id);
|
|
12
|
+
if (clientWidgetIds.length > 0) {
|
|
13
|
+
hasWarnedExperimental = true;
|
|
14
|
+
console.warn(`[voltra] Dynamic Widgets are EXPERIMENTAL (${clientWidgetIds.join(', ')}). ` +
|
|
15
|
+
'The widget JSX runs on-device in a separate JS engine; the API and build output may change, ' +
|
|
16
|
+
'and production rendering should be verified on a real device. Use at your own risk.');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return detected;
|
|
20
|
+
}
|
|
21
|
+
function detectSingleWidget(widget, projectRoot) {
|
|
22
|
+
if (widget.entry === undefined) {
|
|
23
|
+
return {
|
|
24
|
+
...widget,
|
|
25
|
+
clientRendered: false,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const sourcePath = resolveWidgetEntryPath(widget.entry, projectRoot);
|
|
29
|
+
if (!sourcePath || !fs.existsSync(sourcePath)) {
|
|
30
|
+
throw new Error(`[voltra] Dynamic Widget "${widget.id}" entry not found at ${path.relative(projectRoot, sourcePath ?? widget.entry)}`);
|
|
31
|
+
}
|
|
32
|
+
const widgetModule = evaluateWidgetModuleExports(projectRoot, sourcePath);
|
|
33
|
+
const widgetFn = widgetModule?.default ?? widgetModule;
|
|
34
|
+
if (typeof widgetFn !== 'function') {
|
|
35
|
+
throw new Error(`[voltra] Dynamic Widget "${widget.id}" at ${path.relative(projectRoot, sourcePath)} must default-export a function or component.`);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
...widget,
|
|
39
|
+
clientRendered: true,
|
|
40
|
+
clientSourcePath: sourcePath,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function resolveWidgetEntryPath(entry, projectRoot) {
|
|
44
|
+
return path.resolve(projectRoot, entry);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=clientRendered.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientRendered.js","sourceRoot":"","sources":["../../../src/ios-widget/clientRendered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAuBrE,8FAA8F;AAC9F,iBAAiB;AACjB,IAAI,qBAAqB,GAAG,KAAK,CAAA;AAEjC,iFAAiF;AACjF,MAAM,UAAU,2BAA2B,CAAC,OAA0B,EAAE,WAAmB;IACzF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IAEjF,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrG,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,qBAAqB,GAAG,IAAI,CAAA;YAC5B,OAAO,CAAC,IAAI,CACV,8CAA8C,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;gBAC3E,8FAA8F;gBAC9F,qFAAqF,CACxF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAuB,EAAE,WAAmB;IACtE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,MAAM;YACT,cAAc,EAAE,KAAK;SACtB,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IACpE,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,CAAC,EAAE,wBAAwB,IAAI,CAAC,QAAQ,CACxE,WAAW,EACX,UAAU,IAAI,MAAM,CAAC,KAAK,CAC3B,EAAE,CACJ,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,2BAA2B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IACzE,MAAM,QAAQ,GAAG,YAAY,EAAE,OAAO,IAAI,YAAY,CAAA;IACtD,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,CAAC,EAAE,QAAQ,IAAI,CAAC,QAAQ,CACxD,WAAW,EACX,UAAU,CACX,+CAA+C,CACjD,CAAA;IACH,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,UAAU;KAC7B,CAAA;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa,EAAE,WAAmB;IAChE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { evaluateWidgetModuleExports, logger } from '@use-voltra/expo-plugin';
|
|
2
|
+
/**
|
|
3
|
+
* Initial-state prerender for Dynamic Widgets.
|
|
4
|
+
*
|
|
5
|
+
* For widgets with `initialStatePath`, the existing `prerenderWidgetState` in
|
|
6
|
+
* @use-voltra/expo-plugin loads the file and reads `exports.default` (a `WidgetVariants`
|
|
7
|
+
* object), then runs it through the multi-family `renderWidgetToString` to produce a
|
|
8
|
+
* per-family JSON payload that the runtime's `selectContentForFamily` will pick from.
|
|
9
|
+
*
|
|
10
|
+
* Dynamic Widgets work differently: the module referenced by `entry` default-exports a
|
|
11
|
+
* function or component, and the runtime calls it per-render with real env values. For the
|
|
12
|
+
* WidgetKit placeholder (`Provider.placeholder` and the widget gallery preview) ONE
|
|
13
|
+
* pre-rendered JSON entry is needed to display before any Metro fetch completes. That's
|
|
14
|
+
* generated here by calling the entry default export at prebuild with empty props + a
|
|
15
|
+
* minimal env, storing the compact `{t, c, p}` JSON in the existing `voltra_initial_states.json`.
|
|
16
|
+
*
|
|
17
|
+
* The placeholder's env values are fixed (`widgetFamily: 'systemMedium'`,
|
|
18
|
+
* `colorScheme: 'light'`, etc.) and may not match what the user actually sees the moment
|
|
19
|
+
* they add the widget — but the first real timeline tick replaces this entry within
|
|
20
|
+
* milliseconds, so the brief mismatch is invisible in practice.
|
|
21
|
+
*/
|
|
22
|
+
/** Locale key used for non-localized prerendered states (mirrors prerender.ts behavior). */
|
|
23
|
+
const SINGLE_LOCALE_KEY = '__default';
|
|
24
|
+
/**
|
|
25
|
+
* Default env passed to Dynamic Widgets at prebuild for the placeholder render. Fields
|
|
26
|
+
* mirror `WidgetEnvironment` from packages/core/src/widget-environment.ts so the widget
|
|
27
|
+
* function sees the same shape it gets at runtime.
|
|
28
|
+
*/
|
|
29
|
+
function buildPlaceholderEnv() {
|
|
30
|
+
return {
|
|
31
|
+
date: Date.now(),
|
|
32
|
+
widgetFamily: 'systemMedium',
|
|
33
|
+
colorScheme: 'light',
|
|
34
|
+
locale: 'en-US',
|
|
35
|
+
widgetRenderingMode: 'fullColor',
|
|
36
|
+
showsWidgetContainerBackground: true,
|
|
37
|
+
configuration: undefined,
|
|
38
|
+
build: {
|
|
39
|
+
isDev: false,
|
|
40
|
+
metroUrl: null,
|
|
41
|
+
appVersion: 'unknown',
|
|
42
|
+
voltraVersion: '1.4.1',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Prerender placeholder JSON for every Dynamic Widget. Returns a map shaped
|
|
48
|
+
* identically to `prerenderWidgetState`'s output so the two can be merged before
|
|
49
|
+
* generating `VoltraWidgetInitialStates.swift`.
|
|
50
|
+
*/
|
|
51
|
+
export async function prerenderClientRenderedWidgets(widgets, projectRoot) {
|
|
52
|
+
const results = new Map();
|
|
53
|
+
const clientWidgets = widgets.filter((w) => w.clientRendered);
|
|
54
|
+
if (clientWidgets.length === 0) {
|
|
55
|
+
return results;
|
|
56
|
+
}
|
|
57
|
+
// Lazy-loaded so server-only projects never pull in @use-voltra/ios. The renderer
|
|
58
|
+
// is iOS-specific by design — the Android counterpart will use the same shape via
|
|
59
|
+
// @use-voltra/android in a future phase.
|
|
60
|
+
const iosModuleId = '@use-voltra/ios';
|
|
61
|
+
const { renderVoltraVariantToJson } = (await import(iosModuleId));
|
|
62
|
+
const placeholderEnv = buildPlaceholderEnv();
|
|
63
|
+
for (const widget of clientWidgets) {
|
|
64
|
+
try {
|
|
65
|
+
const widgetModule = evaluateWidgetModuleExports(projectRoot, widget.clientSourcePath);
|
|
66
|
+
const widgetFn = widgetModule?.default ?? widgetModule;
|
|
67
|
+
if (typeof widgetFn !== 'function') {
|
|
68
|
+
throw new Error(`Expected the entry module at ${widget.clientSourcePath} to default-export a function or component.`);
|
|
69
|
+
}
|
|
70
|
+
const element = widgetFn({}, placeholderEnv);
|
|
71
|
+
const json = renderVoltraVariantToJson(element);
|
|
72
|
+
const jsonString = JSON.stringify(json);
|
|
73
|
+
results.set(widget.id, new Map([[SINGLE_LOCALE_KEY, jsonString]]));
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error(`Failed to prerender Dynamic Widget "${widget.id}": ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
logger.info(`Prerendered ${clientWidgets.length} Dynamic Widget placeholder(s)`);
|
|
80
|
+
return results;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=clientRenderedPrerender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientRenderedPrerender.js","sourceRoot":"","sources":["../../../src/ios-widget/clientRenderedPrerender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAgC,MAAM,yBAAyB,CAAA;AAI3G;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,4FAA4F;AAC5F,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAErC;;;;GAIG;AACH,SAAS,mBAAmB;IAC1B,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;QAChB,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,OAAO;QACpB,MAAM,EAAE,OAAO;QACf,mBAAmB,EAAE,WAAW;QAChC,8BAA8B,EAAE,IAAI;QACpC,aAAa,EAAE,SAAS;QACxB,KAAK,EAAE;YACL,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,OAAO;SACvB;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,OAA4B,EAC5B,WAAmB;IAEnB,MAAM,OAAO,GAA4B,IAAI,GAAG,EAAE,CAAA;IAElD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,CAAC,EAA6D,EAAE,CAAC,CAAC,CAAC,cAAc,CACnF,CAAA;IACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,kFAAkF;IAClF,kFAAkF;IAClF,yCAAyC;IACzC,MAAM,WAAW,GAAG,iBAAiB,CAAA;IACrC,MAAM,EAAE,yBAAyB,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAE/D,CAAA;IAED,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAA;IAE5C,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,2BAA2B,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACtF,MAAM,QAAQ,GAAG,YAAY,EAAE,OAAO,IAAI,YAAY,CAAA;YACtD,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,CAAC,gBAAgB,6CAA6C,CACrG,CAAA;YACH,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/G,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,eAAe,aAAa,CAAC,MAAM,gCAAgC,CAAC,CAAA;IAChF,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -4,6 +4,7 @@ import * as path from 'path';
|
|
|
4
4
|
import { generateAssets } from './assets';
|
|
5
5
|
import { generateEntitlements } from './entitlements';
|
|
6
6
|
import { generateInfoPlist } from './infoPlist';
|
|
7
|
+
import { generateIOSDynamicWidgetsManifest } from './manifest';
|
|
7
8
|
import { generateSwiftFiles } from './swift';
|
|
8
9
|
/**
|
|
9
10
|
* Plugin step that generates all widget extension files.
|
|
@@ -41,6 +42,11 @@ export const generateWidgetExtensionFiles = (config, props) => {
|
|
|
41
42
|
projectRoot,
|
|
42
43
|
widgets,
|
|
43
44
|
});
|
|
45
|
+
// Write the iOS-owned Dynamic Widgets manifest for Metro to consume later.
|
|
46
|
+
generateIOSDynamicWidgetsManifest({
|
|
47
|
+
projectRoot,
|
|
48
|
+
widgets,
|
|
49
|
+
});
|
|
44
50
|
// Generate entitlements file (may be empty if no groupIdentifier or keychainGroup)
|
|
45
51
|
generateEntitlements({
|
|
46
52
|
targetPath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ios-widget/files/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAW5C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAoD,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IAC7G,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAE3F,OAAO,gBAAgB,CAAC,MAAM,EAAE;QAC9B,KAAK;QACL,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,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAA;YAE7D,iCAAiC;YACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/C,CAAC;YAED,sBAAsB;YACtB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;YAE/D,gDAAgD;YAChD,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;YAE9B,uDAAuD;YACvD,MAAM,kBAAkB,CAAC;gBACvB,UAAU;gBACV,WAAW;gBACX,OAAO;aACR,CAAC,CAAA;YAEF,mFAAmF;YACnF,oBAAoB,CAAC;gBACnB,UAAU;gBACV,UAAU;gBACV,eAAe;gBACf,aAAa;aACd,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ios-widget/files/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAW5C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAoD,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IAC7G,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAE3F,OAAO,gBAAgB,CAAC,MAAM,EAAE;QAC9B,KAAK;QACL,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,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAA;YAE7D,iCAAiC;YACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/C,CAAC;YAED,sBAAsB;YACtB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;YAE/D,gDAAgD;YAChD,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;YAE9B,uDAAuD;YACvD,MAAM,kBAAkB,CAAC;gBACvB,UAAU;gBACV,WAAW;gBACX,OAAO;aACR,CAAC,CAAA;YAEF,2EAA2E;YAC3E,iCAAiC,CAAC;gBAChC,WAAW;gBACX,OAAO;aACR,CAAC,CAAA;YAEF,mFAAmF;YACnF,oBAAoB,CAAC;gBACnB,UAAU;gBACV,UAAU;gBACV,eAAe;gBACf,aAAa;aACd,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { logger, validateWidgetEntry } from '@use-voltra/expo-plugin';
|
|
4
|
+
const MANIFEST_PATH = path.join('.voltra', 'manifest.ios.json');
|
|
5
|
+
export function createIOSDynamicWidgetsManifest(projectRoot, widgets) {
|
|
6
|
+
const manifestWidgets = [];
|
|
7
|
+
for (const widget of widgets) {
|
|
8
|
+
if (widget.entry === undefined) {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
manifestWidgets.push({
|
|
12
|
+
id: widget.id,
|
|
13
|
+
entry: validateWidgetEntry(widget.entry, widget.id, projectRoot),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
version: 1,
|
|
18
|
+
platform: 'ios',
|
|
19
|
+
widgets: manifestWidgets,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function generateIOSDynamicWidgetsManifest(options) {
|
|
23
|
+
const { projectRoot, widgets } = options;
|
|
24
|
+
const manifestPath = path.join(projectRoot, MANIFEST_PATH);
|
|
25
|
+
const manifest = createIOSDynamicWidgetsManifest(projectRoot, widgets ?? []);
|
|
26
|
+
fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
|
|
27
|
+
fs.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
28
|
+
logger.info(`Generated ${MANIFEST_PATH}`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../src/ios-widget/files/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAA8B,MAAM,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAIjG,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAA;AAO/D,MAAM,UAAU,+BAA+B,CAC7C,WAAmB,EACnB,OAA0B;IAE1B,MAAM,eAAe,GAAqC,EAAE,CAAA;IAE5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,SAAQ;QACV,CAAC;QAED,eAAe,CAAC,IAAI,CAAC;YACnB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC;SACjE,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,eAAe;KACzB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAiD;IACjG,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IAC1D,MAAM,QAAQ,GAAG,+BAA+B,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IAE5E,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IACxE,MAAM,CAAC,IAAI,CAAC,aAAa,aAAa,EAAE,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -4,6 +4,8 @@ import * as path from 'path';
|
|
|
4
4
|
import { isWidgetLocalizedMap, logger, prerenderWidgetState, widgetLabelEnglish, } from '@use-voltra/expo-plugin';
|
|
5
5
|
import { DEFAULT_WIDGET_FAMILIES, WIDGET_FAMILY_MAP } from '../../constants';
|
|
6
6
|
import { VOLTRA_WIDGET_STRINGS_BASENAME } from '../../utils/fileDiscovery';
|
|
7
|
+
import { detectClientRenderedWidgets } from '../clientRendered';
|
|
8
|
+
import { prerenderClientRenderedWidgets } from '../clientRenderedPrerender';
|
|
7
9
|
// ============================================================================
|
|
8
10
|
// Main Function
|
|
9
11
|
// ============================================================================
|
|
@@ -19,8 +21,22 @@ export async function generateSwiftFiles(options) {
|
|
|
19
21
|
// Dynamic import keeps the plugin CommonJS-compatible while resolving the current package entry.
|
|
20
22
|
const serverModuleId = '@use-voltra/ios/server';
|
|
21
23
|
const { renderWidgetToString } = (await import(serverModuleId));
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
+
// Tag each widget with its rendering mode (server vs Dynamic Widget) by inspecting the
|
|
25
|
+
// app.json entry module. See ../clientRendered.ts.
|
|
26
|
+
const detectedWidgets = detectClientRenderedWidgets(widgets || [], projectRoot);
|
|
27
|
+
const clientWidgetCount = detectedWidgets.filter((w) => w.clientRendered).length;
|
|
28
|
+
if (clientWidgetCount > 0) {
|
|
29
|
+
logger.info(`Detected ${clientWidgetCount} Dynamic Widget(s) — generating Provider scaffolding`);
|
|
30
|
+
}
|
|
31
|
+
// Prerender widget initial states. Widgets with `initialStatePath` go through the existing
|
|
32
|
+
// multi-family WidgetVariants → JSON path; Dynamic Widgets go through the entry-module path
|
|
33
|
+
// (call the default export with default props + minimal env, run renderVoltraVariantToJson,
|
|
34
|
+
// stringify). Both produce entries in the same map shape so
|
|
35
|
+
// VoltraWidgetInitialStates.swift can read either via the same lookup at runtime.
|
|
36
|
+
const serverWidgets = detectedWidgets.filter((w) => !w.clientRendered);
|
|
37
|
+
const serverStates = await prerenderWidgetState(serverWidgets, projectRoot, renderWidgetToString);
|
|
38
|
+
const clientStates = await prerenderClientRenderedWidgets(detectedWidgets, projectRoot);
|
|
39
|
+
const prerenderedStates = new Map([...serverStates, ...clientStates]);
|
|
24
40
|
syncVoltraWidgetGalleryStrings(targetPath, widgets);
|
|
25
41
|
// Generate the initial states Swift file
|
|
26
42
|
const initialStatesContent = generateInitialStatesSwift(prerenderedStates);
|
|
@@ -28,7 +44,7 @@ export async function generateSwiftFiles(options) {
|
|
|
28
44
|
fs.writeFileSync(initialStatesPath, initialStatesContent);
|
|
29
45
|
logger.info(`Generated VoltraWidgetInitialStates.swift with ${prerenderedStates.size} widget(s) (localized initial states where configured)`);
|
|
30
46
|
// Generate the widget bundle Swift file
|
|
31
|
-
const widgetBundleContent =
|
|
47
|
+
const widgetBundleContent = detectedWidgets.length > 0 ? generateWidgetBundleSwift(detectedWidgets) : generateDefaultWidgetBundleSwift();
|
|
32
48
|
const widgetBundlePath = path.join(targetPath, 'VoltraWidgetBundle.swift');
|
|
33
49
|
fs.writeFileSync(widgetBundlePath, widgetBundleContent);
|
|
34
50
|
logger.info(`Generated VoltraWidgetBundle.swift with ${widgets?.length ?? 0} home screen widgets`);
|
|
@@ -206,15 +222,47 @@ function iosWidgetGalleryLabelSwiftExpr(widgetId, field, label) {
|
|
|
206
222
|
return `Text(LocalizedStringResource("${key}", defaultValue: String.LocalizationValue("${defaultEnglish}"), table: "VoltraWidgets"))`;
|
|
207
223
|
}
|
|
208
224
|
/**
|
|
209
|
-
* Generates Swift code for a single widget struct
|
|
225
|
+
* Generates Swift code for a single widget struct. Dispatches on rendering mode:
|
|
226
|
+
* - server-rendered → `VoltraHomeWidgetProvider` + `VoltraHomeWidgetView` (existing path)
|
|
227
|
+
* - Dynamic Widget → `VoltraClientWidgetProvider` + `VoltraClientWidgetContentView`
|
|
228
|
+
* (the content view internally renders via VoltraHomeWidgetView so the UI layer is
|
|
229
|
+
* identical to the fallback state path — see VoltraClientWidgetRuntime.swift)
|
|
210
230
|
*/
|
|
231
|
+
function widgetUsesAppIntent(widget) {
|
|
232
|
+
return widget.clientRendered && !!widget.appIntent && widget.appIntent.parameters.length > 0;
|
|
233
|
+
}
|
|
211
234
|
function generateWidgetStruct(widget) {
|
|
235
|
+
// Client-rendered widgets with an appIntent config get a native "Edit Widget" sheet via
|
|
236
|
+
// AppIntentConfiguration; the configured params flow into env.configuration.
|
|
237
|
+
if (widgetUsesAppIntent(widget)) {
|
|
238
|
+
return generateClientAppIntentWidgetCode(widget);
|
|
239
|
+
}
|
|
212
240
|
const families = widget.supportedFamilies ?? DEFAULT_WIDGET_FAMILIES;
|
|
213
241
|
const familiesSwift = families.map((f) => WIDGET_FAMILY_MAP[f]).join(', ');
|
|
214
242
|
// Sanitize the widget id for use as a Swift identifier
|
|
215
243
|
const structName = `VoltraWidget_${widget.id}`;
|
|
216
244
|
const displayNameExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'displayName', widget.displayName);
|
|
217
245
|
const descriptionExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'description', widget.description);
|
|
246
|
+
const providerAndContent = widget.clientRendered
|
|
247
|
+
? dedent `
|
|
248
|
+
provider: VoltraClientWidgetProvider(
|
|
249
|
+
widgetId: widgetId,
|
|
250
|
+
initialState: VoltraWidgetInitialStates.getInitialState(for: widgetId)
|
|
251
|
+
)
|
|
252
|
+
) { entry in
|
|
253
|
+
VoltraClientWidgetContentView(
|
|
254
|
+
entry: entry,
|
|
255
|
+
initialState: VoltraWidgetInitialStates.getInitialState(for: widgetId)
|
|
256
|
+
)
|
|
257
|
+
}`
|
|
258
|
+
: dedent `
|
|
259
|
+
provider: VoltraHomeWidgetProvider(
|
|
260
|
+
widgetId: widgetId,
|
|
261
|
+
initialState: VoltraWidgetInitialStates.getInitialState(for: widgetId)
|
|
262
|
+
)
|
|
263
|
+
) { entry in
|
|
264
|
+
VoltraHomeWidgetView(entry: entry)
|
|
265
|
+
}`;
|
|
218
266
|
return dedent `
|
|
219
267
|
public struct ${structName}: Widget {
|
|
220
268
|
private let widgetId = "${widget.id}"
|
|
@@ -224,12 +272,91 @@ function generateWidgetStruct(widget) {
|
|
|
224
272
|
public var body: some WidgetConfiguration {
|
|
225
273
|
StaticConfiguration(
|
|
226
274
|
kind: "Voltra_Widget_${widget.id}",
|
|
227
|
-
|
|
228
|
-
|
|
275
|
+
${providerAndContent}
|
|
276
|
+
.configurationDisplayName(${displayNameExpr})
|
|
277
|
+
.description(${descriptionExpr})
|
|
278
|
+
.supportedFamilies([${familiesSwift}])
|
|
279
|
+
.contentMarginsDisabled()
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
`;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Generates a Dynamic Widget backed by AppIntentConfiguration (iOS 17+): a
|
|
286
|
+
* WidgetConfigurationIntent (params + code defaults), an AppIntentTimelineProvider that loads the
|
|
287
|
+
* bundle via the shared client runtime, and an AppIntentConfiguration widget. The configured
|
|
288
|
+
* params are passed into the render as env.configuration; the native "Edit Widget" sheet edits them.
|
|
289
|
+
*/
|
|
290
|
+
function generateClientAppIntentWidgetCode(widget) {
|
|
291
|
+
const params = widget.appIntent.parameters;
|
|
292
|
+
const families = widget.supportedFamilies ?? DEFAULT_WIDGET_FAMILIES;
|
|
293
|
+
const familiesSwift = families.map((f) => WIDGET_FAMILY_MAP[f]).join(', ');
|
|
294
|
+
const intentName = `VoltraWidget_${widget.id}_Intent`;
|
|
295
|
+
const providerName = `VoltraWidget_${widget.id}_ClientProvider`;
|
|
296
|
+
const intentTitle = escapeForSwiftStringLiteral(`Configure ${widgetLabelEnglish(widget.displayName)}`);
|
|
297
|
+
const displayNameExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'displayName', widget.displayName);
|
|
298
|
+
const descriptionExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'description', widget.description);
|
|
299
|
+
const swiftDefault = (p) => `"${escapeForSwiftStringLiteral(p.default ?? '')}"`;
|
|
300
|
+
const dictLiteral = (entries) => (entries.length > 0 ? `[${entries.join(', ')}]` : '[:]');
|
|
301
|
+
const paramDecls = params
|
|
302
|
+
.map((p) => ` @Parameter(title: "${escapeForSwiftStringLiteral(p.title)}", default: ${swiftDefault(p)})\n var ${p.name}: String`)
|
|
303
|
+
.join('\n\n');
|
|
304
|
+
const initParams = params.map((p) => `${p.name}: String`).join(', ');
|
|
305
|
+
const initBody = params.map((p) => ` self.${p.name} = ${p.name}`).join('\n');
|
|
306
|
+
const configuredDict = dictLiteral(params.map((p) => `"${p.name}": configuration.${p.name}`));
|
|
307
|
+
const defaultDict = dictLiteral(params.map((p) => `"${p.name}": ${swiftDefault(p)}`));
|
|
308
|
+
return dedent `
|
|
309
|
+
// MARK: - Client-rendered AppIntent widget: ${widget.id}
|
|
310
|
+
|
|
311
|
+
@available(iOS 17.0, *)
|
|
312
|
+
struct ${intentName}: WidgetConfigurationIntent {
|
|
313
|
+
static var title: LocalizedStringResource = "${intentTitle}"
|
|
314
|
+
|
|
315
|
+
${paramDecls}
|
|
316
|
+
|
|
317
|
+
init() {}
|
|
318
|
+
init(${initParams}) {
|
|
319
|
+
${initBody}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
@available(iOS 17.0, *)
|
|
324
|
+
private struct ${providerName}: AppIntentTimelineProvider {
|
|
325
|
+
typealias Intent = ${intentName}
|
|
326
|
+
typealias Entry = VoltraClientWidgetEntry
|
|
327
|
+
|
|
328
|
+
private let widgetId = "${widget.id}"
|
|
329
|
+
|
|
330
|
+
func placeholder(in _: Context) -> VoltraClientWidgetEntry {
|
|
331
|
+
VoltraClientWidgetEntry(date: Date(), widgetId: widgetId, bundleReady: false, configuration: ${defaultDict})
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
func snapshot(for configuration: ${intentName}, in _: Context) async -> VoltraClientWidgetEntry {
|
|
335
|
+
await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
func timeline(for configuration: ${intentName}, in _: Context) async -> Timeline<VoltraClientWidgetEntry> {
|
|
339
|
+
let entry = await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
|
|
340
|
+
return Timeline(entries: [entry], policy: .never)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
@available(iOS 17.0, *)
|
|
345
|
+
public struct VoltraWidget_${widget.id}: Widget {
|
|
346
|
+
private let widgetId = "${widget.id}"
|
|
347
|
+
|
|
348
|
+
public init() {}
|
|
349
|
+
|
|
350
|
+
public var body: some WidgetConfiguration {
|
|
351
|
+
AppIntentConfiguration(
|
|
352
|
+
kind: "Voltra_Widget_${widget.id}",
|
|
353
|
+
intent: ${intentName}.self,
|
|
354
|
+
provider: ${providerName}()
|
|
355
|
+
) { entry in
|
|
356
|
+
VoltraClientWidgetContentView(
|
|
357
|
+
entry: entry,
|
|
229
358
|
initialState: VoltraWidgetInitialStates.getInitialState(for: widgetId)
|
|
230
359
|
)
|
|
231
|
-
) { entry in
|
|
232
|
-
VoltraHomeWidgetView(entry: entry)
|
|
233
360
|
}
|
|
234
361
|
.configurationDisplayName(${displayNameExpr})
|
|
235
362
|
.description(${descriptionExpr})
|
|
@@ -244,11 +371,20 @@ function generateWidgetStruct(widget) {
|
|
|
244
371
|
*/
|
|
245
372
|
function generateWidgetBundleSwift(widgets) {
|
|
246
373
|
// Generate widget structs
|
|
247
|
-
const widgetStructs = widgets.map(generateWidgetStruct).join('\n\n');
|
|
248
|
-
//
|
|
249
|
-
const
|
|
374
|
+
const widgetStructs = widgets.map((w) => generateWidgetStruct(w)).join('\n\n');
|
|
375
|
+
// AppIntent widgets are iOS 17+, so their bundle entries are gated behind #available.
|
|
376
|
+
const appIntentWidgets = widgets.filter(widgetUsesAppIntent);
|
|
377
|
+
const plainWidgets = widgets.filter((w) => !widgetUsesAppIntent(w));
|
|
378
|
+
const plainInstances = plainWidgets.map((w) => `VoltraWidget_${w.id}()`).join('\n ');
|
|
379
|
+
const appIntentInstances = appIntentWidgets.length > 0
|
|
380
|
+
? `if #available(iOS 17.0, *) {\n ${appIntentWidgets
|
|
381
|
+
.map((w) => `VoltraWidget_${w.id}()`)
|
|
382
|
+
.join('\n ')}\n }`
|
|
383
|
+
: '';
|
|
384
|
+
const widgetInstances = [plainInstances, appIntentInstances].filter(Boolean).join('\n ');
|
|
250
385
|
const needsFoundation = widgets.some(widgetUsesGalleryLocalization);
|
|
251
386
|
const foundationImport = needsFoundation ? 'import Foundation\n' : '';
|
|
387
|
+
const appIntentsImport = appIntentWidgets.length > 0 ? 'import AppIntents\n' : '';
|
|
252
388
|
return dedent `
|
|
253
389
|
//
|
|
254
390
|
// VoltraWidgetBundle.swift
|
|
@@ -257,7 +393,7 @@ function generateWidgetBundleSwift(widgets) {
|
|
|
257
393
|
// This file defines which Voltra widgets are available in your app.
|
|
258
394
|
//
|
|
259
395
|
|
|
260
|
-
${foundationImport}import SwiftUI
|
|
396
|
+
${foundationImport}${appIntentsImport}import SwiftUI
|
|
261
397
|
import WidgetKit
|
|
262
398
|
import VoltraWidget
|
|
263
399
|
|
|
@@ -399,5 +535,6 @@ function getSwiftRawStringDelimiter(str) {
|
|
|
399
535
|
}
|
|
400
536
|
export const __test__ = {
|
|
401
537
|
generateInitialStatesSwift,
|
|
538
|
+
generateWidgetBundleSwift,
|
|
402
539
|
};
|
|
403
540
|
//# sourceMappingURL=swift.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swift.js","sourceRoot":"","sources":["../../../../src/ios-widget/files/swift.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"swift.js","sourceRoot":"","sources":["../../../../src/ios-widget/files/swift.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ export const withIOS = (config, props) => {
|
|
|
27
27
|
// 1. Add custom fonts if provided
|
|
28
28
|
...(fonts && fonts.length > 0 ? [[withFonts, { fonts, targetName }]] : []),
|
|
29
29
|
// 2. Configure Xcode project (creates the target - must run before fonts mod executes)
|
|
30
|
-
[configureXcodeProject, { targetName, bundleIdentifier, deploymentTarget }],
|
|
30
|
+
[configureXcodeProject, { targetName, bundleIdentifier, deploymentTarget, widgets }],
|
|
31
31
|
// 3. Configure Podfile for widget extension target
|
|
32
32
|
[configurePodfile, { targetName }],
|
|
33
33
|
// 4. Configure main app Info.plist (URL schemes, widget extension plist)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ios-widget/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAGhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAc/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,OAAO,GAA+B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACnE,MAAM,EACJ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,eAAe,EACf,aAAa,EACb,KAAK,EACL,OAAO,EACP,WAAW,GACZ,GAAG,KAAK,CAAA;IAET,MAAM,OAAO,GAA+B;QAC1C,kCAAkC;QAClC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtG,uFAAuF;QACvF,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ios-widget/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAGhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAc/C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,OAAO,GAA+B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;IACnE,MAAM,EACJ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,eAAe,EACf,aAAa,EACb,KAAK,EACL,OAAO,EACP,WAAW,GACZ,GAAG,KAAK,CAAA;IAET,MAAM,OAAO,GAA+B;QAC1C,kCAAkC;QAClC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtG,uFAAuF;QACvF,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QAEpF,mDAAmD;QACnD,CAAC,gBAAgB,EAAE,EAAE,UAAU,EAAE,CAAC;QAElC,yEAAyE;QACzE,CAAC,6BAA6B,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAExF,kCAAkC;QAClC,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;QAEtE,sFAAsF;QACtF,CAAC,4BAA4B,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;KAC9G,CAAA;IAED,OAAO,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACrC,CAAC,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { withDangerousMod } from '@expo/config-plugins';
|
|
|
2
2
|
import plist from '@expo/plist';
|
|
3
3
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
4
4
|
import { join as joinPath } from 'path';
|
|
5
|
+
import { detectClientRenderedWidgets } from './clientRendered';
|
|
5
6
|
import { logger } from '@use-voltra/expo-plugin';
|
|
6
7
|
/**
|
|
7
8
|
* Plugin step that configures the Info.plist files.
|
|
@@ -28,6 +29,27 @@ export const configureWidgetExtensionPlist = (expoConfig, { targetName, groupIde
|
|
|
28
29
|
return config;
|
|
29
30
|
}
|
|
30
31
|
const content = plist.parse(readFileSync(filePath, 'utf8'));
|
|
32
|
+
// Dynamic Widgets fetch their JS bundle from Metro at
|
|
33
|
+
// http://localhost:8081 in DEBUG builds. iOS requires an ATS exception for
|
|
34
|
+
// plaintext HTTP, scoped to localhost. The keys are only added when a
|
|
35
|
+
// Dynamic Widget actually exists, so server-only configurations
|
|
36
|
+
// keep their plist minimal.
|
|
37
|
+
if (widgets && widgets.length > 0) {
|
|
38
|
+
const detected = detectClientRenderedWidgets(widgets, config.modRequest.projectRoot);
|
|
39
|
+
const hasClientWidget = detected.some((w) => w.clientRendered);
|
|
40
|
+
if (hasClientWidget) {
|
|
41
|
+
;
|
|
42
|
+
content['NSAppTransportSecurity'] = {
|
|
43
|
+
NSAllowsLocalNetworking: true,
|
|
44
|
+
NSExceptionDomains: {
|
|
45
|
+
localhost: {
|
|
46
|
+
NSExceptionAllowsInsecureHTTPLoads: true,
|
|
47
|
+
NSIncludesSubdomains: true,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
31
53
|
// WidgetKit extensions must NOT declare NSExtensionPrincipalClass/MainStoryboard.
|
|
32
54
|
// The @main WidgetBundle in Swift is the entry point.
|
|
33
55
|
const ext = content.NSExtension;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widgetPlist.js","sourceRoot":"","sources":["../../../src/ios-widget/widgetPlist.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"widgetPlist.js","sourceRoot":"","sources":["../../../src/ios-widget/widgetPlist.ts"],"names":[],"mappings":"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"}
|