@sentry/wizard 6.11.0 → 6.13.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 (245) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/dist/bin.js +16 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/e2e-tests/tests/angular-17.test.js +3 -4
  5. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
  6. package/dist/e2e-tests/tests/angular-19.test.js +3 -4
  7. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
  8. package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
  9. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
  10. package/dist/e2e-tests/tests/flutter.test.js +60 -0
  11. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  12. package/dist/e2e-tests/tests/help-message.test.js +8 -3
  13. package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
  14. package/dist/e2e-tests/tests/nuxt-3.test.js +12 -6
  15. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/nuxt-4.test.js +12 -6
  17. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  18. package/dist/e2e-tests/tests/pnpm-workspace.test.js +8 -4
  19. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  20. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
  21. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
  22. package/dist/e2e-tests/tests/react-router.test.js +6 -7
  23. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  24. package/dist/e2e-tests/tests/remix.test.js +2 -4
  25. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  26. package/dist/e2e-tests/tests/sveltekit-hooks.test.js +24 -8
  27. package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
  28. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +8 -4
  29. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  30. package/dist/lib/Constants.d.ts +1 -0
  31. package/dist/lib/Constants.js +5 -0
  32. package/dist/lib/Constants.js.map +1 -1
  33. package/dist/lib/Steps/Integrations/Electron.js +2 -2
  34. package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
  35. package/dist/src/android/android-wizard.js +3 -0
  36. package/dist/src/android/android-wizard.js.map +1 -1
  37. package/dist/src/angular/codemods/main.d.ts +1 -1
  38. package/dist/src/angular/codemods/main.js +0 -1
  39. package/dist/src/angular/codemods/main.js.map +1 -1
  40. package/dist/src/apple/apple-wizard.js +2 -3
  41. package/dist/src/apple/apple-wizard.js.map +1 -1
  42. package/dist/src/apple/check-installed-cli.d.ts +1 -1
  43. package/dist/src/apple/check-installed-cli.js +13 -7
  44. package/dist/src/apple/check-installed-cli.js.map +1 -1
  45. package/dist/src/apple/code-tools.js +17 -3
  46. package/dist/src/apple/code-tools.js.map +1 -1
  47. package/dist/src/apple/configure-package-manager.js +18 -5
  48. package/dist/src/apple/configure-package-manager.js.map +1 -1
  49. package/dist/src/apple/configure-xcode-project.js +8 -1
  50. package/dist/src/apple/configure-xcode-project.js.map +1 -1
  51. package/dist/src/apple/lookup-xcode-project.d.ts +8 -5
  52. package/dist/src/apple/lookup-xcode-project.js +22 -17
  53. package/dist/src/apple/lookup-xcode-project.js.map +1 -1
  54. package/dist/src/apple/options.d.ts +5 -0
  55. package/dist/src/apple/options.js.map +1 -1
  56. package/dist/src/apple/sentry-swift-package.d.ts +4 -0
  57. package/dist/src/apple/sentry-swift-package.js +17 -0
  58. package/dist/src/apple/sentry-swift-package.js.map +1 -0
  59. package/dist/src/apple/snapshots/apple-snapshots-wizard.d.ts +2 -0
  60. package/dist/src/apple/snapshots/apple-snapshots-wizard.js +251 -0
  61. package/dist/src/apple/snapshots/apple-snapshots-wizard.js.map +1 -0
  62. package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.d.ts +13 -0
  63. package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js +48 -0
  64. package/dist/src/apple/snapshots/configure-snapshotpreviews-xcode-project.js.map +1 -0
  65. package/dist/src/apple/snapshots/snapshot-test-file.d.ts +18 -0
  66. package/dist/src/apple/snapshots/snapshot-test-file.js +122 -0
  67. package/dist/src/apple/snapshots/snapshot-test-file.js.map +1 -0
  68. package/dist/src/apple/snapshots/snapshot-verification-scheme.d.ts +6 -0
  69. package/dist/src/apple/snapshots/snapshot-verification-scheme.js +147 -0
  70. package/dist/src/apple/snapshots/snapshot-verification-scheme.js.map +1 -0
  71. package/dist/src/apple/snapshots/snapshotpreviews-package.d.ts +4 -0
  72. package/dist/src/apple/snapshots/snapshotpreviews-package.js +8 -0
  73. package/dist/src/apple/snapshots/snapshotpreviews-package.js.map +1 -0
  74. package/dist/src/apple/snapshots/snapshots-cli-preflight.d.ts +23 -0
  75. package/dist/src/apple/snapshots/snapshots-cli-preflight.js +136 -0
  76. package/dist/src/apple/snapshots/snapshots-cli-preflight.js.map +1 -0
  77. package/dist/src/apple/xcode-manager.d.ts +59 -1
  78. package/dist/src/apple/xcode-manager.js +507 -106
  79. package/dist/src/apple/xcode-manager.js.map +1 -1
  80. package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
  81. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
  82. package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
  83. package/dist/src/cloudflare/sdk-setup.js.map +1 -1
  84. package/dist/src/cloudflare/templates.d.ts +1 -0
  85. package/dist/src/cloudflare/templates.js +7 -1
  86. package/dist/src/cloudflare/templates.js.map +1 -1
  87. package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
  88. package/dist/src/cloudflare/wrap-worker.js +7 -0
  89. package/dist/src/cloudflare/wrap-worker.js.map +1 -1
  90. package/dist/src/flutter/flutter-wizard.js +3 -0
  91. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  92. package/dist/src/nextjs/templates.js +12 -6
  93. package/dist/src/nextjs/templates.js.map +1 -1
  94. package/dist/src/nuxt/templates.js +12 -6
  95. package/dist/src/nuxt/templates.js.map +1 -1
  96. package/dist/src/react-native/expo.d.ts +6 -0
  97. package/dist/src/react-native/expo.js +27 -1
  98. package/dist/src/react-native/expo.js.map +1 -1
  99. package/dist/src/react-native/git.d.ts +5 -0
  100. package/dist/src/react-native/git.js +32 -1
  101. package/dist/src/react-native/git.js.map +1 -1
  102. package/dist/src/react-native/javascript.js +3 -1
  103. package/dist/src/react-native/javascript.js.map +1 -1
  104. package/dist/src/react-native/react-native-wizard.js +12 -6
  105. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  106. package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
  107. package/dist/src/react-router/codemods/client.entry.js +124 -26
  108. package/dist/src/react-router/codemods/client.entry.js.map +1 -1
  109. package/dist/src/react-router/codemods/react-router-config.js +1 -1
  110. package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
  111. package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
  112. package/dist/src/react-router/codemods/server-entry.js +40 -4
  113. package/dist/src/react-router/codemods/server-entry.js.map +1 -1
  114. package/dist/src/react-router/codemods/vite.js +46 -1
  115. package/dist/src/react-router/codemods/vite.js.map +1 -1
  116. package/dist/src/react-router/react-router-wizard.js +62 -21
  117. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  118. package/dist/src/react-router/sdk-setup.d.ts +5 -3
  119. package/dist/src/react-router/sdk-setup.js +44 -16
  120. package/dist/src/react-router/sdk-setup.js.map +1 -1
  121. package/dist/src/react-router/templates.d.ts +2 -4
  122. package/dist/src/react-router/templates.js +89 -87
  123. package/dist/src/react-router/templates.js.map +1 -1
  124. package/dist/src/remix/sdk-setup.js +1 -2
  125. package/dist/src/remix/sdk-setup.js.map +1 -1
  126. package/dist/src/run.d.ts +4 -1
  127. package/dist/src/run.js +13 -0
  128. package/dist/src/run.js.map +1 -1
  129. package/dist/src/sourcemaps/tools/remix.js +4 -4
  130. package/dist/src/sourcemaps/tools/remix.js.map +1 -1
  131. package/dist/src/sourcemaps/tools/vite.js +1 -1
  132. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  133. package/dist/src/sveltekit/sdk-setup/setup.js +17 -4
  134. package/dist/src/sveltekit/sdk-setup/setup.js.map +1 -1
  135. package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
  136. package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
  137. package/dist/src/sveltekit/templates.js +12 -6
  138. package/dist/src/sveltekit/templates.js.map +1 -1
  139. package/dist/src/utils/ast-utils.d.ts +10 -0
  140. package/dist/src/utils/ast-utils.js +19 -1
  141. package/dist/src/utils/ast-utils.js.map +1 -1
  142. package/dist/src/utils/clack/index.d.ts +2 -1
  143. package/dist/src/utils/clack/index.js +17 -6
  144. package/dist/src/utils/clack/index.js.map +1 -1
  145. package/dist/src/utils/files.d.ts +2 -0
  146. package/dist/src/utils/files.js +58 -0
  147. package/dist/src/utils/files.js.map +1 -0
  148. package/dist/src/utils/git.d.ts +3 -1
  149. package/dist/src/utils/git.js +2 -1
  150. package/dist/src/utils/git.js.map +1 -1
  151. package/dist/src/utils/line-endings.d.ts +1 -0
  152. package/dist/src/utils/line-endings.js +76 -0
  153. package/dist/src/utils/line-endings.js.map +1 -0
  154. package/dist/src/version.d.ts +1 -1
  155. package/dist/src/version.js +1 -1
  156. package/dist/src/version.js.map +1 -1
  157. package/dist/test/angular/angular-wizard.test.js +0 -5
  158. package/dist/test/angular/angular-wizard.test.js.map +1 -1
  159. package/dist/test/apple/code-tools.test.js +78 -0
  160. package/dist/test/apple/code-tools.test.js.map +1 -1
  161. package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
  162. package/dist/test/apple/configure-package-manager.test.js +161 -0
  163. package/dist/test/apple/configure-package-manager.test.js.map +1 -0
  164. package/dist/test/apple/lookup-xcode-project.test.d.ts +1 -0
  165. package/dist/test/apple/lookup-xcode-project.test.js +167 -0
  166. package/dist/test/apple/lookup-xcode-project.test.js.map +1 -0
  167. package/dist/test/apple/snapshots/apple-snapshots-wizard.test.d.ts +1 -0
  168. package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js +487 -0
  169. package/dist/test/apple/snapshots/apple-snapshots-wizard.test.js.map +1 -0
  170. package/dist/test/apple/snapshots/hosted-test-target-fixture.d.ts +24 -0
  171. package/dist/test/apple/snapshots/hosted-test-target-fixture.js +191 -0
  172. package/dist/test/apple/snapshots/hosted-test-target-fixture.js.map +1 -0
  173. package/dist/test/apple/snapshots/snapshot-test-file.test.d.ts +1 -0
  174. package/dist/test/apple/snapshots/snapshot-test-file.test.js +110 -0
  175. package/dist/test/apple/snapshots/snapshot-test-file.test.js.map +1 -0
  176. package/dist/test/apple/snapshots/snapshot-verification-scheme.test.d.ts +1 -0
  177. package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js +146 -0
  178. package/dist/test/apple/snapshots/snapshot-verification-scheme.test.js.map +1 -0
  179. package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.d.ts +1 -0
  180. package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js +186 -0
  181. package/dist/test/apple/snapshots/snapshotpreviews-xcode-smoke.test.js.map +1 -0
  182. package/dist/test/apple/snapshots/snapshots-cli-preflight.test.d.ts +1 -0
  183. package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js +192 -0
  184. package/dist/test/apple/snapshots/snapshots-cli-preflight.test.js.map +1 -0
  185. package/dist/test/apple/snapshots/source-file-insertion.test.d.ts +1 -0
  186. package/dist/test/apple/snapshots/source-file-insertion.test.js +77 -0
  187. package/dist/test/apple/snapshots/source-file-insertion.test.js.map +1 -0
  188. package/dist/test/apple/xcode-manager.test.js +452 -43
  189. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  190. package/dist/test/cloudflare/sdk-setup.test.js +20 -2
  191. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
  192. package/dist/test/cloudflare/templates.test.js +54 -0
  193. package/dist/test/cloudflare/templates.test.js.map +1 -1
  194. package/dist/test/cloudflare/wrap-worker.test.js +74 -11
  195. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
  196. package/dist/test/constants.test.d.ts +1 -0
  197. package/dist/test/constants.test.js +12 -0
  198. package/dist/test/constants.test.js.map +1 -0
  199. package/dist/test/nextjs/templates.test.js +66 -33
  200. package/dist/test/nextjs/templates.test.js.map +1 -1
  201. package/dist/test/nuxt/templates.test.js +66 -36
  202. package/dist/test/nuxt/templates.test.js.map +1 -1
  203. package/dist/test/react-native/expo.test.js +140 -0
  204. package/dist/test/react-native/expo.test.js.map +1 -1
  205. package/dist/test/react-native/git.test.d.ts +1 -0
  206. package/dist/test/react-native/git.test.js +160 -0
  207. package/dist/test/react-native/git.test.js.map +1 -0
  208. package/dist/test/react-router/codemods/client-entry.test.js +38 -5
  209. package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
  210. package/dist/test/react-router/codemods/server-entry.test.js +83 -0
  211. package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
  212. package/dist/test/react-router/codemods/vite.test.js +89 -0
  213. package/dist/test/react-router/codemods/vite.test.js.map +1 -1
  214. package/dist/test/react-router/sdk-setup.test.js +98 -6
  215. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  216. package/dist/test/react-router/templates.test.js +50 -38
  217. package/dist/test/react-router/templates.test.js.map +1 -1
  218. package/dist/test/remix/build-script.test.d.ts +1 -0
  219. package/dist/test/remix/build-script.test.js +124 -0
  220. package/dist/test/remix/build-script.test.js.map +1 -0
  221. package/dist/test/remix/client-entry.test.js +4 -10
  222. package/dist/test/remix/client-entry.test.js.map +1 -1
  223. package/dist/test/run.test.d.ts +1 -0
  224. package/dist/test/run.test.js +137 -0
  225. package/dist/test/run.test.js.map +1 -0
  226. package/dist/test/sourcemaps/tools/vite.test.js +12 -8
  227. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  228. package/dist/test/sveltekit/templates.test.js +78 -27
  229. package/dist/test/sveltekit/templates.test.js.map +1 -1
  230. package/dist/test/utils/ast-utils.test.js +22 -0
  231. package/dist/test/utils/ast-utils.test.js.map +1 -1
  232. package/dist/test/utils/clack/index.test.js +101 -0
  233. package/dist/test/utils/clack/index.test.js.map +1 -1
  234. package/dist/test/utils/git.test.js +10 -0
  235. package/dist/test/utils/git.test.js.map +1 -1
  236. package/dist/test/utils/line-endings.test.d.ts +1 -0
  237. package/dist/test/utils/line-endings.test.js +103 -0
  238. package/dist/test/utils/line-endings.test.js.map +1 -0
  239. package/package.json +2 -2
  240. package/dist/src/react-router/codemods/root.d.ts +0 -1
  241. package/dist/src/react-router/codemods/root.js +0 -171
  242. package/dist/src/react-router/codemods/root.js.map +0 -1
  243. package/dist/test/react-router/codemods/root.test.js +0 -178
  244. package/dist/test/react-router/codemods/root.test.js.map +0 -1
  245. /package/dist/{test/react-router/codemods/root.test.d.ts → e2e-tests/tests/react-router-instrumentation-api.test.d.ts} +0 -0
@@ -0,0 +1,487 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const fs = __importStar(require("node:fs"));
27
+ const os = __importStar(require("node:os"));
28
+ const path = __importStar(require("node:path"));
29
+ const vitest_1 = require("vitest");
30
+ const mocks = vitest_1.vi.hoisted(() => ({
31
+ abort: vitest_1.vi.fn(),
32
+ askForItemSelection: vitest_1.vi.fn(),
33
+ checkInstalledCLISnapshots: vitest_1.vi.fn(),
34
+ confirm: vitest_1.vi.fn(),
35
+ confirmContinueIfNoOrDirtyGitRepo: vitest_1.vi.fn(),
36
+ configureSnapshotPreviewsXcodeProject: vitest_1.vi.fn(),
37
+ ensureSnapshotTestFile: vitest_1.vi.fn(),
38
+ error: vitest_1.vi.fn(),
39
+ info: vitest_1.vi.fn(),
40
+ lookupXcodeProject: vitest_1.vi.fn(),
41
+ outro: vitest_1.vi.fn(),
42
+ printWelcome: vitest_1.vi.fn(),
43
+ resolveSnapshotVerificationSchemeName: vitest_1.vi.fn(),
44
+ success: vitest_1.vi.fn(),
45
+ warn: vitest_1.vi.fn(),
46
+ withTelemetry: vitest_1.vi.fn(async (_options, callback) => await callback()),
47
+ write: vitest_1.vi.fn(),
48
+ }));
49
+ vitest_1.vi.mock('@clack/prompts', () => ({
50
+ default: {
51
+ confirm: mocks.confirm,
52
+ log: {
53
+ error: mocks.error,
54
+ info: mocks.info,
55
+ success: mocks.success,
56
+ warn: mocks.warn,
57
+ },
58
+ outro: mocks.outro,
59
+ },
60
+ }));
61
+ vitest_1.vi.mock('../../../src/telemetry', () => ({
62
+ withTelemetry: mocks.withTelemetry,
63
+ }));
64
+ vitest_1.vi.mock('../../../src/utils/clack', () => ({
65
+ abort: mocks.abort,
66
+ abortIfCancelled: async (value) => await value,
67
+ askForItemSelection: mocks.askForItemSelection,
68
+ confirmContinueIfNoOrDirtyGitRepo: mocks.confirmContinueIfNoOrDirtyGitRepo,
69
+ printWelcome: mocks.printWelcome,
70
+ }));
71
+ vitest_1.vi.mock('../../../src/apple/lookup-xcode-project', () => ({
72
+ lookupXcodeProject: mocks.lookupXcodeProject,
73
+ selectXcodeTarget: async (xcodeProject, options = {}) => {
74
+ const targetNames = options.targetNames ?? xcodeProject.getAllTargets();
75
+ if (targetNames.length === 1) {
76
+ return targetNames[0];
77
+ }
78
+ const askForItemSelection = mocks.askForItemSelection;
79
+ const selection = await askForItemSelection(targetNames, options.promptMessage ?? 'Which target do you want to add Sentry to?');
80
+ return selection.value;
81
+ },
82
+ }));
83
+ vitest_1.vi.mock('../../../src/apple/snapshots/snapshot-test-file', () => ({
84
+ ensureSnapshotTestFile: mocks.ensureSnapshotTestFile,
85
+ snapshotTestClassName: (hostedTestTargetName) => `${hostedTestTargetName}SnapshotTest`,
86
+ snapshotTestTemplate: (className) => `import SnapshottingTests
87
+
88
+ final class ${className}: SnapshotTest {
89
+ override class func snapshotPreviews() -> [String]? { nil }
90
+ override class func excludedSnapshotPreviews() -> [String]? { nil }
91
+ override class func snapshotPreviewModules() -> [String]? { nil }
92
+ override class func excludedSnapshotPreviewModules() -> [String]? { nil }
93
+ }
94
+ `,
95
+ }));
96
+ vitest_1.vi.mock('../../../src/apple/snapshots/configure-snapshotpreviews-xcode-project', () => ({
97
+ configureSnapshotPreviewsXcodeProject: mocks.configureSnapshotPreviewsXcodeProject,
98
+ }));
99
+ vitest_1.vi.mock('../../../src/apple/snapshots/snapshots-cli-preflight', () => ({
100
+ checkInstalledCLISnapshots: mocks.checkInstalledCLISnapshots,
101
+ }));
102
+ vitest_1.vi.mock('../../../src/apple/snapshots/snapshot-verification-scheme', () => ({
103
+ resolveSnapshotVerificationSchemeName: mocks.resolveSnapshotVerificationSchemeName,
104
+ }));
105
+ const apple_snapshots_wizard_1 = require("../../../src/apple/snapshots/apple-snapshots-wizard");
106
+ (0, vitest_1.describe)('runAppleSnapshotsWizard', () => {
107
+ (0, vitest_1.beforeEach)(() => {
108
+ vitest_1.vi.clearAllMocks();
109
+ mocks.ensureSnapshotTestFile.mockReturnValue({
110
+ changed: true,
111
+ className: 'AppTestsSnapshotTest',
112
+ filePath: '/tmp/AppTestsSnapshotTest.swift',
113
+ included: true,
114
+ });
115
+ mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({
116
+ changed: true,
117
+ failedSnapshotPreferencesTargetNames: [],
118
+ linked: true,
119
+ });
120
+ mocks.resolveSnapshotVerificationSchemeName.mockReturnValue('AppScheme');
121
+ mocks.askForItemSelection.mockResolvedValue({ value: 'App' });
122
+ mocks.confirm.mockResolvedValue(false);
123
+ mocks.abort.mockRejectedValue(new Error('aborted'));
124
+ });
125
+ (0, vitest_1.it)('links SnapshotPreferences only to the selected app target', async () => {
126
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
127
+ const selectedPreviewFile = path.join(tempDir, 'SelectedView.swift');
128
+ const otherPreviewFile = path.join(tempDir, 'OtherView.swift');
129
+ fs.writeFileSync(selectedPreviewFile, '#Preview { SelectedView() }', 'utf8');
130
+ fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');
131
+ mocks.askForItemSelection.mockResolvedValue({ value: 'App' });
132
+ const xcodeProject = {
133
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
134
+ getSourceFilesForTarget: vitest_1.vi.fn((targetName) => targetName === 'App' ? [selectedPreviewFile] : [otherPreviewFile]),
135
+ getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
136
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
137
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
138
+ 'AppTests',
139
+ ]),
140
+ getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
141
+ write: mocks.write,
142
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
143
+ };
144
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
145
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
146
+ telemetryEnabled: true,
147
+ projectDir: tempDir,
148
+ promoCode: 'CAM',
149
+ ignoreGitChanges: true,
150
+ nonInteractive: false,
151
+ });
152
+ (0, vitest_1.expect)(mocks.askForItemSelection).toHaveBeenCalledWith(['App', 'OtherApp'], 'Which app target should SnapshotPreviews use?');
153
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
154
+ xcodeProject,
155
+ hostedTestTargetName: 'AppTests',
156
+ previewTargetNames: ['App'],
157
+ });
158
+ });
159
+ (0, vitest_1.it)('prompts only among unit-test targets hosted by the selected app target', async () => {
160
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
161
+ const previewFile = path.join(tempDir, 'ContentView.swift');
162
+ fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
163
+ mocks.askForItemSelection.mockResolvedValue({
164
+ value: 'AppSnapshotTests',
165
+ });
166
+ const xcodeProject = {
167
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
168
+ getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
169
+ getAllTargets: vitest_1.vi.fn(() => ['App']),
170
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => [
171
+ 'AppTests',
172
+ 'AppSnapshotTests',
173
+ ]),
174
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
175
+ 'AppTests',
176
+ 'AppSnapshotTests',
177
+ ]),
178
+ write: mocks.write,
179
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
180
+ };
181
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
182
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
183
+ telemetryEnabled: true,
184
+ projectDir: tempDir,
185
+ promoCode: 'CAM',
186
+ ignoreGitChanges: true,
187
+ nonInteractive: false,
188
+ });
189
+ (0, vitest_1.expect)(xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget).toHaveBeenCalledWith('App');
190
+ (0, vitest_1.expect)(mocks.askForItemSelection).toHaveBeenCalledWith(['AppTests', 'AppSnapshotTests'], 'Which test target should render SnapshotPreviews?');
191
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
192
+ xcodeProject,
193
+ hostedTestTargetName: 'AppSnapshotTests',
194
+ previewTargetNames: ['App'],
195
+ });
196
+ });
197
+ (0, vitest_1.it)('links SnapshotPreferences to the selected app target without scanning for Swift previews', async () => {
198
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
199
+ const selectedFile = path.join(tempDir, 'SelectedView.swift');
200
+ const otherPreviewFile = path.join(tempDir, 'OtherView.swift');
201
+ fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');
202
+ fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');
203
+ mocks.askForItemSelection.mockResolvedValue({ value: 'App' });
204
+ const xcodeProject = {
205
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
206
+ getSourceFilesForTarget: vitest_1.vi.fn((targetName) => targetName === 'App' ? [selectedFile] : [otherPreviewFile]),
207
+ getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
208
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
209
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
210
+ 'AppTests',
211
+ ]),
212
+ getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
213
+ write: mocks.write,
214
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
215
+ };
216
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
217
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
218
+ telemetryEnabled: true,
219
+ projectDir: tempDir,
220
+ promoCode: 'CAM',
221
+ ignoreGitChanges: true,
222
+ nonInteractive: false,
223
+ });
224
+ (0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
225
+ (0, vitest_1.expect)(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();
226
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
227
+ xcodeProject,
228
+ hostedTestTargetName: 'AppTests',
229
+ previewTargetNames: ['App'],
230
+ });
231
+ });
232
+ (0, vitest_1.it)('warns when optional SnapshotPreferences linking fails', async () => {
233
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
234
+ const previewFile = path.join(tempDir, 'ContentView.swift');
235
+ fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
236
+ mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({
237
+ changed: true,
238
+ failedSnapshotPreferencesTargetNames: ['App'],
239
+ linked: true,
240
+ });
241
+ const xcodeProject = {
242
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
243
+ getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
244
+ getAllTargets: vitest_1.vi.fn(() => ['App']),
245
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
246
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
247
+ 'AppTests',
248
+ ]),
249
+ getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
250
+ write: mocks.write,
251
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
252
+ };
253
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
254
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
255
+ telemetryEnabled: true,
256
+ projectDir: tempDir,
257
+ promoCode: 'CAM',
258
+ ignoreGitChanges: true,
259
+ nonInteractive: false,
260
+ });
261
+ (0, vitest_1.expect)(mocks.warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining('SnapshotPreferences could not be linked to App'));
262
+ (0, vitest_1.expect)(mocks.checkInstalledCLISnapshots).toHaveBeenCalledTimes(1);
263
+ });
264
+ (0, vitest_1.it)('links SnapshotPreferences in non-interactive mode without scanning for Swift previews', async () => {
265
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
266
+ const selectedFile = path.join(tempDir, 'SelectedView.swift');
267
+ fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');
268
+ const xcodeProject = {
269
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
270
+ getSourceFilesForTarget: vitest_1.vi.fn(() => [selectedFile]),
271
+ getAllTargets: vitest_1.vi.fn(() => ['App']),
272
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
273
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
274
+ 'AppTests',
275
+ ]),
276
+ write: mocks.write,
277
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
278
+ };
279
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
280
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
281
+ telemetryEnabled: true,
282
+ projectDir: tempDir,
283
+ promoCode: 'CAM',
284
+ ignoreGitChanges: true,
285
+ nonInteractive: true,
286
+ });
287
+ (0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
288
+ (0, vitest_1.expect)(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();
289
+ (0, vitest_1.expect)(mocks.info).not.toHaveBeenCalledWith(vitest_1.expect.stringContaining('Continuing without Swift previews'));
290
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
291
+ xcodeProject,
292
+ hostedTestTargetName: 'AppTests',
293
+ previewTargetNames: ['App'],
294
+ });
295
+ });
296
+ (0, vitest_1.it)('uses explicit app and hosted XCTest targets without prompting', async () => {
297
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
298
+ const previewFile = path.join(tempDir, 'ContentView.swift');
299
+ fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
300
+ const xcodeProject = {
301
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
302
+ getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
303
+ getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
304
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
305
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => []),
306
+ write: mocks.write,
307
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
308
+ };
309
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
310
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
311
+ appTarget: 'App',
312
+ hostedTestTarget: 'AppTests',
313
+ telemetryEnabled: true,
314
+ projectDir: tempDir,
315
+ promoCode: 'CAM',
316
+ ignoreGitChanges: true,
317
+ nonInteractive: true,
318
+ });
319
+ (0, vitest_1.expect)(mocks.askForItemSelection).not.toHaveBeenCalled();
320
+ (0, vitest_1.expect)(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({
321
+ ignoreGitChanges: true,
322
+ cwd: tempDir,
323
+ nonInteractive: true,
324
+ });
325
+ (0, vitest_1.expect)(mocks.lookupXcodeProject).toHaveBeenCalledWith({
326
+ projectDir: tempDir,
327
+ nonInteractive: true,
328
+ });
329
+ (0, vitest_1.expect)(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ nonInteractive: true }));
330
+ (0, vitest_1.expect)(xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget).not.toHaveBeenCalled();
331
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
332
+ xcodeProject,
333
+ hostedTestTargetName: 'AppTests',
334
+ previewTargetNames: ['App'],
335
+ });
336
+ });
337
+ (0, vitest_1.it)('falls back to prompting among hosted XCTest targets when app-specific matching is inconclusive', async () => {
338
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
339
+ const previewFile = path.join(tempDir, 'ContentView.swift');
340
+ fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
341
+ mocks.askForItemSelection.mockResolvedValue({
342
+ value: 'AppSnapshotTests',
343
+ });
344
+ const xcodeProject = {
345
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
346
+ getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
347
+ getAllTargets: vitest_1.vi.fn(() => ['App']),
348
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => [
349
+ 'AppTests',
350
+ 'AppSnapshotTests',
351
+ ]),
352
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => []),
353
+ write: mocks.write,
354
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
355
+ };
356
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
357
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
358
+ telemetryEnabled: true,
359
+ projectDir: tempDir,
360
+ promoCode: 'CAM',
361
+ ignoreGitChanges: true,
362
+ nonInteractive: false,
363
+ });
364
+ (0, vitest_1.expect)(mocks.warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Could not automatically match'));
365
+ (0, vitest_1.expect)(mocks.askForItemSelection).toHaveBeenCalledWith(['AppTests', 'AppSnapshotTests'], 'Which hosted XCTest target should render SnapshotPreviews?');
366
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
367
+ xcodeProject,
368
+ hostedTestTargetName: 'AppSnapshotTests',
369
+ previewTargetNames: ['App'],
370
+ });
371
+ });
372
+ (0, vitest_1.it)('aborts when app target selection is ambiguous in non-interactive mode', async () => {
373
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
374
+ const xcodeProject = {
375
+ getAllTargets: vitest_1.vi.fn(() => ['App', 'OtherApp']),
376
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
377
+ };
378
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
379
+ await (0, vitest_1.expect)((0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
380
+ telemetryEnabled: true,
381
+ projectDir: tempDir,
382
+ promoCode: 'CAM',
383
+ ignoreGitChanges: true,
384
+ nonInteractive: true,
385
+ })).rejects.toThrow('aborted');
386
+ (0, vitest_1.expect)(mocks.askForItemSelection).not.toHaveBeenCalled();
387
+ (0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Pass --app-target <target-name>'));
388
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();
389
+ (0, vitest_1.expect)(mocks.abort).toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
390
+ (0, vitest_1.expect)(mocks.outro).not.toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
391
+ });
392
+ (0, vitest_1.it)('aborts with manual instructions instead of prompting when hosted XCTest fallback is ambiguous in non-interactive mode', async () => {
393
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
394
+ const xcodeProject = {
395
+ getAllTargets: vitest_1.vi.fn(() => ['App']),
396
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => [
397
+ 'AppTests',
398
+ 'AppSnapshotTests',
399
+ ]),
400
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => []),
401
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
402
+ };
403
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
404
+ await (0, vitest_1.expect)((0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
405
+ telemetryEnabled: true,
406
+ projectDir: tempDir,
407
+ promoCode: 'CAM',
408
+ ignoreGitChanges: true,
409
+ nonInteractive: true,
410
+ })).rejects.toThrow('aborted');
411
+ (0, vitest_1.expect)(mocks.askForItemSelection).not.toHaveBeenCalled();
412
+ (0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Pass --hosted-test-target <target-name>'));
413
+ (0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Manual setup:'));
414
+ (0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('import SnapshottingTests'));
415
+ (0, vitest_1.expect)(mocks.error).toHaveBeenCalledWith(vitest_1.expect.stringContaining('final class AppTestsSnapshotTest'));
416
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();
417
+ (0, vitest_1.expect)(mocks.abort).toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
418
+ (0, vitest_1.expect)(mocks.outro).not.toHaveBeenCalledWith('Apple Snapshots setup did not complete.');
419
+ });
420
+ (0, vitest_1.it)('wires the Apple Snapshots flow without Sentry auth/runtime/CI mutation', async () => {
421
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));
422
+ const previewFile = path.join(tempDir, 'ContentView.swift');
423
+ fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');
424
+ fs.writeFileSync(path.join(tempDir, 'Package.swift'), '', 'utf8');
425
+ const xcodeProject = {
426
+ getBundleIdentifierForTarget: vitest_1.vi.fn(() => 'com.getsentry.App'),
427
+ getSourceFilesForTarget: vitest_1.vi.fn(() => [previewFile]),
428
+ getAllTargets: vitest_1.vi.fn(() => ['App']),
429
+ getHostedUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
430
+ getHostedUnitTestTargetNamesForApplicationTarget: vitest_1.vi.fn(() => [
431
+ 'AppTests',
432
+ ]),
433
+ getUnitTestTargetNames: vitest_1.vi.fn(() => ['AppTests']),
434
+ write: mocks.write,
435
+ xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),
436
+ };
437
+ mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);
438
+ await (0, apple_snapshots_wizard_1.runAppleSnapshotsWizard)({
439
+ telemetryEnabled: true,
440
+ projectDir: tempDir,
441
+ promoCode: 'CAM',
442
+ ignoreGitChanges: true,
443
+ nonInteractive: false,
444
+ });
445
+ (0, vitest_1.expect)(mocks.withTelemetry).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ integration: 'appleSnapshots' }), vitest_1.expect.any(Function));
446
+ (0, vitest_1.expect)(mocks.printWelcome).toHaveBeenCalledWith({
447
+ wizardName: 'Sentry Apple Snapshots Wizard',
448
+ promoCode: 'CAM',
449
+ });
450
+ (0, vitest_1.expect)(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({
451
+ ignoreGitChanges: true,
452
+ cwd: tempDir,
453
+ nonInteractive: false,
454
+ });
455
+ (0, vitest_1.expect)(mocks.lookupXcodeProject).toHaveBeenCalledWith({
456
+ projectDir: tempDir,
457
+ nonInteractive: false,
458
+ });
459
+ (0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
460
+ (0, vitest_1.expect)(mocks.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining('SnapshotPreferences in Swift preview files'));
461
+ (0, vitest_1.expect)(mocks.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining('This wizard does not edit SwiftPM manifests'));
462
+ (0, vitest_1.expect)(mocks.ensureSnapshotTestFile).toHaveBeenCalledWith({
463
+ xcodeProject,
464
+ hostedTestTargetName: 'AppTests',
465
+ });
466
+ (0, vitest_1.expect)(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({
467
+ xcodeProject,
468
+ hostedTestTargetName: 'AppTests',
469
+ previewTargetNames: ['App'],
470
+ });
471
+ (0, vitest_1.expect)(mocks.write).toHaveBeenCalledTimes(1);
472
+ (0, vitest_1.expect)(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith({
473
+ projectDir: tempDir,
474
+ nonInteractive: false,
475
+ verificationGuidance: {
476
+ appId: 'com.getsentry.App',
477
+ hostedTestTargetName: 'AppTests',
478
+ projectDir: tempDir,
479
+ projectPath: path.join(tempDir, 'App.xcodeproj'),
480
+ schemeName: 'AppScheme',
481
+ snapshotTestClassName: 'AppTestsSnapshotTest',
482
+ },
483
+ });
484
+ (0, vitest_1.expect)(mocks.outro).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Apple Snapshots setup complete.'));
485
+ });
486
+ });
487
+ //# sourceMappingURL=apple-snapshots-wizard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apple-snapshots-wizard.test.js","sourceRoot":"","sources":["../../../../test/apple/snapshots/apple-snapshots-wizard.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\n\nconst mocks = vi.hoisted(() => ({\n abort: vi.fn(),\n askForItemSelection: vi.fn(),\n checkInstalledCLISnapshots: vi.fn(),\n confirm: vi.fn(),\n confirmContinueIfNoOrDirtyGitRepo: vi.fn(),\n configureSnapshotPreviewsXcodeProject: vi.fn(),\n ensureSnapshotTestFile: vi.fn(),\n error: vi.fn(),\n info: vi.fn(),\n lookupXcodeProject: vi.fn(),\n outro: vi.fn(),\n printWelcome: vi.fn(),\n resolveSnapshotVerificationSchemeName: vi.fn(),\n success: vi.fn(),\n warn: vi.fn(),\n withTelemetry: vi.fn(\n async (_options: { integration: string }, callback: () => Promise<void>) =>\n await callback(),\n ),\n write: vi.fn(),\n}));\n\nvi.mock('@clack/prompts', () => ({\n default: {\n confirm: mocks.confirm,\n log: {\n error: mocks.error,\n info: mocks.info,\n success: mocks.success,\n warn: mocks.warn,\n },\n outro: mocks.outro,\n },\n}));\n\nvi.mock('../../../src/telemetry', () => ({\n withTelemetry: mocks.withTelemetry,\n}));\n\nvi.mock('../../../src/utils/clack', () => ({\n abort: mocks.abort,\n abortIfCancelled: async <T>(value: T | Promise<T>) => await value,\n askForItemSelection: mocks.askForItemSelection,\n confirmContinueIfNoOrDirtyGitRepo: mocks.confirmContinueIfNoOrDirtyGitRepo,\n printWelcome: mocks.printWelcome,\n}));\n\nvi.mock('../../../src/apple/lookup-xcode-project', () => ({\n lookupXcodeProject: mocks.lookupXcodeProject,\n selectXcodeTarget: async (\n xcodeProject: { getAllTargets: () => string[] },\n options: {\n targetNames?: string[];\n promptMessage?: string;\n } = {},\n ): Promise<string> => {\n const targetNames = options.targetNames ?? xcodeProject.getAllTargets();\n if (targetNames.length === 1) {\n return targetNames[0];\n }\n\n const askForItemSelection = mocks.askForItemSelection as (\n items: string[],\n message: string,\n ) => Promise<{ value: string }>;\n const selection = await askForItemSelection(\n targetNames,\n options.promptMessage ?? 'Which target do you want to add Sentry to?',\n );\n return selection.value;\n },\n}));\n\nvi.mock('../../../src/apple/snapshots/snapshot-test-file', () => ({\n ensureSnapshotTestFile: mocks.ensureSnapshotTestFile,\n snapshotTestClassName: (hostedTestTargetName: string): string =>\n `${hostedTestTargetName}SnapshotTest`,\n snapshotTestTemplate: (className: string): string => `import SnapshottingTests\n\nfinal class ${className}: SnapshotTest {\n override class func snapshotPreviews() -> [String]? { nil }\n override class func excludedSnapshotPreviews() -> [String]? { nil }\n override class func snapshotPreviewModules() -> [String]? { nil }\n override class func excludedSnapshotPreviewModules() -> [String]? { nil }\n}\n`,\n}));\n\nvi.mock(\n '../../../src/apple/snapshots/configure-snapshotpreviews-xcode-project',\n () => ({\n configureSnapshotPreviewsXcodeProject:\n mocks.configureSnapshotPreviewsXcodeProject,\n }),\n);\n\nvi.mock('../../../src/apple/snapshots/snapshots-cli-preflight', () => ({\n checkInstalledCLISnapshots: mocks.checkInstalledCLISnapshots,\n}));\n\nvi.mock('../../../src/apple/snapshots/snapshot-verification-scheme', () => ({\n resolveSnapshotVerificationSchemeName:\n mocks.resolveSnapshotVerificationSchemeName,\n}));\n\nimport { runAppleSnapshotsWizard } from '../../../src/apple/snapshots/apple-snapshots-wizard';\n\ndescribe('runAppleSnapshotsWizard', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n mocks.ensureSnapshotTestFile.mockReturnValue({\n changed: true,\n className: 'AppTestsSnapshotTest',\n filePath: '/tmp/AppTestsSnapshotTest.swift',\n included: true,\n });\n mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({\n changed: true,\n failedSnapshotPreferencesTargetNames: [],\n linked: true,\n });\n mocks.resolveSnapshotVerificationSchemeName.mockReturnValue('AppScheme');\n mocks.askForItemSelection.mockResolvedValue({ value: 'App' });\n mocks.confirm.mockResolvedValue(false);\n mocks.abort.mockRejectedValue(new Error('aborted'));\n });\n\n it('links SnapshotPreferences only to the selected app target', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const selectedPreviewFile = path.join(tempDir, 'SelectedView.swift');\n const otherPreviewFile = path.join(tempDir, 'OtherView.swift');\n fs.writeFileSync(\n selectedPreviewFile,\n '#Preview { SelectedView() }',\n 'utf8',\n );\n fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({ value: 'App' });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn((targetName: string) =>\n targetName === 'App' ? [selectedPreviewFile] : [otherPreviewFile],\n ),\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.askForItemSelection).toHaveBeenCalledWith(\n ['App', 'OtherApp'],\n 'Which app target should SnapshotPreviews use?',\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('prompts only among unit-test targets hosted by the selected app target', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({\n value: 'AppSnapshotTests',\n });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(\n xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget,\n ).toHaveBeenCalledWith('App');\n expect(mocks.askForItemSelection).toHaveBeenCalledWith(\n ['AppTests', 'AppSnapshotTests'],\n 'Which test target should render SnapshotPreviews?',\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppSnapshotTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('links SnapshotPreferences to the selected app target without scanning for Swift previews', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const selectedFile = path.join(tempDir, 'SelectedView.swift');\n const otherPreviewFile = path.join(tempDir, 'OtherView.swift');\n fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');\n fs.writeFileSync(otherPreviewFile, '#Preview { OtherView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({ value: 'App' });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn((targetName: string) =>\n targetName === 'App' ? [selectedFile] : [otherPreviewFile],\n ),\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.confirm).not.toHaveBeenCalled();\n expect(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('warns when optional SnapshotPreferences linking fails', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n mocks.configureSnapshotPreviewsXcodeProject.mockReturnValue({\n changed: true,\n failedSnapshotPreferencesTargetNames: ['App'],\n linked: true,\n });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('SnapshotPreferences could not be linked to App'),\n );\n expect(mocks.checkInstalledCLISnapshots).toHaveBeenCalledTimes(1);\n });\n\n it('links SnapshotPreferences in non-interactive mode without scanning for Swift previews', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const selectedFile = path.join(tempDir, 'SelectedView.swift');\n fs.writeFileSync(selectedFile, 'struct SelectedView {}', 'utf8');\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [selectedFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n });\n\n expect(mocks.confirm).not.toHaveBeenCalled();\n expect(xcodeProject.getSourceFilesForTarget).not.toHaveBeenCalled();\n expect(mocks.info).not.toHaveBeenCalledWith(\n expect.stringContaining('Continuing without Swift previews'),\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('uses explicit app and hosted XCTest targets without prompting', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => []),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n appTarget: 'App',\n hostedTestTarget: 'AppTests',\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n });\n\n expect(mocks.askForItemSelection).not.toHaveBeenCalled();\n expect(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({\n ignoreGitChanges: true,\n cwd: tempDir,\n nonInteractive: true,\n });\n expect(mocks.lookupXcodeProject).toHaveBeenCalledWith({\n projectDir: tempDir,\n nonInteractive: true,\n });\n expect(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith(\n expect.objectContaining({ nonInteractive: true }),\n );\n expect(\n xcodeProject.getHostedUnitTestTargetNamesForApplicationTarget,\n ).not.toHaveBeenCalled();\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('falls back to prompting among hosted XCTest targets when app-specific matching is inconclusive', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n mocks.askForItemSelection.mockResolvedValue({\n value: 'AppSnapshotTests',\n });\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => []),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('Could not automatically match'),\n );\n expect(mocks.askForItemSelection).toHaveBeenCalledWith(\n ['AppTests', 'AppSnapshotTests'],\n 'Which hosted XCTest target should render SnapshotPreviews?',\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppSnapshotTests',\n previewTargetNames: ['App'],\n });\n });\n\n it('aborts when app target selection is ambiguous in non-interactive mode', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const xcodeProject = {\n getAllTargets: vi.fn(() => ['App', 'OtherApp']),\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await expect(\n runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n }),\n ).rejects.toThrow('aborted');\n\n expect(mocks.askForItemSelection).not.toHaveBeenCalled();\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('Pass --app-target <target-name>'),\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();\n expect(mocks.abort).toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n expect(mocks.outro).not.toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n });\n\n it('aborts with manual instructions instead of prompting when hosted XCTest fallback is ambiguous in non-interactive mode', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const xcodeProject = {\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => [\n 'AppTests',\n 'AppSnapshotTests',\n ]),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => []),\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await expect(\n runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: true,\n }),\n ).rejects.toThrow('aborted');\n\n expect(mocks.askForItemSelection).not.toHaveBeenCalled();\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('Pass --hosted-test-target <target-name>'),\n );\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('Manual setup:'),\n );\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('import SnapshottingTests'),\n );\n expect(mocks.error).toHaveBeenCalledWith(\n expect.stringContaining('final class AppTestsSnapshotTest'),\n );\n expect(mocks.configureSnapshotPreviewsXcodeProject).not.toHaveBeenCalled();\n expect(mocks.abort).toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n expect(mocks.outro).not.toHaveBeenCalledWith(\n 'Apple Snapshots setup did not complete.',\n );\n });\n\n it('wires the Apple Snapshots flow without Sentry auth/runtime/CI mutation', async () => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'snapshots-wizard-'));\n const previewFile = path.join(tempDir, 'ContentView.swift');\n fs.writeFileSync(previewFile, '#Preview { ContentView() }', 'utf8');\n fs.writeFileSync(path.join(tempDir, 'Package.swift'), '', 'utf8');\n const xcodeProject = {\n getBundleIdentifierForTarget: vi.fn(() => 'com.getsentry.App'),\n getSourceFilesForTarget: vi.fn(() => [previewFile]),\n getAllTargets: vi.fn(() => ['App']),\n getHostedUnitTestTargetNames: vi.fn(() => ['AppTests']),\n getHostedUnitTestTargetNamesForApplicationTarget: vi.fn(() => [\n 'AppTests',\n ]),\n getUnitTestTargetNames: vi.fn(() => ['AppTests']),\n write: mocks.write,\n xcodeprojPath: path.join(tempDir, 'App.xcodeproj'),\n };\n mocks.lookupXcodeProject.mockResolvedValue(xcodeProject);\n\n await runAppleSnapshotsWizard({\n telemetryEnabled: true,\n projectDir: tempDir,\n promoCode: 'CAM',\n ignoreGitChanges: true,\n nonInteractive: false,\n });\n\n expect(mocks.withTelemetry).toHaveBeenCalledWith(\n expect.objectContaining({ integration: 'appleSnapshots' }),\n expect.any(Function),\n );\n expect(mocks.printWelcome).toHaveBeenCalledWith({\n wizardName: 'Sentry Apple Snapshots Wizard',\n promoCode: 'CAM',\n });\n expect(mocks.confirmContinueIfNoOrDirtyGitRepo).toHaveBeenCalledWith({\n ignoreGitChanges: true,\n cwd: tempDir,\n nonInteractive: false,\n });\n expect(mocks.lookupXcodeProject).toHaveBeenCalledWith({\n projectDir: tempDir,\n nonInteractive: false,\n });\n expect(mocks.confirm).not.toHaveBeenCalled();\n expect(mocks.info).toHaveBeenCalledWith(\n expect.stringContaining('SnapshotPreferences in Swift preview files'),\n );\n expect(mocks.info).toHaveBeenCalledWith(\n expect.stringContaining('This wizard does not edit SwiftPM manifests'),\n );\n expect(mocks.ensureSnapshotTestFile).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n });\n expect(mocks.configureSnapshotPreviewsXcodeProject).toHaveBeenCalledWith({\n xcodeProject,\n hostedTestTargetName: 'AppTests',\n previewTargetNames: ['App'],\n });\n expect(mocks.write).toHaveBeenCalledTimes(1);\n expect(mocks.checkInstalledCLISnapshots).toHaveBeenCalledWith({\n projectDir: tempDir,\n nonInteractive: false,\n verificationGuidance: {\n appId: 'com.getsentry.App',\n hostedTestTargetName: 'AppTests',\n projectDir: tempDir,\n projectPath: path.join(tempDir, 'App.xcodeproj'),\n schemeName: 'AppScheme',\n snapshotTestClassName: 'AppTestsSnapshotTest',\n },\n });\n expect(mocks.outro).toHaveBeenCalledWith(\n expect.stringContaining('Apple Snapshots setup complete.'),\n );\n });\n});\n"]}
@@ -0,0 +1,24 @@
1
+ import type { XcodeProject } from '../../../src/apple/xcode-manager';
2
+ export type HostedTestTargetFixtureIds = {
3
+ targetId: string;
4
+ frameworksBuildPhaseId: string;
5
+ sourcesBuildPhaseId?: string;
6
+ debugBuildConfigurationId: string;
7
+ releaseBuildConfigurationId: string;
8
+ buildConfigurationListId: string;
9
+ productReferenceId: string;
10
+ };
11
+ type HostedTestTargetFixtureOptions = {
12
+ name?: string;
13
+ hostAppName?: string;
14
+ testHost?: string;
15
+ bundleLoader?: string;
16
+ ids?: HostedTestTargetFixtureIds;
17
+ includeSourcesBuildPhase?: boolean;
18
+ projectObjectId: string;
19
+ productsGroupId: string;
20
+ };
21
+ export declare function copySingleTargetProjectToTemp(prefix: string): string;
22
+ export declare function addHostedUnitTestTarget(xcodeProject: XcodeProject, options: HostedTestTargetFixtureOptions): HostedTestTargetFixtureIds;
23
+ export declare function hostedTestTargetFixtureIds(name: string): HostedTestTargetFixtureIds;
24
+ export {};