@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.
Files changed (131) hide show
  1. package/README.md +61 -8
  2. package/build/commonjs/dynamic-widget/api.js +15 -0
  3. package/build/commonjs/dynamic-widget/api.js.map +1 -0
  4. package/build/commonjs/index.js +15 -7
  5. package/build/commonjs/index.js.map +1 -1
  6. package/build/commonjs/native/NativeVoltra.js.map +1 -1
  7. package/build/module/dynamic-widget/api.js +10 -0
  8. package/build/module/dynamic-widget/api.js.map +1 -0
  9. package/build/module/index.js +1 -0
  10. package/build/module/index.js.map +1 -1
  11. package/build/module/native/NativeVoltra.js.map +1 -1
  12. package/build/typescript/commonjs/dynamic-widget/api.d.ts +8 -0
  13. package/build/typescript/commonjs/dynamic-widget/api.d.ts.map +1 -0
  14. package/build/typescript/commonjs/index.d.ts +1 -0
  15. package/build/typescript/commonjs/index.d.ts.map +1 -1
  16. package/build/typescript/commonjs/native/NativeVoltra.d.ts +1 -0
  17. package/build/typescript/commonjs/native/NativeVoltra.d.ts.map +1 -1
  18. package/build/typescript/module/dynamic-widget/api.d.ts +8 -0
  19. package/build/typescript/module/dynamic-widget/api.d.ts.map +1 -0
  20. package/build/typescript/module/index.d.ts +1 -0
  21. package/build/typescript/module/index.d.ts.map +1 -1
  22. package/build/typescript/module/native/NativeVoltra.d.ts +1 -0
  23. package/build/typescript/module/native/NativeVoltra.d.ts.map +1 -1
  24. package/expo-plugin/build/cjs/index.js +3 -1
  25. package/expo-plugin/build/cjs/index.js.map +1 -1
  26. package/expo-plugin/build/cjs/ios-widget/index.js +1 -1
  27. package/expo-plugin/build/cjs/ios-widget/index.js.map +1 -1
  28. package/expo-plugin/build/cjs/ios-widget/podfile.js +38 -12
  29. package/expo-plugin/build/cjs/ios-widget/podfile.js.map +1 -1
  30. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js +143 -107
  31. package/expo-plugin/build/cjs/ios-widget/xcode/buildPhases.js.map +1 -1
  32. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js +30 -22
  33. package/expo-plugin/build/cjs/ios-widget/xcode/configurationList.js.map +1 -1
  34. package/expo-plugin/build/cjs/ios-widget/xcode/fileReferences.js +50 -0
  35. package/expo-plugin/build/cjs/ios-widget/xcode/fileReferences.js.map +1 -0
  36. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js +45 -43
  37. package/expo-plugin/build/cjs/ios-widget/xcode/groups.js.map +1 -1
  38. package/expo-plugin/build/cjs/ios-widget/xcode/index.js +77 -91
  39. package/expo-plugin/build/cjs/ios-widget/xcode/index.js.map +1 -1
  40. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js +41 -39
  41. package/expo-plugin/build/cjs/ios-widget/xcode/mainAppSettings.js.map +1 -1
  42. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js +2 -2
  43. package/expo-plugin/build/cjs/ios-widget/xcode/productFile.js.map +1 -1
  44. package/expo-plugin/build/cjs/ios-widget/xcode/target.js +29 -63
  45. package/expo-plugin/build/cjs/ios-widget/xcode/target.js.map +1 -1
  46. package/expo-plugin/build/esm/index.js +3 -1
  47. package/expo-plugin/build/esm/index.js.map +1 -1
  48. package/expo-plugin/build/esm/ios-widget/index.js +1 -1
  49. package/expo-plugin/build/esm/ios-widget/index.js.map +1 -1
  50. package/expo-plugin/build/esm/ios-widget/podfile.js +36 -11
  51. package/expo-plugin/build/esm/ios-widget/podfile.js.map +1 -1
  52. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js +143 -106
  53. package/expo-plugin/build/esm/ios-widget/xcode/buildPhases.js.map +1 -1
  54. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js +31 -22
  55. package/expo-plugin/build/esm/ios-widget/xcode/configurationList.js.map +1 -1
  56. package/expo-plugin/build/esm/ios-widget/xcode/fileReferences.js +45 -0
  57. package/expo-plugin/build/esm/ios-widget/xcode/fileReferences.js.map +1 -0
  58. package/expo-plugin/build/esm/ios-widget/xcode/groups.js +45 -42
  59. package/expo-plugin/build/esm/ios-widget/xcode/groups.js.map +1 -1
  60. package/expo-plugin/build/esm/ios-widget/xcode/index.js +81 -96
  61. package/expo-plugin/build/esm/ios-widget/xcode/index.js.map +1 -1
  62. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js +41 -39
  63. package/expo-plugin/build/esm/ios-widget/xcode/mainAppSettings.js.map +1 -1
  64. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js +3 -2
  65. package/expo-plugin/build/esm/ios-widget/xcode/productFile.js.map +1 -1
  66. package/expo-plugin/build/esm/ios-widget/xcode/target.js +28 -62
  67. package/expo-plugin/build/esm/ios-widget/xcode/target.js.map +1 -1
  68. package/expo-plugin/build/types/index.d.ts.map +1 -1
  69. package/expo-plugin/build/types/ios-widget/podfile.d.ts +19 -1
  70. package/expo-plugin/build/types/ios-widget/podfile.d.ts.map +1 -1
  71. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts +3 -7
  72. package/expo-plugin/build/types/ios-widget/xcode/buildPhases.d.ts.map +1 -1
  73. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts +15 -10
  74. package/expo-plugin/build/types/ios-widget/xcode/configurationList.d.ts.map +1 -1
  75. package/expo-plugin/build/types/ios-widget/xcode/fileReferences.d.ts +16 -0
  76. package/expo-plugin/build/types/ios-widget/xcode/fileReferences.d.ts.map +1 -0
  77. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts +0 -4
  78. package/expo-plugin/build/types/ios-widget/xcode/groups.d.ts.map +1 -1
  79. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts +22 -3
  80. package/expo-plugin/build/types/ios-widget/xcode/index.d.ts.map +1 -1
  81. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts +16 -4
  82. package/expo-plugin/build/types/ios-widget/xcode/mainAppSettings.d.ts.map +1 -1
  83. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts +0 -4
  84. package/expo-plugin/build/types/ios-widget/xcode/productFile.d.ts.map +1 -1
  85. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts +11 -26
  86. package/expo-plugin/build/types/ios-widget/xcode/target.d.ts.map +1 -1
  87. package/expo-plugin/src/index.ts +5 -1
  88. package/expo-plugin/src/ios-widget/index.ts +1 -1
  89. package/expo-plugin/src/ios-widget/podfile.ts +46 -13
  90. package/expo-plugin/src/ios-widget/xcode/__fixtures__/fresh.pbxproj +197 -0
  91. package/expo-plugin/src/ios-widget/xcode/__fixtures__/with-existing-extension.pbxproj +321 -0
  92. package/expo-plugin/src/ios-widget/xcode/__fixtures__/with-per-config-signing.pbxproj +203 -0
  93. package/expo-plugin/src/ios-widget/xcode/__snapshots__/applyXcodeChanges.node.test.ts.snap +357 -0
  94. package/expo-plugin/src/ios-widget/xcode/__tests__/pbxConsistency.ts +130 -0
  95. package/expo-plugin/src/ios-widget/xcode/buildPhases.ts +151 -152
  96. package/expo-plugin/src/ios-widget/xcode/configurationList.ts +52 -35
  97. package/expo-plugin/src/ios-widget/xcode/fileReferences.ts +51 -0
  98. package/expo-plugin/src/ios-widget/xcode/groups.ts +52 -54
  99. package/expo-plugin/src/ios-widget/xcode/index.ts +107 -119
  100. package/expo-plugin/src/ios-widget/xcode/mainAppSettings.ts +59 -54
  101. package/expo-plugin/src/ios-widget/xcode/productFile.ts +3 -2
  102. package/expo-plugin/src/ios-widget/xcode/target.ts +31 -83
  103. package/ios/Package.swift +7 -1
  104. package/ios/app/NativeVoltra.mm +19 -0
  105. package/ios/app/VoltraModule.swift +18 -0
  106. package/ios/app/VoltraModuleImpl.swift +16 -0
  107. package/ios/shared/DynamicWidgetPropsCodec.swift +51 -0
  108. package/ios/shared/DynamicWidgetPropsStorage.swift +53 -0
  109. package/ios/shared/DynamicWidgetPropsStore.swift +50 -0
  110. package/ios/shared/DynamicWidgetRenderCoordinator.swift +31 -0
  111. package/ios/shared/DynamicWidgetUpdater.swift +30 -0
  112. package/ios/shared/VoltraConstants.swift +4 -0
  113. package/ios/shared/VoltraJSRenderer.swift +3 -1
  114. package/ios/shared/VoltraNode.swift +6 -2
  115. package/ios/shared/VoltraWidgetDefaults.swift +9 -1
  116. package/ios/target/VoltraClientWidgetRuntime.swift +17 -5
  117. package/ios/target/VoltraHomeWidget.swift +6 -2
  118. package/ios/target/VoltraWidget.swift +3 -1
  119. package/ios/ui/Helpers/VoltraDeepLinkResolver.swift +3 -1
  120. package/ios/ui/Helpers/VoltraProgressDriver.swift +6 -2
  121. package/ios/ui/Layout/VoltraFlexStackLayout.swift +9 -3
  122. package/ios/ui/Style/JSColorParser.swift +24 -8
  123. package/ios/ui/Style/JSGradientParser.swift +36 -12
  124. package/ios/ui/Style/JSStyleParser.swift +36 -12
  125. package/ios/ui/Style/LayoutStyle.swift +12 -4
  126. package/ios/ui/Views/VoltraChart.swift +52 -16
  127. package/ios/ui/Views/VoltraLinearGradient.swift +6 -2
  128. package/package.json +5 -5
  129. package/src/dynamic-widget/api.ts +25 -0
  130. package/src/index.ts +1 -0
  131. package/src/native/NativeVoltra.ts +1 -0
@@ -1,8 +1,25 @@
1
+ /** Strips surrounding quotes from a raw build-setting value. */
2
+ function unquote(value) {
3
+ if (typeof value !== 'string') {
4
+ return undefined;
5
+ }
6
+ return value.replace(/^"|"$/g, '');
7
+ }
8
+ /** Reads the signing-related build settings from a single XCBuildConfiguration. */
9
+ function readSigningSettings(buildSettings) {
10
+ return {
11
+ codeSignStyle: unquote(buildSettings.CODE_SIGN_STYLE),
12
+ developmentTeam: unquote(buildSettings.DEVELOPMENT_TEAM),
13
+ provisioningProfileSpecifier: unquote(buildSettings.PROVISIONING_PROFILE_SPECIFIER),
14
+ };
15
+ }
1
16
  /**
2
- * Reads build settings from the main app target to synchronize code signing with the widget extension.
17
+ * Reads code-signing build settings from every build configuration of the main app target, so the
18
+ * widget extension can synchronize signing per configuration (Debug→Debug, Release→Release).
3
19
  *
4
20
  * @param xcodeProject The Xcode project instance
5
- * @returns The main app target's build settings, or null if not found
21
+ * @returns Signing settings keyed by configuration name plus a first-configuration fallback, or
22
+ * null when the main app target or its configurations cannot be resolved
6
23
  */
7
24
  export function getMainAppTargetSettings(xcodeProject) {
8
25
  try {
@@ -10,7 +27,6 @@ export function getMainAppTargetSettings(xcodeProject) {
10
27
  if (!mainAppTarget) {
11
28
  return null;
12
29
  }
13
- // Get the build configuration list for the main app target
14
30
  const buildConfigurationListId = mainAppTarget.buildConfigurationList;
15
31
  if (!buildConfigurationListId) {
16
32
  return null;
@@ -18,47 +34,33 @@ export function getMainAppTargetSettings(xcodeProject) {
18
34
  // Extract UUID from buildConfigurationListId (it might include a comment like "UUID /* comment */")
19
35
  const buildConfigurationListUuid = buildConfigurationListId.split(' ')[0];
20
36
  const buildConfigurationList = xcodeProject.hash.project.objects['XCConfigurationList']?.[buildConfigurationListUuid];
21
- if (!buildConfigurationList || !buildConfigurationList.buildConfigurations) {
22
- return null;
23
- }
24
- // Get the first build configuration (usually Debug) to read settings
25
- const firstConfigRef = buildConfigurationList.buildConfigurations[0];
26
- if (!firstConfigRef) {
27
- return null;
28
- }
29
- // Extract UUID from config reference (it might include a comment)
30
- const firstConfigUuid = typeof firstConfigRef === 'string' ? firstConfigRef.split(' ')[0] : firstConfigRef.value?.split(' ')[0];
31
- if (!firstConfigUuid) {
37
+ if (!buildConfigurationList?.buildConfigurations) {
32
38
  return null;
33
39
  }
34
- const buildConfiguration = xcodeProject.hash.project.objects['XCBuildConfiguration']?.[firstConfigUuid];
35
- if (!buildConfiguration || !buildConfiguration.buildSettings) {
36
- return null;
40
+ const buildConfigurationSection = xcodeProject.hash.project.objects['XCBuildConfiguration'] ?? {};
41
+ const byConfigurationName = {};
42
+ let fallback = null;
43
+ for (const configRef of buildConfigurationList.buildConfigurations) {
44
+ // Extract UUID from the config reference (it might include a comment)
45
+ const configUuid = typeof configRef === 'string' ? configRef.split(' ')[0] : configRef.value?.split(' ')[0];
46
+ if (!configUuid) {
47
+ continue;
48
+ }
49
+ const buildConfiguration = buildConfigurationSection[configUuid];
50
+ if (!buildConfiguration?.buildSettings) {
51
+ continue;
52
+ }
53
+ const settings = readSigningSettings(buildConfiguration.buildSettings);
54
+ const configName = unquote(buildConfiguration.name);
55
+ if (configName && !(configName in byConfigurationName)) {
56
+ byConfigurationName[configName] = settings;
57
+ }
58
+ fallback = fallback ?? settings;
37
59
  }
38
- const buildSettings = buildConfiguration.buildSettings;
39
- // Extract deployment target (remove quotes if present)
40
- const deploymentTarget = buildSettings.IPHONEOS_DEPLOYMENT_TARGET?.replace(/^"|"$/g, '') ||
41
- buildSettings['IPHONEOS_DEPLOYMENT_TARGET']?.replace(/^"|"$/g, '') ||
42
- null;
43
- // Extract code signing settings
44
- const codeSignStyle = buildSettings.CODE_SIGN_STYLE?.replace(/^"|"$/g, '') ||
45
- buildSettings['CODE_SIGN_STYLE']?.replace(/^"|"$/g, '') ||
46
- null;
47
- const developmentTeam = buildSettings.DEVELOPMENT_TEAM?.replace(/^"|"$/g, '') ||
48
- buildSettings['DEVELOPMENT_TEAM']?.replace(/^"|"$/g, '') ||
49
- null;
50
- const provisioningProfileSpecifier = buildSettings.PROVISIONING_PROFILE_SPECIFIER?.replace(/^"|"$/g, '') ||
51
- buildSettings['PROVISIONING_PROFILE_SPECIFIER']?.replace(/^"|"$/g, '') ||
52
- null;
53
- if (!deploymentTarget) {
60
+ if (!fallback) {
54
61
  return null;
55
62
  }
56
- return {
57
- deploymentTarget,
58
- codeSignStyle: codeSignStyle || undefined,
59
- developmentTeam: developmentTeam || undefined,
60
- provisioningProfileSpecifier: provisioningProfileSpecifier || undefined,
61
- };
63
+ return { byConfigurationName, fallback };
62
64
  }
63
65
  catch {
64
66
  // If we can't read the settings, return null and use fallback values
@@ -1 +1 @@
1
- {"version":3,"file":"mainAppSettings.js","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/mainAppSettings.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,YAA0B;IACjE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,WAAW,CAAA;QAEhE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,2DAA2D;QAC3D,MAAM,wBAAwB,GAAG,aAAa,CAAC,sBAAsB,CAAA;QACrE,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,oGAAoG;QACpG,MAAM,0BAA0B,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzE,MAAM,sBAAsB,GAC1B,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAA;QACxF,IAAI,CAAC,sBAAsB,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAA;QACb,CAAC;QAED,qEAAqE;QACrE,MAAM,cAAc,GAAG,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAA;QACpE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,kEAAkE;QAClE,MAAM,eAAe,GACnB,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACzG,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAA;QACvG,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,aAAa,CAAA;QAEtD,uDAAuD;QACvD,MAAM,gBAAgB,GACpB,aAAa,CAAC,0BAA0B,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC/D,aAAa,CAAC,4BAA4B,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClE,IAAI,CAAA;QAEN,gCAAgC;QAChC,MAAM,aAAa,GACjB,aAAa,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpD,aAAa,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACvD,IAAI,CAAA;QAEN,MAAM,eAAe,GACnB,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrD,aAAa,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACxD,IAAI,CAAA;QAEN,MAAM,4BAA4B,GAChC,aAAa,CAAC,8BAA8B,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnE,aAAa,CAAC,gCAAgC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACtE,IAAI,CAAA;QAEN,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,gBAAgB;YAChB,aAAa,EAAE,aAAa,IAAI,SAAS;YACzC,eAAe,EAAE,eAAe,IAAI,SAAS;YAC7C,4BAA4B,EAAE,4BAA4B,IAAI,SAAS;SACxE,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"mainAppSettings.js","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/mainAppSettings.ts"],"names":[],"mappings":"AAoBA,gEAAgE;AAChE,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AACpC,CAAC;AAED,mFAAmF;AACnF,SAAS,mBAAmB,CAAC,aAAsC;IACjE,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC;QACxD,4BAA4B,EAAE,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC;KACpF,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,YAA0B;IACjE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,YAAY,CAAC,cAAc,EAAE,EAAE,WAAW,CAAA;QAChE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,wBAAwB,GAAG,aAAa,CAAC,sBAAsB,CAAA;QACrE,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,oGAAoG;QACpG,MAAM,0BAA0B,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzE,MAAM,sBAAsB,GAC1B,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAA;QACxF,IAAI,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,CAAC;YACjD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,yBAAyB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAA;QACjG,MAAM,mBAAmB,GAA2C,EAAE,CAAA;QACtE,IAAI,QAAQ,GAAkC,IAAI,CAAA;QAElD,KAAK,MAAM,SAAS,IAAI,sBAAsB,CAAC,mBAAmB,EAAE,CAAC;YACnE,sEAAsE;YACtE,MAAM,UAAU,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3G,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAQ;YACV,CAAC;YAED,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAA;YAChE,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE,CAAC;gBACvC,SAAQ;YACV,CAAC;YAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAA;YACtE,MAAM,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACnD,IAAI,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,mBAAmB,CAAC,EAAE,CAAC;gBACvD,mBAAmB,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAA;YAC5C,CAAC;YACD,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAA;QACjC,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -28,9 +28,10 @@ function findBuildFileForFileRef(xcodeProject, fileRef) {
28
28
  return null;
29
29
  }
30
30
  /**
31
- * Adds the product file (.appex) for the widget extension.
31
+ * Adds the product file (.appex) for the widget extension. Internal create-only fallback for
32
+ * {@link ensureProductFile}; not part of the public pipeline.
32
33
  */
33
- export function addProductFile(xcodeProject, options) {
34
+ function addProductFile(xcodeProject, options) {
34
35
  const { targetName, groupName } = options;
35
36
  const productFileOptions = {
36
37
  basename: `${targetName}.appex`,
@@ -1 +1 @@
1
- {"version":3,"file":"productFile.js","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/productFile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"productFile.js","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/productFile.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,36 @@ import { IOS } from '../../constants';
3
3
  // Main Function
4
4
  // ============================================================================
5
5
  /**
6
- * Configures the widget extension target in the Xcode project.
6
+ * Creates the minimal widget-extension native target and registers it with the project.
7
7
  *
8
- * This:
9
- * - Adds the target to PBXNativeTarget section
10
- * - Adds the target to PBXProject section
11
- * - Adds a dependency from the main app to the widget extension
8
+ * A target cannot be "ensured" into existence, so this is the one create-only step in
9
+ * {@link applyXcodeChanges}: it adds an empty `PBXNativeTarget` (no product reference, configuration
10
+ * list or build phases yet) to the `PBXNativeTarget` and `PBXProject` sections. The shared ensure
11
+ * pipeline then fills in the configuration list, product file, group, build phases, attributes and
12
+ * dependency — the same code that reconciles an already-existing target.
13
+ *
14
+ * @returns The freshly created native-target object (the value stored in the `PBXNativeTarget`
15
+ * section under `targetUuid`).
12
16
  */
13
- export function configureTarget(xcodeProject, options) {
14
- const target = addToPbxNativeTargetSection(xcodeProject, options);
15
- addToPbxProjectSection(xcodeProject, target);
16
- addTargetDependency(xcodeProject, target);
17
- return target;
17
+ export function createTargetSkeleton(xcodeProject, options) {
18
+ const { targetName, targetUuid } = options;
19
+ const target = {
20
+ uuid: targetUuid,
21
+ pbxNativeTarget: {
22
+ isa: 'PBXNativeTarget',
23
+ name: targetName,
24
+ productName: targetName,
25
+ productType: `"com.apple.product-type.app-extension"`,
26
+ buildConfigurationList: '',
27
+ productReference: '',
28
+ buildPhases: [],
29
+ buildRules: [],
30
+ dependencies: [],
31
+ },
32
+ };
33
+ xcodeProject.addToPbxNativeTargetSection(target);
34
+ xcodeProject.addToPbxProjectSection(target);
35
+ return xcodeProject.pbxNativeTargetSection()[targetUuid];
18
36
  }
19
37
  /**
20
38
  * Ensures target attributes (LastSwiftMigration) exist for the target.
@@ -53,56 +71,4 @@ export function ensureTargetDependency(xcodeProject, targetUuid) {
53
71
  xcodeProject.addTargetDependency(mainTargetUuid, [targetUuid]);
54
72
  }
55
73
  }
56
- // ============================================================================
57
- // Helper Functions
58
- // ============================================================================
59
- /**
60
- * Adds the widget extension target to the PBXNativeTarget section.
61
- */
62
- function addToPbxNativeTargetSection(xcodeProject, options) {
63
- const { targetName, targetUuid, productFile, xCConfigurationList } = options;
64
- const target = {
65
- uuid: targetUuid,
66
- pbxNativeTarget: {
67
- isa: 'PBXNativeTarget',
68
- name: targetName,
69
- productName: targetName,
70
- productReference: productFile.fileRef,
71
- productType: `"com.apple.product-type.app-extension"`,
72
- buildConfigurationList: xCConfigurationList.uuid,
73
- buildPhases: [],
74
- buildRules: [],
75
- dependencies: [],
76
- },
77
- };
78
- xcodeProject.addToPbxNativeTargetSection(target);
79
- return target;
80
- }
81
- /**
82
- * Adds the target to the PBXProject section.
83
- */
84
- function addToPbxProjectSection(xcodeProject, target) {
85
- xcodeProject.addToPbxProjectSection(target);
86
- // Add target attributes to project section
87
- const projectSection = xcodeProject.pbxProjectSection();
88
- const firstProject = xcodeProject.getFirstProject();
89
- if (!projectSection[firstProject.uuid].attributes.TargetAttributes) {
90
- projectSection[firstProject.uuid].attributes.TargetAttributes = {};
91
- }
92
- projectSection[firstProject.uuid].attributes.TargetAttributes[target.uuid] = {
93
- LastSwiftMigration: IOS.LAST_SWIFT_MIGRATION,
94
- };
95
- }
96
- /**
97
- * Adds a target dependency so the main app depends on the widget extension.
98
- */
99
- function addTargetDependency(xcodeProject, target) {
100
- if (!xcodeProject.hash.project.objects['PBXTargetDependency']) {
101
- xcodeProject.hash.project.objects['PBXTargetDependency'] = {};
102
- }
103
- if (!xcodeProject.hash.project.objects['PBXContainerItemProxy']) {
104
- xcodeProject.hash.project.objects['PBXContainerItemProxy'] = {};
105
- }
106
- xcodeProject.addTargetDependency(xcodeProject.getFirstTarget().uuid, [target.uuid]);
107
- }
108
74
  //# sourceMappingURL=target.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"target.js","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/target.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/target.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAIpD;;;;GAIG;AACH,QAAA,MAAM,aAAa,EAAE,qBA6CpB,CAAA;AAED,eAAe,aAAa,CAAA;AAE5B,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,6BAA6B,EAC7B,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAIpD;;;;GAIG;AACH,QAAA,MAAM,aAAa,EAAE,qBAiDpB,CAAA;AAED,eAAe,aAAa,CAAA;AAE5B,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,6BAA6B,EAC7B,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,SAAS,CAAA"}
@@ -1,9 +1,27 @@
1
1
  import { ConfigPlugin } from '@expo/config-plugins';
2
+ /**
3
+ * Generates the Podfile target content for the widget extension (unwrapped, no markers).
4
+ */
5
+ declare function getTargetContent(targetName: string): string;
6
+ /**
7
+ * Idempotently inserts/upgrades the Voltra widget target block in Podfile contents:
8
+ * - marked block already present → replaced in place (covers renamed targets too, since the
9
+ * markers are name-agnostic)
10
+ * - legacy (pre-marker) block present → replaced with the new marked block
11
+ * - neither present → appended
12
+ */
13
+ export declare function upsertWidgetTarget(contents: string, targetName: string): string;
2
14
  export interface ConfigurePodfileProps {
3
15
  targetName: string;
4
16
  }
5
17
  /**
6
- * Plugin step that adds the Podfile target for the widget extension.
18
+ * Plugin step that adds (or upgrades) the Podfile target for the widget extension.
7
19
  */
8
20
  export declare const configurePodfile: ConfigPlugin<ConfigurePodfileProps>;
21
+ export declare const __test__: {
22
+ BEGIN_MARKER: string;
23
+ END_MARKER: string;
24
+ getTargetContent: typeof getTargetContent;
25
+ };
26
+ export {};
9
27
  //# sourceMappingURL=podfile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"podfile.d.ts","sourceRoot":"","sources":["../../../src/ios-widget/podfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkC,MAAM,sBAAsB,CAAA;AAuBnF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAAY,CAAC,qBAAqB,CAahE,CAAA"}
1
+ {"version":3,"file":"podfile.d.ts","sourceRoot":"","sources":["../../../src/ios-widget/podfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkC,MAAM,sBAAsB,CAAA;AAenF;;GAEG;AACH,iBAAS,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBpD;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAY/E;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAAY,CAAC,qBAAqB,CAKhE,CAAA;AAED,eAAO,MAAM,QAAQ;;;;CAAiD,CAAA"}
@@ -5,24 +5,20 @@ import type { IOSWidgetExtensionFiles } from '../../types';
5
5
  * bundles into the extension. Safe to call on every prebuild; only added when absent.
6
6
  */
7
7
  export declare function ensureWidgetBundleScriptPhase(xcodeProject: XcodeProject, targetUuid: string): void;
8
- export interface AddBuildPhasesOptions {
8
+ export interface EnsureBuildPhasesOptions {
9
9
  targetUuid: string;
10
+ targetName: string;
10
11
  groupName: string;
11
12
  productFile: {
12
13
  uuid: string;
14
+ fileRef?: string;
13
15
  target?: string;
14
16
  basename: string;
15
17
  group: string;
16
18
  };
17
19
  widgetFiles: IOSWidgetExtensionFiles;
18
- }
19
- export interface EnsureBuildPhasesOptions extends AddBuildPhasesOptions {
20
20
  mainTargetUuid?: string;
21
21
  }
22
- /**
23
- * Adds all required build phases for the widget extension target.
24
- */
25
- export declare function addBuildPhases(xcodeProject: XcodeProject, options: AddBuildPhasesOptions): void;
26
22
  /**
27
23
  * Ensures all required build phases and files exist for the widget extension target.
28
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"buildPhases.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/buildPhases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAyD1D;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAkClG;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,WAAW,EAAE,uBAAuB,CAAA;CACrC;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAuC/F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAuDrG"}
1
+ {"version":3,"file":"buildPhases.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/buildPhases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AA0D1D;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAkClG;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,WAAW,EAAE,uBAAuB,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAiDrG"}
@@ -1,20 +1,25 @@
1
1
  import { XcodeProject } from '@expo/config-plugins';
2
- export interface AddConfigurationListOptions {
2
+ import type { MainAppTargetSettings } from './mainAppSettings';
3
+ export interface EnsureConfigurationListOptions {
3
4
  targetName: string;
4
5
  bundleIdentifier: string;
5
6
  deploymentTarget: string;
6
- codeSignStyle?: string;
7
- developmentTeam?: string;
8
- provisioningProfileSpecifier?: string;
7
+ /**
8
+ * App marketing version (CFBundleShortVersionString). App Store Connect expects the appex
9
+ * version to match the app's, so this becomes the widget's MARKETING_VERSION.
10
+ */
11
+ version?: string;
12
+ /** App build number; becomes the widget's CURRENT_PROJECT_VERSION. */
13
+ buildNumber?: string;
14
+ /** Main app signing settings, applied per configuration name (Debug→Debug, Release→Release). */
15
+ mainAppSettings?: MainAppTargetSettings | null;
9
16
  }
10
17
  /**
11
- * Adds the XCConfigurationList for the widget extension target.
18
+ * Ensures an existing XCConfigurationList is updated, or adds a new one if missing. Each widget
19
+ * configuration receives the build settings derived for its own name, so Debug and Release signing
20
+ * stay in sync with the main app's respective configurations.
12
21
  */
13
- export declare function addXCConfigurationList(xcodeProject: XcodeProject, options: AddConfigurationListOptions): any;
14
- /**
15
- * Ensures an existing XCConfigurationList is updated, or adds a new one if missing.
16
- */
17
- export declare function ensureXCConfigurationList(xcodeProject: XcodeProject, options: AddConfigurationListOptions, existingConfigurationListId?: string | {
22
+ export declare function ensureXCConfigurationList(xcodeProject: XcodeProject, options: EnsureConfigurationListOptions, existingConfigurationListId?: string | {
18
23
  value?: string;
19
24
  }): any;
20
25
  //# sourceMappingURL=configurationList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configurationList.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/configurationList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAInD,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC;AA0CD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,2BAA2B,OA4BtG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,2BAA2B,EACpC,2BAA2B,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,OAkC1D"}
1
+ {"version":3,"file":"configurationList.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/configurationList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAEtF,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gGAAgG;IAChG,eAAe,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAC/C;AAkFD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,8BAA8B,EACvC,2BAA2B,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,OAmC1D"}
@@ -0,0 +1,16 @@
1
+ import { XcodeProject } from '@expo/config-plugins';
2
+ /** Strips surrounding quotes from a pbx path/name value. */
3
+ export declare function normalizePath(value: string | undefined): string;
4
+ /** Strips a trailing `/* comment *\/` and whitespace, yielding the bare UUID of a pbx reference. */
5
+ export declare function normalizeRef(value: unknown): string;
6
+ /**
7
+ * Resolves the PBXFileReference UUID for a widget file, scoped to the widget's own PBXGroup.
8
+ *
9
+ * pbxproj paths are group-relative, so a bare path like `Assets.xcassets` collides with any other
10
+ * extension's identically named file. Scoping the lookup to the children of the widget group
11
+ * (identified by `targetName`) keeps the widget's references distinct from those, which is what
12
+ * prevents the shared-fileRef corruption behind issues #87/#32. When the widget group does not
13
+ * exist yet, a fresh reference is created.
14
+ */
15
+ export declare function ensureWidgetFileReference(xcodeProject: XcodeProject, filePath: string, targetName: string): string;
16
+ //# sourceMappingURL=fileReferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileReferences.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/fileReferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAInD,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK/D;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAInD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAsBlH"}
@@ -4,10 +4,6 @@ export interface AddPbxGroupOptions {
4
4
  targetName: string;
5
5
  widgetFiles: IOSWidgetExtensionFiles;
6
6
  }
7
- /**
8
- * Adds a PBXGroup for the widget extension files.
9
- */
10
- export declare function addPbxGroup(xcodeProject: XcodeProject, options: AddPbxGroupOptions): void;
11
7
  /**
12
8
  * Ensures a PBXGroup exists for the widget extension files.
13
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAI1D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,uBAAuB,CAAA;CACrC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA4BzF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAiC5F"}
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAK1D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,uBAAuB,CAAA;CACrC;AA6DD;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAwB5F"}
@@ -1,11 +1,28 @@
1
- import { ConfigPlugin } from '@expo/config-plugins';
2
- import type { IOSWidgetConfig } from '../../types';
1
+ import { ConfigPlugin, XcodeProject } from '@expo/config-plugins';
2
+ import type { IOSWidgetConfig, IOSWidgetExtensionFiles } from '../../types';
3
3
  export interface ConfigureXcodeProjectProps {
4
4
  targetName: string;
5
5
  bundleIdentifier: string;
6
6
  deploymentTarget: string;
7
+ /** App marketing version; becomes the widget's MARKETING_VERSION so the appex matches the app. */
8
+ version?: string;
9
+ /** App build number; becomes the widget's CURRENT_PROJECT_VERSION. */
10
+ buildNumber?: string;
7
11
  widgets?: IOSWidgetConfig[];
8
12
  }
13
+ /**
14
+ * Applies all widget-extension changes to an already-parsed Xcode project.
15
+ *
16
+ * This is the pure core of {@link configureXcodeProject}: it takes the parsed project, the plugin
17
+ * props, the discovered widget files, and whether any widget is client-rendered, then mutates the
18
+ * project in place. It performs no filesystem or `modRequest` access, which makes it directly
19
+ * testable against pbxproj fixtures.
20
+ *
21
+ * When the widget target does not exist yet, the minimal native-target skeleton is created first
22
+ * (targets cannot be "ensured" into existence); every other object is then reconciled by the same
23
+ * idempotent ensure pipeline that runs for an already-existing target.
24
+ */
25
+ export declare function applyXcodeChanges(xcodeProject: XcodeProject, props: ConfigureXcodeProjectProps, widgetFiles: IOSWidgetExtensionFiles, hasClientRenderedWidgets?: boolean): void;
9
26
  /**
10
27
  * Plugin step that configures the Xcode project for the widget extension.
11
28
  *
@@ -16,7 +33,9 @@ export interface ConfigureXcodeProjectProps {
16
33
  * - Adds build phases (Sources, CopyFiles, Frameworks, Resources)
17
34
  * - Adds PBXGroup for widget files
18
35
  *
19
- * This should run after generateWidgetExtensionFiles so the files exist.
36
+ * This should run after generateWidgetExtensionFiles so the files exist. The wrapper is kept thin:
37
+ * it discovers widget files and detects client-rendered widgets, then delegates the actual pbxproj
38
+ * mutation to {@link applyXcodeChanges}.
20
39
  */
21
40
  export declare const configureXcodeProject: ConfigPlugin<ConfigureXcodeProjectProps>;
22
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,sBAAsB,CAAA;AAGrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAUlD,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAY,CAAC,0BAA0B,CAqI1E,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAU3E,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,kGAAkG;IAClG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,0BAA0B,EACjC,WAAW,EAAE,uBAAuB,EACpC,wBAAwB,UAAQ,GAC/B,IAAI,CAwEN;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAY,CAAC,0BAA0B,CAwB1E,CAAA"}
@@ -1,15 +1,27 @@
1
1
  import { XcodeProject } from '@expo/config-plugins';
2
- export interface MainAppTargetSettings {
3
- deploymentTarget: string;
2
+ /** Code-signing settings read from one of the main app target's build configurations. */
3
+ export interface MainAppSigningSettings {
4
4
  codeSignStyle?: string;
5
5
  developmentTeam?: string;
6
6
  provisioningProfileSpecifier?: string;
7
7
  }
8
+ export interface MainAppTargetSettings {
9
+ /**
10
+ * Signing settings keyed by build-configuration name (e.g. `Debug`, `Release`). Release
11
+ * provisioning often differs from Debug, so the widget must mirror the main app per
12
+ * configuration rather than copying one configuration's signing into both.
13
+ */
14
+ byConfigurationName: Record<string, MainAppSigningSettings>;
15
+ /** The first configuration's settings, used for widget configurations with no name match. */
16
+ fallback: MainAppSigningSettings;
17
+ }
8
18
  /**
9
- * Reads build settings from the main app target to synchronize code signing with the widget extension.
19
+ * Reads code-signing build settings from every build configuration of the main app target, so the
20
+ * widget extension can synchronize signing per configuration (Debug→Debug, Release→Release).
10
21
  *
11
22
  * @param xcodeProject The Xcode project instance
12
- * @returns The main app target's build settings, or null if not found
23
+ * @returns Signing settings keyed by configuration name plus a first-configuration fallback, or
24
+ * null when the main app target or its configurations cannot be resolved
13
25
  */
14
26
  export declare function getMainAppTargetSettings(xcodeProject: XcodeProject): MainAppTargetSettings | null;
15
27
  //# sourceMappingURL=mainAppSettings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mainAppSettings.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/mainAppSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,YAAY,GAAG,qBAAqB,GAAG,IAAI,CA+EjG"}
1
+ {"version":3,"file":"mainAppSettings.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/mainAppSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,yFAAyF;AACzF,MAAM,WAAW,sBAAsB;IACrC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAC3D,6FAA6F;IAC7F,QAAQ,EAAE,sBAAsB,CAAA;CACjC;AAmBD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,YAAY,GAAG,qBAAqB,GAAG,IAAI,CAsDjG"}
@@ -3,10 +3,6 @@ export interface AddProductFileOptions {
3
3
  targetName: string;
4
4
  groupName: string;
5
5
  }
6
- /**
7
- * Adds the product file (.appex) for the widget extension.
8
- */
9
- export declare function addProductFile(xcodeProject: XcodeProject, options: AddProductFileOptions): any;
10
6
  /**
11
7
  * Ensures the product file (.appex) exists and returns it.
12
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"productFile.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/productFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAsCD;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,OAkBxF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,OAqB3F"}
1
+ {"version":3,"file":"productFile.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/productFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AA8DD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,OAqB3F"}
@@ -1,36 +1,21 @@
1
1
  import { XcodeProject } from '@expo/config-plugins';
2
- export interface ConfigureTargetOptions {
2
+ export interface CreateTargetSkeletonOptions {
3
3
  targetName: string;
4
4
  targetUuid: string;
5
- productFile: {
6
- fileRef: string;
7
- };
8
- xCConfigurationList: {
9
- uuid: string;
10
- };
11
5
  }
12
6
  /**
13
- * Configures the widget extension target in the Xcode project.
7
+ * Creates the minimal widget-extension native target and registers it with the project.
14
8
  *
15
- * This:
16
- * - Adds the target to PBXNativeTarget section
17
- * - Adds the target to PBXProject section
18
- * - Adds a dependency from the main app to the widget extension
9
+ * A target cannot be "ensured" into existence, so this is the one create-only step in
10
+ * {@link applyXcodeChanges}: it adds an empty `PBXNativeTarget` (no product reference, configuration
11
+ * list or build phases yet) to the `PBXNativeTarget` and `PBXProject` sections. The shared ensure
12
+ * pipeline then fills in the configuration list, product file, group, build phases, attributes and
13
+ * dependency — the same code that reconciles an already-existing target.
14
+ *
15
+ * @returns The freshly created native-target object (the value stored in the `PBXNativeTarget`
16
+ * section under `targetUuid`).
19
17
  */
20
- export declare function configureTarget(xcodeProject: XcodeProject, options: ConfigureTargetOptions): {
21
- uuid: string;
22
- pbxNativeTarget: {
23
- isa: string;
24
- name: string;
25
- productName: string;
26
- productReference: string;
27
- productType: string;
28
- buildConfigurationList: string;
29
- buildPhases: never[];
30
- buildRules: never[];
31
- dependencies: never[];
32
- };
33
- };
18
+ export declare function createTargetSkeleton(xcodeProject: XcodeProject, options: CreateTargetSkeletonOptions): any;
34
19
  /**
35
20
  * Ensures target attributes (LastSwiftMigration) exist for the target.
36
21
  */
@@ -1 +1 @@
1
- {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAQnD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAChC,mBAAmB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CACtC;AAaD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB;;;;;;;;;;;;;EAM1F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAa3F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAqB3F"}
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../../src/ios-widget/xcode/target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAQnD,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,2BAA2B,OAsBpG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAa3F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAqB3F"}
@@ -18,7 +18,11 @@ const withVoltraIos: VoltraIosConfigPlugin = (config, props = {}) => {
18
18
 
19
19
  const iosBundleIdentifier = config.ios?.bundleIdentifier
20
20
  if (!iosBundleIdentifier) {
21
- return config
21
+ throw new Error(
22
+ 'The Voltra iOS config plugin requires "expo.ios.bundleIdentifier" to be set in the app config — ' +
23
+ 'it derives the widget extension bundle identifier from it. ' +
24
+ 'Set "ios.bundleIdentifier" (e.g. "com.example.app") in app.json or app.config.(js|ts) and run prebuild again.'
25
+ )
22
26
  }
23
27
 
24
28
  const deploymentTarget = props.deploymentTarget || IOS.DEPLOYMENT_TARGET
@@ -54,7 +54,7 @@ export const withIOS: ConfigPlugin<WithIOSProps> = (config, props) => {
54
54
  ...(fonts && fonts.length > 0 ? [[withFonts, { fonts, targetName }] as [ConfigPlugin<any>, any]] : []),
55
55
 
56
56
  // 2. Configure Xcode project (creates the target - must run before fonts mod executes)
57
- [configureXcodeProject, { targetName, bundleIdentifier, deploymentTarget, widgets }],
57
+ [configureXcodeProject, { targetName, bundleIdentifier, deploymentTarget, widgets, version, buildNumber }],
58
58
 
59
59
  // 3. Configure Podfile for widget extension target
60
60
  [configurePodfile, { targetName }],