@sentry/wizard 4.0.0 → 4.0.2
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.
- package/CHANGELOG.md +11 -2
- package/dist/NextJs/configs/next.config.js +1 -1
- package/dist/bin.js +2 -1
- package/dist/bin.js.map +1 -1
- package/dist/bump-version.js +28 -0
- package/dist/craft-pre-release.sh +2 -0
- package/dist/lib/Steps/Initial.js +2 -12
- package/dist/lib/Steps/Initial.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.js +1 -1
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/src/nextjs/templates.js +1 -1
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/run.js +2 -18
- package/dist/src/run.js.map +1 -1
- package/dist/src/telemetry.js +2 -16
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +16 -0
- package/dist/src/utils/clack-utils.js +53 -45
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +7 -0
- package/dist/src/version.js.map +1 -0
- package/dist/test/nextjs/templates.test.js +4 -4
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/utils/clack-utils.test.js +52 -0
- package/dist/test/utils/clack-utils.test.js.map +1 -1
- package/package.json +5 -2
- package/.node-cache/node-v22.14.0-darwin-arm64 +0 -0
- package/.node-cache/node-v22.14.0-darwin-x64 +0 -0
- package/.node-cache/node-v22.14.0-linux-arm64 +0 -0
- package/.node-cache/node-v22.14.0-linux-x64 +0 -0
- package/.node-cache/node-v22.14.0-win-x64.exe +0 -0
- package/COPYING +0 -3575
- package/bin.ts +0 -143
- package/codecov.yml +0 -15
- package/e2e-tests/.env.example +0 -11
- package/e2e-tests/README.md +0 -63
- package/e2e-tests/jest.config.ts +0 -22
- package/e2e-tests/package.json +0 -14
- package/e2e-tests/run.sh +0 -15
- package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj +0 -52
- package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
- package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/project.pbxproj +0 -62
- package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj +0 -470
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +0 -78
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/ContentView.swift +0 -7
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/Project1App.swift +0 -10
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/ContentView.swift +0 -7
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/Project2App.swift +0 -10
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/project.pbxproj +0 -382
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/xcshareddata/xcschemes/Project.xcscheme +0 -78
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/ContentView.swift +0 -7
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/MainApp.swift +0 -10
- package/e2e-tests/test-applications/flutter-test-app/.metadata +0 -45
- package/e2e-tests/test-applications/flutter-test-app/README.md +0 -16
- package/e2e-tests/test-applications/flutter-test-app/analysis_options.yaml +0 -28
- package/e2e-tests/test-applications/flutter-test-app/android/app/build.gradle +0 -44
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/debug/AndroidManifest.xml +0 -7
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/AndroidManifest.xml +0 -45
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/kotlin/com/example/flutter_magic/MainActivity.kt +0 -5
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable/launch_background.xml +0 -12
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable-v21/launch_background.xml +0 -12
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values/styles.xml +0 -18
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values-night/styles.xml +0 -18
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/profile/AndroidManifest.xml +0 -7
- package/e2e-tests/test-applications/flutter-test-app/android/build.gradle +0 -18
- package/e2e-tests/test-applications/flutter-test-app/android/gradle/wrapper/gradle-wrapper.properties +0 -5
- package/e2e-tests/test-applications/flutter-test-app/android/gradle.properties +0 -3
- package/e2e-tests/test-applications/flutter-test-app/android/settings.gradle +0 -25
- package/e2e-tests/test-applications/flutter-test-app/lib/main.dart +0 -125
- package/e2e-tests/test-applications/flutter-test-app/linux/CMakeLists.txt +0 -145
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/CMakeLists.txt +0 -88
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.cc +0 -11
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.h +0 -15
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugins.cmake +0 -23
- package/e2e-tests/test-applications/flutter-test-app/linux/main.cc +0 -6
- package/e2e-tests/test-applications/flutter-test-app/linux/my_application.cc +0 -124
- package/e2e-tests/test-applications/flutter-test-app/linux/my_application.h +0 -18
- package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Debug.xcconfig +0 -2
- package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Release.xcconfig +0 -2
- package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/GeneratedPluginRegistrant.swift +0 -10
- package/e2e-tests/test-applications/flutter-test-app/macos/Podfile +0 -43
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/AppDelegate.swift +0 -9
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -68
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Base.lproj/MainMenu.xib +0 -343
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/AppInfo.xcconfig +0 -14
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Debug.xcconfig +0 -2
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Release.xcconfig +0 -2
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Warnings.xcconfig +0 -13
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/DebugProfile.entitlements +0 -12
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Info.plist +0 -32
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/MainFlutterWindow.swift +0 -15
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Release.entitlements +0 -8
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.pbxproj +0 -705
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -98
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/contents.xcworkspacedata +0 -7
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/e2e-tests/test-applications/flutter-test-app/macos/RunnerTests/RunnerTests.swift +0 -12
- package/e2e-tests/test-applications/flutter-test-app/pubspec.lock +0 -213
- package/e2e-tests/test-applications/flutter-test-app/pubspec.yaml +0 -89
- package/e2e-tests/test-applications/flutter-test-app/test/widget_test.dart +0 -30
- package/e2e-tests/test-applications/flutter-test-app/web/favicon.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-192.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-512.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-192.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-512.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/index.html +0 -38
- package/e2e-tests/test-applications/flutter-test-app/web/manifest.json +0 -35
- package/e2e-tests/test-applications/flutter-test-app/windows/CMakeLists.txt +0 -108
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/CMakeLists.txt +0 -109
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.cc +0 -11
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.h +0 -15
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugins.cmake +0 -23
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/CMakeLists.txt +0 -40
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/Runner.rc +0 -121
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.cpp +0 -71
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.h +0 -33
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/main.cpp +0 -43
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/resource.h +0 -16
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/resources/app_icon.ico +0 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/runner.exe.manifest +0 -14
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.cpp +0 -65
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.h +0 -19
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.cpp +0 -288
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.h +0 -102
- package/e2e-tests/test-applications/nextjs-test-app/next.config.mjs +0 -4
- package/e2e-tests/test-applications/nextjs-test-app/package.json +0 -22
- package/e2e-tests/test-applications/nextjs-test-app/src/app/layout.tsx +0 -20
- package/e2e-tests/test-applications/nextjs-test-app/src/app/page.tsx +0 -90
- package/e2e-tests/test-applications/nuxt-3-test-app/README.md +0 -75
- package/e2e-tests/test-applications/nuxt-3-test-app/nuxt.config.ts +0 -5
- package/e2e-tests/test-applications/nuxt-3-test-app/package.json +0 -18
- package/e2e-tests/test-applications/nuxt-3-test-app/public/favicon.ico +0 -0
- package/e2e-tests/test-applications/nuxt-3-test-app/public/robots.txt +0 -1
- package/e2e-tests/test-applications/nuxt-4-test-app/README.md +0 -75
- package/e2e-tests/test-applications/nuxt-4-test-app/nuxt.config.ts +0 -6
- package/e2e-tests/test-applications/nuxt-4-test-app/package.json +0 -18
- package/e2e-tests/test-applications/nuxt-4-test-app/public/favicon.ico +0 -0
- package/e2e-tests/test-applications/nuxt-4-test-app/public/robots.txt +0 -1
- package/e2e-tests/test-applications/remix-test-app/app/entry.client.tsx +0 -18
- package/e2e-tests/test-applications/remix-test-app/app/entry.server.tsx +0 -140
- package/e2e-tests/test-applications/remix-test-app/app/root.tsx +0 -30
- package/e2e-tests/test-applications/remix-test-app/app/routes/_index.tsx +0 -48
- package/e2e-tests/test-applications/remix-test-app/app/tailwind.css +0 -3
- package/e2e-tests/test-applications/remix-test-app/package.json +0 -37
- package/e2e-tests/test-applications/remix-test-app/postcss.config.js +0 -6
- package/e2e-tests/test-applications/remix-test-app/tailwind.config.ts +0 -9
- package/e2e-tests/test-applications/remix-test-app/vite.config.ts +0 -16
- package/e2e-tests/test-applications/sveltekit-test-app/package.json +0 -21
- package/e2e-tests/test-applications/sveltekit-test-app/src/app.d.ts +0 -13
- package/e2e-tests/test-applications/sveltekit-test-app/src/app.html +0 -11
- package/e2e-tests/test-applications/sveltekit-test-app/src/lib/index.ts +0 -1
- package/e2e-tests/test-applications/sveltekit-test-app/src/routes/+page.svelte +0 -2
- package/e2e-tests/test-applications/sveltekit-test-app/svelte.config.js +0 -18
- package/e2e-tests/test-applications/sveltekit-test-app/vite.config.ts +0 -6
- package/e2e-tests/tests/flutter.test.ts +0 -127
- package/e2e-tests/tests/nextjs.test.ts +0 -161
- package/e2e-tests/tests/nuxt-3.test.ts +0 -189
- package/e2e-tests/tests/nuxt-4.test.ts +0 -188
- package/e2e-tests/tests/remix.test.ts +0 -277
- package/e2e-tests/tests/sveltekit.test.ts +0 -284
- package/e2e-tests/utils/index.ts +0 -456
- package/index.ts +0 -2
- package/lib/Constants.ts +0 -118
- package/lib/Helper/BottomBar.ts +0 -28
- package/lib/Helper/Env.ts +0 -7
- package/lib/Helper/File.ts +0 -65
- package/lib/Helper/Git.ts +0 -39
- package/lib/Helper/Logging.ts +0 -44
- package/lib/Helper/MergeConfig.ts +0 -19
- package/lib/Helper/Package.ts +0 -80
- package/lib/Helper/SentryCli.ts +0 -139
- package/lib/Helper/Wizard.ts +0 -58
- package/lib/Helper/__tests__/File.ts +0 -15
- package/lib/Helper/__tests__/MergeConfig.ts +0 -98
- package/lib/Helper/__tests__/SentryCli.ts +0 -86
- package/lib/Helper/test-fixtures/next.config.1-merged.js +0 -18
- package/lib/Helper/test-fixtures/next.config.1.js +0 -6
- package/lib/Helper/test-fixtures/next.config.2.js +0 -8
- package/lib/Helper/test-fixtures/next.config.3-merged.js +0 -21
- package/lib/Helper/test-fixtures/next.config.3.js +0 -9
- package/lib/Helper/test-fixtures/next.config.4-merged.js +0 -21
- package/lib/Helper/test-fixtures/next.config.4.js +0 -9
- package/lib/Setup.ts +0 -40
- package/lib/Steps/BaseStep.ts +0 -25
- package/lib/Steps/ChooseIntegration.ts +0 -144
- package/lib/Steps/ConfigureProject.ts +0 -10
- package/lib/Steps/Initial.ts +0 -35
- package/lib/Steps/Integrations/BaseIntegration.ts +0 -42
- package/lib/Steps/Integrations/Cordova.ts +0 -283
- package/lib/Steps/Integrations/Electron.ts +0 -164
- package/lib/Steps/Integrations/MobileProject.ts +0 -72
- package/lib/Steps/OpenSentry.ts +0 -80
- package/lib/Steps/PromptForParameters.ts +0 -200
- package/lib/Steps/Result.ts +0 -22
- package/lib/Steps/SentryProjectSelector.ts +0 -83
- package/lib/Steps/ShouldConfigure.ts +0 -10
- package/lib/Steps/WaitForSentry.ts +0 -56
- package/lib/Steps/Welcome.ts +0 -21
- package/lib/Steps/index.ts +0 -10
- package/lib/__tests__/Env.ts +0 -29
- package/scripts/NextJs/configs/_error.js +0 -39
- package/scripts/NextJs/configs/next.config.js +0 -36
- package/scripts/NextJs/configs/next.config.template.js +0 -12
- package/scripts/NextJs/configs/sentry.client.config.js +0 -17
- package/scripts/NextJs/configs/sentry.edge.config.js +0 -17
- package/scripts/NextJs/configs/sentry.server.config.js +0 -17
- package/scripts/NextJs/sentry_sample_error.js +0 -47
- package/scripts/craft-pre-release.sh +0 -10
- package/src/android/android-wizard.ts +0 -192
- package/src/android/code-tools.ts +0 -170
- package/src/android/gradle.ts +0 -250
- package/src/android/manifest.ts +0 -180
- package/src/android/templates.ts +0 -86
- package/src/apple/apple-wizard.ts +0 -269
- package/src/apple/cocoapod.ts +0 -73
- package/src/apple/code-tools.ts +0 -147
- package/src/apple/fastlane.ts +0 -170
- package/src/apple/templates.ts +0 -65
- package/src/apple/xcode-manager.ts +0 -404
- package/src/flutter/code-tools.ts +0 -284
- package/src/flutter/flutter-wizard.ts +0 -164
- package/src/flutter/templates.ts +0 -90
- package/src/nextjs/nextjs-wizard.ts +0 -1007
- package/src/nextjs/templates.ts +0 -525
- package/src/nextjs/utils.ts +0 -21
- package/src/nuxt/nuxt-wizard.ts +0 -188
- package/src/nuxt/sdk-example.ts +0 -135
- package/src/nuxt/sdk-setup.ts +0 -352
- package/src/nuxt/templates.ts +0 -303
- package/src/nuxt/types.ts +0 -8
- package/src/nuxt/utils.ts +0 -42
- package/src/react-native/expo-env-file.ts +0 -55
- package/src/react-native/expo-metro.ts +0 -212
- package/src/react-native/expo.ts +0 -175
- package/src/react-native/git.ts +0 -25
- package/src/react-native/glob.ts +0 -13
- package/src/react-native/gradle.ts +0 -26
- package/src/react-native/javascript.ts +0 -103
- package/src/react-native/metro.ts +0 -599
- package/src/react-native/options.ts +0 -5
- package/src/react-native/react-native-wizard.ts +0 -512
- package/src/react-native/uninstall.ts +0 -109
- package/src/react-native/xcode.ts +0 -302
- package/src/remix/codemods/express-server.ts +0 -44
- package/src/remix/codemods/handle-error.ts +0 -118
- package/src/remix/codemods/root-common.ts +0 -63
- package/src/remix/codemods/root-v1.ts +0 -41
- package/src/remix/codemods/root-v2.ts +0 -153
- package/src/remix/remix-wizard.ts +0 -261
- package/src/remix/sdk-example.ts +0 -120
- package/src/remix/sdk-setup.ts +0 -546
- package/src/remix/templates.ts +0 -11
- package/src/remix/utils.ts +0 -96
- package/src/run.ts +0 -211
- package/src/sourcemaps/sourcemaps-wizard.ts +0 -364
- package/src/sourcemaps/tools/angular.ts +0 -42
- package/src/sourcemaps/tools/create-react-app.ts +0 -19
- package/src/sourcemaps/tools/esbuild.ts +0 -65
- package/src/sourcemaps/tools/nextjs.ts +0 -114
- package/src/sourcemaps/tools/remix.ts +0 -90
- package/src/sourcemaps/tools/rollup.ts +0 -67
- package/src/sourcemaps/tools/sentry-cli.ts +0 -287
- package/src/sourcemaps/tools/tsc.ts +0 -144
- package/src/sourcemaps/tools/types.ts +0 -11
- package/src/sourcemaps/tools/vite.ts +0 -300
- package/src/sourcemaps/tools/webpack.ts +0 -383
- package/src/sourcemaps/utils/detect-tool.ts +0 -46
- package/src/sourcemaps/utils/other-wizards.ts +0 -167
- package/src/sourcemaps/utils/sdk-version.ts +0 -266
- package/src/sveltekit/sdk-example.ts +0 -56
- package/src/sveltekit/sdk-setup.ts +0 -667
- package/src/sveltekit/sveltekit-wizard.ts +0 -192
- package/src/sveltekit/templates.ts +0 -185
- package/src/sveltekit/utils.ts +0 -50
- package/src/telemetry.ts +0 -144
- package/src/utils/ast-utils.ts +0 -270
- package/src/utils/bash.ts +0 -57
- package/src/utils/clack-utils.ts +0 -1536
- package/src/utils/debug.ts +0 -20
- package/src/utils/package-json.ts +0 -51
- package/src/utils/package-manager.ts +0 -172
- package/src/utils/release-registry.ts +0 -19
- package/src/utils/semver.ts +0 -33
- package/src/utils/sentrycli-utils.ts +0 -24
- package/src/utils/string.ts +0 -7
- package/src/utils/types.ts +0 -77
- package/src/utils/url.ts +0 -27
- package/src/utils/vendor/is-unicorn-supported.ts +0 -29
- package/test/android/code-tools.test.ts +0 -49
- package/test/apple/cocoapod.test.ts +0 -310
- package/test/apple/code-tools.test.ts +0 -1042
- package/test/apple/fastfile.test.ts +0 -555
- package/test/apple/templates.test.ts +0 -191
- package/test/apple/xcode-manager.test.ts +0 -1068
- package/test/flutter/code-tools.test.ts +0 -212
- package/test/flutter/templates.test.ts +0 -100
- package/test/nextjs/templates.test.ts +0 -429
- package/test/nuxt/templates.test.ts +0 -255
- package/test/react-native/expo-metro.test.ts +0 -81
- package/test/react-native/expo.test.ts +0 -86
- package/test/react-native/gradle.test.ts +0 -310
- package/test/react-native/javascript.test.ts +0 -134
- package/test/react-native/metro.test.ts +0 -396
- package/test/react-native/xcode.test.ts +0 -401
- package/test/remix/client-entry.test.ts +0 -122
- package/test/remix/server-instrumentation.test.ts +0 -36
- package/test/sourcemaps/tools/sentry-cli.test.ts +0 -57
- package/test/sourcemaps/tools/tsc.test.ts +0 -181
- package/test/sourcemaps/tools/vite.test.ts +0 -149
- package/test/sourcemaps/tools/webpack.test.ts +0 -303
- package/test/sveltekit/templates.test.ts +0 -152
- package/test/utils/ast-utils.test.ts +0 -264
- package/test/utils/clack-utils.test.ts +0 -224
- package/types/read-env.d.ts +0 -3
- package/types/xcode.d.ts +0 -527
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export type SourceMapUploadToolConfigurationOptions = {
|
|
2
|
-
selfHosted: boolean;
|
|
3
|
-
url: string;
|
|
4
|
-
authToken: string;
|
|
5
|
-
orgSlug: string;
|
|
6
|
-
projectSlug: string;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export type SourceMapUploadToolConfigurationFunction = (
|
|
10
|
-
options: SourceMapUploadToolConfigurationOptions,
|
|
11
|
-
) => Promise<void>;
|
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
2
|
-
import * as clack from '@clack/prompts';
|
|
3
|
-
// @ts-ignore - magicast is ESM and TS complains about that. It works though
|
|
4
|
-
import { generateCode, parseModule } from 'magicast';
|
|
5
|
-
// @ts-ignore - magicast is ESM and TS complains about that. It works though
|
|
6
|
-
import { addVitePlugin } from 'magicast/helpers';
|
|
7
|
-
|
|
8
|
-
import type { namedTypes as t } from 'ast-types';
|
|
9
|
-
|
|
10
|
-
import * as recast from 'recast';
|
|
11
|
-
|
|
12
|
-
import * as Sentry from '@sentry/node';
|
|
13
|
-
|
|
14
|
-
import chalk from 'chalk';
|
|
15
|
-
import {
|
|
16
|
-
abortIfCancelled,
|
|
17
|
-
addDotEnvSentryBuildPluginFile,
|
|
18
|
-
askForToolConfigPath,
|
|
19
|
-
createNewConfigFile,
|
|
20
|
-
getPackageDotJson,
|
|
21
|
-
installPackage,
|
|
22
|
-
makeCodeSnippet,
|
|
23
|
-
showCopyPasteInstructions,
|
|
24
|
-
} from '../../utils/clack-utils';
|
|
25
|
-
import { hasPackageInstalled } from '../../utils/package-json';
|
|
26
|
-
|
|
27
|
-
import {
|
|
28
|
-
SourceMapUploadToolConfigurationFunction,
|
|
29
|
-
SourceMapUploadToolConfigurationOptions,
|
|
30
|
-
} from './types';
|
|
31
|
-
import { findFile, hasSentryContent } from '../../utils/ast-utils';
|
|
32
|
-
|
|
33
|
-
import * as path from 'path';
|
|
34
|
-
import * as fs from 'fs';
|
|
35
|
-
import { debug } from '../../utils/debug';
|
|
36
|
-
|
|
37
|
-
const getViteConfigSnippet = (
|
|
38
|
-
options: SourceMapUploadToolConfigurationOptions,
|
|
39
|
-
colors: boolean,
|
|
40
|
-
) =>
|
|
41
|
-
makeCodeSnippet(colors, (unchanged, plus, _) =>
|
|
42
|
-
unchanged(`import { defineConfig } from "vite";
|
|
43
|
-
${plus('import { sentryVitePlugin } from "@sentry/vite-plugin";')}
|
|
44
|
-
|
|
45
|
-
export default defineConfig({
|
|
46
|
-
build: {
|
|
47
|
-
${plus('sourcemap: true, // Source map generation must be turned on')}
|
|
48
|
-
},
|
|
49
|
-
plugins: [
|
|
50
|
-
// Put the Sentry vite plugin after all other plugins
|
|
51
|
-
${plus(`sentryVitePlugin({
|
|
52
|
-
authToken: process.env.SENTRY_AUTH_TOKEN,
|
|
53
|
-
org: "${options.orgSlug}",
|
|
54
|
-
project: "${options.projectSlug}",${
|
|
55
|
-
options.selfHosted ? `\n url: "${options.url}",` : ''
|
|
56
|
-
}
|
|
57
|
-
}),`)}
|
|
58
|
-
],
|
|
59
|
-
});`),
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
export const configureVitePlugin: SourceMapUploadToolConfigurationFunction =
|
|
63
|
-
async (options) => {
|
|
64
|
-
await installPackage({
|
|
65
|
-
packageName: '@sentry/vite-plugin',
|
|
66
|
-
alreadyInstalled: hasPackageInstalled(
|
|
67
|
-
'@sentry/vite-plugin',
|
|
68
|
-
await getPackageDotJson(),
|
|
69
|
-
),
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
const viteConfigPath =
|
|
73
|
-
findFile(path.resolve(process.cwd(), 'vite.config')) ??
|
|
74
|
-
(await askForToolConfigPath('Vite', 'vite.config.js'));
|
|
75
|
-
|
|
76
|
-
let successfullyAdded = false;
|
|
77
|
-
if (viteConfigPath) {
|
|
78
|
-
successfullyAdded = await addVitePluginToConfig(viteConfigPath, options);
|
|
79
|
-
} else {
|
|
80
|
-
successfullyAdded = await createNewConfigFile(
|
|
81
|
-
path.join(process.cwd(), 'vite.config.js'),
|
|
82
|
-
getViteConfigSnippet(options, false),
|
|
83
|
-
'More information about vite configs: https://vitejs.dev/config/',
|
|
84
|
-
);
|
|
85
|
-
Sentry.setTag(
|
|
86
|
-
'created-new-config',
|
|
87
|
-
successfullyAdded ? 'success' : 'fail',
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (successfullyAdded) {
|
|
92
|
-
clack.log.info(
|
|
93
|
-
`We recommend checking the ${
|
|
94
|
-
viteConfigPath ? 'modified' : 'added'
|
|
95
|
-
} file after the wizard finished to ensure it works with your build setup.`,
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
Sentry.setTag('ast-mod', 'success');
|
|
99
|
-
} else {
|
|
100
|
-
Sentry.setTag('ast-mod', 'fail');
|
|
101
|
-
await showCopyPasteInstructions(
|
|
102
|
-
path.basename(viteConfigPath || 'vite.config.js'),
|
|
103
|
-
getViteConfigSnippet(options, true),
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
await addDotEnvSentryBuildPluginFile(options.authToken);
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export async function addVitePluginToConfig(
|
|
111
|
-
viteConfigPath: string,
|
|
112
|
-
options: SourceMapUploadToolConfigurationOptions,
|
|
113
|
-
): Promise<boolean> {
|
|
114
|
-
try {
|
|
115
|
-
const prettyViteConfigFilename = chalk.cyan(path.basename(viteConfigPath));
|
|
116
|
-
|
|
117
|
-
const viteConfigContent = (
|
|
118
|
-
await fs.promises.readFile(viteConfigPath)
|
|
119
|
-
).toString();
|
|
120
|
-
|
|
121
|
-
const mod = parseModule(viteConfigContent);
|
|
122
|
-
|
|
123
|
-
if (hasSentryContent(mod.$ast as t.Program)) {
|
|
124
|
-
const shouldContinue = await abortIfCancelled(
|
|
125
|
-
clack.select({
|
|
126
|
-
message: `${prettyViteConfigFilename} already contains Sentry-related code. Should the wizard modify it anyway?`,
|
|
127
|
-
options: [
|
|
128
|
-
{
|
|
129
|
-
label: 'Yes, add the Sentry Vite plugin',
|
|
130
|
-
value: true,
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
label: 'No, show me instructions to manually add the plugin',
|
|
134
|
-
value: false,
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
initialValue: true,
|
|
138
|
-
}),
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
if (!shouldContinue) {
|
|
142
|
-
Sentry.setTag('ast-mod-fail-reason', 'has-sentry-content');
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const enabledSourcemaps = enableSourcemapGeneration(mod.$ast as t.Program);
|
|
148
|
-
if (!enabledSourcemaps) {
|
|
149
|
-
Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const { orgSlug: org, projectSlug: project, selfHosted, url } = options;
|
|
154
|
-
|
|
155
|
-
addVitePlugin(mod, {
|
|
156
|
-
imported: 'sentryVitePlugin',
|
|
157
|
-
from: '@sentry/vite-plugin',
|
|
158
|
-
constructor: 'sentryVitePlugin',
|
|
159
|
-
options: {
|
|
160
|
-
org,
|
|
161
|
-
project,
|
|
162
|
-
...(selfHosted && { url }),
|
|
163
|
-
},
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
const code = generateCode(mod.$ast).code;
|
|
167
|
-
|
|
168
|
-
await fs.promises.writeFile(viteConfigPath, code);
|
|
169
|
-
|
|
170
|
-
clack.log.success(
|
|
171
|
-
`Added the Sentry Vite plugin to ${prettyViteConfigFilename} and enabled source maps`,
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
return true;
|
|
175
|
-
} catch (e) {
|
|
176
|
-
debug(e);
|
|
177
|
-
Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function enableSourcemapGeneration(program: t.Program): boolean {
|
|
183
|
-
const configObj = getViteConfigObject(program);
|
|
184
|
-
|
|
185
|
-
if (!configObj) {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const b = recast.types.builders;
|
|
190
|
-
|
|
191
|
-
const buildProp = configObj.properties.find(
|
|
192
|
-
(p: t.ObjectProperty) =>
|
|
193
|
-
p.key.type === 'Identifier' && p.key.name === 'build',
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
// case 1: build property doesn't exist yet, so we can just add it
|
|
197
|
-
if (!buildProp) {
|
|
198
|
-
configObj.properties.push(
|
|
199
|
-
b.objectProperty(
|
|
200
|
-
b.identifier('build'),
|
|
201
|
-
b.objectExpression([
|
|
202
|
-
b.objectProperty(b.identifier('sourcemap'), b.booleanLiteral(true)),
|
|
203
|
-
]),
|
|
204
|
-
),
|
|
205
|
-
);
|
|
206
|
-
return true;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const isValidBuildProp =
|
|
210
|
-
buildProp.type === 'ObjectProperty' &&
|
|
211
|
-
buildProp.value.type === 'ObjectExpression';
|
|
212
|
-
|
|
213
|
-
if (!isValidBuildProp) {
|
|
214
|
-
return false;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const sourceMapsProp =
|
|
218
|
-
buildProp.value.type === 'ObjectExpression' &&
|
|
219
|
-
buildProp.value.properties.find(
|
|
220
|
-
(p: t.ObjectProperty) =>
|
|
221
|
-
p.key.type === 'Identifier' && p.key.name === 'sourcemap',
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
// case 2: build.sourcemap property doesn't exist yet, so we just add it
|
|
225
|
-
if (!sourceMapsProp && buildProp.value.type === 'ObjectExpression') {
|
|
226
|
-
buildProp.value.properties.push(
|
|
227
|
-
b.objectProperty(b.identifier('sourcemap'), b.booleanLiteral(true)),
|
|
228
|
-
);
|
|
229
|
-
return true;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (!sourceMapsProp || sourceMapsProp.type !== 'ObjectProperty') {
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// case 3: build.sourcemap property exists, and it's set to 'hidden'
|
|
237
|
-
if (
|
|
238
|
-
sourceMapsProp.value.type === 'StringLiteral' &&
|
|
239
|
-
sourceMapsProp.value.value === 'hidden'
|
|
240
|
-
) {
|
|
241
|
-
// nothing to do for us
|
|
242
|
-
return true;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// case 4: build.sourcemap property exists, but it's not enabled, so we set it to true
|
|
246
|
-
// or it is already true in which case this is a noop
|
|
247
|
-
sourceMapsProp.value = b.booleanLiteral(true);
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function getViteConfigObject(
|
|
252
|
-
program: t.Program,
|
|
253
|
-
): t.ObjectExpression | undefined {
|
|
254
|
-
const defaultExport = program.body.find(
|
|
255
|
-
(s) => s.type === 'ExportDefaultDeclaration',
|
|
256
|
-
) as t.ExportDefaultDeclaration;
|
|
257
|
-
|
|
258
|
-
if (!defaultExport) {
|
|
259
|
-
return undefined;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (defaultExport.declaration.type === 'ObjectExpression') {
|
|
263
|
-
return defaultExport.declaration;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
if (
|
|
267
|
-
defaultExport.declaration.type === 'CallExpression' &&
|
|
268
|
-
defaultExport.declaration.arguments[0].type === 'ObjectExpression'
|
|
269
|
-
) {
|
|
270
|
-
return defaultExport.declaration.arguments[0];
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
if (defaultExport.declaration.type === 'Identifier') {
|
|
274
|
-
const configId = defaultExport.declaration.name;
|
|
275
|
-
return findConfigNode(configId, program);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return undefined;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function findConfigNode(
|
|
282
|
-
configId: string,
|
|
283
|
-
program: t.Program,
|
|
284
|
-
): t.ObjectExpression | undefined {
|
|
285
|
-
for (const node of program.body) {
|
|
286
|
-
if (node.type === 'VariableDeclaration') {
|
|
287
|
-
for (const declaration of node.declarations) {
|
|
288
|
-
if (
|
|
289
|
-
declaration.type === 'VariableDeclarator' &&
|
|
290
|
-
declaration.id.type === 'Identifier' &&
|
|
291
|
-
declaration.id.name === configId &&
|
|
292
|
-
declaration.init?.type === 'ObjectExpression'
|
|
293
|
-
) {
|
|
294
|
-
return declaration.init;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return undefined;
|
|
300
|
-
}
|
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
|
|
4
|
-
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
5
|
-
import * as clack from '@clack/prompts';
|
|
6
|
-
import chalk from 'chalk';
|
|
7
|
-
|
|
8
|
-
import * as recast from 'recast';
|
|
9
|
-
import x = recast.types;
|
|
10
|
-
import t = x.namedTypes;
|
|
11
|
-
|
|
12
|
-
import * as Sentry from '@sentry/node';
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
abortIfCancelled,
|
|
16
|
-
addDotEnvSentryBuildPluginFile,
|
|
17
|
-
askForToolConfigPath,
|
|
18
|
-
createNewConfigFile,
|
|
19
|
-
getPackageDotJson,
|
|
20
|
-
installPackage,
|
|
21
|
-
makeCodeSnippet,
|
|
22
|
-
showCopyPasteInstructions,
|
|
23
|
-
} from '../../utils/clack-utils';
|
|
24
|
-
import { hasPackageInstalled } from '../../utils/package-json';
|
|
25
|
-
|
|
26
|
-
import type {
|
|
27
|
-
SourceMapUploadToolConfigurationFunction,
|
|
28
|
-
SourceMapUploadToolConfigurationOptions,
|
|
29
|
-
} from './types';
|
|
30
|
-
|
|
31
|
-
import { findFile, hasSentryContent } from '../../utils/ast-utils';
|
|
32
|
-
import { debug } from '../../utils/debug';
|
|
33
|
-
|
|
34
|
-
const getCodeSnippet = (
|
|
35
|
-
options: SourceMapUploadToolConfigurationOptions,
|
|
36
|
-
colors: boolean,
|
|
37
|
-
) =>
|
|
38
|
-
makeCodeSnippet(colors, (unchanged, plus) =>
|
|
39
|
-
unchanged(`${plus(
|
|
40
|
-
'const { sentryWebpackPlugin } = require("@sentry/webpack-plugin");',
|
|
41
|
-
)}
|
|
42
|
-
|
|
43
|
-
module.exports = {
|
|
44
|
-
// ... other options
|
|
45
|
-
${plus('devtool: "source-map", // Source map generation must be turned on')}
|
|
46
|
-
plugins: [
|
|
47
|
-
// Put the Sentry Webpack plugin after all other plugins
|
|
48
|
-
${plus(`sentryWebpackPlugin({
|
|
49
|
-
authToken: process.env.SENTRY_AUTH_TOKEN,
|
|
50
|
-
org: "${options.orgSlug}",
|
|
51
|
-
project: "${options.projectSlug}",${
|
|
52
|
-
options.selfHosted ? `\n url: "${options.url}",` : ''
|
|
53
|
-
}
|
|
54
|
-
}),`)}
|
|
55
|
-
],
|
|
56
|
-
}`),
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
export const configureWebPackPlugin: SourceMapUploadToolConfigurationFunction =
|
|
60
|
-
async (options) => {
|
|
61
|
-
await installPackage({
|
|
62
|
-
packageName: '@sentry/webpack-plugin',
|
|
63
|
-
alreadyInstalled: hasPackageInstalled(
|
|
64
|
-
'@sentry/webpack-plugin',
|
|
65
|
-
await getPackageDotJson(),
|
|
66
|
-
),
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const webpackConfigPath =
|
|
70
|
-
findFile(path.resolve(process.cwd(), 'webpack.config')) ??
|
|
71
|
-
(await askForToolConfigPath('Webpack', 'webpack.config.js'));
|
|
72
|
-
|
|
73
|
-
let successfullyAdded = false;
|
|
74
|
-
if (webpackConfigPath) {
|
|
75
|
-
successfullyAdded = await modifyWebpackConfig(webpackConfigPath, options);
|
|
76
|
-
} else {
|
|
77
|
-
successfullyAdded = await createNewConfigFile(
|
|
78
|
-
path.join(process.cwd(), 'webpack.config.js'),
|
|
79
|
-
getCodeSnippet(options, false),
|
|
80
|
-
'More information about Webpack configs: https://vitejs.dev/config/',
|
|
81
|
-
);
|
|
82
|
-
Sentry.setTag(
|
|
83
|
-
'created-new-config',
|
|
84
|
-
successfullyAdded ? 'success' : 'fail',
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (successfullyAdded) {
|
|
89
|
-
clack.log.info(
|
|
90
|
-
`We recommend checking the ${
|
|
91
|
-
webpackConfigPath ? 'modified' : 'added'
|
|
92
|
-
} file after the wizard finished to ensure it works with your build setup.`,
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
Sentry.setTag('ast-mod', 'success');
|
|
96
|
-
} else {
|
|
97
|
-
Sentry.setTag('ast-mod', 'fail');
|
|
98
|
-
await showCopyPasteInstructions(
|
|
99
|
-
path.basename(webpackConfigPath || 'webpack.config.js'),
|
|
100
|
-
getCodeSnippet(options, true),
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
await addDotEnvSentryBuildPluginFile(options.authToken);
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Modifies a webpack config file to enable source map generation and add the Sentry webpack plugin
|
|
109
|
-
* exported only for testing
|
|
110
|
-
*/
|
|
111
|
-
export async function modifyWebpackConfig(
|
|
112
|
-
webpackConfigPath: string,
|
|
113
|
-
options: SourceMapUploadToolConfigurationOptions,
|
|
114
|
-
): Promise<boolean> {
|
|
115
|
-
try {
|
|
116
|
-
const webpackConfig = await fs.promises.readFile(webpackConfigPath, {
|
|
117
|
-
encoding: 'utf-8',
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
const prettyConfigFilename = chalk.cyan(path.basename(webpackConfigPath));
|
|
121
|
-
|
|
122
|
-
// no idea why recast returns any here, this is dumb :/
|
|
123
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
124
|
-
const program = recast.parse(webpackConfig.toString()).program as t.Program;
|
|
125
|
-
|
|
126
|
-
if (!(await shouldModifyWebpackConfig(program, prettyConfigFilename))) {
|
|
127
|
-
// Sentry tag is set in shouldModifyWebpackConfig
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const exportStmt = getCjsModuleExports(program);
|
|
132
|
-
if (!exportStmt) {
|
|
133
|
-
// We only care about CJS at the moment since it's probably the most widely used format for webpack configs.
|
|
134
|
-
debug(`Could not find module.exports = {...} in ${webpackConfigPath}.`);
|
|
135
|
-
Sentry.setTag('ast-mod-fail-reason', 'config-object-not-found');
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const configObject = getWebpackConfigObject(exportStmt, program);
|
|
140
|
-
|
|
141
|
-
if (!configObject) {
|
|
142
|
-
debug(`Couldn't find config object in ${webpackConfigPath}`);
|
|
143
|
-
Sentry.setTag('ast-mod-fail-reason', 'config-object-not-found');
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const enabledSourcemaps = enableSourcemapsGeneration(configObject);
|
|
148
|
-
|
|
149
|
-
if (enabledSourcemaps) {
|
|
150
|
-
clack.log.success(
|
|
151
|
-
`Enabled source map generation in ${prettyConfigFilename}.`,
|
|
152
|
-
);
|
|
153
|
-
} else {
|
|
154
|
-
clack.log.warn(
|
|
155
|
-
`Couldn't enable source maps generation in ${prettyConfigFilename} Please follow the instructions below.`,
|
|
156
|
-
);
|
|
157
|
-
Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const addedPlugin = addSentryWebpackPlugin(program, configObject, options);
|
|
162
|
-
if (addedPlugin) {
|
|
163
|
-
clack.log.success(
|
|
164
|
-
`Added Sentry webpack plugin to ${prettyConfigFilename}.`,
|
|
165
|
-
);
|
|
166
|
-
} else {
|
|
167
|
-
clack.log.warn(
|
|
168
|
-
`Couldn't add Sentry webpack plugin to ${prettyConfigFilename}. Please follow the instructions below.`,
|
|
169
|
-
);
|
|
170
|
-
Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const code = recast.print(program).code;
|
|
175
|
-
await fs.promises.writeFile(webpackConfigPath, code);
|
|
176
|
-
|
|
177
|
-
return true;
|
|
178
|
-
} catch (e) {
|
|
179
|
-
Sentry.setTag('ast-mod-fail-reason', 'insertion-fail');
|
|
180
|
-
debug(e);
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async function shouldModifyWebpackConfig(
|
|
186
|
-
program: t.Program,
|
|
187
|
-
prettyConfigFilename: string,
|
|
188
|
-
) {
|
|
189
|
-
if (hasSentryContent(program)) {
|
|
190
|
-
const shouldContinue = await abortIfCancelled(
|
|
191
|
-
clack.select({
|
|
192
|
-
message: `Seems like ${prettyConfigFilename} already contains Sentry-related code. Should the wizard modify it anyway?`,
|
|
193
|
-
options: [
|
|
194
|
-
{
|
|
195
|
-
label: 'Yes, add the Sentry Webpack plugin',
|
|
196
|
-
value: true,
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
label: 'No, show me instructions to manually add the plugin',
|
|
200
|
-
value: false,
|
|
201
|
-
},
|
|
202
|
-
],
|
|
203
|
-
initialValue: true,
|
|
204
|
-
}),
|
|
205
|
-
);
|
|
206
|
-
|
|
207
|
-
if (!shouldContinue) {
|
|
208
|
-
Sentry.setTag('ast-mod-fail-reason', 'has-sentry-content');
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function addSentryWebpackPlugin(
|
|
217
|
-
program: t.Program,
|
|
218
|
-
configObj: t.ObjectExpression,
|
|
219
|
-
options: SourceMapUploadToolConfigurationOptions,
|
|
220
|
-
) {
|
|
221
|
-
const b = addSentryWebpackPluginImport(program);
|
|
222
|
-
|
|
223
|
-
const sentryPluginCall = b.callExpression(
|
|
224
|
-
b.identifier('sentryWebpackPlugin'),
|
|
225
|
-
[
|
|
226
|
-
b.objectExpression([
|
|
227
|
-
b.objectProperty(
|
|
228
|
-
b.identifier('authToken'),
|
|
229
|
-
b.identifier('process.env.SENTRY_AUTH_TOKEN'),
|
|
230
|
-
),
|
|
231
|
-
b.objectProperty(b.identifier('org'), b.stringLiteral(options.orgSlug)),
|
|
232
|
-
b.objectProperty(
|
|
233
|
-
b.identifier('project'),
|
|
234
|
-
b.stringLiteral(options.projectSlug),
|
|
235
|
-
),
|
|
236
|
-
...(options.selfHosted
|
|
237
|
-
? [
|
|
238
|
-
b.objectProperty(
|
|
239
|
-
b.identifier('url'),
|
|
240
|
-
b.stringLiteral(options.url),
|
|
241
|
-
),
|
|
242
|
-
]
|
|
243
|
-
: []),
|
|
244
|
-
]),
|
|
245
|
-
],
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
const pluginsProp = configObj.properties.find(
|
|
249
|
-
(p): p is t.Property =>
|
|
250
|
-
p.type === 'Property' &&
|
|
251
|
-
p.key.type === 'Identifier' &&
|
|
252
|
-
p.key.name === 'plugins',
|
|
253
|
-
);
|
|
254
|
-
|
|
255
|
-
if (pluginsProp) {
|
|
256
|
-
if (pluginsProp.value.type === 'ArrayExpression') {
|
|
257
|
-
pluginsProp.value.elements.push(sentryPluginCall);
|
|
258
|
-
} else {
|
|
259
|
-
pluginsProp.value = b.arrayExpression([sentryPluginCall]);
|
|
260
|
-
}
|
|
261
|
-
return true;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
configObj.properties.push(
|
|
265
|
-
b.objectProperty(
|
|
266
|
-
b.identifier('plugins'),
|
|
267
|
-
b.arrayExpression([sentryPluginCall]),
|
|
268
|
-
),
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
return true;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
function addSentryWebpackPluginImport(program: t.Program) {
|
|
275
|
-
const b = recast.types.builders;
|
|
276
|
-
|
|
277
|
-
const sentryPluginRequireStmt = b.variableDeclaration('const', [
|
|
278
|
-
b.variableDeclarator(
|
|
279
|
-
b.objectPattern([
|
|
280
|
-
b.objectProperty.from({
|
|
281
|
-
key: b.identifier('sentryWebpackPlugin'),
|
|
282
|
-
value: b.identifier('sentryWebpackPlugin'),
|
|
283
|
-
shorthand: true,
|
|
284
|
-
}),
|
|
285
|
-
]),
|
|
286
|
-
b.callExpression(b.identifier('require'), [
|
|
287
|
-
b.stringLiteral('@sentry/webpack-plugin'),
|
|
288
|
-
]),
|
|
289
|
-
),
|
|
290
|
-
]);
|
|
291
|
-
|
|
292
|
-
program.body.unshift(sentryPluginRequireStmt);
|
|
293
|
-
return b;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
function enableSourcemapsGeneration(configObj: t.ObjectExpression): boolean {
|
|
297
|
-
const b = recast.types.builders;
|
|
298
|
-
|
|
299
|
-
const devtoolProp = configObj.properties.find(
|
|
300
|
-
(p): p is t.Property =>
|
|
301
|
-
p.type === 'Property' &&
|
|
302
|
-
p.key.type === 'Identifier' &&
|
|
303
|
-
p.key.name === 'devtool',
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
if (devtoolProp) {
|
|
307
|
-
// devtool can have quite a lot of source maps values.
|
|
308
|
-
// see: https://webpack.js.org/configuration/devtool/#devtool
|
|
309
|
-
// For Sentry to work best, we should set it to "source-map" or "hidden-source-map"
|
|
310
|
-
// Heuristic:
|
|
311
|
-
// - all values that contain "hidden" will be set to "hidden-source-map"
|
|
312
|
-
// - all other values will be set to "source-map"
|
|
313
|
-
if (
|
|
314
|
-
(devtoolProp.value.type === 'Literal' ||
|
|
315
|
-
devtoolProp.value.type === 'StringLiteral') &&
|
|
316
|
-
devtoolProp.value.value?.toString().startsWith('hidden-')
|
|
317
|
-
) {
|
|
318
|
-
devtoolProp.value = b.stringLiteral('hidden-source-map');
|
|
319
|
-
} else {
|
|
320
|
-
devtoolProp.value = b.stringLiteral('source-map');
|
|
321
|
-
}
|
|
322
|
-
return true;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
configObj.properties.push(
|
|
326
|
-
b.objectProperty(b.identifier('devtool'), b.stringLiteral('source-map')),
|
|
327
|
-
);
|
|
328
|
-
|
|
329
|
-
return true;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
function getWebpackConfigObject(
|
|
333
|
-
moduleExports: t.AssignmentExpression,
|
|
334
|
-
program: t.Program,
|
|
335
|
-
): t.ObjectExpression | undefined {
|
|
336
|
-
const rhs = moduleExports.right;
|
|
337
|
-
if (rhs.type === 'ObjectExpression') {
|
|
338
|
-
return rhs;
|
|
339
|
-
}
|
|
340
|
-
if (rhs.type === 'Identifier') {
|
|
341
|
-
const configId = rhs.name;
|
|
342
|
-
|
|
343
|
-
const configDeclaration = program.body.find(
|
|
344
|
-
(s): s is t.VariableDeclaration =>
|
|
345
|
-
s.type === 'VariableDeclaration' &&
|
|
346
|
-
!!s.declarations.find(
|
|
347
|
-
(d) =>
|
|
348
|
-
d.type === 'VariableDeclarator' &&
|
|
349
|
-
d.id.type === 'Identifier' &&
|
|
350
|
-
d.id.name === configId,
|
|
351
|
-
),
|
|
352
|
-
);
|
|
353
|
-
|
|
354
|
-
const declarator = configDeclaration?.declarations.find(
|
|
355
|
-
(d): d is t.VariableDeclarator =>
|
|
356
|
-
d.type === 'VariableDeclarator' &&
|
|
357
|
-
d.id.type === 'Identifier' &&
|
|
358
|
-
d.id.name === configId,
|
|
359
|
-
);
|
|
360
|
-
|
|
361
|
-
return declarator?.init?.type === 'ObjectExpression'
|
|
362
|
-
? declarator.init
|
|
363
|
-
: undefined;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
return undefined;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
function getCjsModuleExports(
|
|
370
|
-
program: t.Program,
|
|
371
|
-
): t.AssignmentExpression | undefined {
|
|
372
|
-
const moduleExports = program.body.find(
|
|
373
|
-
(s): s is t.ExpressionStatement =>
|
|
374
|
-
s.type === 'ExpressionStatement' &&
|
|
375
|
-
s.expression.type === 'AssignmentExpression' &&
|
|
376
|
-
s.expression.left.type === 'MemberExpression' &&
|
|
377
|
-
s.expression.left.object.type === 'Identifier' &&
|
|
378
|
-
s.expression.left.object.name === 'module' &&
|
|
379
|
-
s.expression.left.property.type === 'Identifier' &&
|
|
380
|
-
s.expression.left.property.name === 'exports',
|
|
381
|
-
);
|
|
382
|
-
return moduleExports?.expression as t.AssignmentExpression;
|
|
383
|
-
}
|