@use-voltra/ios-client 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -8
- package/build/commonjs/dynamic-widget/api.js +15 -0
- package/build/commonjs/dynamic-widget/api.js.map +1 -0
- package/build/commonjs/index.js +15 -7
- package/build/commonjs/index.js.map +1 -1
- package/build/commonjs/native/NativeVoltra.js.map +1 -1
- package/build/module/dynamic-widget/api.js +10 -0
- package/build/module/dynamic-widget/api.js.map +1 -0
- package/build/module/index.js +1 -0
- package/build/module/index.js.map +1 -1
- package/build/module/native/NativeVoltra.js.map +1 -1
- package/build/typescript/commonjs/dynamic-widget/api.d.ts +8 -0
- package/build/typescript/commonjs/dynamic-widget/api.d.ts.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/native/NativeVoltra.d.ts +1 -0
- package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -1
- package/build/typescript/module/dynamic-widget/api.d.ts +8 -0
- package/build/typescript/module/dynamic-widget/api.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/native/NativeVoltra.d.ts +1 -0
- package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -1
- package/expo-plugin/build/cjs/index.js +3 -1
- package/expo-plugin/build/cjs/index.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/podfile.js +38 -12
- package/expo-plugin/build/cjs/ios-widget/podfile.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +143 -107
- package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js +30 -22
- package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/fileReferences.js +50 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/fileReferences.js.map +1 -0
- package/expo-plugin/build/cjs/ios-widget/xcode/groups.js +45 -43
- package/expo-plugin/build/cjs/ios-widget/xcode/groups.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js +77 -91
- package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js +41 -39
- package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js +2 -2
- package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js.map +1 -1
- package/expo-plugin/build/cjs/ios-widget/xcode/target.js +29 -63
- package/expo-plugin/build/cjs/ios-widget/xcode/target.js.map +1 -1
- package/expo-plugin/build/esm/index.js +3 -1
- package/expo-plugin/build/esm/index.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/podfile.js +36 -11
- package/expo-plugin/build/esm/ios-widget/podfile.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +143 -106
- package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js +31 -22
- package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/fileReferences.js +45 -0
- package/expo-plugin/build/esm/ios-widget/xcode/fileReferences.js.map +1 -0
- package/expo-plugin/build/esm/ios-widget/xcode/groups.js +45 -42
- package/expo-plugin/build/esm/ios-widget/xcode/groups.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/index.js +81 -96
- package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js +41 -39
- package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/productFile.js +3 -2
- package/expo-plugin/build/esm/ios-widget/xcode/productFile.js.map +1 -1
- package/expo-plugin/build/esm/ios-widget/xcode/target.js +28 -62
- package/expo-plugin/build/esm/ios-widget/xcode/target.js.map +1 -1
- package/expo-plugin/build/types/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/podfile.d.ts +19 -1
- package/expo-plugin/build/types/ios-widget/podfile.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +3 -7
- package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts +15 -10
- package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/fileReferences.d.ts +16 -0
- package/expo-plugin/build/types/ios-widget/xcode/fileReferences.d.ts.map +1 -0
- package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts +0 -4
- package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +22 -3
- package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts +16 -4
- package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts +0 -4
- package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts.map +1 -1
- package/expo-plugin/build/types/ios-widget/xcode/target.d.ts +11 -26
- package/expo-plugin/build/types/ios-widget/xcode/target.d.ts.map +1 -1
- package/expo-plugin/src/index.ts +5 -1
- package/expo-plugin/src/ios-widget/index.ts +1 -1
- package/expo-plugin/src/ios-widget/podfile.ts +46 -13
- package/expo-plugin/src/ios-widget/xcode/__fixtures__/fresh.pbxproj +197 -0
- package/expo-plugin/src/ios-widget/xcode/__fixtures__/with-existing-extension.pbxproj +321 -0
- package/expo-plugin/src/ios-widget/xcode/__fixtures__/with-per-config-signing.pbxproj +203 -0
- package/expo-plugin/src/ios-widget/xcode/__snapshots__/applyXcodeChanges.node.test.ts.snap +357 -0
- package/expo-plugin/src/ios-widget/xcode/__tests__/pbxConsistency.ts +130 -0
- package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +151 -152
- package/expo-plugin/src/ios-widget/xcode/configurationList.ts +52 -35
- package/expo-plugin/src/ios-widget/xcode/fileReferences.ts +51 -0
- package/expo-plugin/src/ios-widget/xcode/groups.ts +52 -54
- package/expo-plugin/src/ios-widget/xcode/index.ts +107 -119
- package/expo-plugin/src/ios-widget/xcode/mainAppSettings.ts +59 -54
- package/expo-plugin/src/ios-widget/xcode/productFile.ts +3 -2
- package/expo-plugin/src/ios-widget/xcode/target.ts +31 -83
- package/ios/Package.swift +7 -1
- package/ios/app/NativeVoltra.mm +19 -0
- package/ios/app/VoltraModule.swift +18 -0
- package/ios/app/VoltraModuleImpl.swift +16 -0
- package/ios/shared/DynamicWidgetPropsCodec.swift +51 -0
- package/ios/shared/DynamicWidgetPropsStorage.swift +53 -0
- package/ios/shared/DynamicWidgetPropsStore.swift +50 -0
- package/ios/shared/DynamicWidgetRenderCoordinator.swift +31 -0
- package/ios/shared/DynamicWidgetUpdater.swift +30 -0
- package/ios/shared/VoltraConstants.swift +4 -0
- package/ios/shared/VoltraJSRenderer.swift +3 -1
- package/ios/shared/VoltraNode.swift +6 -2
- package/ios/shared/VoltraWidgetDefaults.swift +9 -1
- package/ios/target/VoltraClientWidgetRuntime.swift +17 -5
- package/ios/target/VoltraHomeWidget.swift +6 -2
- package/ios/target/VoltraWidget.swift +3 -1
- package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +3 -1
- package/ios/ui/Helpers/VoltraProgressDriver.swift +6 -2
- package/ios/ui/Layout/VoltraFlexStackLayout.swift +9 -3
- package/ios/ui/Style/JSColorParser.swift +24 -8
- package/ios/ui/Style/JSGradientParser.swift +36 -12
- package/ios/ui/Style/JSStyleParser.swift +36 -12
- package/ios/ui/Style/LayoutStyle.swift +12 -4
- package/ios/ui/Views/VoltraChart.swift +52 -16
- package/ios/ui/Views/VoltraLinearGradient.swift +6 -2
- package/package.json +5 -5
- package/src/dynamic-widget/api.ts +25 -0
- package/src/index.ts +1 -0
- package/src/native/NativeVoltra.ts +1 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// !$*UTF8*$!
|
|
2
|
+
{
|
|
3
|
+
archiveVersion = 1;
|
|
4
|
+
classes = {
|
|
5
|
+
};
|
|
6
|
+
objectVersion = 54;
|
|
7
|
+
objects = {
|
|
8
|
+
|
|
9
|
+
/* Begin PBXBuildFile section */
|
|
10
|
+
13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; };
|
|
11
|
+
13B07FC11A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
|
12
|
+
13B07FC21A68108700A75B9A /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB61A68108700A75B9A /* Info.plist */; };
|
|
13
|
+
/* End PBXBuildFile section */
|
|
14
|
+
|
|
15
|
+
/* Begin PBXFileReference section */
|
|
16
|
+
13B07F961A680F5B00A75B9A /* voltraexample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = voltraexample.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
17
|
+
13B07FB01A68108700A75B9A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = voltraexample/AppDelegate.swift; sourceTree = "<group>"; };
|
|
18
|
+
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = voltraexample/Images.xcassets; sourceTree = "<group>"; };
|
|
19
|
+
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = voltraexample/Info.plist; sourceTree = "<group>"; };
|
|
20
|
+
/* End PBXFileReference section */
|
|
21
|
+
|
|
22
|
+
/* Begin PBXFrameworksBuildPhase section */
|
|
23
|
+
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
|
24
|
+
isa = PBXFrameworksBuildPhase;
|
|
25
|
+
buildActionMask = 2147483647;
|
|
26
|
+
files = (
|
|
27
|
+
);
|
|
28
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
29
|
+
};
|
|
30
|
+
/* End PBXFrameworksBuildPhase section */
|
|
31
|
+
|
|
32
|
+
/* Begin PBXGroup section */
|
|
33
|
+
83CBB9F61A601CBA00E9B192 = {
|
|
34
|
+
isa = PBXGroup;
|
|
35
|
+
children = (
|
|
36
|
+
13B07FAE1A68108700A75B9A /* voltraexample */,
|
|
37
|
+
83CBBA001A601CBA00E9B192 /* Products */,
|
|
38
|
+
);
|
|
39
|
+
indentWidth = 2;
|
|
40
|
+
sourceTree = "<group>";
|
|
41
|
+
tabWidth = 2;
|
|
42
|
+
usesTabs = 0;
|
|
43
|
+
};
|
|
44
|
+
13B07FAE1A68108700A75B9A /* voltraexample */ = {
|
|
45
|
+
isa = PBXGroup;
|
|
46
|
+
children = (
|
|
47
|
+
13B07FB01A68108700A75B9A /* AppDelegate.swift */,
|
|
48
|
+
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
|
49
|
+
13B07FB61A68108700A75B9A /* Info.plist */,
|
|
50
|
+
);
|
|
51
|
+
name = voltraexample;
|
|
52
|
+
sourceTree = "<group>";
|
|
53
|
+
};
|
|
54
|
+
83CBBA001A601CBA00E9B192 /* Products */ = {
|
|
55
|
+
isa = PBXGroup;
|
|
56
|
+
children = (
|
|
57
|
+
13B07F961A680F5B00A75B9A /* voltraexample.app */,
|
|
58
|
+
);
|
|
59
|
+
name = Products;
|
|
60
|
+
sourceTree = "<group>";
|
|
61
|
+
};
|
|
62
|
+
/* End PBXGroup section */
|
|
63
|
+
|
|
64
|
+
/* Begin PBXNativeTarget section */
|
|
65
|
+
13B07F861A680F5B00A75B9A /* voltraexample */ = {
|
|
66
|
+
isa = PBXNativeTarget;
|
|
67
|
+
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "voltraexample" */;
|
|
68
|
+
buildPhases = (
|
|
69
|
+
13B07F871A680F5B00A75B9A /* Sources */,
|
|
70
|
+
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
|
71
|
+
13B07F8E1A680F5B00A75B9A /* Resources */,
|
|
72
|
+
);
|
|
73
|
+
buildRules = (
|
|
74
|
+
);
|
|
75
|
+
dependencies = (
|
|
76
|
+
);
|
|
77
|
+
name = voltraexample;
|
|
78
|
+
productName = voltraexample;
|
|
79
|
+
productReference = 13B07F961A680F5B00A75B9A /* voltraexample.app */;
|
|
80
|
+
productType = "com.apple.product-type.application";
|
|
81
|
+
};
|
|
82
|
+
/* End PBXNativeTarget section */
|
|
83
|
+
|
|
84
|
+
/* Begin PBXProject section */
|
|
85
|
+
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
|
86
|
+
isa = PBXProject;
|
|
87
|
+
attributes = {
|
|
88
|
+
LastUpgradeCheck = 1210;
|
|
89
|
+
TargetAttributes = {
|
|
90
|
+
13B07F861A680F5B00A75B9A = {
|
|
91
|
+
LastSwiftMigration = 1250;
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "voltraexample" */;
|
|
96
|
+
compatibilityVersion = "Xcode 12.0";
|
|
97
|
+
developmentRegion = en;
|
|
98
|
+
hasScannedForEncodings = 0;
|
|
99
|
+
knownRegions = (
|
|
100
|
+
en,
|
|
101
|
+
Base,
|
|
102
|
+
);
|
|
103
|
+
mainGroup = 83CBB9F61A601CBA00E9B192;
|
|
104
|
+
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
|
105
|
+
projectDirPath = "";
|
|
106
|
+
projectRoot = "";
|
|
107
|
+
targets = (
|
|
108
|
+
13B07F861A680F5B00A75B9A /* voltraexample */,
|
|
109
|
+
);
|
|
110
|
+
};
|
|
111
|
+
/* End PBXProject section */
|
|
112
|
+
|
|
113
|
+
/* Begin PBXResourcesBuildPhase section */
|
|
114
|
+
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
|
115
|
+
isa = PBXResourcesBuildPhase;
|
|
116
|
+
buildActionMask = 2147483647;
|
|
117
|
+
files = (
|
|
118
|
+
13B07FC11A68108700A75B9A /* Images.xcassets in Resources */,
|
|
119
|
+
13B07FC21A68108700A75B9A /* Info.plist in Resources */,
|
|
120
|
+
);
|
|
121
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
122
|
+
};
|
|
123
|
+
/* End PBXResourcesBuildPhase section */
|
|
124
|
+
|
|
125
|
+
/* Begin PBXSourcesBuildPhase section */
|
|
126
|
+
13B07F871A680F5B00A75B9A /* Sources */ = {
|
|
127
|
+
isa = PBXSourcesBuildPhase;
|
|
128
|
+
buildActionMask = 2147483647;
|
|
129
|
+
files = (
|
|
130
|
+
13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */,
|
|
131
|
+
);
|
|
132
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
133
|
+
};
|
|
134
|
+
/* End PBXSourcesBuildPhase section */
|
|
135
|
+
|
|
136
|
+
/* Begin XCBuildConfiguration section */
|
|
137
|
+
13B07F941A680F5B00A75B9A /* Debug */ = {
|
|
138
|
+
isa = XCBuildConfiguration;
|
|
139
|
+
buildSettings = {
|
|
140
|
+
CODE_SIGN_STYLE = Manual;
|
|
141
|
+
DEVELOPMENT_TEAM = ABCDE12345;
|
|
142
|
+
INFOPLIST_FILE = voltraexample/Info.plist;
|
|
143
|
+
PRODUCT_BUNDLE_IDENTIFIER = com.voltra.example;
|
|
144
|
+
PRODUCT_NAME = voltraexample;
|
|
145
|
+
PROVISIONING_PROFILE_SPECIFIER = "Voltra Dev Profile";
|
|
146
|
+
SWIFT_VERSION = 5.0;
|
|
147
|
+
};
|
|
148
|
+
name = Debug;
|
|
149
|
+
};
|
|
150
|
+
13B07F951A680F5B00A75B9A /* Release */ = {
|
|
151
|
+
isa = XCBuildConfiguration;
|
|
152
|
+
buildSettings = {
|
|
153
|
+
CODE_SIGN_STYLE = Manual;
|
|
154
|
+
DEVELOPMENT_TEAM = ABCDE12345;
|
|
155
|
+
INFOPLIST_FILE = voltraexample/Info.plist;
|
|
156
|
+
PRODUCT_BUNDLE_IDENTIFIER = com.voltra.example;
|
|
157
|
+
PRODUCT_NAME = voltraexample;
|
|
158
|
+
PROVISIONING_PROFILE_SPECIFIER = "Voltra AppStore Profile";
|
|
159
|
+
SWIFT_VERSION = 5.0;
|
|
160
|
+
};
|
|
161
|
+
name = Release;
|
|
162
|
+
};
|
|
163
|
+
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
|
164
|
+
isa = XCBuildConfiguration;
|
|
165
|
+
buildSettings = {
|
|
166
|
+
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
|
167
|
+
SDKROOT = iphoneos;
|
|
168
|
+
};
|
|
169
|
+
name = Debug;
|
|
170
|
+
};
|
|
171
|
+
83CBBA211A601CBA00E9B192 /* Release */ = {
|
|
172
|
+
isa = XCBuildConfiguration;
|
|
173
|
+
buildSettings = {
|
|
174
|
+
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
|
175
|
+
SDKROOT = iphoneos;
|
|
176
|
+
};
|
|
177
|
+
name = Release;
|
|
178
|
+
};
|
|
179
|
+
/* End XCBuildConfiguration section */
|
|
180
|
+
|
|
181
|
+
/* Begin XCConfigurationList section */
|
|
182
|
+
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "voltraexample" */ = {
|
|
183
|
+
isa = XCConfigurationList;
|
|
184
|
+
buildConfigurations = (
|
|
185
|
+
13B07F941A680F5B00A75B9A /* Debug */,
|
|
186
|
+
13B07F951A680F5B00A75B9A /* Release */,
|
|
187
|
+
);
|
|
188
|
+
defaultConfigurationIsVisible = 0;
|
|
189
|
+
defaultConfigurationName = Release;
|
|
190
|
+
};
|
|
191
|
+
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "voltraexample" */ = {
|
|
192
|
+
isa = XCConfigurationList;
|
|
193
|
+
buildConfigurations = (
|
|
194
|
+
83CBBA201A601CBA00E9B192 /* Debug */,
|
|
195
|
+
83CBBA211A601CBA00E9B192 /* Release */,
|
|
196
|
+
);
|
|
197
|
+
defaultConfigurationIsVisible = 0;
|
|
198
|
+
defaultConfigurationName = Release;
|
|
199
|
+
};
|
|
200
|
+
/* End XCConfigurationList section */
|
|
201
|
+
};
|
|
202
|
+
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
|
203
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`applyXcodeChanges — fresh Expo project (fixture a) matches the committed snapshot 1`] = `
|
|
4
|
+
"// !$*UTF8*$!
|
|
5
|
+
{
|
|
6
|
+
archiveVersion = 1;
|
|
7
|
+
classes = {
|
|
8
|
+
};
|
|
9
|
+
objectVersion = 54;
|
|
10
|
+
objects = {
|
|
11
|
+
|
|
12
|
+
/* Begin PBXBuildFile section */
|
|
13
|
+
13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; };
|
|
14
|
+
13B07FC11A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
|
15
|
+
13B07FC21A68108700A75B9A /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB61A68108700A75B9A /* Info.plist */; };
|
|
16
|
+
F1D00000000000000000000F /* VoltraWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000008 /* VoltraWidget.swift */; };
|
|
17
|
+
F1D000000000000000000010 /* VoltraWidgetInitialStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */; };
|
|
18
|
+
F1D000000000000000000006 /* VoltraWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F1D000000000000000000005 /* VoltraWidgetExtension.appex */; };
|
|
19
|
+
F1D000000000000000000014 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000C /* Assets.xcassets */; };
|
|
20
|
+
F1D000000000000000000015 /* VoltraWidgets.strings in Resources */ = {isa = PBXBuildFile; fileRef = F1D00000000000000000000D /* VoltraWidgets.strings */; };
|
|
21
|
+
/* End PBXBuildFile section */
|
|
22
|
+
|
|
23
|
+
/* Begin PBXFileReference section */
|
|
24
|
+
13B07F961A680F5B00A75B9A /* voltraexample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = voltraexample.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
25
|
+
13B07FB01A68108700A75B9A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = voltraexample/AppDelegate.swift; sourceTree = "<group>"; };
|
|
26
|
+
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = voltraexample/Images.xcassets; sourceTree = "<group>"; };
|
|
27
|
+
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = voltraexample/Info.plist; sourceTree = "<group>"; };
|
|
28
|
+
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
|
+
F1D000000000000000000008 /* VoltraWidget.swift */ = {isa = PBXFileReference; name = "VoltraWidget.swift"; path = "VoltraWidget.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
|
|
30
|
+
F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */ = {isa = PBXFileReference; name = "VoltraWidgetInitialStates.swift"; path = "VoltraWidgetInitialStates.swift"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.swift; explicitFileType = undefined; includeInIndex = 0; };
|
|
31
|
+
F1D00000000000000000000A /* VoltraWidgetExtension.entitlements */ = {isa = PBXFileReference; name = "VoltraWidgetExtension.entitlements"; path = "VoltraWidgetExtension.entitlements"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; };
|
|
32
|
+
F1D00000000000000000000B /* 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; };
|
|
33
|
+
F1D00000000000000000000C /* Assets.xcassets */ = {isa = PBXFileReference; name = "Assets.xcassets"; path = "Assets.xcassets"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = folder.assetcatalog; explicitFileType = undefined; includeInIndex = 0; };
|
|
34
|
+
F1D00000000000000000000D /* 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
|
+
/* End PBXFileReference section */
|
|
36
|
+
|
|
37
|
+
/* Begin PBXFrameworksBuildPhase section */
|
|
38
|
+
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
|
39
|
+
isa = PBXFrameworksBuildPhase;
|
|
40
|
+
buildActionMask = 2147483647;
|
|
41
|
+
files = (
|
|
42
|
+
);
|
|
43
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
44
|
+
};
|
|
45
|
+
F1D000000000000000000012 /* Frameworks */ = {
|
|
46
|
+
isa = PBXFrameworksBuildPhase;
|
|
47
|
+
buildActionMask = 2147483647;
|
|
48
|
+
files = (
|
|
49
|
+
);
|
|
50
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
51
|
+
};
|
|
52
|
+
/* End PBXFrameworksBuildPhase section */
|
|
53
|
+
|
|
54
|
+
/* Begin PBXGroup section */
|
|
55
|
+
83CBB9F61A601CBA00E9B192 = {
|
|
56
|
+
isa = PBXGroup;
|
|
57
|
+
children = (
|
|
58
|
+
13B07FAE1A68108700A75B9A /* voltraexample */,
|
|
59
|
+
83CBBA001A601CBA00E9B192 /* Products */,
|
|
60
|
+
F1D000000000000000000007 /* VoltraWidgetExtension */,
|
|
61
|
+
);
|
|
62
|
+
indentWidth = 2;
|
|
63
|
+
sourceTree = "<group>";
|
|
64
|
+
tabWidth = 2;
|
|
65
|
+
usesTabs = 0;
|
|
66
|
+
};
|
|
67
|
+
13B07FAE1A68108700A75B9A /* voltraexample */ = {
|
|
68
|
+
isa = PBXGroup;
|
|
69
|
+
children = (
|
|
70
|
+
13B07FB01A68108700A75B9A /* AppDelegate.swift */,
|
|
71
|
+
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
|
72
|
+
13B07FB61A68108700A75B9A /* Info.plist */,
|
|
73
|
+
);
|
|
74
|
+
name = voltraexample;
|
|
75
|
+
sourceTree = "<group>";
|
|
76
|
+
};
|
|
77
|
+
83CBBA001A601CBA00E9B192 /* Products */ = {
|
|
78
|
+
isa = PBXGroup;
|
|
79
|
+
children = (
|
|
80
|
+
13B07F961A680F5B00A75B9A /* voltraexample.app */,
|
|
81
|
+
F1D000000000000000000005 /* VoltraWidgetExtension.appex */,
|
|
82
|
+
);
|
|
83
|
+
name = Products;
|
|
84
|
+
sourceTree = "<group>";
|
|
85
|
+
};
|
|
86
|
+
F1D000000000000000000007 /* VoltraWidgetExtension */ = {
|
|
87
|
+
isa = PBXGroup;
|
|
88
|
+
children = (
|
|
89
|
+
F1D000000000000000000008 /* VoltraWidget.swift */,
|
|
90
|
+
F1D000000000000000000009 /* VoltraWidgetInitialStates.swift */,
|
|
91
|
+
F1D00000000000000000000A /* VoltraWidgetExtension.entitlements */,
|
|
92
|
+
F1D00000000000000000000B /* VoltraWidgetExtension-Info.plist */,
|
|
93
|
+
F1D00000000000000000000C /* Assets.xcassets */,
|
|
94
|
+
F1D00000000000000000000D /* VoltraWidgets.strings */,
|
|
95
|
+
);
|
|
96
|
+
name = VoltraWidgetExtension;
|
|
97
|
+
path = VoltraWidgetExtension;
|
|
98
|
+
sourceTree = "<group>";
|
|
99
|
+
};
|
|
100
|
+
/* End PBXGroup section */
|
|
101
|
+
|
|
102
|
+
/* Begin PBXNativeTarget section */
|
|
103
|
+
13B07F861A680F5B00A75B9A /* voltraexample */ = {
|
|
104
|
+
isa = PBXNativeTarget;
|
|
105
|
+
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "voltraexample" */;
|
|
106
|
+
buildPhases = (
|
|
107
|
+
13B07F871A680F5B00A75B9A /* Sources */,
|
|
108
|
+
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
|
109
|
+
13B07F8E1A680F5B00A75B9A /* Resources */,
|
|
110
|
+
F1D000000000000000000011 /* Embed Foundation Extensions */,
|
|
111
|
+
);
|
|
112
|
+
buildRules = (
|
|
113
|
+
);
|
|
114
|
+
dependencies = (
|
|
115
|
+
F1D000000000000000000016 /* PBXTargetDependency */,
|
|
116
|
+
);
|
|
117
|
+
name = voltraexample;
|
|
118
|
+
productName = voltraexample;
|
|
119
|
+
productReference = 13B07F961A680F5B00A75B9A /* voltraexample.app */;
|
|
120
|
+
productType = "com.apple.product-type.application";
|
|
121
|
+
};
|
|
122
|
+
F1D000000000000000000001 /* VoltraWidgetExtension */ = {
|
|
123
|
+
isa = PBXNativeTarget;
|
|
124
|
+
name = VoltraWidgetExtension;
|
|
125
|
+
productName = VoltraWidgetExtension;
|
|
126
|
+
productType = "com.apple.product-type.app-extension";
|
|
127
|
+
buildConfigurationList = F1D000000000000000000002;
|
|
128
|
+
productReference = F1D000000000000000000005;
|
|
129
|
+
buildPhases = (
|
|
130
|
+
F1D00000000000000000000E /* Sources */,
|
|
131
|
+
F1D000000000000000000012 /* Frameworks */,
|
|
132
|
+
F1D000000000000000000013 /* Resources */,
|
|
133
|
+
);
|
|
134
|
+
buildRules = (
|
|
135
|
+
);
|
|
136
|
+
dependencies = (
|
|
137
|
+
);
|
|
138
|
+
};
|
|
139
|
+
/* End PBXNativeTarget section */
|
|
140
|
+
|
|
141
|
+
/* Begin PBXProject section */
|
|
142
|
+
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
|
143
|
+
isa = PBXProject;
|
|
144
|
+
attributes = {
|
|
145
|
+
LastUpgradeCheck = 1210;
|
|
146
|
+
TargetAttributes = {
|
|
147
|
+
13B07F861A680F5B00A75B9A = {
|
|
148
|
+
LastSwiftMigration = 1250;
|
|
149
|
+
};
|
|
150
|
+
F1D000000000000000000001 = {
|
|
151
|
+
LastSwiftMigration = 1250;
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "voltraexample" */;
|
|
156
|
+
compatibilityVersion = "Xcode 12.0";
|
|
157
|
+
developmentRegion = en;
|
|
158
|
+
hasScannedForEncodings = 0;
|
|
159
|
+
knownRegions = (
|
|
160
|
+
en,
|
|
161
|
+
Base,
|
|
162
|
+
);
|
|
163
|
+
mainGroup = 83CBB9F61A601CBA00E9B192;
|
|
164
|
+
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
|
165
|
+
projectDirPath = "";
|
|
166
|
+
projectRoot = "";
|
|
167
|
+
targets = (
|
|
168
|
+
13B07F861A680F5B00A75B9A /* voltraexample */,
|
|
169
|
+
F1D000000000000000000001 /* VoltraWidgetExtension */,
|
|
170
|
+
);
|
|
171
|
+
};
|
|
172
|
+
/* End PBXProject section */
|
|
173
|
+
|
|
174
|
+
/* Begin PBXResourcesBuildPhase section */
|
|
175
|
+
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
|
176
|
+
isa = PBXResourcesBuildPhase;
|
|
177
|
+
buildActionMask = 2147483647;
|
|
178
|
+
files = (
|
|
179
|
+
13B07FC11A68108700A75B9A /* Images.xcassets in Resources */,
|
|
180
|
+
13B07FC21A68108700A75B9A /* Info.plist in Resources */,
|
|
181
|
+
);
|
|
182
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
183
|
+
};
|
|
184
|
+
F1D000000000000000000013 /* Resources */ = {
|
|
185
|
+
isa = PBXResourcesBuildPhase;
|
|
186
|
+
buildActionMask = 2147483647;
|
|
187
|
+
files = (
|
|
188
|
+
F1D000000000000000000014 /* Assets.xcassets in Resources */,
|
|
189
|
+
F1D000000000000000000015 /* VoltraWidgets.strings in Resources */,
|
|
190
|
+
);
|
|
191
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
192
|
+
};
|
|
193
|
+
/* End PBXResourcesBuildPhase section */
|
|
194
|
+
|
|
195
|
+
/* Begin PBXSourcesBuildPhase section */
|
|
196
|
+
13B07F871A680F5B00A75B9A /* Sources */ = {
|
|
197
|
+
isa = PBXSourcesBuildPhase;
|
|
198
|
+
buildActionMask = 2147483647;
|
|
199
|
+
files = (
|
|
200
|
+
13B07FBF1A68108700A75B9A /* AppDelegate.swift in Sources */,
|
|
201
|
+
);
|
|
202
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
203
|
+
};
|
|
204
|
+
F1D00000000000000000000E /* Sources */ = {
|
|
205
|
+
isa = PBXSourcesBuildPhase;
|
|
206
|
+
buildActionMask = 2147483647;
|
|
207
|
+
files = (
|
|
208
|
+
F1D00000000000000000000F /* VoltraWidget.swift in Sources */,
|
|
209
|
+
F1D000000000000000000010 /* VoltraWidgetInitialStates.swift in Sources */,
|
|
210
|
+
);
|
|
211
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
212
|
+
};
|
|
213
|
+
/* End PBXSourcesBuildPhase section */
|
|
214
|
+
|
|
215
|
+
/* Begin XCBuildConfiguration section */
|
|
216
|
+
13B07F941A680F5B00A75B9A /* Debug */ = {
|
|
217
|
+
isa = XCBuildConfiguration;
|
|
218
|
+
buildSettings = {
|
|
219
|
+
INFOPLIST_FILE = voltraexample/Info.plist;
|
|
220
|
+
PRODUCT_BUNDLE_IDENTIFIER = com.voltra.example;
|
|
221
|
+
PRODUCT_NAME = voltraexample;
|
|
222
|
+
SWIFT_VERSION = 5.0;
|
|
223
|
+
};
|
|
224
|
+
name = Debug;
|
|
225
|
+
};
|
|
226
|
+
13B07F951A680F5B00A75B9A /* Release */ = {
|
|
227
|
+
isa = XCBuildConfiguration;
|
|
228
|
+
buildSettings = {
|
|
229
|
+
INFOPLIST_FILE = voltraexample/Info.plist;
|
|
230
|
+
PRODUCT_BUNDLE_IDENTIFIER = com.voltra.example;
|
|
231
|
+
PRODUCT_NAME = voltraexample;
|
|
232
|
+
SWIFT_VERSION = 5.0;
|
|
233
|
+
};
|
|
234
|
+
name = Release;
|
|
235
|
+
};
|
|
236
|
+
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
|
237
|
+
isa = XCBuildConfiguration;
|
|
238
|
+
buildSettings = {
|
|
239
|
+
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
|
240
|
+
SDKROOT = iphoneos;
|
|
241
|
+
};
|
|
242
|
+
name = Debug;
|
|
243
|
+
};
|
|
244
|
+
83CBBA211A601CBA00E9B192 /* Release */ = {
|
|
245
|
+
isa = XCBuildConfiguration;
|
|
246
|
+
buildSettings = {
|
|
247
|
+
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
|
|
248
|
+
SDKROOT = iphoneos;
|
|
249
|
+
};
|
|
250
|
+
name = Release;
|
|
251
|
+
};
|
|
252
|
+
F1D000000000000000000003 /* Debug */ = {
|
|
253
|
+
name = Debug;
|
|
254
|
+
isa = XCBuildConfiguration;
|
|
255
|
+
buildSettings = {
|
|
256
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
257
|
+
SWIFT_VERSION = 5.0;
|
|
258
|
+
TARGETED_DEVICE_FAMILY = "1,2";
|
|
259
|
+
INFOPLIST_FILE = VoltraWidgetExtension/Info.plist;
|
|
260
|
+
INFOPLIST_OUTPUT_FORMAT = "xml";
|
|
261
|
+
CURRENT_PROJECT_VERSION = "1";
|
|
262
|
+
MARKETING_VERSION = "1.0";
|
|
263
|
+
IPHONEOS_DEPLOYMENT_TARGET = "16.2";
|
|
264
|
+
PRODUCT_BUNDLE_IDENTIFIER = "com.voltra.example.VoltraWidgetExtension";
|
|
265
|
+
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
266
|
+
CODE_SIGN_ENTITLEMENTS = "VoltraWidgetExtension/VoltraWidgetExtension.entitlements";
|
|
267
|
+
APPLICATION_EXTENSION_API_ONLY = "YES";
|
|
268
|
+
ASSETCATALOG_COMPILER_APPICON_NAME = "";
|
|
269
|
+
};
|
|
270
|
+
};
|
|
271
|
+
F1D000000000000000000004 /* Release */ = {
|
|
272
|
+
name = Release;
|
|
273
|
+
isa = XCBuildConfiguration;
|
|
274
|
+
buildSettings = {
|
|
275
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
276
|
+
SWIFT_VERSION = 5.0;
|
|
277
|
+
TARGETED_DEVICE_FAMILY = "1,2";
|
|
278
|
+
INFOPLIST_FILE = VoltraWidgetExtension/Info.plist;
|
|
279
|
+
INFOPLIST_OUTPUT_FORMAT = "xml";
|
|
280
|
+
CURRENT_PROJECT_VERSION = "1";
|
|
281
|
+
MARKETING_VERSION = "1.0";
|
|
282
|
+
IPHONEOS_DEPLOYMENT_TARGET = "16.2";
|
|
283
|
+
PRODUCT_BUNDLE_IDENTIFIER = "com.voltra.example.VoltraWidgetExtension";
|
|
284
|
+
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
285
|
+
CODE_SIGN_ENTITLEMENTS = "VoltraWidgetExtension/VoltraWidgetExtension.entitlements";
|
|
286
|
+
APPLICATION_EXTENSION_API_ONLY = "YES";
|
|
287
|
+
ASSETCATALOG_COMPILER_APPICON_NAME = "";
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
/* End XCBuildConfiguration section */
|
|
291
|
+
|
|
292
|
+
/* Begin XCConfigurationList section */
|
|
293
|
+
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "voltraexample" */ = {
|
|
294
|
+
isa = XCConfigurationList;
|
|
295
|
+
buildConfigurations = (
|
|
296
|
+
13B07F941A680F5B00A75B9A /* Debug */,
|
|
297
|
+
13B07F951A680F5B00A75B9A /* Release */,
|
|
298
|
+
);
|
|
299
|
+
defaultConfigurationIsVisible = 0;
|
|
300
|
+
defaultConfigurationName = Release;
|
|
301
|
+
};
|
|
302
|
+
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "voltraexample" */ = {
|
|
303
|
+
isa = XCConfigurationList;
|
|
304
|
+
buildConfigurations = (
|
|
305
|
+
83CBBA201A601CBA00E9B192 /* Debug */,
|
|
306
|
+
83CBBA211A601CBA00E9B192 /* Release */,
|
|
307
|
+
);
|
|
308
|
+
defaultConfigurationIsVisible = 0;
|
|
309
|
+
defaultConfigurationName = Release;
|
|
310
|
+
};
|
|
311
|
+
F1D000000000000000000002 /* Build configuration list for PBXNativeTarget "VoltraWidgetExtension" */ = {
|
|
312
|
+
isa = XCConfigurationList;
|
|
313
|
+
buildConfigurations = (
|
|
314
|
+
F1D000000000000000000003 /* Debug */,
|
|
315
|
+
F1D000000000000000000004 /* Release */,
|
|
316
|
+
);
|
|
317
|
+
defaultConfigurationIsVisible = 0;
|
|
318
|
+
defaultConfigurationName = Release;
|
|
319
|
+
};
|
|
320
|
+
/* End XCConfigurationList section */
|
|
321
|
+
|
|
322
|
+
/* Begin PBXCopyFilesBuildPhase section */
|
|
323
|
+
F1D000000000000000000011 /* Embed Foundation Extensions */ = {
|
|
324
|
+
isa = PBXCopyFilesBuildPhase;
|
|
325
|
+
buildActionMask = 2147483647;
|
|
326
|
+
files = (
|
|
327
|
+
F1D000000000000000000006 /* VoltraWidgetExtension.appex in Embed Foundation Extensions */,
|
|
328
|
+
);
|
|
329
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
330
|
+
name = "Embed Foundation Extensions";
|
|
331
|
+
dstPath = "";
|
|
332
|
+
dstSubfolderSpec = 13;
|
|
333
|
+
};
|
|
334
|
+
/* End PBXCopyFilesBuildPhase section */
|
|
335
|
+
|
|
336
|
+
/* Begin PBXTargetDependency section */
|
|
337
|
+
F1D000000000000000000016 /* PBXTargetDependency */ = {
|
|
338
|
+
isa = PBXTargetDependency;
|
|
339
|
+
target = F1D000000000000000000001 /* VoltraWidgetExtension */;
|
|
340
|
+
targetProxy = F1D000000000000000000017 /* PBXContainerItemProxy */;
|
|
341
|
+
};
|
|
342
|
+
/* End PBXTargetDependency section */
|
|
343
|
+
|
|
344
|
+
/* Begin PBXContainerItemProxy section */
|
|
345
|
+
F1D000000000000000000017 /* PBXContainerItemProxy */ = {
|
|
346
|
+
isa = PBXContainerItemProxy;
|
|
347
|
+
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
|
348
|
+
proxyType = 1;
|
|
349
|
+
remoteGlobalIDString = F1D000000000000000000001;
|
|
350
|
+
remoteInfo = VoltraWidgetExtension;
|
|
351
|
+
};
|
|
352
|
+
/* End PBXContainerItemProxy section */
|
|
353
|
+
};
|
|
354
|
+
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
|
355
|
+
}
|
|
356
|
+
"
|
|
357
|
+
`;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as fs from 'fs'
|
|
2
|
+
import * as os from 'os'
|
|
3
|
+
import * as path from 'path'
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
6
|
+
const xcode = require('xcode')
|
|
7
|
+
|
|
8
|
+
/** pbxproj build-phase sections whose `files` entries point at PBXBuildFile objects. */
|
|
9
|
+
const BUILD_PHASE_SECTIONS = [
|
|
10
|
+
'PBXSourcesBuildPhase',
|
|
11
|
+
'PBXFrameworksBuildPhase',
|
|
12
|
+
'PBXResourcesBuildPhase',
|
|
13
|
+
'PBXCopyFilesBuildPhase',
|
|
14
|
+
'PBXHeadersBuildPhase',
|
|
15
|
+
'PBXShellScriptBuildPhase',
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
const COMMENT_KEY = /_comment$/
|
|
19
|
+
|
|
20
|
+
function nonCommentKeys(section: Record<string, any> | undefined): string[] {
|
|
21
|
+
if (!section) {
|
|
22
|
+
return []
|
|
23
|
+
}
|
|
24
|
+
return Object.keys(section).filter((key) => !COMMENT_KEY.test(key))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Strips a trailing `/* comment *\/` and surrounding whitespace from a raw pbx reference value. */
|
|
28
|
+
function normalizeRef(value: unknown): string {
|
|
29
|
+
return String(value)
|
|
30
|
+
.replace(/\/\*.*?\*\//g, '')
|
|
31
|
+
.trim()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Loads a checked-in pbxproj fixture and returns a freshly parsed xcode project.
|
|
36
|
+
*/
|
|
37
|
+
export function loadFixtureProject(fixtureName: string): any {
|
|
38
|
+
const fixturePath = path.join(__dirname, '..', '__fixtures__', fixtureName)
|
|
39
|
+
const project = xcode.project(fixturePath)
|
|
40
|
+
project.parseSync()
|
|
41
|
+
return project
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Serializes the project and parses the result back, asserting the pbxproj survives a
|
|
46
|
+
* `writeSync()` round-trip. Returns the re-parsed project.
|
|
47
|
+
*/
|
|
48
|
+
export function roundTripProject(project: any): any {
|
|
49
|
+
const contents = project.writeSync()
|
|
50
|
+
const tmpFile = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'pbx-')), 'project.pbxproj')
|
|
51
|
+
fs.writeFileSync(tmpFile, contents)
|
|
52
|
+
const reparsed = xcode.project(tmpFile)
|
|
53
|
+
reparsed.parseSync()
|
|
54
|
+
return reparsed
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Asserts the structural consistency of a parsed Xcode project, mirroring the invariants CocoaPods'
|
|
59
|
+
* `[Xcodeproj]` consistency checker enforces. Throws on the first violation.
|
|
60
|
+
*
|
|
61
|
+
* Checks:
|
|
62
|
+
* - every phase `files` entry resolves to an existing PBXBuildFile
|
|
63
|
+
* - every PBXBuildFile is referenced by exactly one build phase across the whole project
|
|
64
|
+
* - the main app target has exactly one `dstSubfolderSpec == 13` copy-files phase
|
|
65
|
+
* - no orphan phase objects (every phase object is referenced by some native target)
|
|
66
|
+
* - the project survives a `writeSync()` -> re-parse round-trip
|
|
67
|
+
*/
|
|
68
|
+
export function assertPbxConsistency(project: any): void {
|
|
69
|
+
const objects = project.hash.project.objects
|
|
70
|
+
const buildFileSection = objects.PBXBuildFile || {}
|
|
71
|
+
|
|
72
|
+
// Collect every phase object referenced by a native target.
|
|
73
|
+
const nativeTargets = objects.PBXNativeTarget || {}
|
|
74
|
+
const referencedPhaseUuids = new Set<string>()
|
|
75
|
+
for (const targetKey of nonCommentKeys(nativeTargets)) {
|
|
76
|
+
const target = nativeTargets[targetKey]
|
|
77
|
+
for (const entry of target.buildPhases || []) {
|
|
78
|
+
referencedPhaseUuids.add(normalizeRef(entry.value))
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Walk every build phase, resolving each files entry and counting build-file references.
|
|
83
|
+
const buildFileRefCount = new Map<string, number>()
|
|
84
|
+
for (const sectionName of BUILD_PHASE_SECTIONS) {
|
|
85
|
+
const section = objects[sectionName]
|
|
86
|
+
for (const phaseKey of nonCommentKeys(section)) {
|
|
87
|
+
// Orphan phase: exists in the object graph but no target references it.
|
|
88
|
+
if (!referencedPhaseUuids.has(phaseKey)) {
|
|
89
|
+
throw new Error(`Orphan ${sectionName} object '${phaseKey}' is not referenced by any target`)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const phase = section[phaseKey]
|
|
93
|
+
for (const entry of phase.files || []) {
|
|
94
|
+
const buildFileUuid = normalizeRef(entry.value)
|
|
95
|
+
if (!buildFileSection[buildFileUuid]) {
|
|
96
|
+
throw new Error(
|
|
97
|
+
`${sectionName} '${phaseKey}' references build file '${buildFileUuid}' that has no PBXBuildFile object`
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
buildFileRefCount.set(buildFileUuid, (buildFileRefCount.get(buildFileUuid) ?? 0) + 1)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Every PBXBuildFile must be referenced by exactly one phase.
|
|
106
|
+
for (const buildFileUuid of nonCommentKeys(buildFileSection)) {
|
|
107
|
+
const count = buildFileRefCount.get(buildFileUuid) ?? 0
|
|
108
|
+
if (count !== 1) {
|
|
109
|
+
const comment = buildFileSection[`${buildFileUuid}_comment`] ?? buildFileUuid
|
|
110
|
+
throw new Error(
|
|
111
|
+
`PBXBuildFile '${comment}' (${buildFileUuid}) is referenced by ${count} build phases, expected exactly 1`
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Exactly one embed-app-extensions (dstSubfolderSpec == 13) phase on the main target.
|
|
117
|
+
const mainTargetUuid = project.getFirstTarget().uuid
|
|
118
|
+
const mainTarget = nativeTargets[mainTargetUuid]
|
|
119
|
+
const copyFilesSection = objects.PBXCopyFilesBuildPhase || {}
|
|
120
|
+
const embedPhases = (mainTarget.buildPhases || []).filter((entry: any) => {
|
|
121
|
+
const phase = copyFilesSection[normalizeRef(entry.value)]
|
|
122
|
+
return phase && String(phase.dstSubfolderSpec) === '13'
|
|
123
|
+
})
|
|
124
|
+
if (embedPhases.length !== 1) {
|
|
125
|
+
throw new Error(`Main target has ${embedPhases.length} embed-app-extensions phases, expected exactly 1`)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// The project must survive serialization + re-parse.
|
|
129
|
+
roundTripProject(project)
|
|
130
|
+
}
|