@sentry/wizard 6.10.0 → 6.11.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 (144) hide show
  1. package/CHANGELOG.md +20 -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 +64 -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 +4 -7
  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.test.js +163 -145
  33. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  34. package/dist/e2e-tests/tests/remix.test.js +162 -132
  35. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  36. package/dist/e2e-tests/tests/sveltekit-hooks.test.js +48 -36
  37. package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
  38. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +3 -6
  39. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  40. package/dist/e2e-tests/utils/index.d.ts +15 -43
  41. package/dist/e2e-tests/utils/index.js +95 -185
  42. package/dist/e2e-tests/utils/index.js.map +1 -1
  43. package/dist/get-e2e-test-matrix.mjs +11 -0
  44. package/dist/lib/Constants.d.ts +1 -0
  45. package/dist/lib/Constants.js +5 -0
  46. package/dist/lib/Constants.js.map +1 -1
  47. package/dist/src/android/android-wizard.js +2 -4
  48. package/dist/src/android/android-wizard.js.map +1 -1
  49. package/dist/src/angular/angular-wizard.js +4 -6
  50. package/dist/src/angular/angular-wizard.js.map +1 -1
  51. package/dist/src/angular/sdk-setup.js +1 -1
  52. package/dist/src/angular/sdk-setup.js.map +1 -1
  53. package/dist/src/apple/apple-wizard.js +2 -4
  54. package/dist/src/apple/apple-wizard.js.map +1 -1
  55. package/dist/src/cloudflare/cloudflare-wizard.d.ts +3 -0
  56. package/dist/src/cloudflare/cloudflare-wizard.js +99 -0
  57. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -0
  58. package/dist/src/cloudflare/sdk-setup.d.ts +7 -0
  59. package/dist/src/cloudflare/sdk-setup.js +47 -0
  60. package/dist/src/cloudflare/sdk-setup.js.map +1 -0
  61. package/dist/src/cloudflare/templates.d.ts +4 -0
  62. package/dist/src/cloudflare/templates.js +44 -0
  63. package/dist/src/cloudflare/templates.js.map +1 -0
  64. package/dist/src/cloudflare/wrangler/create-wrangler-config.d.ts +4 -0
  65. package/dist/src/cloudflare/wrangler/create-wrangler-config.js +27 -0
  66. package/dist/src/cloudflare/wrangler/create-wrangler-config.js.map +1 -0
  67. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.d.ts +4 -0
  68. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js +25 -0
  69. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js.map +1 -0
  70. package/dist/src/cloudflare/wrangler/find-wrangler-config.d.ts +4 -0
  71. package/dist/src/cloudflare/wrangler/find-wrangler-config.js +23 -0
  72. package/dist/src/cloudflare/wrangler/find-wrangler-config.js.map +1 -0
  73. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.d.ts +6 -0
  74. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js +52 -0
  75. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js.map +1 -0
  76. package/dist/src/cloudflare/wrangler/update-wrangler-config.d.ts +17 -0
  77. package/dist/src/cloudflare/wrangler/update-wrangler-config.js +173 -0
  78. package/dist/src/cloudflare/wrangler/update-wrangler-config.js.map +1 -0
  79. package/dist/src/cloudflare/wrap-worker.d.ts +32 -0
  80. package/dist/src/cloudflare/wrap-worker.js +109 -0
  81. package/dist/src/cloudflare/wrap-worker.js.map +1 -0
  82. package/dist/src/flutter/flutter-wizard.js +3 -6
  83. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  84. package/dist/src/nextjs/nextjs-wizard.js +0 -2
  85. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  86. package/dist/src/nuxt/nuxt-wizard.js +3 -5
  87. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  88. package/dist/src/react-native/react-native-wizard.js +2 -4
  89. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  90. package/dist/src/react-router/react-router-wizard.js +3 -5
  91. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  92. package/dist/src/react-router/sdk-setup.d.ts +1 -1
  93. package/dist/src/react-router/sdk-setup.js +3 -4
  94. package/dist/src/react-router/sdk-setup.js.map +1 -1
  95. package/dist/src/remix/remix-wizard.js +2 -4
  96. package/dist/src/remix/remix-wizard.js.map +1 -1
  97. package/dist/src/run.d.ts +1 -1
  98. package/dist/src/run.js +5 -0
  99. package/dist/src/run.js.map +1 -1
  100. package/dist/src/sveltekit/sveltekit-wizard.js +2 -4
  101. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  102. package/dist/src/utils/abort-if-sportlight-not-supported.d.ts +5 -0
  103. package/dist/src/utils/abort-if-sportlight-not-supported.js +40 -0
  104. package/dist/src/utils/abort-if-sportlight-not-supported.js.map +1 -0
  105. package/dist/src/utils/ast-utils.d.ts +1 -1
  106. package/dist/src/utils/ast-utils.js.map +1 -1
  107. package/dist/src/utils/clack/index.d.ts +2 -2
  108. package/dist/src/utils/clack/index.js.map +1 -1
  109. package/dist/src/utils/clack/mcp-config.js +117 -59
  110. package/dist/src/utils/clack/mcp-config.js.map +1 -1
  111. package/dist/src/version.d.ts +1 -1
  112. package/dist/src/version.js +1 -1
  113. package/dist/src/version.js.map +1 -1
  114. package/dist/test/angular/angular-wizard.test.js +2 -4
  115. package/dist/test/angular/angular-wizard.test.js.map +1 -1
  116. package/dist/test/cloudflare/create-wrangler-config.test.d.ts +1 -0
  117. package/dist/test/cloudflare/create-wrangler-config.test.js +48 -0
  118. package/dist/test/cloudflare/create-wrangler-config.test.js.map +1 -0
  119. package/dist/test/cloudflare/ensure-wrangler-config.test.d.ts +1 -0
  120. package/dist/test/cloudflare/ensure-wrangler-config.test.js +61 -0
  121. package/dist/test/cloudflare/ensure-wrangler-config.test.js.map +1 -0
  122. package/dist/test/cloudflare/find-wrangler-config.test.d.ts +1 -0
  123. package/dist/test/cloudflare/find-wrangler-config.test.js +77 -0
  124. package/dist/test/cloudflare/find-wrangler-config.test.js.map +1 -0
  125. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.d.ts +1 -0
  126. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js +81 -0
  127. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js.map +1 -0
  128. package/dist/test/cloudflare/sdk-setup.test.d.ts +1 -0
  129. package/dist/test/cloudflare/sdk-setup.test.js +152 -0
  130. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -0
  131. package/dist/test/cloudflare/templates.test.d.ts +1 -0
  132. package/dist/test/cloudflare/templates.test.js +68 -0
  133. package/dist/test/cloudflare/templates.test.js.map +1 -0
  134. package/dist/test/cloudflare/update-wrangler-config.test.d.ts +1 -0
  135. package/dist/test/cloudflare/update-wrangler-config.test.js +216 -0
  136. package/dist/test/cloudflare/update-wrangler-config.test.js.map +1 -0
  137. package/dist/test/cloudflare/wrap-worker.test.d.ts +1 -0
  138. package/dist/test/cloudflare/wrap-worker.test.js +143 -0
  139. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -0
  140. package/dist/test/react-router/sdk-setup.test.js +2 -2
  141. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  142. package/dist/test/utils/clack/mcp-config.test.js +176 -51
  143. package/dist/test/utils/clack/mcp-config.test.js.map +1 -1
  144. package/package.json +5 -4
@@ -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,143 @@
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
+ });
59
+ const result = readResult();
60
+ (0, vitest_1.expect)(result).toMatchSnapshot();
61
+ });
62
+ (0, vitest_1.it)('preserves complex handler logic', async () => {
63
+ const filePath = copyFixture('complex-handler.ts');
64
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
65
+ const result = readResult();
66
+ (0, vitest_1.expect)(result).toMatchSnapshot();
67
+ });
68
+ });
69
+ (0, vitest_1.describe)('performance monitoring', () => {
70
+ (0, vitest_1.it)('includes tracesSampleRate when performance is enabled', async () => {
71
+ const filePath = copyFixture('simple.ts');
72
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: true });
73
+ const result = readResult();
74
+ (0, vitest_1.expect)(result).toMatchSnapshot();
75
+ });
76
+ (0, vitest_1.it)('omits tracesSampleRate when performance is disabled', async () => {
77
+ const filePath = copyFixture('simple.ts');
78
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
79
+ const result = readResult();
80
+ (0, vitest_1.expect)(result).toMatchSnapshot();
81
+ });
82
+ });
83
+ (0, vitest_1.describe)('import handling', () => {
84
+ (0, vitest_1.it)('adds Sentry import at the beginning of the file', async () => {
85
+ const filePath = copyFixture('with-comment.ts');
86
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
87
+ const result = readResult();
88
+ (0, vitest_1.expect)(result).toMatchSnapshot();
89
+ });
90
+ (0, vitest_1.it)('preserves existing imports', async () => {
91
+ const filePath = copyFixture('with-import.ts');
92
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
93
+ const result = readResult();
94
+ (0, vitest_1.expect)(result).toMatchSnapshot();
95
+ });
96
+ (0, vitest_1.it)('preserves an external default export', async () => {
97
+ const filePath = copyFixture('external-default-export.ts');
98
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
99
+ const result = readResult();
100
+ (0, vitest_1.expect)(result).toMatchSnapshot();
101
+ });
102
+ });
103
+ (0, vitest_1.describe)('idempotency', () => {
104
+ (0, vitest_1.it)('does not wrap again if Sentry is already present', async () => {
105
+ const filePath = copyFixture('already-wrapped.ts');
106
+ const originalContent = fs.readFileSync(path.join(fixturesDir, 'already-wrapped.ts'), 'utf-8');
107
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'new-dsn', { performance: true });
108
+ const result = readResult();
109
+ (0, vitest_1.expect)(result).toBe(originalContent);
110
+ });
111
+ (0, vitest_1.it)('does not modify if @sentry/cloudflare is imported', async () => {
112
+ const filePath = copyFixture('with-sentry-import.ts');
113
+ const originalContent = fs.readFileSync(path.join(fixturesDir, 'with-sentry-import.ts'), 'utf-8');
114
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
115
+ const result = readResult();
116
+ (0, vitest_1.expect)(result).toBe(originalContent);
117
+ });
118
+ });
119
+ (0, vitest_1.describe)('DSN handling', () => {
120
+ (0, vitest_1.it)('uses the provided DSN', async () => {
121
+ const filePath = copyFixture('simple.ts');
122
+ const testDsn = 'https://d7a9abbecd95ed7d0f5b6c965f5fb6ba@o447951.ingest.us.sentry.io/4510147615391744';
123
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, testDsn, { performance: false });
124
+ const result = readResult();
125
+ (0, vitest_1.expect)(result).toMatchSnapshot();
126
+ });
127
+ });
128
+ (0, vitest_1.describe)('edge cases', () => {
129
+ (0, vitest_1.it)('handles worker without satisfies clause', async () => {
130
+ const filePath = copyFixture('simple.ts');
131
+ await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false });
132
+ const result = readResult();
133
+ (0, vitest_1.expect)(result).toMatchSnapshot();
134
+ });
135
+ (0, vitest_1.it)('handles files with no default export gracefully', async () => {
136
+ const filePath = copyFixture('no-default-export.ts');
137
+ await (0, vitest_1.expect)((0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', { performance: false })).resolves.not.toThrow();
138
+ const result = readResult();
139
+ (0, vitest_1.expect)(result).toMatchSnapshot();
140
+ });
141
+ });
142
+ });
143
+ //# 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 });\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', { performance: false });\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', { performance: true });\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', { performance: false });\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', { performance: false });\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', { performance: false });\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', { performance: false });\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', { performance: true });\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', { performance: false });\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, { performance: false });\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', { performance: false });\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', { performance: false }),\n ).resolves.not.toThrow();\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n});\n"]}
@@ -165,7 +165,7 @@ const templates_1 = require("../../src/react-router/templates");
165
165
  (0, vitest_1.it)('runs the reveal CLI when entry files are missing', () => {
166
166
  existsSyncMock.mockReturnValue(false);
167
167
  childProcess.execSync.mockImplementation(() => 'ok');
168
- (0, sdk_setup_1.runReactRouterReveal)(false);
168
+ (0, sdk_setup_1.runReactRouterReveal)();
169
169
  (0, vitest_1.expect)(childProcess.execSync).toHaveBeenCalledWith('npx react-router reveal', {
170
170
  encoding: 'utf8',
171
171
  stdio: 'pipe',
@@ -174,7 +174,7 @@ const templates_1 = require("../../src/react-router/templates");
174
174
  (0, vitest_1.it)('does not run the reveal CLI when entry files already exist', () => {
175
175
  existsSyncMock.mockReturnValue(true);
176
176
  childProcess.execSync.mockReset();
177
- (0, sdk_setup_1.runReactRouterReveal)(false);
177
+ (0, sdk_setup_1.runReactRouterReveal)();
178
178
  (0, vitest_1.expect)(childProcess.execSync).not.toHaveBeenCalled();
179
179
  });
180
180
  });
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-setup.test.js","sourceRoot":"","sources":["../../../test/react-router/sdk-setup.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\nconst { clackMocks } = vi.hoisted(() => {\n const info = vi.fn();\n const warn = vi.fn();\n const error = vi.fn();\n const success = vi.fn();\n const outro = vi.fn();\n const confirm = vi.fn(() => Promise.resolve(false)); // default to false for tests\n\n return {\n clackMocks: {\n info,\n warn,\n error,\n success,\n outro,\n confirm,\n },\n };\n});\n\nvi.mock('@clack/prompts', () => {\n return {\n __esModule: true,\n default: {\n log: {\n info: clackMocks.info,\n warn: clackMocks.warn,\n error: clackMocks.error,\n success: clackMocks.success,\n },\n outro: clackMocks.outro,\n confirm: clackMocks.confirm,\n },\n };\n});\n\nconst { existsSyncMock, readFileSyncMock, writeFileSyncMock } = vi.hoisted(\n () => {\n return {\n existsSyncMock: vi.fn(),\n readFileSyncMock: vi.fn(),\n writeFileSyncMock: vi.fn(),\n };\n },\n);\n\nconst { getPackageDotJsonMock, getPackageVersionMock } = vi.hoisted(() => ({\n getPackageDotJsonMock: vi.fn(),\n getPackageVersionMock: vi.fn(),\n}));\n\nvi.mock('../../src/utils/package-json', () => ({\n getPackageDotJson: getPackageDotJsonMock,\n getPackageVersion: getPackageVersionMock,\n}));\n\nvi.mock('fs', async () => {\n return {\n ...(await vi.importActual('fs')),\n existsSync: existsSyncMock,\n readFileSync: readFileSyncMock,\n writeFileSync: writeFileSyncMock,\n promises: {\n writeFile: vi.fn(),\n },\n };\n});\n\n// module-level mock for child_process.execSync\nvi.mock('child_process', () => ({\n __esModule: true,\n execSync: vi.fn(),\n}));\n\n// mock showCopyPasteInstructions and makeCodeSnippet used by templates\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\n showCopyPasteInstructions: vi.fn(() => Promise.resolve()),\n makeCodeSnippet: vi.fn(\n (\n colors: boolean,\n callback: (\n unchanged: (str: string) => string,\n plus: (str: string) => string,\n minus: (str: string) => string,\n ) => string,\n ) => {\n // Mock implementation that just calls the callback with simple string functions\n const unchanged = (str: string) => str;\n const plus = (str: string) => `+ ${str}`;\n const minus = (str: string) => `- ${str}`;\n return callback(unchanged, plus, minus);\n },\n ),\n getPackageDotJson: getPackageDotJsonMock,\n };\n});\n\nimport {\n isReactRouterV7,\n runReactRouterReveal,\n createServerInstrumentationFile,\n tryRevealAndGetManualInstructions,\n updatePackageJsonScripts,\n} from '../../src/react-router/sdk-setup';\nimport * as childProcess from 'child_process';\nimport type { Mock } from 'vitest';\nimport { getSentryInstrumentationServerContent } from '../../src/react-router/templates';\n\ndescribe('React Router SDK Setup', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n\n getPackageVersionMock.mockImplementation(\n (\n packageName: string,\n packageJson: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n ) => {\n if (packageJson.dependencies?.[packageName]) {\n return packageJson.dependencies[packageName];\n }\n if (packageJson.devDependencies?.[packageName]) {\n return packageJson.devDependencies[packageName];\n }\n return null;\n },\n );\n });\n\n describe('isReactRouterV7', () => {\n it('should return true for React Router v7+ in dependencies or devDependencies', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '7.0.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '^7.1.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({\n devDependencies: { '@react-router/dev': '7.1.0' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router v6 or missing dependency', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '6.28.0' } }),\n ).toBe(false);\n expect(isReactRouterV7({ dependencies: { react: '^18.0.0' } })).toBe(\n false,\n );\n expect(isReactRouterV7({})).toBe(false);\n });\n });\n\n describe('generateServerInstrumentation', () => {\n it('should generate server instrumentation file with all features enabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = true;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 1');\n expect(result).toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation file when performance is disabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('enableLogs: true');\n });\n });\n});\n\ndescribe('runReactRouterReveal', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('runs the reveal CLI when entry files are missing', () => {\n existsSyncMock.mockReturnValue(false);\n\n (childProcess.execSync as unknown as Mock).mockImplementation(() => 'ok');\n\n runReactRouterReveal(false);\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n\n it('does not run the reveal CLI when entry files already exist', () => {\n existsSyncMock.mockReturnValue(true);\n\n (childProcess.execSync as unknown as Mock).mockReset();\n\n runReactRouterReveal(false);\n\n expect(childProcess.execSync).not.toHaveBeenCalled();\n });\n});\n\ndescribe('server instrumentation helpers', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('createServerInstrumentationFile writes instrumentation file and returns path', () => {\n writeFileSyncMock.mockImplementation(() => undefined);\n\n const path = createServerInstrumentationFile('https://sentry.io/123', {\n performance: true,\n replay: false,\n logs: true,\n profiling: false,\n });\n\n expect(path).toContain('instrument.server.mjs');\n expect(writeFileSyncMock).toHaveBeenCalled();\n const writtenCall = writeFileSyncMock.mock.calls[0] as unknown as [\n string,\n string,\n ];\n expect(writtenCall[0]).toEqual(\n expect.stringContaining('instrument.server.mjs'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('dsn: \"https://sentry.io/123\"'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('tracesSampleRate: 1'),\n );\n });\n});\n\ndescribe('tryRevealAndGetManualInstructions', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should return true when user confirms and reveal command succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Successfully generated entry files',\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(true);\n expect(clackMocks.confirm).toHaveBeenCalledWith({\n message: expect.stringContaining(\n 'Would you like to try running',\n ) as string,\n initialValue: true,\n });\n expect(clackMocks.info).toHaveBeenCalledWith(\n expect.stringContaining('Running'),\n );\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n expect(clackMocks.success).toHaveBeenCalledWith(\n expect.stringContaining('Found entry.client.tsx after running reveal'),\n );\n });\n\n it('should return false when user declines reveal operation', async () => {\n const missingFilename = 'entry.server.tsx';\n const filePath = '/app/entry.server.tsx';\n\n // Mock user declining the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(clackMocks.confirm).toHaveBeenCalled();\n expect(childProcess.execSync).not.toHaveBeenCalled();\n expect(clackMocks.info).not.toHaveBeenCalled();\n });\n\n it('should return false when reveal command succeeds but file still does not exist', async () => {\n const missingFilename = 'entry.client.jsx';\n const filePath = '/app/entry.client.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Command output',\n );\n\n // Mock file NOT existing after reveal\n existsSyncMock.mockReturnValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining(\n 'entry.client.jsx still not found after running reveal',\n ),\n );\n });\n\n it('should return false when reveal command throws an error', async () => {\n const missingFilename = 'entry.server.jsx';\n const filePath = '/app/entry.server.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync throwing an error\n const mockError = new Error('Command failed');\n (childProcess.execSync as unknown as Mock).mockImplementationOnce(() => {\n throw mockError;\n });\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('Failed to run npx react-router reveal'),\n );\n });\n\n it('should log command output when reveal succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n const commandOutput = 'Generated entry files successfully';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding with output\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n commandOutput,\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(clackMocks.info).toHaveBeenCalledWith(commandOutput);\n });\n\n it('should handle reveal command with proper parameters', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce('ok');\n\n // Mock file existing\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n});\n\ndescribe('updatePackageJsonScripts', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should set NODE_ENV=production for both dev and start scripts (workaround for React Router v7 + React 19 issue)', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'react-router dev',\n start: 'react-router serve',\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify writeFile was called\n expect(writeFileMock).toHaveBeenCalled();\n\n // Check the written package.json content\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Both dev and start scripts should use the correct filenames and commands according to documentation\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router dev\",\n );\n\n // The start script should use react-router-serve with build path according to documentation\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n\n // The build script should remain unchanged\n expect(writtenContent.scripts.build).toBe('react-router build');\n });\n\n it('should handle package.json with only start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start: 'react-router serve',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify only start script is modified when dev doesn't exist\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n expect(writtenContent.scripts.dev).toBeUndefined();\n });\n\n it('should throw error when no start script exists', async () => {\n const mockPackageJson = {\n scripts: {\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return package.json without start script\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n await expect(updatePackageJsonScripts()).rejects.toThrow(\n 'Could not find a `start` script in your package.json. Please add: \"start\": \"react-router-serve ./build/server/index.js\" and re-run the wizard.',\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in dev script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=--loader ts-node/register react-router dev',\n start: 'react-router serve',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--loader ts-node/register --import ./instrument.server.mjs' react-router dev\",\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start:\n 'NODE_OPTIONS=--require ./dotenv-config.js react-router-serve ./build/server/index.js',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--require ./dotenv-config.js --import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n });\n\n it('should handle quoted NODE_OPTIONS and standardize to single quotes', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=\"--max-old-space-size=4096\" react-router dev',\n start: \"NODE_OPTIONS='--enable-source-maps' react-router serve\",\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should standardize to single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--max-old-space-size=4096 --import ./instrument.server.mjs' react-router dev\",\n );\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--enable-source-maps --import ./instrument.server.mjs' react-router serve\",\n );\n });\n});\n"]}
1
+ {"version":3,"file":"sdk-setup.test.js","sourceRoot":"","sources":["../../../test/react-router/sdk-setup.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\nconst { clackMocks } = vi.hoisted(() => {\n const info = vi.fn();\n const warn = vi.fn();\n const error = vi.fn();\n const success = vi.fn();\n const outro = vi.fn();\n const confirm = vi.fn(() => Promise.resolve(false)); // default to false for tests\n\n return {\n clackMocks: {\n info,\n warn,\n error,\n success,\n outro,\n confirm,\n },\n };\n});\n\nvi.mock('@clack/prompts', () => {\n return {\n __esModule: true,\n default: {\n log: {\n info: clackMocks.info,\n warn: clackMocks.warn,\n error: clackMocks.error,\n success: clackMocks.success,\n },\n outro: clackMocks.outro,\n confirm: clackMocks.confirm,\n },\n };\n});\n\nconst { existsSyncMock, readFileSyncMock, writeFileSyncMock } = vi.hoisted(\n () => {\n return {\n existsSyncMock: vi.fn(),\n readFileSyncMock: vi.fn(),\n writeFileSyncMock: vi.fn(),\n };\n },\n);\n\nconst { getPackageDotJsonMock, getPackageVersionMock } = vi.hoisted(() => ({\n getPackageDotJsonMock: vi.fn(),\n getPackageVersionMock: vi.fn(),\n}));\n\nvi.mock('../../src/utils/package-json', () => ({\n getPackageDotJson: getPackageDotJsonMock,\n getPackageVersion: getPackageVersionMock,\n}));\n\nvi.mock('fs', async () => {\n return {\n ...(await vi.importActual('fs')),\n existsSync: existsSyncMock,\n readFileSync: readFileSyncMock,\n writeFileSync: writeFileSyncMock,\n promises: {\n writeFile: vi.fn(),\n },\n };\n});\n\n// module-level mock for child_process.execSync\nvi.mock('child_process', () => ({\n __esModule: true,\n execSync: vi.fn(),\n}));\n\n// mock showCopyPasteInstructions and makeCodeSnippet used by templates\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\n showCopyPasteInstructions: vi.fn(() => Promise.resolve()),\n makeCodeSnippet: vi.fn(\n (\n colors: boolean,\n callback: (\n unchanged: (str: string) => string,\n plus: (str: string) => string,\n minus: (str: string) => string,\n ) => string,\n ) => {\n // Mock implementation that just calls the callback with simple string functions\n const unchanged = (str: string) => str;\n const plus = (str: string) => `+ ${str}`;\n const minus = (str: string) => `- ${str}`;\n return callback(unchanged, plus, minus);\n },\n ),\n getPackageDotJson: getPackageDotJsonMock,\n };\n});\n\nimport {\n isReactRouterV7,\n runReactRouterReveal,\n createServerInstrumentationFile,\n tryRevealAndGetManualInstructions,\n updatePackageJsonScripts,\n} from '../../src/react-router/sdk-setup';\nimport * as childProcess from 'child_process';\nimport type { Mock } from 'vitest';\nimport { getSentryInstrumentationServerContent } from '../../src/react-router/templates';\n\ndescribe('React Router SDK Setup', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n\n getPackageVersionMock.mockImplementation(\n (\n packageName: string,\n packageJson: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n ) => {\n if (packageJson.dependencies?.[packageName]) {\n return packageJson.dependencies[packageName];\n }\n if (packageJson.devDependencies?.[packageName]) {\n return packageJson.devDependencies[packageName];\n }\n return null;\n },\n );\n });\n\n describe('isReactRouterV7', () => {\n it('should return true for React Router v7+ in dependencies or devDependencies', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '7.0.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '^7.1.0' } }),\n ).toBe(true);\n expect(\n isReactRouterV7({\n devDependencies: { '@react-router/dev': '7.1.0' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router v6 or missing dependency', () => {\n expect(\n isReactRouterV7({ dependencies: { '@react-router/dev': '6.28.0' } }),\n ).toBe(false);\n expect(isReactRouterV7({ dependencies: { react: '^18.0.0' } })).toBe(\n false,\n );\n expect(isReactRouterV7({})).toBe(false);\n });\n });\n\n describe('generateServerInstrumentation', () => {\n it('should generate server instrumentation file with all features enabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = true;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 1');\n expect(result).toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation file when performance is disabled', () => {\n const dsn = 'https://sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getSentryInstrumentationServerContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain('dsn: \"https://sentry.io/123\"');\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('enableLogs: true');\n });\n });\n});\n\ndescribe('runReactRouterReveal', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('runs the reveal CLI when entry files are missing', () => {\n existsSyncMock.mockReturnValue(false);\n\n (childProcess.execSync as unknown as Mock).mockImplementation(() => 'ok');\n\n runReactRouterReveal();\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n\n it('does not run the reveal CLI when entry files already exist', () => {\n existsSyncMock.mockReturnValue(true);\n\n (childProcess.execSync as unknown as Mock).mockReset();\n\n runReactRouterReveal();\n\n expect(childProcess.execSync).not.toHaveBeenCalled();\n });\n});\n\ndescribe('server instrumentation helpers', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('createServerInstrumentationFile writes instrumentation file and returns path', () => {\n writeFileSyncMock.mockImplementation(() => undefined);\n\n const path = createServerInstrumentationFile('https://sentry.io/123', {\n performance: true,\n replay: false,\n logs: true,\n profiling: false,\n });\n\n expect(path).toContain('instrument.server.mjs');\n expect(writeFileSyncMock).toHaveBeenCalled();\n const writtenCall = writeFileSyncMock.mock.calls[0] as unknown as [\n string,\n string,\n ];\n expect(writtenCall[0]).toEqual(\n expect.stringContaining('instrument.server.mjs'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('dsn: \"https://sentry.io/123\"'),\n );\n expect(writtenCall[1]).toEqual(\n expect.stringContaining('tracesSampleRate: 1'),\n );\n });\n});\n\ndescribe('tryRevealAndGetManualInstructions', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should return true when user confirms and reveal command succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Successfully generated entry files',\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(true);\n expect(clackMocks.confirm).toHaveBeenCalledWith({\n message: expect.stringContaining(\n 'Would you like to try running',\n ) as string,\n initialValue: true,\n });\n expect(clackMocks.info).toHaveBeenCalledWith(\n expect.stringContaining('Running'),\n );\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n expect(clackMocks.success).toHaveBeenCalledWith(\n expect.stringContaining('Found entry.client.tsx after running reveal'),\n );\n });\n\n it('should return false when user declines reveal operation', async () => {\n const missingFilename = 'entry.server.tsx';\n const filePath = '/app/entry.server.tsx';\n\n // Mock user declining the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(clackMocks.confirm).toHaveBeenCalled();\n expect(childProcess.execSync).not.toHaveBeenCalled();\n expect(clackMocks.info).not.toHaveBeenCalled();\n });\n\n it('should return false when reveal command succeeds but file still does not exist', async () => {\n const missingFilename = 'entry.client.jsx';\n const filePath = '/app/entry.client.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n 'Command output',\n );\n\n // Mock file NOT existing after reveal\n existsSyncMock.mockReturnValueOnce(false);\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining(\n 'entry.client.jsx still not found after running reveal',\n ),\n );\n });\n\n it('should return false when reveal command throws an error', async () => {\n const missingFilename = 'entry.server.jsx';\n const filePath = '/app/entry.server.jsx';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync throwing an error\n const mockError = new Error('Command failed');\n (childProcess.execSync as unknown as Mock).mockImplementationOnce(() => {\n throw mockError;\n });\n\n const result = await tryRevealAndGetManualInstructions(\n missingFilename,\n filePath,\n );\n\n expect(result).toBe(false);\n expect(childProcess.execSync).toHaveBeenCalled();\n expect(clackMocks.warn).toHaveBeenCalledWith(\n expect.stringContaining('Failed to run npx react-router reveal'),\n );\n });\n\n it('should log command output when reveal succeeds', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n const commandOutput = 'Generated entry files successfully';\n\n // Mock user confirming the reveal operation\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding with output\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce(\n commandOutput,\n );\n\n // Mock file existing after reveal\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(clackMocks.info).toHaveBeenCalledWith(commandOutput);\n });\n\n it('should handle reveal command with proper parameters', async () => {\n const missingFilename = 'entry.client.tsx';\n const filePath = '/app/entry.client.tsx';\n\n // Mock user confirming\n clackMocks.confirm.mockResolvedValueOnce(true);\n\n // Mock execSync succeeding\n (childProcess.execSync as unknown as Mock).mockReturnValueOnce('ok');\n\n // Mock file existing\n existsSyncMock.mockReturnValueOnce(true);\n\n await tryRevealAndGetManualInstructions(missingFilename, filePath);\n\n expect(childProcess.execSync).toHaveBeenCalledWith(\n 'npx react-router reveal',\n {\n encoding: 'utf8',\n stdio: 'pipe',\n },\n );\n });\n});\n\ndescribe('updatePackageJsonScripts', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.resetAllMocks();\n });\n\n it('should set NODE_ENV=production for both dev and start scripts (workaround for React Router v7 + React 19 issue)', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'react-router dev',\n start: 'react-router serve',\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify writeFile was called\n expect(writeFileMock).toHaveBeenCalled();\n\n // Check the written package.json content\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Both dev and start scripts should use the correct filenames and commands according to documentation\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router dev\",\n );\n\n // The start script should use react-router-serve with build path according to documentation\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n\n // The build script should remain unchanged\n expect(writtenContent.scripts.build).toBe('react-router build');\n });\n\n it('should handle package.json with only start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start: 'react-router serve',\n },\n };\n\n // Mock getPackageDotJson to return our test package.json\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n // Mock fs.promises.writeFile\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n // Verify only start script is modified when dev doesn't exist\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n expect(writtenContent.scripts.dev).toBeUndefined();\n });\n\n it('should throw error when no start script exists', async () => {\n const mockPackageJson = {\n scripts: {\n build: 'react-router build',\n },\n };\n\n // Mock getPackageDotJson to return package.json without start script\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n await expect(updatePackageJsonScripts()).rejects.toThrow(\n 'Could not find a `start` script in your package.json. Please add: \"start\": \"react-router-serve ./build/server/index.js\" and re-run the wizard.',\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in dev script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=--loader ts-node/register react-router dev',\n start: 'react-router serve',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--loader ts-node/register --import ./instrument.server.mjs' react-router dev\",\n );\n });\n\n it('should handle unquoted NODE_OPTIONS in start script', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n start:\n 'NODE_OPTIONS=--require ./dotenv-config.js react-router-serve ./build/server/index.js',\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should merge unquoted NODE_OPTIONS and wrap result in single quotes\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--require ./dotenv-config.js --import ./instrument.server.mjs' react-router-serve ./build/server/index.js\",\n );\n });\n\n it('should handle quoted NODE_OPTIONS and standardize to single quotes', async () => {\n const mockPackageJson: { scripts: Record<string, string> } = {\n scripts: {\n dev: 'NODE_OPTIONS=\"--max-old-space-size=4096\" react-router dev',\n start: \"NODE_OPTIONS='--enable-source-maps' react-router serve\",\n },\n };\n\n getPackageDotJsonMock.mockResolvedValue(mockPackageJson);\n\n const fsPromises = await import('fs');\n const writeFileMock = vi\n .spyOn(fsPromises.promises, 'writeFile')\n .mockResolvedValue();\n\n await updatePackageJsonScripts();\n\n const writtenContent = JSON.parse(\n writeFileMock.mock.calls[0]?.[1] as string,\n ) as { scripts: Record<string, string> };\n\n // Should standardize to single quotes\n expect(writtenContent.scripts.dev).toBe(\n \"NODE_OPTIONS='--max-old-space-size=4096 --import ./instrument.server.mjs' react-router dev\",\n );\n expect(writtenContent.scripts.start).toBe(\n \"NODE_OPTIONS='--enable-source-maps --import ./instrument.server.mjs' react-router serve\",\n );\n });\n});\n"]}