@sentry/wizard 4.6.0 → 4.8.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 (218) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +19 -19
  3. package/dist/bin.js +9 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/e2e-tests/tests/angular-17.test.d.ts +1 -0
  6. package/dist/e2e-tests/tests/angular-17.test.js +196 -0
  7. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -0
  8. package/dist/e2e-tests/tests/angular-19.test.d.ts +1 -0
  9. package/dist/e2e-tests/tests/angular-19.test.js +194 -0
  10. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -0
  11. package/dist/e2e-tests/tests/expo.test.d.ts +1 -0
  12. package/dist/e2e-tests/tests/expo.test.js +95 -0
  13. package/dist/e2e-tests/tests/expo.test.js.map +1 -0
  14. package/dist/e2e-tests/tests/flutter.test.js +16 -16
  15. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/help-message.test.d.ts +1 -0
  17. package/dist/e2e-tests/tests/help-message.test.js +56 -0
  18. package/dist/e2e-tests/tests/help-message.test.js.map +1 -0
  19. package/dist/e2e-tests/tests/nextjs-14.test.js +15 -15
  20. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  21. package/dist/e2e-tests/tests/nextjs-15.test.js +15 -15
  22. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  23. package/dist/e2e-tests/tests/nuxt-3.test.js +13 -12
  24. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  25. package/dist/e2e-tests/tests/nuxt-4.test.js +13 -12
  26. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  27. package/dist/e2e-tests/tests/react-native.test.d.ts +1 -0
  28. package/dist/e2e-tests/tests/react-native.test.js +97 -0
  29. package/dist/e2e-tests/tests/react-native.test.js.map +1 -0
  30. package/dist/e2e-tests/tests/remix.test.js +24 -24
  31. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  32. package/dist/e2e-tests/tests/sveltekit.test.js +22 -22
  33. package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
  34. package/dist/e2e-tests/utils/index.d.ts +7 -0
  35. package/dist/e2e-tests/utils/index.js +33 -12
  36. package/dist/e2e-tests/utils/index.js.map +1 -1
  37. package/dist/lib/Constants.d.ts +6 -1
  38. package/dist/lib/Constants.js +3 -0
  39. package/dist/lib/Constants.js.map +1 -1
  40. package/dist/lib/Helper/Logging.d.ts +1 -1
  41. package/dist/lib/Helper/Logging.js.map +1 -1
  42. package/dist/lib/Helper/__tests__/File.js +9 -9
  43. package/dist/lib/Helper/__tests__/File.js.map +1 -1
  44. package/dist/lib/Helper/__tests__/MergeConfig.js +17 -17
  45. package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
  46. package/dist/lib/Helper/__tests__/SentryCli.js +23 -22
  47. package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
  48. package/dist/lib/Setup.d.ts +2 -1
  49. package/dist/lib/Setup.js +12 -2
  50. package/dist/lib/Setup.js.map +1 -1
  51. package/dist/lib/Steps/BaseStep.d.ts +1 -1
  52. package/dist/lib/Steps/BaseStep.js.map +1 -1
  53. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  54. package/dist/lib/Steps/Welcome.js +5 -0
  55. package/dist/lib/Steps/Welcome.js.map +1 -1
  56. package/dist/lib/__tests__/Env.js +4 -3
  57. package/dist/lib/__tests__/Env.js.map +1 -1
  58. package/dist/src/angular/angular-wizard.d.ts +3 -0
  59. package/dist/src/angular/angular-wizard.js +186 -0
  60. package/dist/src/angular/angular-wizard.js.map +1 -0
  61. package/dist/src/angular/codemods/app-config.d.ts +3 -0
  62. package/dist/src/angular/codemods/app-config.js +211 -0
  63. package/dist/src/angular/codemods/app-config.js.map +1 -0
  64. package/dist/src/angular/codemods/main.d.ts +20 -0
  65. package/dist/src/angular/codemods/main.js +62 -0
  66. package/dist/src/angular/codemods/main.js.map +1 -0
  67. package/dist/src/angular/codemods/sourcemaps.d.ts +21 -0
  68. package/dist/src/angular/codemods/sourcemaps.js +94 -0
  69. package/dist/src/angular/codemods/sourcemaps.js.map +1 -0
  70. package/dist/src/angular/example-component.d.ts +8 -0
  71. package/dist/src/angular/example-component.js +286 -0
  72. package/dist/src/angular/example-component.js.map +1 -0
  73. package/dist/src/angular/sdk-setup.d.ts +6 -0
  74. package/dist/src/angular/sdk-setup.js +99 -0
  75. package/dist/src/angular/sdk-setup.js.map +1 -0
  76. package/dist/src/apple/apple-wizard.js +24 -64
  77. package/dist/src/apple/apple-wizard.js.map +1 -1
  78. package/dist/src/apple/configure-package-manager.d.ts +5 -0
  79. package/dist/src/apple/configure-package-manager.js +68 -0
  80. package/dist/src/apple/configure-package-manager.js.map +1 -0
  81. package/dist/src/apple/configure-sentry-cli.d.ts +4 -0
  82. package/dist/src/apple/configure-sentry-cli.js +47 -0
  83. package/dist/src/apple/configure-sentry-cli.js.map +1 -0
  84. package/dist/src/apple/configure-xcode-project.d.ts +8 -0
  85. package/dist/src/apple/configure-xcode-project.js +11 -0
  86. package/dist/src/apple/configure-xcode-project.js.map +1 -0
  87. package/dist/src/apple/inject-code-snippet.d.ts +6 -0
  88. package/dist/src/apple/inject-code-snippet.js +54 -0
  89. package/dist/src/apple/inject-code-snippet.js.map +1 -0
  90. package/dist/src/apple/templates.js +11 -7
  91. package/dist/src/apple/templates.js.map +1 -1
  92. package/dist/src/apple/xcode-manager.js +3 -6
  93. package/dist/src/apple/xcode-manager.js.map +1 -1
  94. package/dist/src/flutter/flutter-wizard.js +10 -2
  95. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  96. package/dist/src/nextjs/nextjs-wizard.js +26 -12
  97. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  98. package/dist/src/nextjs/templates.js +59 -8
  99. package/dist/src/nextjs/templates.js.map +1 -1
  100. package/dist/src/nuxt/templates.js +30 -0
  101. package/dist/src/nuxt/templates.js.map +1 -1
  102. package/dist/src/react-native/expo-metro.js +4 -1
  103. package/dist/src/react-native/expo-metro.js.map +1 -1
  104. package/dist/src/react-native/expo.js +5 -1
  105. package/dist/src/react-native/expo.js.map +1 -1
  106. package/dist/src/react-native/javascript.d.ts +6 -4
  107. package/dist/src/react-native/javascript.js +33 -10
  108. package/dist/src/react-native/javascript.js.map +1 -1
  109. package/dist/src/react-native/metro.js +8 -2
  110. package/dist/src/react-native/metro.js.map +1 -1
  111. package/dist/src/react-native/react-native-wizard.d.ts +4 -0
  112. package/dist/src/react-native/react-native-wizard.js +30 -5
  113. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  114. package/dist/src/react-native/xcode.d.ts +7 -3
  115. package/dist/src/react-native/xcode.js +68 -20
  116. package/dist/src/react-native/xcode.js.map +1 -1
  117. package/dist/src/remix/sdk-example.js +30 -1
  118. package/dist/src/remix/sdk-example.js.map +1 -1
  119. package/dist/src/remix/sdk-setup.js +11 -5
  120. package/dist/src/remix/sdk-setup.js.map +1 -1
  121. package/dist/src/run.d.ts +1 -1
  122. package/dist/src/run.js +7 -2
  123. package/dist/src/run.js.map +1 -1
  124. package/dist/src/sourcemaps/sourcemaps-wizard.d.ts +1 -1
  125. package/dist/src/sourcemaps/sourcemaps-wizard.js +35 -20
  126. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  127. package/dist/src/sourcemaps/tools/angular.d.ts +1 -0
  128. package/dist/src/sourcemaps/tools/angular.js +7 -7
  129. package/dist/src/sourcemaps/tools/angular.js.map +1 -1
  130. package/dist/src/sourcemaps/tools/sentry-cli.d.ts +5 -1
  131. package/dist/src/sourcemaps/tools/sentry-cli.js +6 -3
  132. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  133. package/dist/src/sourcemaps/tools/tsc.js +5 -1
  134. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  135. package/dist/src/sourcemaps/tools/vite.js +4 -1
  136. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  137. package/dist/src/sourcemaps/tools/webpack.js +4 -1
  138. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  139. package/dist/src/sveltekit/sdk-example.js +1 -1
  140. package/dist/src/sveltekit/sdk-example.js.map +1 -1
  141. package/dist/src/sveltekit/sveltekit-wizard.js +2 -2
  142. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  143. package/dist/src/sveltekit/templates.js +28 -1
  144. package/dist/src/sveltekit/templates.js.map +1 -1
  145. package/dist/src/utils/clack/index.d.ts +11 -3
  146. package/dist/src/utils/clack/index.js +12 -4
  147. package/dist/src/utils/clack/index.js.map +1 -1
  148. package/dist/src/utils/package-manager.d.ts +2 -0
  149. package/dist/src/utils/package-manager.js +55 -5
  150. package/dist/src/utils/package-manager.js.map +1 -1
  151. package/dist/src/version.d.ts +1 -1
  152. package/dist/src/version.js +1 -1
  153. package/dist/src/version.js.map +1 -1
  154. package/dist/test/android/code-tools.test.js +13 -12
  155. package/dist/test/android/code-tools.test.js.map +1 -1
  156. package/dist/test/angular/angular-wizard.test.d.ts +1 -0
  157. package/dist/test/angular/angular-wizard.test.js +27 -0
  158. package/dist/test/angular/angular-wizard.test.js.map +1 -0
  159. package/dist/test/angular/codemods/sourcemaps.test.d.ts +1 -0
  160. package/dist/test/angular/codemods/sourcemaps.test.js +237 -0
  161. package/dist/test/angular/codemods/sourcemaps.test.js.map +1 -0
  162. package/dist/test/angular/example-component.test.d.ts +1 -0
  163. package/dist/test/angular/example-component.test.js +105 -0
  164. package/dist/test/angular/example-component.test.js.map +1 -0
  165. package/dist/test/apple/cocoapod.test.js +77 -72
  166. package/dist/test/apple/cocoapod.test.js.map +1 -1
  167. package/dist/test/apple/code-tools.test.js +173 -166
  168. package/dist/test/apple/code-tools.test.js.map +1 -1
  169. package/dist/test/apple/fastfile.test.js +86 -83
  170. package/dist/test/apple/fastfile.test.js.map +1 -1
  171. package/dist/test/apple/templates.test.js +32 -27
  172. package/dist/test/apple/templates.test.js.map +1 -1
  173. package/dist/test/apple/xcode-manager.test.js +182 -183
  174. package/dist/test/apple/xcode-manager.test.js.map +1 -1
  175. package/dist/test/flutter/code-tools.test.js +29 -28
  176. package/dist/test/flutter/code-tools.test.js.map +1 -1
  177. package/dist/test/flutter/templates.test.js +15 -14
  178. package/dist/test/flutter/templates.test.js.map +1 -1
  179. package/dist/test/nextjs/templates.test.js +43 -36
  180. package/dist/test/nextjs/templates.test.js.map +1 -1
  181. package/dist/test/nuxt/templates.test.js +25 -24
  182. package/dist/test/nuxt/templates.test.js.map +1 -1
  183. package/dist/test/react-native/expo-metro.test.js +11 -10
  184. package/dist/test/react-native/expo-metro.test.js.map +1 -1
  185. package/dist/test/react-native/expo.test.js +11 -10
  186. package/dist/test/react-native/expo.test.js.map +1 -1
  187. package/dist/test/react-native/gradle.test.js +27 -26
  188. package/dist/test/react-native/gradle.test.js.map +1 -1
  189. package/dist/test/react-native/javascript.test.js +108 -58
  190. package/dist/test/react-native/javascript.test.js.map +1 -1
  191. package/dist/test/react-native/metro.test.js +178 -64
  192. package/dist/test/react-native/metro.test.js.map +1 -1
  193. package/dist/test/react-native/xcode.test.js +138 -37
  194. package/dist/test/react-native/xcode.test.js.map +1 -1
  195. package/dist/test/remix/client-entry.test.js +18 -17
  196. package/dist/test/remix/client-entry.test.js.map +1 -1
  197. package/dist/test/remix/server-instrumentation.test.js +6 -5
  198. package/dist/test/remix/server-instrumentation.test.js.map +1 -1
  199. package/dist/test/sourcemaps/tools/sentry-cli.test.js +20 -20
  200. package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
  201. package/dist/test/sourcemaps/tools/tsc.test.js +13 -14
  202. package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -1
  203. package/dist/test/sourcemaps/tools/vite.test.js +13 -14
  204. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  205. package/dist/test/sourcemaps/tools/webpack.test.js +19 -20
  206. package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -1
  207. package/dist/test/sveltekit/templates.test.js +13 -12
  208. package/dist/test/sveltekit/templates.test.js.map +1 -1
  209. package/dist/test/utils/ast-utils.test.js +45 -44
  210. package/dist/test/utils/ast-utils.test.js.map +1 -1
  211. package/dist/test/utils/clack/index.test.js +140 -144
  212. package/dist/test/utils/clack/index.test.js.map +1 -1
  213. package/dist/test/utils/package-manager.test.js +8 -7
  214. package/dist/test/utils/package-manager.test.js.map +1 -1
  215. package/package.json +10 -38
  216. package/dist/e2e-tests/jest.config.d.ts +0 -17
  217. package/dist/e2e-tests/jest.config.js +0 -23
  218. package/dist/e2e-tests/jest.config.js.map +0 -1
@@ -35,120 +35,121 @@ const axios_1 = __importDefault(require("axios"));
35
35
  // @ts-expect-error - clack is ESM and TS complains about that. It works though
36
36
  const clack = __importStar(require("@clack/prompts"));
37
37
  const Sentry = __importStar(require("@sentry/node"));
38
- jest.mock('node:child_process', () => ({
38
+ const vitest_1 = require("vitest");
39
+ vitest_1.vi.mock('node:child_process', async () => ({
39
40
  __esModule: true,
40
- ...jest.requireActual('node:child_process'),
41
+ ...(await vitest_1.vi.importActual('node:child_process')),
41
42
  }));
42
- jest.mock('@clack/prompts', () => ({
43
+ vitest_1.vi.mock('@clack/prompts', () => ({
43
44
  log: {
44
- info: jest.fn(),
45
- success: jest.fn(),
46
- warn: jest.fn(),
47
- error: jest.fn(),
45
+ info: vitest_1.vi.fn(),
46
+ success: vitest_1.vi.fn(),
47
+ warn: vitest_1.vi.fn(),
48
+ error: vitest_1.vi.fn(),
48
49
  },
49
- outro: jest.fn(),
50
- text: jest.fn(),
51
- confirm: jest.fn(),
52
- cancel: jest.fn(),
50
+ outro: vitest_1.vi.fn(),
51
+ text: vitest_1.vi.fn(),
52
+ confirm: vitest_1.vi.fn(),
53
+ cancel: vitest_1.vi.fn(),
53
54
  // passthrough for abortIfCancelled
54
- isCancel: jest.fn().mockReturnValue(false),
55
- spinner: jest
55
+ isCancel: vitest_1.vi.fn().mockReturnValue(false),
56
+ spinner: vitest_1.vi
56
57
  .fn()
57
- .mockImplementation(() => ({ start: jest.fn(), stop: jest.fn() })),
58
- select: jest.fn(),
58
+ .mockImplementation(() => ({ start: vitest_1.vi.fn(), stop: vitest_1.vi.fn() })),
59
+ select: vitest_1.vi.fn(),
59
60
  }));
60
61
  const clackMock = clack;
61
- jest.mock('axios');
62
+ vitest_1.vi.mock('axios');
62
63
  const mockedAxios = axios_1.default;
63
- jest.mock('opn', () => jest.fn(() => Promise.resolve({ on: jest.fn() })));
64
+ vitest_1.vi.mock('opn', () => ({
65
+ default: vitest_1.vi.fn(() => Promise.resolve({ on: vitest_1.vi.fn() })),
66
+ }));
64
67
  function mockUserResponse(fn, response) {
65
68
  fn.mockReturnValueOnce(response);
66
69
  }
67
- describe('askForToolConfigPath', () => {
68
- afterEach(() => {
69
- jest.clearAllMocks();
70
+ (0, vitest_1.describe)('askForToolConfigPath', () => {
71
+ (0, vitest_1.afterEach)(() => {
72
+ vitest_1.vi.clearAllMocks();
70
73
  });
71
- it('returns undefined if users have no config file', async () => {
74
+ (0, vitest_1.it)('returns undefined if users have no config file', async () => {
72
75
  mockUserResponse(clack.confirm, false);
73
76
  const result = await (0, clack_1.askForToolConfigPath)('Webpack', 'webpack.config.js');
74
- expect(clack.confirm).toHaveBeenCalledWith(expect.objectContaining({
77
+ (0, vitest_1.expect)(clack.confirm).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
75
78
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
76
- message: expect.stringContaining('have a Webpack config file'),
79
+ message: vitest_1.expect.stringContaining('have a Webpack config file'),
77
80
  }));
78
- expect(result).toBeUndefined();
81
+ (0, vitest_1.expect)(result).toBeUndefined();
79
82
  });
80
- it('returns the path if users have a config file and the entered path is valid', async () => {
83
+ (0, vitest_1.it)('returns the path if users have a config file and the entered path is valid', async () => {
81
84
  mockUserResponse(clack.confirm, true);
82
85
  mockUserResponse(clack.text, 'my.webpack.config.js');
83
86
  const result = await (0, clack_1.askForToolConfigPath)('Webpack', 'webpack.config.js');
84
- expect(clack.confirm).toHaveBeenCalledWith(expect.objectContaining({
87
+ (0, vitest_1.expect)(clack.confirm).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
85
88
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
86
- message: expect.stringContaining('have a Webpack config file'),
89
+ message: vitest_1.expect.stringContaining('have a Webpack config file'),
87
90
  }));
88
- expect(clack.text).toHaveBeenCalledWith(expect.objectContaining({
91
+ (0, vitest_1.expect)(clack.text).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
89
92
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
90
- message: expect.stringContaining('enter the path to your Webpack config file'),
93
+ message: vitest_1.expect.stringContaining('enter the path to your Webpack config file'),
91
94
  }));
92
- expect(result).toBe('my.webpack.config.js');
95
+ (0, vitest_1.expect)(result).toBe('my.webpack.config.js');
93
96
  });
94
97
  });
95
- describe('createNewConfigFile', () => {
96
- afterEach(() => {
97
- jest.clearAllMocks();
98
+ (0, vitest_1.describe)('createNewConfigFile', () => {
99
+ (0, vitest_1.afterEach)(() => {
100
+ vitest_1.vi.clearAllMocks();
98
101
  });
99
- it('writes the file to disk and returns true if the file was created successfully', async () => {
100
- const writeFileSpy = jest
102
+ (0, vitest_1.it)('writes the file to disk and returns true if the file was created successfully', async () => {
103
+ const writeFileSpy = vitest_1.vi
101
104
  .spyOn(fs.promises, 'writeFile')
102
- .mockImplementation(jest.fn());
105
+ .mockImplementation(vitest_1.vi.fn());
103
106
  const filename = '/webpack.config.js';
104
107
  const code = 'module.exports = {/*config...*/}';
105
108
  const result = await (0, clack_1.createNewConfigFile)(filename, code);
106
- expect(result).toBe(true);
107
- expect(writeFileSpy).toHaveBeenCalledWith(filename, code);
109
+ (0, vitest_1.expect)(result).toBe(true);
110
+ (0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(filename, code);
108
111
  });
109
- it('logs more information if provided as an argument', async () => {
110
- jest.spyOn(fs.promises, 'writeFile').mockImplementation(jest.fn());
112
+ (0, vitest_1.it)('logs more information if provided as an argument', async () => {
113
+ vitest_1.vi.spyOn(fs.promises, 'writeFile').mockImplementation(vitest_1.vi.fn());
111
114
  const filename = '/webpack.config.js';
112
115
  const code = 'module.exports = {/*config...*/}';
113
116
  const moreInfo = 'More information...';
114
117
  await (0, clack_1.createNewConfigFile)(filename, code, moreInfo);
115
- expect(clack.log.info).toHaveBeenCalledTimes(1);
116
- expect(clack.log.info).toHaveBeenCalledWith(expect.stringContaining(moreInfo));
118
+ (0, vitest_1.expect)(clack.log.info).toHaveBeenCalledTimes(1);
119
+ (0, vitest_1.expect)(clack.log.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining(moreInfo));
117
120
  });
118
- it('returns false and logs a warning if the file could not be created', async () => {
119
- const writeFileSpy = jest
121
+ (0, vitest_1.it)('returns false and logs a warning if the file could not be created', async () => {
122
+ const writeFileSpy = vitest_1.vi
120
123
  .spyOn(fs.promises, 'writeFile')
121
124
  .mockImplementation(() => Promise.reject(new Error('Could not write')));
122
125
  const filename = '/webpack.config.js';
123
126
  const code = 'module.exports = {/*config...*/}';
124
127
  const result = await (0, clack_1.createNewConfigFile)(filename, code);
125
- expect(result).toBe(false);
126
- expect(writeFileSpy).toHaveBeenCalledWith(filename, code);
127
- expect(clack.log.warn).toHaveBeenCalledTimes(1);
128
+ (0, vitest_1.expect)(result).toBe(false);
129
+ (0, vitest_1.expect)(writeFileSpy).toHaveBeenCalledWith(filename, code);
130
+ (0, vitest_1.expect)(clack.log.warn).toHaveBeenCalledTimes(1);
128
131
  });
129
- it('returns false if the passed path is not absolute', async () => {
132
+ (0, vitest_1.it)('returns false if the passed path is not absolute', async () => {
130
133
  const result = await (0, clack_1.createNewConfigFile)('./relative/webpack.config.js', '');
131
- expect(result).toBe(false);
134
+ (0, vitest_1.expect)(result).toBe(false);
132
135
  });
133
136
  });
134
- describe('installPackage', () => {
135
- afterEach(() => {
136
- jest.clearAllMocks();
137
+ (0, vitest_1.describe)('installPackage', () => {
138
+ (0, vitest_1.afterEach)(() => {
139
+ vitest_1.vi.clearAllMocks();
137
140
  });
138
- const spawnSpy = jest
139
- .spyOn(ChildProcess, 'spawn')
140
- // @ts-expect-error - ignoring complete typing
141
- .mockImplementation(() => ({
141
+ const spawnSpy = vitest_1.vi.spyOn(ChildProcess, 'spawn').mockImplementation(() => ({
142
142
  // @ts-expect-error - not passing the full object but directly resolving
143
143
  // to simulate a successful install
144
- on: jest.fn((evt, cb) => {
144
+ on: vitest_1.vi.fn((evt, cb) => {
145
145
  if (evt === 'close') {
146
146
  cb(0);
147
147
  }
148
148
  }),
149
- stderr: { on: jest.fn() },
149
+ // @ts-expect-error - this is fine
150
+ stderr: { on: vitest_1.vi.fn() },
150
151
  }));
151
- it('force-installs a package if the forceInstall flag is set', async () => {
152
+ (0, vitest_1.it)('force-installs a package if the forceInstall flag is set', async () => {
152
153
  const packageManagerMock = {
153
154
  name: 'npm',
154
155
  label: 'NPM',
@@ -157,8 +158,8 @@ describe('installPackage', () => {
157
158
  runScriptCommand: 'npm run',
158
159
  flags: '',
159
160
  forceInstallFlag: '--force',
160
- detect: jest.fn(),
161
- addOverride: jest.fn(),
161
+ detect: vitest_1.vi.fn(),
162
+ addOverride: vitest_1.vi.fn(),
162
163
  };
163
164
  await (0, clack_1.installPackage)({
164
165
  alreadyInstalled: false,
@@ -168,9 +169,9 @@ describe('installPackage', () => {
168
169
  askBeforeUpdating: false,
169
170
  packageManager: packageManagerMock,
170
171
  });
171
- expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
172
+ (0, vitest_1.expect)(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
172
173
  });
173
- it.each([false, undefined])("doesn't force-install a package if the forceInstall flag is %s", async (flag) => {
174
+ vitest_1.it.each([false, undefined])("doesn't force-install a package if the forceInstall flag is %s", async (flag) => {
174
175
  const packageManagerMock = {
175
176
  name: 'npm',
176
177
  label: 'NPM',
@@ -179,8 +180,8 @@ describe('installPackage', () => {
179
180
  runScriptCommand: 'npm run',
180
181
  flags: '',
181
182
  forceInstallFlag: '--force',
182
- detect: jest.fn(),
183
- addOverride: jest.fn(),
183
+ detect: vitest_1.vi.fn(),
184
+ addOverride: vitest_1.vi.fn(),
184
185
  };
185
186
  await (0, clack_1.installPackage)({
186
187
  alreadyInstalled: false,
@@ -190,9 +191,9 @@ describe('installPackage', () => {
190
191
  askBeforeUpdating: false,
191
192
  packageManager: packageManagerMock,
192
193
  });
193
- expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@sentry/sveltekit'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
194
+ (0, vitest_1.expect)(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@sentry/sveltekit'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
194
195
  });
195
- it('adds install flags if defined', async () => {
196
+ (0, vitest_1.it)('adds install flags if defined', async () => {
196
197
  const packageManagerMock = {
197
198
  name: 'npm',
198
199
  label: 'NPM',
@@ -201,8 +202,8 @@ describe('installPackage', () => {
201
202
  runScriptCommand: 'npm run',
202
203
  flags: '--ignore-workspace-root-check',
203
204
  forceInstallFlag: '--force',
204
- detect: jest.fn(),
205
- addOverride: jest.fn(),
205
+ detect: vitest_1.vi.fn(),
206
+ addOverride: vitest_1.vi.fn(),
206
207
  };
207
208
  await (0, clack_1.installPackage)({
208
209
  alreadyInstalled: false,
@@ -212,23 +213,18 @@ describe('installPackage', () => {
212
213
  askBeforeUpdating: false,
213
214
  packageManager: packageManagerMock,
214
215
  });
215
- expect(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--ignore-workspace-root-check', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
216
+ (0, vitest_1.expect)(spawnSpy).toHaveBeenCalledWith('npm', ['install', '@some/package', '--ignore-workspace-root-check', '--force'], { shell: true, stdio: ['pipe', 'ignore', 'pipe'] });
216
217
  });
217
218
  });
218
- describe('askForWizardLogin', () => {
219
- // mock axios
220
- afterEach(() => {
221
- // clackMock.confirm.mockClear();
222
- // mockUserResponse(clack.confirm as jest.Mock, undefined);
223
- });
224
- beforeEach(() => {
225
- jest.clearAllMocks();
219
+ (0, vitest_1.describe)('askForWizardLogin', () => {
220
+ (0, vitest_1.beforeEach)(() => {
221
+ vitest_1.vi.clearAllMocks();
226
222
  mockedAxios.get.mockClear();
227
223
  clackMock.confirm.mockClear();
228
224
  clackMock.confirm.mockReset();
229
225
  mockUserResponse(clack.confirm, undefined);
230
226
  });
231
- it('asks if a user already has a Sentry account by default', async () => {
227
+ (0, vitest_1.it)('asks if a user already has a Sentry account by default', async () => {
232
228
  mockUserResponse(clack.confirm, Promise.resolve(true));
233
229
  // Provide the data object to be returned
234
230
  mockedAxios.get.mockResolvedValue({
@@ -237,12 +233,12 @@ describe('askForWizardLogin', () => {
237
233
  },
238
234
  });
239
235
  await (0, clack_1.askForWizardLogin)({ url: 'https://santry.io/' });
240
- expect(clack.confirm).toHaveBeenCalledWith(expect.objectContaining({
236
+ (0, vitest_1.expect)(clack.confirm).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
241
237
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
242
- message: expect.stringContaining('already have a Sentry account'),
238
+ message: vitest_1.expect.stringContaining('already have a Sentry account'),
243
239
  }));
244
240
  });
245
- it('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {
241
+ (0, vitest_1.it)('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {
246
242
  mockUserResponse(clackMock.confirm, Promise.resolve(true));
247
243
  // Provide the data object to be returned
248
244
  mockedAxios.get.mockResolvedValue({
@@ -255,124 +251,124 @@ describe('askForWizardLogin', () => {
255
251
  orgSlug: 'my-org',
256
252
  projectSlug: 'my-project',
257
253
  });
258
- expect(clack.confirm).not.toHaveBeenCalled();
254
+ (0, vitest_1.expect)(clack.confirm).not.toHaveBeenCalled();
259
255
  });
260
256
  });
261
- describe('abort', () => {
257
+ (0, vitest_1.describe)('abort', () => {
262
258
  const sentryTxn = {
263
- setStatus: jest.fn(),
264
- finish: jest.fn(),
259
+ setStatus: vitest_1.vi.fn(),
260
+ finish: vitest_1.vi.fn(),
265
261
  };
266
262
  let sentrySession = {
267
263
  status: 999,
268
264
  };
269
- beforeEach(() => {
270
- jest.clearAllMocks();
265
+ (0, vitest_1.beforeEach)(() => {
266
+ vitest_1.vi.clearAllMocks();
271
267
  sentrySession = {
272
268
  status: 999,
273
269
  };
274
270
  });
275
- jest.spyOn(Sentry, 'getCurrentHub').mockReturnValue({
271
+ vitest_1.vi.spyOn(Sentry, 'getCurrentHub').mockReturnValue({
276
272
  getScope: () => ({
277
273
  // @ts-expect-error - don't care about the rest of the required props value
278
274
  getTransaction: () => sentryTxn,
279
275
  // @ts-expect-error - don't care about the rest of the required props value
280
276
  getSession: () => sentrySession,
281
277
  }),
282
- captureSession: jest.fn(),
278
+ captureSession: vitest_1.vi.fn(),
283
279
  });
284
- const flushSpy = jest.fn();
285
- jest.spyOn(Sentry, 'flush').mockImplementation(flushSpy);
286
- it('ends the process with an error exit code by default', async () => {
287
- // @ts-expect-error - jest doesn't like the empty function
280
+ const flushSpy = vitest_1.vi.fn();
281
+ vitest_1.vi.spyOn(Sentry, 'flush').mockImplementation(flushSpy);
282
+ (0, vitest_1.it)('ends the process with an error exit code by default', async () => {
283
+ // @ts-expect-error - vitest doesn't like the empty function
288
284
  // eslint-disable-next-line @typescript-eslint/no-empty-function
289
- const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => { });
285
+ const exitSpy = vitest_1.vi.spyOn(process, 'exit').mockImplementation(() => { });
290
286
  await (0, clack_1.abort)();
291
- expect(exitSpy).toHaveBeenCalledWith(1);
292
- expect(clackMock.outro).toHaveBeenCalledTimes(1);
293
- expect(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');
294
- expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');
295
- expect(sentryTxn.finish).toHaveBeenCalledTimes(1);
296
- expect(sentrySession.status).toBe('crashed');
297
- expect(flushSpy).toHaveBeenLastCalledWith(3000);
287
+ (0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(1);
288
+ (0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledTimes(1);
289
+ (0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');
290
+ (0, vitest_1.expect)(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');
291
+ (0, vitest_1.expect)(sentryTxn.finish).toHaveBeenCalledTimes(1);
292
+ (0, vitest_1.expect)(sentrySession.status).toBe('crashed');
293
+ (0, vitest_1.expect)(flushSpy).toHaveBeenLastCalledWith(3000);
298
294
  });
299
- it('ends the process with a custom exit code and message if provided', async () => {
300
- // @ts-expect-error - jest doesn't like the empty function
295
+ (0, vitest_1.it)('ends the process with a custom exit code and message if provided', async () => {
296
+ // @ts-expect-error - vitest doesn't like the empty function
301
297
  // eslint-disable-next-line @typescript-eslint/no-empty-function
302
- const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => { });
298
+ const exitSpy = vitest_1.vi.spyOn(process, 'exit').mockImplementation(() => { });
303
299
  await (0, clack_1.abort)('Bye', 0);
304
- expect(exitSpy).toHaveBeenCalledWith(0);
305
- expect(clackMock.outro).toHaveBeenCalledTimes(1);
306
- expect(clackMock.outro).toHaveBeenCalledWith('Bye');
307
- expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');
308
- expect(sentryTxn.finish).toHaveBeenCalledTimes(1);
309
- expect(sentrySession.status).toBe('abnormal');
310
- expect(flushSpy).toHaveBeenLastCalledWith(3000);
300
+ (0, vitest_1.expect)(exitSpy).toHaveBeenCalledWith(0);
301
+ (0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledTimes(1);
302
+ (0, vitest_1.expect)(clackMock.outro).toHaveBeenCalledWith('Bye');
303
+ (0, vitest_1.expect)(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');
304
+ (0, vitest_1.expect)(sentryTxn.finish).toHaveBeenCalledTimes(1);
305
+ (0, vitest_1.expect)(sentrySession.status).toBe('abnormal');
306
+ (0, vitest_1.expect)(flushSpy).toHaveBeenLastCalledWith(3000);
311
307
  });
312
308
  });
313
- describe('getPackageManager', () => {
314
- afterEach(() => {
315
- jest.clearAllMocks();
309
+ (0, vitest_1.describe)('getPackageManager', () => {
310
+ (0, vitest_1.afterEach)(() => {
311
+ vitest_1.vi.clearAllMocks();
316
312
  // @ts-expect-error - this variable is set by the wizard
317
313
  delete global.__sentry_wizard_cached_package_manager;
318
314
  });
319
- it('returns the auto-detected package manager', async () => {
320
- const detectPacManSpy = jest
315
+ (0, vitest_1.it)('returns the auto-detected package manager', async () => {
316
+ const detectPacManSpy = vitest_1.vi
321
317
  .spyOn(PackageManagerUtils, '_detectPackageManger')
322
318
  .mockReturnValueOnce(package_manager_1.YARN_V1);
323
319
  const packageManager = await (0, clack_1.getPackageManager)();
324
- expect(detectPacManSpy).toHaveBeenCalledTimes(1);
325
- expect(packageManager).toBe(package_manager_1.YARN_V1);
320
+ (0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
321
+ (0, vitest_1.expect)(packageManager).toBe(package_manager_1.YARN_V1);
326
322
  });
327
- it('caches the auto-detected package manager', async () => {
328
- const detectPacManSpy = jest
323
+ (0, vitest_1.it)('caches the auto-detected package manager', async () => {
324
+ const detectPacManSpy = vitest_1.vi
329
325
  .spyOn(PackageManagerUtils, '_detectPackageManger')
330
326
  .mockReturnValueOnce(package_manager_1.YARN_V1);
331
327
  const packageManager1 = await (0, clack_1.getPackageManager)();
332
328
  const packageManager2 = await (0, clack_1.getPackageManager)();
333
- expect(detectPacManSpy).toHaveBeenCalledTimes(1);
334
- expect(packageManager1).toBe(package_manager_1.YARN_V1);
335
- expect(packageManager2).toBe(package_manager_1.YARN_V1);
329
+ (0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
330
+ (0, vitest_1.expect)(packageManager1).toBe(package_manager_1.YARN_V1);
331
+ (0, vitest_1.expect)(packageManager2).toBe(package_manager_1.YARN_V1);
336
332
  });
337
- describe('when auto detection fails', () => {
338
- it('returns a fallback package manager if fallback is specified', async () => {
339
- const detectPacManSpy = jest
333
+ (0, vitest_1.describe)('when auto detection fails', () => {
334
+ (0, vitest_1.it)('returns a fallback package manager if fallback is specified', async () => {
335
+ const detectPacManSpy = vitest_1.vi
340
336
  .spyOn(PackageManagerUtils, '_detectPackageManger')
341
337
  .mockReturnValueOnce(null);
342
338
  const packageManager = await (0, clack_1.getPackageManager)(package_manager_1.YARN_V2);
343
- expect(detectPacManSpy).toHaveBeenCalledTimes(1);
344
- expect(packageManager).toBe(package_manager_1.YARN_V2);
339
+ (0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
340
+ (0, vitest_1.expect)(packageManager).toBe(package_manager_1.YARN_V2);
345
341
  });
346
- it("doesn't cache the fallback package manager", async () => {
347
- const detectPacManSpy = jest
342
+ (0, vitest_1.it)("doesn't cache the fallback package manager", async () => {
343
+ const detectPacManSpy = vitest_1.vi
348
344
  .spyOn(PackageManagerUtils, '_detectPackageManger')
349
345
  .mockReturnValue(null);
350
346
  const packageManager1 = await (0, clack_1.getPackageManager)(package_manager_1.YARN_V2);
351
347
  const packageManager2 = await (0, clack_1.getPackageManager)(package_manager_1.NPM);
352
- expect(detectPacManSpy).toHaveBeenCalledTimes(2);
353
- expect(packageManager1).toBe(package_manager_1.YARN_V2);
354
- expect(packageManager2).toBe(package_manager_1.NPM);
348
+ (0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(2);
349
+ (0, vitest_1.expect)(packageManager1).toBe(package_manager_1.YARN_V2);
350
+ (0, vitest_1.expect)(packageManager2).toBe(package_manager_1.NPM);
355
351
  });
356
- it('returns the user-selected package manager if no fallback is provided', async () => {
357
- const detectPacManSpy = jest
352
+ (0, vitest_1.it)('returns the user-selected package manager if no fallback is provided', async () => {
353
+ const detectPacManSpy = vitest_1.vi
358
354
  .spyOn(PackageManagerUtils, '_detectPackageManger')
359
355
  .mockReturnValueOnce(null);
360
356
  clackMock.select.mockReturnValueOnce(Promise.resolve(package_manager_1.PNPM));
361
357
  const packageManager = await (0, clack_1.getPackageManager)();
362
- expect(detectPacManSpy).toHaveBeenCalledTimes(1);
363
- expect(packageManager).toBe(package_manager_1.PNPM);
358
+ (0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
359
+ (0, vitest_1.expect)(packageManager).toBe(package_manager_1.PNPM);
364
360
  });
365
- it('caches the user-selected package manager', async () => {
366
- const detectPacManSpy = jest
361
+ (0, vitest_1.it)('caches the user-selected package manager', async () => {
362
+ const detectPacManSpy = vitest_1.vi
367
363
  .spyOn(PackageManagerUtils, '_detectPackageManger')
368
364
  .mockReturnValueOnce(null);
369
365
  clackMock.select.mockReturnValueOnce(Promise.resolve(package_manager_1.PNPM));
370
366
  const packageManager1 = await (0, clack_1.getPackageManager)();
371
367
  const packageManager2 = await (0, clack_1.getPackageManager)();
372
- expect(detectPacManSpy).toHaveBeenCalledTimes(1);
373
- expect(clackMock.select).toHaveBeenCalledTimes(1);
374
- expect(packageManager1).toBe(package_manager_1.PNPM);
375
- expect(packageManager2).toBe(package_manager_1.PNPM);
368
+ (0, vitest_1.expect)(detectPacManSpy).toHaveBeenCalledTimes(1);
369
+ (0, vitest_1.expect)(clackMock.select).toHaveBeenCalledTimes(1);
370
+ (0, vitest_1.expect)(packageManager1).toBe(package_manager_1.PNPM);
371
+ (0, vitest_1.expect)(packageManager2).toBe(package_manager_1.PNPM);
376
372
  });
377
373
  });
378
374
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../test/utils/clack/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n createNewConfigFile,\n getPackageManager,\n installPackage,\n} from '../../../src/utils/clack/';\n\nimport * as fs from 'node:fs';\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../../../src/utils/package-manager';\nimport * as PackageManagerUtils from '../../../src/utils/package-manager';\n\nimport {\n NPM,\n PNPM,\n YARN_V1,\n YARN_V2,\n} from '../../../src/utils/package-manager';\n\nimport axios from 'axios';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\nimport * as Sentry from '@sentry/node';\n\njest.mock('node:child_process', () => ({\n __esModule: true,\n ...jest.requireActual<typeof ChildProcess>('node:child_process'),\n}));\n\njest.mock('@clack/prompts', () => ({\n log: {\n info: jest.fn(),\n success: jest.fn(),\n warn: jest.fn(),\n error: jest.fn(),\n },\n outro: jest.fn(),\n text: jest.fn(),\n confirm: jest.fn(),\n cancel: jest.fn(),\n // passthrough for abortIfCancelled\n isCancel: jest.fn().mockReturnValue(false),\n spinner: jest\n .fn()\n .mockImplementation(() => ({ start: jest.fn(), stop: jest.fn() })),\n select: jest.fn(),\n}));\nconst clackMock = clack as jest.Mocked<typeof clack>;\n\njest.mock('axios');\nconst mockedAxios = axios as jest.Mocked<typeof axios>;\n\njest.mock('opn', () => jest.fn(() => Promise.resolve({ on: jest.fn() })));\n\nfunction mockUserResponse(fn: jest.Mock, response: unknown) {\n fn.mockReturnValueOnce(response);\n}\n\ndescribe('askForToolConfigPath', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('returns undefined if users have no config file', async () => {\n mockUserResponse(clack.confirm as jest.Mock, false);\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(result).toBeUndefined();\n });\n\n it('returns the path if users have a config file and the entered path is valid', async () => {\n mockUserResponse(clack.confirm as jest.Mock, true);\n mockUserResponse(clack.text as jest.Mock, 'my.webpack.config.js');\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(clack.text).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining(\n 'enter the path to your Webpack config file',\n ),\n }),\n );\n\n expect(result).toBe('my.webpack.config.js');\n });\n});\n\ndescribe('createNewConfigFile', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('writes the file to disk and returns true if the file was created successfully', async () => {\n const writeFileSpy = jest\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(jest.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(true);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n });\n\n it('logs more information if provided as an argument', async () => {\n jest.spyOn(fs.promises, 'writeFile').mockImplementation(jest.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n const moreInfo = 'More information...';\n\n await createNewConfigFile(filename, code, moreInfo);\n\n expect(clack.log.info).toHaveBeenCalledTimes(1);\n expect(clack.log.info).toHaveBeenCalledWith(\n expect.stringContaining(moreInfo),\n );\n });\n\n it('returns false and logs a warning if the file could not be created', async () => {\n const writeFileSpy = jest\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.reject(new Error('Could not write')));\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(false);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n expect(clack.log.warn).toHaveBeenCalledTimes(1);\n });\n\n it('returns false if the passed path is not absolute', async () => {\n const result = await createNewConfigFile(\n './relative/webpack.config.js',\n '',\n );\n\n expect(result).toBe(false);\n });\n});\n\ndescribe('installPackage', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n const spawnSpy = jest\n .spyOn(ChildProcess, 'spawn')\n // @ts-expect-error - ignoring complete typing\n .mockImplementation(() => ({\n // @ts-expect-error - not passing the full object but directly resolving\n // to simulate a successful install\n on: jest.fn((evt: 'close', cb: (args) => void) => {\n if (evt === 'close') {\n cb(0);\n }\n }),\n stderr: { on: jest.fn() },\n }));\n\n it('force-installs a package if the forceInstall flag is set', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@some/package', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n\n it.each([false, undefined])(\n \"doesn't force-install a package if the forceInstall flag is %s\",\n async (flag) => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@sentry/sveltekit',\n packageNameDisplayLabel: '@sentry/sveltekit',\n forceInstall: flag,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@sentry/sveltekit'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n },\n );\n\n it('adds install flags if defined', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '--ignore-workspace-root-check',\n forceInstallFlag: '--force',\n detect: jest.fn(),\n addOverride: jest.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n\n ['install', '@some/package', '--ignore-workspace-root-check', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n});\n\ndescribe('askForWizardLogin', () => {\n // mock axios\n afterEach(() => {\n // clackMock.confirm.mockClear();\n // mockUserResponse(clack.confirm as jest.Mock, undefined);\n });\n\n beforeEach(() => {\n jest.clearAllMocks();\n mockedAxios.get.mockClear();\n clackMock.confirm.mockClear();\n clackMock.confirm.mockReset();\n mockUserResponse(clack.confirm as jest.Mock, undefined);\n });\n\n it('asks if a user already has a Sentry account by default', async () => {\n mockUserResponse(clack.confirm as jest.Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({ url: 'https://santry.io/' });\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('already have a Sentry account'),\n }),\n );\n });\n\n it('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {\n mockUserResponse(clackMock.confirm as jest.Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({\n url: 'https://santry.io/',\n orgSlug: 'my-org',\n projectSlug: 'my-project',\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n });\n});\n\ndescribe('abort', () => {\n const sentryTxn = {\n setStatus: jest.fn(),\n finish: jest.fn(),\n };\n\n let sentrySession = {\n status: 999,\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n sentrySession = {\n status: 999,\n };\n });\n\n jest.spyOn(Sentry, 'getCurrentHub').mockReturnValue({\n getScope: () => ({\n // @ts-expect-error - don't care about the rest of the required props value\n getTransaction: () => sentryTxn,\n // @ts-expect-error - don't care about the rest of the required props value\n getSession: () => sentrySession,\n }),\n captureSession: jest.fn(),\n });\n\n const flushSpy = jest.fn();\n jest.spyOn(Sentry, 'flush').mockImplementation(flushSpy);\n\n it('ends the process with an error exit code by default', async () => {\n // @ts-expect-error - jest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort();\n\n expect(exitSpy).toHaveBeenCalledWith(1);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('crashed');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n\n it('ends the process with a custom exit code and message if provided', async () => {\n // @ts-expect-error - jest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort('Bye', 0);\n\n expect(exitSpy).toHaveBeenCalledWith(0);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Bye');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('abnormal');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n});\n\ndescribe('getPackageManager', () => {\n afterEach(() => {\n jest.clearAllMocks();\n // @ts-expect-error - this variable is set by the wizard\n delete global.__sentry_wizard_cached_package_manager;\n });\n\n it('returns the auto-detected package manager', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V1);\n });\n\n it('caches the auto-detected package manager', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(YARN_V1);\n expect(packageManager2).toBe(YARN_V1);\n });\n\n describe('when auto detection fails', () => {\n it('returns a fallback package manager if fallback is specified', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n const packageManager = await getPackageManager(YARN_V2);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V2);\n });\n\n it(\"doesn't cache the fallback package manager\", async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValue(null);\n\n const packageManager1 = await getPackageManager(YARN_V2);\n const packageManager2 = await getPackageManager(NPM);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(2);\n\n expect(packageManager1).toBe(YARN_V2);\n expect(packageManager2).toBe(NPM);\n });\n\n it('returns the user-selected package manager if no fallback is provided', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(packageManager).toBe(PNPM);\n });\n\n it('caches the user-selected package manager', async () => {\n const detectPacManSpy = jest\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(clackMock.select).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(PNPM);\n expect(packageManager2).toBe(PNPM);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../test/utils/clack/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n abort,\n askForToolConfigPath,\n askForWizardLogin,\n createNewConfigFile,\n getPackageManager,\n installPackage,\n} from '../../../src/utils/clack/';\n\nimport * as fs from 'node:fs';\nimport * as ChildProcess from 'node:child_process';\nimport type { PackageManager } from '../../../src/utils/package-manager';\nimport * as PackageManagerUtils from '../../../src/utils/package-manager';\n\nimport {\n NPM,\n PNPM,\n YARN_V1,\n YARN_V2,\n} from '../../../src/utils/package-manager';\n\nimport axios from 'axios';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\nimport * as Sentry from '@sentry/node';\n\nimport {\n vi,\n it,\n describe,\n expect,\n beforeEach,\n Mocked,\n Mock,\n afterEach,\n} from 'vitest';\n\nvi.mock('node:child_process', async () => ({\n __esModule: true,\n ...(await vi.importActual<typeof ChildProcess>('node:child_process')),\n}));\n\nvi.mock('@clack/prompts', () => ({\n log: {\n info: vi.fn(),\n success: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n },\n outro: vi.fn(),\n text: vi.fn(),\n confirm: vi.fn(),\n cancel: vi.fn(),\n // passthrough for abortIfCancelled\n isCancel: vi.fn().mockReturnValue(false),\n spinner: vi\n .fn()\n .mockImplementation(() => ({ start: vi.fn(), stop: vi.fn() })),\n select: vi.fn(),\n}));\nconst clackMock = clack as Mocked<typeof clack>;\n\nvi.mock('axios');\nconst mockedAxios = axios as Mocked<typeof axios>;\n\nvi.mock('opn', () => ({\n default: vi.fn(() => Promise.resolve({ on: vi.fn() })),\n}));\n\nfunction mockUserResponse(fn: Mock, response: unknown) {\n fn.mockReturnValueOnce(response);\n}\n\ndescribe('askForToolConfigPath', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it('returns undefined if users have no config file', async () => {\n mockUserResponse(clack.confirm as Mock, false);\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(result).toBeUndefined();\n });\n\n it('returns the path if users have a config file and the entered path is valid', async () => {\n mockUserResponse(clack.confirm as Mock, true);\n mockUserResponse(clack.text as Mock, 'my.webpack.config.js');\n\n const result = await askForToolConfigPath('Webpack', 'webpack.config.js');\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('have a Webpack config file'),\n }),\n );\n\n expect(clack.text).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining(\n 'enter the path to your Webpack config file',\n ),\n }),\n );\n\n expect(result).toBe('my.webpack.config.js');\n });\n});\n\ndescribe('createNewConfigFile', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n it('writes the file to disk and returns true if the file was created successfully', async () => {\n const writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(vi.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(true);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n });\n\n it('logs more information if provided as an argument', async () => {\n vi.spyOn(fs.promises, 'writeFile').mockImplementation(vi.fn());\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n const moreInfo = 'More information...';\n\n await createNewConfigFile(filename, code, moreInfo);\n\n expect(clack.log.info).toHaveBeenCalledTimes(1);\n expect(clack.log.info).toHaveBeenCalledWith(\n expect.stringContaining(moreInfo),\n );\n });\n\n it('returns false and logs a warning if the file could not be created', async () => {\n const writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.reject(new Error('Could not write')));\n\n const filename = '/webpack.config.js';\n const code = 'module.exports = {/*config...*/}';\n\n const result = await createNewConfigFile(filename, code);\n\n expect(result).toBe(false);\n expect(writeFileSpy).toHaveBeenCalledWith(filename, code);\n expect(clack.log.warn).toHaveBeenCalledTimes(1);\n });\n\n it('returns false if the passed path is not absolute', async () => {\n const result = await createNewConfigFile(\n './relative/webpack.config.js',\n '',\n );\n\n expect(result).toBe(false);\n });\n});\n\ndescribe('installPackage', () => {\n afterEach(() => {\n vi.clearAllMocks();\n });\n\n const spawnSpy = vi.spyOn(ChildProcess, 'spawn').mockImplementation(() => ({\n // @ts-expect-error - not passing the full object but directly resolving\n // to simulate a successful install\n on: vi.fn((evt: 'close', cb: (args) => void) => {\n if (evt === 'close') {\n cb(0);\n }\n }),\n // @ts-expect-error - this is fine\n stderr: { on: vi.fn() },\n }));\n\n it('force-installs a package if the forceInstall flag is set', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: vi.fn(),\n addOverride: vi.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@some/package', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n\n it.each([false, undefined])(\n \"doesn't force-install a package if the forceInstall flag is %s\",\n async (flag) => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n forceInstallFlag: '--force',\n detect: vi.fn(),\n addOverride: vi.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@sentry/sveltekit',\n packageNameDisplayLabel: '@sentry/sveltekit',\n forceInstall: flag,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n ['install', '@sentry/sveltekit'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n },\n );\n\n it('adds install flags if defined', async () => {\n const packageManagerMock: PackageManager = {\n name: 'npm',\n label: 'NPM',\n installCommand: 'install',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '--ignore-workspace-root-check',\n forceInstallFlag: '--force',\n detect: vi.fn(),\n addOverride: vi.fn(),\n };\n\n await installPackage({\n alreadyInstalled: false,\n packageName: '@some/package',\n packageNameDisplayLabel: '@some/package',\n forceInstall: true,\n askBeforeUpdating: false,\n packageManager: packageManagerMock,\n });\n\n expect(spawnSpy).toHaveBeenCalledWith(\n 'npm',\n\n ['install', '@some/package', '--ignore-workspace-root-check', '--force'],\n { shell: true, stdio: ['pipe', 'ignore', 'pipe'] },\n );\n });\n});\n\ndescribe('askForWizardLogin', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n mockedAxios.get.mockClear();\n clackMock.confirm.mockClear();\n clackMock.confirm.mockReset();\n mockUserResponse(clack.confirm as Mock, undefined);\n });\n\n it('asks if a user already has a Sentry account by default', async () => {\n mockUserResponse(clack.confirm as Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({ url: 'https://santry.io/' });\n\n expect(clack.confirm).toHaveBeenCalledWith(\n expect.objectContaining({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n message: expect.stringContaining('already have a Sentry account'),\n }),\n );\n });\n\n it('skips asking for if a user already has a Sentry account if org and project are pre-selected', async () => {\n mockUserResponse(clackMock.confirm as Mock, Promise.resolve(true));\n\n // Provide the data object to be returned\n mockedAxios.get.mockResolvedValue({\n data: {\n hash: 'mockedHash',\n },\n });\n\n await askForWizardLogin({\n url: 'https://santry.io/',\n orgSlug: 'my-org',\n projectSlug: 'my-project',\n });\n\n expect(clack.confirm).not.toHaveBeenCalled();\n });\n});\n\ndescribe('abort', () => {\n const sentryTxn = {\n setStatus: vi.fn(),\n finish: vi.fn(),\n };\n\n let sentrySession = {\n status: 999,\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n sentrySession = {\n status: 999,\n };\n });\n\n vi.spyOn(Sentry, 'getCurrentHub').mockReturnValue({\n getScope: () => ({\n // @ts-expect-error - don't care about the rest of the required props value\n getTransaction: () => sentryTxn,\n // @ts-expect-error - don't care about the rest of the required props value\n getSession: () => sentrySession,\n }),\n captureSession: vi.fn(),\n });\n\n const flushSpy = vi.fn();\n vi.spyOn(Sentry, 'flush').mockImplementation(flushSpy);\n\n it('ends the process with an error exit code by default', async () => {\n // @ts-expect-error - vitest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort();\n\n expect(exitSpy).toHaveBeenCalledWith(1);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Wizard setup cancelled.');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('aborted');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('crashed');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n\n it('ends the process with a custom exit code and message if provided', async () => {\n // @ts-expect-error - vitest doesn't like the empty function\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {});\n\n await abort('Bye', 0);\n\n expect(exitSpy).toHaveBeenCalledWith(0);\n\n expect(clackMock.outro).toHaveBeenCalledTimes(1);\n expect(clackMock.outro).toHaveBeenCalledWith('Bye');\n\n expect(sentryTxn.setStatus).toHaveBeenLastCalledWith('cancelled');\n expect(sentryTxn.finish).toHaveBeenCalledTimes(1);\n expect(sentrySession.status).toBe('abnormal');\n expect(flushSpy).toHaveBeenLastCalledWith(3000);\n });\n});\n\ndescribe('getPackageManager', () => {\n afterEach(() => {\n vi.clearAllMocks();\n // @ts-expect-error - this variable is set by the wizard\n delete global.__sentry_wizard_cached_package_manager;\n });\n\n it('returns the auto-detected package manager', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V1);\n });\n\n it('caches the auto-detected package manager', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(YARN_V1);\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(YARN_V1);\n expect(packageManager2).toBe(YARN_V1);\n });\n\n describe('when auto detection fails', () => {\n it('returns a fallback package manager if fallback is specified', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n const packageManager = await getPackageManager(YARN_V2);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n\n expect(packageManager).toBe(YARN_V2);\n });\n\n it(\"doesn't cache the fallback package manager\", async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValue(null);\n\n const packageManager1 = await getPackageManager(YARN_V2);\n const packageManager2 = await getPackageManager(NPM);\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(2);\n\n expect(packageManager1).toBe(YARN_V2);\n expect(packageManager2).toBe(NPM);\n });\n\n it('returns the user-selected package manager if no fallback is provided', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(packageManager).toBe(PNPM);\n });\n\n it('caches the user-selected package manager', async () => {\n const detectPacManSpy = vi\n .spyOn(PackageManagerUtils, '_detectPackageManger')\n .mockReturnValueOnce(null);\n\n clackMock.select.mockReturnValueOnce(Promise.resolve(PNPM));\n\n const packageManager1 = await getPackageManager();\n const packageManager2 = await getPackageManager();\n\n expect(detectPacManSpy).toHaveBeenCalledTimes(1);\n expect(clackMock.select).toHaveBeenCalledTimes(1);\n\n expect(packageManager1).toBe(PNPM);\n expect(packageManager2).toBe(PNPM);\n });\n });\n});\n"]}