@use-voltra/ios-client 2.2.0 → 2.3.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/Voltra.podspec +1 -0
- package/build/commonjs/events.js +23 -0
- package/build/commonjs/events.js.map +1 -1
- package/build/commonjs/index.js +59 -0
- package/build/commonjs/index.js.map +1 -1
- package/build/commonjs/live-activity/api.js +3 -1
- package/build/commonjs/live-activity/api.js.map +1 -1
- package/build/commonjs/live-activity/dynamic-api.js +173 -0
- package/build/commonjs/live-activity/dynamic-api.js.map +1 -0
- package/build/commonjs/native/NativeVoltra.js.map +1 -1
- package/build/commonjs/utils/enableDynamicLiveActivityHotReload.js +47 -0
- package/build/commonjs/utils/enableDynamicLiveActivityHotReload.js.map +1 -0
- package/build/commonjs/utils/enableWidgetHotReload.js +8 -11
- package/build/commonjs/utils/enableWidgetHotReload.js.map +1 -1
- package/build/commonjs/utils/useUpdateOnHMR.js +3 -7
- package/build/commonjs/utils/useUpdateOnHMR.js.map +1 -1
- package/build/commonjs/widgets/server-credentials.js +9 -0
- package/build/commonjs/widgets/server-credentials.js.map +1 -1
- package/build/commonjs/widgets/server-update.js +78 -0
- package/build/commonjs/widgets/server-update.js.map +1 -0
- package/build/module/events.js +23 -0
- package/build/module/events.js.map +1 -1
- package/build/module/index.js +3 -0
- package/build/module/index.js.map +1 -1
- package/build/module/live-activity/api.js +2 -2
- package/build/module/live-activity/api.js.map +1 -1
- package/build/module/live-activity/dynamic-api.js +167 -0
- package/build/module/live-activity/dynamic-api.js.map +1 -0
- package/build/module/native/NativeVoltra.js.map +1 -1
- package/build/module/utils/enableDynamicLiveActivityHotReload.js +43 -0
- package/build/module/utils/enableDynamicLiveActivityHotReload.js.map +1 -0
- package/build/module/utils/enableWidgetHotReload.js +9 -11
- package/build/module/utils/enableWidgetHotReload.js.map +1 -1
- package/build/module/utils/useUpdateOnHMR.js +3 -7
- package/build/module/utils/useUpdateOnHMR.js.map +1 -1
- package/build/module/widgets/server-credentials.js +9 -0
- package/build/module/widgets/server-credentials.js.map +1 -1
- package/build/module/widgets/server-update.js +72 -0
- package/build/module/widgets/server-update.js.map +1 -0
- package/build/typescript/commonjs/events.d.ts +7 -0
- package/build/typescript/commonjs/events.d.ts.map +1 -1
- package/build/typescript/commonjs/index.d.ts +3 -0
- package/build/typescript/commonjs/index.d.ts.map +1 -1
- package/build/typescript/commonjs/live-activity/api.d.ts +7 -0
- package/build/typescript/commonjs/live-activity/api.d.ts.map +1 -1
- package/build/typescript/commonjs/live-activity/dynamic-api.d.ts +54 -0
- package/build/typescript/commonjs/live-activity/dynamic-api.d.ts.map +1 -0
- package/build/typescript/commonjs/native/NativeVoltra.d.ts +20 -0
- package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -1
- package/build/typescript/commonjs/types.d.ts +1 -1
- package/build/typescript/commonjs/types.d.ts.map +1 -1
- package/build/typescript/commonjs/utils/enableDynamicLiveActivityHotReload.d.ts +15 -0
- package/build/typescript/commonjs/utils/enableDynamicLiveActivityHotReload.d.ts.map +1 -0
- package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts +5 -7
- package/build/typescript/commonjs/utils/enableWidgetHotReload.d.ts.map +1 -1
- package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts +0 -3
- package/build/typescript/commonjs/utils/useUpdateOnHMR.d.ts.map +1 -1
- package/build/typescript/commonjs/widgets/server-credentials.d.ts +8 -0
- package/build/typescript/commonjs/widgets/server-credentials.d.ts.map +1 -1
- package/build/typescript/commonjs/widgets/server-update.d.ts +64 -0
- package/build/typescript/commonjs/widgets/server-update.d.ts.map +1 -0
- package/build/typescript/module/events.d.ts +7 -0
- package/build/typescript/module/events.d.ts.map +1 -1
- package/build/typescript/module/index.d.ts +3 -0
- package/build/typescript/module/index.d.ts.map +1 -1
- package/build/typescript/module/live-activity/api.d.ts +7 -0
- package/build/typescript/module/live-activity/api.d.ts.map +1 -1
- package/build/typescript/module/live-activity/dynamic-api.d.ts +54 -0
- package/build/typescript/module/live-activity/dynamic-api.d.ts.map +1 -0
- package/build/typescript/module/native/NativeVoltra.d.ts +20 -0
- package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -1
- package/build/typescript/module/types.d.ts +1 -1
- package/build/typescript/module/types.d.ts.map +1 -1
- package/build/typescript/module/utils/enableDynamicLiveActivityHotReload.d.ts +15 -0
- package/build/typescript/module/utils/enableDynamicLiveActivityHotReload.d.ts.map +1 -0
- package/build/typescript/module/utils/enableWidgetHotReload.d.ts +5 -7
- package/build/typescript/module/utils/enableWidgetHotReload.d.ts.map +1 -1
- package/build/typescript/module/utils/useUpdateOnHMR.d.ts +0 -3
- package/build/typescript/module/utils/useUpdateOnHMR.d.ts.map +1 -1
- package/build/typescript/module/widgets/server-credentials.d.ts +8 -0
- package/build/typescript/module/widgets/server-credentials.d.ts.map +1 -1
- package/build/typescript/module/widgets/server-update.d.ts +64 -0
- package/build/typescript/module/widgets/server-update.d.ts.map +1 -0
- package/expo-plugin/build/cjs/constants.js +20 -1
- package/expo-plugin/build/cjs/constants.js.map +1 -1
- package/expo-plugin/build/cjs/index.js +6 -0
- package/expo-plugin/build/cjs/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios/index.js +1 -0
- package/expo-plugin/build/cjs/ios/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios/infoPlist.js +28 -5
- package/expo-plugin/build/cjs/ios/infoPlist.js.map +1 -1
- package/expo-plugin/build/cjs/ios/serverUpdate.js +25 -0
- package/expo-plugin/build/cjs/ios/serverUpdate.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/clientRendered.js +4 -4
- package/expo-plugin/build/cjs/ios-widget/clientRendered.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js +5 -5
- package/expo-plugin/build/cjs/ios-widget/clientRenderedPrerender.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/dynamic-live-activity/swift.js +130 -0
- package/expo-plugin/build/cjs/ios-widget/dynamic-live-activity/swift.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/index.js +9 -2
- package/expo-plugin/build/cjs/ios-widget/files/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js +6 -3
- package/expo-plugin/build/cjs/ios-widget/files/infoPlist.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/files/manifest.js +24 -0
- package/expo-plugin/build/cjs/ios-widget/files/manifest.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/files/swift-utils.js +7 -0
- package/expo-plugin/build/cjs/ios-widget/files/swift-utils.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/files/swift.js +56 -26
- package/expo-plugin/build/cjs/ios-widget/files/swift.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/index.js +9 -3
- package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/widgetPlist.js +34 -22
- package/expo-plugin/build/cjs/ios-widget/widgetPlist.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +51 -11
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js +21 -5
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -1
- package/expo-plugin/build/cjs/utils/urlScheme.js +36 -14
- package/expo-plugin/build/cjs/utils/urlScheme.js.map +1 -1
- package/expo-plugin/build/cjs/validation.js +54 -0
- package/expo-plugin/build/cjs/validation.js.map +1 -1
- package/expo-plugin/build/esm/constants.js +17 -0
- package/expo-plugin/build/esm/constants.js.map +1 -1
- package/expo-plugin/build/esm/index.js +6 -0
- package/expo-plugin/build/esm/index.js.map +1 -1
- package/expo-plugin/build/esm/ios/index.js +1 -0
- package/expo-plugin/build/esm/ios/index.js.map +1 -1
- package/expo-plugin/build/esm/ios/infoPlist.js +28 -5
- package/expo-plugin/build/esm/ios/infoPlist.js.map +1 -1
- package/expo-plugin/build/esm/ios/serverUpdate.js +21 -0
- package/expo-plugin/build/esm/ios/serverUpdate.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/clientRendered.js +5 -5
- package/expo-plugin/build/esm/ios-widget/clientRendered.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js +6 -6
- package/expo-plugin/build/esm/ios-widget/clientRenderedPrerender.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/dynamic-live-activity/swift.js +122 -0
- package/expo-plugin/build/esm/ios-widget/dynamic-live-activity/swift.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/index.js +10 -3
- package/expo-plugin/build/esm/ios-widget/files/index.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/files/infoPlist.js +6 -3
- package/expo-plugin/build/esm/ios-widget/files/infoPlist.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/files/manifest.js +23 -1
- package/expo-plugin/build/esm/ios-widget/files/manifest.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/files/swift-utils.js +4 -0
- package/expo-plugin/build/esm/ios-widget/files/swift-utils.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/files/swift.js +50 -20
- package/expo-plugin/build/esm/ios-widget/files/swift.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/index.js +9 -3
- package/expo-plugin/build/esm/ios-widget/index.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/widgetPlist.js +34 -22
- package/expo-plugin/build/esm/ios-widget/widgetPlist.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +51 -11
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/index.js +21 -5
- package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -1
- package/expo-plugin/build/esm/utils/urlScheme.js +34 -14
- package/expo-plugin/build/esm/utils/urlScheme.js.map +1 -1
- package/expo-plugin/build/esm/validation.js +54 -1
- package/expo-plugin/build/esm/validation.js.map +1 -1
- package/expo-plugin/build/types/constants.d.ts +10 -1
- package/expo-plugin/build/types/constants.d.ts.map +1 -1
- package/expo-plugin/build/types/index.d.ts +1 -1
- package/expo-plugin/build/types/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios/index.d.ts +2 -0
- package/expo-plugin/build/types/ios/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios/infoPlist.d.ts +2 -0
- package/expo-plugin/build/types/ios/infoPlist.d.ts.map +1 -1
- package/expo-plugin/build/types/ios/serverUpdate.d.ts +11 -0
- package/expo-plugin/build/types/ios/serverUpdate.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/clientRendered.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/clientRenderedPrerender.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/dynamic-live-activity/swift.d.ts +7 -0
- package/expo-plugin/build/types/ios-widget/dynamic-live-activity/swift.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/index.d.ts +3 -1
- package/expo-plugin/build/types/ios-widget/files/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts +2 -1
- package/expo-plugin/build/types/ios-widget/files/infoPlist.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/files/manifest.d.ts +9 -2
- package/expo-plugin/build/types/ios-widget/files/manifest.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/files/swift-utils.d.ts +2 -0
- package/expo-plugin/build/types/ios-widget/files/swift-utils.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/files/swift.d.ts +6 -2
- package/expo-plugin/build/types/ios-widget/files/swift.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/index.d.ts +3 -1
- package/expo-plugin/build/types/ios-widget/index.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 +3 -1
- 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 -1
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -1
- package/expo-plugin/build/types/types.d.ts +23 -4
- package/expo-plugin/build/types/types.d.ts.map +1 -1
- package/expo-plugin/build/types/utils/urlScheme.d.ts +16 -0
- package/expo-plugin/build/types/utils/urlScheme.d.ts.map +1 -1
- package/expo-plugin/build/types/validation.d.ts +2 -1
- package/expo-plugin/build/types/validation.d.ts.map +1 -1
- package/expo-plugin/src/constants.ts +24 -1
- package/expo-plugin/src/index.ts +9 -0
- package/expo-plugin/src/ios/index.ts +3 -0
- package/expo-plugin/src/ios/infoPlist.ts +33 -5
- package/expo-plugin/src/ios/serverUpdate.ts +29 -0
- package/expo-plugin/src/ios-widget/clientRendered.ts +9 -5
- package/expo-plugin/src/ios-widget/clientRenderedPrerender.ts +11 -6
- package/expo-plugin/src/ios-widget/dynamic-live-activity/swift.ts +138 -0
- package/expo-plugin/src/ios-widget/files/index.ts +15 -4
- package/expo-plugin/src/ios-widget/files/infoPlist.ts +17 -3
- package/expo-plugin/src/ios-widget/files/manifest.ts +42 -2
- package/expo-plugin/src/ios-widget/files/swift-utils.ts +3 -0
- package/expo-plugin/src/ios-widget/files/swift.ts +69 -22
- package/expo-plugin/src/ios-widget/index.ts +13 -3
- package/expo-plugin/src/ios-widget/widgetPlist.ts +37 -23
- package/expo-plugin/src/ios-widget/xcode/__snapshots__/applyXcodeChanges.node.test.ts.snap +34 -28
- package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +59 -12
- package/expo-plugin/src/ios-widget/xcode/index.ts +23 -6
- package/expo-plugin/src/types.ts +28 -4
- package/expo-plugin/src/utils/urlScheme.ts +47 -17
- package/expo-plugin/src/validation.ts +76 -1
- package/ios/Package.swift +32 -3
- package/ios/VoltraWidget.podspec +1 -0
- package/ios/app/NativeVoltra.mm +107 -7
- package/ios/app/VoltraLiveActivityManager.swift +30 -0
- package/ios/app/VoltraLiveActivityService.swift +77 -5
- package/ios/app/VoltraModule.swift +99 -1
- package/ios/app/VoltraModuleImpl.swift +100 -2
- package/ios/app/VoltraViewComponentView.mm +3 -3
- package/ios/app/VoltraWidgetService.swift +147 -12
- package/ios/app/dynamic-live-activity/VoltraDynamicLiveActivityService.swift +97 -0
- package/ios/app/dynamic-live-activity/VoltraLiveActivityChronology.swift +68 -0
- package/ios/shared/DynamicWidgetPropsStore.swift +73 -6
- package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerFetchResolver.swift +34 -0
- package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerProps.swift +55 -0
- package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerPropsStore.swift +146 -0
- package/ios/shared/DynamicWidgetServerUpdate/DynamicWidgetServerUpdateRunner.swift +193 -0
- package/ios/shared/ServerWidgetContentResolver.swift +60 -0
- package/ios/shared/ServerWidgetResponseStore.swift +25 -0
- package/ios/shared/ShortNames.swift +6 -0
- package/ios/shared/VoltraConfig.swift +41 -0
- package/ios/shared/VoltraConstants.swift +15 -0
- package/ios/shared/VoltraElement.swift +127 -43
- package/ios/shared/VoltraEventBus.swift +52 -7
- package/ios/shared/VoltraJSRenderer.swift +90 -22
- package/ios/shared/VoltraNode.swift +1 -109
- package/ios/shared/VoltraRefreshIntent.swift +1 -1
- package/ios/shared/VoltraWidgetKind.swift +41 -0
- package/ios/shared/VoltraWidgetServerFetcher.swift +52 -107
- package/ios/shared/WidgetServer/VoltraWidgetAppearance.swift +17 -0
- package/ios/shared/WidgetServer/VoltraWidgetServer.swift +138 -0
- package/ios/shared/WidgetServer/WidgetCanonicalConfiguration.swift +77 -0
- package/ios/shared/WidgetServer/WidgetScope.swift +55 -0
- package/ios/shared/WidgetServer/WidgetServerEtagStore.swift +55 -0
- package/ios/shared/WidgetServer/WidgetServerFetcher.swift +179 -0
- package/ios/shared/WidgetServer/WidgetServerRequestBuilder.swift +114 -0
- package/ios/shared/WidgetServer/WidgetServerSettingsCodec.swift +47 -0
- package/ios/shared/WidgetServer/WidgetServerSettingsResolver.swift +129 -0
- package/ios/shared/WidgetServer/WidgetServerSettingsStore.swift +170 -0
- package/ios/shared/WidgetServer/WidgetServerSettingsValidator.swift +73 -0
- package/ios/shared/WidgetServer/WidgetServerUpdateSettings.swift +123 -0
- package/ios/shared/WidgetServer/WidgetServerUpdateSettingsJson.swift +115 -0
- package/ios/shared/dynamic-live-activity/DynamicLiveActivityPropsCodec.swift +13 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityBundleSource.swift +156 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityObserver.swift +97 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityOperations.swift +105 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityPayloadValidator.swift +55 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRegistry.swift +143 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderFailureQueue.swift +158 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderFailureReporter.swift +120 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityRenderer.swift +370 -0
- package/ios/shared/dynamic-live-activity/VoltraDynamicLiveActivityTypes.swift +87 -0
- package/ios/shared/dynamic-live-activity/VoltraLiveActivityOrder.swift +19 -0
- package/ios/target/VoltraClientWidgetRuntime.swift +44 -6
- package/ios/target/VoltraDynamicWidgetServerUpdateProvider.swift +204 -0
- package/ios/target/VoltraHomeWidget.swift +85 -90
- package/ios/ui/Extensions/VoltraNode+View.swift +113 -0
- package/ios/ui/Generated/Parameters/ChartParameters.swift +3 -0
- package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +2 -2
- package/ios/ui/Views/VoltraChart.swift +108 -0
- package/package.json +4 -4
- package/src/events.ts +34 -0
- package/src/index.ts +22 -0
- package/src/live-activity/api.ts +2 -2
- package/src/live-activity/dynamic-api.ts +240 -0
- package/src/native/NativeVoltra.ts +21 -0
- package/src/types.ts +4 -0
- package/src/utils/enableDynamicLiveActivityHotReload.ts +50 -0
- package/src/utils/enableWidgetHotReload.ts +9 -16
- package/src/utils/useUpdateOnHMR.ts +3 -12
- package/src/widgets/server-credentials.ts +8 -0
- package/src/widgets/server-update.ts +84 -0
- /package/ios/shared/{VoltraKeychainHelper.swift → WidgetServer/VoltraKeychainHelper.swift} +0 -0
|
@@ -11,16 +11,24 @@ import {
|
|
|
11
11
|
type WidgetLabel,
|
|
12
12
|
} from '@use-voltra/expo-plugin'
|
|
13
13
|
|
|
14
|
-
import { DEFAULT_WIDGET_FAMILIES, WIDGET_FAMILY_MAP } from '../../constants'
|
|
15
|
-
import type { IOSWidgetConfig } from '../../types'
|
|
14
|
+
import { DEFAULT_WIDGET_FAMILIES, WIDGET_FAMILY_MAP, widgetKind } from '../../constants'
|
|
15
|
+
import type { IOSDynamicLiveActivityConfig, IOSWidgetConfig } from '../../types'
|
|
16
16
|
import { VOLTRA_WIDGET_STRINGS_BASENAME } from '../../utils/fileDiscovery'
|
|
17
17
|
import { detectClientRenderedWidgets, type DetectedIOSWidget } from '../clientRendered'
|
|
18
18
|
import { prerenderClientRenderedWidgets } from '../clientRenderedPrerender'
|
|
19
|
+
import {
|
|
20
|
+
generateDynamicLiveActivitiesSwift,
|
|
21
|
+
generateDynamicLiveActivityTypesSwift,
|
|
22
|
+
generateDynamicLiveActivityWidgetInstances,
|
|
23
|
+
} from '../dynamic-live-activity/swift'
|
|
24
|
+
|
|
25
|
+
import { escapeForSwiftStringLiteral } from './swift-utils'
|
|
19
26
|
|
|
20
27
|
export interface GenerateSwiftFilesOptions {
|
|
21
28
|
targetPath: string
|
|
22
29
|
projectRoot: string
|
|
23
30
|
widgets?: IOSWidgetConfig[]
|
|
31
|
+
liveActivities?: IOSDynamicLiveActivityConfig[]
|
|
24
32
|
}
|
|
25
33
|
|
|
26
34
|
type RenderWidgetToString = (variants: unknown) => string
|
|
@@ -37,7 +45,7 @@ type RenderWidgetToString = (variants: unknown) => string
|
|
|
37
45
|
* - VoltraWidgetBundle.swift (widget bundle definition)
|
|
38
46
|
*/
|
|
39
47
|
export async function generateSwiftFiles(options: GenerateSwiftFilesOptions): Promise<void> {
|
|
40
|
-
const { targetPath, projectRoot, widgets } = options
|
|
48
|
+
const { targetPath, projectRoot, widgets, liveActivities } = options
|
|
41
49
|
|
|
42
50
|
// Dynamic import keeps the plugin CommonJS-compatible while resolving the current package entry.
|
|
43
51
|
const serverModuleId = '@use-voltra/ios/server'
|
|
@@ -59,7 +67,7 @@ export async function generateSwiftFiles(options: GenerateSwiftFilesOptions): Pr
|
|
|
59
67
|
// stringify). Both produce entries in the same map shape so
|
|
60
68
|
// VoltraWidgetInitialStates.swift can read either via the same lookup at runtime.
|
|
61
69
|
const serverWidgets = detectedWidgets.filter((w) => !w.clientRendered)
|
|
62
|
-
const serverStates = await prerenderWidgetState(serverWidgets, projectRoot, renderWidgetToString)
|
|
70
|
+
const serverStates = await prerenderWidgetState(serverWidgets, projectRoot, renderWidgetToString, 'ios')
|
|
63
71
|
const clientStates = await prerenderClientRenderedWidgets(detectedWidgets, projectRoot)
|
|
64
72
|
const prerenderedStates = new Map([...serverStates, ...clientStates])
|
|
65
73
|
|
|
@@ -76,12 +84,24 @@ export async function generateSwiftFiles(options: GenerateSwiftFilesOptions): Pr
|
|
|
76
84
|
|
|
77
85
|
// Generate the widget bundle Swift file
|
|
78
86
|
const widgetBundleContent =
|
|
79
|
-
detectedWidgets.length > 0
|
|
87
|
+
detectedWidgets.length > 0 || (liveActivities?.length ?? 0) > 0
|
|
88
|
+
? generateWidgetBundleSwift(detectedWidgets, liveActivities ?? [])
|
|
89
|
+
: generateDefaultWidgetBundleSwift()
|
|
80
90
|
|
|
81
91
|
const widgetBundlePath = path.join(targetPath, 'VoltraWidgetBundle.swift')
|
|
82
92
|
fs.writeFileSync(widgetBundlePath, widgetBundleContent)
|
|
83
93
|
|
|
84
94
|
logger.info(`Generated VoltraWidgetBundle.swift with ${widgets?.length ?? 0} home screen widgets`)
|
|
95
|
+
|
|
96
|
+
fs.writeFileSync(
|
|
97
|
+
path.join(targetPath, 'VoltraDynamicLiveActivityTypes.swift'),
|
|
98
|
+
generateDynamicLiveActivityTypesSwift(liveActivities ?? [])
|
|
99
|
+
)
|
|
100
|
+
fs.writeFileSync(
|
|
101
|
+
path.join(targetPath, 'VoltraDynamicLiveActivities.swift'),
|
|
102
|
+
generateDynamicLiveActivitiesSwift(liveActivities ?? [])
|
|
103
|
+
)
|
|
104
|
+
logger.info(`Generated Dynamic Live Activity Swift scaffolding with ${liveActivities?.length ?? 0} definition(s)`)
|
|
85
105
|
}
|
|
86
106
|
|
|
87
107
|
const GENERATED_INITIAL_STATE_LOCALE_HELPER = dedent`
|
|
@@ -155,10 +175,6 @@ const GENERATED_INITIAL_STATE_LOCALE_HELPER = dedent`
|
|
|
155
175
|
// https://developer.apple.com/documentation/foundation/localizedstringresource
|
|
156
176
|
// ============================================================================
|
|
157
177
|
|
|
158
|
-
function escapeForSwiftStringLiteral(s: string): string {
|
|
159
|
-
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r')
|
|
160
|
-
}
|
|
161
|
-
|
|
162
178
|
function escapeDotStringsValue(s: string): string {
|
|
163
179
|
return escapeForSwiftStringLiteral(s)
|
|
164
180
|
}
|
|
@@ -285,6 +301,12 @@ function iosWidgetGalleryLabelSwiftExpr(
|
|
|
285
301
|
* - Dynamic Widget → `VoltraClientWidgetProvider` + `VoltraClientWidgetContentView`
|
|
286
302
|
* (the content view internally renders via VoltraHomeWidgetView so the UI layer is
|
|
287
303
|
* identical to the fallback state path — see VoltraClientWidgetRuntime.swift)
|
|
304
|
+
* - Dynamic Widget with a `serverUpdate` → `VoltraDynamicWidgetServerUpdateProvider`, which wraps
|
|
305
|
+
* the one above and adds the fetch, the commit and the schedule
|
|
306
|
+
*
|
|
307
|
+
* `entry` picks the render engine and `serverUpdate` picks where the data comes from, so the two
|
|
308
|
+
* keys together select one of four providers. Runtime code never asks "is this server-driven?" —
|
|
309
|
+
* the answer is baked in here, once, at generate time.
|
|
288
310
|
*/
|
|
289
311
|
function widgetUsesAppIntent(widget: DetectedIOSWidget): boolean {
|
|
290
312
|
return widget.clientRendered && !!widget.appIntent && widget.appIntent.parameters.length > 0
|
|
@@ -306,9 +328,13 @@ function generateWidgetStruct(widget: DetectedIOSWidget): string {
|
|
|
306
328
|
const displayNameExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'displayName', widget.displayName)
|
|
307
329
|
const descriptionExpr = iosWidgetGalleryLabelSwiftExpr(widget.id, 'description', widget.description)
|
|
308
330
|
|
|
331
|
+
const clientProviderName = widget.serverUpdate
|
|
332
|
+
? 'VoltraDynamicWidgetServerUpdateProvider'
|
|
333
|
+
: 'VoltraClientWidgetProvider'
|
|
334
|
+
|
|
309
335
|
const providerAndContent = widget.clientRendered
|
|
310
336
|
? dedent`
|
|
311
|
-
provider:
|
|
337
|
+
provider: ${clientProviderName}(
|
|
312
338
|
widgetId: widgetId,
|
|
313
339
|
initialState: VoltraWidgetInitialStates.getInitialState(for: widgetId)
|
|
314
340
|
)
|
|
@@ -335,7 +361,7 @@ function generateWidgetStruct(widget: DetectedIOSWidget): string {
|
|
|
335
361
|
|
|
336
362
|
public var body: some WidgetConfiguration {
|
|
337
363
|
StaticConfiguration(
|
|
338
|
-
kind: "
|
|
364
|
+
kind: "${widgetKind(widget)}",
|
|
339
365
|
${providerAndContent}
|
|
340
366
|
.configurationDisplayName(${displayNameExpr})
|
|
341
367
|
.description(${descriptionExpr})
|
|
@@ -377,6 +403,18 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
|
|
|
377
403
|
const initBody = params.map((p) => ` self.${p.name} = ${p.name}`).join('\n')
|
|
378
404
|
const configuredDict = dictLiteral(params.map((p) => `"${p.name}": configuration.${p.name}`))
|
|
379
405
|
const defaultDict = dictLiteral(params.map((p) => `"${p.name}": ${swiftDefault(p)}`))
|
|
406
|
+
// A server-driven Dynamic Widget fetches on every timeline request and schedules the next one
|
|
407
|
+
// from its resolved interval; a plain one has nothing to ask again for, so its policy is .never.
|
|
408
|
+
const appIntentTimelineBody = widget.serverUpdate
|
|
409
|
+
? dedent`
|
|
410
|
+
return await VoltraDynamicWidgetServerUpdateProvider.timeline(
|
|
411
|
+
widgetId: widgetId,
|
|
412
|
+
family: context.family,
|
|
413
|
+
configuration: ${configuredDict}
|
|
414
|
+
)`
|
|
415
|
+
: dedent`
|
|
416
|
+
let entry = await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
|
|
417
|
+
return Timeline(entries: [entry], policy: .never)`
|
|
380
418
|
|
|
381
419
|
return dedent`
|
|
382
420
|
// MARK: - Client-rendered AppIntent widget: ${widget.id}
|
|
@@ -408,9 +446,8 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
|
|
|
408
446
|
await VoltraClientWidgetProvider.loadEntry(widgetId: widgetId, configuration: ${configuredDict})
|
|
409
447
|
}
|
|
410
448
|
|
|
411
|
-
func timeline(for configuration: ${intentName}, in
|
|
412
|
-
|
|
413
|
-
return Timeline(entries: [entry], policy: .never)
|
|
449
|
+
func timeline(for configuration: ${intentName}, in context: Context) async -> Timeline<VoltraClientWidgetEntry> {
|
|
450
|
+
${appIntentTimelineBody}
|
|
414
451
|
}
|
|
415
452
|
}
|
|
416
453
|
|
|
@@ -422,7 +459,7 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
|
|
|
422
459
|
|
|
423
460
|
public var body: some WidgetConfiguration {
|
|
424
461
|
AppIntentConfiguration(
|
|
425
|
-
kind: "
|
|
462
|
+
kind: "${widgetKind(widget)}",
|
|
426
463
|
intent: ${intentName}.self,
|
|
427
464
|
provider: ${providerName}()
|
|
428
465
|
) { entry in
|
|
@@ -443,7 +480,10 @@ function generateClientAppIntentWidgetCode(widget: DetectedIOSWidget): string {
|
|
|
443
480
|
/**
|
|
444
481
|
* Generates the VoltraWidgetBundle.swift file content with configured widgets
|
|
445
482
|
*/
|
|
446
|
-
function generateWidgetBundleSwift(
|
|
483
|
+
function generateWidgetBundleSwift(
|
|
484
|
+
widgets: DetectedIOSWidget[],
|
|
485
|
+
liveActivities: IOSDynamicLiveActivityConfig[] = []
|
|
486
|
+
): string {
|
|
447
487
|
// Generate widget structs
|
|
448
488
|
const widgetStructs = widgets.map((w) => generateWidgetStruct(w)).join('\n\n')
|
|
449
489
|
|
|
@@ -457,7 +497,12 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
|
|
|
457
497
|
.map((w) => `VoltraWidget_${w.id}()`)
|
|
458
498
|
.join('\n ')}\n }`
|
|
459
499
|
: ''
|
|
460
|
-
const
|
|
500
|
+
const dynamicLiveActivityInstances = generateDynamicLiveActivityWidgetInstances(liveActivities)
|
|
501
|
+
const widgetInstances = [plainInstances, appIntentInstances, dynamicLiveActivityInstances]
|
|
502
|
+
.filter(Boolean)
|
|
503
|
+
.join('\n ')
|
|
504
|
+
const widgetSectionTitle =
|
|
505
|
+
liveActivities.length > 0 ? 'Home Screen Widgets and Dynamic Live Activities' : 'Home Screen Widgets'
|
|
461
506
|
|
|
462
507
|
const needsFoundation = widgets.some(widgetUsesGalleryLocalization)
|
|
463
508
|
const foundationImport = needsFoundation ? 'import Foundation\n' : ''
|
|
@@ -473,7 +518,7 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
|
|
|
473
518
|
|
|
474
519
|
${foundationImport}${appIntentsImport}import SwiftUI
|
|
475
520
|
import WidgetKit
|
|
476
|
-
import
|
|
521
|
+
import VoltraRuntime
|
|
477
522
|
|
|
478
523
|
@main
|
|
479
524
|
struct VoltraWidgetBundle: WidgetBundle {
|
|
@@ -481,7 +526,7 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
|
|
|
481
526
|
// Live Activity (with Watch/CarPlay support)
|
|
482
527
|
VoltraWidget()
|
|
483
528
|
|
|
484
|
-
//
|
|
529
|
+
// ${widgetSectionTitle}
|
|
485
530
|
${widgetInstances}
|
|
486
531
|
}
|
|
487
532
|
}
|
|
@@ -493,8 +538,8 @@ function generateWidgetBundleSwift(widgets: DetectedIOSWidget[]): string {
|
|
|
493
538
|
}
|
|
494
539
|
|
|
495
540
|
/**
|
|
496
|
-
* Generates the VoltraWidgetBundle.swift file content when no widgets
|
|
497
|
-
*
|
|
541
|
+
* Generates the VoltraWidgetBundle.swift file content when no Home Screen widgets or Dynamic
|
|
542
|
+
* Live Activities are configured. Keep this legacy output stable for existing projects.
|
|
498
543
|
*/
|
|
499
544
|
function generateDefaultWidgetBundleSwift(): string {
|
|
500
545
|
return dedent`
|
|
@@ -507,7 +552,7 @@ function generateDefaultWidgetBundleSwift(): string {
|
|
|
507
552
|
|
|
508
553
|
import SwiftUI
|
|
509
554
|
import WidgetKit
|
|
510
|
-
import
|
|
555
|
+
import VoltraRuntime // Import Voltra widgets
|
|
511
556
|
|
|
512
557
|
@main
|
|
513
558
|
struct VoltraWidgetBundle: WidgetBundle {
|
|
@@ -624,4 +669,6 @@ function getSwiftRawStringDelimiter(str: string): string {
|
|
|
624
669
|
export const __test__ = {
|
|
625
670
|
generateInitialStatesSwift,
|
|
626
671
|
generateWidgetBundleSwift,
|
|
672
|
+
generateDynamicLiveActivityTypesSwift,
|
|
673
|
+
generateDynamicLiveActivitiesSwift,
|
|
627
674
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ConfigPlugin, withPlugins } from '@expo/config-plugins'
|
|
2
2
|
|
|
3
|
-
import type { IOSWidgetConfig } from '../types'
|
|
3
|
+
import type { IOSDynamicLiveActivityConfig, IOSWidgetConfig } from '../types'
|
|
4
4
|
import { configureEasBuild } from './eas'
|
|
5
5
|
import { generateWidgetExtensionFiles } from './files'
|
|
6
6
|
import { withFonts } from './fonts'
|
|
@@ -13,11 +13,13 @@ export interface WithIOSProps {
|
|
|
13
13
|
bundleIdentifier: string
|
|
14
14
|
deploymentTarget: string
|
|
15
15
|
widgets?: IOSWidgetConfig[]
|
|
16
|
+
liveActivities?: IOSDynamicLiveActivityConfig[]
|
|
16
17
|
groupIdentifier?: string
|
|
17
18
|
keychainGroup?: string
|
|
18
19
|
fonts?: string[]
|
|
19
20
|
version: string
|
|
20
21
|
buildNumber: string
|
|
22
|
+
voltraVersion: string
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
/**
|
|
@@ -42,11 +44,13 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
|
|
|
42
44
|
bundleIdentifier,
|
|
43
45
|
deploymentTarget,
|
|
44
46
|
widgets,
|
|
47
|
+
liveActivities,
|
|
45
48
|
groupIdentifier,
|
|
46
49
|
keychainGroup,
|
|
47
50
|
fonts,
|
|
48
51
|
version,
|
|
49
52
|
buildNumber,
|
|
53
|
+
voltraVersion,
|
|
50
54
|
} = props
|
|
51
55
|
|
|
52
56
|
const plugins: [ConfigPlugin<any>, any][] = [
|
|
@@ -54,7 +58,10 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
|
|
|
54
58
|
...(fonts && fonts.length > 0 ? [[withFonts, { fonts, targetName }] as [ConfigPlugin<any>, any]] : []),
|
|
55
59
|
|
|
56
60
|
// 2. Configure Xcode project (creates the target - must run before fonts mod executes)
|
|
57
|
-
[
|
|
61
|
+
[
|
|
62
|
+
configureXcodeProject,
|
|
63
|
+
{ targetName, bundleIdentifier, deploymentTarget, widgets, liveActivities, version, buildNumber },
|
|
64
|
+
],
|
|
58
65
|
|
|
59
66
|
// 3. Configure Podfile for widget extension target
|
|
60
67
|
[configurePodfile, { targetName }],
|
|
@@ -66,7 +73,10 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
|
|
|
66
73
|
[configureEasBuild, { targetName, bundleIdentifier, groupIdentifier }],
|
|
67
74
|
|
|
68
75
|
// 6. Generate widget extension files (dangerous mod should run before plist patchers)
|
|
69
|
-
[
|
|
76
|
+
[
|
|
77
|
+
generateWidgetExtensionFiles,
|
|
78
|
+
{ targetName, widgets, liveActivities, groupIdentifier, keychainGroup, version, buildNumber, voltraVersion },
|
|
79
|
+
],
|
|
70
80
|
]
|
|
71
81
|
|
|
72
82
|
return withPlugins(config, plugins)
|
|
@@ -3,9 +3,12 @@ import plist from '@expo/plist'
|
|
|
3
3
|
import { existsSync, readFileSync, writeFileSync } from 'fs'
|
|
4
4
|
import { join as joinPath } from 'path'
|
|
5
5
|
|
|
6
|
+
import { widgetKindOverrides } from '../constants'
|
|
6
7
|
import type { IOSWidgetConfig } from '../types'
|
|
7
8
|
import { detectClientRenderedWidgets } from './clientRendered'
|
|
8
9
|
import { logger } from '@use-voltra/expo-plugin'
|
|
10
|
+
import { resolveIOSWidgetServerUpdate } from '../ios/serverUpdate'
|
|
11
|
+
import { appendMissingURLSchemes, getAppURLSchemes } from '../utils/urlScheme'
|
|
9
12
|
|
|
10
13
|
export interface ConfigureMainAppPlistProps {
|
|
11
14
|
targetName: string
|
|
@@ -35,9 +38,9 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
|
|
|
35
38
|
return config
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
const
|
|
41
|
+
const schemes = getAppURLSchemes(expoConfig)
|
|
39
42
|
|
|
40
|
-
if (
|
|
43
|
+
if (schemes.length > 0) {
|
|
41
44
|
const targetPath = joinPath(config.modRequest.platformProjectRoot, targetName)
|
|
42
45
|
const filePath = joinPath(targetPath, 'Info.plist')
|
|
43
46
|
if (!existsSync(filePath)) {
|
|
@@ -78,20 +81,8 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
|
|
|
78
81
|
|
|
79
82
|
// Keep URL schemes in the widget extension so Live Activity links can be resolved
|
|
80
83
|
// from relative to absolute URLs (see VoltraDeepLinkResolver.swift).
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
(t) => Array.isArray(t?.CFBundleURLSchemes) && t.CFBundleURLSchemes.includes(scheme)
|
|
84
|
-
)
|
|
85
|
-
if (!hasScheme) {
|
|
86
|
-
content.CFBundleURLTypes = [
|
|
87
|
-
...existingTypes,
|
|
88
|
-
{
|
|
89
|
-
CFBundleURLSchemes: [scheme],
|
|
90
|
-
},
|
|
91
|
-
]
|
|
92
|
-
} else {
|
|
93
|
-
content.CFBundleURLTypes = existingTypes
|
|
94
|
-
}
|
|
84
|
+
// Uses the same scheme list as the app, so a relative link resolves to the app's first scheme.
|
|
85
|
+
content.CFBundleURLTypes = appendMissingURLSchemes((content.CFBundleURLTypes as any[]) || [], schemes)
|
|
95
86
|
|
|
96
87
|
// Only set group identifier if provided
|
|
97
88
|
if (groupIdentifier) {
|
|
@@ -105,18 +96,31 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
|
|
|
105
96
|
const serverRefresh: Record<string, boolean> = {}
|
|
106
97
|
|
|
107
98
|
for (const widget of widgets) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
99
|
+
const serverUpdate = resolveIOSWidgetServerUpdate(widget)
|
|
100
|
+
|
|
101
|
+
if (!serverUpdate) {
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Every server-driven widget gets an interval, so this dictionary's keys are the set
|
|
106
|
+
// of server-driven widget ids. A URL is written only when app.json set one.
|
|
107
|
+
serverIntervals[widget.id] = serverUpdate.intervalMinutes
|
|
108
|
+
|
|
109
|
+
if (serverUpdate.url !== undefined) {
|
|
110
|
+
serverUrls[widget.id] = serverUpdate.url
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (serverUpdate.refresh) {
|
|
114
|
+
serverRefresh[widget.id] = true
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
|
|
118
|
+
if (Object.keys(serverIntervals).length > 0) {
|
|
119
|
+
;(content as any)['Voltra_WidgetServerIntervals'] = serverIntervals
|
|
120
|
+
}
|
|
121
|
+
|
|
117
122
|
if (Object.keys(serverUrls).length > 0) {
|
|
118
123
|
;(content as any)['Voltra_WidgetServerUrls'] = serverUrls
|
|
119
|
-
;(content as any)['Voltra_WidgetServerIntervals'] = serverIntervals
|
|
120
124
|
}
|
|
121
125
|
|
|
122
126
|
if (Object.keys(serverRefresh).length > 0) {
|
|
@@ -124,6 +128,16 @@ export const configureWidgetExtensionPlist: ConfigPlugin<ConfigureMainAppPlistPr
|
|
|
124
128
|
}
|
|
125
129
|
}
|
|
126
130
|
|
|
131
|
+
// Custom widget kinds, so the extension maps ids to kinds too (see VoltraWidgetKind.swift).
|
|
132
|
+
// Deleted when no widget pins one, so a `kind` dropped from the config does not linger in
|
|
133
|
+
// an Info.plist that a previous prebuild wrote.
|
|
134
|
+
const widgetKinds = widgetKindOverrides(widgets)
|
|
135
|
+
if (widgetKinds) {
|
|
136
|
+
;(content as any)['Voltra_WidgetKinds'] = widgetKinds
|
|
137
|
+
} else {
|
|
138
|
+
delete (content as any)['Voltra_WidgetKinds']
|
|
139
|
+
}
|
|
140
|
+
|
|
127
141
|
// Add Keychain group for shared credential access
|
|
128
142
|
if (keychainGroup) {
|
|
129
143
|
;(content as any)['Voltra_KeychainGroup'] = keychainGroup
|
|
@@ -13,11 +13,13 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
13
13
|
13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; };
|
|
14
14
|
13B07FC11A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
|
15
15
|
13B07FC21A68108700A75B9A /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB61A68108700A75B9A /* Info.plist */; };
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
F1D000000000000000000010 /* VoltraWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000008 /* VoltraWidget.swift */; };
|
|
17
|
+
F1D000000000000000000011 /* VoltraWidgetInitialStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */; };
|
|
18
|
+
F1D000000000000000000012 /* VoltraDynamicLiveActivityTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */; };
|
|
19
|
+
F1D000000000000000000013 /* VoltraDynamicLiveActivityTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */; };
|
|
18
20
|
F1D000000000000000000006 /* VoltraWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000005 /* VoltraWidgetExtension.appex */; };
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
F1D000000000000000000017 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000D /* Assets.xcassets */; };
|
|
22
|
+
F1D000000000000000000018 /* VoltraWidgets.strings in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000E /* VoltraWidgets.strings */; };
|
|
21
23
|
/* End PBXBuildFile section */
|
|
22
24
|
|
|
23
25
|
/* Begin PBXFileReference section */
|
|
@@ -28,10 +30,11 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
28
30
|
F1D000000000000000000005 /* VoltraWidgetExtension.appex */ = {isa = PBXFileReference; name = "VoltraWidgetExtension.appex"; path = "VoltraWidgetExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; fileEncoding = undefined; lastKnownFileType = undefined; explicitFileType = wrapper.app-extension; includeInIndex = 0; };
|
|
29
31
|
F1D000000000000000000008 /* VoltraWidget.swift */ = {isa = PBXFileReference; name = "VoltraWidget.swift"; path = "VoltraWidget.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
|
|
30
32
|
F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */ = {isa = PBXFileReference; name = "VoltraWidgetInitialStates.swift"; path = "VoltraWidgetInitialStates.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
|
|
31
|
-
F1D00000000000000000000A /*
|
|
32
|
-
F1D00000000000000000000B /* VoltraWidgetExtension
|
|
33
|
-
F1D00000000000000000000C /*
|
|
34
|
-
F1D00000000000000000000D /*
|
|
33
|
+
F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */ = {isa = PBXFileReference; name = "VoltraDynamicLiveActivityTypes.swift"; path = "VoltraDynamicLiveActivityTypes.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
|
|
34
|
+
F1D00000000000000000000B /* VoltraWidgetExtension.entitlements */ = {isa = PBXFileReference; name = "VoltraWidgetExtension.entitlements"; path = "VoltraWidgetExtension.entitlements"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
|
|
35
|
+
F1D00000000000000000000C /* VoltraWidgetExtension-Info.plist */ = {isa = PBXFileReference; name = "VoltraWidgetExtension-Info.plist"; path = "VoltraWidgetExtension-Info.plist"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = text.plist.xml; explicitFileType = undefined; includeInIndex = 0; };
|
|
36
|
+
F1D00000000000000000000D /* Assets.xcassets */ = {isa = PBXFileReference; name = "Assets.xcassets"; path = "Assets.xcassets"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = folder.assetcatalog; explicitFileType = undefined; includeInIndex = 0; };
|
|
37
|
+
F1D00000000000000000000E /* VoltraWidgets.strings */ = {isa = PBXFileReference; name = "VoltraWidgets.strings"; path = "en.lproj/VoltraWidgets.strings"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = text.plist.strings; explicitFileType = undefined; includeInIndex = 0; };
|
|
35
38
|
/* End PBXFileReference section */
|
|
36
39
|
|
|
37
40
|
/* Begin PBXFrameworksBuildPhase section */
|
|
@@ -42,7 +45,7 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
42
45
|
);
|
|
43
46
|
runOnlyForDeploymentPostprocessing = 0;
|
|
44
47
|
};
|
|
45
|
-
|
|
48
|
+
F1D000000000000000000015 /* Frameworks */ = {
|
|
46
49
|
isa = PBXFrameworksBuildPhase;
|
|
47
50
|
buildActionMask = 2147483647;
|
|
48
51
|
files = (
|
|
@@ -88,10 +91,11 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
88
91
|
children = (
|
|
89
92
|
F1D000000000000000000008 /* VoltraWidget.swift */,
|
|
90
93
|
F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */,
|
|
91
|
-
F1D00000000000000000000A /*
|
|
92
|
-
F1D00000000000000000000B /* VoltraWidgetExtension
|
|
93
|
-
F1D00000000000000000000C /*
|
|
94
|
-
F1D00000000000000000000D /*
|
|
94
|
+
F1D00000000000000000000A /* VoltraDynamicLiveActivityTypes.swift */,
|
|
95
|
+
F1D00000000000000000000B /* VoltraWidgetExtension.entitlements */,
|
|
96
|
+
F1D00000000000000000000C /* VoltraWidgetExtension-Info.plist */,
|
|
97
|
+
F1D00000000000000000000D /* Assets.xcassets */,
|
|
98
|
+
F1D00000000000000000000E /* VoltraWidgets.strings */,
|
|
95
99
|
);
|
|
96
100
|
name = VoltraWidgetExtension;
|
|
97
101
|
path = VoltraWidgetExtension;
|
|
@@ -107,12 +111,12 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
107
111
|
13B07F871A680F5B00A75B9A /* Sources */,
|
|
108
112
|
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
|
109
113
|
13B07F8E1A680F5B00A75B9A /* Resources */,
|
|
110
|
-
|
|
114
|
+
F1D000000000000000000014 /* Embed Foundation Extensions */,
|
|
111
115
|
);
|
|
112
116
|
buildRules = (
|
|
113
117
|
);
|
|
114
118
|
dependencies = (
|
|
115
|
-
|
|
119
|
+
F1D000000000000000000019 /* PBXTargetDependency */,
|
|
116
120
|
);
|
|
117
121
|
name = voltraexample;
|
|
118
122
|
productName = voltraexample;
|
|
@@ -127,9 +131,9 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
127
131
|
buildConfigurationList = F1D000000000000000000002;
|
|
128
132
|
productReference = F1D000000000000000000005;
|
|
129
133
|
buildPhases = (
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
134
|
+
F1D00000000000000000000F /* Sources */,
|
|
135
|
+
F1D000000000000000000015 /* Frameworks */,
|
|
136
|
+
F1D000000000000000000016 /* Resources */,
|
|
133
137
|
);
|
|
134
138
|
buildRules = (
|
|
135
139
|
);
|
|
@@ -181,12 +185,12 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
181
185
|
);
|
|
182
186
|
runOnlyForDeploymentPostprocessing = 0;
|
|
183
187
|
};
|
|
184
|
-
|
|
188
|
+
F1D000000000000000000016 /* Resources */ = {
|
|
185
189
|
isa = PBXResourcesBuildPhase;
|
|
186
190
|
buildActionMask = 2147483647;
|
|
187
191
|
files = (
|
|
188
|
-
|
|
189
|
-
|
|
192
|
+
F1D000000000000000000017 /* Assets.xcassets in Resources */,
|
|
193
|
+
F1D000000000000000000018 /* VoltraWidgets.strings in Resources */,
|
|
190
194
|
);
|
|
191
195
|
runOnlyForDeploymentPostprocessing = 0;
|
|
192
196
|
};
|
|
@@ -198,15 +202,17 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
198
202
|
buildActionMask = 2147483647;
|
|
199
203
|
files = (
|
|
200
204
|
13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */,
|
|
205
|
+
F1D000000000000000000013 /* VoltraDynamicLiveActivityTypes.swift in Sources */,
|
|
201
206
|
);
|
|
202
207
|
runOnlyForDeploymentPostprocessing = 0;
|
|
203
208
|
};
|
|
204
|
-
|
|
209
|
+
F1D00000000000000000000F /* Sources */ = {
|
|
205
210
|
isa = PBXSourcesBuildPhase;
|
|
206
211
|
buildActionMask = 2147483647;
|
|
207
212
|
files = (
|
|
208
|
-
|
|
209
|
-
|
|
213
|
+
F1D000000000000000000010 /* VoltraWidget.swift in Sources */,
|
|
214
|
+
F1D000000000000000000011 /* VoltraWidgetInitialStates.swift in Sources */,
|
|
215
|
+
F1D000000000000000000012 /* VoltraDynamicLiveActivityTypes.swift in Sources */,
|
|
210
216
|
);
|
|
211
217
|
runOnlyForDeploymentPostprocessing = 0;
|
|
212
218
|
};
|
|
@@ -320,7 +326,7 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
320
326
|
/* End XCConfigurationList section */
|
|
321
327
|
|
|
322
328
|
/* Begin PBXCopyFilesBuildPhase section */
|
|
323
|
-
|
|
329
|
+
F1D000000000000000000014 /* Embed Foundation Extensions */ = {
|
|
324
330
|
isa = PBXCopyFilesBuildPhase;
|
|
325
331
|
buildActionMask = 2147483647;
|
|
326
332
|
files = (
|
|
@@ -334,15 +340,15 @@ exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the commit
|
|
|
334
340
|
/* End PBXCopyFilesBuildPhase section */
|
|
335
341
|
|
|
336
342
|
/* Begin PBXTargetDependency section */
|
|
337
|
-
|
|
343
|
+
F1D000000000000000000019 /* PBXTargetDependency */ = {
|
|
338
344
|
isa = PBXTargetDependency;
|
|
339
345
|
target = F1D000000000000000000001 /* VoltraWidgetExtension */;
|
|
340
|
-
targetProxy =
|
|
346
|
+
targetProxy = F1D00000000000000000001A /* PBXContainerItemProxy */;
|
|
341
347
|
};
|
|
342
348
|
/* End PBXTargetDependency section */
|
|
343
349
|
|
|
344
350
|
/* Begin PBXContainerItemProxy section */
|
|
345
|
-
|
|
351
|
+
F1D00000000000000000001A /* PBXContainerItemProxy */ = {
|
|
346
352
|
isa = PBXContainerItemProxy;
|
|
347
353
|
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
|
348
354
|
proxyType = 1;
|