@sentry/wizard 6.11.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 (99) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
  3. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
  4. package/dist/e2e-tests/tests/pnpm-workspace.test.js +2 -1
  5. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  6. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.d.ts +1 -0
  7. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
  8. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
  9. package/dist/e2e-tests/tests/react-router.test.js +3 -1
  10. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  11. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +2 -1
  12. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  13. package/dist/src/apple/code-tools.js +17 -3
  14. package/dist/src/apple/code-tools.js.map +1 -1
  15. package/dist/src/apple/configure-package-manager.js +18 -5
  16. package/dist/src/apple/configure-package-manager.js.map +1 -1
  17. package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
  18. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
  19. package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
  20. package/dist/src/cloudflare/sdk-setup.js.map +1 -1
  21. package/dist/src/cloudflare/templates.d.ts +1 -0
  22. package/dist/src/cloudflare/templates.js +7 -1
  23. package/dist/src/cloudflare/templates.js.map +1 -1
  24. package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
  25. package/dist/src/cloudflare/wrap-worker.js +7 -0
  26. package/dist/src/cloudflare/wrap-worker.js.map +1 -1
  27. package/dist/src/react-native/expo.d.ts +6 -0
  28. package/dist/src/react-native/expo.js +27 -1
  29. package/dist/src/react-native/expo.js.map +1 -1
  30. package/dist/src/react-native/git.d.ts +5 -0
  31. package/dist/src/react-native/git.js +32 -1
  32. package/dist/src/react-native/git.js.map +1 -1
  33. package/dist/src/react-native/javascript.js +3 -1
  34. package/dist/src/react-native/javascript.js.map +1 -1
  35. package/dist/src/react-native/react-native-wizard.js +12 -6
  36. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  37. package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
  38. package/dist/src/react-router/codemods/client.entry.js +69 -12
  39. package/dist/src/react-router/codemods/client.entry.js.map +1 -1
  40. package/dist/src/react-router/codemods/react-router-config.js +1 -1
  41. package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
  42. package/dist/src/react-router/codemods/root.js +1 -2
  43. package/dist/src/react-router/codemods/root.js.map +1 -1
  44. package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
  45. package/dist/src/react-router/codemods/server-entry.js +39 -4
  46. package/dist/src/react-router/codemods/server-entry.js.map +1 -1
  47. package/dist/src/react-router/codemods/vite.js +46 -1
  48. package/dist/src/react-router/codemods/vite.js.map +1 -1
  49. package/dist/src/react-router/react-router-wizard.js +52 -5
  50. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  51. package/dist/src/react-router/sdk-setup.d.ts +4 -2
  52. package/dist/src/react-router/sdk-setup.js +32 -5
  53. package/dist/src/react-router/sdk-setup.js.map +1 -1
  54. package/dist/src/react-router/templates.d.ts +2 -2
  55. package/dist/src/react-router/templates.js +72 -2
  56. package/dist/src/react-router/templates.js.map +1 -1
  57. package/dist/src/sourcemaps/tools/vite.js +1 -1
  58. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  59. package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
  60. package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
  61. package/dist/src/utils/ast-utils.d.ts +10 -0
  62. package/dist/src/utils/ast-utils.js +19 -1
  63. package/dist/src/utils/ast-utils.js.map +1 -1
  64. package/dist/src/version.d.ts +1 -1
  65. package/dist/src/version.js +1 -1
  66. package/dist/src/version.js.map +1 -1
  67. package/dist/test/apple/code-tools.test.js +78 -0
  68. package/dist/test/apple/code-tools.test.js.map +1 -1
  69. package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
  70. package/dist/test/apple/configure-package-manager.test.js +161 -0
  71. package/dist/test/apple/configure-package-manager.test.js.map +1 -0
  72. package/dist/test/cloudflare/sdk-setup.test.js +20 -2
  73. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
  74. package/dist/test/cloudflare/templates.test.js +54 -0
  75. package/dist/test/cloudflare/templates.test.js.map +1 -1
  76. package/dist/test/cloudflare/wrap-worker.test.js +74 -11
  77. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
  78. package/dist/test/react-native/expo.test.js +140 -0
  79. package/dist/test/react-native/expo.test.js.map +1 -1
  80. package/dist/test/react-native/git.test.d.ts +1 -0
  81. package/dist/test/react-native/git.test.js +160 -0
  82. package/dist/test/react-native/git.test.js.map +1 -0
  83. package/dist/test/react-router/codemods/client-entry.test.js +29 -0
  84. package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
  85. package/dist/test/react-router/codemods/root.test.js +4 -0
  86. package/dist/test/react-router/codemods/root.test.js.map +1 -1
  87. package/dist/test/react-router/codemods/server-entry.test.js +70 -0
  88. package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
  89. package/dist/test/react-router/codemods/vite.test.js +89 -0
  90. package/dist/test/react-router/codemods/vite.test.js.map +1 -1
  91. package/dist/test/react-router/sdk-setup.test.js +62 -6
  92. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  93. package/dist/test/react-router/templates.test.js +50 -0
  94. package/dist/test/react-router/templates.test.js.map +1 -1
  95. package/dist/test/sourcemaps/tools/vite.test.js +12 -8
  96. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  97. package/dist/test/utils/ast-utils.test.js +22 -0
  98. package/dist/test/utils/ast-utils.test.js.map +1 -1
  99. package/package.json +2 -2
@@ -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();\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"]}
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 getReactRouterVersion,\n supportsInstrumentationAPI,\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('getReactRouterVersion', () => {\n it('should coerce range version from package.json', () => {\n expect(\n getReactRouterVersion({\n dependencies: { '@react-router/dev': '^7.8.2' },\n }),\n ).toBe('7.8.2');\n });\n\n it('should return undefined when package is not in package.json', () => {\n expect(\n getReactRouterVersion({ dependencies: { react: '^18.0.0' } }),\n ).toBeUndefined();\n expect(getReactRouterVersion({})).toBeUndefined();\n });\n });\n\n describe('supportsInstrumentationAPI', () => {\n it('should return true for React Router v7.9.5 or higher', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.9.5' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '^7.9.5' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.10.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '8.0.0' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n devDependencies: { '@react-router/dev': '7.9.5' },\n }),\n ).toBe(true);\n });\n\n it('should return false for React Router versions below v7.9.5', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.9.4' },\n }),\n ).toBe(false);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.0.0' },\n }),\n ).toBe(false);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '7.9.0' },\n }),\n ).toBe(false);\n });\n\n it('should return false when @react-router/dev is not installed', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { react: '^18.0.0' },\n }),\n ).toBe(false);\n expect(supportsInstrumentationAPI({})).toBe(false);\n });\n\n it('should handle semver range specifiers correctly', () => {\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '~7.9.5' },\n }),\n ).toBe(true);\n expect(\n supportsInstrumentationAPI({\n dependencies: { '@react-router/dev': '>=7.9.5' },\n }),\n ).toBe(true);\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 // Start script should have NODE_ENV=production before --import\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production 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_ENV=production 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 prepend NODE_ENV\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production 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 // Should prepend NODE_ENV=production to start script\n expect(writtenContent.scripts.start).toBe(\n \"NODE_ENV=production NODE_OPTIONS='--enable-source-maps --import ./instrument.server.mjs' react-router serve\",\n );\n });\n});\n"]}
@@ -101,6 +101,43 @@ const templates_1 = require("../../src/react-router/templates");
101
101
  (0, vitest_1.expect)(result).not.toContain('enableLogs: true');
102
102
  (0, vitest_1.expect)(result).toContain('integrations: [');
103
103
  });
104
+ (0, vitest_1.describe)('Instrumentation API', () => {
105
+ (0, vitest_1.it)('should generate client entry with instrumentation API enabled', () => {
106
+ const dsn = 'https://test.sentry.io/123';
107
+ const enableTracing = true;
108
+ const enableReplay = false;
109
+ const enableLogs = false;
110
+ const useInstrumentationAPI = true;
111
+ const result = (0, templates_1.getManualClientEntryContent)(dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI);
112
+ (0, vitest_1.expect)(result).toContain('const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });');
113
+ (0, vitest_1.expect)(result).toContain('integrations: [');
114
+ (0, vitest_1.expect)(result).toContain('tracing');
115
+ (0, vitest_1.expect)(result).toContain('unstable_instrumentations={[tracing.clientInstrumentation]}');
116
+ });
117
+ (0, vitest_1.it)('should generate client entry with instrumentation API and replay enabled', () => {
118
+ const dsn = 'https://test.sentry.io/123';
119
+ const enableTracing = true;
120
+ const enableReplay = true;
121
+ const enableLogs = false;
122
+ const useInstrumentationAPI = true;
123
+ const result = (0, templates_1.getManualClientEntryContent)(dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI);
124
+ (0, vitest_1.expect)(result).toContain('const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });');
125
+ (0, vitest_1.expect)(result).toContain('tracing');
126
+ (0, vitest_1.expect)(result).toContain('Sentry.replayIntegration()');
127
+ (0, vitest_1.expect)(result).toContain('unstable_instrumentations={[tracing.clientInstrumentation]}');
128
+ });
129
+ (0, vitest_1.it)('should not use instrumentation API when explicitly disabled', () => {
130
+ const dsn = 'https://test.sentry.io/123';
131
+ const enableTracing = true;
132
+ const enableReplay = false;
133
+ const enableLogs = false;
134
+ const useInstrumentationAPI = false;
135
+ const result = (0, templates_1.getManualClientEntryContent)(dsn, enableTracing, enableReplay, enableLogs, useInstrumentationAPI);
136
+ (0, vitest_1.expect)(result).not.toContain('const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });');
137
+ (0, vitest_1.expect)(result).toContain('Sentry.reactRouterTracingIntegration()');
138
+ (0, vitest_1.expect)(result).not.toContain('unstable_instrumentations');
139
+ });
140
+ });
104
141
  });
105
142
  (0, vitest_1.describe)('getManualServerEntryContent', () => {
106
143
  (0, vitest_1.it)('should generate manual server entry content', () => {
@@ -115,6 +152,19 @@ const templates_1 = require("../../src/react-router/templates");
115
152
  (0, vitest_1.expect)(result).toContain('export default handleRequest');
116
153
  (0, vitest_1.expect)(result).toContain('rest of your server entry');
117
154
  });
155
+ (0, vitest_1.describe)('Instrumentation API', () => {
156
+ (0, vitest_1.it)('should generate server entry with unstable_instrumentations when useInstrumentationAPI is true', () => {
157
+ const result = (0, templates_1.getManualServerEntryContent)(true);
158
+ (0, vitest_1.expect)(result).toContain("+ import * as Sentry from '@sentry/react-router'");
159
+ (0, vitest_1.expect)(result).toContain('export const unstable_instrumentations = [Sentry.createSentryServerInstrumentation()];');
160
+ (0, vitest_1.expect)(result).toContain('Enable automatic server-side instrumentation for loaders, actions, middleware');
161
+ });
162
+ (0, vitest_1.it)('should not include unstable_instrumentations when useInstrumentationAPI is false', () => {
163
+ const result = (0, templates_1.getManualServerEntryContent)(false);
164
+ (0, vitest_1.expect)(result).not.toContain('unstable_instrumentations');
165
+ (0, vitest_1.expect)(result).not.toContain('createSentryServerInstrumentation');
166
+ });
167
+ });
118
168
  });
119
169
  (0, vitest_1.describe)('getManualRootContent', () => {
120
170
  (0, vitest_1.it)('should generate manual root content for TypeScript', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/react-router/templates.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\n// Mock makeCodeSnippet utility\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\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 };\n});\n\nimport {\n ERROR_BOUNDARY_TEMPLATE,\n EXAMPLE_PAGE_TEMPLATE_TSX,\n EXAMPLE_PAGE_TEMPLATE_JSX,\n getManualClientEntryContent,\n getManualServerEntryContent,\n getManualRootContent,\n getManualServerInstrumentContent,\n getManualReactRouterConfigContent,\n} from '../../src/react-router/templates';\n\ndescribe('React Router Templates', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('Template Constants', () => {\n it('should have correct ERROR_BOUNDARY_TEMPLATE content', () => {\n expect(ERROR_BOUNDARY_TEMPLATE).toContain(\n 'function ErrorBoundary({ error })',\n );\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('isRouteErrorResponse(error)');\n expect(ERROR_BOUNDARY_TEMPLATE).toContain(\n 'Sentry.captureException(error)',\n );\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('error.status === 404');\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('An unexpected error occurred');\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_TSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_JSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).not.toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n });\n\n describe('getManualClientEntryContent', () => {\n it('should generate manual client entry with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = true;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('sendDefaultPii: true');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('replaysSessionSampleRate: 0.1');\n expect(result).toContain('replaysOnErrorSampleRate: 1.0');\n expect(result).toContain('tracePropagationTargets');\n expect(result).toContain('<HydratedRouter />');\n });\n\n it('should generate manual client entry with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = true;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).not.toContain('tracePropagationTargets');\n });\n\n it('should generate manual client entry with replay disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = false;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).not.toContain('replaysSessionSampleRate');\n expect(result).not.toContain('replaysOnErrorSampleRate');\n });\n\n it('should generate manual client entry with no integrations', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = false;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).toContain('integrations: [');\n });\n });\n\n describe('getManualServerEntryContent', () => {\n it('should generate manual server entry content', () => {\n const result = getManualServerEntryContent();\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('createReadableStreamFromReadable');\n expect(result).toContain('renderToPipeableStream');\n expect(result).toContain('ServerRouter');\n expect(result).toContain(\n '+ const handleRequest = Sentry.createSentryHandleRequest({',\n );\n expect(result).toContain(\n '+ export const handleError = Sentry.createSentryHandleError({',\n );\n expect(result).toContain('logErrors: false');\n expect(result).toContain('export default handleRequest');\n expect(result).toContain('rest of your server entry');\n });\n });\n\n describe('getManualRootContent', () => {\n it('should generate manual root content for TypeScript', () => {\n const isTs = true;\n const result = getManualRootContent(isTs);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n 'export function ErrorBoundary({ error }: Route.ErrorBoundaryProps)',\n );\n expect(result).toContain('let stack: string | undefined');\n expect(result).toContain('isRouteErrorResponse(error)');\n expect(result).toContain('+ Sentry.captureException(error)');\n expect(result).toContain('details = error.message');\n expect(result).toContain('error.status === 404');\n });\n\n it('should generate manual root content for JavaScript', () => {\n const isTs = false;\n const result = getManualRootContent(isTs);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('export function ErrorBoundary({ error })');\n expect(result).not.toContain(': Route.ErrorBoundaryProps');\n expect(result).toContain('let stack');\n expect(result).not.toContain(': string | undefined');\n expect(result).toContain('isRouteErrorResponse(error)');\n expect(result).toContain('+ Sentry.captureException(error)');\n });\n });\n\n describe('getManualServerInstrumentContent', () => {\n it('should generate server instrumentation with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = true;\n const enableLogs = true;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n \"import { nodeProfilingIntegration } from '@sentry/profiling-node'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('sendDefaultPii: true');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('integrations: [nodeProfilingIntegration()]');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('profilesSampleRate: 1.0');\n expect(result).toContain('Capture 100% of the transactions');\n expect(result).toContain('profile every transaction');\n });\n\n it('should generate server instrumentation with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain(\n 'integrations: [nodeProfilingIntegration()]',\n );\n // When logs are not enabled, enableLogs should not appear\n expect(result).not.toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation with profiling disabled but tracing enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain('integrations:');\n });\n\n it('should handle special characters in DSN', () => {\n const dsn = 'https://test@example.com/sentry/123?param=value';\n const enableTracing = true;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n });\n });\n\n describe('getManualReactRouterConfigContent', () => {\n it('should generate TypeScript config snippet with type imports and satisfies', () => {\n const result = getManualReactRouterConfigContent(true);\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n });\n\n it('should generate JavaScript config snippet without TS-only syntax', () => {\n const result = getManualReactRouterConfigContent(false);\n\n // JS version should NOT have TypeScript-only syntax\n expect(result).not.toContain('import type');\n expect(result).not.toContain('satisfies Config');\n\n // JS version should have the standard import and export\n expect(result).toContain('import { sentryOnBuildEnd }');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n expect(result).toContain('export default {');\n });\n\n it('should default to TypeScript when no parameter is passed', () => {\n const result = getManualReactRouterConfigContent();\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n });\n });\n});\n"]}
1
+ {"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/react-router/templates.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi, beforeEach } from 'vitest';\n\n// Mock makeCodeSnippet utility\nvi.mock('../../src/utils/clack', () => {\n return {\n __esModule: true,\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 };\n});\n\nimport {\n ERROR_BOUNDARY_TEMPLATE,\n EXAMPLE_PAGE_TEMPLATE_TSX,\n EXAMPLE_PAGE_TEMPLATE_JSX,\n getManualClientEntryContent,\n getManualServerEntryContent,\n getManualRootContent,\n getManualServerInstrumentContent,\n getManualReactRouterConfigContent,\n} from '../../src/react-router/templates';\n\ndescribe('React Router Templates', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('Template Constants', () => {\n it('should have correct ERROR_BOUNDARY_TEMPLATE content', () => {\n expect(ERROR_BOUNDARY_TEMPLATE).toContain(\n 'function ErrorBoundary({ error })',\n );\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('isRouteErrorResponse(error)');\n expect(ERROR_BOUNDARY_TEMPLATE).toContain(\n 'Sentry.captureException(error)',\n );\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('error.status === 404');\n expect(ERROR_BOUNDARY_TEMPLATE).toContain('An unexpected error occurred');\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_TSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_TSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n\n it('should have correct EXAMPLE_PAGE_TEMPLATE_JSX content', () => {\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).not.toContain('import type { Route }');\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export async function loader()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'throw new Error(\"some error thrown in a loader\")',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'export default function SentryExamplePage()',\n );\n expect(EXAMPLE_PAGE_TEMPLATE_JSX).toContain(\n 'Loading this page will throw an error',\n );\n });\n });\n\n describe('getManualClientEntryContent', () => {\n it('should generate manual client entry with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = true;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('sendDefaultPii: true');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('replaysSessionSampleRate: 0.1');\n expect(result).toContain('replaysOnErrorSampleRate: 1.0');\n expect(result).toContain('tracePropagationTargets');\n expect(result).toContain('<HydratedRouter />');\n });\n\n it('should generate manual client entry with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = true;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).not.toContain('tracePropagationTargets');\n });\n\n it('should generate manual client entry with replay disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = false;\n const enableLogs = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).toContain('enableLogs: true');\n expect(result).not.toContain('replaysSessionSampleRate');\n expect(result).not.toContain('replaysOnErrorSampleRate');\n });\n\n it('should generate manual client entry with no integrations', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableReplay = false;\n const enableLogs = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('Sentry.replayIntegration()');\n expect(result).not.toContain('enableLogs: true');\n expect(result).toContain('integrations: [');\n });\n\n describe('Instrumentation API', () => {\n it('should generate client entry with instrumentation API enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = false;\n const enableLogs = false;\n const useInstrumentationAPI = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n useInstrumentationAPI,\n );\n\n expect(result).toContain(\n 'const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });',\n );\n expect(result).toContain('integrations: [');\n expect(result).toContain('tracing');\n expect(result).toContain(\n 'unstable_instrumentations={[tracing.clientInstrumentation]}',\n );\n });\n\n it('should generate client entry with instrumentation API and replay enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = true;\n const enableLogs = false;\n const useInstrumentationAPI = true;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n useInstrumentationAPI,\n );\n\n expect(result).toContain(\n 'const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });',\n );\n expect(result).toContain('tracing');\n expect(result).toContain('Sentry.replayIntegration()');\n expect(result).toContain(\n 'unstable_instrumentations={[tracing.clientInstrumentation]}',\n );\n });\n\n it('should not use instrumentation API when explicitly disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableReplay = false;\n const enableLogs = false;\n const useInstrumentationAPI = false;\n\n const result = getManualClientEntryContent(\n dsn,\n enableTracing,\n enableReplay,\n enableLogs,\n useInstrumentationAPI,\n );\n\n expect(result).not.toContain(\n 'const tracing = Sentry.reactRouterTracingIntegration({ useInstrumentationAPI: true });',\n );\n expect(result).toContain('Sentry.reactRouterTracingIntegration()');\n expect(result).not.toContain('unstable_instrumentations');\n });\n });\n });\n\n describe('getManualServerEntryContent', () => {\n it('should generate manual server entry content', () => {\n const result = getManualServerEntryContent();\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('createReadableStreamFromReadable');\n expect(result).toContain('renderToPipeableStream');\n expect(result).toContain('ServerRouter');\n expect(result).toContain(\n '+ const handleRequest = Sentry.createSentryHandleRequest({',\n );\n expect(result).toContain(\n '+ export const handleError = Sentry.createSentryHandleError({',\n );\n expect(result).toContain('logErrors: false');\n expect(result).toContain('export default handleRequest');\n expect(result).toContain('rest of your server entry');\n });\n\n describe('Instrumentation API', () => {\n it('should generate server entry with unstable_instrumentations when useInstrumentationAPI is true', () => {\n const result = getManualServerEntryContent(true);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n 'export const unstable_instrumentations = [Sentry.createSentryServerInstrumentation()];',\n );\n expect(result).toContain(\n 'Enable automatic server-side instrumentation for loaders, actions, middleware',\n );\n });\n\n it('should not include unstable_instrumentations when useInstrumentationAPI is false', () => {\n const result = getManualServerEntryContent(false);\n\n expect(result).not.toContain('unstable_instrumentations');\n expect(result).not.toContain('createSentryServerInstrumentation');\n });\n });\n });\n\n describe('getManualRootContent', () => {\n it('should generate manual root content for TypeScript', () => {\n const isTs = true;\n const result = getManualRootContent(isTs);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n 'export function ErrorBoundary({ error }: Route.ErrorBoundaryProps)',\n );\n expect(result).toContain('let stack: string | undefined');\n expect(result).toContain('isRouteErrorResponse(error)');\n expect(result).toContain('+ Sentry.captureException(error)');\n expect(result).toContain('details = error.message');\n expect(result).toContain('error.status === 404');\n });\n\n it('should generate manual root content for JavaScript', () => {\n const isTs = false;\n const result = getManualRootContent(isTs);\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain('export function ErrorBoundary({ error })');\n expect(result).not.toContain(': Route.ErrorBoundaryProps');\n expect(result).toContain('let stack');\n expect(result).not.toContain(': string | undefined');\n expect(result).toContain('isRouteErrorResponse(error)');\n expect(result).toContain('+ Sentry.captureException(error)');\n });\n });\n\n describe('getManualServerInstrumentContent', () => {\n it('should generate server instrumentation with all features enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = true;\n const enableLogs = true;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(\n \"+ import * as Sentry from '@sentry/react-router'\",\n );\n expect(result).toContain(\n \"import { nodeProfilingIntegration } from '@sentry/profiling-node'\",\n );\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('sendDefaultPii: true');\n expect(result).toContain('enableLogs: true');\n expect(result).toContain('integrations: [nodeProfilingIntegration()]');\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).toContain('profilesSampleRate: 1.0');\n expect(result).toContain('Capture 100% of the transactions');\n expect(result).toContain('profile every transaction');\n });\n\n it('should generate server instrumentation with tracing disabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = false;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain(\n 'integrations: [nodeProfilingIntegration()]',\n );\n // When logs are not enabled, enableLogs should not appear\n expect(result).not.toContain('enableLogs: true');\n });\n\n it('should generate server instrumentation with profiling disabled but tracing enabled', () => {\n const dsn = 'https://test.sentry.io/123';\n const enableTracing = true;\n const enableProfiling = false;\n const enableLogs = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n enableLogs,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n expect(result).toContain('tracesSampleRate: 1.0');\n expect(result).not.toContain('nodeProfilingIntegration');\n expect(result).not.toContain('profilesSampleRate');\n expect(result).not.toContain('integrations:');\n });\n\n it('should handle special characters in DSN', () => {\n const dsn = 'https://test@example.com/sentry/123?param=value';\n const enableTracing = true;\n const enableProfiling = false;\n\n const result = getManualServerInstrumentContent(\n dsn,\n enableTracing,\n enableProfiling,\n );\n\n expect(result).toContain(`dsn: \"${dsn}\"`);\n });\n });\n\n describe('getManualReactRouterConfigContent', () => {\n it('should generate TypeScript config snippet with type imports and satisfies', () => {\n const result = getManualReactRouterConfigContent(true);\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n });\n\n it('should generate JavaScript config snippet without TS-only syntax', () => {\n const result = getManualReactRouterConfigContent(false);\n\n // JS version should NOT have TypeScript-only syntax\n expect(result).not.toContain('import type');\n expect(result).not.toContain('satisfies Config');\n\n // JS version should have the standard import and export\n expect(result).toContain('import { sentryOnBuildEnd }');\n expect(result).toContain('sentryOnBuildEnd');\n expect(result).toContain('ssr: true');\n expect(result).toContain('export default {');\n });\n\n it('should default to TypeScript when no parameter is passed', () => {\n const result = getManualReactRouterConfigContent();\n\n expect(result).toContain('import type { Config }');\n expect(result).toContain('} satisfies Config;');\n });\n });\n});\n"]}
@@ -67,7 +67,8 @@ export default defineConfig({
67
67
  build: {
68
68
  sourcemap: true
69
69
  }
70
- })`,
70
+ })
71
+ `,
71
72
  ],
72
73
  [
73
74
  'no build.sourcemap options',
@@ -77,10 +78,10 @@ export default defineConfig({
77
78
  vue(),
78
79
  ],
79
80
  build: {
80
- test: 1,
81
+ test: 1,
81
82
  }
82
83
  })
83
- `,
84
+ `,
84
85
  `import { sentryVitePlugin } from "@sentry/vite-plugin";
85
86
  export default defineConfig({
86
87
  plugins: [vue(), sentryVitePlugin({
@@ -91,7 +92,8 @@ export default defineConfig({
91
92
  test: 1,
92
93
  sourcemap: true
93
94
  }
94
- })`,
95
+ })
96
+ `,
95
97
  ],
96
98
  [
97
99
  'keep sourcemap: "hidden"',
@@ -104,7 +106,7 @@ export default {
104
106
  sourcemap: "hidden",
105
107
  }
106
108
  }
107
- `,
109
+ `,
108
110
  `import { sentryVitePlugin } from "@sentry/vite-plugin";
109
111
  export default {
110
112
  plugins: [vue(), sentryVitePlugin({
@@ -114,7 +116,8 @@ export default {
114
116
  build: {
115
117
  sourcemap: "hidden",
116
118
  }
117
- }`,
119
+ }
120
+ `,
118
121
  ],
119
122
  [
120
123
  'rewrite sourcemap: false to true',
@@ -129,7 +132,7 @@ const cfg = {
129
132
  }
130
133
 
131
134
  export default cfg;
132
- `,
135
+ `,
133
136
  `import { sentryVitePlugin } from "@sentry/vite-plugin";
134
137
  const cfg = {
135
138
  plugins: [vue(), sentryVitePlugin({
@@ -142,7 +145,8 @@ const cfg = {
142
145
  }
143
146
  }
144
147
 
145
- export default cfg;`,
148
+ export default cfg;
149
+ `,
146
150
  ],
147
151
  ])('adds the plugin and enables source maps generation (%s)', async (_, originalCode, expectedCode) => {
148
152
  updateFileContent(originalCode);
@@ -1 +1 @@
1
- {"version":3,"file":"vite.test.js","sourceRoot":"","sources":["../../../../test/sourcemaps/tools/vite.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,6DAA2E;AAE3E,mCAA6D;AAE7D,SAAS,iBAAiB,CAAC,OAAe;IACxC,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,IAAI,WAAW,GAAG,EAAE,CAAC;AAErB,WAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC7B,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;YACb,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE;SACjB;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,WAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CACxD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAC7B,CAAC;AAEF,MAAM,YAAY,GAAG,WAAE;KACpB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC/B,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAErD,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAW,GAAG,EAAE,CAAC;QACjB,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,WAAE,CAAC,IAAI,CAAC;QACN;YACE,kBAAkB;YAClB;;;;;;CAML;YACK;;;;;;;;;;GAUH;SACE;QACD;YACE,4BAA4B;YAC5B;;;;;;;;;GASH;YACG;;;;;;;;;;GAUH;SACE;QACD;YACE,0BAA0B;YAC1B;;;;;;;;;KASD;YACC;;;;;;;;;EASJ;SACG;QACD;YACE,kCAAkC;YAClC;;;;;;;;;;;OAWC;YACD;;;;;;;;;;;;oBAYc;SACf;KACF,CAAC,CACA,yDAAyD,EACzD,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE;QACtC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEhC,MAAM,SAAS,GAAG,MAAM,IAAA,4BAAqB,EAAC,EAAE,EAAE;YAChD,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,YAAY;YACzB,UAAU,EAAE,KAAK;YACjB,GAAG,EAAE,oBAAoB;SAC1B,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAClD,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import * as fs from 'fs';\nimport { addVitePluginToConfig } from '../../../src/sourcemaps/tools/vite';\n\nimport { vi, it, describe, expect, afterEach } from 'vitest';\n\nfunction updateFileContent(content: string): void {\n fileContent = content;\n}\n\nlet fileContent = '';\n\nvi.mock('@clack/prompts', () => {\n return {\n log: {\n info: vi.fn(),\n success: vi.fn(),\n },\n };\n});\n\nvi.spyOn(fs.promises, 'readFile').mockImplementation(() =>\n Promise.resolve(fileContent),\n);\n\nconst writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.resolve(void 0));\n\ndescribe('addVitePluginToConfig', () => {\n afterEach(() => {\n fileContent = '';\n vi.clearAllMocks();\n });\n\n it.each([\n [\n 'no build options',\n `\nexport default defineConfig({\n plugins: [\n vue(),\n ],\n})\n`,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nexport default defineConfig({\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n\n build: {\n sourcemap: true\n }\n})`,\n ],\n [\n 'no build.sourcemap options',\n `\nexport default defineConfig({\n plugins: [\n vue(),\n ],\n build: {\n test: 1, \n }\n})\n `,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nexport default defineConfig({\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n build: {\n test: 1,\n sourcemap: true\n }\n})`,\n ],\n [\n 'keep sourcemap: \"hidden\"',\n `\nexport default {\n plugins: [\n vue(),\n ],\n build: {\n sourcemap: \"hidden\",\n }\n}\n `,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nexport default {\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n build: {\n sourcemap: \"hidden\",\n }\n}`,\n ],\n [\n 'rewrite sourcemap: false to true',\n `\nconst cfg = {\n plugins: [\n vue(),\n ],\n build: {\n sourcemap: false,\n }\n}\n\nexport default cfg;\n `,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nconst cfg = {\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n\n build: {\n sourcemap: true,\n }\n}\n\nexport default cfg;`,\n ],\n ])(\n 'adds the plugin and enables source maps generation (%s)',\n async (_, originalCode, expectedCode) => {\n updateFileContent(originalCode);\n\n const addedCode = await addVitePluginToConfig('', {\n authToken: '',\n orgSlug: 'my-org',\n projectSlug: 'my-project',\n selfHosted: false,\n url: 'https://sentry.io/',\n });\n\n expect(writeFileSpy).toHaveBeenCalledTimes(1);\n const [[, fileContent]] = writeFileSpy.mock.calls;\n expect(fileContent).toBe(expectedCode);\n expect(addedCode).toBe(true);\n },\n );\n});\n"]}
1
+ {"version":3,"file":"vite.test.js","sourceRoot":"","sources":["../../../../test/sourcemaps/tools/vite.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,6DAA2E;AAE3E,mCAA6D;AAE7D,SAAS,iBAAiB,CAAC,OAAe;IACxC,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,IAAI,WAAW,GAAG,EAAE,CAAC;AAErB,WAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC7B,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;YACb,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE;SACjB;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,WAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CACxD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAC7B,CAAC;AAEF,MAAM,YAAY,GAAG,WAAE;KACpB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC/B,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAErD,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,WAAW,GAAG,EAAE,CAAC;QACjB,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,WAAE,CAAC,IAAI,CAAC;QACN;YACE,kBAAkB;YAClB;;;;;;CAML;YACK;;;;;;;;;;;CAWL;SACI;QACD;YACE,4BAA4B;YAC5B;;;;;;;;;CASL;YACK;;;;;;;;;;;CAWL;SACI;QACD;YACE,0BAA0B;YAC1B;;;;;;;;;CASL;YACK;;;;;;;;;;CAUL;SACI;QACD;YACE,kCAAkC;YAClC;;;;;;;;;;;CAWL;YACK;;;;;;;;;;;;;CAaL;SACI;KACF,CAAC,CACA,yDAAyD,EACzD,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE;QACtC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEhC,MAAM,SAAS,GAAG,MAAM,IAAA,4BAAqB,EAAC,EAAE,EAAE;YAChD,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,YAAY;YACzB,UAAU,EAAE,KAAK;YACjB,GAAG,EAAE,oBAAoB;SAC1B,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAClD,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import * as fs from 'fs';\nimport { addVitePluginToConfig } from '../../../src/sourcemaps/tools/vite';\n\nimport { vi, it, describe, expect, afterEach } from 'vitest';\n\nfunction updateFileContent(content: string): void {\n fileContent = content;\n}\n\nlet fileContent = '';\n\nvi.mock('@clack/prompts', () => {\n return {\n log: {\n info: vi.fn(),\n success: vi.fn(),\n },\n };\n});\n\nvi.spyOn(fs.promises, 'readFile').mockImplementation(() =>\n Promise.resolve(fileContent),\n);\n\nconst writeFileSpy = vi\n .spyOn(fs.promises, 'writeFile')\n .mockImplementation(() => Promise.resolve(void 0));\n\ndescribe('addVitePluginToConfig', () => {\n afterEach(() => {\n fileContent = '';\n vi.clearAllMocks();\n });\n\n it.each([\n [\n 'no build options',\n `\nexport default defineConfig({\n plugins: [\n vue(),\n ],\n})\n`,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nexport default defineConfig({\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n\n build: {\n sourcemap: true\n }\n})\n`,\n ],\n [\n 'no build.sourcemap options',\n `\nexport default defineConfig({\n plugins: [\n vue(),\n ],\n build: {\n test: 1,\n }\n})\n`,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nexport default defineConfig({\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n build: {\n test: 1,\n sourcemap: true\n }\n})\n`,\n ],\n [\n 'keep sourcemap: \"hidden\"',\n `\nexport default {\n plugins: [\n vue(),\n ],\n build: {\n sourcemap: \"hidden\",\n }\n}\n`,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nexport default {\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n build: {\n sourcemap: \"hidden\",\n }\n}\n`,\n ],\n [\n 'rewrite sourcemap: false to true',\n `\nconst cfg = {\n plugins: [\n vue(),\n ],\n build: {\n sourcemap: false,\n }\n}\n\nexport default cfg;\n`,\n `import { sentryVitePlugin } from \"@sentry/vite-plugin\";\nconst cfg = {\n plugins: [vue(), sentryVitePlugin({\n org: \"my-org\",\n project: \"my-project\"\n })],\n\n build: {\n sourcemap: true,\n }\n}\n\nexport default cfg;\n`,\n ],\n ])(\n 'adds the plugin and enables source maps generation (%s)',\n async (_, originalCode, expectedCode) => {\n updateFileContent(originalCode);\n\n const addedCode = await addVitePluginToConfig('', {\n authToken: '',\n orgSlug: 'my-org',\n projectSlug: 'my-project',\n selfHosted: false,\n url: 'https://sentry.io/',\n });\n\n expect(writeFileSpy).toHaveBeenCalledTimes(1);\n const [[, fileContent]] = writeFileSpy.mock.calls;\n expect(fileContent).toBe(expectedCode);\n expect(addedCode).toBe(true);\n },\n );\n});\n"]}
@@ -184,6 +184,28 @@ const vitest_1 = require("vitest");
184
184
  (0, vitest_1.expect)(property?.comments[0].value).toBe(' This is a comment');
185
185
  });
186
186
  });
187
+ (0, vitest_1.describe)('preserveTrailingNewline', () => {
188
+ (0, vitest_1.it)('adds trailing newline if original had one but generated does not', () => {
189
+ const original = 'const foo = 1;\n';
190
+ const generated = 'const foo = 1;';
191
+ (0, vitest_1.expect)((0, ast_utils_1.preserveTrailingNewline)(original, generated)).toBe('const foo = 1;\n');
192
+ });
193
+ (0, vitest_1.it)('does not add trailing newline if original did not have one', () => {
194
+ const original = 'const foo = 1;';
195
+ const generated = 'const foo = 1;';
196
+ (0, vitest_1.expect)((0, ast_utils_1.preserveTrailingNewline)(original, generated)).toBe('const foo = 1;');
197
+ });
198
+ (0, vitest_1.it)('does not double trailing newline if both already have one', () => {
199
+ const original = 'const foo = 1;\n';
200
+ const generated = 'const foo = 1;\n';
201
+ (0, vitest_1.expect)((0, ast_utils_1.preserveTrailingNewline)(original, generated)).toBe('const foo = 1;\n');
202
+ });
203
+ (0, vitest_1.it)('does not remove trailing newline if original did not have one but generated does', () => {
204
+ const original = 'const foo = 1;';
205
+ const generated = 'const foo = 1;\n';
206
+ (0, vitest_1.expect)((0, ast_utils_1.preserveTrailingNewline)(original, generated)).toBe('const foo = 1;\n');
207
+ });
208
+ });
187
209
  (0, vitest_1.describe)('parse and print JSON-C', () => {
188
210
  vitest_1.it.each([
189
211
  ['simple JSON', "{'foo': 'bar'}"],
@@ -1 +1 @@
1
- {"version":3,"file":"ast-utils.test.js","sourceRoot":"","sources":["../../../test/utils/ast-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getObjectProperty,\n getOrSetObjectProperty,\n hasSentryContent,\n parseJsonC,\n printJsonC,\n setOrUpdateObjectProperty,\n} from '../../src/utils/ast-utils';\n\nimport * as recast from 'recast';\nconst b = recast.types.builders;\n\nimport { describe, it, expect } from 'vitest';\n\ndescribe('hasSentryContent', () => {\n it.each([\n `\n const { sentryVitePlugin } = require(\"@sentry/vite-plugin\");\n const somethingelse = require('gs');\n `,\n `\n import { sentryVitePlugin } from \"@sentry/vite-plugin\";\n import * as somethingelse from 'gs';\n\n export default {\n plugins: [sentryVitePlugin()]\n }\n `,\n ])(\n \"returns true if a require('@sentry/') call was found in the parsed module\",\n (code) => {\n // recast.parse returns a Program node (or fails) but it's badly typed as any\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const program = recast.parse(code)\n .program as recast.types.namedTypes.Program;\n expect(hasSentryContent(program)).toBe(true);\n },\n );\n\n it.each([\n `const whatever = require('something')`,\n `// const {sentryWebpackPlugin} = require('@sentry/webpack-plugin')`,\n `const {sAntryWebpackPlugin} = require('webpack-plugin-@sentry')`,\n `\n import * as somethingelse from 'gs';\n export default {\n plugins: []\n }\n `,\n `import * as somethingelse from 'gs';\n // import { sentryVitePlugin } from \"@sentry/vite-plugin\"\n export default {\n plugins: []\n }\n `,\n `import * as thirdPartyVitePlugin from \"vite-plugin-@sentry\"\n export default {\n plugins: [thirdPartyVitePlugin()]\n }\n `,\n ])(\n \"returns false if the file doesn't contain any require('@sentry/') calls\",\n (code) => {\n // recast.parse returns a Program node (or fails) but it's badly typed as any\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const program = recast.parse(code)\n .program as recast.types.namedTypes.Program;\n expect(hasSentryContent(program)).toBe(false);\n },\n );\n});\n\ndescribe('getObjectProperty', () => {\n it.each([\n [\n 'literal',\n b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(\n b.stringLiteral('needle'),\n b.stringLiteral('haystack'),\n ),\n ]),\n ],\n [\n 'stringLiteral',\n b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(b.literal('needle'), b.stringLiteral('haystack')),\n ]),\n ],\n [\n 'identifier',\n b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(b.identifier('needle'), b.stringLiteral('haystack')),\n ]),\n ],\n ])('returns the poperty (%s) if it exists', (_, object) => {\n const property = getObjectProperty(object, 'needle');\n expect(property).toBeDefined();\n // @ts-expect-error we know it's defined due to the expect above\n expect(recast.print(property).code).toEqual(\n expect.stringContaining('needle'),\n );\n });\n\n it('returns undefined if the property does not exist', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n const property = getObjectProperty(object, 'needle');\n expect(property).toBeUndefined();\n });\n\n it('handles objects without simple properties', () => {\n const object = b.objectExpression([b.spreadElement(b.identifier('foo'))]);\n const property = getObjectProperty(object, 'needle');\n expect(property).toBeUndefined();\n });\n});\n\ndescribe('getOrSetObjectProperty', () => {\n it('returns the property if it exists', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('needle'), b.stringLiteral('haystack')),\n ]);\n\n const property = getOrSetObjectProperty(\n object,\n 'needle',\n b.stringLiteral('nope'),\n );\n\n expect(property).toBeDefined();\n expect(property.type).toBe('ObjectProperty');\n // @ts-expect-error we know its type\n expect(property.key.name).toBe('needle');\n // @ts-expect-error we know its type\n expect(property.value.value).toBe('haystack');\n });\n\n it('adds the property if it does not exist', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n const property = getOrSetObjectProperty(\n object,\n 'needle',\n b.stringLiteral('haystack'),\n );\n\n expect(property).toBeDefined();\n expect(property.type).toBe('Property');\n // @ts-expect-error we know its type\n expect(property.key.value).toBe('needle');\n // @ts-expect-error we know its type\n expect(property.value.value).toBe('haystack');\n });\n});\n\ndescribe('setOrUpdateObjectProperty', () => {\n it('sets a new property if it does not exist yet', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n setOrUpdateObjectProperty(object, 'needle', b.stringLiteral('haystack'));\n\n expect(getObjectProperty(object, 'needle')).toBeDefined();\n });\n\n it('updates an existing property if it exists', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(b.identifier('needle'), b.stringLiteral('haystack')),\n ]);\n\n setOrUpdateObjectProperty(object, 'needle', b.stringLiteral('haystack2'));\n\n const property = getObjectProperty(object, 'needle');\n // @ts-expect-error it must be defiend, otherwise we fail anyway\n expect(property?.value.value).toBe('haystack2');\n });\n\n it('adds a comment to the existing property if provided', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n setOrUpdateObjectProperty(\n object,\n 'needle',\n b.stringLiteral('haystack'),\n 'This is a comment',\n );\n\n const property = getObjectProperty(object, 'needle');\n expect(property?.comments).toHaveLength(1);\n // @ts-expect-error it must be defiend, otherwise we fail anyway\n expect(property?.comments[0].value).toBe(' This is a comment');\n });\n\n it('adds a comment to the new property if provided', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n setOrUpdateObjectProperty(\n object,\n 'needle',\n b.stringLiteral('haystack'),\n 'This is a comment',\n );\n\n const property = getObjectProperty(object, 'needle');\n expect(property?.comments).toHaveLength(1);\n // @ts-expect-error it must be defiend, otherwise we fail anyway\n expect(property?.comments[0].value).toBe(' This is a comment');\n });\n});\n\ndescribe('parse and print JSON-C', () => {\n it.each([\n ['simple JSON', \"{'foo': 'bar'}\"],\n [\n 'JSON-C with inline comment',\n `\n {\n \"foo\": \"bar\" // with an inline comment\n }\n `,\n ],\n [\n 'JSON-C with multiple comments',\n `\n /*\n * let's throw in a block comment for good measure\n */ \n {\n // one line comment\n \"foo\": \"bar\", // another inline comment\n /* one more here */\n \"dogs\": /* and here */ \"awesome\",\n }\n /* and here */\n `,\n ],\n ])(`parses and prints JSON-C (%s)`, (_, json) => {\n const { ast, jsonObject } = parseJsonC(json);\n expect(ast?.type).toBe('Program');\n expect(jsonObject).toBeDefined();\n expect(jsonObject?.type).toBe('ObjectExpression');\n // @ts-expect-error we know it's defined due to the expect above\n expect(printJsonC(ast)).toEqual(json);\n });\n\n it('returns undefined if the input is not valid JSON-C', () => {\n const { ast, jsonObject } = parseJsonC(`{\n \"invalid\": // \"json\"\n }`);\n expect(ast).toBeUndefined();\n expect(jsonObject).toBeUndefined();\n });\n});\n"]}
1
+ {"version":3,"file":"ast-utils.test.js","sourceRoot":"","sources":["../../../test/utils/ast-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getObjectProperty,\n getOrSetObjectProperty,\n hasSentryContent,\n parseJsonC,\n preserveTrailingNewline,\n printJsonC,\n setOrUpdateObjectProperty,\n} from '../../src/utils/ast-utils';\n\nimport * as recast from 'recast';\nconst b = recast.types.builders;\n\nimport { describe, it, expect } from 'vitest';\n\ndescribe('hasSentryContent', () => {\n it.each([\n `\n const { sentryVitePlugin } = require(\"@sentry/vite-plugin\");\n const somethingelse = require('gs');\n `,\n `\n import { sentryVitePlugin } from \"@sentry/vite-plugin\";\n import * as somethingelse from 'gs';\n\n export default {\n plugins: [sentryVitePlugin()]\n }\n `,\n ])(\n \"returns true if a require('@sentry/') call was found in the parsed module\",\n (code) => {\n // recast.parse returns a Program node (or fails) but it's badly typed as any\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const program = recast.parse(code)\n .program as recast.types.namedTypes.Program;\n expect(hasSentryContent(program)).toBe(true);\n },\n );\n\n it.each([\n `const whatever = require('something')`,\n `// const {sentryWebpackPlugin} = require('@sentry/webpack-plugin')`,\n `const {sAntryWebpackPlugin} = require('webpack-plugin-@sentry')`,\n `\n import * as somethingelse from 'gs';\n export default {\n plugins: []\n }\n `,\n `import * as somethingelse from 'gs';\n // import { sentryVitePlugin } from \"@sentry/vite-plugin\"\n export default {\n plugins: []\n }\n `,\n `import * as thirdPartyVitePlugin from \"vite-plugin-@sentry\"\n export default {\n plugins: [thirdPartyVitePlugin()]\n }\n `,\n ])(\n \"returns false if the file doesn't contain any require('@sentry/') calls\",\n (code) => {\n // recast.parse returns a Program node (or fails) but it's badly typed as any\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const program = recast.parse(code)\n .program as recast.types.namedTypes.Program;\n expect(hasSentryContent(program)).toBe(false);\n },\n );\n});\n\ndescribe('getObjectProperty', () => {\n it.each([\n [\n 'literal',\n b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(\n b.stringLiteral('needle'),\n b.stringLiteral('haystack'),\n ),\n ]),\n ],\n [\n 'stringLiteral',\n b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(b.literal('needle'), b.stringLiteral('haystack')),\n ]),\n ],\n [\n 'identifier',\n b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(b.identifier('needle'), b.stringLiteral('haystack')),\n ]),\n ],\n ])('returns the poperty (%s) if it exists', (_, object) => {\n const property = getObjectProperty(object, 'needle');\n expect(property).toBeDefined();\n // @ts-expect-error we know it's defined due to the expect above\n expect(recast.print(property).code).toEqual(\n expect.stringContaining('needle'),\n );\n });\n\n it('returns undefined if the property does not exist', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n const property = getObjectProperty(object, 'needle');\n expect(property).toBeUndefined();\n });\n\n it('handles objects without simple properties', () => {\n const object = b.objectExpression([b.spreadElement(b.identifier('foo'))]);\n const property = getObjectProperty(object, 'needle');\n expect(property).toBeUndefined();\n });\n});\n\ndescribe('getOrSetObjectProperty', () => {\n it('returns the property if it exists', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('needle'), b.stringLiteral('haystack')),\n ]);\n\n const property = getOrSetObjectProperty(\n object,\n 'needle',\n b.stringLiteral('nope'),\n );\n\n expect(property).toBeDefined();\n expect(property.type).toBe('ObjectProperty');\n // @ts-expect-error we know its type\n expect(property.key.name).toBe('needle');\n // @ts-expect-error we know its type\n expect(property.value.value).toBe('haystack');\n });\n\n it('adds the property if it does not exist', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n const property = getOrSetObjectProperty(\n object,\n 'needle',\n b.stringLiteral('haystack'),\n );\n\n expect(property).toBeDefined();\n expect(property.type).toBe('Property');\n // @ts-expect-error we know its type\n expect(property.key.value).toBe('needle');\n // @ts-expect-error we know its type\n expect(property.value.value).toBe('haystack');\n });\n});\n\ndescribe('setOrUpdateObjectProperty', () => {\n it('sets a new property if it does not exist yet', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n setOrUpdateObjectProperty(object, 'needle', b.stringLiteral('haystack'));\n\n expect(getObjectProperty(object, 'needle')).toBeDefined();\n });\n\n it('updates an existing property if it exists', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n b.objectProperty(b.identifier('needle'), b.stringLiteral('haystack')),\n ]);\n\n setOrUpdateObjectProperty(object, 'needle', b.stringLiteral('haystack2'));\n\n const property = getObjectProperty(object, 'needle');\n // @ts-expect-error it must be defiend, otherwise we fail anyway\n expect(property?.value.value).toBe('haystack2');\n });\n\n it('adds a comment to the existing property if provided', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n setOrUpdateObjectProperty(\n object,\n 'needle',\n b.stringLiteral('haystack'),\n 'This is a comment',\n );\n\n const property = getObjectProperty(object, 'needle');\n expect(property?.comments).toHaveLength(1);\n // @ts-expect-error it must be defiend, otherwise we fail anyway\n expect(property?.comments[0].value).toBe(' This is a comment');\n });\n\n it('adds a comment to the new property if provided', () => {\n const object = b.objectExpression([\n b.objectProperty(b.identifier('foo'), b.stringLiteral('bar')),\n ]);\n\n setOrUpdateObjectProperty(\n object,\n 'needle',\n b.stringLiteral('haystack'),\n 'This is a comment',\n );\n\n const property = getObjectProperty(object, 'needle');\n expect(property?.comments).toHaveLength(1);\n // @ts-expect-error it must be defiend, otherwise we fail anyway\n expect(property?.comments[0].value).toBe(' This is a comment');\n });\n});\n\ndescribe('preserveTrailingNewline', () => {\n it('adds trailing newline if original had one but generated does not', () => {\n const original = 'const foo = 1;\\n';\n const generated = 'const foo = 1;';\n expect(preserveTrailingNewline(original, generated)).toBe(\n 'const foo = 1;\\n',\n );\n });\n\n it('does not add trailing newline if original did not have one', () => {\n const original = 'const foo = 1;';\n const generated = 'const foo = 1;';\n expect(preserveTrailingNewline(original, generated)).toBe('const foo = 1;');\n });\n\n it('does not double trailing newline if both already have one', () => {\n const original = 'const foo = 1;\\n';\n const generated = 'const foo = 1;\\n';\n expect(preserveTrailingNewline(original, generated)).toBe(\n 'const foo = 1;\\n',\n );\n });\n\n it('does not remove trailing newline if original did not have one but generated does', () => {\n const original = 'const foo = 1;';\n const generated = 'const foo = 1;\\n';\n expect(preserveTrailingNewline(original, generated)).toBe(\n 'const foo = 1;\\n',\n );\n });\n});\n\ndescribe('parse and print JSON-C', () => {\n it.each([\n ['simple JSON', \"{'foo': 'bar'}\"],\n [\n 'JSON-C with inline comment',\n `\n {\n \"foo\": \"bar\" // with an inline comment\n }\n `,\n ],\n [\n 'JSON-C with multiple comments',\n `\n /*\n * let's throw in a block comment for good measure\n */ \n {\n // one line comment\n \"foo\": \"bar\", // another inline comment\n /* one more here */\n \"dogs\": /* and here */ \"awesome\",\n }\n /* and here */\n `,\n ],\n ])(`parses and prints JSON-C (%s)`, (_, json) => {\n const { ast, jsonObject } = parseJsonC(json);\n expect(ast?.type).toBe('Program');\n expect(jsonObject).toBeDefined();\n expect(jsonObject?.type).toBe('ObjectExpression');\n // @ts-expect-error we know it's defined due to the expect above\n expect(printJsonC(ast)).toEqual(json);\n });\n\n it('returns undefined if the input is not valid JSON-C', () => {\n const { ast, jsonObject } = parseJsonC(`{\n \"invalid\": // \"json\"\n }`);\n expect(ast).toBeUndefined();\n expect(jsonObject).toBeUndefined();\n });\n});\n"]}