@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,302 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
3
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
4
|
-
import * as fs from 'node:fs';
|
|
5
|
-
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
6
|
-
import clack from '@clack/prompts';
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
|
|
9
|
-
type BuildPhase = { shellScript: string };
|
|
10
|
-
type BuildPhaseMap = Record<string, BuildPhase>;
|
|
11
|
-
|
|
12
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
-
export function getValidExistingBuildPhases(xcodeProject: any): BuildPhaseMap {
|
|
14
|
-
const map: BuildPhaseMap = {};
|
|
15
|
-
const raw = xcodeProject.hash.project.objects.PBXShellScriptBuildPhase || {};
|
|
16
|
-
for (const key in raw) {
|
|
17
|
-
const val = raw[key];
|
|
18
|
-
val.isa && (map[key] = val);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return map;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function patchBundlePhase(
|
|
25
|
-
bundlePhase: BuildPhase | undefined,
|
|
26
|
-
patch: (script: string) => string,
|
|
27
|
-
) {
|
|
28
|
-
if (!bundlePhase) {
|
|
29
|
-
clack.log.warn(
|
|
30
|
-
`Could not find ${chalk.cyan(
|
|
31
|
-
'Bundle React Native code and images',
|
|
32
|
-
)} build phase.`,
|
|
33
|
-
);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const bundlePhaseIncludesSentry = doesBundlePhaseIncludeSentry(bundlePhase);
|
|
38
|
-
if (bundlePhaseIncludesSentry) {
|
|
39
|
-
clack.log.warn(
|
|
40
|
-
`Build phase ${chalk.cyan(
|
|
41
|
-
'Bundle React Native code and images',
|
|
42
|
-
)} already includes Sentry.`,
|
|
43
|
-
);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const script: string = JSON.parse(bundlePhase.shellScript);
|
|
48
|
-
bundlePhase.shellScript = JSON.stringify(patch(script));
|
|
49
|
-
clack.log.success(
|
|
50
|
-
`Patched Build phase ${chalk.cyan('Bundle React Native code and images')}.`,
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function unPatchBundlePhase(bundlePhase: BuildPhase | undefined) {
|
|
55
|
-
if (!bundlePhase) {
|
|
56
|
-
clack.log.warn(
|
|
57
|
-
`Could not find ${chalk.cyan(
|
|
58
|
-
'Bundle React Native code and images',
|
|
59
|
-
)} build phase.`,
|
|
60
|
-
);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
!bundlePhase.shellScript.match(/sentry-cli\s+react-native\s+xcode/i) &&
|
|
66
|
-
!bundlePhase.shellScript.includes('sentry-xcode.sh')
|
|
67
|
-
) {
|
|
68
|
-
clack.log.success(
|
|
69
|
-
`Build phase ${chalk.cyan(
|
|
70
|
-
'Bundle React Native code and images',
|
|
71
|
-
)} does not include Sentry.`,
|
|
72
|
-
);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
bundlePhase.shellScript = JSON.stringify(
|
|
77
|
-
removeSentryFromBundleShellScript(
|
|
78
|
-
<string>JSON.parse(bundlePhase.shellScript),
|
|
79
|
-
),
|
|
80
|
-
);
|
|
81
|
-
clack.log.success(
|
|
82
|
-
`Build phase ${chalk.cyan(
|
|
83
|
-
'Bundle React Native code and images',
|
|
84
|
-
)} unpatched successfully.`,
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function removeSentryFromBundleShellScript(script: string): string {
|
|
89
|
-
return (
|
|
90
|
-
script
|
|
91
|
-
// remove sentry properties export
|
|
92
|
-
.replace(/^export SENTRY_PROPERTIES=sentry.properties\r?\n/m, '')
|
|
93
|
-
.replace(
|
|
94
|
-
/^\/bin\/sh .*?..\/node_modules\/@sentry\/react-native\/scripts\/collect-modules.sh"?\r?\n/m,
|
|
95
|
-
'',
|
|
96
|
-
)
|
|
97
|
-
// unwrap react-native-xcode.sh command. In case someone replaced it
|
|
98
|
-
// entirely with the sentry-cli command we need to put the original
|
|
99
|
-
// version back in.
|
|
100
|
-
.replace(
|
|
101
|
-
/\.\.\/node_modules\/@sentry\/cli\/bin\/sentry-cli\s+react-native\s+xcode\s+\$REACT_NATIVE_XCODE/i,
|
|
102
|
-
'$REACT_NATIVE_XCODE',
|
|
103
|
-
)
|
|
104
|
-
.replace(
|
|
105
|
-
// eslint-disable-next-line no-useless-escape
|
|
106
|
-
/\"\/bin\/sh.*?sentry-xcode.sh\s+\$REACT_NATIVE_XCODE/i,
|
|
107
|
-
// eslint-disable-next-line no-useless-escape
|
|
108
|
-
'"$REACT_NATIVE_XCODE',
|
|
109
|
-
)
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export function findBundlePhase(buildPhases: BuildPhaseMap) {
|
|
114
|
-
return Object.values(buildPhases).find((buildPhase) =>
|
|
115
|
-
buildPhase.shellScript.match(/\/scripts\/react-native-xcode\.sh/i),
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export function doesBundlePhaseIncludeSentry(buildPhase: BuildPhase) {
|
|
120
|
-
const containsSentryCliRNCommand = !!buildPhase.shellScript.match(
|
|
121
|
-
/sentry-cli\s+react-native\s+xcode/i,
|
|
122
|
-
);
|
|
123
|
-
const containsBundledScript =
|
|
124
|
-
buildPhase.shellScript.includes('sentry-xcode.sh');
|
|
125
|
-
return containsSentryCliRNCommand || containsBundledScript;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export function addSentryWithBundledScriptsToBundleShellScript(
|
|
129
|
-
script: string,
|
|
130
|
-
): string {
|
|
131
|
-
const isLikelyPlainReactNativeScript = script.includes('$REACT_NATIVE_XCODE');
|
|
132
|
-
if (isLikelyPlainReactNativeScript) {
|
|
133
|
-
return script.replace(
|
|
134
|
-
'$REACT_NATIVE_XCODE',
|
|
135
|
-
// eslint-disable-next-line no-useless-escape
|
|
136
|
-
'\\"/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode.sh $REACT_NATIVE_XCODE\\"',
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const isLikelyExpoScript = script.includes('expo');
|
|
141
|
-
if (isLikelyExpoScript) {
|
|
142
|
-
const SENTRY_REACT_NATIVE_XCODE_PATH =
|
|
143
|
-
"`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"`";
|
|
144
|
-
return script.replace(
|
|
145
|
-
/^.*?(packager|scripts)\/react-native-xcode\.sh\s*(\\'\\\\")?/m,
|
|
146
|
-
// eslint-disable-next-line no-useless-escape
|
|
147
|
-
(match: string) => `/bin/sh ${SENTRY_REACT_NATIVE_XCODE_PATH} ${match}`,
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return script;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export function addSentryWithCliToBundleShellScript(script: string): string {
|
|
155
|
-
return (
|
|
156
|
-
'export SENTRY_PROPERTIES=sentry.properties\n' +
|
|
157
|
-
'export EXTRA_PACKAGER_ARGS="--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map"\n' +
|
|
158
|
-
script.replace(
|
|
159
|
-
'$REACT_NATIVE_XCODE',
|
|
160
|
-
() =>
|
|
161
|
-
// eslint-disable-next-line no-useless-escape
|
|
162
|
-
'\\"../node_modules/@sentry/cli/bin/sentry-cli react-native xcode $REACT_NATIVE_XCODE\\"',
|
|
163
|
-
) +
|
|
164
|
-
'\n/bin/sh -c "$WITH_ENVIRONMENT ../node_modules/@sentry/react-native/scripts/collect-modules.sh"\n'
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export function addDebugFilesUploadPhaseWithBundledScripts(
|
|
169
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
170
|
-
xcodeProject: any,
|
|
171
|
-
{ debugFilesUploadPhaseExists }: { debugFilesUploadPhaseExists: boolean },
|
|
172
|
-
) {
|
|
173
|
-
if (debugFilesUploadPhaseExists) {
|
|
174
|
-
clack.log.warn(
|
|
175
|
-
`Build phase ${chalk.cyan(
|
|
176
|
-
'Upload Debug Symbols to Sentry',
|
|
177
|
-
)} already exists.`,
|
|
178
|
-
);
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
xcodeProject.addBuildPhase(
|
|
183
|
-
[],
|
|
184
|
-
'PBXShellScriptBuildPhase',
|
|
185
|
-
'Upload Debug Symbols to Sentry',
|
|
186
|
-
null,
|
|
187
|
-
{
|
|
188
|
-
shellPath: '/bin/sh',
|
|
189
|
-
shellScript: `/bin/sh ../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh`,
|
|
190
|
-
},
|
|
191
|
-
);
|
|
192
|
-
clack.log.success(
|
|
193
|
-
`Added Build phase ${chalk.cyan('Upload Debug Symbols to Sentry')}.`,
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
export function addDebugFilesUploadPhaseWithCli(
|
|
198
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
199
|
-
xcodeProject: any,
|
|
200
|
-
{ debugFilesUploadPhaseExists }: { debugFilesUploadPhaseExists: boolean },
|
|
201
|
-
) {
|
|
202
|
-
if (debugFilesUploadPhaseExists) {
|
|
203
|
-
clack.log.warn(
|
|
204
|
-
`Build phase ${chalk.cyan(
|
|
205
|
-
'Upload Debug Symbols to Sentry',
|
|
206
|
-
)} already exists.`,
|
|
207
|
-
);
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
xcodeProject.addBuildPhase(
|
|
212
|
-
[],
|
|
213
|
-
'PBXShellScriptBuildPhase',
|
|
214
|
-
'Upload Debug Symbols to Sentry',
|
|
215
|
-
null,
|
|
216
|
-
{
|
|
217
|
-
shellPath: '/bin/sh',
|
|
218
|
-
shellScript: `
|
|
219
|
-
WITH_ENVIRONMENT="../node_modules/react-native/scripts/xcode/with-environment.sh"
|
|
220
|
-
if [ -f "$WITH_ENVIRONMENT" ]; then
|
|
221
|
-
. "$WITH_ENVIRONMENT"
|
|
222
|
-
fi
|
|
223
|
-
export SENTRY_PROPERTIES=sentry.properties
|
|
224
|
-
[ "$SENTRY_INCLUDE_NATIVE_SOURCES" = "true" ] && INCLUDE_SOURCES_FLAG="--include-sources" || INCLUDE_SOURCES_FLAG=""
|
|
225
|
-
../node_modules/@sentry/cli/bin/sentry-cli debug-files upload "$INCLUDE_SOURCES_FLAG" "$DWARF_DSYM_FOLDER_PATH"
|
|
226
|
-
`,
|
|
227
|
-
},
|
|
228
|
-
);
|
|
229
|
-
clack.log.success(
|
|
230
|
-
`Added Build phase ${chalk.cyan('Upload Debug Symbols to Sentry')}.`,
|
|
231
|
-
);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
export function unPatchDebugFilesUploadPhase(
|
|
235
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
236
|
-
xcodeProject: any,
|
|
237
|
-
) {
|
|
238
|
-
const buildPhasesMap =
|
|
239
|
-
xcodeProject.hash.project.objects.PBXShellScriptBuildPhase || {};
|
|
240
|
-
|
|
241
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
242
|
-
const debugFilesUploadPhaseResult = findDebugFilesUploadPhase(buildPhasesMap);
|
|
243
|
-
if (!debugFilesUploadPhaseResult) {
|
|
244
|
-
clack.log.success(
|
|
245
|
-
`Build phase ${chalk.cyan('Upload Debug Symbols to Sentry')} not found.`,
|
|
246
|
-
);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const [debugFilesUploadPhaseKey] = debugFilesUploadPhaseResult;
|
|
251
|
-
const firstTarget: string = xcodeProject.getFirstTarget().uuid;
|
|
252
|
-
const nativeTargets = xcodeProject.hash.project.objects.PBXNativeTarget;
|
|
253
|
-
|
|
254
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
255
|
-
delete buildPhasesMap[debugFilesUploadPhaseKey];
|
|
256
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
257
|
-
delete buildPhasesMap[`${debugFilesUploadPhaseKey}_comment`];
|
|
258
|
-
const phases = nativeTargets[firstTarget].buildPhases;
|
|
259
|
-
if (phases) {
|
|
260
|
-
for (let i = 0; i < phases.length; i++) {
|
|
261
|
-
if (phases[i].value === debugFilesUploadPhaseKey) {
|
|
262
|
-
phases.splice(i, 1);
|
|
263
|
-
break;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
clack.log.success(
|
|
268
|
-
`Build phase ${chalk.cyan(
|
|
269
|
-
'Upload Debug Symbols to Sentry',
|
|
270
|
-
)} removed successfully.`,
|
|
271
|
-
);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
export function findDebugFilesUploadPhase(
|
|
275
|
-
buildPhasesMap: Record<string, BuildPhase>,
|
|
276
|
-
): [key: string, buildPhase: BuildPhase] | undefined {
|
|
277
|
-
return Object.entries(buildPhasesMap).find(([_, buildPhase]) => {
|
|
278
|
-
const containsCliDebugUpload =
|
|
279
|
-
typeof buildPhase !== 'string' &&
|
|
280
|
-
!!buildPhase.shellScript.match(
|
|
281
|
-
/sentry-cli\s+(upload-dsym|debug-files upload)\b/,
|
|
282
|
-
);
|
|
283
|
-
const containsBundledDebugUpload =
|
|
284
|
-
typeof buildPhase !== 'string' &&
|
|
285
|
-
buildPhase.shellScript.includes('sentry-xcode-debug-files.sh');
|
|
286
|
-
return containsCliDebugUpload || containsBundledDebugUpload;
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
|
-
export function writeXcodeProject(xcodeProjectPath: string, xcodeProject: any) {
|
|
292
|
-
const newContent = xcodeProject.writeSync();
|
|
293
|
-
const currentContent = fs.readFileSync(xcodeProjectPath, 'utf-8');
|
|
294
|
-
if (newContent === currentContent) {
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
fs.writeFileSync(xcodeProjectPath, newContent, 'utf-8');
|
|
299
|
-
clack.log.success(
|
|
300
|
-
chalk.green(`Xcode project ${chalk.cyan(xcodeProjectPath)} changes saved.`),
|
|
301
|
-
);
|
|
302
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
loadFile,
|
|
3
|
-
// @ts-expect-error - magicast is ESM and TS complains about that. It works though
|
|
4
|
-
} from 'magicast';
|
|
5
|
-
import * as fs from 'fs';
|
|
6
|
-
|
|
7
|
-
import { findFile } from '../../utils/ast-utils';
|
|
8
|
-
|
|
9
|
-
// Try to find the Express server implementation that contains `createRequestHandler` from `@remix-run/express`
|
|
10
|
-
export async function findCustomExpressServerImplementation() {
|
|
11
|
-
const possiblePaths = [
|
|
12
|
-
'server',
|
|
13
|
-
'server/index',
|
|
14
|
-
'app/server',
|
|
15
|
-
'app/server/index',
|
|
16
|
-
];
|
|
17
|
-
|
|
18
|
-
for (const filePath of possiblePaths) {
|
|
19
|
-
const filename = findFile(filePath);
|
|
20
|
-
|
|
21
|
-
if (!filename) {
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const fileStat = fs.statSync(filename);
|
|
26
|
-
|
|
27
|
-
if (!fileStat.isFile()) {
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const fileMod = await loadFile(filename);
|
|
32
|
-
const createRequestHandlerImport = fileMod.imports.$items.find(
|
|
33
|
-
(imp) =>
|
|
34
|
-
imp.from === '@remix-run/express' &&
|
|
35
|
-
imp.imported === 'createRequestHandler',
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
if (createRequestHandlerImport) {
|
|
39
|
-
return filename;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
-
|
|
3
|
-
// @ts-expect-error - magicast is ESM and TS complains about that. It works though
|
|
4
|
-
import type { ProxifiedModule } from 'magicast';
|
|
5
|
-
import type { Program } from '@babel/types';
|
|
6
|
-
|
|
7
|
-
import * as recast from 'recast';
|
|
8
|
-
|
|
9
|
-
import { HANDLE_ERROR_TEMPLATE_V2 } from '../templates';
|
|
10
|
-
import { getAfterImportsInsertionIndex, hasSentryContent } from '../utils';
|
|
11
|
-
|
|
12
|
-
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
13
|
-
import clack from '@clack/prompts';
|
|
14
|
-
import chalk from 'chalk';
|
|
15
|
-
|
|
16
|
-
// @ts-expect-error - magicast is ESM and TS complains about that. It works though
|
|
17
|
-
import { generateCode } from 'magicast';
|
|
18
|
-
|
|
19
|
-
export function instrumentHandleError(
|
|
20
|
-
originalEntryServerMod: ProxifiedModule<any>,
|
|
21
|
-
serverEntryFilename: string,
|
|
22
|
-
): boolean {
|
|
23
|
-
const originalEntryServerModAST = originalEntryServerMod.$ast as Program;
|
|
24
|
-
|
|
25
|
-
const handleErrorFunctionExport = originalEntryServerModAST.body.find(
|
|
26
|
-
(node) => {
|
|
27
|
-
return (
|
|
28
|
-
node.type === 'ExportNamedDeclaration' &&
|
|
29
|
-
node.declaration?.type === 'FunctionDeclaration' &&
|
|
30
|
-
node.declaration.id?.name === 'handleError'
|
|
31
|
-
);
|
|
32
|
-
},
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
const handleErrorFunctionVariableDeclarationExport =
|
|
36
|
-
originalEntryServerModAST.body.find(
|
|
37
|
-
(node) =>
|
|
38
|
-
node.type === 'ExportNamedDeclaration' &&
|
|
39
|
-
node.declaration?.type === 'VariableDeclaration' &&
|
|
40
|
-
// @ts-expect-error - id should always have a name in this case
|
|
41
|
-
node.declaration.declarations[0].id.name === 'handleError',
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
if (
|
|
45
|
-
!handleErrorFunctionExport &&
|
|
46
|
-
!handleErrorFunctionVariableDeclarationExport
|
|
47
|
-
) {
|
|
48
|
-
clack.log.warn(
|
|
49
|
-
`Could not find function ${chalk.cyan('handleError')} in ${chalk.cyan(
|
|
50
|
-
serverEntryFilename,
|
|
51
|
-
)}. Creating one for you.`,
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
55
|
-
const implementation = recast.parse(HANDLE_ERROR_TEMPLATE_V2).program
|
|
56
|
-
.body[0];
|
|
57
|
-
|
|
58
|
-
originalEntryServerModAST.body.splice(
|
|
59
|
-
getAfterImportsInsertionIndex(originalEntryServerModAST),
|
|
60
|
-
0,
|
|
61
|
-
// @ts-expect-error - string works here because the AST is proxified by magicast
|
|
62
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
63
|
-
recast.types.builders.exportNamedDeclaration(implementation),
|
|
64
|
-
);
|
|
65
|
-
} else if (
|
|
66
|
-
(handleErrorFunctionExport &&
|
|
67
|
-
['wrapHandleErrorWithSentry', 'sentryHandleError'].some((util) =>
|
|
68
|
-
hasSentryContent(
|
|
69
|
-
generateCode(handleErrorFunctionExport).code,
|
|
70
|
-
originalEntryServerMod.$code,
|
|
71
|
-
util,
|
|
72
|
-
),
|
|
73
|
-
)) ||
|
|
74
|
-
(handleErrorFunctionVariableDeclarationExport &&
|
|
75
|
-
['wrapHandleErrorWithSentry', 'sentryHandleError'].some((util) =>
|
|
76
|
-
hasSentryContent(
|
|
77
|
-
generateCode(handleErrorFunctionVariableDeclarationExport).code,
|
|
78
|
-
originalEntryServerMod.$code,
|
|
79
|
-
util,
|
|
80
|
-
),
|
|
81
|
-
))
|
|
82
|
-
) {
|
|
83
|
-
return false;
|
|
84
|
-
} else if (handleErrorFunctionExport) {
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
86
|
-
const implementation = recast.parse(HANDLE_ERROR_TEMPLATE_V2).program
|
|
87
|
-
.body[0];
|
|
88
|
-
|
|
89
|
-
// If the current handleError function has a body, we need to merge the new implementation with the existing one
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
91
|
-
implementation.declarations[0].init.arguments[0].body.body.unshift(
|
|
92
|
-
// @ts-expect-error - declaration works here because the AST is proxified by magicast
|
|
93
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
94
|
-
...handleErrorFunctionExport.declaration.body.body,
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
// @ts-expect-error - declaration works here because the AST is proxified by magicast
|
|
98
|
-
handleErrorFunctionExport.declaration = implementation;
|
|
99
|
-
} else if (handleErrorFunctionVariableDeclarationExport) {
|
|
100
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
101
|
-
const implementation = recast.parse(HANDLE_ERROR_TEMPLATE_V2).program
|
|
102
|
-
.body[0];
|
|
103
|
-
|
|
104
|
-
// If the current handleError function has a body, we need to merge the new implementation with the existing one
|
|
105
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
106
|
-
implementation.declarations[0].init.arguments[0].body.body.unshift(
|
|
107
|
-
// @ts-expect-error - declaration works here because the AST is proxified by magicast
|
|
108
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
109
|
-
...handleErrorFunctionVariableDeclarationExport.declaration
|
|
110
|
-
.declarations[0].init.body.body,
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
// @ts-expect-error - declaration works here because the AST is proxified by magicast
|
|
114
|
-
handleErrorFunctionVariableDeclarationExport.declaration = implementation;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
3
|
-
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
4
|
-
|
|
5
|
-
import * as recast from 'recast';
|
|
6
|
-
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
7
|
-
import clack from '@clack/prompts';
|
|
8
|
-
import chalk from 'chalk';
|
|
9
|
-
|
|
10
|
-
// @ts-expect-error - magicast is ESM and TS complains about that. It works though
|
|
11
|
-
import { builders, ProxifiedModule, generateCode } from 'magicast';
|
|
12
|
-
|
|
13
|
-
export function wrapAppWithSentry(
|
|
14
|
-
rootRouteAst: ProxifiedModule,
|
|
15
|
-
rootFileName: string,
|
|
16
|
-
) {
|
|
17
|
-
rootRouteAst.imports.$add({
|
|
18
|
-
from: '@sentry/remix',
|
|
19
|
-
imported: 'withSentry',
|
|
20
|
-
local: 'withSentry',
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
recast.visit(rootRouteAst.$ast, {
|
|
24
|
-
visitExportDefaultDeclaration(path) {
|
|
25
|
-
if (path.value.declaration.type === 'FunctionDeclaration') {
|
|
26
|
-
// Move the function declaration just before the default export
|
|
27
|
-
path.insertBefore(path.value.declaration);
|
|
28
|
-
|
|
29
|
-
// Get the name of the function to be wrapped
|
|
30
|
-
const functionName: string = path.value.declaration.id.name as string;
|
|
31
|
-
|
|
32
|
-
// Create the wrapped function call
|
|
33
|
-
const functionCall = recast.types.builders.callExpression(
|
|
34
|
-
recast.types.builders.identifier('withSentry'),
|
|
35
|
-
[recast.types.builders.identifier(functionName)],
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
// Replace the default export with the wrapped function call
|
|
39
|
-
path.value.declaration = functionCall;
|
|
40
|
-
} else if (path.value.declaration.type === 'Identifier') {
|
|
41
|
-
const rootRouteExport = rootRouteAst.exports.default;
|
|
42
|
-
|
|
43
|
-
const expressionToWrap = generateCode(rootRouteExport.$ast).code;
|
|
44
|
-
|
|
45
|
-
rootRouteAst.exports.default = builders.raw(
|
|
46
|
-
`withSentry(${expressionToWrap})`,
|
|
47
|
-
);
|
|
48
|
-
} else {
|
|
49
|
-
clack.log.warn(
|
|
50
|
-
chalk.yellow(
|
|
51
|
-
`Couldn't instrument ${chalk.bold(
|
|
52
|
-
rootFileName,
|
|
53
|
-
)} automatically. Wrap your default export with: ${chalk.dim(
|
|
54
|
-
'withSentry()',
|
|
55
|
-
)}\n`,
|
|
56
|
-
),
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
this.traverse(path);
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
-
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
|
|
5
|
-
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
6
|
-
import clack from '@clack/prompts';
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
|
|
9
|
-
// @ts-expect-error - magicast is ESM and TS complains about that. It works though
|
|
10
|
-
import { loadFile, writeFile } from 'magicast';
|
|
11
|
-
import { wrapAppWithSentry } from './root-common';
|
|
12
|
-
|
|
13
|
-
export async function instrumentRootRouteV1(
|
|
14
|
-
rootFileName: string,
|
|
15
|
-
): Promise<void> {
|
|
16
|
-
try {
|
|
17
|
-
const rootRouteAst = await loadFile(
|
|
18
|
-
path.join(process.cwd(), 'app', rootFileName),
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
wrapAppWithSentry(rootRouteAst, rootFileName);
|
|
22
|
-
|
|
23
|
-
await writeFile(
|
|
24
|
-
rootRouteAst.$ast,
|
|
25
|
-
path.join(process.cwd(), 'app', rootFileName),
|
|
26
|
-
);
|
|
27
|
-
} catch (e: unknown) {
|
|
28
|
-
// eslint-disable-next-line no-console
|
|
29
|
-
console.error(e);
|
|
30
|
-
clack.log.warn(
|
|
31
|
-
chalk.yellow(
|
|
32
|
-
`Something went wrong writing to ${chalk.bold(rootFileName)}`,
|
|
33
|
-
),
|
|
34
|
-
);
|
|
35
|
-
clack.log.info(
|
|
36
|
-
`Please put the following code snippet into ${chalk.bold(
|
|
37
|
-
rootFileName,
|
|
38
|
-
)}: ${chalk.dim('You probably have to clean it up a bit.')}\n`,
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
}
|