@sentry/wizard 6.10.0 → 6.12.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 (203) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/ci-ensure-runtime-loaded.sh +82 -0
  3. package/dist/e2e-tests/tests/angular-17.test.js +72 -82
  4. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
  5. package/dist/e2e-tests/tests/angular-19.test.js +71 -80
  6. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
  7. package/dist/e2e-tests/tests/cloudflare-worker.test.d.ts +1 -0
  8. package/dist/e2e-tests/tests/cloudflare-worker.test.js +69 -0
  9. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -0
  10. package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js +2 -5
  11. package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js.map +1 -1
  12. package/dist/e2e-tests/tests/expo.test.js +36 -61
  13. package/dist/e2e-tests/tests/expo.test.js.map +1 -1
  14. package/dist/e2e-tests/tests/flutter.test.js +63 -70
  15. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/help-message.test.js +2 -2
  17. package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
  18. package/dist/e2e-tests/tests/nextjs-14.test.js +48 -76
  19. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  20. package/dist/e2e-tests/tests/nextjs-15.test.js +89 -99
  21. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  22. package/dist/e2e-tests/tests/nextjs-16.test.js +48 -45
  23. package/dist/e2e-tests/tests/nextjs-16.test.js.map +1 -1
  24. package/dist/e2e-tests/tests/nuxt-3.test.js +45 -58
  25. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  26. package/dist/e2e-tests/tests/nuxt-4.test.js +59 -73
  27. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  28. package/dist/e2e-tests/tests/pnpm-workspace.test.js +6 -8
  29. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  30. package/dist/e2e-tests/tests/react-native.test.js +44 -80
  31. package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
  32. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.d.ts +1 -0
  33. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
  34. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
  35. package/dist/e2e-tests/tests/react-router.test.js +165 -145
  36. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  37. package/dist/e2e-tests/tests/remix.test.js +162 -132
  38. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  39. package/dist/e2e-tests/tests/sveltekit-hooks.test.js +48 -36
  40. package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
  41. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +5 -7
  42. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  43. package/dist/e2e-tests/utils/index.d.ts +15 -43
  44. package/dist/e2e-tests/utils/index.js +95 -185
  45. package/dist/e2e-tests/utils/index.js.map +1 -1
  46. package/dist/get-e2e-test-matrix.mjs +11 -0
  47. package/dist/lib/Constants.d.ts +1 -0
  48. package/dist/lib/Constants.js +5 -0
  49. package/dist/lib/Constants.js.map +1 -1
  50. package/dist/src/android/android-wizard.js +2 -4
  51. package/dist/src/android/android-wizard.js.map +1 -1
  52. package/dist/src/angular/angular-wizard.js +4 -6
  53. package/dist/src/angular/angular-wizard.js.map +1 -1
  54. package/dist/src/angular/sdk-setup.js +1 -1
  55. package/dist/src/angular/sdk-setup.js.map +1 -1
  56. package/dist/src/apple/apple-wizard.js +2 -4
  57. package/dist/src/apple/apple-wizard.js.map +1 -1
  58. package/dist/src/apple/code-tools.js +17 -3
  59. package/dist/src/apple/code-tools.js.map +1 -1
  60. package/dist/src/apple/configure-package-manager.js +18 -5
  61. package/dist/src/apple/configure-package-manager.js.map +1 -1
  62. package/dist/src/cloudflare/cloudflare-wizard.d.ts +3 -0
  63. package/dist/src/cloudflare/cloudflare-wizard.js +104 -0
  64. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -0
  65. package/dist/src/cloudflare/sdk-setup.d.ts +8 -0
  66. package/dist/src/cloudflare/sdk-setup.js +47 -0
  67. package/dist/src/cloudflare/sdk-setup.js.map +1 -0
  68. package/dist/src/cloudflare/templates.d.ts +5 -0
  69. package/dist/src/cloudflare/templates.js +50 -0
  70. package/dist/src/cloudflare/templates.js.map +1 -0
  71. package/dist/src/cloudflare/wrangler/create-wrangler-config.d.ts +4 -0
  72. package/dist/src/cloudflare/wrangler/create-wrangler-config.js +27 -0
  73. package/dist/src/cloudflare/wrangler/create-wrangler-config.js.map +1 -0
  74. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.d.ts +4 -0
  75. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js +25 -0
  76. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js.map +1 -0
  77. package/dist/src/cloudflare/wrangler/find-wrangler-config.d.ts +4 -0
  78. package/dist/src/cloudflare/wrangler/find-wrangler-config.js +23 -0
  79. package/dist/src/cloudflare/wrangler/find-wrangler-config.js.map +1 -0
  80. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.d.ts +6 -0
  81. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js +52 -0
  82. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js.map +1 -0
  83. package/dist/src/cloudflare/wrangler/update-wrangler-config.d.ts +17 -0
  84. package/dist/src/cloudflare/wrangler/update-wrangler-config.js +173 -0
  85. package/dist/src/cloudflare/wrangler/update-wrangler-config.js.map +1 -0
  86. package/dist/src/cloudflare/wrap-worker.d.ts +33 -0
  87. package/dist/src/cloudflare/wrap-worker.js +116 -0
  88. package/dist/src/cloudflare/wrap-worker.js.map +1 -0
  89. package/dist/src/flutter/flutter-wizard.js +3 -6
  90. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  91. package/dist/src/nextjs/nextjs-wizard.js +0 -2
  92. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  93. package/dist/src/nuxt/nuxt-wizard.js +3 -5
  94. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  95. package/dist/src/react-native/expo.d.ts +6 -0
  96. package/dist/src/react-native/expo.js +27 -1
  97. package/dist/src/react-native/expo.js.map +1 -1
  98. package/dist/src/react-native/git.d.ts +5 -0
  99. package/dist/src/react-native/git.js +32 -1
  100. package/dist/src/react-native/git.js.map +1 -1
  101. package/dist/src/react-native/javascript.js +3 -1
  102. package/dist/src/react-native/javascript.js.map +1 -1
  103. package/dist/src/react-native/react-native-wizard.js +14 -10
  104. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  105. package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
  106. package/dist/src/react-router/codemods/client.entry.js +69 -12
  107. package/dist/src/react-router/codemods/client.entry.js.map +1 -1
  108. package/dist/src/react-router/codemods/react-router-config.js +1 -1
  109. package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
  110. package/dist/src/react-router/codemods/root.js +1 -2
  111. package/dist/src/react-router/codemods/root.js.map +1 -1
  112. package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
  113. package/dist/src/react-router/codemods/server-entry.js +39 -4
  114. package/dist/src/react-router/codemods/server-entry.js.map +1 -1
  115. package/dist/src/react-router/codemods/vite.js +46 -1
  116. package/dist/src/react-router/codemods/vite.js.map +1 -1
  117. package/dist/src/react-router/react-router-wizard.js +55 -10
  118. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  119. package/dist/src/react-router/sdk-setup.d.ts +5 -3
  120. package/dist/src/react-router/sdk-setup.js +35 -9
  121. package/dist/src/react-router/sdk-setup.js.map +1 -1
  122. package/dist/src/react-router/templates.d.ts +2 -2
  123. package/dist/src/react-router/templates.js +72 -2
  124. package/dist/src/react-router/templates.js.map +1 -1
  125. package/dist/src/remix/remix-wizard.js +2 -4
  126. package/dist/src/remix/remix-wizard.js.map +1 -1
  127. package/dist/src/run.d.ts +1 -1
  128. package/dist/src/run.js +5 -0
  129. package/dist/src/run.js.map +1 -1
  130. package/dist/src/sourcemaps/tools/vite.js +1 -1
  131. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  132. package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
  133. package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
  134. package/dist/src/sveltekit/sveltekit-wizard.js +2 -4
  135. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  136. package/dist/src/utils/abort-if-sportlight-not-supported.d.ts +5 -0
  137. package/dist/src/utils/abort-if-sportlight-not-supported.js +40 -0
  138. package/dist/src/utils/abort-if-sportlight-not-supported.js.map +1 -0
  139. package/dist/src/utils/ast-utils.d.ts +11 -1
  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 -2
  143. package/dist/src/utils/clack/index.js.map +1 -1
  144. package/dist/src/utils/clack/mcp-config.js +117 -59
  145. package/dist/src/utils/clack/mcp-config.js.map +1 -1
  146. package/dist/src/version.d.ts +1 -1
  147. package/dist/src/version.js +1 -1
  148. package/dist/src/version.js.map +1 -1
  149. package/dist/test/angular/angular-wizard.test.js +2 -4
  150. package/dist/test/angular/angular-wizard.test.js.map +1 -1
  151. package/dist/test/apple/code-tools.test.js +78 -0
  152. package/dist/test/apple/code-tools.test.js.map +1 -1
  153. package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
  154. package/dist/test/apple/configure-package-manager.test.js +161 -0
  155. package/dist/test/apple/configure-package-manager.test.js.map +1 -0
  156. package/dist/test/cloudflare/create-wrangler-config.test.d.ts +1 -0
  157. package/dist/test/cloudflare/create-wrangler-config.test.js +48 -0
  158. package/dist/test/cloudflare/create-wrangler-config.test.js.map +1 -0
  159. package/dist/test/cloudflare/ensure-wrangler-config.test.d.ts +1 -0
  160. package/dist/test/cloudflare/ensure-wrangler-config.test.js +61 -0
  161. package/dist/test/cloudflare/ensure-wrangler-config.test.js.map +1 -0
  162. package/dist/test/cloudflare/find-wrangler-config.test.d.ts +1 -0
  163. package/dist/test/cloudflare/find-wrangler-config.test.js +77 -0
  164. package/dist/test/cloudflare/find-wrangler-config.test.js.map +1 -0
  165. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.d.ts +1 -0
  166. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js +81 -0
  167. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js.map +1 -0
  168. package/dist/test/cloudflare/sdk-setup.test.d.ts +1 -0
  169. package/dist/test/cloudflare/sdk-setup.test.js +170 -0
  170. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -0
  171. package/dist/test/cloudflare/templates.test.d.ts +1 -0
  172. package/dist/test/cloudflare/templates.test.js +122 -0
  173. package/dist/test/cloudflare/templates.test.js.map +1 -0
  174. package/dist/test/cloudflare/update-wrangler-config.test.d.ts +1 -0
  175. package/dist/test/cloudflare/update-wrangler-config.test.js +216 -0
  176. package/dist/test/cloudflare/update-wrangler-config.test.js.map +1 -0
  177. package/dist/test/cloudflare/wrap-worker.test.d.ts +1 -0
  178. package/dist/test/cloudflare/wrap-worker.test.js +206 -0
  179. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -0
  180. package/dist/test/react-native/expo.test.js +140 -0
  181. package/dist/test/react-native/expo.test.js.map +1 -1
  182. package/dist/test/react-native/git.test.d.ts +1 -0
  183. package/dist/test/react-native/git.test.js +160 -0
  184. package/dist/test/react-native/git.test.js.map +1 -0
  185. package/dist/test/react-router/codemods/client-entry.test.js +29 -0
  186. package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
  187. package/dist/test/react-router/codemods/root.test.js +4 -0
  188. package/dist/test/react-router/codemods/root.test.js.map +1 -1
  189. package/dist/test/react-router/codemods/server-entry.test.js +70 -0
  190. package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
  191. package/dist/test/react-router/codemods/vite.test.js +89 -0
  192. package/dist/test/react-router/codemods/vite.test.js.map +1 -1
  193. package/dist/test/react-router/sdk-setup.test.js +64 -8
  194. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  195. package/dist/test/react-router/templates.test.js +50 -0
  196. package/dist/test/react-router/templates.test.js.map +1 -1
  197. package/dist/test/sourcemaps/tools/vite.test.js +12 -8
  198. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  199. package/dist/test/utils/ast-utils.test.js +22 -0
  200. package/dist/test/utils/ast-utils.test.js.map +1 -1
  201. package/dist/test/utils/clack/mcp-config.test.js +176 -51
  202. package/dist/test/utils/clack/mcp-config.test.js.map +1 -1
  203. package/package.json +6 -5
@@ -0,0 +1,216 @@
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 vitest_1 = require("vitest");
27
+ const fs = __importStar(require("node:fs"));
28
+ const path = __importStar(require("node:path"));
29
+ const os = __importStar(require("node:os"));
30
+ const update_wrangler_config_1 = require("../../src/cloudflare/wrangler/update-wrangler-config");
31
+ const { clackMocks } = vitest_1.vi.hoisted(() => {
32
+ return {
33
+ clackMocks: {
34
+ log: {
35
+ success: vitest_1.vi.fn(),
36
+ info: vitest_1.vi.fn(),
37
+ step: vitest_1.vi.fn(),
38
+ warn: vitest_1.vi.fn(),
39
+ error: vitest_1.vi.fn(),
40
+ },
41
+ },
42
+ };
43
+ });
44
+ vitest_1.vi.mock('@clack/prompts', () => ({
45
+ default: clackMocks,
46
+ }));
47
+ (0, vitest_1.describe)('updateWranglerConfig', () => {
48
+ const fixturesDir = path.join(__dirname, 'fixtures', 'wrangler');
49
+ let tmpDir;
50
+ function copyFixture(fixtureName, targetName) {
51
+ const content = fs.readFileSync(path.join(fixturesDir, fixtureName), 'utf-8');
52
+ fs.writeFileSync(path.join(tmpDir, targetName), content);
53
+ }
54
+ function readResult(fileName) {
55
+ return fs.readFileSync(path.join(tmpDir, fileName), 'utf-8');
56
+ }
57
+ (0, vitest_1.beforeEach)(() => {
58
+ vitest_1.vi.clearAllMocks();
59
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'update-wrangler-config-'));
60
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(tmpDir);
61
+ });
62
+ (0, vitest_1.afterEach)(() => {
63
+ if (fs.existsSync(tmpDir)) {
64
+ fs.rmSync(tmpDir, { recursive: true });
65
+ }
66
+ vitest_1.vi.restoreAllMocks();
67
+ });
68
+ (0, vitest_1.describe)('JSON/JSONC format', () => {
69
+ (0, vitest_1.it)('adds new fields to JSON config', async () => {
70
+ copyFixture('wrangler-basic.json', 'wrangler.json');
71
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
72
+ compatibility_flags: ['nodejs_als'],
73
+ version_metadata: { binding: 'CF_VERSION_METADATA' },
74
+ });
75
+ const writtenContent = readResult('wrangler.json');
76
+ const parsed = JSON.parse(writtenContent);
77
+ (0, vitest_1.expect)(result).toBe(true);
78
+ (0, vitest_1.expect)(parsed.compatibility_flags).toEqual(['nodejs_als']);
79
+ (0, vitest_1.expect)(parsed.version_metadata).toEqual({
80
+ binding: 'CF_VERSION_METADATA',
81
+ });
82
+ (0, vitest_1.expect)(parsed.name).toBe('my-worker');
83
+ });
84
+ (0, vitest_1.it)('overrides existing fields in JSON config', async () => {
85
+ copyFixture('wrangler-basic.json', 'wrangler.json');
86
+ const initialContent = readResult('wrangler.json');
87
+ const initialParsed = JSON.parse(initialContent);
88
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
89
+ compatibility_date: '1337-01-01',
90
+ });
91
+ const writtenContent = readResult('wrangler.json');
92
+ const parsed = JSON.parse(writtenContent);
93
+ (0, vitest_1.expect)(result).toBe(true);
94
+ (0, vitest_1.expect)(parsed.compatibility_date).not.toEqual(initialParsed.compatibility_date);
95
+ (0, vitest_1.expect)(parsed.compatibility_date).toEqual('1337-01-01');
96
+ });
97
+ (0, vitest_1.it)('merges array fields in JSON config', async () => {
98
+ copyFixture('wrangler-with-flags.json', 'wrangler.json');
99
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
100
+ compatibility_flags: ['nodejs_als', 'nodejs_compat'],
101
+ });
102
+ const writtenContent = readResult('wrangler.json');
103
+ const parsed = JSON.parse(writtenContent);
104
+ (0, vitest_1.expect)(result).toBe(true);
105
+ (0, vitest_1.expect)(parsed.compatibility_flags).toEqual([
106
+ 'old_flag',
107
+ 'nodejs_als',
108
+ 'nodejs_compat',
109
+ ]);
110
+ });
111
+ (0, vitest_1.it)('deduplicates array values in JSON', async () => {
112
+ copyFixture('wrangler-with-duplicate-flags.json', 'wrangler.json');
113
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
114
+ compatibility_flags: ['nodejs_als', 'new_flag'],
115
+ });
116
+ const writtenContent = readResult('wrangler.json');
117
+ const parsed = JSON.parse(writtenContent);
118
+ (0, vitest_1.expect)(result).toBe(true);
119
+ (0, vitest_1.expect)(parsed.compatibility_flags).toEqual([
120
+ 'nodejs_als',
121
+ 'old_flag',
122
+ 'new_flag',
123
+ ]);
124
+ });
125
+ (0, vitest_1.it)('preserves comments in JSONC config', async () => {
126
+ copyFixture('wrangler-with-comment.jsonc', 'wrangler.jsonc');
127
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
128
+ compatibility_flags: ['nodejs_als'],
129
+ });
130
+ const writtenContent = readResult('wrangler.jsonc');
131
+ (0, vitest_1.expect)(result).toBe(true);
132
+ (0, vitest_1.expect)(writtenContent).toMatchSnapshot();
133
+ });
134
+ (0, vitest_1.it)('merges multi-line array fields in JSON config', async () => {
135
+ copyFixture('wrangler-multi-line-array.json', 'wrangler.json');
136
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
137
+ compatibility_flags: ['nodejs_als'],
138
+ });
139
+ const writtenContent = readResult('wrangler.json');
140
+ const parsed = JSON.parse(writtenContent);
141
+ (0, vitest_1.expect)(result).toBe(true);
142
+ (0, vitest_1.expect)(parsed.compatibility_flags).toEqual([
143
+ 'global_fetch_strictly_public',
144
+ 'nodejs_als',
145
+ ]);
146
+ });
147
+ vitest_1.it.skip('merges multiple fields including arrays with comments', async () => {
148
+ copyFixture('wrangler-complex-with-comments.jsonc', 'wrangler.jsonc');
149
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
150
+ compatibility_flags: ['nodejs_als'],
151
+ version_metadata: { binding: 'CF_VERSION_METADATA' },
152
+ });
153
+ const writtenContent = readResult('wrangler.jsonc');
154
+ (0, vitest_1.expect)(result).toBe(true);
155
+ (0, vitest_1.expect)(writtenContent).toMatchSnapshot();
156
+ });
157
+ (0, vitest_1.it)('adds new fields to JSONC in object', async () => {
158
+ copyFixture('wrangler-with-metadata.jsonc', 'wrangler.jsonc');
159
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
160
+ version_metadata: { binding: 'CF_VERSION_METADATA' },
161
+ });
162
+ const writtenContent = readResult('wrangler.jsonc');
163
+ (0, vitest_1.expect)(result).toBe(true);
164
+ (0, vitest_1.expect)(writtenContent).toMatchSnapshot();
165
+ });
166
+ (0, vitest_1.it)('preserves all comment types in JSONC', async () => {
167
+ copyFixture('wrangler-all-comment-types.jsonc', 'wrangler.jsonc');
168
+ await (0, update_wrangler_config_1.updateWranglerConfig)({
169
+ version_metadata: { binding: 'CF_VERSION_METADATA' },
170
+ });
171
+ const writtenContent = readResult('wrangler.jsonc');
172
+ (0, vitest_1.expect)(writtenContent).toMatchSnapshot();
173
+ });
174
+ (0, vitest_1.it)('handles empty JSON object', async () => {
175
+ copyFixture('wrangler-empty.json', 'wrangler.json');
176
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
177
+ compatibility_flags: ['nodejs_als'],
178
+ });
179
+ const writtenContent = readResult('wrangler.json');
180
+ const parsed = JSON.parse(writtenContent);
181
+ (0, vitest_1.expect)(result).toBe(true);
182
+ (0, vitest_1.expect)(parsed.compatibility_flags).toEqual(['nodejs_als']);
183
+ });
184
+ (0, vitest_1.it)('adds nested objects to JSON', async () => {
185
+ copyFixture('wrangler-minimal.json', 'wrangler.json');
186
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
187
+ version_metadata: { binding: 'CF_VERSION_METADATA' },
188
+ });
189
+ const writtenContent = readResult('wrangler.json');
190
+ const parsed = JSON.parse(writtenContent);
191
+ (0, vitest_1.expect)(result).toBe(true);
192
+ (0, vitest_1.expect)(parsed.version_metadata).toEqual({
193
+ binding: 'CF_VERSION_METADATA',
194
+ });
195
+ });
196
+ (0, vitest_1.it)('handles JSONC with trailing comma', async () => {
197
+ copyFixture('wrangler-trailing-comma.jsonc', 'wrangler.jsonc');
198
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
199
+ compatibility_flags: ['nodejs_als'],
200
+ });
201
+ const writtenContent = readResult('wrangler.jsonc');
202
+ (0, vitest_1.expect)(result).toBe(true);
203
+ (0, vitest_1.expect)(writtenContent).toContain('compatibility_flags');
204
+ });
205
+ });
206
+ (0, vitest_1.describe)('error handling', () => {
207
+ (0, vitest_1.it)('returns false when no config file exists', async () => {
208
+ const result = await (0, update_wrangler_config_1.updateWranglerConfig)({
209
+ compatibility_flags: ['nodejs_als'],
210
+ });
211
+ (0, vitest_1.expect)(result).toBe(false);
212
+ (0, vitest_1.expect)(clackMocks.log.warn).toHaveBeenCalledWith('No wrangler config file found.');
213
+ });
214
+ });
215
+ });
216
+ //# sourceMappingURL=update-wrangler-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-wrangler-config.test.js","sourceRoot":"","sources":["../../../test/cloudflare/update-wrangler-config.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { updateWranglerConfig } from '../../src/cloudflare/wrangler/update-wrangler-config';\n\nconst { clackMocks } = vi.hoisted(() => {\n return {\n clackMocks: {\n log: {\n success: vi.fn(),\n info: vi.fn(),\n step: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n },\n },\n };\n});\n\nvi.mock('@clack/prompts', () => ({\n default: clackMocks,\n}));\n\ndescribe('updateWranglerConfig', () => {\n const fixturesDir = path.join(__dirname, 'fixtures', 'wrangler');\n let tmpDir: string;\n\n function copyFixture(fixtureName: string, targetName: string): void {\n const content = fs.readFileSync(\n path.join(fixturesDir, fixtureName),\n 'utf-8',\n );\n fs.writeFileSync(path.join(tmpDir, targetName), content);\n }\n\n function readResult(fileName: string): string {\n return fs.readFileSync(path.join(tmpDir, fileName), 'utf-8');\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'update-wrangler-config-'));\n\n vi.spyOn(process, 'cwd').mockReturnValue(tmpDir);\n });\n\n afterEach(() => {\n if (fs.existsSync(tmpDir)) {\n fs.rmSync(tmpDir, { recursive: true });\n }\n\n vi.restoreAllMocks();\n });\n\n describe('JSON/JSONC format', () => {\n it('adds new fields to JSON config', async () => {\n copyFixture('wrangler-basic.json', 'wrangler.json');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n version_metadata: { binding: 'CF_VERSION_METADATA' },\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.compatibility_flags).toEqual(['nodejs_als']);\n expect(parsed.version_metadata).toEqual({\n binding: 'CF_VERSION_METADATA',\n });\n expect(parsed.name).toBe('my-worker');\n });\n\n it('overrides existing fields in JSON config', async () => {\n copyFixture('wrangler-basic.json', 'wrangler.json');\n\n const initialContent = readResult('wrangler.json');\n const initialParsed = JSON.parse(initialContent) as Record<\n string,\n unknown\n >;\n\n const result = await updateWranglerConfig({\n compatibility_date: '1337-01-01',\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.compatibility_date).not.toEqual(\n initialParsed.compatibility_date,\n );\n expect(parsed.compatibility_date).toEqual('1337-01-01');\n });\n\n it('merges array fields in JSON config', async () => {\n copyFixture('wrangler-with-flags.json', 'wrangler.json');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als', 'nodejs_compat'],\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.compatibility_flags).toEqual([\n 'old_flag',\n 'nodejs_als',\n 'nodejs_compat',\n ]);\n });\n\n it('deduplicates array values in JSON', async () => {\n copyFixture('wrangler-with-duplicate-flags.json', 'wrangler.json');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als', 'new_flag'],\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.compatibility_flags).toEqual([\n 'nodejs_als',\n 'old_flag',\n 'new_flag',\n ]);\n });\n\n it('preserves comments in JSONC config', async () => {\n copyFixture('wrangler-with-comment.jsonc', 'wrangler.jsonc');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n });\n\n const writtenContent = readResult('wrangler.jsonc');\n\n expect(result).toBe(true);\n expect(writtenContent).toMatchSnapshot();\n });\n\n it('merges multi-line array fields in JSON config', async () => {\n copyFixture('wrangler-multi-line-array.json', 'wrangler.json');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.compatibility_flags).toEqual([\n 'global_fetch_strictly_public',\n 'nodejs_als',\n ]);\n });\n\n it.skip('merges multiple fields including arrays with comments', async () => {\n copyFixture('wrangler-complex-with-comments.jsonc', 'wrangler.jsonc');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n version_metadata: { binding: 'CF_VERSION_METADATA' },\n });\n\n const writtenContent = readResult('wrangler.jsonc');\n\n expect(result).toBe(true);\n expect(writtenContent).toMatchSnapshot();\n });\n\n it('adds new fields to JSONC in object', async () => {\n copyFixture('wrangler-with-metadata.jsonc', 'wrangler.jsonc');\n\n const result = await updateWranglerConfig({\n version_metadata: { binding: 'CF_VERSION_METADATA' },\n });\n\n const writtenContent = readResult('wrangler.jsonc');\n\n expect(result).toBe(true);\n expect(writtenContent).toMatchSnapshot();\n });\n\n it('preserves all comment types in JSONC', async () => {\n copyFixture('wrangler-all-comment-types.jsonc', 'wrangler.jsonc');\n\n await updateWranglerConfig({\n version_metadata: { binding: 'CF_VERSION_METADATA' },\n });\n\n const writtenContent = readResult('wrangler.jsonc');\n\n expect(writtenContent).toMatchSnapshot();\n });\n\n it('handles empty JSON object', async () => {\n copyFixture('wrangler-empty.json', 'wrangler.json');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.compatibility_flags).toEqual(['nodejs_als']);\n });\n\n it('adds nested objects to JSON', async () => {\n copyFixture('wrangler-minimal.json', 'wrangler.json');\n\n const result = await updateWranglerConfig({\n version_metadata: { binding: 'CF_VERSION_METADATA' },\n });\n\n const writtenContent = readResult('wrangler.json');\n const parsed = JSON.parse(writtenContent) as Record<string, unknown>;\n\n expect(result).toBe(true);\n expect(parsed.version_metadata).toEqual({\n binding: 'CF_VERSION_METADATA',\n });\n });\n\n it('handles JSONC with trailing comma', async () => {\n copyFixture('wrangler-trailing-comma.jsonc', 'wrangler.jsonc');\n\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n });\n\n const writtenContent = readResult('wrangler.jsonc');\n\n expect(result).toBe(true);\n expect(writtenContent).toContain('compatibility_flags');\n });\n });\n\n describe('error handling', () => {\n it('returns false when no config file exists', async () => {\n const result = await updateWranglerConfig({\n compatibility_flags: ['nodejs_als'],\n });\n\n expect(result).toBe(false);\n expect(clackMocks.log.warn).toHaveBeenCalledWith(\n 'No wrangler config file found.',\n );\n });\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,206 @@
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 vitest_1 = require("vitest");
27
+ const fs = __importStar(require("node:fs"));
28
+ const path = __importStar(require("node:path"));
29
+ const os = __importStar(require("node:os"));
30
+ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
31
+ (0, vitest_1.describe)('wrapWorkerWithSentry', () => {
32
+ const fixturesDir = path.join(__dirname, 'fixtures', 'worker');
33
+ let tmpDir;
34
+ function copyFixture(fixtureName) {
35
+ const content = fs.readFileSync(path.join(fixturesDir, fixtureName), 'utf-8');
36
+ const targetPath = path.join(tmpDir, 'worker.ts');
37
+ fs.writeFileSync(targetPath, content);
38
+ return targetPath;
39
+ }
40
+ function readResult() {
41
+ return fs.readFileSync(path.join(tmpDir, 'worker.ts'), 'utf-8');
42
+ }
43
+ (0, vitest_1.beforeEach)(() => {
44
+ vitest_1.vi.clearAllMocks();
45
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wrap-worker-'));
46
+ });
47
+ (0, vitest_1.afterEach)(() => {
48
+ if (fs.existsSync(tmpDir)) {
49
+ fs.rmSync(tmpDir, { recursive: true });
50
+ }
51
+ vitest_1.vi.restoreAllMocks();
52
+ });
53
+ (0, vitest_1.describe)('basic wrapping', () => {
54
+ (0, vitest_1.it)('wraps a simple worker export with Sentry', async () => {
55
+ const filePath = copyFixture('simple-with-satisfies.ts');
56
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-test-dsn', {
57
+ performance: false,
58
+ logs: false,
59
+ });
60
+ const result = readResult();
61
+ (0, vitest_1.expect)(result).toMatchSnapshot();
62
+ });
63
+ (0, vitest_1.it)('preserves complex handler logic', async () => {
64
+ const filePath = copyFixture('complex-handler.ts');
65
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
66
+ performance: false,
67
+ logs: false,
68
+ });
69
+ const result = readResult();
70
+ (0, vitest_1.expect)(result).toMatchSnapshot();
71
+ });
72
+ });
73
+ (0, vitest_1.describe)('performance monitoring', () => {
74
+ (0, vitest_1.it)('includes tracesSampleRate when performance is enabled', async () => {
75
+ const filePath = copyFixture('simple.ts');
76
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
77
+ performance: true,
78
+ logs: false,
79
+ });
80
+ const result = readResult();
81
+ (0, vitest_1.expect)(result).toMatchSnapshot();
82
+ });
83
+ (0, vitest_1.it)('omits tracesSampleRate when performance is disabled', async () => {
84
+ const filePath = copyFixture('simple.ts');
85
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
86
+ performance: false,
87
+ logs: false,
88
+ });
89
+ const result = readResult();
90
+ (0, vitest_1.expect)(result).toMatchSnapshot();
91
+ });
92
+ });
93
+ (0, vitest_1.describe)('logs', () => {
94
+ (0, vitest_1.it)('includes enableLogs when logs is enabled', async () => {
95
+ const filePath = copyFixture('simple.ts');
96
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
97
+ performance: false,
98
+ logs: true,
99
+ });
100
+ const result = readResult();
101
+ (0, vitest_1.expect)(result).toMatchSnapshot();
102
+ });
103
+ (0, vitest_1.it)('omits enableLogs when logs is disabled', async () => {
104
+ const filePath = copyFixture('simple.ts');
105
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
106
+ performance: false,
107
+ logs: false,
108
+ });
109
+ const result = readResult();
110
+ (0, vitest_1.expect)(result).not.toContain('enableLogs');
111
+ });
112
+ (0, vitest_1.it)('includes both tracesSampleRate and enableLogs when both are enabled', async () => {
113
+ const filePath = copyFixture('simple.ts');
114
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
115
+ performance: true,
116
+ logs: true,
117
+ });
118
+ const result = readResult();
119
+ (0, vitest_1.expect)(result).toMatchSnapshot();
120
+ });
121
+ });
122
+ (0, vitest_1.describe)('import handling', () => {
123
+ (0, vitest_1.it)('adds Sentry import at the beginning of the file', async () => {
124
+ const filePath = copyFixture('with-comment.ts');
125
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
126
+ performance: false,
127
+ logs: false,
128
+ });
129
+ const result = readResult();
130
+ (0, vitest_1.expect)(result).toMatchSnapshot();
131
+ });
132
+ (0, vitest_1.it)('preserves existing imports', async () => {
133
+ const filePath = copyFixture('with-import.ts');
134
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
135
+ performance: false,
136
+ logs: false,
137
+ });
138
+ const result = readResult();
139
+ (0, vitest_1.expect)(result).toMatchSnapshot();
140
+ });
141
+ (0, vitest_1.it)('preserves an external default export', async () => {
142
+ const filePath = copyFixture('external-default-export.ts');
143
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
144
+ performance: false,
145
+ logs: false,
146
+ });
147
+ const result = readResult();
148
+ (0, vitest_1.expect)(result).toMatchSnapshot();
149
+ });
150
+ });
151
+ (0, vitest_1.describe)('idempotency', () => {
152
+ (0, vitest_1.it)('does not wrap again if Sentry is already present', async () => {
153
+ const filePath = copyFixture('already-wrapped.ts');
154
+ const originalContent = fs.readFileSync(path.join(fixturesDir, 'already-wrapped.ts'), 'utf-8');
155
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'new-dsn', {
156
+ performance: true,
157
+ logs: false,
158
+ });
159
+ const result = readResult();
160
+ (0, vitest_1.expect)(result).toBe(originalContent);
161
+ });
162
+ (0, vitest_1.it)('does not modify if @sentry/cloudflare is imported', async () => {
163
+ const filePath = copyFixture('with-sentry-import.ts');
164
+ const originalContent = fs.readFileSync(path.join(fixturesDir, 'with-sentry-import.ts'), 'utf-8');
165
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
166
+ performance: false,
167
+ logs: false,
168
+ });
169
+ const result = readResult();
170
+ (0, vitest_1.expect)(result).toBe(originalContent);
171
+ });
172
+ });
173
+ (0, vitest_1.describe)('DSN handling', () => {
174
+ (0, vitest_1.it)('uses the provided DSN', async () => {
175
+ const filePath = copyFixture('simple.ts');
176
+ const testDsn = 'https://d7a9abbecd95ed7d0f5b6c965f5fb6ba@o447951.ingest.us.sentry.io/4510147615391744';
177
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, testDsn, {
178
+ performance: false,
179
+ logs: false,
180
+ });
181
+ const result = readResult();
182
+ (0, vitest_1.expect)(result).toMatchSnapshot();
183
+ });
184
+ });
185
+ (0, vitest_1.describe)('edge cases', () => {
186
+ (0, vitest_1.it)('handles worker without satisfies clause', async () => {
187
+ const filePath = copyFixture('simple.ts');
188
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
189
+ performance: false,
190
+ logs: false,
191
+ });
192
+ const result = readResult();
193
+ (0, vitest_1.expect)(result).toMatchSnapshot();
194
+ });
195
+ (0, vitest_1.it)('handles files with no default export gracefully', async () => {
196
+ const filePath = copyFixture('no-default-export.ts');
197
+ await (0, vitest_1.expect)((0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
198
+ performance: false,
199
+ logs: false,
200
+ })).resolves.not.toThrow();
201
+ const result = readResult();
202
+ (0, vitest_1.expect)(result).toMatchSnapshot();
203
+ });
204
+ });
205
+ });
206
+ //# sourceMappingURL=wrap-worker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-worker.test.js","sourceRoot":"","sources":["../../../test/cloudflare/wrap-worker.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { wrapWorkerWithSentry } from '../../src/cloudflare/wrap-worker';\n\ndescribe('wrapWorkerWithSentry', () => {\n const fixturesDir = path.join(__dirname, 'fixtures', 'worker');\n let tmpDir: string;\n\n function copyFixture(fixtureName: string): string {\n const content = fs.readFileSync(\n path.join(fixturesDir, fixtureName),\n 'utf-8',\n );\n const targetPath = path.join(tmpDir, 'worker.ts');\n fs.writeFileSync(targetPath, content);\n return targetPath;\n }\n\n function readResult(): string {\n return fs.readFileSync(path.join(tmpDir, 'worker.ts'), 'utf-8');\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wrap-worker-'));\n });\n\n afterEach(() => {\n if (fs.existsSync(tmpDir)) {\n fs.rmSync(tmpDir, { recursive: true });\n }\n\n vi.restoreAllMocks();\n });\n\n describe('basic wrapping', () => {\n it('wraps a simple worker export with Sentry', async () => {\n const filePath = copyFixture('simple-with-satisfies.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-test-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves complex handler logic', async () => {\n const filePath = copyFixture('complex-handler.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('performance monitoring', () => {\n it('includes tracesSampleRate when performance is enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: true,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('omits tracesSampleRate when performance is disabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('logs', () => {\n it('includes enableLogs when logs is enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: true,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('omits enableLogs when logs is disabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).not.toContain('enableLogs');\n });\n\n it('includes both tracesSampleRate and enableLogs when both are enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: true,\n logs: true,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('import handling', () => {\n it('adds Sentry import at the beginning of the file', async () => {\n const filePath = copyFixture('with-comment.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves existing imports', async () => {\n const filePath = copyFixture('with-import.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves an external default export', async () => {\n const filePath = copyFixture('external-default-export.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('idempotency', () => {\n it('does not wrap again if Sentry is already present', async () => {\n const filePath = copyFixture('already-wrapped.ts');\n const originalContent = fs.readFileSync(\n path.join(fixturesDir, 'already-wrapped.ts'),\n 'utf-8',\n );\n\n await wrapWorkerWithSentry(filePath, 'new-dsn', {\n performance: true,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toBe(originalContent);\n });\n\n it('does not modify if @sentry/cloudflare is imported', async () => {\n const filePath = copyFixture('with-sentry-import.ts');\n const originalContent = fs.readFileSync(\n path.join(fixturesDir, 'with-sentry-import.ts'),\n 'utf-8',\n );\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toBe(originalContent);\n });\n });\n\n describe('DSN handling', () => {\n it('uses the provided DSN', async () => {\n const filePath = copyFixture('simple.ts');\n\n const testDsn =\n 'https://d7a9abbecd95ed7d0f5b6c965f5fb6ba@o447951.ingest.us.sentry.io/4510147615391744';\n\n await wrapWorkerWithSentry(filePath, testDsn, {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('edge cases', () => {\n it('handles worker without satisfies clause', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('handles files with no default export gracefully', async () => {\n const filePath = copyFixture('no-default-export.ts');\n\n await expect(\n wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n }),\n ).resolves.not.toThrow();\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n});\n"]}
@@ -1,7 +1,35 @@
1
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
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  const vitest_1 = require("vitest");
4
27
  const expo_1 = require("../../src/react-native/expo");
28
+ const fs = __importStar(require("fs"));
29
+ const git = __importStar(require("../../src/react-native/git"));
30
+ // Mock modules
31
+ vitest_1.vi.mock('fs');
32
+ vitest_1.vi.mock('../../src/react-native/git');
5
33
  (0, vitest_1.describe)('expo', () => {
6
34
  const MOCK_CONFIG = {
7
35
  url: 'https://sentry.mock/',
@@ -9,6 +37,12 @@ const expo_1 = require("../../src/react-native/expo");
9
37
  project: 'project-mock',
10
38
  authToken: 'authToken-mock',
11
39
  };
40
+ (0, vitest_1.beforeEach)(() => {
41
+ vitest_1.vi.clearAllMocks();
42
+ });
43
+ (0, vitest_1.afterEach)(() => {
44
+ vitest_1.vi.restoreAllMocks();
45
+ });
12
46
  (0, vitest_1.describe)('addWithSentryToAppConfigJson', () => {
13
47
  (0, vitest_1.test)('do not add if sentry-expo present', () => {
14
48
  const appConfigJson = `{
@@ -74,5 +108,111 @@ const expo_1 = require("../../src/react-native/expo");
74
108
  });
75
109
  });
76
110
  });
111
+ (0, vitest_1.describe)('isExpoCNG', () => {
112
+ (0, vitest_1.test)('returns true when neither ios nor android folders exist', async () => {
113
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
114
+ const result = await (0, expo_1.isExpoCNG)();
115
+ (0, vitest_1.expect)(result).toBe(true);
116
+ // Should check for ios folder existence
117
+ (0, vitest_1.expect)(fs.existsSync).toHaveBeenCalled();
118
+ // Should not check gitignore if folders don't exist
119
+ (0, vitest_1.expect)(git.isFolderInGitignore).not.toHaveBeenCalled();
120
+ });
121
+ (0, vitest_1.test)('returns true when only ios exists and is in gitignore (android considered ignored)', async () => {
122
+ vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');
123
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
124
+ const result = await (0, expo_1.isExpoCNG)();
125
+ (0, vitest_1.expect)(result).toBe(true);
126
+ // Should only check ios since android doesn't exist (auto-resolves to true)
127
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
128
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
129
+ });
130
+ (0, vitest_1.test)('returns true when only android exists and is in gitignore (ios considered ignored)', async () => {
131
+ vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'android');
132
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
133
+ const result = await (0, expo_1.isExpoCNG)();
134
+ (0, vitest_1.expect)(result).toBe(true);
135
+ // Should only check android since ios doesn't exist (auto-resolves to true)
136
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
137
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
138
+ });
139
+ (0, vitest_1.test)('returns false when only ios exists but is NOT in gitignore', async () => {
140
+ vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');
141
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(false);
142
+ const result = await (0, expo_1.isExpoCNG)();
143
+ (0, vitest_1.expect)(result).toBe(false);
144
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
145
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
146
+ });
147
+ (0, vitest_1.test)('returns true when both folders exist AND both are in gitignore', async () => {
148
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
149
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
150
+ const result = await (0, expo_1.isExpoCNG)();
151
+ (0, vitest_1.expect)(result).toBe(true);
152
+ (0, vitest_1.expect)(fs.existsSync).toHaveBeenCalledWith('ios');
153
+ (0, vitest_1.expect)(fs.existsSync).toHaveBeenCalledWith('android');
154
+ // Should check both folders with Promise.all
155
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
156
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
157
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
158
+ });
159
+ (0, vitest_1.test)('returns false when both folders exist BUT neither is in gitignore', async () => {
160
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
161
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(false);
162
+ const result = await (0, expo_1.isExpoCNG)();
163
+ (0, vitest_1.expect)(result).toBe(false);
164
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
165
+ });
166
+ (0, vitest_1.test)('returns false when both folders exist but only ios is in gitignore', async () => {
167
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
168
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockImplementation((folder) => Promise.resolve(folder === 'ios'));
169
+ const result = await (0, expo_1.isExpoCNG)();
170
+ (0, vitest_1.expect)(result).toBe(false);
171
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
172
+ });
173
+ (0, vitest_1.test)('returns false when both folders exist but only android is in gitignore', async () => {
174
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
175
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockImplementation((folder) => Promise.resolve(folder === 'android'));
176
+ const result = await (0, expo_1.isExpoCNG)();
177
+ (0, vitest_1.expect)(result).toBe(false);
178
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
179
+ });
180
+ (0, vitest_1.test)('uses Promise.all to check both folders in parallel when both exist', async () => {
181
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
182
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
183
+ await (0, expo_1.isExpoCNG)();
184
+ // Should check both folders
185
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
186
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
187
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
188
+ });
189
+ (0, vitest_1.test)('only checks existing folders', async () => {
190
+ // Test when only ios exists
191
+ vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');
192
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
193
+ await (0, expo_1.isExpoCNG)();
194
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
195
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
196
+ // Reset and test when only android exists
197
+ vitest_1.vi.clearAllMocks();
198
+ vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'android');
199
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
200
+ await (0, expo_1.isExpoCNG)();
201
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
202
+ (0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
203
+ // Reset and test when neither exists
204
+ vitest_1.vi.clearAllMocks();
205
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
206
+ await (0, expo_1.isExpoCNG)();
207
+ (0, vitest_1.expect)(git.isFolderInGitignore).not.toHaveBeenCalled();
208
+ });
209
+ (0, vitest_1.test)('handles errors from isFolderInGitignore gracefully', async () => {
210
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
211
+ vitest_1.vi.mocked(git.isFolderInGitignore).mockRejectedValue(new Error('File system error'));
212
+ const result = await (0, expo_1.isExpoCNG)();
213
+ // Should catch error and return false instead of throwing
214
+ (0, vitest_1.expect)(result).toBe(false);
215
+ });
216
+ });
77
217
  });
78
218
  //# sourceMappingURL=expo.test.js.map