@sentry/wizard 4.5.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -1
- package/README.md +23 -19
- package/dist/bin.js +22 -0
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.js +16 -16
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -1
- package/dist/e2e-tests/tests/help-message.test.js +56 -0
- package/dist/e2e-tests/tests/help-message.test.js.map +1 -0
- package/dist/e2e-tests/tests/nextjs-14.test.js +17 -16
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-15.test.js +16 -16
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-3.test.js +13 -12
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +13 -12
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/remix.test.js +20 -20
- package/dist/e2e-tests/tests/remix.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit.test.js +20 -20
- package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.d.ts +1 -1
- package/dist/e2e-tests/utils/index.js +35 -13
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/lib/Constants.d.ts +7 -1
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/File.d.ts +1 -1
- package/dist/lib/Helper/File.js +1 -3
- package/dist/lib/Helper/File.js.map +1 -1
- package/dist/lib/Helper/Logging.d.ts +4 -1
- package/dist/lib/Helper/Logging.js +3 -0
- package/dist/lib/Helper/Logging.js.map +1 -1
- package/dist/lib/Helper/Package.d.ts +5 -3
- package/dist/lib/Helper/Package.js +2 -2
- package/dist/lib/Helper/Package.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +20 -7
- package/dist/lib/Helper/SentryCli.js +21 -13
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/lib/Helper/Wizard.js +9 -5
- package/dist/lib/Helper/Wizard.js.map +1 -1
- package/dist/lib/Helper/__tests__/File.js +9 -9
- package/dist/lib/Helper/__tests__/File.js.map +1 -1
- package/dist/lib/Helper/__tests__/MergeConfig.js +17 -17
- package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/__tests__/SentryCli.js +39 -21
- package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
- package/dist/lib/Setup.d.ts +4 -1
- package/dist/lib/Setup.js +12 -2
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/BaseStep.d.ts +1 -1
- package/dist/lib/Steps/BaseStep.js.map +1 -1
- package/dist/lib/Steps/Integrations/BaseIntegration.js +1 -2
- package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.js +14 -10
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.d.ts +4 -1
- package/dist/lib/Steps/Integrations/Electron.js +1 -1
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.d.ts +3 -1
- package/dist/lib/Steps/Integrations/MobileProject.js +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
- package/dist/lib/Steps/PromptForParameters.d.ts +4 -1
- package/dist/lib/Steps/PromptForParameters.js.map +1 -1
- package/dist/lib/Steps/SentryProjectSelector.d.ts +42 -1
- package/dist/lib/Steps/SentryProjectSelector.js +1 -1
- package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
- package/dist/lib/Steps/WaitForSentry.d.ts +3 -1
- package/dist/lib/Steps/WaitForSentry.js +4 -4
- package/dist/lib/Steps/WaitForSentry.js.map +1 -1
- package/dist/lib/Steps/Welcome.js +5 -0
- package/dist/lib/Steps/Welcome.js.map +1 -1
- package/dist/lib/Types.d.ts +14 -0
- package/dist/lib/Types.js +3 -0
- package/dist/lib/Types.js.map +1 -0
- package/dist/lib/__tests__/Env.js +10 -16
- package/dist/lib/__tests__/Env.js.map +1 -1
- package/dist/src/android/android-wizard.js +15 -12
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/android/code-tools.js +1 -1
- package/dist/src/android/code-tools.js.map +1 -1
- package/dist/src/android/gradle.js +4 -4
- package/dist/src/android/gradle.js.map +1 -1
- package/dist/src/android/manifest.js +1 -1
- package/dist/src/android/manifest.js.map +1 -1
- package/dist/src/apple/apple-wizard.d.ts +2 -2
- package/dist/src/apple/apple-wizard.js +54 -175
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/check-installed-cli.d.ts +1 -0
- package/dist/src/apple/check-installed-cli.js +60 -0
- package/dist/src/apple/check-installed-cli.js.map +1 -0
- package/dist/src/apple/cocoapod.js +1 -1
- package/dist/src/apple/cocoapod.js.map +1 -1
- package/dist/src/apple/code-tools.js +1 -1
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/configure-fastlane.d.ts +5 -0
- package/dist/src/apple/configure-fastlane.js +66 -0
- package/dist/src/apple/configure-fastlane.js.map +1 -0
- package/dist/src/apple/configure-package-manager.d.ts +5 -0
- package/dist/src/apple/configure-package-manager.js +68 -0
- package/dist/src/apple/configure-package-manager.js.map +1 -0
- package/dist/src/apple/configure-sentry-cli.d.ts +4 -0
- package/dist/src/apple/configure-sentry-cli.js +47 -0
- package/dist/src/apple/configure-sentry-cli.js.map +1 -0
- package/dist/src/apple/configure-xcode-project.d.ts +8 -0
- package/dist/src/apple/configure-xcode-project.js +11 -0
- package/dist/src/apple/configure-xcode-project.js.map +1 -0
- package/dist/src/apple/fastlane.d.ts +1 -1
- package/dist/src/apple/fastlane.js +5 -5
- package/dist/src/apple/fastlane.js.map +1 -1
- package/dist/src/apple/inject-code-snippet.d.ts +6 -0
- package/dist/src/apple/inject-code-snippet.js +54 -0
- package/dist/src/apple/inject-code-snippet.js.map +1 -0
- package/dist/src/apple/lookup-xcode-project.d.ts +7 -0
- package/dist/src/apple/lookup-xcode-project.js +98 -0
- package/dist/src/apple/lookup-xcode-project.js.map +1 -0
- package/dist/src/apple/options.d.ts +4 -0
- package/dist/src/apple/options.js +3 -0
- package/dist/src/apple/options.js.map +1 -0
- package/dist/src/apple/search-xcode-project-at-path.d.ts +1 -0
- package/dist/src/apple/search-xcode-project-at-path.js +70 -0
- package/dist/src/apple/search-xcode-project-at-path.js.map +1 -0
- package/dist/src/apple/templates.js +11 -7
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/apple/xcode-manager.js +4 -7
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/flutter/code-tools.js +3 -3
- package/dist/src/flutter/code-tools.js.map +1 -1
- package/dist/src/flutter/flutter-wizard.js +21 -15
- package/dist/src/flutter/flutter-wizard.js.map +1 -1
- package/dist/src/flutter/templates.js +4 -4
- package/dist/src/flutter/templates.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +118 -43
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.d.ts +10 -1
- package/dist/src/nextjs/templates.js +192 -62
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +21 -16
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/nuxt/sdk-example.js +3 -3
- package/dist/src/nuxt/sdk-example.js.map +1 -1
- package/dist/src/nuxt/sdk-setup.js +9 -9
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/nuxt/templates.js +173 -58
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/nuxt/utils.js +6 -3
- package/dist/src/nuxt/utils.js.map +1 -1
- package/dist/src/react-native/expo-env-file.js +1 -1
- package/dist/src/react-native/expo-env-file.js.map +1 -1
- package/dist/src/react-native/expo-metro.js +4 -4
- package/dist/src/react-native/expo-metro.js.map +1 -1
- package/dist/src/react-native/expo.js +4 -4
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/javascript.d.ts +6 -4
- package/dist/src/react-native/javascript.js +31 -15
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/metro.js +8 -8
- package/dist/src/react-native/metro.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.d.ts +5 -1
- package/dist/src/react-native/react-native-wizard.js +66 -36
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-native/uninstall.js +8 -5
- package/dist/src/react-native/uninstall.js.map +1 -1
- package/dist/src/react-native/xcode.d.ts +9 -4
- package/dist/src/react-native/xcode.js +65 -22
- package/dist/src/react-native/xcode.js.map +1 -1
- package/dist/src/remix/codemods/handle-error.js +4 -1
- package/dist/src/remix/codemods/handle-error.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +23 -18
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/remix/sdk-example.js +163 -64
- package/dist/src/remix/sdk-example.js.map +1 -1
- package/dist/src/remix/sdk-setup.js +11 -7
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/run.d.ts +3 -1
- package/dist/src/run.js +29 -9
- package/dist/src/run.js.map +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.js +30 -28
- package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
- package/dist/src/sourcemaps/tools/angular.js +3 -3
- package/dist/src/sourcemaps/tools/angular.js.map +1 -1
- package/dist/src/sourcemaps/tools/create-react-app.js +3 -3
- package/dist/src/sourcemaps/tools/create-react-app.js.map +1 -1
- package/dist/src/sourcemaps/tools/esbuild.js +6 -6
- package/dist/src/sourcemaps/tools/esbuild.js.map +1 -1
- package/dist/src/sourcemaps/tools/nextjs.js +5 -5
- package/dist/src/sourcemaps/tools/nextjs.js.map +1 -1
- package/dist/src/sourcemaps/tools/remix.js +4 -4
- package/dist/src/sourcemaps/tools/remix.js.map +1 -1
- package/dist/src/sourcemaps/tools/rollup.js +6 -6
- package/dist/src/sourcemaps/tools/rollup.js.map +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js +15 -15
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/tools/tsc.js +6 -6
- package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +12 -12
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sourcemaps/tools/webpack.js +10 -10
- package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
- package/dist/src/sourcemaps/utils/detect-tool.js +2 -2
- package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
- package/dist/src/sourcemaps/utils/other-wizards.js +5 -5
- package/dist/src/sourcemaps/utils/other-wizards.js.map +1 -1
- package/dist/src/sourcemaps/utils/sdk-version.js +7 -7
- package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -1
- package/dist/src/sveltekit/sdk-example.js +1 -1
- package/dist/src/sveltekit/sdk-example.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup.js +15 -14
- package/dist/src/sveltekit/sdk-setup.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +25 -20
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/sveltekit/templates.js +126 -37
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/telemetry.js +11 -0
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/utils/{clack-utils.d.ts → clack/index.d.ts} +45 -7
- package/dist/src/utils/{clack-utils.js → clack/index.js} +75 -20
- package/dist/src/utils/clack/index.js.map +1 -0
- package/dist/src/utils/debug.js +1 -1
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/find-files-with-extension.d.ts +1 -0
- package/dist/src/utils/find-files-with-extension.js +39 -0
- package/dist/src/utils/find-files-with-extension.js.map +1 -0
- package/dist/src/utils/package-manager.d.ts +8 -1
- package/dist/src/utils/package-manager.js +79 -23
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/src/utils/sentrycli-utils.js +0 -1
- package/dist/src/utils/sentrycli-utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +4 -0
- package/dist/src/utils/types.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/android/code-tools.test.js +13 -13
- package/dist/test/android/code-tools.test.js.map +1 -1
- package/dist/test/apple/cocoapod.test.js +78 -73
- package/dist/test/apple/cocoapod.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +174 -167
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/fastfile.test.js +87 -84
- package/dist/test/apple/fastfile.test.js.map +1 -1
- package/dist/test/apple/templates.test.js +32 -27
- package/dist/test/apple/templates.test.js.map +1 -1
- package/dist/test/apple/xcode-manager.test.js +208 -185
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/flutter/code-tools.test.js +29 -30
- package/dist/test/flutter/code-tools.test.js.map +1 -1
- package/dist/test/flutter/templates.test.js +38 -37
- package/dist/test/flutter/templates.test.js.map +1 -1
- package/dist/test/nextjs/templates.test.js +155 -103
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +25 -24
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/dist/test/react-native/expo-metro.test.js +12 -11
- package/dist/test/react-native/expo-metro.test.js.map +1 -1
- package/dist/test/react-native/expo.test.js +11 -10
- package/dist/test/react-native/expo.test.js.map +1 -1
- package/dist/test/react-native/gradle.test.js +27 -26
- package/dist/test/react-native/gradle.test.js.map +1 -1
- package/dist/test/react-native/javascript.test.js +109 -59
- package/dist/test/react-native/javascript.test.js.map +1 -1
- package/dist/test/react-native/metro.test.js +66 -65
- package/dist/test/react-native/metro.test.js.map +1 -1
- package/dist/test/react-native/xcode.test.js +138 -37
- package/dist/test/react-native/xcode.test.js.map +1 -1
- package/dist/test/remix/client-entry.test.js +8 -7
- package/dist/test/remix/client-entry.test.js.map +1 -1
- package/dist/test/remix/server-instrumentation.test.js +6 -5
- package/dist/test/remix/server-instrumentation.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/sentry-cli.test.js +21 -21
- package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/tsc.test.js +13 -14
- package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/vite.test.js +13 -14
- package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/webpack.test.js +19 -20
- package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -1
- package/dist/test/sveltekit/templates.test.js +13 -12
- package/dist/test/sveltekit/templates.test.js.map +1 -1
- package/dist/test/utils/ast-utils.test.js +45 -44
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.d.ts +1 -0
- package/dist/test/utils/clack/index.test.js +375 -0
- package/dist/test/utils/clack/index.test.js.map +1 -0
- package/dist/test/utils/package-manager.test.d.ts +1 -0
- package/dist/test/utils/package-manager.test.js +30 -0
- package/dist/test/utils/package-manager.test.js.map +1 -0
- package/package.json +10 -38
- package/dist/e2e-tests/jest.config.d.ts +0 -17
- package/dist/e2e-tests/jest.config.js +0 -23
- package/dist/e2e-tests/jest.config.js.map +0 -1
- package/dist/src/utils/clack-utils.js.map +0 -1
- package/dist/test/utils/clack-utils.test.js +0 -306
- package/dist/test/utils/clack-utils.test.js.map +0 -1
- /package/dist/{test/utils/clack-utils.test.d.ts → e2e-tests/tests/help-message.test.d.ts} +0 -0
|
@@ -29,7 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.getSentryExamplePageContents = exports.createExamplePage = void 0;
|
|
30
30
|
const fs = __importStar(require("fs"));
|
|
31
31
|
const path = __importStar(require("path"));
|
|
32
|
-
// @ts-
|
|
32
|
+
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
33
33
|
const prompts_1 = __importDefault(require("@clack/prompts"));
|
|
34
34
|
/**
|
|
35
35
|
* Creates an example Remix page to test Sentry
|
|
@@ -52,71 +52,170 @@ function getSentryExamplePageContents(options) {
|
|
|
52
52
|
const issuesPageLink = options.selfHosted
|
|
53
53
|
? `${options.url}organizations/${options.orgSlug}/issues/?project=${options.projectId}`
|
|
54
54
|
: `https://${options.orgSlug}.sentry.io/issues/?project=${options.projectId}`;
|
|
55
|
-
return `
|
|
55
|
+
return `import * as Sentry from "@sentry/remix";
|
|
56
|
+
import { useState } from "react";
|
|
57
|
+
|
|
58
|
+
export const meta = () => {
|
|
59
|
+
return [
|
|
60
|
+
{ title: "sentry-example-page" },
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
|
|
56
64
|
export default function SentryExamplePage() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
https://docs.sentry.io/platforms/javascript/guides/remix/
|
|
114
|
-
</a>
|
|
115
|
-
</p>
|
|
116
|
-
</main>
|
|
117
|
-
</div>
|
|
118
|
-
);
|
|
65
|
+
const [hasSentError, setHasSentError] = useState(false);
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div>
|
|
69
|
+
<main>
|
|
70
|
+
<div className="flex-spacer" />
|
|
71
|
+
<svg height="40" width="40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
72
|
+
<path d="M21.85 2.995a3.698 3.698 0 0 1 1.353 1.354l16.303 28.278a3.703 3.703 0 0 1-1.354 5.053 3.694 3.694 0 0 1-1.848.496h-3.828a31.149 31.149 0 0 0 0-3.09h3.815a.61.61 0 0 0 .537-.917L20.523 5.893a.61.61 0 0 0-1.057 0l-3.739 6.494a28.948 28.948 0 0 1 9.63 10.453 28.988 28.988 0 0 1 3.499 13.78v1.542h-9.852v-1.544a19.106 19.106 0 0 0-2.182-8.85 19.08 19.08 0 0 0-6.032-6.829l-1.85 3.208a15.377 15.377 0 0 1 6.382 12.484v1.542H3.696A3.694 3.694 0 0 1 0 34.473c0-.648.17-1.286.494-1.849l2.33-4.074a8.562 8.562 0 0 1 2.689 1.536L3.158 34.17a.611.611 0 0 0 .538.917h8.448a12.481 12.481 0 0 0-6.037-9.09l-1.344-.772 4.908-8.545 1.344.77a22.16 22.16 0 0 1 7.705 7.444 22.193 22.193 0 0 1 3.316 10.193h3.699a25.892 25.892 0 0 0-3.811-12.033 25.856 25.856 0 0 0-9.046-8.796l-1.344-.772 5.269-9.136a3.698 3.698 0 0 1 3.2-1.849c.648 0 1.285.17 1.847.495Z" fill="currentcolor"/>
|
|
73
|
+
</svg>
|
|
74
|
+
<h1>
|
|
75
|
+
sentry-example-page
|
|
76
|
+
</h1>
|
|
77
|
+
|
|
78
|
+
<p className="description">
|
|
79
|
+
Click the button below, and view the sample error on the Sentry <a target="_blank" rel="noreferrer" href="${issuesPageLink}">Issues Page</a>.
|
|
80
|
+
For more details about setting up Sentry, <a target="_blank" rel="noreferrer" href="https://docs.sentry.io/platforms/javascript/guides/remix/">read our docs</a>.
|
|
81
|
+
</p>
|
|
82
|
+
|
|
83
|
+
<button
|
|
84
|
+
type="button"
|
|
85
|
+
onClick={async () => {
|
|
86
|
+
await Sentry.startSpan({
|
|
87
|
+
name: 'Example Frontend Span',
|
|
88
|
+
op: 'test'
|
|
89
|
+
}, async () => {
|
|
90
|
+
const res = await fetch("/api/sentry-example-api");
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
setHasSentError(true);
|
|
93
|
+
throw new Error("Sentry Example Frontend Error");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
<span>
|
|
99
|
+
Throw Sample Error
|
|
100
|
+
</span>
|
|
101
|
+
</button>
|
|
102
|
+
|
|
103
|
+
{hasSentError ? (
|
|
104
|
+
<p className="success">
|
|
105
|
+
Sample error was sent to Sentry.
|
|
106
|
+
</p>
|
|
107
|
+
) : (
|
|
108
|
+
<div className="success_placeholder" />
|
|
109
|
+
)}
|
|
110
|
+
|
|
111
|
+
<div className="flex-spacer" />
|
|
112
|
+
<p className="description">
|
|
113
|
+
Adblockers will prevent errors from being sent to Sentry.
|
|
114
|
+
</p>
|
|
115
|
+
</main>
|
|
116
|
+
|
|
117
|
+
{/* Not for production use! We're just saving you from having to delete an extra CSS file ;) */}
|
|
118
|
+
<style dangerouslySetInnerHTML={{ __html: styles }}></style>
|
|
119
|
+
</div>
|
|
120
|
+
);
|
|
119
121
|
}
|
|
122
|
+
|
|
123
|
+
const styles = \`
|
|
124
|
+
main {
|
|
125
|
+
display: flex;
|
|
126
|
+
min-height: 100vh;
|
|
127
|
+
flex-direction: column;
|
|
128
|
+
justify-content: center;
|
|
129
|
+
align-items: center;
|
|
130
|
+
gap: 16px;
|
|
131
|
+
padding: 16px;
|
|
132
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
h1 {
|
|
136
|
+
padding: 0px 4px;
|
|
137
|
+
border-radius: 4px;
|
|
138
|
+
background-color: rgba(24, 20, 35, 0.03);
|
|
139
|
+
font-family: monospace;
|
|
140
|
+
font-size: 20px;
|
|
141
|
+
line-height: 1.2;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
p {
|
|
145
|
+
margin: 0;
|
|
146
|
+
font-size: 20px;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
a {
|
|
150
|
+
color: #6341F0;
|
|
151
|
+
text-decoration: underline;
|
|
152
|
+
cursor: pointer;
|
|
153
|
+
|
|
154
|
+
@media (prefers-color-scheme: dark) {
|
|
155
|
+
color: #B3A1FF;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
button {
|
|
160
|
+
border-radius: 8px;
|
|
161
|
+
color: white;
|
|
162
|
+
cursor: pointer;
|
|
163
|
+
background-color: #553DB8;
|
|
164
|
+
border: none;
|
|
165
|
+
padding: 0;
|
|
166
|
+
margin-top: 4px;
|
|
167
|
+
|
|
168
|
+
& > span {
|
|
169
|
+
display: inline-block;
|
|
170
|
+
padding: 12px 16px;
|
|
171
|
+
border-radius: inherit;
|
|
172
|
+
font-size: 20px;
|
|
173
|
+
font-weight: bold;
|
|
174
|
+
line-height: 1;
|
|
175
|
+
background-color: #7553FF;
|
|
176
|
+
border: 1px solid #553DB8;
|
|
177
|
+
transform: translateY(-4px);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
&:hover > span {
|
|
181
|
+
transform: translateY(-8px);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
&:active > span {
|
|
185
|
+
transform: translateY(0);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.description {
|
|
190
|
+
text-align: center;
|
|
191
|
+
color: #6E6C75;
|
|
192
|
+
max-width: 500px;
|
|
193
|
+
line-height: 1.5;
|
|
194
|
+
font-size: 20px;
|
|
195
|
+
|
|
196
|
+
@media (prefers-color-scheme: dark) {
|
|
197
|
+
color: #A49FB5;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.flex-spacer {
|
|
202
|
+
flex: 1;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.success {
|
|
206
|
+
padding: 12px 16px;
|
|
207
|
+
border-radius: 8px;
|
|
208
|
+
font-size: 20px;
|
|
209
|
+
line-height: 1;
|
|
210
|
+
background-color: #00F261;
|
|
211
|
+
border: 1px solid #00BF4D;
|
|
212
|
+
color: #181423;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.success_placeholder {
|
|
216
|
+
height: 46px;
|
|
217
|
+
}
|
|
218
|
+
\`;
|
|
120
219
|
`;
|
|
121
220
|
}
|
|
122
221
|
exports.getSentryExamplePageContents = getSentryExamplePageContents;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-example.js","sourceRoot":"","sources":["../../../src/remix/sdk-example.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B
|
|
1
|
+
{"version":3,"file":"sdk-example.js","sourceRoot":"","sources":["../../../src/remix/sdk-example.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,+EAA+E;AAC/E,6DAAmC;AAEnC;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,OAMvC;IACC,MAAM,UAAU,GAAG,YAAY,CAAC;IAEhC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QAC9B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KAC/C;IAED,MAAM,gBAAgB,GAAG,kCACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACxB,GAAG,CAAC;IAEJ,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;QACnC,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,uDAAuD,IAAI,CAAC,QAAQ,CAClE,gBAAgB,CACjB,wCAAwC,CAC1C,CAAC;QACF,OAAO;KACR;IAED,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,gBAAgB,EAChB,4BAA4B,CAAC,OAAO,CAAC,CACtC,CAAC;IAEF,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,gBAAgB,GAAG,CAAC,CAAC;AACxE,CAAC;AAhCD,8CAgCC;AAED,SAAgB,4BAA4B,CAAC,OAM5C;IACC,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,iBAAiB,OAAO,CAAC,OAAO,oBAAoB,OAAO,CAAC,SAAS,EAAE;QACvF,CAAC,CAAC,WAAW,OAAO,CAAC,OAAO,8BAA8B,OAAO,CAAC,SAAS,EAAE,CAAC;IAEhF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;sHAwB6G,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4InI,CAAC;AACF,CAAC;AAhLD,oEAgLC","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n\n/**\n * Creates an example Remix page to test Sentry\n */\nexport async function createExamplePage(options: {\n selfHosted: boolean;\n orgSlug: string;\n projectId: string;\n url: string;\n isTS: boolean;\n}) {\n const routesPath = 'app/routes';\n\n if (!fs.existsSync(routesPath)) {\n fs.mkdirSync(routesPath, { recursive: true });\n }\n\n const exampleRoutePath = `app/routes/sentry-example-page.${\n options.isTS ? 'ts' : 'js'\n }x`;\n\n if (fs.existsSync(exampleRoutePath)) {\n clack.log.warn(\n `It seems like a sentry example page already exists (${path.basename(\n exampleRoutePath,\n )}). Skipping creation of example route.`,\n );\n return;\n }\n\n await fs.promises.writeFile(\n exampleRoutePath,\n getSentryExamplePageContents(options),\n );\n\n clack.log.info(`Created sentry example page at ${exampleRoutePath}.`);\n}\n\nexport function getSentryExamplePageContents(options: {\n selfHosted: boolean;\n orgSlug: string;\n projectId: string;\n url: string;\n isTS?: boolean;\n}) {\n const issuesPageLink = options.selfHosted\n ? `${options.url}organizations/${options.orgSlug}/issues/?project=${options.projectId}`\n : `https://${options.orgSlug}.sentry.io/issues/?project=${options.projectId}`;\n\n return `import * as Sentry from \"@sentry/remix\";\nimport { useState } from \"react\";\n\nexport const meta = () => {\n return [\n { title: \"sentry-example-page\" },\n ];\n}\n\nexport default function SentryExamplePage() {\n const [hasSentError, setHasSentError] = useState(false);\n\n return (\n <div>\n <main>\n <div className=\"flex-spacer\" />\n <svg height=\"40\" width=\"40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.85 2.995a3.698 3.698 0 0 1 1.353 1.354l16.303 28.278a3.703 3.703 0 0 1-1.354 5.053 3.694 3.694 0 0 1-1.848.496h-3.828a31.149 31.149 0 0 0 0-3.09h3.815a.61.61 0 0 0 .537-.917L20.523 5.893a.61.61 0 0 0-1.057 0l-3.739 6.494a28.948 28.948 0 0 1 9.63 10.453 28.988 28.988 0 0 1 3.499 13.78v1.542h-9.852v-1.544a19.106 19.106 0 0 0-2.182-8.85 19.08 19.08 0 0 0-6.032-6.829l-1.85 3.208a15.377 15.377 0 0 1 6.382 12.484v1.542H3.696A3.694 3.694 0 0 1 0 34.473c0-.648.17-1.286.494-1.849l2.33-4.074a8.562 8.562 0 0 1 2.689 1.536L3.158 34.17a.611.611 0 0 0 .538.917h8.448a12.481 12.481 0 0 0-6.037-9.09l-1.344-.772 4.908-8.545 1.344.77a22.16 22.16 0 0 1 7.705 7.444 22.193 22.193 0 0 1 3.316 10.193h3.699a25.892 25.892 0 0 0-3.811-12.033 25.856 25.856 0 0 0-9.046-8.796l-1.344-.772 5.269-9.136a3.698 3.698 0 0 1 3.2-1.849c.648 0 1.285.17 1.847.495Z\" fill=\"currentcolor\"/>\n </svg>\n <h1>\n sentry-example-page\n </h1>\n\n <p className=\"description\">\n Click the button below, and view the sample error on the Sentry <a target=\"_blank\" rel=\"noreferrer\" href=\"${issuesPageLink}\">Issues Page</a>. \n For more details about setting up Sentry, <a target=\"_blank\" rel=\"noreferrer\" href=\"https://docs.sentry.io/platforms/javascript/guides/remix/\">read our docs</a>.\n </p>\n\n <button\n type=\"button\"\n onClick={async () => {\n await Sentry.startSpan({\n name: 'Example Frontend Span',\n op: 'test'\n }, async () => {\n const res = await fetch(\"/api/sentry-example-api\");\n if (!res.ok) {\n setHasSentError(true);\n throw new Error(\"Sentry Example Frontend Error\");\n }\n });\n }}\n >\n <span>\n Throw Sample Error\n </span>\n </button>\n\n {hasSentError ? (\n <p className=\"success\">\n Sample error was sent to Sentry.\n </p>\n ) : (\n <div className=\"success_placeholder\" />\n )}\n\n <div className=\"flex-spacer\" />\n <p className=\"description\">\n Adblockers will prevent errors from being sent to Sentry.\n </p>\n </main>\n\n {/* Not for production use! We're just saving you from having to delete an extra CSS file ;) */}\n <style dangerouslySetInnerHTML={{ __html: styles }}></style>\n </div>\n );\n}\n\nconst styles = \\`\n main {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 16px;\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif;\n }\n\n h1 {\n padding: 0px 4px;\n border-radius: 4px;\n background-color: rgba(24, 20, 35, 0.03);\n font-family: monospace;\n font-size: 20px;\n line-height: 1.2;\n }\n\n p {\n margin: 0;\n font-size: 20px;\n }\n\n a {\n color: #6341F0;\n text-decoration: underline;\n cursor: pointer;\n\n @media (prefers-color-scheme: dark) {\n color: #B3A1FF;\n }\n }\n\n button {\n border-radius: 8px;\n color: white;\n cursor: pointer;\n background-color: #553DB8;\n border: none;\n padding: 0;\n margin-top: 4px;\n\n & > span {\n display: inline-block;\n padding: 12px 16px;\n border-radius: inherit;\n font-size: 20px;\n font-weight: bold;\n line-height: 1;\n background-color: #7553FF;\n border: 1px solid #553DB8;\n transform: translateY(-4px);\n }\n\n &:hover > span {\n transform: translateY(-8px);\n }\n\n &:active > span {\n transform: translateY(0);\n }\n }\n\n .description {\n text-align: center;\n color: #6E6C75;\n max-width: 500px;\n line-height: 1.5;\n font-size: 20px;\n\n @media (prefers-color-scheme: dark) {\n color: #A49FB5;\n }\n }\n\n .flex-spacer {\n flex: 1;\n }\n\n .success {\n padding: 12px 16px;\n border-radius: 8px;\n font-size: 20px;\n line-height: 1;\n background-color: #00F261;\n border: 1px solid #00BF4D;\n color: #181423;\n }\n\n .success_placeholder {\n height: 46px;\n }\n\\`;\n`;\n}\n"]}
|
|
@@ -42,7 +42,7 @@ const utils_1 = require("./utils");
|
|
|
42
42
|
const root_v1_1 = require("./codemods/root-v1");
|
|
43
43
|
const root_v2_1 = require("./codemods/root-v2");
|
|
44
44
|
const handle_error_1 = require("./codemods/handle-error");
|
|
45
|
-
const
|
|
45
|
+
const clack_1 = require("../utils/clack");
|
|
46
46
|
const express_server_1 = require("./codemods/express-server");
|
|
47
47
|
const REMIX_CONFIG_FILE = 'remix.config.js';
|
|
48
48
|
const REMIX_REVEAL_COMMAND = 'npx remix reveal';
|
|
@@ -74,11 +74,9 @@ function getInitCallArgs(dsn, type, selectedFeatures) {
|
|
|
74
74
|
(selectedFeatures.performance || selectedFeatures.replay)) {
|
|
75
75
|
initCallArgs.integrations = [];
|
|
76
76
|
if (selectedFeatures.performance) {
|
|
77
|
-
// @ts-expect-error - Adding Proxified AST node to the array
|
|
78
77
|
initCallArgs.integrations.push(magicast_1.builders.functionCall('Sentry.browserTracingIntegration', magicast_1.builders.raw('{ useEffect, useLocation, useMatches }')));
|
|
79
78
|
}
|
|
80
79
|
if (selectedFeatures.replay) {
|
|
81
|
-
// @ts-expect-error - Adding Proxified AST node to the array
|
|
82
80
|
initCallArgs.integrations.push(magicast_1.builders.functionCall('Sentry.replayIntegration', {
|
|
83
81
|
maskAllText: true,
|
|
84
82
|
blockAllMedia: true,
|
|
@@ -89,7 +87,10 @@ function getInitCallArgs(dsn, type, selectedFeatures) {
|
|
|
89
87
|
}
|
|
90
88
|
return initCallArgs;
|
|
91
89
|
}
|
|
92
|
-
function insertClientInitCall(dsn,
|
|
90
|
+
function insertClientInitCall(dsn,
|
|
91
|
+
// MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
93
|
+
originalHooksMod, selectedFeatures) {
|
|
93
94
|
const initCallArgs = getInitCallArgs(dsn, 'client', selectedFeatures);
|
|
94
95
|
const initCall = magicast_1.builders.functionCall('Sentry.init', initCallArgs);
|
|
95
96
|
const originalHooksModAST = originalHooksMod.$ast;
|
|
@@ -189,7 +190,7 @@ async function instrumentRootRoute(isV2, isTS) {
|
|
|
189
190
|
}
|
|
190
191
|
exports.instrumentRootRoute = instrumentRootRoute;
|
|
191
192
|
async function updateBuildScript(args) {
|
|
192
|
-
const packageJson = await (0,
|
|
193
|
+
const packageJson = await (0, clack_1.getPackageDotJson)();
|
|
193
194
|
if (!packageJson.scripts) {
|
|
194
195
|
packageJson.scripts = {};
|
|
195
196
|
}
|
|
@@ -215,7 +216,10 @@ async function updateBuildScript(args) {
|
|
|
215
216
|
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
216
217
|
}
|
|
217
218
|
exports.updateBuildScript = updateBuildScript;
|
|
218
|
-
function updateEntryClientMod(
|
|
219
|
+
function updateEntryClientMod(
|
|
220
|
+
// MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here
|
|
221
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
222
|
+
originalEntryClientMod, dsn, selectedFeatures) {
|
|
219
223
|
originalEntryClientMod.imports.$add({
|
|
220
224
|
from: '@sentry/remix',
|
|
221
225
|
imported: '*',
|
|
@@ -255,7 +259,7 @@ async function initializeSentryOnEntryClient(dsn, isTS, selectedFeatures) {
|
|
|
255
259
|
}
|
|
256
260
|
exports.initializeSentryOnEntryClient = initializeSentryOnEntryClient;
|
|
257
261
|
async function updateStartScript(instrumentationFile) {
|
|
258
|
-
const packageJson = await (0,
|
|
262
|
+
const packageJson = await (0, clack_1.getPackageDotJson)();
|
|
259
263
|
if (!packageJson.scripts || !packageJson.scripts.start) {
|
|
260
264
|
throw new Error("Couldn't find a `start` script in your package.json. Please add one manually.");
|
|
261
265
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/remix/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport type { Program } from '@babel/types';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { ProxifiedModule } from 'magicast';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport * as childProcess from 'child_process';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { gte, minVersion } from 'semver';\n\nimport {\n builders,\n generateCode,\n loadFile,\n parseModule,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\nimport type { PackageDotJson } from '../utils/package-json';\nimport { getPackageVersion } from '../utils/package-json';\nimport {\n getAfterImportsInsertionIndex,\n hasSentryContent,\n serverHasInstrumentationImport,\n} from './utils';\nimport { instrumentRootRouteV1 } from './codemods/root-v1';\nimport { instrumentRootRouteV2 } from './codemods/root-v2';\nimport { instrumentHandleError } from './codemods/handle-error';\nimport { getPackageDotJson } from '../utils/clack-utils';\nimport { findCustomExpressServerImplementation } from './codemods/express-server';\n\nexport type PartialRemixConfig = {\n unstable_dev?: boolean;\n future?: {\n v2_dev?: boolean;\n v2_errorBoundary?: boolean;\n v2_headers?: boolean;\n v2_meta?: boolean;\n v2_normalizeFormMethod?: boolean;\n v2_routeConvention?: boolean;\n };\n};\n\nconst REMIX_CONFIG_FILE = 'remix.config.js';\nconst REMIX_REVEAL_COMMAND = 'npx remix reveal';\n\nexport function runRemixReveal(isTS: boolean): void {\n // Check if entry files already exist\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const clientEntryPath = path.join(process.cwd(), 'app', clientEntryFilename);\n const serverEntryPath = path.join(process.cwd(), 'app', serverEntryFilename);\n\n if (fs.existsSync(clientEntryPath) && fs.existsSync(serverEntryPath)) {\n clack.log.info(\n `Found entry files ${chalk.cyan(clientEntryFilename)} and ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n } else {\n clack.log.info(\n `Couldn't find entry files in your project. Trying to run ${chalk.cyan(\n REMIX_REVEAL_COMMAND,\n )}...`,\n );\n\n clack.log.info(childProcess.execSync(REMIX_REVEAL_COMMAND).toString());\n }\n}\n\nfunction getInitCallArgs(\n dsn: string,\n type: 'client' | 'server',\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n const initCallArgs = {\n dsn,\n } as Record<string, unknown>;\n\n // Adding tracing sample rate for both client and server\n if (selectedFeatures.performance) {\n initCallArgs.tracesSampleRate = 1.0;\n }\n\n // Adding integrations and replay options only for client\n if (\n type === 'client' &&\n (selectedFeatures.performance || selectedFeatures.replay)\n ) {\n initCallArgs.integrations = [];\n\n if (selectedFeatures.performance) {\n // @ts-expect-error - Adding Proxified AST node to the array\n initCallArgs.integrations.push(\n builders.functionCall(\n 'Sentry.browserTracingIntegration',\n builders.raw('{ useEffect, useLocation, useMatches }'),\n ),\n );\n }\n\n if (selectedFeatures.replay) {\n // @ts-expect-error - Adding Proxified AST node to the array\n initCallArgs.integrations.push(\n builders.functionCall('Sentry.replayIntegration', {\n maskAllText: true,\n blockAllMedia: true,\n }),\n );\n\n initCallArgs.replaysSessionSampleRate = 0.1;\n initCallArgs.replaysOnErrorSampleRate = 1.0;\n }\n }\n\n return initCallArgs;\n}\n\nfunction insertClientInitCall(\n dsn: string,\n originalHooksMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): void {\n const initCallArgs = getInitCallArgs(dsn, 'client', selectedFeatures);\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n const initCallInsertionIndex =\n getAfterImportsInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\nexport function generateServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n // create an empty file named `instrument.server.mjs`\n const instrumentationFile = 'instrumentation.server.mjs';\n const instrumentationFileMod = parseModule('');\n\n instrumentationFileMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n const initCallArgs = getInitCallArgs(dsn, 'server', selectedFeatures);\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n\n const instrumentationFileModAST = instrumentationFileMod.$ast as Program;\n\n const initCallInsertionIndex = getAfterImportsInsertionIndex(\n instrumentationFileModAST,\n );\n\n instrumentationFileModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n\n return { instrumentationFile, instrumentationFileMod };\n}\n\nexport async function createServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n const { instrumentationFile, instrumentationFileMod } =\n generateServerInstrumentationFile(dsn, selectedFeatures);\n\n await writeFile(instrumentationFileMod.$ast, instrumentationFile);\n\n return instrumentationFile;\n}\n\nexport async function insertServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n const instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n\n const expressServerPath = await findCustomExpressServerImplementation();\n\n if (!expressServerPath) {\n return false;\n }\n\n const originalExpressServerMod = await loadFile(expressServerPath);\n\n if (\n serverHasInstrumentationImport(\n expressServerPath,\n originalExpressServerMod.$code,\n )\n ) {\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(expressServerPath),\n )} already contains instrumentation import.\nSkipping adding instrumentation functionality to ${chalk.cyan(\n path.basename(expressServerPath),\n )}.`,\n );\n\n return true;\n }\n\n originalExpressServerMod.$code = `import './${instrumentationFile}';\\n${originalExpressServerMod.$code}`;\n\n fs.writeFileSync(expressServerPath, originalExpressServerMod.$code);\n\n return true;\n}\n\nexport function isRemixV2(\n remixConfig: PartialRemixConfig,\n packageJson: PackageDotJson,\n): boolean {\n const remixVersion = getPackageVersion('@remix-run/react', packageJson);\n if (!remixVersion) {\n return false;\n }\n\n const minVer = minVersion(remixVersion);\n\n if (!minVer) {\n return false;\n }\n\n const isV2Remix = gte(minVer, '2.0.0');\n\n return isV2Remix || remixConfig?.future?.v2_errorBoundary || false;\n}\n\nexport async function loadRemixConfig(): Promise<PartialRemixConfig> {\n const configFilePath = path.join(process.cwd(), REMIX_CONFIG_FILE);\n\n try {\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n\n const configUrl = url.pathToFileURL(configFilePath).href;\n const remixConfigModule = (await import(configUrl)) as {\n default: PartialRemixConfig;\n };\n\n return remixConfigModule?.default || {};\n } catch (e: unknown) {\n clack.log.error(`Couldn't load ${REMIX_CONFIG_FILE}.`);\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n\n return {};\n }\n}\n\nexport async function instrumentRootRoute(\n isV2?: boolean,\n isTS?: boolean,\n): Promise<void> {\n const rootFilename = `root.${isTS ? 'tsx' : 'jsx'}`;\n\n if (isV2) {\n await instrumentRootRouteV2(rootFilename);\n } else {\n await instrumentRootRouteV1(rootFilename);\n }\n\n clack.log.success(\n `Successfully instrumented root route ${chalk.cyan(rootFilename)}.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport async function updateBuildScript(args: {\n org: string;\n project: string;\n url?: string;\n isHydrogen: boolean;\n}): Promise<void> {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n const buildCommand = args.isHydrogen\n ? 'shopify hydrogen build'\n : 'remix build';\n\n const instrumentedBuildCommand =\n `${buildCommand} --sourcemap && sentry-upload-sourcemaps --org ${args.org} --project ${args.project}` +\n (args.url ? ` --url ${args.url}` : '') +\n (args.isHydrogen ? ' --buildPath ./dist' : '');\n\n if (!packageJson.scripts.build) {\n packageJson.scripts.build = instrumentedBuildCommand;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n } else if (packageJson.scripts.build.includes(buildCommand)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n packageJson.scripts.build = packageJson.scripts.build.replace(\n buildCommand,\n instrumentedBuildCommand,\n );\n } else {\n throw new Error(\n \"`build` script doesn't contain a known build command. Please update it manually.\",\n );\n }\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('build')} script in ${chalk.cyan(\n 'package.json',\n )} to generate and upload sourcemaps.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport function updateEntryClientMod(\n originalEntryClientMod: ProxifiedModule<any>,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): ProxifiedModule<any> {\n originalEntryClientMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n if (selectedFeatures.performance) {\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useLocation',\n local: 'useLocation',\n });\n\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useMatches',\n local: 'useMatches',\n });\n\n originalEntryClientMod.imports.$add({\n from: 'react',\n imported: 'useEffect',\n local: 'useEffect',\n });\n }\n\n insertClientInitCall(dsn, originalEntryClientMod, selectedFeatures);\n\n return originalEntryClientMod;\n}\n\nexport async function initializeSentryOnEntryClient(\n dsn: string,\n isTS: boolean,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): Promise<void> {\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryClient = path.join(\n process.cwd(),\n 'app',\n clientEntryFilename,\n );\n\n const originalEntryClientMod = await loadFile(originalEntryClient);\n\n if (hasSentryContent(originalEntryClient, originalEntryClientMod.$code)) {\n return;\n }\n\n const updatedEntryClientMod = updateEntryClientMod(\n originalEntryClientMod,\n dsn,\n selectedFeatures,\n );\n\n await writeFile(\n updatedEntryClientMod.$ast,\n path.join(process.cwd(), 'app', clientEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on client entry point ${chalk.cyan(\n clientEntryFilename,\n )}`,\n );\n}\n\nexport async function updateStartScript(instrumentationFile: string) {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts || !packageJson.scripts.start) {\n throw new Error(\n \"Couldn't find a `start` script in your package.json. Please add one manually.\",\n );\n }\n\n if (packageJson.scripts.start.includes('NODE_OPTIONS')) {\n clack.log.warn(\n `Found existing NODE_OPTIONS in ${chalk.cyan(\n 'start',\n )} script. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n if (\n !packageJson.scripts.start.includes('remix-serve') &&\n // Adding a following empty space not to match a path that includes `node`\n !packageJson.scripts.start.includes('node ')\n ) {\n clack.log.warn(\n `Found a ${chalk.cyan('start')} script that doesn't use ${chalk.cyan(\n 'remix-serve',\n )} or ${chalk.cyan('node')}. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n const startCommand = packageJson.scripts.start;\n\n packageJson.scripts.start = `NODE_OPTIONS='--import ./${instrumentationFile}' ${startCommand}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('start')} script in ${chalk.cyan(\n 'package.json',\n )} to include Sentry initialization on start.`,\n );\n}\n\nexport async function instrumentSentryOnEntryServer(\n isV2: boolean,\n isTS: boolean,\n): Promise<void> {\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryServer = path.join(\n process.cwd(),\n 'app',\n serverEntryFilename,\n );\n\n const originalEntryServerMod = await loadFile(originalEntryServer);\n\n if (hasSentryContent(originalEntryServer, originalEntryServerMod.$code)) {\n return;\n }\n\n originalEntryServerMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n if (isV2) {\n const handleErrorInstrumented = instrumentHandleError(\n originalEntryServerMod,\n serverEntryFilename,\n );\n\n if (handleErrorInstrumented) {\n clack.log.success(\n `Instrumented ${chalk.cyan('handleError')} in ${chalk.cyan(\n `${serverEntryFilename}`,\n )}`,\n );\n }\n }\n\n await writeFile(\n originalEntryServerMod.$ast,\n path.join(process.cwd(), 'app', serverEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on server entry point ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/remix/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport type { Program } from '@babel/types';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { Proxified, ProxifiedModule } from 'magicast';\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport * as childProcess from 'child_process';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport { gte, minVersion } from 'semver';\n\nimport {\n builders,\n generateCode,\n loadFile,\n parseModule,\n writeFile,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\nimport type { PackageDotJson } from '../utils/package-json';\nimport { getPackageVersion } from '../utils/package-json';\nimport {\n getAfterImportsInsertionIndex,\n hasSentryContent,\n serverHasInstrumentationImport,\n} from './utils';\nimport { instrumentRootRouteV1 } from './codemods/root-v1';\nimport { instrumentRootRouteV2 } from './codemods/root-v2';\nimport { instrumentHandleError } from './codemods/handle-error';\nimport { getPackageDotJson } from '../utils/clack';\nimport { findCustomExpressServerImplementation } from './codemods/express-server';\n\nexport type PartialRemixConfig = {\n unstable_dev?: boolean;\n future?: {\n v2_dev?: boolean;\n v2_errorBoundary?: boolean;\n v2_headers?: boolean;\n v2_meta?: boolean;\n v2_normalizeFormMethod?: boolean;\n v2_routeConvention?: boolean;\n };\n};\n\nconst REMIX_CONFIG_FILE = 'remix.config.js';\nconst REMIX_REVEAL_COMMAND = 'npx remix reveal';\n\nexport function runRemixReveal(isTS: boolean): void {\n // Check if entry files already exist\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const clientEntryPath = path.join(process.cwd(), 'app', clientEntryFilename);\n const serverEntryPath = path.join(process.cwd(), 'app', serverEntryFilename);\n\n if (fs.existsSync(clientEntryPath) && fs.existsSync(serverEntryPath)) {\n clack.log.info(\n `Found entry files ${chalk.cyan(clientEntryFilename)} and ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n } else {\n clack.log.info(\n `Couldn't find entry files in your project. Trying to run ${chalk.cyan(\n REMIX_REVEAL_COMMAND,\n )}...`,\n );\n\n clack.log.info(childProcess.execSync(REMIX_REVEAL_COMMAND).toString());\n }\n}\n\ninterface SdkAstOptions {\n dsn: string;\n tracesSampleRate?: number;\n replaysSessionSampleRate?: number;\n replaysOnErrorSampleRate?: number;\n integrations?: Array<Proxified>;\n}\n\nfunction getInitCallArgs(\n dsn: string,\n type: 'client' | 'server',\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n const initCallArgs: SdkAstOptions = {\n dsn,\n };\n\n // Adding tracing sample rate for both client and server\n if (selectedFeatures.performance) {\n initCallArgs.tracesSampleRate = 1.0;\n }\n\n // Adding integrations and replay options only for client\n if (\n type === 'client' &&\n (selectedFeatures.performance || selectedFeatures.replay)\n ) {\n initCallArgs.integrations = [] as Array<Proxified>;\n\n if (selectedFeatures.performance) {\n initCallArgs.integrations.push(\n builders.functionCall(\n 'Sentry.browserTracingIntegration',\n builders.raw('{ useEffect, useLocation, useMatches }'),\n ),\n );\n }\n\n if (selectedFeatures.replay) {\n initCallArgs.integrations.push(\n builders.functionCall('Sentry.replayIntegration', {\n maskAllText: true,\n blockAllMedia: true,\n }),\n );\n\n initCallArgs.replaysSessionSampleRate = 0.1;\n initCallArgs.replaysOnErrorSampleRate = 1.0;\n }\n }\n\n return initCallArgs;\n}\n\nfunction insertClientInitCall(\n dsn: string,\n // MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalHooksMod: ProxifiedModule<any>,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): void {\n const initCallArgs = getInitCallArgs(dsn, 'client', selectedFeatures);\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n const initCallInsertionIndex =\n getAfterImportsInsertionIndex(originalHooksModAST);\n\n originalHooksModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n}\n\nexport function generateServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n // create an empty file named `instrument.server.mjs`\n const instrumentationFile = 'instrumentation.server.mjs';\n const instrumentationFileMod = parseModule('');\n\n instrumentationFileMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n const initCallArgs = getInitCallArgs(dsn, 'server', selectedFeatures);\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n\n const instrumentationFileModAST = instrumentationFileMod.$ast as Program;\n\n const initCallInsertionIndex = getAfterImportsInsertionIndex(\n instrumentationFileModAST,\n );\n\n instrumentationFileModAST.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n generateCode(initCall).code,\n );\n\n return { instrumentationFile, instrumentationFileMod };\n}\n\nexport async function createServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n const { instrumentationFile, instrumentationFileMod } =\n generateServerInstrumentationFile(dsn, selectedFeatures);\n\n await writeFile(instrumentationFileMod.$ast, instrumentationFile);\n\n return instrumentationFile;\n}\n\nexport async function insertServerInstrumentationFile(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n) {\n const instrumentationFile = await createServerInstrumentationFile(\n dsn,\n selectedFeatures,\n );\n\n const expressServerPath = await findCustomExpressServerImplementation();\n\n if (!expressServerPath) {\n return false;\n }\n\n const originalExpressServerMod = await loadFile(expressServerPath);\n\n if (\n serverHasInstrumentationImport(\n expressServerPath,\n originalExpressServerMod.$code,\n )\n ) {\n clack.log.warn(\n `File ${chalk.cyan(\n path.basename(expressServerPath),\n )} already contains instrumentation import.\nSkipping adding instrumentation functionality to ${chalk.cyan(\n path.basename(expressServerPath),\n )}.`,\n );\n\n return true;\n }\n\n originalExpressServerMod.$code = `import './${instrumentationFile}';\\n${originalExpressServerMod.$code}`;\n\n fs.writeFileSync(expressServerPath, originalExpressServerMod.$code);\n\n return true;\n}\n\nexport function isRemixV2(\n remixConfig: PartialRemixConfig,\n packageJson: PackageDotJson,\n): boolean {\n const remixVersion = getPackageVersion('@remix-run/react', packageJson);\n if (!remixVersion) {\n return false;\n }\n\n const minVer = minVersion(remixVersion);\n\n if (!minVer) {\n return false;\n }\n\n const isV2Remix = gte(minVer, '2.0.0');\n\n return isV2Remix || remixConfig?.future?.v2_errorBoundary || false;\n}\n\nexport async function loadRemixConfig(): Promise<PartialRemixConfig> {\n const configFilePath = path.join(process.cwd(), REMIX_CONFIG_FILE);\n\n try {\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n\n const configUrl = url.pathToFileURL(configFilePath).href;\n const remixConfigModule = (await import(configUrl)) as {\n default: PartialRemixConfig;\n };\n\n return remixConfigModule?.default || {};\n } catch (e: unknown) {\n clack.log.error(`Couldn't load ${REMIX_CONFIG_FILE}.`);\n clack.log.info(\n chalk.dim(\n typeof e === 'object' && e != null && 'toString' in e\n ? e.toString()\n : typeof e === 'string'\n ? e\n : 'Unknown error',\n ),\n );\n\n return {};\n }\n}\n\nexport async function instrumentRootRoute(\n isV2?: boolean,\n isTS?: boolean,\n): Promise<void> {\n const rootFilename = `root.${isTS ? 'tsx' : 'jsx'}`;\n\n if (isV2) {\n await instrumentRootRouteV2(rootFilename);\n } else {\n await instrumentRootRouteV1(rootFilename);\n }\n\n clack.log.success(\n `Successfully instrumented root route ${chalk.cyan(rootFilename)}.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport async function updateBuildScript(args: {\n org: string;\n project: string;\n url?: string;\n isHydrogen: boolean;\n}): Promise<void> {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n const buildCommand = args.isHydrogen\n ? 'shopify hydrogen build'\n : 'remix build';\n\n const instrumentedBuildCommand =\n `${buildCommand} --sourcemap && sentry-upload-sourcemaps --org ${args.org} --project ${args.project}` +\n (args.url ? ` --url ${args.url}` : '') +\n (args.isHydrogen ? ' --buildPath ./dist' : '');\n\n if (!packageJson.scripts.build) {\n packageJson.scripts.build = instrumentedBuildCommand;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n } else if (packageJson.scripts.build.includes(buildCommand)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n packageJson.scripts.build = packageJson.scripts.build.replace(\n buildCommand,\n instrumentedBuildCommand,\n );\n } else {\n throw new Error(\n \"`build` script doesn't contain a known build command. Please update it manually.\",\n );\n }\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('build')} script in ${chalk.cyan(\n 'package.json',\n )} to generate and upload sourcemaps.`,\n );\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n}\n\nexport function updateEntryClientMod(\n // MagicAst returns `ProxifiedModule<any>` so therefore we have to use `any` here\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalEntryClientMod: ProxifiedModule<any>,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): ProxifiedModule<any> {\n originalEntryClientMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n if (selectedFeatures.performance) {\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useLocation',\n local: 'useLocation',\n });\n\n originalEntryClientMod.imports.$add({\n from: '@remix-run/react',\n imported: 'useMatches',\n local: 'useMatches',\n });\n\n originalEntryClientMod.imports.$add({\n from: 'react',\n imported: 'useEffect',\n local: 'useEffect',\n });\n }\n\n insertClientInitCall(dsn, originalEntryClientMod, selectedFeatures);\n\n return originalEntryClientMod;\n}\n\nexport async function initializeSentryOnEntryClient(\n dsn: string,\n isTS: boolean,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): Promise<void> {\n const clientEntryFilename = `entry.client.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryClient = path.join(\n process.cwd(),\n 'app',\n clientEntryFilename,\n );\n\n const originalEntryClientMod = await loadFile(originalEntryClient);\n\n if (hasSentryContent(originalEntryClient, originalEntryClientMod.$code)) {\n return;\n }\n\n const updatedEntryClientMod = updateEntryClientMod(\n originalEntryClientMod,\n dsn,\n selectedFeatures,\n );\n\n await writeFile(\n updatedEntryClientMod.$ast,\n path.join(process.cwd(), 'app', clientEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on client entry point ${chalk.cyan(\n clientEntryFilename,\n )}`,\n );\n}\n\nexport async function updateStartScript(instrumentationFile: string) {\n const packageJson = await getPackageDotJson();\n\n if (!packageJson.scripts || !packageJson.scripts.start) {\n throw new Error(\n \"Couldn't find a `start` script in your package.json. Please add one manually.\",\n );\n }\n\n if (packageJson.scripts.start.includes('NODE_OPTIONS')) {\n clack.log.warn(\n `Found existing NODE_OPTIONS in ${chalk.cyan(\n 'start',\n )} script. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n if (\n !packageJson.scripts.start.includes('remix-serve') &&\n // Adding a following empty space not to match a path that includes `node`\n !packageJson.scripts.start.includes('node ')\n ) {\n clack.log.warn(\n `Found a ${chalk.cyan('start')} script that doesn't use ${chalk.cyan(\n 'remix-serve',\n )} or ${chalk.cyan('node')}. Skipping adding Sentry initialization.`,\n );\n\n return;\n }\n\n const startCommand = packageJson.scripts.start;\n\n packageJson.scripts.start = `NODE_OPTIONS='--import ./${instrumentationFile}' ${startCommand}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageJson, null, 2),\n );\n\n clack.log.success(\n `Successfully updated ${chalk.cyan('start')} script in ${chalk.cyan(\n 'package.json',\n )} to include Sentry initialization on start.`,\n );\n}\n\nexport async function instrumentSentryOnEntryServer(\n isV2: boolean,\n isTS: boolean,\n): Promise<void> {\n const serverEntryFilename = `entry.server.${isTS ? 'tsx' : 'jsx'}`;\n\n const originalEntryServer = path.join(\n process.cwd(),\n 'app',\n serverEntryFilename,\n );\n\n const originalEntryServerMod = await loadFile(originalEntryServer);\n\n if (hasSentryContent(originalEntryServer, originalEntryServerMod.$code)) {\n return;\n }\n\n originalEntryServerMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n if (isV2) {\n const handleErrorInstrumented = instrumentHandleError(\n originalEntryServerMod,\n serverEntryFilename,\n );\n\n if (handleErrorInstrumented) {\n clack.log.success(\n `Instrumented ${chalk.cyan('handleError')} in ${chalk.cyan(\n `${serverEntryFilename}`,\n )}`,\n );\n }\n }\n\n await writeFile(\n originalEntryServerMod.$ast,\n path.join(process.cwd(), 'app', serverEntryFilename),\n );\n\n clack.log.success(\n `Successfully initialized Sentry on server entry point ${chalk.cyan(\n serverEntryFilename,\n )}.`,\n );\n}\n"]}
|
package/dist/src/run.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Platform } from '../lib/Constants';
|
|
2
2
|
type WizardIntegration = 'reactNative' | 'flutter' | 'ios' | 'android' | 'cordova' | 'electron' | 'nextjs' | 'nuxt' | 'remix' | 'sveltekit' | 'sourcemaps';
|
|
3
3
|
type Args = {
|
|
4
4
|
integration?: WizardIntegration;
|
|
@@ -27,6 +27,8 @@ type Args = {
|
|
|
27
27
|
saas?: boolean;
|
|
28
28
|
forceInstall?: boolean;
|
|
29
29
|
comingFrom?: string;
|
|
30
|
+
ignoreGitChanges?: boolean;
|
|
31
|
+
xcodeProjectDir?: string;
|
|
30
32
|
};
|
|
31
33
|
export declare function run(argv: Args): Promise<void>;
|
|
32
34
|
export {};
|
package/dist/src/run.js
CHANGED
|
@@ -24,20 +24,22 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.run = void 0;
|
|
27
|
-
// @ts-
|
|
27
|
+
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
28
28
|
const clack = __importStar(require("@clack/prompts"));
|
|
29
|
-
const clack_utils_1 = require("./utils/clack-utils");
|
|
30
29
|
const react_native_wizard_1 = require("./react-native/react-native-wizard");
|
|
30
|
+
const clack_1 = require("./utils/clack");
|
|
31
|
+
const Constants_1 = require("../lib/Constants");
|
|
32
|
+
const Env_1 = require("../lib/Helper/Env");
|
|
31
33
|
const Setup_1 = require("../lib/Setup");
|
|
32
|
-
const flutter_wizard_1 = require("./flutter/flutter-wizard");
|
|
33
34
|
const android_wizard_1 = require("./android/android-wizard");
|
|
34
35
|
const apple_wizard_1 = require("./apple/apple-wizard");
|
|
36
|
+
const flutter_wizard_1 = require("./flutter/flutter-wizard");
|
|
35
37
|
const nextjs_wizard_1 = require("./nextjs/nextjs-wizard");
|
|
36
38
|
const nuxt_wizard_1 = require("./nuxt/nuxt-wizard");
|
|
37
39
|
const remix_wizard_1 = require("./remix/remix-wizard");
|
|
38
|
-
const sveltekit_wizard_1 = require("./sveltekit/sveltekit-wizard");
|
|
39
40
|
const sourcemaps_wizard_1 = require("./sourcemaps/sourcemaps-wizard");
|
|
40
|
-
const
|
|
41
|
+
const sveltekit_wizard_1 = require("./sveltekit/sveltekit-wizard");
|
|
42
|
+
const debug_1 = require("./utils/debug");
|
|
41
43
|
const version_1 = require("./version");
|
|
42
44
|
function preSelectedProjectArgsToObject(args) {
|
|
43
45
|
if (!args.preSelectedProject) {
|
|
@@ -69,10 +71,14 @@ async function run(argv) {
|
|
|
69
71
|
...argv,
|
|
70
72
|
...(0, Env_1.readEnvironment)(),
|
|
71
73
|
};
|
|
74
|
+
// Enable debug logs if the user has passed the --debug flag
|
|
75
|
+
if (finalArgs.debug) {
|
|
76
|
+
(0, debug_1.enableDebugLogs)();
|
|
77
|
+
}
|
|
72
78
|
let integration = finalArgs.integration;
|
|
73
79
|
if (!integration) {
|
|
74
80
|
clack.intro(`Sentry Wizard ${version_1.WIZARD_VERSION}`);
|
|
75
|
-
integration = await (0,
|
|
81
|
+
integration = await (0, clack_1.abortIfCancelled)(clack.select({
|
|
76
82
|
message: 'What do you want to set up?',
|
|
77
83
|
options: [
|
|
78
84
|
{ value: 'reactNative', label: 'React Native' },
|
|
@@ -104,6 +110,7 @@ async function run(argv) {
|
|
|
104
110
|
preSelectedProject: preSelectedProjectArgsToObject(finalArgs),
|
|
105
111
|
forceInstall: finalArgs.forceInstall,
|
|
106
112
|
comingFrom: finalArgs.comingFrom,
|
|
113
|
+
ignoreGitChanges: finalArgs.ignoreGitChanges,
|
|
107
114
|
};
|
|
108
115
|
switch (integration) {
|
|
109
116
|
case 'reactNative':
|
|
@@ -116,7 +123,10 @@ async function run(argv) {
|
|
|
116
123
|
await (0, flutter_wizard_1.runFlutterWizard)(wizardOptions);
|
|
117
124
|
break;
|
|
118
125
|
case 'ios':
|
|
119
|
-
await (0, apple_wizard_1.runAppleWizard)(
|
|
126
|
+
await (0, apple_wizard_1.runAppleWizard)({
|
|
127
|
+
...wizardOptions,
|
|
128
|
+
projectDir: finalArgs.xcodeProjectDir,
|
|
129
|
+
});
|
|
120
130
|
break;
|
|
121
131
|
case 'android':
|
|
122
132
|
await (0, android_wizard_1.runAndroidWizard)(wizardOptions);
|
|
@@ -138,11 +148,21 @@ async function run(argv) {
|
|
|
138
148
|
break;
|
|
139
149
|
case 'cordova':
|
|
140
150
|
argv.integration = 'cordova';
|
|
141
|
-
void (0, Setup_1.run)(
|
|
151
|
+
void (0, Setup_1.run)({
|
|
152
|
+
...argv,
|
|
153
|
+
url: argv.url ?? '',
|
|
154
|
+
integration: Constants_1.Integration.cordova,
|
|
155
|
+
platform: argv.platform ?? [],
|
|
156
|
+
}, wizardOptions);
|
|
142
157
|
break;
|
|
143
158
|
case 'electron':
|
|
144
159
|
argv.integration = 'electron';
|
|
145
|
-
void (0, Setup_1.run)(
|
|
160
|
+
void (0, Setup_1.run)({
|
|
161
|
+
...argv,
|
|
162
|
+
url: argv.url ?? '',
|
|
163
|
+
integration: Constants_1.Integration.electron,
|
|
164
|
+
platform: argv.platform ?? [],
|
|
165
|
+
}, wizardOptions);
|
|
146
166
|
break;
|
|
147
167
|
default:
|
|
148
168
|
clack.log.error('No setup wizard selected!');
|