@sentry/wizard 6.10.0 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/ci-ensure-runtime-loaded.sh +82 -0
  3. package/dist/e2e-tests/tests/angular-17.test.js +72 -82
  4. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -1
  5. package/dist/e2e-tests/tests/angular-19.test.js +71 -80
  6. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -1
  7. package/dist/e2e-tests/tests/cloudflare-worker.test.d.ts +1 -0
  8. package/dist/e2e-tests/tests/cloudflare-worker.test.js +64 -0
  9. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -0
  10. package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js +2 -5
  11. package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js.map +1 -1
  12. package/dist/e2e-tests/tests/expo.test.js +36 -61
  13. package/dist/e2e-tests/tests/expo.test.js.map +1 -1
  14. package/dist/e2e-tests/tests/flutter.test.js +63 -70
  15. package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
  16. package/dist/e2e-tests/tests/help-message.test.js +2 -2
  17. package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
  18. package/dist/e2e-tests/tests/nextjs-14.test.js +48 -76
  19. package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
  20. package/dist/e2e-tests/tests/nextjs-15.test.js +89 -99
  21. package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
  22. package/dist/e2e-tests/tests/nextjs-16.test.js +48 -45
  23. package/dist/e2e-tests/tests/nextjs-16.test.js.map +1 -1
  24. package/dist/e2e-tests/tests/nuxt-3.test.js +45 -58
  25. package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
  26. package/dist/e2e-tests/tests/nuxt-4.test.js +59 -73
  27. package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
  28. package/dist/e2e-tests/tests/pnpm-workspace.test.js +4 -7
  29. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  30. package/dist/e2e-tests/tests/react-native.test.js +44 -80
  31. package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
  32. package/dist/e2e-tests/tests/react-router.test.js +163 -145
  33. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  34. package/dist/e2e-tests/tests/remix.test.js +162 -132
  35. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  36. package/dist/e2e-tests/tests/sveltekit-hooks.test.js +48 -36
  37. package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
  38. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +3 -6
  39. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  40. package/dist/e2e-tests/utils/index.d.ts +15 -43
  41. package/dist/e2e-tests/utils/index.js +95 -185
  42. package/dist/e2e-tests/utils/index.js.map +1 -1
  43. package/dist/get-e2e-test-matrix.mjs +11 -0
  44. package/dist/lib/Constants.d.ts +1 -0
  45. package/dist/lib/Constants.js +5 -0
  46. package/dist/lib/Constants.js.map +1 -1
  47. package/dist/src/android/android-wizard.js +2 -4
  48. package/dist/src/android/android-wizard.js.map +1 -1
  49. package/dist/src/angular/angular-wizard.js +4 -6
  50. package/dist/src/angular/angular-wizard.js.map +1 -1
  51. package/dist/src/angular/sdk-setup.js +1 -1
  52. package/dist/src/angular/sdk-setup.js.map +1 -1
  53. package/dist/src/apple/apple-wizard.js +2 -4
  54. package/dist/src/apple/apple-wizard.js.map +1 -1
  55. package/dist/src/cloudflare/cloudflare-wizard.d.ts +3 -0
  56. package/dist/src/cloudflare/cloudflare-wizard.js +99 -0
  57. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -0
  58. package/dist/src/cloudflare/sdk-setup.d.ts +7 -0
  59. package/dist/src/cloudflare/sdk-setup.js +47 -0
  60. package/dist/src/cloudflare/sdk-setup.js.map +1 -0
  61. package/dist/src/cloudflare/templates.d.ts +4 -0
  62. package/dist/src/cloudflare/templates.js +44 -0
  63. package/dist/src/cloudflare/templates.js.map +1 -0
  64. package/dist/src/cloudflare/wrangler/create-wrangler-config.d.ts +4 -0
  65. package/dist/src/cloudflare/wrangler/create-wrangler-config.js +27 -0
  66. package/dist/src/cloudflare/wrangler/create-wrangler-config.js.map +1 -0
  67. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.d.ts +4 -0
  68. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js +25 -0
  69. package/dist/src/cloudflare/wrangler/ensure-wrangler-config.js.map +1 -0
  70. package/dist/src/cloudflare/wrangler/find-wrangler-config.d.ts +4 -0
  71. package/dist/src/cloudflare/wrangler/find-wrangler-config.js +23 -0
  72. package/dist/src/cloudflare/wrangler/find-wrangler-config.js.map +1 -0
  73. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.d.ts +6 -0
  74. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js +52 -0
  75. package/dist/src/cloudflare/wrangler/get-entry-point-from-wrangler-config.js.map +1 -0
  76. package/dist/src/cloudflare/wrangler/update-wrangler-config.d.ts +17 -0
  77. package/dist/src/cloudflare/wrangler/update-wrangler-config.js +173 -0
  78. package/dist/src/cloudflare/wrangler/update-wrangler-config.js.map +1 -0
  79. package/dist/src/cloudflare/wrap-worker.d.ts +32 -0
  80. package/dist/src/cloudflare/wrap-worker.js +109 -0
  81. package/dist/src/cloudflare/wrap-worker.js.map +1 -0
  82. package/dist/src/flutter/flutter-wizard.js +3 -6
  83. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  84. package/dist/src/nextjs/nextjs-wizard.js +0 -2
  85. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  86. package/dist/src/nuxt/nuxt-wizard.js +3 -5
  87. package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
  88. package/dist/src/react-native/react-native-wizard.js +2 -4
  89. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  90. package/dist/src/react-router/react-router-wizard.js +3 -5
  91. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  92. package/dist/src/react-router/sdk-setup.d.ts +1 -1
  93. package/dist/src/react-router/sdk-setup.js +3 -4
  94. package/dist/src/react-router/sdk-setup.js.map +1 -1
  95. package/dist/src/remix/remix-wizard.js +2 -4
  96. package/dist/src/remix/remix-wizard.js.map +1 -1
  97. package/dist/src/run.d.ts +1 -1
  98. package/dist/src/run.js +5 -0
  99. package/dist/src/run.js.map +1 -1
  100. package/dist/src/sveltekit/sveltekit-wizard.js +2 -4
  101. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  102. package/dist/src/utils/abort-if-sportlight-not-supported.d.ts +5 -0
  103. package/dist/src/utils/abort-if-sportlight-not-supported.js +40 -0
  104. package/dist/src/utils/abort-if-sportlight-not-supported.js.map +1 -0
  105. package/dist/src/utils/ast-utils.d.ts +1 -1
  106. package/dist/src/utils/ast-utils.js.map +1 -1
  107. package/dist/src/utils/clack/index.d.ts +2 -2
  108. package/dist/src/utils/clack/index.js.map +1 -1
  109. package/dist/src/utils/clack/mcp-config.js +117 -59
  110. package/dist/src/utils/clack/mcp-config.js.map +1 -1
  111. package/dist/src/version.d.ts +1 -1
  112. package/dist/src/version.js +1 -1
  113. package/dist/src/version.js.map +1 -1
  114. package/dist/test/angular/angular-wizard.test.js +2 -4
  115. package/dist/test/angular/angular-wizard.test.js.map +1 -1
  116. package/dist/test/cloudflare/create-wrangler-config.test.d.ts +1 -0
  117. package/dist/test/cloudflare/create-wrangler-config.test.js +48 -0
  118. package/dist/test/cloudflare/create-wrangler-config.test.js.map +1 -0
  119. package/dist/test/cloudflare/ensure-wrangler-config.test.d.ts +1 -0
  120. package/dist/test/cloudflare/ensure-wrangler-config.test.js +61 -0
  121. package/dist/test/cloudflare/ensure-wrangler-config.test.js.map +1 -0
  122. package/dist/test/cloudflare/find-wrangler-config.test.d.ts +1 -0
  123. package/dist/test/cloudflare/find-wrangler-config.test.js +77 -0
  124. package/dist/test/cloudflare/find-wrangler-config.test.js.map +1 -0
  125. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.d.ts +1 -0
  126. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js +81 -0
  127. package/dist/test/cloudflare/get-entry-point-from-wrangler-config.test.js.map +1 -0
  128. package/dist/test/cloudflare/sdk-setup.test.d.ts +1 -0
  129. package/dist/test/cloudflare/sdk-setup.test.js +152 -0
  130. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -0
  131. package/dist/test/cloudflare/templates.test.d.ts +1 -0
  132. package/dist/test/cloudflare/templates.test.js +68 -0
  133. package/dist/test/cloudflare/templates.test.js.map +1 -0
  134. package/dist/test/cloudflare/update-wrangler-config.test.d.ts +1 -0
  135. package/dist/test/cloudflare/update-wrangler-config.test.js +216 -0
  136. package/dist/test/cloudflare/update-wrangler-config.test.js.map +1 -0
  137. package/dist/test/cloudflare/wrap-worker.test.d.ts +1 -0
  138. package/dist/test/cloudflare/wrap-worker.test.js +143 -0
  139. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -0
  140. package/dist/test/react-router/sdk-setup.test.js +2 -2
  141. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  142. package/dist/test/utils/clack/mcp-config.test.js +176 -51
  143. package/dist/test/utils/clack/mcp-config.test.js.map +1 -1
  144. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"angular-19.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/angular-19.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Integration } from '../../lib/Constants';\nimport {\n checkFileContents,\n checkFileDoesNotContain,\n checkFileExists,\n checkIfBuilds,\n checkIfRunsOnDevMode,\n checkIfRunsOnProdMode,\n checkPackageJson,\n cleanupGit,\n KEYS,\n modifyFile,\n revertLocalChanges,\n startWizardInstance,\n} from '../utils';\nimport * as path from 'path';\nimport { TEST_ARGS } from '../utils';\nimport { test, expect, describe, beforeAll, afterAll } from 'vitest';\n\ndescribe.sequential('Angular-19', () => {\n describe('with empty project', () => {\n const integration = Integration.angular;\n const projectDir = path.resolve(\n __dirname,\n '../test-applications/angular-19-test-app',\n );\n\n beforeAll(async () => {\n revertLocalChanges(projectDir);\n await runWizardOnAngularProject(projectDir, integration);\n });\n\n afterAll(() => {\n revertLocalChanges(projectDir);\n cleanupGit(projectDir);\n });\n\n checkAngularProject(projectDir, integration);\n });\n describe('with pre-defined ErrorHandler', () => {\n const integration = Integration.angular;\n const projectDir = path.resolve(\n __dirname,\n '../test-applications/angular-19-test-app',\n );\n\n beforeAll(async () => {\n revertLocalChanges(projectDir);\n await runWizardOnAngularProject(projectDir, integration, (projectDir) => {\n modifyFile(`${projectDir}/src/app/app.config.ts`, {\n 'providers: [': `providers: [{\n provide: ErrorHandler,\n useValue: null\n },\n `,\n });\n });\n });\n\n afterAll(() => {\n revertLocalChanges(projectDir);\n cleanupGit(projectDir);\n });\n\n checkAngularProject(projectDir, integration, {\n preExistingErrorHandler: true,\n });\n });\n});\n\nasync function runWizardOnAngularProject(\n projectDir: string,\n integration: Integration,\n fileModificationFn?: (projectDir: string) => unknown,\n) {\n const wizardInstance = startWizardInstance(integration, projectDir, true);\n\n if (fileModificationFn) {\n fileModificationFn(projectDir);\n\n await wizardInstance.waitForOutput('Do you want to continue anyway?');\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER],\n 'Please select your package manager.',\n );\n } else {\n await wizardInstance.waitForOutput('Please select your package manager.');\n }\n\n await wizardInstance.sendStdinAndWaitForOutput(\n // Selecting `yarn` as the package manager\n [KEYS.DOWN, KEYS.ENTER],\n // \"Do you want to enable Tracing\", sometimes doesn't work as `Tracing` can be printed in bold.\n 'to track the performance of your application?',\n {\n timeout: 240_000,\n optional: true,\n },\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER],\n // \"Do you want to enable Sentry Session Replay\", sometimes doesn't work as `Sentry Session Replay` can be printed in bold.\n 'to get a video-like reproduction of errors during a user session?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n // select \"Yes\" for replay\n [KEYS.ENTER],\n // \"Do you want to enable Logs\", sometimes doesn't work as `Logs` can be printed in bold.\n 'to send your application logs to Sentry?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n // select \"Yes\" for logs\n [KEYS.ENTER],\n 'Where are your build artifacts located?',\n {\n optional: true,\n timeout: 5000,\n },\n );\n\n const sourcemapsConfiguredPromise = wizardInstance.waitForOutput(\n 'Added a sentry:sourcemaps script to your package.json',\n );\n\n const buildScriptPromptedPromise = wizardInstance.waitForOutput(\n 'Do you want to automatically run the sentry:sourcemaps script after each production build?',\n );\n\n const optionalArtifactsNotFoundPromise = wizardInstance.waitForOutput(\n \"We couldn't find build artifacts at\",\n {\n optional: true,\n timeout: 5000,\n },\n );\n\n // ./dist is the default value, no need to change it\n wizardInstance.sendStdin(KEYS.ENTER);\n\n const optionalArtifactsNotFoundPrompted =\n await optionalArtifactsNotFoundPromise;\n\n if (optionalArtifactsNotFoundPrompted) {\n // The wizard now presents options when artifacts aren't found:\n // - \"Let the wizard run the build command\"\n // - \"Enter a different path manually\"\n // - \"Proceed anyway — I believe the path is correct\"\n // We want to select \"Proceed anyway\" (third option)\n wizardInstance.sendStdin(KEYS.DOWN);\n wizardInstance.sendStdin(KEYS.DOWN);\n wizardInstance.sendStdin(KEYS.ENTER);\n }\n\n await sourcemapsConfiguredPromise;\n await buildScriptPromptedPromise;\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER], // yes, automatically add sentry:sourcemaps script\n 'Is yarn build your production build command?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER], // yes, yarn build is the production build command\n 'Are you using a CI/CD tool to build and deploy your application?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.DOWN, KEYS.ENTER], // no CI/CD tool\n 'Do you want to create an example component to test your Sentry setup?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER], // yes, create example component\n 'Did you apply the snippet above?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER], // yes, applied the snippet\n 'Looks like you have Prettier in your project. Do you want to run it on your files?',\n );\n\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.ENTER], // yes, run prettier\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n {\n optional: true,\n },\n );\n\n // Handle the MCP prompt (default is now Yes, so press DOWN to select No)\n await wizardInstance.sendStdinAndWaitForOutput(\n [KEYS.DOWN, KEYS.ENTER], // decline MCP config\n 'Successfully installed the Sentry Angular SDK!',\n );\n\n wizardInstance.kill();\n}\n\nfunction checkAngularProject(\n projectDir: string,\n integration: Integration,\n options?: {\n preExistingErrorHandler?: boolean;\n },\n) {\n test('package.json is updated correctly', () => {\n checkPackageJson(projectDir, integration);\n\n const packageJsonFile = path.resolve(projectDir, 'package.json');\n checkFileContents(packageJsonFile, [\n `\"sentry:sourcemaps\": \"sentry-cli sourcemaps inject --org ${TEST_ARGS.ORG_SLUG} --project ${TEST_ARGS.PROJECT_SLUG} ./dist && sentry-cli sourcemaps upload --org ${TEST_ARGS.ORG_SLUG} --project ${TEST_ARGS.PROJECT_SLUG} ./dist\"`,\n `\"build\": \"ng build && yarn sentry:sourcemaps\"`,\n ]);\n });\n\n test('Sentry is correctly injected into Angular app config', () => {\n const appConfigFile = path.resolve(projectDir, 'src/main.ts');\n checkFileExists(appConfigFile);\n\n checkFileContents(appConfigFile, [\n `import * as Sentry from '@sentry/angular'`,\n 'Sentry.init({',\n TEST_ARGS.PROJECT_DSN,\n 'Sentry.browserTracingIntegration()',\n 'Sentry.replayIntegration()',\n 'tracesSampleRate: 1',\n 'replaysSessionSampleRate: 0.1',\n 'replaysOnErrorSampleRate: 1',\n 'enableLogs: true',\n 'sendDefaultPii: true',\n ]);\n });\n\n test('Sentry is correctly injected into Angular app module', () => {\n const appModuleFile = path.resolve(projectDir, 'src/app/app.config.ts');\n checkFileExists(appModuleFile);\n\n // Checking if the ErrorHandler is already present in the providers array,\n // and if it is, we skip adding it\n if (options?.preExistingErrorHandler) {\n checkFileDoesNotContain(appModuleFile, 'Sentry.createErrorHandler()');\n }\n\n checkFileContents(appModuleFile, [\n `import * as Sentry from '@sentry/angular'`,\n options?.preExistingErrorHandler\n ? `provide: ErrorHandler,\n useValue: null`\n : `provide: ErrorHandler,\n useValue: Sentry.createErrorHandler()`,\n `provide: Sentry.TraceService,\n deps: [Router]`,\n `provideAppInitializer(() => {\n inject(Sentry.TraceService);\n })`,\n ]);\n });\n\n test('angular.json is updated correctly', async () => {\n const angularJsonFile = path.resolve(projectDir, 'angular.json');\n checkFileExists(angularJsonFile);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const angularJson = (await import(angularJsonFile)) as Record<string, any>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [, project] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n angularJson.projects as Record<string, any>,\n )) {\n expect(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n project?.architect?.build?.configurations?.production?.sourceMap,\n ).toBe(true);\n }\n });\n\n test('builds successfully', async () => {\n await checkIfBuilds(projectDir);\n });\n\n test('runs on prod mode correctly', async () => {\n await checkIfRunsOnProdMode(\n projectDir,\n 'Application bundle generation complete.',\n );\n });\n\n test('runs on dev mode correctly', async () => {\n await checkIfRunsOnDevMode(\n projectDir,\n 'Application bundle generation complete.',\n );\n });\n}\n"]}
1
+ {"version":3,"file":"angular-19.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/angular-19.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAkD;AAClD,oCAWkB;AAClB,2CAA6B;AAC7B,oCAAqC;AACrC,mCAAyE;AAEzE,uCAAuC;AACvC,mCAAuC;AAEvC,iBAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,GAAG,EAAE;IACrC,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,MAAM,WAAW,GAAG,uBAAW,CAAC,OAAO,CAAC;QACxC,IAAI,cAAsB,CAAC;QAE3B,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAA,6BAAqB,EACnD,qBAAqB,CACtB,CAAC;QAEF,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;YACnB,cAAc,GAAG,MAAM,yBAAyB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAQ,EAAC,GAAG,EAAE;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,MAAM,WAAW,GAAG,uBAAW,CAAC,OAAO,CAAC;QACxC,IAAI,cAAsB,CAAC;QAE3B,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAA,6BAAqB,EACnD,qBAAqB,CACtB,CAAC;QAEF,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;YACnB,cAAc,GAAG,MAAM,yBAAyB,CAC9C,UAAU,EACV,WAAW,EACX,CAAC,UAAU,EAAE,EAAE;gBACb,IAAA,kBAAU,EAAC,GAAG,UAAU,wBAAwB,EAAE;oBAChD,cAAc,EAAE;;;;aAIf;iBACF,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAA,iBAAQ,EAAC,GAAG,EAAE;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE;YAC3C,uBAAuB,EAAE,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,yBAAyB,CACtC,UAAkB,EAClB,WAAwB,EACxB,kBAAoD;IAEpD,MAAM,iBAAiB,GAAG,IAAA,gBAAO,EAAC;QAChC,GAAG,EAAE,UAAU;KAChB,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAEvB,IAAI,kBAAkB,EAAE;QACtB,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE/B,iBAAiB;aACd,SAAS,CAAC,iCAAiC,CAAC;aAC5C,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC;KAC5B;IACD,OAAO,CACL,iBAAiB;SACd,SAAS,CAAC,qCAAqC,CAAC;SAChD,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC,iCAAiC;SACzD,YAAY,CAAC,4BAA4B,CAAC;QAC3C,4CAA4C;SAC3C,YAAY,CAAC,qCAAqC,EAAE;QACnD,OAAO,EAAE,MAAO;KACjB,CAAC;SACD,SAAS,CAAC,+BAA+B,CAAC;SAC1C,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC,MAAM;SAC9B,SAAS,CAAC,sCAAsC,CAAC;SACjD,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC,MAAM;SAC9B,SAAS,CAAC,4BAA4B,CAAC;SACvC,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC,MAAM;SAC9B,YAAY,CAAC,+BAA+B,EAAE;QAC7C,OAAO,EAAE,KAAM;KAChB,CAAC;SACD,YAAY,CAAC,uCAAuC,CAAC;SACrD,YAAY,CAAC,wBAAwB,CAAC;SACtC,YAAY,CAAC,wBAAwB,EAAE;QACtC,OAAO,EAAE,MAAO,EAAE,+CAA+C;KAClE,CAAC;SACD,SAAS,CAAC,yCAAyC,CAAC;SACpD,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC,8BAA8B;SACtD,SAAS,CACR,2EAA2E,CAC5E;SACA,WAAW,CAAC,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,KAAK,CAAC,CAAC,oCAAoC;SAClF,SAAS,CACR,4FAA4F,CAC7F;SACA,WAAW,CAAC,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,KAAK,CAAC,CAAC,mDAAmD;SACtF,SAAS,CACR,kEAAkE,CACnE;SACA,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;SACvB,SAAS,CACR,6GAA6G,CAC9G;SACA,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;SACvB,YAAY,CACX,kFAAkF,CACnF;SACA,YAAY,CAAC,oBAAoB,CAAC;SAClC,SAAS,CAAC,sCAAsC,CAAC;SACjD,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC,MAAM;SAC9B,SAAS,CACR,uEAAuE,CACxE;SACA,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;SACvB,SAAS,CAAC,kCAAkC,CAAC;SAC7C,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;SACvB,SAAS,CACR,oFAAoF,CACrF;SACA,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;SACvB,SAAS,CACR,8EAA8E,CAC/E;SACA,WAAW,CAAC,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,KAAK,CAAC;SAClC,YAAY,CAAC,gDAAgD,CAAC;SAC9D,GAAG,CAAC,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,WAAwB,EACxB,OAEC;IAED,IAAA,aAAI,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,IAAA,wBAAgB,EAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAEhD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACjE,IAAA,yBAAiB,EAAC,eAAe,EAAE;YACjC,4DAA4D,iBAAS,CAAC,QAAQ,cAAc,iBAAS,CAAC,YAAY,iDAAiD,iBAAS,CAAC,QAAQ,cAAc,iBAAS,CAAC,YAAY,UAAU;YACnO,qBAAqB;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC9D,IAAA,uBAAe,EAAC,aAAa,CAAC,CAAC;QAE/B,IAAA,yBAAiB,EAAC,aAAa,EAAE;YAC/B,4CAA4C;YAC5C,eAAe;YACf,iBAAS,CAAC,WAAW;YACrB,oCAAoC;YACpC,4BAA4B;YAC5B,qBAAqB;YACrB,+BAA+B;YAC/B,6BAA6B;YAC7B,kBAAkB;YAClB,sBAAsB;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAChE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;QACxE,IAAA,uBAAe,EAAC,aAAa,CAAC,CAAC;QAE/B,0EAA0E;QAC1E,kCAAkC;QAClC,IAAI,OAAO,EAAE,uBAAuB,EAAE;YACpC,IAAA,+BAAuB,EAAC,aAAa,EAAE,6BAA6B,CAAC,CAAC;SACvE;QAED,IAAA,yBAAiB,EAAC,aAAa,EAAE;YAC/B,4CAA4C;YAC5C,OAAO,EAAE,uBAAuB;gBAC9B,CAAC,CAAC;qBACW;gBACb,CAAC,CAAC;4CACkC;YACtC;qBACe;YACf;;OAEC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACjE,IAAA,uBAAe,EAAC,eAAe,CAAC,CAAC;QAEjC,8DAA8D;QAC9D,MAAM,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAwB,CAAC;QAE3E,8DAA8D;QAC9D,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO;QACtC,8DAA8D;QAC9D,WAAW,CAAC,QAA+B,CAC5C,EAAE;YACD,IAAA,eAAM;YACJ,sEAAsE;YACtE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,CACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACd;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,IAAA,qBAAa,EAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,IAAA,6BAAqB,EACzB,UAAU,EACV,yCAAyC,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,IAAA,4BAAoB,EACxB,UAAU,EACV,yCAAyC,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { Integration } from '../../lib/Constants';\nimport {\n checkFileContents,\n checkFileDoesNotContain,\n checkFileExists,\n checkIfBuilds,\n checkIfRunsOnDevMode,\n checkIfRunsOnProdMode,\n checkPackageJson,\n createIsolatedTestEnv,\n getWizardCommand,\n modifyFile,\n} from '../utils';\nimport * as path from 'path';\nimport { TEST_ARGS } from '../utils';\nimport { test, expect, describe, beforeAll, afterAll, it } from 'vitest';\n\n//@ts-expect-error - clifty is ESM only\nimport { KEYS, withEnv } from 'clifty';\n\ndescribe.sequential('Angular-19', () => {\n describe('with empty project', () => {\n const integration = Integration.angular;\n let wizardExitCode: number;\n\n const { projectDir, cleanup } = createIsolatedTestEnv(\n 'angular-19-test-app',\n );\n\n beforeAll(async () => {\n wizardExitCode = await runWizardOnAngularProject(projectDir, integration);\n });\n\n afterAll(() => {\n cleanup();\n });\n\n it('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n checkAngularProject(projectDir, integration);\n });\n\n describe('with pre-defined ErrorHandler', () => {\n const integration = Integration.angular;\n let wizardExitCode: number;\n\n const { projectDir, cleanup } = createIsolatedTestEnv(\n 'angular-19-test-app',\n );\n\n beforeAll(async () => {\n wizardExitCode = await runWizardOnAngularProject(\n projectDir,\n integration,\n (projectDir) => {\n modifyFile(`${projectDir}/src/app/app.config.ts`, {\n 'providers: [': `providers: [{\n provide: ErrorHandler,\n useValue: null\n },\n `,\n });\n },\n );\n });\n\n afterAll(() => {\n cleanup();\n });\n\n it('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n checkAngularProject(projectDir, integration, {\n preExistingErrorHandler: true,\n });\n });\n});\n\nasync function runWizardOnAngularProject(\n projectDir: string,\n integration: Integration,\n fileModificationFn?: (projectDir: string) => unknown,\n): Promise<number> {\n const wizardInteraction = withEnv({\n cwd: projectDir,\n }).defineInteraction();\n\n if (fileModificationFn) {\n fileModificationFn(projectDir);\n\n wizardInteraction\n .whenAsked('Do you want to continue anyway?')\n .respondWith(KEYS.ENTER);\n }\n return (\n wizardInteraction\n .whenAsked('Please select your package manager.')\n .respondWith(KEYS.ENTER) // npm is the default for Angular\n .expectOutput('Installing @sentry/angular')\n // Installing the sdk can take a while in CI\n .expectOutput('Installed @sentry/angular with NPM.', {\n timeout: 240_000,\n })\n .whenAsked('Do you want to enable Tracing')\n .respondWith(KEYS.ENTER) // yes\n .whenAsked('Do you want to enable Session Replay')\n .respondWith(KEYS.ENTER) // yes\n .whenAsked('Do you want to enable Logs')\n .respondWith(KEYS.ENTER) // yes\n .expectOutput('initialized Sentry in main.ts', {\n timeout: 10_000,\n })\n .expectOutput('updated your app config app.config.ts')\n .expectOutput('Installing @sentry/cli')\n .expectOutput('Installed @sentry/cli@', {\n timeout: 240_000, // installing Sentry CLI can take a while in CI\n })\n .whenAsked('Where are your build artifacts located?')\n .respondWith(KEYS.ENTER) // ./dist is the default value\n .whenAsked(\n 'We couldn\\'t find build artifacts at \"./dist\". What would you like to do?',\n )\n .respondWith(KEYS.DOWN, KEYS.DOWN, KEYS.ENTER) // Proceed anyway (this is expected)\n .whenAsked(\n 'Do you want to automatically run the sentry:sourcemaps script after each production build?',\n )\n .respondWith(KEYS.DOWN, KEYS.ENTER) // no - we can't upload in CI when testing building\n .whenAsked(\n 'Are you using a CI/CD tool to build and deploy your application?',\n )\n .respondWith(KEYS.ENTER)\n .whenAsked(\n 'Add a step to your CI pipeline that runs the sentry:sourcemaps script right after building your application',\n )\n .respondWith(KEYS.ENTER)\n .expectOutput(\n 'Add the Sentry authentication token as an environment variable to your CI setup:',\n )\n .expectOutput('SENTRY_AUTH_TOKEN=')\n .whenAsked('Did you configure CI as shown above?')\n .respondWith(KEYS.ENTER) // yes\n .whenAsked(\n 'Do you want to create an example component to test your Sentry setup?',\n )\n .respondWith(KEYS.ENTER)\n .whenAsked('Did you apply the snippet above?')\n .respondWith(KEYS.ENTER)\n .whenAsked(\n 'Looks like you have Prettier in your project. Do you want to run it on your files?',\n )\n .respondWith(KEYS.ENTER)\n .whenAsked(\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n )\n .respondWith(KEYS.DOWN, KEYS.ENTER)\n .expectOutput('Successfully installed the Sentry Angular SDK!')\n .run(getWizardCommand(integration))\n );\n}\n\nfunction checkAngularProject(\n projectDir: string,\n integration: Integration,\n options?: {\n preExistingErrorHandler?: boolean;\n },\n) {\n test('package.json is updated correctly', () => {\n checkPackageJson(projectDir, '@sentry/angular');\n\n const packageJsonFile = path.resolve(projectDir, 'package.json');\n checkFileContents(packageJsonFile, [\n `\"sentry:sourcemaps\": \"sentry-cli sourcemaps inject --org ${TEST_ARGS.ORG_SLUG} --project ${TEST_ARGS.PROJECT_SLUG} ./dist && sentry-cli sourcemaps upload --org ${TEST_ARGS.ORG_SLUG} --project ${TEST_ARGS.PROJECT_SLUG} ./dist\"`,\n `\"build\": \"ng build\"`,\n ]);\n });\n\n test('Sentry is correctly injected into Angular app config', () => {\n const appConfigFile = path.resolve(projectDir, 'src/main.ts');\n checkFileExists(appConfigFile);\n\n checkFileContents(appConfigFile, [\n `import * as Sentry from \"@sentry/angular\";`,\n 'Sentry.init({',\n TEST_ARGS.PROJECT_DSN,\n 'Sentry.browserTracingIntegration()',\n 'Sentry.replayIntegration()',\n 'tracesSampleRate: 1',\n 'replaysSessionSampleRate: 0.1',\n 'replaysOnErrorSampleRate: 1',\n 'enableLogs: true',\n 'sendDefaultPii: true',\n ]);\n });\n\n test('Sentry is correctly injected into Angular app module', () => {\n const appModuleFile = path.resolve(projectDir, 'src/app/app.config.ts');\n checkFileExists(appModuleFile);\n\n // Checking if the ErrorHandler is already present in the providers array,\n // and if it is, we skip adding it\n if (options?.preExistingErrorHandler) {\n checkFileDoesNotContain(appModuleFile, 'Sentry.createErrorHandler()');\n }\n\n checkFileContents(appModuleFile, [\n `import * as Sentry from \"@sentry/angular\";`,\n options?.preExistingErrorHandler\n ? `provide: ErrorHandler,\n useValue: null`\n : `provide: ErrorHandler,\n useValue: Sentry.createErrorHandler()`,\n `provide: Sentry.TraceService,\n deps: [Router]`,\n `provideAppInitializer(() => {\n inject(Sentry.TraceService);\n })`,\n ]);\n });\n\n test('angular.json is updated correctly', async () => {\n const angularJsonFile = path.resolve(projectDir, 'angular.json');\n checkFileExists(angularJsonFile);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const angularJson = (await import(angularJsonFile)) as Record<string, any>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const [, project] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n angularJson.projects as Record<string, any>,\n )) {\n expect(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n project?.architect?.build?.configurations?.production?.sourceMap,\n ).toBe(true);\n }\n });\n\n test('builds successfully', async () => {\n await checkIfBuilds(projectDir);\n });\n\n test('runs on prod mode correctly', async () => {\n await checkIfRunsOnProdMode(\n projectDir,\n 'Application bundle generation complete.',\n );\n });\n\n test('runs on dev mode correctly', async () => {\n await checkIfRunsOnDevMode(\n projectDir,\n 'Application bundle generation complete.',\n );\n });\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const Constants_1 = require("../../lib/Constants");
5
+ const utils_1 = require("../utils");
6
+ //@ts-expect-error - clifty is ESM only
7
+ const clifty_1 = require("clifty");
8
+ (0, vitest_1.describe)('cloudflare-worker', () => {
9
+ const integration = Constants_1.Integration.cloudflare;
10
+ let wizardExitCode;
11
+ let expectedCompatibilityDate;
12
+ const { projectDir, cleanup } = (0, utils_1.createIsolatedTestEnv)('cloudflare-test-app');
13
+ (0, vitest_1.beforeAll)(async () => {
14
+ // Capture the date before running the wizard (wizard runs in subprocess)
15
+ expectedCompatibilityDate = new Date().toISOString().slice(0, 10);
16
+ wizardExitCode = await (0, clifty_1.withEnv)({
17
+ cwd: projectDir,
18
+ })
19
+ .defineInteraction()
20
+ .expectOutput('The Sentry Cloudflare Wizard will help you set up Sentry for your application')
21
+ .step('package installation', ({ expectOutput, whenAsked }) => {
22
+ whenAsked('Please select your package manager.').respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER);
23
+ expectOutput('Installing @sentry/cloudflare');
24
+ })
25
+ .step('SDK setup', ({ whenAsked }) => {
26
+ whenAsked('Do you want to enable Tracing', {
27
+ timeout: 90000, // package installation can take a while in CI
28
+ }).respondWith(clifty_1.KEYS.ENTER);
29
+ })
30
+ .whenAsked('Optionally add a project-scoped MCP server configuration for the Sentry MCP?')
31
+ .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER)
32
+ .expectOutput('Sentry has been successfully configured for your Cloudflare project.')
33
+ .run((0, utils_1.getWizardCommand)(integration));
34
+ });
35
+ (0, vitest_1.afterAll)(() => {
36
+ cleanup();
37
+ });
38
+ (0, vitest_1.it)('exits with exit code 0', () => {
39
+ (0, vitest_1.expect)(wizardExitCode).toBe(0);
40
+ });
41
+ (0, vitest_1.it)('adds the SDK dependency to package.json', () => {
42
+ (0, utils_1.checkPackageJson)(projectDir, '@sentry/cloudflare');
43
+ });
44
+ (0, vitest_1.it)('builds correctly', async () => {
45
+ await (0, utils_1.checkIfBuilds)(projectDir);
46
+ });
47
+ (0, vitest_1.it)('wrangler.jsonc file contains Sentry configuration', () => {
48
+ (0, utils_1.checkFileContents)(`${projectDir}/wrangler.jsonc`, [
49
+ `"compatibility_date": "${expectedCompatibilityDate}"`,
50
+ '"global_fetch_strictly_public"',
51
+ '"nodejs_als"',
52
+ '"version_metadata": {',
53
+ '"binding": "CF_VERSION_METADATA"',
54
+ ]);
55
+ });
56
+ (0, vitest_1.it)('modifies the worker file to include Sentry initialization', () => {
57
+ (0, utils_1.checkFileContents)(`${projectDir}/src/index.ts`, [
58
+ 'import * as Sentry from "@sentry/cloudflare";',
59
+ 'export default Sentry.withSentry(env => ({',
60
+ 'dsn: "https://public@dsn.ingest.sentry.io/1337",',
61
+ ]);
62
+ });
63
+ });
64
+ //# sourceMappingURL=cloudflare-worker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-worker.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/cloudflare-worker.test.ts"],"names":[],"mappings":";;AAAA,mCAAmE;AACnE,mDAAkD;AAClD,oCAMkB;AAElB,uCAAuC;AACvC,mCAAuC;AAEvC,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,MAAM,WAAW,GAAG,uBAAW,CAAC,UAAU,CAAC;IAC3C,IAAI,cAAsB,CAAC;IAC3B,IAAI,yBAAiC,CAAC;IAEtC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAA,6BAAqB,EAAC,qBAAqB,CAAC,CAAC;IAE7E,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;QACnB,yEAAyE;QACzE,yBAAyB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElE,cAAc,GAAG,MAAM,IAAA,gBAAO,EAAC;YAC7B,GAAG,EAAE,UAAU;SAChB,CAAC;aACC,iBAAiB,EAAE;aACnB,YAAY,CACX,+EAA+E,CAChF;aACA,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5D,SAAS,CAAC,qCAAqC,CAAC,CAAC,WAAW,CAC1D,aAAI,CAAC,IAAI,EACT,aAAI,CAAC,KAAK,CACX,CAAC;YACF,YAAY,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC,CAAC;aACD,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;YACnC,SAAS,CAAC,+BAA+B,EAAE;gBACzC,OAAO,EAAE,KAAM,EAAE,8CAA8C;aAChE,CAAC,CAAC,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC;aACD,SAAS,CACR,8EAA8E,CAC/E;aACA,WAAW,CAAC,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,KAAK,CAAC;aAClC,YAAY,CACX,sEAAsE,CACvE;aACA,GAAG,CAAC,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,GAAG,EAAE;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,wBAAgB,EAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,IAAA,qBAAa,EAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,IAAA,yBAAiB,EAAC,GAAG,UAAU,iBAAiB,EAAE;YAChD,0BAA0B,yBAAyB,GAAG;YACtD,gCAAgC;YAChC,cAAc;YACd,uBAAuB;YACvB,kCAAkC;SACnC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,IAAA,yBAAiB,EAAC,GAAG,UAAU,eAAe,EAAE;YAC9C,+CAA+C;YAC/C,4CAA4C;YAC5C,kDAAkD;SACnD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { afterAll, beforeAll, describe, expect, it } from 'vitest';\nimport { Integration } from '../../lib/Constants';\nimport {\n checkFileContents,\n checkIfBuilds,\n checkPackageJson,\n createIsolatedTestEnv,\n getWizardCommand,\n} from '../utils';\n\n//@ts-expect-error - clifty is ESM only\nimport { KEYS, withEnv } from 'clifty';\n\ndescribe('cloudflare-worker', () => {\n const integration = Integration.cloudflare;\n let wizardExitCode: number;\n let expectedCompatibilityDate: string;\n\n const { projectDir, cleanup } = createIsolatedTestEnv('cloudflare-test-app');\n\n beforeAll(async () => {\n // Capture the date before running the wizard (wizard runs in subprocess)\n expectedCompatibilityDate = new Date().toISOString().slice(0, 10);\n\n wizardExitCode = await withEnv({\n cwd: projectDir,\n })\n .defineInteraction()\n .expectOutput(\n 'The Sentry Cloudflare Wizard will help you set up Sentry for your application',\n )\n .step('package installation', ({ expectOutput, whenAsked }) => {\n whenAsked('Please select your package manager.').respondWith(\n KEYS.DOWN,\n KEYS.ENTER,\n );\n expectOutput('Installing @sentry/cloudflare');\n })\n .step('SDK setup', ({ whenAsked }) => {\n whenAsked('Do you want to enable Tracing', {\n timeout: 90_000, // package installation can take a while in CI\n }).respondWith(KEYS.ENTER);\n })\n .whenAsked(\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n )\n .respondWith(KEYS.DOWN, KEYS.ENTER)\n .expectOutput(\n 'Sentry has been successfully configured for your Cloudflare project.',\n )\n .run(getWizardCommand(integration));\n });\n\n afterAll(() => {\n cleanup();\n });\n\n it('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n it('adds the SDK dependency to package.json', () => {\n checkPackageJson(projectDir, '@sentry/cloudflare');\n });\n\n it('builds correctly', async () => {\n await checkIfBuilds(projectDir);\n });\n\n it('wrangler.jsonc file contains Sentry configuration', () => {\n checkFileContents(`${projectDir}/wrangler.jsonc`, [\n `\"compatibility_date\": \"${expectedCompatibilityDate}\"`,\n '\"global_fetch_strictly_public\"',\n '\"nodejs_als\"',\n '\"version_metadata\": {',\n '\"binding\": \"CF_VERSION_METADATA\"',\n ]);\n });\n\n it('modifies the worker file to include Sentry initialization', () => {\n checkFileContents(`${projectDir}/src/index.ts`, [\n 'import * as Sentry from \"@sentry/cloudflare\";',\n 'export default Sentry.withSentry(env => ({',\n 'dsn: \"https://public@dsn.ingest.sentry.io/1337\",',\n ]);\n });\n});\n"]}
@@ -34,11 +34,9 @@ const fs_1 = __importDefault(require("fs"));
34
34
  //@ts-expect-error - clifty is ESM only
35
35
  const clifty_1 = require("clifty");
36
36
  (0, vitest_1.describe)('Cloudflare-Wrangler-Sourcemaps-Wizard', () => {
37
- const projectDir = path.resolve(__dirname, '../test-applications/cloudflare-wrangler-sourcemaps-test-app');
38
37
  let wizardExitCode;
38
+ const { projectDir, cleanup } = (0, utils_1.createIsolatedTestEnv)('cloudflare-wrangler-sourcemaps-test-app');
39
39
  (0, vitest_1.beforeAll)(async () => {
40
- (0, utils_1.initGit)(projectDir);
41
- (0, utils_1.revertLocalChanges)(projectDir);
42
40
  wizardExitCode = await (0, clifty_1.withEnv)({ cwd: projectDir })
43
41
  .defineInteraction()
44
42
  .step('intro', ({ expectOutput }) => {
@@ -68,8 +66,7 @@ const clifty_1 = require("clifty");
68
66
  .run((0, utils_1.getWizardCommand)(Constants_1.Integration.sourcemaps));
69
67
  }, 60000);
70
68
  (0, vitest_1.afterAll)(() => {
71
- (0, utils_1.revertLocalChanges)(projectDir);
72
- (0, utils_1.cleanupGit)(projectDir);
69
+ cleanup();
73
70
  });
74
71
  (0, vitest_1.it)('exits with exit code 0', () => {
75
72
  (0, vitest_1.expect)(wizardExitCode).toBe(0);
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare-wrangler-sourcemaps.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterAll, beforeAll, describe, expect, it } from 'vitest';\nimport {\n checkSentryCliRc,\n cleanupGit,\n getWizardCommand,\n initGit,\n revertLocalChanges,\n TEST_ARGS,\n} from '../utils';\nimport { Integration } from '../../lib/Constants';\nimport * as path from 'path';\nimport fs from 'fs';\n//@ts-expect-error - clifty is ESM only\nimport { KEYS, withEnv } from 'clifty';\nimport { PackageDotJson } from '../../src/utils/package-json';\n\ndescribe('Cloudflare-Wrangler-Sourcemaps-Wizard', () => {\n const projectDir = path.resolve(\n __dirname,\n '../test-applications/cloudflare-wrangler-sourcemaps-test-app',\n );\n\n let wizardExitCode: number;\n\n beforeAll(async () => {\n initGit(projectDir);\n revertLocalChanges(projectDir);\n\n wizardExitCode = await withEnv({ cwd: projectDir })\n .defineInteraction()\n .step('intro', ({ expectOutput }) => {\n expectOutput('This wizard will help you upload source maps to Sentry');\n })\n .step('select wrangler', ({ expectOutput, whenAsked }) => {\n whenAsked(\n 'Which framework, bundler or build tool are you using?',\n ).respondWith(KEYS.ENTER);\n\n expectOutput('Before we get started');\n expectOutput('We recommend using Vite to build your worker instead');\n whenAsked('want to proceed with the Wrangler setup').respondWith(\n KEYS.ENTER,\n );\n })\n .step('configure source maps upload', ({ expectOutput, whenAsked }) => {\n expectOutput('Installing @sentry/cli');\n whenAsked('Is yarn deploy your build and deploy command?', {\n timeout: 60_000, // give CI some time to install @sentry/cli\n }).respondWith(KEYS.ENTER);\n expectOutput('Added a sentry:sourcemaps script to your package.json');\n expectOutput('Added a postdeploy script to your package.json');\n expectOutput(\n 'Modified your deploy script to enable uploading source maps',\n );\n expectOutput(\n 'Added auth token to .sentryclirc for you to test uploading source maps locally',\n );\n expectOutput('Created .sentryclirc');\n })\n .step('add auth token to CI/CD (skipped)', ({ whenAsked }) => {\n whenAsked(\n 'Are you using a CI/CD tool to build and deploy your application?',\n ).respondWith(KEYS.DOWN, KEYS.ENTER); // no\n })\n .expectOutput(\"That's it\")\n .run(getWizardCommand(Integration.sourcemaps));\n }, 60_000);\n\n afterAll(() => {\n revertLocalChanges(projectDir);\n cleanupGit(projectDir);\n });\n\n it('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n it('adds and adjusts the respective package.json scripts', () => {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(projectDir, 'package.json'), 'utf8'),\n ) as PackageDotJson;\n\n expect(pkgJson?.scripts?.['sentry:sourcemaps']).toEqual(\n `_SENTRY_RELEASE=$(sentry-cli releases propose-version) && sentry-cli releases new $_SENTRY_RELEASE --org=${TEST_ARGS.ORG_SLUG} --project=${TEST_ARGS.PROJECT_SLUG} && sentry-cli sourcemaps upload --org=${TEST_ARGS.ORG_SLUG} --project=${TEST_ARGS.PROJECT_SLUG} --release=$_SENTRY_RELEASE --strip-prefix 'dist/..' dist`,\n );\n expect(pkgJson?.scripts?.['postdeploy']).toEqual('yarn sentry:sourcemaps');\n expect(pkgJson?.scripts?.['deploy']).toEqual(\n 'wrangler deploy --outdir dist --upload-source-maps --var SENTRY_RELEASE:$(sentry-cli releases propose-version)',\n );\n });\n\n it('adds sentry-cli as a devDependency', () => {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(projectDir, 'package.json'), 'utf8'),\n ) as PackageDotJson;\n\n expect(pkgJson?.devDependencies?.['@sentry/cli']).toBeDefined();\n });\n\n it('adds a .sentryclirc file', () => {\n checkSentryCliRc(projectDir);\n });\n});\n"]}
1
+ {"version":3,"file":"cloudflare-wrangler-sourcemaps.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterAll, beforeAll, describe, expect, it } from 'vitest';\nimport {\n checkSentryCliRc,\n createIsolatedTestEnv,\n getWizardCommand,\n TEST_ARGS,\n} from '../utils';\nimport { Integration } from '../../lib/Constants';\nimport * as path from 'path';\nimport fs from 'fs';\n//@ts-expect-error - clifty is ESM only\nimport { KEYS, withEnv } from 'clifty';\nimport { PackageDotJson } from '../../src/utils/package-json';\n\ndescribe('Cloudflare-Wrangler-Sourcemaps-Wizard', () => {\n let wizardExitCode: number;\n\n const { projectDir, cleanup } = createIsolatedTestEnv(\n 'cloudflare-wrangler-sourcemaps-test-app',\n );\n\n beforeAll(async () => {\n wizardExitCode = await withEnv({ cwd: projectDir })\n .defineInteraction()\n .step('intro', ({ expectOutput }) => {\n expectOutput('This wizard will help you upload source maps to Sentry');\n })\n .step('select wrangler', ({ expectOutput, whenAsked }) => {\n whenAsked(\n 'Which framework, bundler or build tool are you using?',\n ).respondWith(KEYS.ENTER);\n\n expectOutput('Before we get started');\n expectOutput('We recommend using Vite to build your worker instead');\n whenAsked('want to proceed with the Wrangler setup').respondWith(\n KEYS.ENTER,\n );\n })\n .step('configure source maps upload', ({ expectOutput, whenAsked }) => {\n expectOutput('Installing @sentry/cli');\n whenAsked('Is yarn deploy your build and deploy command?', {\n timeout: 60_000, // give CI some time to install @sentry/cli\n }).respondWith(KEYS.ENTER);\n expectOutput('Added a sentry:sourcemaps script to your package.json');\n expectOutput('Added a postdeploy script to your package.json');\n expectOutput(\n 'Modified your deploy script to enable uploading source maps',\n );\n expectOutput(\n 'Added auth token to .sentryclirc for you to test uploading source maps locally',\n );\n expectOutput('Created .sentryclirc');\n })\n .step('add auth token to CI/CD (skipped)', ({ whenAsked }) => {\n whenAsked(\n 'Are you using a CI/CD tool to build and deploy your application?',\n ).respondWith(KEYS.DOWN, KEYS.ENTER); // no\n })\n .expectOutput(\"That's it\")\n .run(getWizardCommand(Integration.sourcemaps));\n }, 60_000);\n\n afterAll(() => {\n cleanup();\n });\n\n it('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n it('adds and adjusts the respective package.json scripts', () => {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(projectDir, 'package.json'), 'utf8'),\n ) as PackageDotJson;\n\n expect(pkgJson?.scripts?.['sentry:sourcemaps']).toEqual(\n `_SENTRY_RELEASE=$(sentry-cli releases propose-version) && sentry-cli releases new $_SENTRY_RELEASE --org=${TEST_ARGS.ORG_SLUG} --project=${TEST_ARGS.PROJECT_SLUG} && sentry-cli sourcemaps upload --org=${TEST_ARGS.ORG_SLUG} --project=${TEST_ARGS.PROJECT_SLUG} --release=$_SENTRY_RELEASE --strip-prefix 'dist/..' dist`,\n );\n expect(pkgJson?.scripts?.['postdeploy']).toEqual('yarn sentry:sourcemaps');\n expect(pkgJson?.scripts?.['deploy']).toEqual(\n 'wrangler deploy --outdir dist --upload-source-maps --var SENTRY_RELEASE:$(sentry-cli releases propose-version)',\n );\n });\n\n it('adds sentry-cli as a devDependency', () => {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(projectDir, 'package.json'), 'utf8'),\n ) as PackageDotJson;\n\n expect(pkgJson?.devDependencies?.['@sentry/cli']).toBeDefined();\n });\n\n it('adds a .sentryclirc file', () => {\n checkSentryCliRc(projectDir);\n });\n});\n"]}
@@ -1,73 +1,48 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
- const path = __importStar(require("node:path"));
27
3
  const Constants_1 = require("../../lib/Constants");
28
4
  const utils_1 = require("../utils");
29
5
  const vitest_1 = require("vitest");
6
+ //@ts-expect-error - clifty is ESM only
7
+ const clifty_1 = require("clifty");
30
8
  (0, vitest_1.describe)('Expo', () => {
31
- const integration = Constants_1.Integration.reactNative;
32
- const projectDir = path.resolve(__dirname, '../test-applications/react-native-expo-test-app');
9
+ let wizardExitCode;
10
+ const { projectDir, cleanup } = (0, utils_1.createIsolatedTestEnv)('react-native-expo-test-app');
33
11
  (0, vitest_1.beforeAll)(async () => {
34
- const wizardInstance = (0, utils_1.startWizardInstance)(integration, projectDir);
35
- const packageManagerPrompted = await wizardInstance.waitForOutput('Please select your package manager.');
36
- const sessionReplayPrompted = packageManagerPrompted &&
37
- (await wizardInstance.sendStdinAndWaitForOutput(
38
- // Selecting `yarn` as the package manager
39
- [utils_1.KEYS.DOWN, utils_1.KEYS.DOWN, utils_1.KEYS.ENTER], 'Do you want to enable Session Replay to help debug issues? (See https://docs.sentry.io/platforms/react-native/session-replay/)'),
40
- {
41
- timeout: 240000,
42
- });
43
- const feedbackWidgetPrompted = sessionReplayPrompted &&
44
- (await wizardInstance.sendStdinAndWaitForOutput(
45
- // Enable session replay
46
- [utils_1.KEYS.ENTER], 'Do you want to enable the Feedback Widget to collect feedback from your users? (See https://docs.sentry.io/platforms/react-native/user-feedback/)'));
47
- const logsPrompted = feedbackWidgetPrompted &&
48
- (await wizardInstance.sendStdinAndWaitForOutput(
49
- // Enable feedback widget
50
- [utils_1.KEYS.ENTER], 'Do you want to enable Logs? (See https://docs.sentry.io/platforms/react-native/logs/)'));
51
- // Handle the MCP prompt (default is now Yes, so press DOWN to select No)
52
- const mcpPrompted = logsPrompted &&
53
- (await wizardInstance.sendStdinAndWaitForOutput(
54
- // Enable logs
55
- [utils_1.KEYS.ENTER], 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?', {
56
- optional: true,
57
- }));
58
- const testEventPrompted = mcpPrompted &&
59
- (await wizardInstance.sendStdinAndWaitForOutput(
60
- // Decline MCP config by selecting No
61
- [utils_1.KEYS.DOWN, utils_1.KEYS.ENTER], 'Have you successfully sent a test event?'));
62
- testEventPrompted &&
63
- (await wizardInstance.sendStdinAndWaitForOutput(
64
- // Respond that test event was sent
65
- [utils_1.KEYS.ENTER], 'Everything is set up!'));
66
- wizardInstance.kill();
12
+ wizardExitCode = await (0, clifty_1.withEnv)({
13
+ cwd: projectDir,
14
+ })
15
+ .defineInteraction()
16
+ .whenAsked('Please select your package manager.')
17
+ .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER)
18
+ .expectOutput('Installing @sentry/react-native')
19
+ .expectOutput('Installed @sentry/react-native', {
20
+ timeout: 240000,
21
+ })
22
+ .whenAsked('Do you want to enable Session Replay')
23
+ .respondWith(clifty_1.KEYS.ENTER)
24
+ .whenAsked('Do you want to enable the Feedback Widget to collect feedback from your users?')
25
+ .respondWith(clifty_1.KEYS.ENTER)
26
+ .whenAsked('Do you want to enable Logs')
27
+ .respondWith(clifty_1.KEYS.ENTER)
28
+ .expectOutput('Added Sentry.init to app/_layout.tsx')
29
+ .expectOutput('Added Sentry Expo plugin to app.config.json')
30
+ .expectOutput('Added .env.local to .gitignore')
31
+ .expectOutput('Written .env.local')
32
+ .expectOutput('Created metro.config.js with Sentry configuration')
33
+ .whenAsked('Optionally add a project-scoped MCP server configuration for the Sentry MCP?')
34
+ .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER)
35
+ .expectOutput('To make sure everything is set up correctly, put the following code snippet into your application.')
36
+ .whenAsked('Have you successfully sent a test event?')
37
+ .respondWith(clifty_1.KEYS.ENTER)
38
+ .expectOutput('Everything is set up!')
39
+ .run((0, utils_1.getWizardCommand)(Constants_1.Integration.reactNative));
67
40
  });
68
41
  (0, vitest_1.afterAll)(() => {
69
- (0, utils_1.revertLocalChanges)(projectDir);
70
- (0, utils_1.cleanupGit)(projectDir);
42
+ cleanup();
43
+ });
44
+ (0, vitest_1.test)('exits with exit code 0', () => {
45
+ (0, vitest_1.expect)(wizardExitCode).toBe(0);
71
46
  });
72
47
  (0, vitest_1.test)('package.json is updated correctly', () => {
73
48
  (0, utils_1.checkFileContents)(`${projectDir}/package.json`, `@sentry/react-native`);
@@ -1 +1 @@
1
- {"version":3,"file":"expo.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/expo.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\nimport { Integration } from '../../lib/Constants';\nimport {\n KEYS,\n TEST_ARGS,\n checkFileContents,\n checkFileExists,\n checkIfExpoBundles,\n cleanupGit,\n revertLocalChanges,\n startWizardInstance,\n} from '../utils';\nimport { afterAll, beforeAll, describe, test, expect } from 'vitest';\n\ndescribe('Expo', () => {\n const integration = Integration.reactNative;\n const projectDir = path.resolve(\n __dirname,\n '../test-applications/react-native-expo-test-app',\n );\n\n beforeAll(async () => {\n const wizardInstance = startWizardInstance(integration, projectDir);\n const packageManagerPrompted = await wizardInstance.waitForOutput(\n 'Please select your package manager.',\n );\n const sessionReplayPrompted =\n packageManagerPrompted &&\n (await wizardInstance.sendStdinAndWaitForOutput(\n // Selecting `yarn` as the package manager\n [KEYS.DOWN, KEYS.DOWN, KEYS.ENTER],\n 'Do you want to enable Session Replay to help debug issues? (See https://docs.sentry.io/platforms/react-native/session-replay/)',\n ),\n {\n timeout: 240_000,\n });\n const feedbackWidgetPrompted =\n sessionReplayPrompted &&\n (await wizardInstance.sendStdinAndWaitForOutput(\n // Enable session replay\n [KEYS.ENTER],\n 'Do you want to enable the Feedback Widget to collect feedback from your users? (See https://docs.sentry.io/platforms/react-native/user-feedback/)',\n ));\n\n const logsPrompted =\n feedbackWidgetPrompted &&\n (await wizardInstance.sendStdinAndWaitForOutput(\n // Enable feedback widget\n [KEYS.ENTER],\n 'Do you want to enable Logs? (See https://docs.sentry.io/platforms/react-native/logs/)',\n ));\n // Handle the MCP prompt (default is now Yes, so press DOWN to select No)\n const mcpPrompted =\n logsPrompted &&\n (await wizardInstance.sendStdinAndWaitForOutput(\n // Enable logs\n [KEYS.ENTER],\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n {\n optional: true,\n },\n ));\n const testEventPrompted =\n mcpPrompted &&\n (await wizardInstance.sendStdinAndWaitForOutput(\n // Decline MCP config by selecting No\n [KEYS.DOWN, KEYS.ENTER],\n 'Have you successfully sent a test event?',\n ));\n testEventPrompted &&\n (await wizardInstance.sendStdinAndWaitForOutput(\n // Respond that test event was sent\n [KEYS.ENTER],\n 'Everything is set up!',\n ));\n wizardInstance.kill();\n });\n\n afterAll(() => {\n revertLocalChanges(projectDir);\n cleanupGit(projectDir);\n });\n\n test('package.json is updated correctly', () => {\n checkFileContents(`${projectDir}/package.json`, `@sentry/react-native`);\n });\n\n test('_layout.tsx is updated correctly', () => {\n checkFileContents(\n `${projectDir}/app/_layout.tsx`,\n `import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: 'https://public@dsn.ingest.sentry.io/1337',\n\n // Adds more context data to events (IP address, cookies, user, etc.)\n // For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/\n sendDefaultPii: true,\n\n // Enable Logs\n enableLogs: true,\n\n // Configure Session Replay\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1,\n integrations: [Sentry.mobileReplayIntegration(), Sentry.feedbackIntegration()],\n\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: __DEV__,\n});`,\n );\n checkFileContents(\n `${projectDir}/app/_layout.tsx`,\n `export default Sentry.wrap(function RootLayout() {`,\n );\n });\n\n test('app.json is updated correctly', () => {\n checkFileContents(\n `${projectDir}/app.json`,\n `\"@sentry/react-native/expo\",\n {\n \"url\": \"https://sentry.io/\",\n \"project\": \"${TEST_ARGS.PROJECT_SLUG}\",\n \"organization\": \"${TEST_ARGS.ORG_SLUG}\"\n }`,\n );\n });\n\n test('metro.config.js is added', () => {\n checkFileExists(`${projectDir}/metro.config.js`);\n checkFileContents(\n `${projectDir}/metro.config.js`,\n `const { getSentryExpoConfig } = require(\"@sentry/react-native/metro\");\n\nconst config = getSentryExpoConfig(__dirname);\n\nmodule.exports = config;`,\n );\n });\n\n test('.gitignore is updated correctly', () => {\n checkFileContents(`${projectDir}/.gitignore`, `.env.local`);\n });\n\n test('android project is bundled correctly', async () => {\n const bundled = await checkIfExpoBundles(projectDir, 'android');\n expect(bundled).toBe(true);\n });\n\n test('ios project is bundled correctly', async () => {\n const bundled = await checkIfExpoBundles(projectDir, 'ios');\n expect(bundled).toBe(true);\n });\n\n test('web project is bundled correctly', async () => {\n const bundled = await checkIfExpoBundles(projectDir, 'web');\n expect(bundled).toBe(true);\n });\n});\n"]}
1
+ {"version":3,"file":"expo.test.js","sourceRoot":"","sources":["../../../e2e-tests/tests/expo.test.ts"],"names":[],"mappings":";;AAAA,mDAAkD;AAClD,oCAOkB;AAClB,mCAAqE;AAErE,uCAAuC;AACvC,mCAAuC;AAEvC,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,cAAsB,CAAC;IAC3B,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAA,6BAAqB,EACnD,4BAA4B,CAC7B,CAAC;IAEF,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;QACnB,cAAc,GAAG,MAAM,IAAA,gBAAO,EAAC;YAC7B,GAAG,EAAE,UAAU;SAChB,CAAC;aACC,iBAAiB,EAAE;aAEnB,SAAS,CAAC,qCAAqC,CAAC;aAChD,WAAW,CAAC,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,KAAK,CAAC;aAClC,YAAY,CAAC,iCAAiC,CAAC;aAC/C,YAAY,CAAC,gCAAgC,EAAE;YAC9C,OAAO,EAAE,MAAO;SACjB,CAAC;aAED,SAAS,CAAC,sCAAsC,CAAC;aACjD,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;aACvB,SAAS,CACR,gFAAgF,CACjF;aACA,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;aACvB,SAAS,CAAC,4BAA4B,CAAC;aACvC,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;aACvB,YAAY,CAAC,sCAAsC,CAAC;aACpD,YAAY,CAAC,6CAA6C,CAAC;aAC3D,YAAY,CAAC,gCAAgC,CAAC;aAC9C,YAAY,CAAC,oBAAoB,CAAC;aAClC,YAAY,CAAC,mDAAmD,CAAC;aAEjE,SAAS,CACR,8EAA8E,CAC/E;aACA,WAAW,CAAC,aAAI,CAAC,IAAI,EAAE,aAAI,CAAC,KAAK,CAAC;aAElC,YAAY,CACX,oGAAoG,CACrG;aACA,SAAS,CAAC,0CAA0C,CAAC;aACrD,WAAW,CAAC,aAAI,CAAC,KAAK,CAAC;aACvB,YAAY,CAAC,uBAAuB,CAAC;aAErC,GAAG,CAAC,IAAA,wBAAgB,EAAC,uBAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,GAAG,EAAE;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,IAAA,yBAAiB,EAAC,GAAG,UAAU,eAAe,EAAE,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,IAAA,yBAAiB,EACf,GAAG,UAAU,kBAAkB,EAC/B;;;;;;;;;;;;;;;;;;;IAmBF,CACC,CAAC;QACF,IAAA,yBAAiB,EACf,GAAG,UAAU,kBAAkB,EAC/B,oDAAoD,CACrD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,IAAA,yBAAiB,EACf,GAAG,UAAU,WAAW,EACxB;;;wBAGkB,iBAAS,CAAC,YAAY;6BACjB,iBAAS,CAAC,QAAQ;UACrC,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,IAAA,uBAAe,EAAC,GAAG,UAAU,kBAAkB,CAAC,CAAC;QACjD,IAAA,yBAAiB,EACf,GAAG,UAAU,kBAAkB,EAC/B;;;;yBAImB,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,IAAA,yBAAiB,EAAC,GAAG,UAAU,aAAa,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAkB,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAChE,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAkB,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAkB,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { Integration } from '../../lib/Constants';\nimport {\n TEST_ARGS,\n checkFileContents,\n checkFileExists,\n checkIfExpoBundles,\n createIsolatedTestEnv,\n getWizardCommand,\n} from '../utils';\nimport { afterAll, beforeAll, describe, test, expect } from 'vitest';\n\n//@ts-expect-error - clifty is ESM only\nimport { KEYS, withEnv } from 'clifty';\n\ndescribe('Expo', () => {\n let wizardExitCode: number;\n const { projectDir, cleanup } = createIsolatedTestEnv(\n 'react-native-expo-test-app',\n );\n\n beforeAll(async () => {\n wizardExitCode = await withEnv({\n cwd: projectDir,\n })\n .defineInteraction()\n\n .whenAsked('Please select your package manager.')\n .respondWith(KEYS.DOWN, KEYS.ENTER)\n .expectOutput('Installing @sentry/react-native')\n .expectOutput('Installed @sentry/react-native', {\n timeout: 240_000,\n })\n\n .whenAsked('Do you want to enable Session Replay')\n .respondWith(KEYS.ENTER)\n .whenAsked(\n 'Do you want to enable the Feedback Widget to collect feedback from your users?',\n )\n .respondWith(KEYS.ENTER)\n .whenAsked('Do you want to enable Logs')\n .respondWith(KEYS.ENTER)\n .expectOutput('Added Sentry.init to app/_layout.tsx')\n .expectOutput('Added Sentry Expo plugin to app.config.json')\n .expectOutput('Added .env.local to .gitignore')\n .expectOutput('Written .env.local')\n .expectOutput('Created metro.config.js with Sentry configuration')\n\n .whenAsked(\n 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?',\n )\n .respondWith(KEYS.DOWN, KEYS.ENTER)\n\n .expectOutput(\n 'To make sure everything is set up correctly, put the following code snippet into your application.',\n )\n .whenAsked('Have you successfully sent a test event?')\n .respondWith(KEYS.ENTER)\n .expectOutput('Everything is set up!')\n\n .run(getWizardCommand(Integration.reactNative));\n });\n\n afterAll(() => {\n cleanup();\n });\n\n test('exits with exit code 0', () => {\n expect(wizardExitCode).toBe(0);\n });\n\n test('package.json is updated correctly', () => {\n checkFileContents(`${projectDir}/package.json`, `@sentry/react-native`);\n });\n\n test('_layout.tsx is updated correctly', () => {\n checkFileContents(\n `${projectDir}/app/_layout.tsx`,\n `import * as Sentry from '@sentry/react-native';\n\nSentry.init({\n dsn: 'https://public@dsn.ingest.sentry.io/1337',\n\n // Adds more context data to events (IP address, cookies, user, etc.)\n // For more information, visit: https://docs.sentry.io/platforms/react-native/data-management/data-collected/\n sendDefaultPii: true,\n\n // Enable Logs\n enableLogs: true,\n\n // Configure Session Replay\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1,\n integrations: [Sentry.mobileReplayIntegration(), Sentry.feedbackIntegration()],\n\n // uncomment the line below to enable Spotlight (https://spotlightjs.com)\n // spotlight: __DEV__,\n});`,\n );\n checkFileContents(\n `${projectDir}/app/_layout.tsx`,\n `export default Sentry.wrap(function RootLayout() {`,\n );\n });\n\n test('app.json is updated correctly', () => {\n checkFileContents(\n `${projectDir}/app.json`,\n `\"@sentry/react-native/expo\",\n {\n \"url\": \"https://sentry.io/\",\n \"project\": \"${TEST_ARGS.PROJECT_SLUG}\",\n \"organization\": \"${TEST_ARGS.ORG_SLUG}\"\n }`,\n );\n });\n\n test('metro.config.js is added', () => {\n checkFileExists(`${projectDir}/metro.config.js`);\n checkFileContents(\n `${projectDir}/metro.config.js`,\n `const { getSentryExpoConfig } = require(\"@sentry/react-native/metro\");\n\nconst config = getSentryExpoConfig(__dirname);\n\nmodule.exports = config;`,\n );\n });\n\n test('.gitignore is updated correctly', () => {\n checkFileContents(`${projectDir}/.gitignore`, `.env.local`);\n });\n\n test('android project is bundled correctly', async () => {\n const bundled = await checkIfExpoBundles(projectDir, 'android');\n expect(bundled).toBe(true);\n });\n\n test('ios project is bundled correctly', async () => {\n const bundled = await checkIfExpoBundles(projectDir, 'ios');\n expect(bundled).toBe(true);\n });\n\n test('web project is bundled correctly', async () => {\n const bundled = await checkIfExpoBundles(projectDir, 'web');\n expect(bundled).toBe(true);\n });\n});\n"]}
@@ -24,117 +24,110 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const fs = __importStar(require("node:fs"));
27
- const path = __importStar(require("node:path"));
28
27
  const Constants_1 = require("../../lib/Constants");
29
28
  const utils_1 = require("../utils");
30
29
  const utils_2 = require("../utils");
31
- const utils_3 = require("../utils");
32
30
  const vitest_1 = require("vitest");
31
+ //@ts-expect-error - clifty is ESM only
32
+ const clifty_1 = require("clifty");
33
33
  (0, vitest_1.describe)('Flutter', () => {
34
- const integration = Constants_1.Integration.flutter;
35
- const projectDir = path.resolve(__dirname, '../test-applications/flutter-test-app');
36
34
  (0, vitest_1.describe)('with apple platforms', () => {
35
+ let wizardExitCode;
36
+ const { projectDir, cleanup } = (0, utils_1.createIsolatedTestEnv)('flutter-test-app');
37
37
  (0, vitest_1.beforeAll)(async () => {
38
- const wizardInstance = (0, utils_2.startWizardInstance)(integration, projectDir);
39
- const tracingOptionPrompted = await wizardInstance.waitForOutput(
40
- // "Do you want to enable Tracing", sometimes doesn't work as `Tracing` can be printed in bold.
41
- 'to track the performance of your application?');
42
- const profilingOptionPrompted = tracingOptionPrompted &&
43
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER],
44
- // "Do you want to enable Profiling", sometimes doesn't work as `Profiling` can be printed in bold.
45
- 'to analyze CPU usage and optimize performance-critical code on iOS & macOS?'));
46
- const replayOptionPrompted = profilingOptionPrompted &&
47
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER],
48
- // "Do you want to enable Session Replay", sometimes doesn't work as `Session Replay` can be printed in bold.
49
- 'to record user interactions and debug issues?'));
50
- const logsOptionPrompted = replayOptionPrompted &&
51
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER],
52
- // "Do you want to enable Logs", sometimes doesn't work as `Logs` can be printed in bold.
53
- 'to send your application logs to Sentry?'));
54
- // Handle the MCP prompt (default is now Yes, so press DOWN to select No)
55
- const mcpPrompted = logsOptionPrompted &&
56
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER], 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?', {
57
- optional: true,
58
- }));
59
- mcpPrompted &&
60
- (await wizardInstance.sendStdinAndWaitForOutput(
61
- // Decline MCP config by selecting No
62
- [utils_1.KEYS.DOWN, utils_1.KEYS.ENTER], 'Successfully installed the Sentry Flutter SDK!'));
63
- wizardInstance.kill();
38
+ wizardExitCode = await (0, clifty_1.withEnv)({
39
+ cwd: projectDir,
40
+ debug: true,
41
+ })
42
+ .defineInteraction()
43
+ .expectOutput('The Sentry Flutter Wizard will help you set up Sentry for your application')
44
+ .whenAsked('Do you want to enable Tracing')
45
+ .respondWith(clifty_1.KEYS.ENTER)
46
+ .whenAsked('to analyze CPU usage and optimize performance-critical code on iOS & macOS?')
47
+ .respondWith(clifty_1.KEYS.ENTER)
48
+ .whenAsked('to record user interactions and debug issues?')
49
+ .respondWith(clifty_1.KEYS.ENTER)
50
+ .whenAsked('to send your application logs to Sentry?')
51
+ .respondWith(clifty_1.KEYS.ENTER)
52
+ .whenAsked('Optionally add a project-scoped MCP server configuration for the Sentry MCP?')
53
+ .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER)
54
+ .expectOutput('Successfully installed the Sentry Flutter SDK!')
55
+ .run((0, utils_1.getWizardCommand)(Constants_1.Integration.flutter));
64
56
  });
65
57
  (0, vitest_1.afterAll)(() => {
66
- (0, utils_1.revertLocalChanges)(projectDir);
67
- (0, utils_1.cleanupGit)(projectDir);
58
+ cleanup();
59
+ });
60
+ (0, vitest_1.test)('exits with exit code 0', () => {
61
+ (0, vitest_1.expect)(wizardExitCode).toBe(0);
68
62
  });
69
63
  (0, vitest_1.test)('pubspec.yaml is updated.', () => {
70
- (0, utils_3.checkFileContents)(`${projectDir}/pubspec.yaml`, `sentry_flutter:`); // dependencies
71
- (0, utils_3.checkFileContents)(`${projectDir}/pubspec.yaml`, `sentry_dart_plugin:`); // dev_dependencies
72
- (0, utils_3.checkFileContents)(`${projectDir}/pubspec.yaml`, `sentry:`); // gradle plugin options
64
+ (0, utils_2.checkFileContents)(`${projectDir}/pubspec.yaml`, `sentry_flutter:`); // dependencies
65
+ (0, utils_2.checkFileContents)(`${projectDir}/pubspec.yaml`, `sentry_dart_plugin:`); // dev_dependencies
66
+ (0, utils_2.checkFileContents)(`${projectDir}/pubspec.yaml`, `sentry:`); // gradle plugin options
73
67
  });
74
68
  (0, vitest_1.test)('sentry.properties exists and has auth token', () => {
75
- (0, utils_3.checkSentryProperties)(projectDir);
69
+ (0, utils_2.checkSentryProperties)(projectDir);
76
70
  });
77
71
  (0, vitest_1.test)('.gitignore has sentry.properties', () => {
78
- (0, utils_3.checkFileContents)(`${projectDir}/.gitignore`, `sentry.properties`);
72
+ (0, utils_2.checkFileContents)(`${projectDir}/.gitignore`, `sentry.properties`);
79
73
  });
80
74
  (0, vitest_1.test)('lib/main.dart calls sentry init', () => {
81
- (0, utils_3.checkFileContents)(`${projectDir}/lib/main.dart`, `import 'package:sentry_flutter/sentry_flutter.dart';`);
82
- (0, utils_3.checkFileContents)(`${projectDir}/lib/main.dart`, `await SentryFlutter.init(`);
75
+ (0, utils_2.checkFileContents)(`${projectDir}/lib/main.dart`, `import 'package:sentry_flutter/sentry_flutter.dart';`);
76
+ (0, utils_2.checkFileContents)(`${projectDir}/lib/main.dart`, `await SentryFlutter.init(`);
83
77
  });
84
78
  (0, vitest_1.test)('lib/main.dart enables tracing and profiling', () => {
85
- (0, utils_3.checkFileContents)(`${projectDir}/lib/main.dart`, `options.tracesSampleRate = 1.0;`);
86
- (0, utils_3.checkFileContents)(`${projectDir}/lib/main.dart`, `options.profilesSampleRate = 1.0;`);
79
+ (0, utils_2.checkFileContents)(`${projectDir}/lib/main.dart`, `options.tracesSampleRate = 1.0;`);
80
+ (0, utils_2.checkFileContents)(`${projectDir}/lib/main.dart`, `options.profilesSampleRate = 1.0;`);
87
81
  });
88
82
  (0, vitest_1.test)('lib/main.dart enables logs', () => {
89
- (0, utils_3.checkFileContents)(`${projectDir}/lib/main.dart`, `options.enableLogs = true;`);
83
+ (0, utils_2.checkFileContents)(`${projectDir}/lib/main.dart`, `options.enableLogs = true;`);
90
84
  });
91
85
  (0, vitest_1.test)('builds correctly', async () => {
92
- await (0, utils_3.checkIfFlutterBuilds)(projectDir, '✓ Built build/web');
86
+ await (0, utils_2.checkIfFlutterBuilds)(projectDir, '✓ Built build/web');
93
87
  });
94
88
  });
95
89
  (0, vitest_1.describe)('without apple platforms', () => {
90
+ let wizardExitCode;
91
+ const { projectDir, cleanup } = (0, utils_1.createIsolatedTestEnv)('flutter-test-app');
96
92
  (0, vitest_1.beforeAll)(async () => {
97
- const wizardInstance = (0, utils_2.startWizardInstance)(integration, projectDir);
93
+ // Remove apple platform directories to simulate non-apple setup
98
94
  if (fs.existsSync(`${projectDir}/ios`)) {
99
95
  fs.renameSync(`${projectDir}/ios`, `${projectDir}/_ios`);
100
96
  }
101
97
  if (fs.existsSync(`${projectDir}/macos`)) {
102
98
  fs.renameSync(`${projectDir}/macos`, `${projectDir}/_macos`);
103
99
  }
104
- const continueOnUncommitedFilesPromted = await wizardInstance.waitForOutput('Do you want to continue anyway?');
105
- const tracingOptionPrompted = continueOnUncommitedFilesPromted &&
106
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER],
107
- // "Do you want to enable Tracing", sometimes doesn't work as `Tracing` can be printed in bold.
108
- 'to track the performance of your application?'));
109
- const replayOptionPrompted = tracingOptionPrompted &&
110
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER],
111
- // "Do you want to enable Session Replay", sometimes doesn't work as `Session Replay` can be printed in bold.
112
- 'to record user interactions and debug issues?'));
113
- const logsOptionPrompted = replayOptionPrompted &&
114
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER],
115
- // "Do you want to enable Logs", sometimes doesn't work as `Logs` can be printed in bold.
116
- 'to send your application logs to Sentry?'));
117
- // Handle the MCP prompt (default is now Yes, so press DOWN to select No)
118
- const mcpPrompted = logsOptionPrompted &&
119
- (await wizardInstance.sendStdinAndWaitForOutput([utils_1.KEYS.ENTER], 'Optionally add a project-scoped MCP server configuration for the Sentry MCP?', {
120
- optional: true,
121
- }));
122
- mcpPrompted &&
123
- (await wizardInstance.sendStdinAndWaitForOutput(
124
- // Decline MCP config by selecting No
125
- [utils_1.KEYS.DOWN, utils_1.KEYS.ENTER], 'Successfully installed the Sentry Flutter SDK!'));
126
- wizardInstance.kill();
100
+ wizardExitCode = await (0, clifty_1.withEnv)({
101
+ cwd: projectDir,
102
+ debug: true,
103
+ })
104
+ .defineInteraction()
105
+ .whenAsked('Do you want to continue anyway?')
106
+ .respondWith(clifty_1.KEYS.ENTER)
107
+ .expectOutput('The Sentry Flutter Wizard will help you set up Sentry for your application')
108
+ .whenAsked('Do you want to enable Tracing')
109
+ .respondWith(clifty_1.KEYS.ENTER)
110
+ .whenAsked('to record user interactions and debug issues?')
111
+ .respondWith(clifty_1.KEYS.ENTER)
112
+ .whenAsked('to send your application logs to Sentry?')
113
+ .respondWith(clifty_1.KEYS.ENTER)
114
+ .whenAsked('Optionally add a project-scoped MCP server configuration for the Sentry MCP?')
115
+ .respondWith(clifty_1.KEYS.DOWN, clifty_1.KEYS.ENTER)
116
+ .expectOutput('Successfully installed the Sentry Flutter SDK!')
117
+ .run((0, utils_1.getWizardCommand)(Constants_1.Integration.flutter));
127
118
  });
128
119
  (0, vitest_1.afterAll)(() => {
129
- (0, utils_1.revertLocalChanges)(projectDir);
130
- (0, utils_1.cleanupGit)(projectDir);
120
+ cleanup();
121
+ });
122
+ (0, vitest_1.test)('exits with exit code 0', () => {
123
+ (0, vitest_1.expect)(wizardExitCode).toBe(0);
131
124
  });
132
125
  (0, vitest_1.test)('lib/main.dart does not add profiling with missing ios and macos folder', () => {
133
126
  const fileContent = fs.readFileSync(`${projectDir}/lib/main.dart`, 'utf-8');
134
127
  (0, vitest_1.expect)(fileContent).not.toContain(`options.profilesSampleRate = 1.0;`);
135
128
  });
136
129
  (0, vitest_1.test)('lib/main.dart enables logs', () => {
137
- (0, utils_3.checkFileContents)(`${projectDir}/lib/main.dart`, `options.enableLogs = true;`);
130
+ (0, utils_2.checkFileContents)(`${projectDir}/lib/main.dart`, `options.enableLogs = true;`);
138
131
  });
139
132
  });
140
133
  });