@sentry/wizard 3.11.0 → 3.13.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 +20 -0
- package/dist/lib/Steps/ChooseIntegration.js +1 -0
- package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/src/android/android-wizard.js +14 -4
- package/dist/src/android/android-wizard.js.map +1 -1
- package/dist/src/android/code-tools.d.ts +8 -0
- package/dist/src/android/code-tools.js +20 -8
- package/dist/src/android/code-tools.js.map +1 -1
- package/dist/src/android/gradle.js +6 -1
- package/dist/src/android/gradle.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +5 -2
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.d.ts +1 -1
- package/dist/src/nextjs/templates.js +2 -2
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +8 -4
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/remix/sdk-setup.d.ts +5 -1
- package/dist/src/remix/sdk-setup.js +3 -2
- package/dist/src/remix/sdk-setup.js.map +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.d.ts +9 -0
- package/dist/src/sourcemaps/tools/sentry-cli.js +26 -22
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/tools/tsc.d.ts +6 -0
- package/dist/src/sourcemaps/tools/tsc.js +98 -17
- package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +39 -124
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sourcemaps/tools/webpack.d.ts +6 -1
- package/dist/src/sourcemaps/tools/webpack.js +280 -25
- package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup.js +123 -49
- package/dist/src/sveltekit/sdk-setup.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.d.ts +1 -0
- package/dist/src/sveltekit/sveltekit-wizard.js +119 -44
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/sveltekit/utils.d.ts +2 -0
- package/dist/src/sveltekit/utils.js +48 -0
- package/dist/src/sveltekit/utils.js.map +1 -0
- package/dist/src/utils/ast-utils.d.ts +77 -3
- package/dist/src/utils/ast-utils.js +172 -6
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +85 -1
- package/dist/src/utils/clack-utils.js +214 -51
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/package-manager.d.ts +5 -0
- package/dist/src/utils/package-manager.js +11 -7
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/test/android/code-tools.test.d.ts +1 -0
- package/dist/test/android/code-tools.test.js +34 -0
- package/dist/test/android/code-tools.test.js.map +1 -0
- package/dist/test/sourcemaps/tools/sentry-cli.test.d.ts +1 -0
- package/dist/test/sourcemaps/tools/sentry-cli.test.js +112 -0
- package/dist/test/sourcemaps/tools/sentry-cli.test.js.map +1 -0
- package/dist/test/sourcemaps/tools/tsc.test.d.ts +1 -0
- package/dist/test/sourcemaps/tools/tsc.test.js +121 -0
- package/dist/test/sourcemaps/tools/tsc.test.js.map +1 -0
- package/dist/test/sourcemaps/tools/webpack.test.d.ts +1 -0
- package/dist/test/sourcemaps/tools/webpack.test.js +179 -0
- package/dist/test/sourcemaps/tools/webpack.test.js.map +1 -0
- package/dist/test/utils/ast-utils.test.js +181 -15
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/dist/test/utils/clack-utils.test.d.ts +1 -0
- package/dist/test/utils/clack-utils.test.js +200 -0
- package/dist/test/utils/clack-utils.test.js.map +1 -0
- package/lib/Steps/ChooseIntegration.ts +1 -0
- package/package.json +1 -1
- package/src/android/android-wizard.ts +16 -5
- package/src/android/code-tools.ts +21 -7
- package/src/android/gradle.ts +6 -1
- package/src/nextjs/nextjs-wizard.ts +15 -3
- package/src/nextjs/templates.ts +3 -2
- package/src/remix/remix-wizard.ts +8 -11
- package/src/remix/sdk-setup.ts +8 -2
- package/src/sourcemaps/tools/sentry-cli.ts +16 -9
- package/src/sourcemaps/tools/tsc.ts +133 -28
- package/src/sourcemaps/tools/vite.ts +37 -127
- package/src/sourcemaps/tools/webpack.ts +343 -27
- package/src/sveltekit/sdk-setup.ts +115 -39
- package/src/sveltekit/sveltekit-wizard.ts +93 -25
- package/src/sveltekit/utils.ts +50 -0
- package/src/utils/ast-utils.ts +203 -7
- package/src/utils/clack-utils.ts +211 -44
- package/src/utils/package-manager.ts +12 -6
- package/test/android/code-tools.test.ts +49 -0
- package/test/sourcemaps/tools/sentry-cli.test.ts +51 -0
- package/test/sourcemaps/tools/tsc.test.ts +181 -0
- package/test/sourcemaps/tools/webpack.test.ts +303 -0
- package/test/utils/ast-utils.test.ts +240 -20
- package/test/utils/clack-utils.test.ts +142 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/nextjs/templates.ts"],"names":[],"mappings":";;;AAAA,SAAgB,qCAAqC,CACnD,OAAe,EACf,WAAmB;IAEnB,OAAO,oNAOG,OAAO,iCACH,WAAW,aACvB,CAAC;AACL,CAAC;AAdD,sFAcC;AAED,SAAgB,mCAAmC;IACjD,OAAO,usBAkBL,CAAC;AACL,CAAC;AApBD,kFAoBC;AAED,SAAgB,0BAA0B,CACxC,kCAA0C,EAC1C,0BAAkC;IAElC,OAAO,gMAOL,kCAAkC,kBAClC,0BAA0B,WAE7B,CAAC;AACF,CAAC;AAfD,gEAeC;AAED,SAAgB,0BAA0B,CACxC,kCAA0C,EAC1C,0BAAkC;IAElC,OAAO,mLAQL,kCAAkC,kBAClC,0BAA0B,WAE7B,CAAC;AACF,CAAC;AAhBD,gEAgBC;AAED,SAAgB,kCAAkC,CAChD,kCAA0C,EAC1C,0BAAkC;IAElC,OAAO,iJAOL,kCAAkC,kBAClC,0BAA0B,WAE7B,CAAC;AACF,CAAC;AAfD,gFAeC;AAED,SAAgB,uBAAuB,CACrC,GAAW,EACX,MAAoC;IAEpC,IAAI,MAAM,CAAC;IACX,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,MAAM,GAAG,oNAEiD,CAAC;KAC5D;SAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,GAAG,6NAEiD,CAAC;KAC5D;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE;QAC5B,MAAM,GAAG,gXAGiD,CAAC;KAC5D;IAED,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,iBAAiB,GAAG,gfAenB,CAAC;KACH;IAED,4EAA4E;IAC5E,OAAO,UAAG,MAAM,wFAKR,GAAG,4PAMI,iBAAiB,YAEjC,CAAC;AACF,CAAC;AAvDD,0DAuDC;AAED,SAAgB,4BAA4B,CAAC,OAM5C;IACC,IAAM,cAAc,GAAG,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,UAAG,OAAO,CAAC,GAAG,2BAAiB,OAAO,CAAC,OAAO,8BAAoB,OAAO,CAAC,SAAS,CAAE;QACvF,CAAC,CAAC,kBAAW,OAAO,CAAC,OAAO,wCAA8B,OAAO,CAAC,SAAS,CAAE,CAAC;IAEhF,OAAO,UACL,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,0xGAyE3B,cAAc,8VAYlC,CAAC;AACF,CAAC;AAlGD,oEAkGC;AAED,SAAgB,wBAAwB;IACtC,OAAO,qNAKR,CAAC;AACF,CAAC;AAPD,4DAOC;AAED,SAAgB,8BAA8B;IAC5C,OAAO,oQAOR,CAAC;AACF,CAAC;AATD,wEASC","sourcesContent":["export function getNextjsWebpackPluginOptionsTemplate(\n orgSlug: string,\n projectSlug: string,\n): string {\n return `{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n // Suppresses source map uploading logs during build\n silent: true,\n\n org: \"${orgSlug}\",\n project: \"${projectSlug}\",\n }`;\n}\n\nexport function getNextjsSentryBuildOptionsTemplate(): string {\n return `{\n // For all available options, see:\n // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/\n\n // Upload a larger set of source maps for prettier stack traces (increases build time)\n widenClientFileUpload: true,\n\n // Transpiles SDK to be compatible with IE11 (increases bundle size)\n transpileClientSDK: true,\n\n // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load)\n tunnelRoute: \"/monitoring\",\n\n // Hides source maps from generated client bundles\n hideSourceMaps: true,\n\n // Automatically tree-shake Sentry logger statements to reduce bundle size\n disableLogger: true,\n }`;\n}\n\nexport function getNextjsConfigCjsTemplate(\n sentryWebpackPluginOptionsTemplate: string,\n sentryBuildOptionsTemplate: string,\n): string {\n return `const { withSentryConfig } = require(\"@sentry/nextjs\");\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nmodule.exports = withSentryConfig(\n nextConfig,\n ${sentryWebpackPluginOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigCjsAppendix(\n sentryWebpackPluginOptionsTemplate: string,\n sentryBuildOptionsTemplate: string,\n): string {\n return `\n\n// Injected content via Sentry wizard below\n\nconst { withSentryConfig } = require(\"@sentry/nextjs\");\n\nmodule.exports = withSentryConfig(\n module.exports,\n ${sentryWebpackPluginOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigEsmCopyPasteSnippet(\n sentryWebpackPluginOptionsTemplate: string,\n sentryBuildOptionsTemplate: string,\n): string {\n return `\n\n// next.config.mjs\nimport { withSentryConfig } from \"@sentry/nextjs\";\n\nexport default withSentryConfig(\n yourNextConfig,\n ${sentryWebpackPluginOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n);\n`;\n}\n\nexport function getSentryConfigContents(\n dsn: string,\n config: 'server' | 'client' | 'edge',\n): string {\n let primer;\n if (config === 'server') {\n primer = `// This file configures the initialization of Sentry on the server.\n// The config you add here will be used whenever the server handles a request.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'client') {\n primer = `// This file configures the initialization of Sentry on the client.\n// The config you add here will be used whenever a users loads a page in their browser.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'edge') {\n primer = `// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on).\n// The config you add here will be used whenever one of the edge features is loaded.\n// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n }\n\n let additionalOptions = '';\n if (config === 'client') {\n additionalOptions = `\n\n replaysOnErrorSampleRate: 1.0,\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n\n // You can remove this option if you're not planning to use the Sentry Session Replay feature:\n integrations: [\n new Sentry.Replay({\n // Additional Replay configuration goes in here, for example:\n maskAllText: true,\n blockAllMedia: true,\n }),\n ],`;\n }\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${primer}\n\nimport * as Sentry from \"@sentry/nextjs\";\n\nSentry.init({\n dsn: \"${dsn}\",\n\n // Adjust this value in production, or use tracesSampler for greater control\n tracesSampleRate: 1,\n\n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,${additionalOptions}\n});\n`;\n}\n\nexport function getSentryExamplePageContents(options: {\n selfHosted: boolean;\n url: string;\n orgSlug: string;\n projectId: string;\n useClient: boolean;\n}): string {\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 `${\n options.useClient ? '\"use client\";\\n\\n' : ''\n }import Head from \"next/head\";\nimport * as Sentry from \"@sentry/nextjs\";\n\nexport default function Page() {\n return (\n <div>\n <Head>\n <title>Sentry Onboarding</title>\n <meta name=\"description\" content=\"Test Sentry for your Next.js app!\" />\n </Head>\n\n <main\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h1 style={{ fontSize: \"4rem\", margin: \"14px 0\" }}>\n <svg\n style={{\n height: \"1em\",\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 44\"\n >\n <path\n fill=\"currentColor\"\n d=\"M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z\"\n ></path>\n </svg>\n </h1>\n\n <p>Get started by sending us a sample error:</p>\n <button\n type=\"button\"\n style={{\n padding: \"12px\",\n cursor: \"pointer\",\n backgroundColor: \"#AD6CAA\",\n borderRadius: \"4px\",\n border: \"none\",\n color: \"white\",\n fontSize: \"14px\",\n margin: \"18px\",\n }}\n onClick={async () => {\n const transaction = Sentry.startTransaction({\n name: \"Example Frontend Transaction\",\n });\n\n Sentry.configureScope((scope) => {\n scope.setSpan(transaction);\n });\n\n try {\n const res = await fetch(\"/api/sentry-example-api\");\n if (!res.ok) {\n throw new Error(\"Sentry Example Frontend Error\");\n }\n } finally {\n transaction.finish();\n }\n }}\n >\n Throw error!\n </button>\n\n <p>\n Next, look for the error on the{\" \"}\n <a href=\"${issuesPageLink}\">Issues Page</a>.\n </p>\n <p style={{ marginTop: \"24px\" }}>\n For more information, see{\" \"}\n <a href=\"https://docs.sentry.io/platforms/javascript/guides/nextjs/\">\n https://docs.sentry.io/platforms/javascript/guides/nextjs/\n </a>\n </p>\n </main>\n </div>\n );\n}\n`;\n}\n\nexport function getSentryExampleApiRoute() {\n return `// A faulty API route to test Sentry's error monitoring\nexport default function handler(_req, res) {\n throw new Error(\"Sentry Example API Route Error\");\n res.status(200).json({ name: \"John Doe\" });\n}\n`;\n}\n\nexport function getSentryExampleAppDirApiRoute() {\n return `import { NextResponse } from \"next/server\";\n\n// A faulty API route to test Sentry's error monitoring\nexport function GET() {\n throw new Error(\"Sentry Example API Route Error\");\n return NextResponse.json({ data: \"Testing Sentry Error...\" });\n}\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/nextjs/templates.ts"],"names":[],"mappings":";;;AAAA,SAAgB,qCAAqC,CACnD,OAAe,EACf,WAAmB,EACnB,UAAmB,EACnB,GAAW;IAEX,OAAO,kNAMG,OAAO,iCACH,WAAW,gBAAK,UAAU,CAAC,CAAC,CAAC,uBAAe,GAAG,OAAG,CAAC,CAAC,CAAC,EAAE,UACnE,CAAC;AACL,CAAC;AAfD,sFAeC;AAED,SAAgB,mCAAmC;IACjD,OAAO,usBAkBL,CAAC;AACL,CAAC;AApBD,kFAoBC;AAED,SAAgB,0BAA0B,CACxC,kCAA0C,EAC1C,0BAAkC;IAElC,OAAO,gMAOL,kCAAkC,kBAClC,0BAA0B,WAE7B,CAAC;AACF,CAAC;AAfD,gEAeC;AAED,SAAgB,0BAA0B,CACxC,kCAA0C,EAC1C,0BAAkC;IAElC,OAAO,mLAQL,kCAAkC,kBAClC,0BAA0B,WAE7B,CAAC;AACF,CAAC;AAhBD,gEAgBC;AAED,SAAgB,kCAAkC,CAChD,kCAA0C,EAC1C,0BAAkC;IAElC,OAAO,iJAOL,kCAAkC,kBAClC,0BAA0B,WAE7B,CAAC;AACF,CAAC;AAfD,gFAeC;AAED,SAAgB,uBAAuB,CACrC,GAAW,EACX,MAAoC;IAEpC,IAAI,MAAM,CAAC;IACX,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,MAAM,GAAG,oNAEiD,CAAC;KAC5D;SAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,GAAG,6NAEiD,CAAC;KAC5D;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE;QAC5B,MAAM,GAAG,gXAGiD,CAAC;KAC5D;IAED,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,MAAM,KAAK,QAAQ,EAAE;QACvB,iBAAiB,GAAG,gfAenB,CAAC;KACH;IAED,4EAA4E;IAC5E,OAAO,UAAG,MAAM,wFAKR,GAAG,4PAMI,iBAAiB,YAEjC,CAAC;AACF,CAAC;AAvDD,0DAuDC;AAED,SAAgB,4BAA4B,CAAC,OAM5C;IACC,IAAM,cAAc,GAAG,OAAO,CAAC,UAAU;QACvC,CAAC,CAAC,UAAG,OAAO,CAAC,GAAG,2BAAiB,OAAO,CAAC,OAAO,8BAAoB,OAAO,CAAC,SAAS,CAAE;QACvF,CAAC,CAAC,kBAAW,OAAO,CAAC,OAAO,wCAA8B,OAAO,CAAC,SAAS,CAAE,CAAC;IAEhF,OAAO,UACL,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,0xGAyE3B,cAAc,8VAYlC,CAAC;AACF,CAAC;AAlGD,oEAkGC;AAED,SAAgB,wBAAwB;IACtC,OAAO,qNAKR,CAAC;AACF,CAAC;AAPD,4DAOC;AAED,SAAgB,8BAA8B;IAC5C,OAAO,oQAOR,CAAC;AACF,CAAC;AATD,wEASC","sourcesContent":["export function getNextjsWebpackPluginOptionsTemplate(\n orgSlug: string,\n projectSlug: string,\n selfHosted: boolean,\n url: string,\n): string {\n return `{\n // For all available options, see:\n // https://github.com/getsentry/sentry-webpack-plugin#options\n\n // Suppresses source map uploading logs during build\n silent: true,\n org: \"${orgSlug}\",\n project: \"${projectSlug}\",${selfHosted ? `\\n url: \"${url}\"` : ''}\n }`;\n}\n\nexport function getNextjsSentryBuildOptionsTemplate(): string {\n return `{\n // For all available options, see:\n // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/\n\n // Upload a larger set of source maps for prettier stack traces (increases build time)\n widenClientFileUpload: true,\n\n // Transpiles SDK to be compatible with IE11 (increases bundle size)\n transpileClientSDK: true,\n\n // Routes browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers (increases server load)\n tunnelRoute: \"/monitoring\",\n\n // Hides source maps from generated client bundles\n hideSourceMaps: true,\n\n // Automatically tree-shake Sentry logger statements to reduce bundle size\n disableLogger: true,\n }`;\n}\n\nexport function getNextjsConfigCjsTemplate(\n sentryWebpackPluginOptionsTemplate: string,\n sentryBuildOptionsTemplate: string,\n): string {\n return `const { withSentryConfig } = require(\"@sentry/nextjs\");\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nmodule.exports = withSentryConfig(\n nextConfig,\n ${sentryWebpackPluginOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigCjsAppendix(\n sentryWebpackPluginOptionsTemplate: string,\n sentryBuildOptionsTemplate: string,\n): string {\n return `\n\n// Injected content via Sentry wizard below\n\nconst { withSentryConfig } = require(\"@sentry/nextjs\");\n\nmodule.exports = withSentryConfig(\n module.exports,\n ${sentryWebpackPluginOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n);\n`;\n}\n\nexport function getNextjsConfigEsmCopyPasteSnippet(\n sentryWebpackPluginOptionsTemplate: string,\n sentryBuildOptionsTemplate: string,\n): string {\n return `\n\n// next.config.mjs\nimport { withSentryConfig } from \"@sentry/nextjs\";\n\nexport default withSentryConfig(\n yourNextConfig,\n ${sentryWebpackPluginOptionsTemplate},\n ${sentryBuildOptionsTemplate}\n);\n`;\n}\n\nexport function getSentryConfigContents(\n dsn: string,\n config: 'server' | 'client' | 'edge',\n): string {\n let primer;\n if (config === 'server') {\n primer = `// This file configures the initialization of Sentry on the server.\n// The config you add here will be used whenever the server handles a request.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'client') {\n primer = `// This file configures the initialization of Sentry on the client.\n// The config you add here will be used whenever a users loads a page in their browser.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n } else if (config === 'edge') {\n primer = `// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on).\n// The config you add here will be used whenever one of the edge features is loaded.\n// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally.\n// https://docs.sentry.io/platforms/javascript/guides/nextjs/`;\n }\n\n let additionalOptions = '';\n if (config === 'client') {\n additionalOptions = `\n\n replaysOnErrorSampleRate: 1.0,\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n\n // You can remove this option if you're not planning to use the Sentry Session Replay feature:\n integrations: [\n new Sentry.Replay({\n // Additional Replay configuration goes in here, for example:\n maskAllText: true,\n blockAllMedia: true,\n }),\n ],`;\n }\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${primer}\n\nimport * as Sentry from \"@sentry/nextjs\";\n\nSentry.init({\n dsn: \"${dsn}\",\n\n // Adjust this value in production, or use tracesSampler for greater control\n tracesSampleRate: 1,\n\n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,${additionalOptions}\n});\n`;\n}\n\nexport function getSentryExamplePageContents(options: {\n selfHosted: boolean;\n url: string;\n orgSlug: string;\n projectId: string;\n useClient: boolean;\n}): string {\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 `${\n options.useClient ? '\"use client\";\\n\\n' : ''\n }import Head from \"next/head\";\nimport * as Sentry from \"@sentry/nextjs\";\n\nexport default function Page() {\n return (\n <div>\n <Head>\n <title>Sentry Onboarding</title>\n <meta name=\"description\" content=\"Test Sentry for your Next.js app!\" />\n </Head>\n\n <main\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <h1 style={{ fontSize: \"4rem\", margin: \"14px 0\" }}>\n <svg\n style={{\n height: \"1em\",\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 44\"\n >\n <path\n fill=\"currentColor\"\n d=\"M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z\"\n ></path>\n </svg>\n </h1>\n\n <p>Get started by sending us a sample error:</p>\n <button\n type=\"button\"\n style={{\n padding: \"12px\",\n cursor: \"pointer\",\n backgroundColor: \"#AD6CAA\",\n borderRadius: \"4px\",\n border: \"none\",\n color: \"white\",\n fontSize: \"14px\",\n margin: \"18px\",\n }}\n onClick={async () => {\n const transaction = Sentry.startTransaction({\n name: \"Example Frontend Transaction\",\n });\n\n Sentry.configureScope((scope) => {\n scope.setSpan(transaction);\n });\n\n try {\n const res = await fetch(\"/api/sentry-example-api\");\n if (!res.ok) {\n throw new Error(\"Sentry Example Frontend Error\");\n }\n } finally {\n transaction.finish();\n }\n }}\n >\n Throw error!\n </button>\n\n <p>\n Next, look for the error on the{\" \"}\n <a href=\"${issuesPageLink}\">Issues Page</a>.\n </p>\n <p style={{ marginTop: \"24px\" }}>\n For more information, see{\" \"}\n <a href=\"https://docs.sentry.io/platforms/javascript/guides/nextjs/\">\n https://docs.sentry.io/platforms/javascript/guides/nextjs/\n </a>\n </p>\n </main>\n </div>\n );\n}\n`;\n}\n\nexport function getSentryExampleApiRoute() {\n return `// A faulty API route to test Sentry's error monitoring\nexport default function handler(_req, res) {\n throw new Error(\"Sentry Example API Route Error\");\n res.status(200).json({ name: \"John Doe\" });\n}\n`;\n}\n\nexport function getSentryExampleAppDirApiRoute() {\n return `import { NextResponse } from \"next/server\";\n\n// A faulty API route to test Sentry's error monitoring\nexport function GET() {\n throw new Error(\"Sentry Example API Route Error\");\n return NextResponse.json({ data: \"Testing Sentry Error...\" });\n}\n`;\n}\n"]}
|
|
@@ -61,7 +61,7 @@ function runRemixWizard(options) {
|
|
|
61
61
|
exports.runRemixWizard = runRemixWizard;
|
|
62
62
|
function runRemixWizardWithTelemetry(options) {
|
|
63
63
|
return __awaiter(this, void 0, void 0, function () {
|
|
64
|
-
var remixConfig, packageJson, _a, selectedProject, authToken, dsn, isTS, isV2;
|
|
64
|
+
var remixConfig, packageJson, _a, selectedProject, authToken, sentryUrl, dsn, isTS, isV2;
|
|
65
65
|
var _this = this;
|
|
66
66
|
return __generator(this, function (_b) {
|
|
67
67
|
switch (_b.label) {
|
|
@@ -87,7 +87,7 @@ function runRemixWizardWithTelemetry(options) {
|
|
|
87
87
|
_b.sent();
|
|
88
88
|
return [4 /*yield*/, (0, clack_utils_1.getOrAskForProjectData)(options, 'javascript-remix')];
|
|
89
89
|
case 5:
|
|
90
|
-
_a = _b.sent(), selectedProject = _a.selectedProject, authToken = _a.authToken;
|
|
90
|
+
_a = _b.sent(), selectedProject = _a.selectedProject, authToken = _a.authToken, sentryUrl = _a.sentryUrl;
|
|
91
91
|
return [4 /*yield*/, (0, telemetry_1.traceStep)('Install Sentry SDK', function () {
|
|
92
92
|
return (0, clack_utils_1.installPackage)({
|
|
93
93
|
packageName: '@sentry/remix',
|
|
@@ -99,7 +99,7 @@ function runRemixWizardWithTelemetry(options) {
|
|
|
99
99
|
dsn = selectedProject.keys[0].dsn.public;
|
|
100
100
|
isTS = (0, clack_utils_1.isUsingTypeScript)();
|
|
101
101
|
isV2 = (0, sdk_setup_1.isRemixV2)(remixConfig, packageJson);
|
|
102
|
-
return [4 /*yield*/, (0, clack_utils_1.addSentryCliConfig)(authToken, clack_utils_1.sourceMapsCliSetupConfig
|
|
102
|
+
return [4 /*yield*/, (0, clack_utils_1.addSentryCliConfig)(authToken, clack_utils_1.sourceMapsCliSetupConfig)];
|
|
103
103
|
case 7:
|
|
104
104
|
_b.sent();
|
|
105
105
|
return [4 /*yield*/, (0, telemetry_1.traceStep)('Update build script for sourcemap uploads', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -108,7 +108,11 @@ function runRemixWizardWithTelemetry(options) {
|
|
|
108
108
|
switch (_a.label) {
|
|
109
109
|
case 0:
|
|
110
110
|
_a.trys.push([0, 2, , 3]);
|
|
111
|
-
return [4 /*yield*/, (0, sdk_setup_1.updateBuildScript)(
|
|
111
|
+
return [4 /*yield*/, (0, sdk_setup_1.updateBuildScript)({
|
|
112
|
+
org: selectedProject.organization.slug,
|
|
113
|
+
project: selectedProject.name,
|
|
114
|
+
url: sentryUrl,
|
|
115
|
+
})];
|
|
112
116
|
case 1:
|
|
113
117
|
_a.sent();
|
|
114
118
|
return [3 /*break*/, 3];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-wizard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+EAA+E;AAC/E,2DAAmC;AACnC,gDAA0B;AAE1B,oDAU8B;AAC9B,sDAA4D;AAE5D,yCAOqB;AACrB,wCAAuC;AACvC,0CAAwD;AAExD,SAAsB,cAAc,CAAC,OAAsB;;;YACzD,sBAAO,IAAA,yBAAa,EAClB;oBACE,OAAO,EAAE,OAAO,CAAC,gBAAgB;oBACjC,WAAW,EAAE,OAAO;iBACrB,EACD,cAAM,OAAA,2BAA2B,CAAC,OAAO,CAAC,EAApC,CAAoC,CAC3C,EAAC;;;CACH;AARD,wCAQC;AAED,SAAe,2BAA2B,CACxC,OAAsB;;;;;;;oBAEtB,IAAA,0BAAY,EAAC;wBACX,UAAU,EAAE,qBAAqB;wBACjC,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;qBAC3C,CAAC,CAAC;oBAEH,qBAAM,IAAA,gDAAkC,GAAE,EAAA;;oBAA1C,SAA0C,CAAC;oBAEvB,qBAAM,IAAA,2BAAe,GAAE,EAAA;;oBAArC,WAAW,GAAG,SAAuB;oBACvB,qBAAM,IAAA,+BAAiB,GAAE,EAAA;;oBAAvC,WAAW,GAAG,SAAyB;oBAE7C,qEAAqE;oBACrE,qBAAM,IAAA,sCAAwB,EAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAA;;oBADtE,qEAAqE;oBACrE,SAAsE,CAAC;
|
|
1
|
+
{"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-wizard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+EAA+E;AAC/E,2DAAmC;AACnC,gDAA0B;AAE1B,oDAU8B;AAC9B,sDAA4D;AAE5D,yCAOqB;AACrB,wCAAuC;AACvC,0CAAwD;AAExD,SAAsB,cAAc,CAAC,OAAsB;;;YACzD,sBAAO,IAAA,yBAAa,EAClB;oBACE,OAAO,EAAE,OAAO,CAAC,gBAAgB;oBACjC,WAAW,EAAE,OAAO;iBACrB,EACD,cAAM,OAAA,2BAA2B,CAAC,OAAO,CAAC,EAApC,CAAoC,CAC3C,EAAC;;;CACH;AARD,wCAQC;AAED,SAAe,2BAA2B,CACxC,OAAsB;;;;;;;oBAEtB,IAAA,0BAAY,EAAC;wBACX,UAAU,EAAE,qBAAqB;wBACjC,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;qBAC3C,CAAC,CAAC;oBAEH,qBAAM,IAAA,gDAAkC,GAAE,EAAA;;oBAA1C,SAA0C,CAAC;oBAEvB,qBAAM,IAAA,2BAAe,GAAE,EAAA;;oBAArC,WAAW,GAAG,SAAuB;oBACvB,qBAAM,IAAA,+BAAiB,GAAE,EAAA;;oBAAvC,WAAW,GAAG,SAAyB;oBAE7C,qEAAqE;oBACrE,qBAAM,IAAA,sCAAwB,EAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAA;;oBADtE,qEAAqE;oBACrE,SAAsE,CAAC;oBAGrE,qBAAM,IAAA,oCAAsB,EAAC,OAAO,EAAE,kBAAkB,CAAC,EAAA;;oBADrD,KACJ,SAAyD,EADnD,eAAe,qBAAA,EAAE,SAAS,eAAA,EAAE,SAAS,eAAA;oBAG7C,qBAAM,IAAA,qBAAS,EAAC,oBAAoB,EAAE;4BACpC,OAAA,IAAA,4BAAc,EAAC;gCACb,WAAW,EAAE,eAAe;gCAC5B,gBAAgB,EAAE,IAAA,kCAAmB,EAAC,eAAe,EAAE,WAAW,CAAC;6BACpE,CAAC;wBAHF,CAGE,CACH,EAAA;;oBALD,SAKC,CAAC;oBAEI,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;oBAEzC,IAAI,GAAG,IAAA,+BAAiB,GAAE,CAAC;oBAC3B,IAAI,GAAG,IAAA,qBAAS,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAEjD,qBAAM,IAAA,gCAAkB,EAAC,SAAS,EAAE,sCAAwB,CAAC,EAAA;;oBAA7D,SAA6D,CAAC;oBAE9D,qBAAM,IAAA,qBAAS,EAAC,2CAA2C,EAAE;;;;;;wCAEzD,qBAAM,IAAA,6BAAiB,EAAC;gDACtB,GAAG,EAAE,eAAe,CAAC,YAAY,CAAC,IAAI;gDACtC,OAAO,EAAE,eAAe,CAAC,IAAI;gDAC7B,GAAG,EAAE,SAAS;6CACf,CAAC,EAAA;;wCAJF,SAIE,CAAC;;;;wCAEH,iBAAK,CAAC,GAAG;6CACN,IAAI,CAAC,2MAC0H,CAAC,CAAC;wCACpI,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;;;;;6BAEZ,CAAC,EAAA;;oBAbF,SAaE,CAAC;oBAEH,qBAAM,IAAA,qBAAS,EAAC,uBAAuB,EAAE;;;;;;wCAErC,qBAAM,IAAA,+BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,EAAA;;wCAArC,SAAqC,CAAC;;;;wCAEtC,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,6IACqF,CAAC,CAAC;wCACtG,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;;;;;6BAEZ,CAAC,EAAA;;oBARF,SAQE,CAAC;oBAEH,qBAAM,IAAA,qBAAS,EAAC,mCAAmC,EAAE;;;;;;wCAEjD,qBAAM,IAAA,yCAA6B,EAAC,GAAG,EAAE,IAAI,CAAC,EAAA;;wCAA9C,SAA8C,CAAC;;;;wCAE/C,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yJACqF,CAAC,CAAC;wCACtG,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;;;;;6BAEZ,CAAC,EAAA;;oBARF,SAQE,CAAC;oBAEH,qBAAM,IAAA,qBAAS,EAAC,mCAAmC,EAAE;;;;;;wCAEjD,qBAAM,IAAA,yCAA6B,EAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,EAAA;;wCAApD,SAAoD,CAAC;;;;wCAErD,iBAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yJACqF,CAAC,CAAC;wCACtG,IAAA,aAAK,EAAC,GAAC,CAAC,CAAC;;;;;6BAEZ,CAAC,EAAA;;oBARF,SAQE,CAAC;oBAEH,iBAAK,CAAC,KAAK,CAAC,YACZ,eAAK,CAAC,KAAK,CACX,iEAAiE,CAClE,iBAEC,eAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,iBAEtE,eAAK,CAAC,IAAI,CACV,uIACwD,CACzD,CAAE,CAAC,CAAC;;;;;CACJ","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport {\n addSentryCliConfig,\n confirmContinueEvenThoughNoGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n sourceMapsCliSetupConfig,\n} from '../utils/clack-utils';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport { WizardOptions } from '../utils/types';\nimport {\n initializeSentryOnEntryClient,\n initializeSentryOnEntryServer,\n updateBuildScript,\n instrumentRootRoute,\n isRemixV2,\n loadRemixConfig,\n} from './sdk-setup';\nimport { debug } from '../utils/debug';\nimport { traceStep, withTelemetry } from '../telemetry';\n\nexport async function runRemixWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'remix',\n },\n () => runRemixWizardWithTelemetry(options),\n );\n}\n\nasync function runRemixWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Remix Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueEvenThoughNoGitRepo();\n\n const remixConfig = await loadRemixConfig();\n const packageJson = await getPackageDotJson();\n\n // We expect `@remix-run/dev` to be installed for every Remix project\n await ensurePackageIsInstalled(packageJson, '@remix-run/dev', 'Remix');\n\n const { selectedProject, authToken, sentryUrl } =\n await getOrAskForProjectData(options, 'javascript-remix');\n\n await traceStep('Install Sentry SDK', () =>\n installPackage({\n packageName: '@sentry/remix',\n alreadyInstalled: hasPackageInstalled('@sentry/remix', packageJson),\n }),\n );\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const isTS = isUsingTypeScript();\n const isV2 = isRemixV2(remixConfig, packageJson);\n\n await addSentryCliConfig(authToken, sourceMapsCliSetupConfig);\n\n await traceStep('Update build script for sourcemap uploads', async () => {\n try {\n await updateBuildScript({\n org: selectedProject.organization.slug,\n project: selectedProject.name,\n url: sentryUrl,\n });\n } catch (e) {\n clack.log\n .warn(`Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n });\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(isV2, isTS);\n } catch (e) {\n clack.log.warn(`Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(dsn, isTS);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on server entry', async () => {\n try {\n await initializeSentryOnEntryServer(dsn, isTS, isV2);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/`);\n debug(e);\n }\n });\n\n clack.outro(`\n${chalk.green(\n 'Sentry has been successfully configured for your Remix project.',\n)}\n\n${chalk.cyan('You can now deploy your project to see Sentry in action.')}\n\n${chalk.cyan(\n `To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/`,\n)}`);\n}\n"]}
|
|
@@ -13,6 +13,10 @@ export type PartialRemixConfig = {
|
|
|
13
13
|
export declare function isRemixV2(remixConfig: PartialRemixConfig, packageJson: PackageDotJson): boolean;
|
|
14
14
|
export declare function loadRemixConfig(): Promise<PartialRemixConfig>;
|
|
15
15
|
export declare function instrumentRootRoute(isV2?: boolean, isTS?: boolean): Promise<void>;
|
|
16
|
-
export declare function updateBuildScript(
|
|
16
|
+
export declare function updateBuildScript(args: {
|
|
17
|
+
org: string;
|
|
18
|
+
project: string;
|
|
19
|
+
url?: string;
|
|
20
|
+
}): Promise<void>;
|
|
17
21
|
export declare function initializeSentryOnEntryClient(dsn: string, isTS: boolean): Promise<void>;
|
|
18
22
|
export declare function initializeSentryOnEntryServer(dsn: string, isV2: boolean, isTS: boolean): Promise<void>;
|
|
@@ -176,7 +176,7 @@ function instrumentRootRoute(isV2, isTS) {
|
|
|
176
176
|
});
|
|
177
177
|
}
|
|
178
178
|
exports.instrumentRootRoute = instrumentRootRoute;
|
|
179
|
-
function updateBuildScript() {
|
|
179
|
+
function updateBuildScript(args) {
|
|
180
180
|
return __awaiter(this, void 0, void 0, function () {
|
|
181
181
|
var packageJsonPath, packageJsonString, packageJson;
|
|
182
182
|
return __generator(this, function (_a) {
|
|
@@ -192,7 +192,8 @@ function updateBuildScript() {
|
|
|
192
192
|
}
|
|
193
193
|
if (!packageJson.scripts.build) {
|
|
194
194
|
packageJson.scripts.build =
|
|
195
|
-
|
|
195
|
+
"remix build --sourcemap && sentry-upload-sourcemaps --org ".concat(args.org, " --project ").concat(args.project) +
|
|
196
|
+
(args.url ? " --url ".concat(args.url) : '');
|
|
196
197
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
197
198
|
}
|
|
198
199
|
else if (packageJson.scripts.build.includes('remix build')) {
|
|
@@ -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';\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 { parse } from 'semver';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, loadFile, writeFile } from 'magicast';\nimport { PackageDotJson, getPackageVersion } from '../utils/package-json';\nimport { getInitCallInsertionIndex, hasSentryContent } from './utils';\nimport { instrumentRootRouteV1 } from './codemods/root-v1';\nimport { instrumentRootRouteV2 } from './codemods/root-v2';\nimport { instrumentHandleError } from './codemods/handle-error';\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';\n\nfunction insertClientInitCall(\n dsn: string,\n originalHooksMod: ProxifiedModule<any>,\n): void {\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n integrations: [\n builders.newExpression('Sentry.BrowserTracing', {\n routingInstrumentation: builders.functionCall(\n 'Sentry.remixRouterInstrumentation',\n builders.raw('useEffect'),\n builders.raw('useLocation'),\n builders.raw('useMatches'),\n ),\n }),\n builders.newExpression('Sentry.Replay'),\n ],\n });\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n const initCallInsertionIndex = getInitCallInsertionIndex(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\nfunction insertServerInitCall(\n dsn: string,\n originalHooksMod: ProxifiedModule<any>,\n) {\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n });\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(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 isRemixV2(\n remixConfig: PartialRemixConfig,\n packageJson: PackageDotJson,\n): boolean {\n const remixVersion = getPackageVersion('@remix-run/react', packageJson);\n const remixVersionMajor = remixVersion && parse(remixVersion)?.major;\n const isV2Remix = remixVersionMajor && remixVersionMajor >= 2;\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(): Promise<void> {\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // Add sourcemaps option to build script\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n const packageJsonString = (\n await fs.promises.readFile(packageJsonPath)\n ).toString();\n const packageJson = JSON.parse(packageJsonString);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n if (!packageJson.scripts.build) {\n packageJson.scripts.build =\n 'remix build --sourcemap && sentry-upload-sourcemaps';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n } else if (packageJson.scripts.build.includes('remix build')) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n packageJson.scripts.build = packageJson.scripts.build.replace(\n 'remix build',\n 'remix build --sourcemap && sentry-upload-sourcemaps',\n );\n }\n\n await fs.promises.writeFile(\n packageJsonPath,\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 async function initializeSentryOnEntryClient(\n dsn: string,\n isTS: boolean,\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 originalEntryClientMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n originalEntryClientMod.imports.$add({\n from: 'react',\n imported: 'useEffect',\n local: 'useEffect',\n });\n\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 insertClientInitCall(dsn, originalEntryClientMod);\n\n await writeFile(\n originalEntryClientMod.$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 initializeSentryOnEntryServer(\n dsn: string,\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 insertServerInitCall(dsn, originalEntryServerMod);\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":";AAAA,4DAA4D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAO5D,qCAAyB;AACzB,yCAA6B;AAC7B,uCAA2B;AAE3B,+EAA+E;AAC/E,2DAAmC;AACnC,gDAA0B;AAC1B,iCAA+B;AAE/B,kFAAkF;AAClF,qCAAuE;AACvE,sDAA0E;AAC1E,iCAAsE;AACtE,8CAA2D;AAC3D,8CAA2D;AAC3D,wDAAgE;AAchE,IAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAE5C,SAAS,oBAAoB,CAC3B,GAAW,EACX,gBAAsC;IAEtC,IAAM,QAAQ,GAAG,mBAAQ,CAAC,YAAY,CAAC,aAAa,EAAE;QACpD,GAAG,KAAA;QACH,gBAAgB,EAAE,GAAG;QACrB,wBAAwB,EAAE,GAAG;QAC7B,wBAAwB,EAAE,GAAG;QAC7B,YAAY,EAAE;YACZ,mBAAQ,CAAC,aAAa,CAAC,uBAAuB,EAAE;gBAC9C,sBAAsB,EAAE,mBAAQ,CAAC,YAAY,CAC3C,mCAAmC,EACnC,mBAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EACzB,mBAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAC3B,mBAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAC3B;aACF,CAAC;YACF,mBAAQ,CAAC,aAAa,CAAC,eAAe,CAAC;SACxC;KACF,CAAC,CAAC;IAEH,IAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAe,CAAC;IAC7D,IAAM,sBAAsB,GAAG,IAAA,iCAAyB,EAAC,mBAAmB,CAAC,CAAC;IAE9E,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAC7B,sBAAsB,EACtB,CAAC;IACD,gFAAgF;IAChF,iEAAiE;IACjE,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC,IAAI,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAW,EACX,gBAAsC;IAEtC,IAAM,QAAQ,GAAG,mBAAQ,CAAC,YAAY,CAAC,aAAa,EAAE;QACpD,GAAG,KAAA;QACH,gBAAgB,EAAE,GAAG;KACtB,CAAC,CAAC;IAEH,IAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAe,CAAC;IAE7D,IAAM,sBAAsB,GAAG,IAAA,iCAAyB,EAAC,mBAAmB,CAAC,CAAC;IAE9E,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAC7B,sBAAsB,EACtB,CAAC;IACD,gFAAgF;IAChF,iEAAiE;IACjE,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC,IAAI,CAC5B,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CACvB,WAA+B,EAC/B,WAA2B;;IAE3B,IAAM,YAAY,GAAG,IAAA,gCAAiB,EAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACxE,IAAM,iBAAiB,GAAG,YAAY,KAAI,MAAA,IAAA,cAAK,EAAC,YAAY,CAAC,0CAAE,KAAK,CAAA,CAAC;IACrE,IAAM,SAAS,GAAG,iBAAiB,IAAI,iBAAiB,IAAI,CAAC,CAAC;IAE9D,OAAO,SAAS,KAAI,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,0CAAE,gBAAgB,CAAA,IAAI,KAAK,CAAC;AACrE,CAAC;AATD,8BASC;AAED,SAAsB,eAAe;;;;;;oBAC7B,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;;;;oBAGjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE;wBAClC,sBAAO,EAAE,EAAC;qBACX;oBAEK,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC;oBAC9B,qBAAM,MAAM,CAAC,SAAS,CAAC,EAAA;;oBAA5C,iBAAiB,GAAG,CAAC,SAAuB,CAEjD;oBAED,sBAAO,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,KAAI,EAAE,EAAC;;;oBAExC,iBAAK,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAiB,iBAAiB,MAAG,CAAC,CAAC;oBACvD,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,eAAK,CAAC,GAAG,CACP,OAAO,GAAC,KAAK,QAAQ,IAAI,GAAC,IAAI,IAAI,IAAI,UAAU,IAAI,GAAC;wBACnD,CAAC,CAAC,GAAC,CAAC,QAAQ,EAAE;wBACd,CAAC,CAAC,OAAO,GAAC,KAAK,QAAQ;4BACvB,CAAC,CAAC,GAAC;4BACH,CAAC,CAAC,eAAe,CACpB,CACF,CAAC;oBAEF,sBAAO,EAAE,EAAC;;;;;CAEb;AA5BD,0CA4BC;AAED,SAAsB,mBAAmB,CACvC,IAAc,EACd,IAAc;;;;;;oBAER,YAAY,GAAG,eAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;yBAEhD,IAAI,EAAJ,wBAAI;oBACN,qBAAM,IAAA,+BAAqB,EAAC,YAAY,CAAC,EAAA;;oBAAzC,SAAyC,CAAC;;wBAE1C,qBAAM,IAAA,+BAAqB,EAAC,YAAY,CAAC,EAAA;;oBAAzC,SAAyC,CAAC;;;oBAG5C,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,+CAAwC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAG,CACpE,CAAC;;;;;CAEH;AAhBD,kDAgBC;AAED,SAAsB,iBAAiB,CAAC,IAIvC;;;;;;oBAGO,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;oBAE/D,qBAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAA;;oBADvC,iBAAiB,GAAG,CACxB,SAA2C,CAC5C,CAAC,QAAQ,EAAE;oBACN,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBAElD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;wBACxB,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC;qBAC1B;oBAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE;wBAC9B,WAAW,CAAC,OAAO,CAAC,KAAK;4BACvB,oEAA6D,IAAI,CAAC,GAAG,wBAAc,IAAI,CAAC,OAAO,CAAE;gCACjG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAU,IAAI,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAEzC,6DAA6D;qBAC9D;yBAAM,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;wBAC5D,6DAA6D;wBAC7D,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAC3D,aAAa,EACb,qDAAqD,CACtD,CAAC;qBACH;oBAED,qBAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,eAAe,EACf,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CACrC,EAAA;;oBAHD,SAGC,CAAC;oBAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,+BAAwB,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAc,eAAK,CAAC,IAAI,CACjE,cAAc,CACf,wCAAqC,CACvC,CAAC;;;;;CAEH;AA1CD,8CA0CC;AAED,SAAsB,6BAA6B,CACjD,GAAW,EACX,IAAa;;;;;;oBAEP,mBAAmB,GAAG,uBAAgB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;oBAE7D,mBAAmB,GAAG,IAAI,CAAC,IAAI,CACnC,OAAO,CAAC,GAAG,EAAE,EACb,KAAK,EACL,mBAAmB,CACpB,CAAC;oBAE6B,qBAAM,IAAA,mBAAQ,EAAC,mBAAmB,CAAC,EAAA;;oBAA5D,sBAAsB,GAAG,SAAmC;oBAElE,IAAI,IAAA,wBAAgB,EAAC,mBAAmB,EAAE,sBAAsB,CAAC,KAAK,CAAC,EAAE;wBACvE,sBAAO;qBACR;oBAED,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClC,IAAI,EAAE,eAAe;wBACrB,QAAQ,EAAE,GAAG;wBACb,KAAK,EAAE,QAAQ;qBAChB,CAAC,CAAC;oBAEH,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClC,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,WAAW;wBACrB,KAAK,EAAE,WAAW;qBACnB,CAAC,CAAC;oBAEH,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClC,IAAI,EAAE,kBAAkB;wBACxB,QAAQ,EAAE,aAAa;wBACvB,KAAK,EAAE,aAAa;qBACrB,CAAC,CAAC;oBAEH,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClC,IAAI,EAAE,kBAAkB;wBACxB,QAAQ,EAAE,YAAY;wBACtB,KAAK,EAAE,YAAY;qBACpB,CAAC,CAAC;oBAEH,oBAAoB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;oBAElD,qBAAM,IAAA,oBAAS,EACb,sBAAsB,CAAC,IAAI,EAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,CACrD,EAAA;;oBAHD,SAGC,CAAC;oBAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,gEAAyD,eAAK,CAAC,IAAI,CACjE,mBAAmB,CACpB,CAAE,CACJ,CAAC;;;;;CACH;AAtDD,sEAsDC;AAED,SAAsB,6BAA6B,CACjD,GAAW,EACX,IAAa,EACb,IAAa;;;;;;oBAEP,mBAAmB,GAAG,uBAAgB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;oBAE7D,mBAAmB,GAAG,IAAI,CAAC,IAAI,CACnC,OAAO,CAAC,GAAG,EAAE,EACb,KAAK,EACL,mBAAmB,CACpB,CAAC;oBAE6B,qBAAM,IAAA,mBAAQ,EAAC,mBAAmB,CAAC,EAAA;;oBAA5D,sBAAsB,GAAG,SAAmC;oBAElE,IAAI,IAAA,wBAAgB,EAAC,mBAAmB,EAAE,sBAAsB,CAAC,KAAK,CAAC,EAAE;wBACvE,sBAAO;qBACR;oBAED,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClC,IAAI,EAAE,eAAe;wBACrB,QAAQ,EAAE,GAAG;wBACb,KAAK,EAAE,QAAQ;qBAChB,CAAC,CAAC;oBAEH,oBAAoB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;oBAElD,IAAI,IAAI,EAAE;wBACF,uBAAuB,GAAG,IAAA,oCAAqB,EACnD,sBAAsB,EACtB,mBAAmB,CACpB,CAAC;wBAEF,IAAI,uBAAuB,EAAE;4BAC3B,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,uBAAgB,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAO,eAAK,CAAC,IAAI,CACxD,UAAG,mBAAmB,CAAE,CACzB,CAAE,CACJ,CAAC;yBACH;qBACF;oBAED,qBAAM,IAAA,oBAAS,EACb,sBAAsB,CAAC,IAAI,EAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,CACrD,EAAA;;oBAHD,SAGC,CAAC;oBAEF,iBAAK,CAAC,GAAG,CAAC,OAAO,CACf,gEAAyD,eAAK,CAAC,IAAI,CACjE,mBAAmB,CACpB,MAAG,CACL,CAAC;;;;;CACH;AApDD,sEAoDC","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';\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 { parse } from 'semver';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { builders, generateCode, loadFile, writeFile } from 'magicast';\nimport { PackageDotJson, getPackageVersion } from '../utils/package-json';\nimport { getInitCallInsertionIndex, hasSentryContent } from './utils';\nimport { instrumentRootRouteV1 } from './codemods/root-v1';\nimport { instrumentRootRouteV2 } from './codemods/root-v2';\nimport { instrumentHandleError } from './codemods/handle-error';\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';\n\nfunction insertClientInitCall(\n dsn: string,\n originalHooksMod: ProxifiedModule<any>,\n): void {\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n replaysSessionSampleRate: 0.1,\n replaysOnErrorSampleRate: 1.0,\n integrations: [\n builders.newExpression('Sentry.BrowserTracing', {\n routingInstrumentation: builders.functionCall(\n 'Sentry.remixRouterInstrumentation',\n builders.raw('useEffect'),\n builders.raw('useLocation'),\n builders.raw('useMatches'),\n ),\n }),\n builders.newExpression('Sentry.Replay'),\n ],\n });\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n const initCallInsertionIndex = getInitCallInsertionIndex(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\nfunction insertServerInitCall(\n dsn: string,\n originalHooksMod: ProxifiedModule<any>,\n) {\n const initCall = builders.functionCall('Sentry.init', {\n dsn,\n tracesSampleRate: 1.0,\n });\n\n const originalHooksModAST = originalHooksMod.$ast as Program;\n\n const initCallInsertionIndex = getInitCallInsertionIndex(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 isRemixV2(\n remixConfig: PartialRemixConfig,\n packageJson: PackageDotJson,\n): boolean {\n const remixVersion = getPackageVersion('@remix-run/react', packageJson);\n const remixVersionMajor = remixVersion && parse(remixVersion)?.major;\n const isV2Remix = remixVersionMajor && remixVersionMajor >= 2;\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}): Promise<void> {\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // Add sourcemaps option to build script\n const packageJsonPath = path.join(process.cwd(), 'package.json');\n const packageJsonString = (\n await fs.promises.readFile(packageJsonPath)\n ).toString();\n const packageJson = JSON.parse(packageJsonString);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n if (!packageJson.scripts.build) {\n packageJson.scripts.build =\n `remix build --sourcemap && sentry-upload-sourcemaps --org ${args.org} --project ${args.project}` +\n (args.url ? ` --url ${args.url}` : '');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n } else if (packageJson.scripts.build.includes('remix build')) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n packageJson.scripts.build = packageJson.scripts.build.replace(\n 'remix build',\n 'remix build --sourcemap && sentry-upload-sourcemaps',\n );\n }\n\n await fs.promises.writeFile(\n packageJsonPath,\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 async function initializeSentryOnEntryClient(\n dsn: string,\n isTS: boolean,\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 originalEntryClientMod.imports.$add({\n from: '@sentry/remix',\n imported: '*',\n local: 'Sentry',\n });\n\n originalEntryClientMod.imports.$add({\n from: 'react',\n imported: 'useEffect',\n local: 'useEffect',\n });\n\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 insertClientInitCall(dsn, originalEntryClientMod);\n\n await writeFile(\n originalEntryClientMod.$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 initializeSentryOnEntryServer(\n dsn: string,\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 insertServerInitCall(dsn, originalEntryServerMod);\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,3 +1,12 @@
|
|
|
1
1
|
import { SourceMapUploadToolConfigurationOptions } from './types';
|
|
2
|
+
import { PackageDotJson } from '../../utils/package-json';
|
|
2
3
|
export declare function configureSentryCLI(options: SourceMapUploadToolConfigurationOptions, configureSourcemapGenerationFlow?: () => Promise<void>): Promise<void>;
|
|
3
4
|
export declare function setupNpmScriptInCI(): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Add the sentry:sourcemaps command to the prod build command in the package.json
|
|
7
|
+
* - Detect the user's build command
|
|
8
|
+
* - Append the sentry:sourcemaps command to it
|
|
9
|
+
*
|
|
10
|
+
* @param packageDotJson The package.json which will be modified.
|
|
11
|
+
*/
|
|
12
|
+
export declare function addSentryCommandToBuildCommand(packageDotJson: PackageDotJson): Promise<void>;
|
|
@@ -62,9 +62,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
62
62
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
63
63
|
};
|
|
64
64
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.setupNpmScriptInCI = exports.configureSentryCLI = void 0;
|
|
65
|
+
exports.addSentryCommandToBuildCommand = exports.setupNpmScriptInCI = exports.configureSentryCLI = void 0;
|
|
66
66
|
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
67
|
-
var
|
|
67
|
+
var clack = __importStar(require("@clack/prompts"));
|
|
68
68
|
var chalk_1 = __importDefault(require("chalk"));
|
|
69
69
|
var Sentry = __importStar(require("@sentry/node"));
|
|
70
70
|
var path = __importStar(require("path"));
|
|
@@ -92,7 +92,7 @@ function configureSentryCLI(options, configureSourcemapGenerationFlow) {
|
|
|
92
92
|
_b.sent();
|
|
93
93
|
validPath = false;
|
|
94
94
|
_b.label = 3;
|
|
95
|
-
case 3: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
95
|
+
case 3: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.text({
|
|
96
96
|
message: 'Where are your build artifacts located?',
|
|
97
97
|
placeholder: ".".concat(path.sep, "out"),
|
|
98
98
|
validate: function (value) {
|
|
@@ -119,7 +119,7 @@ function configureSentryCLI(options, configureSourcemapGenerationFlow) {
|
|
|
119
119
|
return [3 /*break*/, 9];
|
|
120
120
|
case 7:
|
|
121
121
|
_a = _b.sent();
|
|
122
|
-
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
122
|
+
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.select({
|
|
123
123
|
message: "We couldn't find artifacts at ".concat(relativeArtifactPath, ". Are you sure that this is the location that contains your build artifacts?"),
|
|
124
124
|
options: [
|
|
125
125
|
{
|
|
@@ -156,7 +156,7 @@ function configureSentryCLI(options, configureSourcemapGenerationFlow) {
|
|
|
156
156
|
_b.sent();
|
|
157
157
|
return [3 /*break*/, 16];
|
|
158
158
|
case 15:
|
|
159
|
-
|
|
159
|
+
clack.log.info("No problem, just make sure to run this script ".concat(chalk_1.default.bold('after'), " building your application but ").concat(chalk_1.default.bold('before'), " deploying!"));
|
|
160
160
|
_b.label = 16;
|
|
161
161
|
case 16: return [4 /*yield*/, (0, clack_utils_1.addSentryCliConfig)(options.authToken)];
|
|
162
162
|
case 17:
|
|
@@ -178,7 +178,7 @@ function setupNpmScriptInCI() {
|
|
|
178
178
|
// if the script is already added to the build command
|
|
179
179
|
return [2 /*return*/];
|
|
180
180
|
}
|
|
181
|
-
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
181
|
+
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.select({
|
|
182
182
|
message: "Add a step to your CI pipeline that runs the ".concat(chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME), " script ").concat(chalk_1.default.bold('right after'), " building your application."),
|
|
183
183
|
options: [
|
|
184
184
|
{ label: 'I did, continue!', value: true },
|
|
@@ -194,7 +194,7 @@ function setupNpmScriptInCI() {
|
|
|
194
194
|
addedToCI = _a.sent();
|
|
195
195
|
Sentry.setTag('added-ci-script', addedToCI);
|
|
196
196
|
if (!addedToCI) {
|
|
197
|
-
|
|
197
|
+
clack.log.info("Don't forget! :)");
|
|
198
198
|
}
|
|
199
199
|
return [2 /*return*/];
|
|
200
200
|
}
|
|
@@ -214,7 +214,7 @@ function createAndAddNpmScript(packageDotJson, options, relativePosixArtifactPat
|
|
|
214
214
|
return [4 /*yield*/, fs.promises.writeFile(path.join(process.cwd(), 'package.json'), JSON.stringify(packageDotJson, null, 2))];
|
|
215
215
|
case 1:
|
|
216
216
|
_a.sent();
|
|
217
|
-
|
|
217
|
+
clack.log.info("Added a ".concat(chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME), " script to your ").concat(chalk_1.default.cyan('package.json'), "."));
|
|
218
218
|
return [2 /*return*/];
|
|
219
219
|
}
|
|
220
220
|
});
|
|
@@ -225,7 +225,7 @@ function askShouldAddToBuildCommand() {
|
|
|
225
225
|
var shouldAddToBuildCommand;
|
|
226
226
|
return __generator(this, function (_a) {
|
|
227
227
|
switch (_a.label) {
|
|
228
|
-
case 0: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
228
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.select({
|
|
229
229
|
message: "Do you want to automatically run the ".concat(chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME), " script after each production build?"),
|
|
230
230
|
options: [
|
|
231
231
|
{
|
|
@@ -255,7 +255,7 @@ function askShouldAddToBuildCommand() {
|
|
|
255
255
|
function addSentryCommandToBuildCommand(packageDotJson) {
|
|
256
256
|
var _a;
|
|
257
257
|
return __awaiter(this, void 0, void 0, function () {
|
|
258
|
-
var allNpmScripts, packageManager,
|
|
258
|
+
var allNpmScripts, packageManager, buildCommand, isProdBuildCommand, _b, oldCommand;
|
|
259
259
|
return __generator(this, function (_c) {
|
|
260
260
|
switch (_c.label) {
|
|
261
261
|
case 0:
|
|
@@ -263,15 +263,14 @@ function addSentryCommandToBuildCommand(packageDotJson) {
|
|
|
263
263
|
// SENTRY_NPM_SCRIPT_NAME script but just to be sure
|
|
264
264
|
packageDotJson.scripts = packageDotJson.scripts || {};
|
|
265
265
|
allNpmScripts = Object.keys(packageDotJson.scripts).filter(function (s) { return s !== SENTRY_NPM_SCRIPT_NAME; });
|
|
266
|
-
packageManager = (0, package_manager_1.detectPackageManger)();
|
|
267
|
-
packageManagerName = (_a = packageManager === null || packageManager === void 0 ? void 0 : packageManager.name) !== null && _a !== void 0 ? _a : 'npm';
|
|
266
|
+
packageManager = (_a = (0, package_manager_1.detectPackageManger)()) !== null && _a !== void 0 ? _a : package_manager_1.NPM;
|
|
268
267
|
buildCommand = typeof packageDotJson.scripts.build === 'string'
|
|
269
268
|
? 'build'
|
|
270
269
|
: allNpmScripts.find(function (s) { return s.toLocaleLowerCase().includes('build'); });
|
|
271
270
|
_b = !!buildCommand;
|
|
272
271
|
if (!_b) return [3 /*break*/, 2];
|
|
273
|
-
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
274
|
-
message: "Is ".concat(chalk_1.default.cyan("".concat(
|
|
272
|
+
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.confirm({
|
|
273
|
+
message: "Is ".concat(chalk_1.default.cyan("".concat(packageManager.runScriptCommand, " ").concat(buildCommand)), " your production build command?"),
|
|
275
274
|
}))];
|
|
276
275
|
case 1:
|
|
277
276
|
_b = (_c.sent());
|
|
@@ -279,8 +278,8 @@ function addSentryCommandToBuildCommand(packageDotJson) {
|
|
|
279
278
|
case 2:
|
|
280
279
|
isProdBuildCommand = _b;
|
|
281
280
|
if (!(allNpmScripts.length && (!buildCommand || !isProdBuildCommand))) return [3 /*break*/, 4];
|
|
282
|
-
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
283
|
-
message: "Which ".concat(
|
|
281
|
+
return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.select({
|
|
282
|
+
message: "Which ".concat(packageManager.name, " command in your ").concat(chalk_1.default.cyan('package.json'), " builds your application for production?"),
|
|
284
283
|
options: allNpmScripts
|
|
285
284
|
.map(function (script) { return ({
|
|
286
285
|
label: script,
|
|
@@ -293,27 +292,32 @@ function addSentryCommandToBuildCommand(packageDotJson) {
|
|
|
293
292
|
_c.label = 4;
|
|
294
293
|
case 4:
|
|
295
294
|
if (!buildCommand || buildCommand === 'none') {
|
|
296
|
-
|
|
295
|
+
clack.log.warn("We can only add the ".concat(chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME), " script to another `script` in your ").concat(chalk_1.default.cyan('package.json'), ".\nPlease add it manually to your prod build command."));
|
|
297
296
|
return [2 /*return*/];
|
|
298
297
|
}
|
|
299
|
-
packageDotJson.scripts[buildCommand
|
|
300
|
-
|
|
301
|
-
|
|
298
|
+
oldCommand = packageDotJson.scripts[buildCommand];
|
|
299
|
+
if (!oldCommand) {
|
|
300
|
+
// very unlikely to happen but nevertheless
|
|
301
|
+
clack.log.warn("`".concat(buildCommand, "` doesn't seem to be part of your package.json scripts"));
|
|
302
|
+
return [2 /*return*/];
|
|
303
|
+
}
|
|
304
|
+
packageDotJson.scripts[buildCommand] = "".concat(oldCommand, " && ").concat(packageManager.runScriptCommand, " ").concat(SENTRY_NPM_SCRIPT_NAME);
|
|
302
305
|
return [4 /*yield*/, fs.promises.writeFile(path.join(process.cwd(), 'package.json'), JSON.stringify(packageDotJson, null, 2))];
|
|
303
306
|
case 5:
|
|
304
307
|
_c.sent();
|
|
305
308
|
addedToBuildCommand = true;
|
|
306
|
-
|
|
309
|
+
clack.log.info("Added ".concat(chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME), " script to your ").concat(chalk_1.default.cyan(buildCommand), " command."));
|
|
307
310
|
return [2 /*return*/];
|
|
308
311
|
}
|
|
309
312
|
});
|
|
310
313
|
});
|
|
311
314
|
}
|
|
315
|
+
exports.addSentryCommandToBuildCommand = addSentryCommandToBuildCommand;
|
|
312
316
|
function defaultConfigureSourcemapGenerationFlow() {
|
|
313
317
|
return __awaiter(this, void 0, void 0, function () {
|
|
314
318
|
return __generator(this, function (_a) {
|
|
315
319
|
switch (_a.label) {
|
|
316
|
-
case 0: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(
|
|
320
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.abortIfCancelled)(clack.select({
|
|
317
321
|
message: "Verify that your build tool is generating source maps. ".concat(chalk_1.default.dim('(Your build output folder should contain .js.map files after a build)')),
|
|
318
322
|
options: [{ label: 'I checked. Continue!', value: true }],
|
|
319
323
|
initialValue: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry-cli.js","sourceRoot":"","sources":["../../../../src/sourcemaps/tools/sentry-cli.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as Sentry from '@sentry/node';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport {\n abortIfCancelled,\n addSentryCliConfig,\n getPackageDotJson,\n installPackage,\n} from '../../utils/clack-utils';\n\nimport { SourceMapUploadToolConfigurationOptions } from './types';\nimport { hasPackageInstalled, PackageDotJson } from '../../utils/package-json';\nimport { traceStep } from '../../telemetry';\nimport { detectPackageManger } from '../../utils/package-manager';\n\nconst SENTRY_NPM_SCRIPT_NAME = 'sentry:sourcemaps';\n\nlet addedToBuildCommand = false;\n\nexport async function configureSentryCLI(\n options: SourceMapUploadToolConfigurationOptions,\n configureSourcemapGenerationFlow: () => Promise<void> = defaultConfigureSourcemapGenerationFlow,\n): Promise<void> {\n const packageDotJson = await getPackageDotJson();\n\n await installPackage({\n packageName: '@sentry/cli',\n alreadyInstalled: hasPackageInstalled('@sentry/cli', packageDotJson),\n });\n\n let validPath = false;\n let relativeArtifactPath;\n do {\n const rawArtifactPath = await abortIfCancelled(\n clack.text({\n message: 'Where are your build artifacts located?',\n placeholder: `.${path.sep}out`,\n validate(value) {\n if (!value) {\n return 'Please enter a path.';\n }\n },\n }),\n );\n\n if (path.isAbsolute(rawArtifactPath)) {\n relativeArtifactPath = path.relative(process.cwd(), rawArtifactPath);\n } else {\n relativeArtifactPath = rawArtifactPath;\n }\n\n try {\n await fs.promises.access(path.join(process.cwd(), relativeArtifactPath));\n validPath = true;\n } catch {\n validPath = await abortIfCancelled(\n clack.select({\n message: `We couldn't find artifacts at ${relativeArtifactPath}. Are you sure that this is the location that contains your build artifacts?`,\n options: [\n {\n label: 'No, let me verify.',\n value: false,\n },\n { label: 'Yes, I am sure!', value: true },\n ],\n initialValue: false,\n }),\n );\n }\n } while (!validPath);\n\n const relativePosixArtifactPath = relativeArtifactPath\n .split(path.sep)\n .join(path.posix.sep);\n\n await configureSourcemapGenerationFlow();\n\n await createAndAddNpmScript(\n packageDotJson,\n options,\n relativePosixArtifactPath,\n );\n\n if (await askShouldAddToBuildCommand()) {\n await traceStep('sentry-cli-add-to-build-cmd', () =>\n addSentryCommandToBuildCommand(packageDotJson),\n );\n } else {\n clack.log.info(\n `No problem, just make sure to run this script ${chalk.bold(\n 'after',\n )} building your application but ${chalk.bold('before')} deploying!`,\n );\n }\n\n await addSentryCliConfig(options.authToken);\n}\n\nexport async function setupNpmScriptInCI(): Promise<void> {\n if (addedToBuildCommand) {\n // No need to tell users to add it manually to their CI\n // if the script is already added to the build command\n return;\n }\n\n const addedToCI = await abortIfCancelled(\n clack.select({\n message: `Add a step to your CI pipeline that runs the ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script ${chalk.bold('right after')} building your application.`,\n options: [\n { label: 'I did, continue!', value: true },\n {\n label: \"I'll do it later...\",\n value: false,\n hint: chalk.yellow(\n `You need to run ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} after each build for source maps to work properly.`,\n ),\n },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('added-ci-script', addedToCI);\n\n if (!addedToCI) {\n clack.log.info(\"Don't forget! :)\");\n }\n}\n\nasync function createAndAddNpmScript(\n packageDotJson: PackageDotJson,\n options: SourceMapUploadToolConfigurationOptions,\n relativePosixArtifactPath: string,\n): Promise<void> {\n const sentryCliNpmScript = `sentry-cli sourcemaps inject --org ${\n options.orgSlug\n } --project ${\n options.projectSlug\n } ${relativePosixArtifactPath} && sentry-cli${\n options.selfHosted ? ` --url ${options.url}` : ''\n } sourcemaps upload --org ${options.orgSlug} --project ${\n options.projectSlug\n } ${relativePosixArtifactPath}`;\n\n packageDotJson.scripts = packageDotJson.scripts || {};\n packageDotJson.scripts[SENTRY_NPM_SCRIPT_NAME] = sentryCliNpmScript;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageDotJson, null, 2),\n );\n\n clack.log.info(\n `Added a ${chalk.cyan(SENTRY_NPM_SCRIPT_NAME)} script to your ${chalk.cyan(\n 'package.json',\n )}.`,\n );\n}\n\nasync function askShouldAddToBuildCommand(): Promise<boolean> {\n const shouldAddToBuildCommand = await abortIfCancelled(\n clack.select({\n message: `Do you want to automatically run the ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script after each production build?`,\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'This will modify your prod build command',\n },\n { label: 'No', value: false },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('modify-build-command', shouldAddToBuildCommand);\n\n return shouldAddToBuildCommand;\n}\n\n/**\n * Add the sentry:sourcemaps command to the prod build command in the package.json\n * - Detect the user's build command\n * - Append the sentry:sourcemaps command to it\n *\n * @param packageDotJson The package.json which will be modified.\n */\nasync function addSentryCommandToBuildCommand(\n packageDotJson: PackageDotJson,\n): Promise<void> {\n // This usually shouldn't happen because earlier we added the\n // SENTRY_NPM_SCRIPT_NAME script but just to be sure\n packageDotJson.scripts = packageDotJson.scripts || {};\n\n const allNpmScripts = Object.keys(packageDotJson.scripts).filter(\n (s) => s !== SENTRY_NPM_SCRIPT_NAME,\n );\n\n const packageManager = detectPackageManger();\n const packageManagerName = packageManager?.name ?? 'npm';\n\n // Heuristic to pre-select the build command:\n // Often, 'build' is the prod build command, so we favour it.\n // If it's not there, commands that include 'build' might be the prod build command.\n let buildCommand =\n typeof packageDotJson.scripts.build === 'string'\n ? 'build'\n : allNpmScripts.find((s) => s.toLocaleLowerCase().includes('build'));\n\n const isProdBuildCommand =\n !!buildCommand &&\n (await abortIfCancelled(\n clack.confirm({\n message: `Is ${chalk.cyan(\n `${packageManagerName} run ${buildCommand}`,\n )} your production build command?`,\n }),\n ));\n\n if (allNpmScripts.length && (!buildCommand || !isProdBuildCommand)) {\n buildCommand = await abortIfCancelled(\n clack.select({\n message: `Which ${packageManagerName} command in your ${chalk.cyan(\n 'package.json',\n )} builds your application for production?`,\n options: allNpmScripts\n .map((script) => ({\n label: script,\n value: script,\n }))\n .concat({ label: 'None of the above', value: 'none' }),\n }),\n );\n }\n\n if (!buildCommand || buildCommand === 'none') {\n clack.log.warn(\n `We can only add the ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script to another \\`script\\` in your ${chalk.cyan('package.json')}.\nPlease add it manually to your prod build command.`,\n );\n return;\n }\n\n packageDotJson.scripts[\n buildCommand\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n ] = `${packageDotJson.scripts[buildCommand]} && ${packageManager} run ${SENTRY_NPM_SCRIPT_NAME}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageDotJson, null, 2),\n );\n\n addedToBuildCommand = true;\n\n clack.log.info(\n `Added ${chalk.cyan(SENTRY_NPM_SCRIPT_NAME)} script to your ${chalk.cyan(\n buildCommand,\n )} command.`,\n );\n}\n\nasync function defaultConfigureSourcemapGenerationFlow(): Promise<void> {\n await abortIfCancelled(\n clack.select({\n message: `Verify that your build tool is generating source maps. ${chalk.dim(\n '(Your build output folder should contain .js.map files after a build)',\n )}`,\n options: [{ label: 'I checked. Continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sentry-cli.js","sourceRoot":"","sources":["../../../../src/sourcemaps/tools/sentry-cli.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport * as Sentry from '@sentry/node';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport {\n abortIfCancelled,\n addSentryCliConfig,\n getPackageDotJson,\n installPackage,\n} from '../../utils/clack-utils';\n\nimport { SourceMapUploadToolConfigurationOptions } from './types';\nimport { hasPackageInstalled, PackageDotJson } from '../../utils/package-json';\nimport { traceStep } from '../../telemetry';\nimport { detectPackageManger, NPM } from '../../utils/package-manager';\n\nconst SENTRY_NPM_SCRIPT_NAME = 'sentry:sourcemaps';\n\nlet addedToBuildCommand = false;\n\nexport async function configureSentryCLI(\n options: SourceMapUploadToolConfigurationOptions,\n configureSourcemapGenerationFlow: () => Promise<void> = defaultConfigureSourcemapGenerationFlow,\n): Promise<void> {\n const packageDotJson = await getPackageDotJson();\n\n await installPackage({\n packageName: '@sentry/cli',\n alreadyInstalled: hasPackageInstalled('@sentry/cli', packageDotJson),\n });\n\n let validPath = false;\n let relativeArtifactPath;\n do {\n const rawArtifactPath = await abortIfCancelled(\n clack.text({\n message: 'Where are your build artifacts located?',\n placeholder: `.${path.sep}out`,\n validate(value) {\n if (!value) {\n return 'Please enter a path.';\n }\n },\n }),\n );\n\n if (path.isAbsolute(rawArtifactPath)) {\n relativeArtifactPath = path.relative(process.cwd(), rawArtifactPath);\n } else {\n relativeArtifactPath = rawArtifactPath;\n }\n\n try {\n await fs.promises.access(path.join(process.cwd(), relativeArtifactPath));\n validPath = true;\n } catch {\n validPath = await abortIfCancelled(\n clack.select({\n message: `We couldn't find artifacts at ${relativeArtifactPath}. Are you sure that this is the location that contains your build artifacts?`,\n options: [\n {\n label: 'No, let me verify.',\n value: false,\n },\n { label: 'Yes, I am sure!', value: true },\n ],\n initialValue: false,\n }),\n );\n }\n } while (!validPath);\n\n const relativePosixArtifactPath = relativeArtifactPath\n .split(path.sep)\n .join(path.posix.sep);\n\n await configureSourcemapGenerationFlow();\n\n await createAndAddNpmScript(\n packageDotJson,\n options,\n relativePosixArtifactPath,\n );\n\n if (await askShouldAddToBuildCommand()) {\n await traceStep('sentry-cli-add-to-build-cmd', () =>\n addSentryCommandToBuildCommand(packageDotJson),\n );\n } else {\n clack.log.info(\n `No problem, just make sure to run this script ${chalk.bold(\n 'after',\n )} building your application but ${chalk.bold('before')} deploying!`,\n );\n }\n\n await addSentryCliConfig(options.authToken);\n}\n\nexport async function setupNpmScriptInCI(): Promise<void> {\n if (addedToBuildCommand) {\n // No need to tell users to add it manually to their CI\n // if the script is already added to the build command\n return;\n }\n\n const addedToCI = await abortIfCancelled(\n clack.select({\n message: `Add a step to your CI pipeline that runs the ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script ${chalk.bold('right after')} building your application.`,\n options: [\n { label: 'I did, continue!', value: true },\n {\n label: \"I'll do it later...\",\n value: false,\n hint: chalk.yellow(\n `You need to run ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} after each build for source maps to work properly.`,\n ),\n },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('added-ci-script', addedToCI);\n\n if (!addedToCI) {\n clack.log.info(\"Don't forget! :)\");\n }\n}\n\nasync function createAndAddNpmScript(\n packageDotJson: PackageDotJson,\n options: SourceMapUploadToolConfigurationOptions,\n relativePosixArtifactPath: string,\n): Promise<void> {\n const sentryCliNpmScript = `sentry-cli sourcemaps inject --org ${\n options.orgSlug\n } --project ${\n options.projectSlug\n } ${relativePosixArtifactPath} && sentry-cli${\n options.selfHosted ? ` --url ${options.url}` : ''\n } sourcemaps upload --org ${options.orgSlug} --project ${\n options.projectSlug\n } ${relativePosixArtifactPath}`;\n\n packageDotJson.scripts = packageDotJson.scripts || {};\n packageDotJson.scripts[SENTRY_NPM_SCRIPT_NAME] = sentryCliNpmScript;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageDotJson, null, 2),\n );\n\n clack.log.info(\n `Added a ${chalk.cyan(SENTRY_NPM_SCRIPT_NAME)} script to your ${chalk.cyan(\n 'package.json',\n )}.`,\n );\n}\n\nasync function askShouldAddToBuildCommand(): Promise<boolean> {\n const shouldAddToBuildCommand = await abortIfCancelled(\n clack.select({\n message: `Do you want to automatically run the ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script after each production build?`,\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'This will modify your prod build command',\n },\n { label: 'No', value: false },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('modify-build-command', shouldAddToBuildCommand);\n\n return shouldAddToBuildCommand;\n}\n\n/**\n * Add the sentry:sourcemaps command to the prod build command in the package.json\n * - Detect the user's build command\n * - Append the sentry:sourcemaps command to it\n *\n * @param packageDotJson The package.json which will be modified.\n */\nexport async function addSentryCommandToBuildCommand(\n packageDotJson: PackageDotJson,\n): Promise<void> {\n // This usually shouldn't happen because earlier we added the\n // SENTRY_NPM_SCRIPT_NAME script but just to be sure\n packageDotJson.scripts = packageDotJson.scripts || {};\n\n const allNpmScripts = Object.keys(packageDotJson.scripts).filter(\n (s) => s !== SENTRY_NPM_SCRIPT_NAME,\n );\n\n const packageManager = detectPackageManger() ?? NPM;\n\n // Heuristic to pre-select the build command:\n // Often, 'build' is the prod build command, so we favour it.\n // If it's not there, commands that include 'build' might be the prod build command.\n let buildCommand =\n typeof packageDotJson.scripts.build === 'string'\n ? 'build'\n : allNpmScripts.find((s) => s.toLocaleLowerCase().includes('build'));\n\n const isProdBuildCommand =\n !!buildCommand &&\n (await abortIfCancelled(\n clack.confirm({\n message: `Is ${chalk.cyan(\n `${packageManager.runScriptCommand} ${buildCommand}`,\n )} your production build command?`,\n }),\n ));\n\n if (allNpmScripts.length && (!buildCommand || !isProdBuildCommand)) {\n buildCommand = await abortIfCancelled(\n clack.select({\n message: `Which ${packageManager.name} command in your ${chalk.cyan(\n 'package.json',\n )} builds your application for production?`,\n options: allNpmScripts\n .map((script) => ({\n label: script,\n value: script,\n }))\n .concat({ label: 'None of the above', value: 'none' }),\n }),\n );\n }\n\n if (!buildCommand || buildCommand === 'none') {\n clack.log.warn(\n `We can only add the ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script to another \\`script\\` in your ${chalk.cyan('package.json')}.\nPlease add it manually to your prod build command.`,\n );\n return;\n }\n\n const oldCommand = packageDotJson.scripts[buildCommand];\n if (!oldCommand) {\n // very unlikely to happen but nevertheless\n clack.log.warn(\n `\\`${buildCommand}\\` doesn't seem to be part of your package.json scripts`,\n );\n return;\n }\n\n packageDotJson.scripts[\n buildCommand\n ] = `${oldCommand} && ${packageManager.runScriptCommand} ${SENTRY_NPM_SCRIPT_NAME}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(packageDotJson, null, 2),\n );\n\n addedToBuildCommand = true;\n\n clack.log.info(\n `Added ${chalk.cyan(SENTRY_NPM_SCRIPT_NAME)} script to your ${chalk.cyan(\n buildCommand,\n )} command.`,\n );\n}\n\nasync function defaultConfigureSourcemapGenerationFlow(): Promise<void> {\n await abortIfCancelled(\n clack.select({\n message: `Verify that your build tool is generating source maps. ${chalk.dim(\n '(Your build output folder should contain .js.map files after a build)',\n )}`,\n options: [{ label: 'I checked. Continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n"]}
|
|
@@ -1 +1,7 @@
|
|
|
1
1
|
export declare function configureTscSourcemapGenerationFlow(): Promise<void>;
|
|
2
|
+
/**
|
|
3
|
+
* Modifies tsconfig.json (@param tsConfigPath) to enable source maps generation.
|
|
4
|
+
*
|
|
5
|
+
* Exported only for testing
|
|
6
|
+
*/
|
|
7
|
+
export declare function enableSourcemaps(tsConfigPath: string): Promise<boolean>;
|