@sentry/wizard 5.0.0 → 5.2.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 +13 -0
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.d.ts +1 -0
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js +91 -0
- package/dist/e2e-tests/tests/cloudflare-wrangler-sourcemaps.test.js.map +1 -0
- package/dist/e2e-tests/tests/expo.test.js +19 -9
- package/dist/e2e-tests/tests/expo.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-14.test.js +27 -0
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-native.test.js +19 -13
- package/dist/e2e-tests/tests/react-native.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.d.ts +17 -0
- package/dist/e2e-tests/utils/index.js +94 -1
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +38 -20
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.d.ts +9 -2
- package/dist/src/nextjs/templates.js +70 -15
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nextjs/utils.d.ts +2 -0
- package/dist/src/nextjs/utils.js +42 -1
- package/dist/src/nextjs/utils.js.map +1 -1
- package/dist/src/nuxt/templates.js +29 -12
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/remix/sdk-example.js +20 -5
- package/dist/src/remix/sdk-example.js.map +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.js +14 -0
- package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
- package/dist/src/sourcemaps/tools/wrangler.d.ts +28 -0
- package/dist/src/sourcemaps/tools/wrangler.js +276 -0
- package/dist/src/sourcemaps/tools/wrangler.js.map +1 -0
- package/dist/src/sourcemaps/utils/detect-tool.d.ts +1 -1
- package/dist/src/sourcemaps/utils/detect-tool.js +1 -0
- package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
- package/dist/src/sveltekit/templates.js +13 -6
- package/dist/src/sveltekit/templates.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +9 -1
- package/dist/src/utils/clack/index.js +8 -1
- package/dist/src/utils/clack/index.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/nextjs/templates.test.js +176 -0
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nextjs/utils.test.d.ts +1 -0
- package/dist/test/nextjs/utils.test.js +104 -0
- package/dist/test/nextjs/utils.test.js.map +1 -0
- package/dist/test/sourcemaps/tools/wrangler.test.d.ts +1 -0
- package/dist/test/sourcemaps/tools/wrangler.test.js +132 -0
- package/dist/test/sourcemaps/tools/wrangler.test.js.map +1 -0
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;;uBAIc,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sHAoCqD,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwKnI,CAAC;AACF,CAAC;AA5ND,oEA4NC","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, useEffect } from \"react\";\n\nclass SentryExampleFrontendError extends Error {\n constructor(message${options.isTS ? ': string | undefined' : ''}) {\n super(message);\n this.name = \"SentryExampleFrontendError\";\n }\n}\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 const [isConnected, setIsConnected] = useState(true);\n \n useEffect(() => {\n async function checkConnectivity() {\n const result = await Sentry.diagnoseSdkConnectivity();\n setIsConnected(result !== 'sentry-unreachable');\n }\n checkConnectivity();\n }, [setIsConnected]);\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 }\n });\n throw new SentryExampleFrontendError(\"This error is raised on the frontend of the example page.\");\n }}\n disabled={!isConnected}\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 ) : !isConnected ? (\n <div className=\"connectivity-error\">\n <p>It looks like network requests to Sentry are being blocked, which will prevent errors from being captured. Try disabling your ad-blocker to complete the test.</p>\n </div>\n ) : (\n <div className=\"success_placeholder\" />\n )}\n\n <div className=\"flex-spacer\" />\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 &:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n\n & > span {\n transform: translateY(0);\n border: none;\n }\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 .connectivity-error {\n padding: 12px 16px;\n background-color: #E50045;\n border-radius: 8px;\n width: 500px;\n color: #FFFFFF;\n border: 1px solid #A80033;\n text-align: center;\n margin: 0;\n }\n \n .connectivity-error a {\n color: #FFFFFF;\n text-decoration: underline;\n }\n\\`;\n`;\n}\n"]}
|
|
@@ -48,6 +48,7 @@ const detect_tool_1 = require("./utils/detect-tool");
|
|
|
48
48
|
const other_wizards_1 = require("./utils/other-wizards");
|
|
49
49
|
const sdk_version_1 = require("./utils/sdk-version");
|
|
50
50
|
const path_1 = require("path");
|
|
51
|
+
const wrangler_1 = require("./tools/wrangler");
|
|
51
52
|
async function runSourcemapsWizard(options, preSelectedTool) {
|
|
52
53
|
return (0, telemetry_1.withTelemetry)({
|
|
53
54
|
enabled: options.telemetryEnabled,
|
|
@@ -106,6 +107,11 @@ You can turn this off by running the wizard with the '--disable-telemetry' flag.
|
|
|
106
107
|
authToken,
|
|
107
108
|
}, wizardOptionsWithPreSelectedProject, preSelectedTool));
|
|
108
109
|
await (0, telemetry_1.traceStep)('ci-setup', () => setupCI(selectedTool, authToken, options.comingFrom));
|
|
110
|
+
if (!preSelectedTool) {
|
|
111
|
+
// running prettier is only necessary if the source maps wizard is the main flow
|
|
112
|
+
// skip it, if it's called from another wizard (e.g. angular)
|
|
113
|
+
await (0, clack_1.runPrettierIfInstalled)({ cwd: process.cwd() });
|
|
114
|
+
}
|
|
109
115
|
if (!preSelectedTool) {
|
|
110
116
|
await (0, telemetry_1.traceStep)('outro', () => printOutro(sentryUrl, selectedProject.organization.slug, selectedProject.id));
|
|
111
117
|
}
|
|
@@ -124,6 +130,11 @@ async function askForUsedBundlerTool() {
|
|
|
124
130
|
value: 'create-react-app',
|
|
125
131
|
hint: 'Select this option if you set up your app with Create React App.',
|
|
126
132
|
},
|
|
133
|
+
{
|
|
134
|
+
label: 'Cloudflare Wrangler',
|
|
135
|
+
value: 'wrangler',
|
|
136
|
+
hint: "You're using `wrangler deploy` to build and deploy your Cloudflare Worker.",
|
|
137
|
+
},
|
|
127
138
|
{
|
|
128
139
|
label: 'Webpack',
|
|
129
140
|
value: 'webpack',
|
|
@@ -184,6 +195,9 @@ async function startToolSetupFlow(selectedTool, options, wizardOptions, preSelec
|
|
|
184
195
|
case 'create-react-app':
|
|
185
196
|
await (0, sentry_cli_1.configureSentryCLI)(options, create_react_app_1.configureCRASourcemapGenerationFlow);
|
|
186
197
|
break;
|
|
198
|
+
case 'wrangler':
|
|
199
|
+
await (0, wrangler_1.configureWrangler)(options);
|
|
200
|
+
break;
|
|
187
201
|
case 'angular':
|
|
188
202
|
await (0, sentry_cli_1.configureSentryCLI)({ ...options, defaultArtifactPath: `.${path_1.sep}dist` }, angular_1.configureAngularSourcemapGenerationFlow, preSelectedTool === 'angular');
|
|
189
203
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourcemaps-wizard.js","sourceRoot":"","sources":["../../../src/sourcemaps/sourcemaps-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n confirmContinueIfNoOrDirtyGitRepo,\n getOrAskForProjectData,\n getPackageManager,\n printWelcome,\n SENTRY_CLI_RC_FILE,\n SENTRY_DOT_ENV_FILE,\n} from '../utils/clack';\nimport { NPM } from '../utils/package-manager';\nimport type { WizardOptions } from '../utils/types';\nimport { getIssueStreamUrl } from '../utils/url';\nimport { isUnicodeSupported } from '../utils/vendor/is-unicorn-supported';\nimport { configureAngularSourcemapGenerationFlow } from './tools/angular';\nimport { configureCRASourcemapGenerationFlow } from './tools/create-react-app';\nimport { configureEsbuildPlugin } from './tools/esbuild';\nimport { configureRollupPlugin } from './tools/rollup';\nimport { configureSentryCLI, setupNpmScriptInCI } from './tools/sentry-cli';\nimport { configureTscSourcemapGenerationFlow } from './tools/tsc';\nimport type { SourceMapUploadToolConfigurationOptions } from './tools/types';\nimport { configureVitePlugin } from './tools/vite';\nimport { configureWebPackPlugin } from './tools/webpack';\nimport type { SupportedTools } from './utils/detect-tool';\nimport { detectUsedTool } from './utils/detect-tool';\nimport { checkIfMoreSuitableWizardExistsAndAskForRedirect } from './utils/other-wizards';\nimport { ensureMinimumSdkVersionIsInstalled } from './utils/sdk-version';\nimport { sep } from 'path';\n\nexport async function runSourcemapsWizard(\n options: WizardOptions,\n preSelectedTool?: SupportedTools,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'sourcemaps',\n wizardOptions: options,\n },\n () => runSourcemapsWizardWithTelemetry(options, preSelectedTool),\n );\n}\n\nasync function runSourcemapsWizardWithTelemetry(\n options: WizardOptions,\n preSelectedTool?: SupportedTools,\n): Promise<void> {\n if (!preSelectedTool) {\n printWelcome({\n wizardName: 'Sentry Source Maps Upload Configuration Wizard',\n message: `This wizard will help you upload source maps to Sentry as part of your build.\nThank you for using Sentry :)${\n options.telemetryEnabled\n ? `\n\n(This setup wizard sends telemetry data and crash reports to Sentry.\nYou can turn this off by running the wizard with the '--disable-telemetry' flag.)`\n : ''\n }`,\n promoCode: options.promoCode,\n });\n }\n\n const moreSuitableWizard = await traceStep(\n 'check-framework-wizard',\n checkIfMoreSuitableWizardExistsAndAskForRedirect,\n );\n if (moreSuitableWizard) {\n await traceStep('run-framework-wizard', () => moreSuitableWizard(options));\n return;\n }\n\n if (!preSelectedTool) {\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n }\n\n await traceStep('check-sdk-version', ensureMinimumSdkVersionIsInstalled);\n\n const { selfHosted, selectedProject, sentryUrl, authToken } =\n await getOrAskForProjectData(options);\n\n const wizardOptionsWithPreSelectedProject = {\n ...options,\n preSelectedProject: {\n project: selectedProject,\n authToken,\n selfHosted,\n },\n };\n\n const selectedTool =\n preSelectedTool || (await traceStep('select-tool', askForUsedBundlerTool));\n\n Sentry.setTag('selected-tool', selectedTool);\n\n if (selectedTool === 'no-tool') {\n clack.log.info(\n \"No Problem! But in this case, there's nothing to configure :)\",\n );\n await abort('Exiting, have a great day!', 0);\n return;\n }\n\n await traceStep('tool-setup', () =>\n startToolSetupFlow(\n selectedTool,\n {\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n authToken,\n },\n wizardOptionsWithPreSelectedProject,\n preSelectedTool,\n ),\n );\n\n await traceStep('ci-setup', () =>\n setupCI(selectedTool, authToken, options.comingFrom),\n );\n\n if (!preSelectedTool) {\n await traceStep('outro', () =>\n printOutro(\n sentryUrl,\n selectedProject.organization.slug,\n selectedProject.id,\n ),\n );\n }\n}\n\nasync function askForUsedBundlerTool(): Promise<SupportedTools> {\n const selectedTool = await abortIfCancelled(\n clack.select({\n message: 'Which framework, bundler or build tool are you using?',\n options: [\n {\n label: 'Angular',\n value: 'angular',\n hint: 'Select this option if you are using Angular.',\n },\n {\n label: 'Create React App',\n value: 'create-react-app',\n hint: 'Select this option if you set up your app with Create React App.',\n },\n {\n label: 'Webpack',\n value: 'webpack',\n hint: 'Select this if you are using Webpack and you have access to your Webpack config.',\n },\n {\n label: 'Vite',\n value: 'vite',\n hint: 'Select this if you are using Vite and you have access to your Vite config.',\n },\n {\n label: 'esbuild',\n value: 'esbuild',\n hint: 'Select this if you are using esbuild and you have access to your esbuild config.',\n },\n {\n label: 'Rollup',\n value: 'rollup',\n hint: 'Select this if you are using Rollup and you have access to your Rollup config.',\n },\n {\n label: 'tsc',\n value: 'tsc',\n hint: 'Configure source maps when using tsc as build tool',\n },\n {\n label: 'I use another tool',\n value: 'sentry-cli',\n hint: 'This will configure source maps upload for you using sentry-cli',\n },\n {\n label: \"I don't minify, transpile or bundle my code\",\n value: 'no-tool',\n hint: 'This will exit the wizard',\n },\n ],\n initialValue: await detectUsedTool(),\n }),\n );\n\n return selectedTool;\n}\n\nasync function startToolSetupFlow(\n selectedTool: SupportedTools,\n options: SourceMapUploadToolConfigurationOptions,\n wizardOptions: WizardOptions,\n preSelectedTool?: SupportedTools,\n): Promise<void> {\n switch (selectedTool) {\n case 'webpack':\n await configureWebPackPlugin(options);\n break;\n case 'vite':\n await configureVitePlugin(options);\n break;\n case 'esbuild':\n await configureEsbuildPlugin(options);\n break;\n case 'rollup':\n await configureRollupPlugin(options);\n break;\n case 'tsc':\n await configureSentryCLI(options, configureTscSourcemapGenerationFlow);\n break;\n case 'create-react-app':\n await configureSentryCLI(options, configureCRASourcemapGenerationFlow);\n break;\n case 'angular':\n await configureSentryCLI(\n { ...options, defaultArtifactPath: `.${sep}dist` },\n configureAngularSourcemapGenerationFlow,\n preSelectedTool === 'angular',\n );\n break;\n default:\n await configureSentryCLI(options);\n break;\n }\n}\nexport async function setupCI(\n selectedTool: SupportedTools,\n authToken: string,\n comingFrom: WizardOptions['comingFrom'],\n) {\n if (comingFrom === 'vercel') {\n clack.log.info(\n 'Sentry Vercel integration is already configured. Skipping CI setup.',\n );\n Sentry.setTag('using-ci', true);\n } else {\n await traceStep('configure-ci', () => configureCI(selectedTool, authToken));\n }\n}\n\nexport async function configureCI(\n selectedTool: SupportedTools,\n authToken: string,\n): Promise<void> {\n const isUsingCI = await abortIfCancelled(\n clack.select({\n message: `Are you using a CI/CD tool to build and deploy your application?`,\n options: [\n {\n label: 'Yes',\n hint: 'I use a tool like GitHub Actions, GitLab, CircleCI, TravisCI, Jenkins, Vercel, ...',\n value: true,\n },\n {\n label: 'No',\n hint: 'I build and deploy my application manually',\n value: false,\n },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('using-ci', isUsingCI);\n\n const isCliBasedFlowTool = [\n 'sentry-cli',\n 'tsc',\n 'angular',\n 'create-react-app',\n ].includes(selectedTool);\n\n const authTokenFile = isCliBasedFlowTool\n ? SENTRY_CLI_RC_FILE\n : SENTRY_DOT_ENV_FILE;\n\n if (!isUsingCI) {\n clack.log.info(\n `No Problem! Just make sure that the Sentry auth token from ${chalk.cyan(\n authTokenFile,\n )} is available whenever you build and deploy your app.`,\n );\n return;\n }\n\n if (isCliBasedFlowTool) {\n await traceStep('ci-npm-script-setup', setupNpmScriptInCI);\n }\n\n await traceStep('ci-auth-token-setup', () => setupAuthTokenInCI(authToken));\n}\n\nasync function setupAuthTokenInCI(authToken: string) {\n clack.log.step(\n 'Add the Sentry authentication token as an environment variable to your CI setup:',\n );\n\n // Intentially logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(\n chalk.greenBright(`\nSENTRY_AUTH_TOKEN=${authToken}\n`),\n );\n\n clack.log.warn(\n chalk.yellow('DO NOT commit this auth token to your repository!'),\n );\n\n const addedEnvVarToCI = await abortIfCancelled(\n clack.select({\n message: 'Did you configure CI as shown above?',\n options: [\n { label: 'Yes, continue!', value: true },\n {\n label: \"I'll do it later...\",\n value: false,\n hint: chalk.yellow(\n 'You need to set the auth token to upload source maps in CI',\n ),\n },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('added-env-var-to-ci', addedEnvVarToCI);\n\n if (!addedEnvVarToCI) {\n clack.log.info(\"Don't forget! :)\");\n }\n}\n\nasync function printOutro(\n url: string,\n orgSlug: string,\n projectId: string,\n): Promise<void> {\n const packageManager = await getPackageManager(NPM);\n\n const issueStreamUrl = getIssueStreamUrl({ url, orgSlug, projectId });\n\n const arrow = isUnicodeSupported() ? '→' : '->';\n\n clack.outro(`${chalk.green(\"That's it - everything is set up!\")}\n\n ${chalk.cyan(`Test and validate your setup locally with the following Steps:\n\n 1. Build your application in ${chalk.bold('production mode')}.\n ${chalk.gray(\n `${arrow} For example, run ${chalk.bold(packageManager.buildCommand)}.`,\n )}\n ${chalk.gray(\n `${arrow} You should see source map upload logs in your console.`,\n )}\n 2. Run your application and throw a test error.\n ${chalk.gray(`${arrow} The error should appear in Sentry:`)}\n ${chalk.gray(`${arrow} ${issueStreamUrl}`)}\n 3. Open the error in Sentry and verify that it's source-mapped.\n ${chalk.gray(\n `${arrow} The stack trace should show your original source code.`,\n )}\n `)}\n ${chalk.dim(\n `If you encounter any issues, please refer to the Troubleshooting Guide:\n https://docs.sentry.io/platforms/javascript/sourcemaps/troubleshooting_js\n\n If the guide doesn't help or you encounter a bug, please let us know:\n https://github.com/getsentry/sentry-javascript/issues`,\n )}\n`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sourcemaps-wizard.js","sourceRoot":"","sources":["../../../src/sourcemaps/sourcemaps-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n confirmContinueIfNoOrDirtyGitRepo,\n getOrAskForProjectData,\n getPackageManager,\n printWelcome,\n runPrettierIfInstalled,\n SENTRY_CLI_RC_FILE,\n SENTRY_DOT_ENV_FILE,\n} from '../utils/clack';\nimport { NPM } from '../utils/package-manager';\nimport type { WizardOptions } from '../utils/types';\nimport { getIssueStreamUrl } from '../utils/url';\nimport { isUnicodeSupported } from '../utils/vendor/is-unicorn-supported';\nimport { configureAngularSourcemapGenerationFlow } from './tools/angular';\nimport { configureCRASourcemapGenerationFlow } from './tools/create-react-app';\nimport { configureEsbuildPlugin } from './tools/esbuild';\nimport { configureRollupPlugin } from './tools/rollup';\nimport { configureSentryCLI, setupNpmScriptInCI } from './tools/sentry-cli';\nimport { configureTscSourcemapGenerationFlow } from './tools/tsc';\nimport type { SourceMapUploadToolConfigurationOptions } from './tools/types';\nimport { configureVitePlugin } from './tools/vite';\nimport { configureWebPackPlugin } from './tools/webpack';\nimport type { SupportedTools } from './utils/detect-tool';\nimport { detectUsedTool } from './utils/detect-tool';\nimport { checkIfMoreSuitableWizardExistsAndAskForRedirect } from './utils/other-wizards';\nimport { ensureMinimumSdkVersionIsInstalled } from './utils/sdk-version';\nimport { sep } from 'path';\nimport { configureWrangler } from './tools/wrangler';\n\nexport async function runSourcemapsWizard(\n options: WizardOptions,\n preSelectedTool?: SupportedTools,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'sourcemaps',\n wizardOptions: options,\n },\n () => runSourcemapsWizardWithTelemetry(options, preSelectedTool),\n );\n}\n\nasync function runSourcemapsWizardWithTelemetry(\n options: WizardOptions,\n preSelectedTool?: SupportedTools,\n): Promise<void> {\n if (!preSelectedTool) {\n printWelcome({\n wizardName: 'Sentry Source Maps Upload Configuration Wizard',\n message: `This wizard will help you upload source maps to Sentry as part of your build.\nThank you for using Sentry :)${\n options.telemetryEnabled\n ? `\n\n(This setup wizard sends telemetry data and crash reports to Sentry.\nYou can turn this off by running the wizard with the '--disable-telemetry' flag.)`\n : ''\n }`,\n promoCode: options.promoCode,\n });\n }\n\n const moreSuitableWizard = await traceStep(\n 'check-framework-wizard',\n checkIfMoreSuitableWizardExistsAndAskForRedirect,\n );\n if (moreSuitableWizard) {\n await traceStep('run-framework-wizard', () => moreSuitableWizard(options));\n return;\n }\n\n if (!preSelectedTool) {\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n }\n\n await traceStep('check-sdk-version', ensureMinimumSdkVersionIsInstalled);\n\n const { selfHosted, selectedProject, sentryUrl, authToken } =\n await getOrAskForProjectData(options);\n\n const wizardOptionsWithPreSelectedProject = {\n ...options,\n preSelectedProject: {\n project: selectedProject,\n authToken,\n selfHosted,\n },\n };\n\n const selectedTool =\n preSelectedTool || (await traceStep('select-tool', askForUsedBundlerTool));\n\n Sentry.setTag('selected-tool', selectedTool);\n\n if (selectedTool === 'no-tool') {\n clack.log.info(\n \"No Problem! But in this case, there's nothing to configure :)\",\n );\n await abort('Exiting, have a great day!', 0);\n return;\n }\n\n await traceStep('tool-setup', () =>\n startToolSetupFlow(\n selectedTool,\n {\n orgSlug: selectedProject.organization.slug,\n projectSlug: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n authToken,\n },\n wizardOptionsWithPreSelectedProject,\n preSelectedTool,\n ),\n );\n\n await traceStep('ci-setup', () =>\n setupCI(selectedTool, authToken, options.comingFrom),\n );\n\n if (!preSelectedTool) {\n // running prettier is only necessary if the source maps wizard is the main flow\n // skip it, if it's called from another wizard (e.g. angular)\n await runPrettierIfInstalled({ cwd: process.cwd() });\n }\n\n if (!preSelectedTool) {\n await traceStep('outro', () =>\n printOutro(\n sentryUrl,\n selectedProject.organization.slug,\n selectedProject.id,\n ),\n );\n }\n}\n\nasync function askForUsedBundlerTool(): Promise<SupportedTools> {\n const selectedTool = await abortIfCancelled(\n clack.select({\n message: 'Which framework, bundler or build tool are you using?',\n options: [\n {\n label: 'Angular',\n value: 'angular',\n hint: 'Select this option if you are using Angular.',\n },\n {\n label: 'Create React App',\n value: 'create-react-app',\n hint: 'Select this option if you set up your app with Create React App.',\n },\n {\n label: 'Cloudflare Wrangler',\n value: 'wrangler',\n hint: \"You're using `wrangler deploy` to build and deploy your Cloudflare Worker.\",\n },\n {\n label: 'Webpack',\n value: 'webpack',\n hint: 'Select this if you are using Webpack and you have access to your Webpack config.',\n },\n {\n label: 'Vite',\n value: 'vite',\n hint: 'Select this if you are using Vite and you have access to your Vite config.',\n },\n {\n label: 'esbuild',\n value: 'esbuild',\n hint: 'Select this if you are using esbuild and you have access to your esbuild config.',\n },\n {\n label: 'Rollup',\n value: 'rollup',\n hint: 'Select this if you are using Rollup and you have access to your Rollup config.',\n },\n {\n label: 'tsc',\n value: 'tsc',\n hint: 'Configure source maps when using tsc as build tool',\n },\n {\n label: 'I use another tool',\n value: 'sentry-cli',\n hint: 'This will configure source maps upload for you using sentry-cli',\n },\n {\n label: \"I don't minify, transpile or bundle my code\",\n value: 'no-tool',\n hint: 'This will exit the wizard',\n },\n ],\n initialValue: await detectUsedTool(),\n }),\n );\n\n return selectedTool;\n}\n\nasync function startToolSetupFlow(\n selectedTool: SupportedTools,\n options: SourceMapUploadToolConfigurationOptions,\n wizardOptions: WizardOptions,\n preSelectedTool?: SupportedTools,\n): Promise<void> {\n switch (selectedTool) {\n case 'webpack':\n await configureWebPackPlugin(options);\n break;\n case 'vite':\n await configureVitePlugin(options);\n break;\n case 'esbuild':\n await configureEsbuildPlugin(options);\n break;\n case 'rollup':\n await configureRollupPlugin(options);\n break;\n case 'tsc':\n await configureSentryCLI(options, configureTscSourcemapGenerationFlow);\n break;\n case 'create-react-app':\n await configureSentryCLI(options, configureCRASourcemapGenerationFlow);\n break;\n case 'wrangler':\n await configureWrangler(options);\n break;\n case 'angular':\n await configureSentryCLI(\n { ...options, defaultArtifactPath: `.${sep}dist` },\n configureAngularSourcemapGenerationFlow,\n preSelectedTool === 'angular',\n );\n break;\n default:\n await configureSentryCLI(options);\n break;\n }\n}\nexport async function setupCI(\n selectedTool: SupportedTools,\n authToken: string,\n comingFrom: WizardOptions['comingFrom'],\n) {\n if (comingFrom === 'vercel') {\n clack.log.info(\n 'Sentry Vercel integration is already configured. Skipping CI setup.',\n );\n Sentry.setTag('using-ci', true);\n } else {\n await traceStep('configure-ci', () => configureCI(selectedTool, authToken));\n }\n}\n\nexport async function configureCI(\n selectedTool: SupportedTools,\n authToken: string,\n): Promise<void> {\n const isUsingCI = await abortIfCancelled(\n clack.select({\n message: `Are you using a CI/CD tool to build and deploy your application?`,\n options: [\n {\n label: 'Yes',\n hint: 'I use a tool like GitHub Actions, GitLab, CircleCI, TravisCI, Jenkins, Vercel, ...',\n value: true,\n },\n {\n label: 'No',\n hint: 'I build and deploy my application manually',\n value: false,\n },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('using-ci', isUsingCI);\n\n const isCliBasedFlowTool = [\n 'sentry-cli',\n 'tsc',\n 'angular',\n 'create-react-app',\n ].includes(selectedTool);\n\n const authTokenFile = isCliBasedFlowTool\n ? SENTRY_CLI_RC_FILE\n : SENTRY_DOT_ENV_FILE;\n\n if (!isUsingCI) {\n clack.log.info(\n `No Problem! Just make sure that the Sentry auth token from ${chalk.cyan(\n authTokenFile,\n )} is available whenever you build and deploy your app.`,\n );\n return;\n }\n\n if (isCliBasedFlowTool) {\n await traceStep('ci-npm-script-setup', setupNpmScriptInCI);\n }\n\n await traceStep('ci-auth-token-setup', () => setupAuthTokenInCI(authToken));\n}\n\nasync function setupAuthTokenInCI(authToken: string) {\n clack.log.step(\n 'Add the Sentry authentication token as an environment variable to your CI setup:',\n );\n\n // Intentially logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(\n chalk.greenBright(`\nSENTRY_AUTH_TOKEN=${authToken}\n`),\n );\n\n clack.log.warn(\n chalk.yellow('DO NOT commit this auth token to your repository!'),\n );\n\n const addedEnvVarToCI = await abortIfCancelled(\n clack.select({\n message: 'Did you configure CI as shown above?',\n options: [\n { label: 'Yes, continue!', value: true },\n {\n label: \"I'll do it later...\",\n value: false,\n hint: chalk.yellow(\n 'You need to set the auth token to upload source maps in CI',\n ),\n },\n ],\n initialValue: true,\n }),\n );\n\n Sentry.setTag('added-env-var-to-ci', addedEnvVarToCI);\n\n if (!addedEnvVarToCI) {\n clack.log.info(\"Don't forget! :)\");\n }\n}\n\nasync function printOutro(\n url: string,\n orgSlug: string,\n projectId: string,\n): Promise<void> {\n const packageManager = await getPackageManager(NPM);\n\n const issueStreamUrl = getIssueStreamUrl({ url, orgSlug, projectId });\n\n const arrow = isUnicodeSupported() ? '→' : '->';\n\n clack.outro(`${chalk.green(\"That's it - everything is set up!\")}\n\n ${chalk.cyan(`Test and validate your setup locally with the following Steps:\n\n 1. Build your application in ${chalk.bold('production mode')}.\n ${chalk.gray(\n `${arrow} For example, run ${chalk.bold(packageManager.buildCommand)}.`,\n )}\n ${chalk.gray(\n `${arrow} You should see source map upload logs in your console.`,\n )}\n 2. Run your application and throw a test error.\n ${chalk.gray(`${arrow} The error should appear in Sentry:`)}\n ${chalk.gray(`${arrow} ${issueStreamUrl}`)}\n 3. Open the error in Sentry and verify that it's source-mapped.\n ${chalk.gray(\n `${arrow} The stack trace should show your original source code.`,\n )}\n `)}\n ${chalk.dim(\n `If you encounter any issues, please refer to the Troubleshooting Guide:\n https://docs.sentry.io/platforms/javascript/sourcemaps/troubleshooting_js\n\n If the guide doesn't help or you encounter a bug, please let us know:\n https://github.com/getsentry/sentry-javascript/issues`,\n )}\n`);\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SourceMapUploadToolConfigurationOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* only exported for testing
|
|
4
|
+
*/
|
|
5
|
+
export declare const DIST_DIR: string;
|
|
6
|
+
export declare function configureWrangler(options: SourceMapUploadToolConfigurationOptions): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* only exported for testing
|
|
9
|
+
*/
|
|
10
|
+
export declare function getSentryCliCommand(options: SourceMapUploadToolConfigurationOptions & {
|
|
11
|
+
outDir: string;
|
|
12
|
+
}): string;
|
|
13
|
+
/**
|
|
14
|
+
* Takes care of inserting the necessary arguments into the deploy command.
|
|
15
|
+
* Ensures that existing arguments and values are kept and that the
|
|
16
|
+
* wrangler deploy command is valid.
|
|
17
|
+
*
|
|
18
|
+
* only exported for testing
|
|
19
|
+
*/
|
|
20
|
+
export declare function safeInsertArgsToWranglerDeployCommand(deployCommand: string, outDir: string): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* only exported for testing
|
|
23
|
+
*/
|
|
24
|
+
export declare function findOutDir(deployCommand: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Exported for testing
|
|
27
|
+
*/
|
|
28
|
+
export declare function getWranglerDeployCommand(deployCommand: string): string | undefined;
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.getWranglerDeployCommand = exports.findOutDir = exports.safeInsertArgsToWranglerDeployCommand = exports.getSentryCliCommand = exports.configureWrangler = exports.DIST_DIR = void 0;
|
|
30
|
+
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
31
|
+
const clack = __importStar(require("@clack/prompts"));
|
|
32
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
33
|
+
const clack_1 = require("../../utils/clack");
|
|
34
|
+
const package_json_1 = require("../../utils/package-json");
|
|
35
|
+
const package_manager_1 = require("../../utils/package-manager");
|
|
36
|
+
const path_1 = __importDefault(require("path"));
|
|
37
|
+
const fs_1 = __importDefault(require("fs"));
|
|
38
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
39
|
+
const helpers_1 = require("yargs/helpers");
|
|
40
|
+
const SENTRY_NPM_SCRIPT_NAME = 'sentry:sourcemaps';
|
|
41
|
+
/**
|
|
42
|
+
* only exported for testing
|
|
43
|
+
*/
|
|
44
|
+
exports.DIST_DIR = path_1.default.join('.', 'dist');
|
|
45
|
+
async function configureWrangler(options) {
|
|
46
|
+
clack.note(chalk_1.default.whiteBright(`Configuring source maps upload with Cloudflare Wrangler requires the wizard to:
|
|
47
|
+
- Modify your deploy command to access source maps
|
|
48
|
+
- Set the SENTRY_RELEASE env var to identify source maps
|
|
49
|
+
|
|
50
|
+
Note: This setup may need additional configuration.
|
|
51
|
+
We recommend using Vite to build your worker instead, for an easier and more reliable setup.
|
|
52
|
+
|
|
53
|
+
Learn more about CloudFlare's Vite setup here:
|
|
54
|
+
${chalk_1.default.underline(chalk_1.default.cyan('https://developers.cloudflare.com/workers/vite-plugin/get-started/'))}
|
|
55
|
+
|
|
56
|
+
You can switch to Vite and re-run this wizard later.
|
|
57
|
+
Otherwise, let's proceed with the Wrangler setup.`), 'Before we get started');
|
|
58
|
+
const proceed = await (0, clack_1.abortIfCancelled)(clack.confirm({
|
|
59
|
+
message: 'Do you want to proceed with the Wrangler setup?',
|
|
60
|
+
}));
|
|
61
|
+
if (!proceed) {
|
|
62
|
+
await (0, clack_1.abort)('Got it! You can switch to Vite and re-run this wizard later.', 0);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await (0, clack_1.installPackage)({
|
|
66
|
+
packageName: '@sentry/cli',
|
|
67
|
+
alreadyInstalled: (0, package_json_1.hasPackageInstalled)('@sentry/cli', await (0, clack_1.getPackageDotJson)()),
|
|
68
|
+
devDependency: true,
|
|
69
|
+
});
|
|
70
|
+
if (!(await askContinueIfHasSentrySourcemapsScript())) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const deployCommand = await getDeployCommand();
|
|
74
|
+
if (!deployCommand) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const outDir = await getWranglerOutDir(deployCommand);
|
|
78
|
+
await createAndAddSentrySourcemapsScript({ ...options, outDir });
|
|
79
|
+
await writePostDeployCommand(deployCommand);
|
|
80
|
+
await modifyDeployCommand(deployCommand, outDir);
|
|
81
|
+
await (0, clack_1.addSentryCliConfig)({ authToken: options.authToken });
|
|
82
|
+
}
|
|
83
|
+
exports.configureWrangler = configureWrangler;
|
|
84
|
+
async function createAndAddSentrySourcemapsScript(options) {
|
|
85
|
+
const pkgJson = await (0, clack_1.getPackageDotJson)();
|
|
86
|
+
pkgJson.scripts = pkgJson.scripts ?? {};
|
|
87
|
+
pkgJson.scripts[SENTRY_NPM_SCRIPT_NAME] = getSentryCliCommand(options);
|
|
88
|
+
await fs_1.default.promises.writeFile(path_1.default.join(process.cwd(), 'package.json'), JSON.stringify(pkgJson, null, 2));
|
|
89
|
+
clack.log.success(`Added a ${chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME)} script to your ${chalk_1.default.cyan('package.json')}.`);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* only exported for testing
|
|
93
|
+
*/
|
|
94
|
+
function getSentryCliCommand(options) {
|
|
95
|
+
const sentryCliOptions = options.selfHosted ? ` --url ${options.url}` : '';
|
|
96
|
+
const orgAndProjectArgs = `--org=${options.orgSlug} --project=${options.projectSlug}`;
|
|
97
|
+
const stripPrefixPath = `${options.outDir}${path_1.default.sep}..`;
|
|
98
|
+
return [
|
|
99
|
+
'_SENTRY_RELEASE=$(sentry-cli releases propose-version)',
|
|
100
|
+
`sentry-cli${sentryCliOptions} releases new $_SENTRY_RELEASE ${orgAndProjectArgs}`,
|
|
101
|
+
`sentry-cli${sentryCliOptions} sourcemaps upload ${orgAndProjectArgs} --release=$_SENTRY_RELEASE --strip-prefix '${stripPrefixPath}' ${options.outDir}`,
|
|
102
|
+
].join(' && ');
|
|
103
|
+
}
|
|
104
|
+
exports.getSentryCliCommand = getSentryCliCommand;
|
|
105
|
+
async function askContinueIfHasSentrySourcemapsScript() {
|
|
106
|
+
const pkgJson = await (0, clack_1.getPackageDotJson)();
|
|
107
|
+
pkgJson.scripts = pkgJson.scripts ?? {};
|
|
108
|
+
if (pkgJson.scripts[SENTRY_NPM_SCRIPT_NAME]) {
|
|
109
|
+
clack.log.warn(`The ${chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME)} script already exists in your ${chalk_1.default.cyan('package.json')}.
|
|
110
|
+
This likely means that you already ran this wizard once.
|
|
111
|
+
If things don't work yet, try overwriting the script and continue with the wizard.`);
|
|
112
|
+
const overwrite = await (0, clack_1.abortIfCancelled)(clack.select({
|
|
113
|
+
message: 'Do you want to overwrite it?',
|
|
114
|
+
options: [
|
|
115
|
+
{ label: 'Yes', value: true, hint: 'Overwrite the existing script' },
|
|
116
|
+
{ label: 'No', value: false, hint: 'This will exit the wizard' },
|
|
117
|
+
],
|
|
118
|
+
}));
|
|
119
|
+
if (!overwrite) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
async function getDeployCommand() {
|
|
126
|
+
const pkgJson = await (0, clack_1.getPackageDotJson)();
|
|
127
|
+
const scripts = pkgJson.scripts ?? {};
|
|
128
|
+
let deployCommand = Object.keys(scripts).find((key) => /wrangler\s+deploy/.test(scripts[key] ?? ''));
|
|
129
|
+
const packageManager = await (0, clack_1.getPackageManager)(package_manager_1.NPM);
|
|
130
|
+
const isDeployCommand = !!deployCommand &&
|
|
131
|
+
(await (0, clack_1.abortIfCancelled)(clack.confirm({
|
|
132
|
+
message: `Is ${chalk_1.default.cyan(`${packageManager.runScriptCommand} ${deployCommand}`)} your build and deploy command?`,
|
|
133
|
+
})));
|
|
134
|
+
if (Object.keys(scripts).length && (!deployCommand || !isDeployCommand)) {
|
|
135
|
+
deployCommand = await (0, clack_1.abortIfCancelled)(clack.select({
|
|
136
|
+
message: `Which ${packageManager.name} command in your ${chalk_1.default.cyan('package.json')} builds your worker and deploys it?`,
|
|
137
|
+
options: Object.keys(scripts)
|
|
138
|
+
.map((script) => ({
|
|
139
|
+
label: script,
|
|
140
|
+
value: script,
|
|
141
|
+
}))
|
|
142
|
+
.concat({ label: 'None of the above', value: 'none' }),
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
if (!deployCommand || deployCommand === 'none') {
|
|
146
|
+
clack.log.warn(`We can only add the ${chalk_1.default.cyan(SENTRY_NPM_SCRIPT_NAME)} script to another \`script\` in your ${chalk_1.default.cyan('package.json')}.
|
|
147
|
+
Please add it manually to your prod build command.`);
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
return deployCommand;
|
|
151
|
+
}
|
|
152
|
+
async function writePostDeployCommand(deployCommand) {
|
|
153
|
+
const pkgJson = await (0, clack_1.getPackageDotJson)();
|
|
154
|
+
const packageManager = await (0, clack_1.getPackageManager)(package_manager_1.NPM);
|
|
155
|
+
pkgJson.scripts = pkgJson.scripts ?? {};
|
|
156
|
+
pkgJson.scripts[`post${deployCommand}`] = `${packageManager.runScriptCommand} ${SENTRY_NPM_SCRIPT_NAME}`;
|
|
157
|
+
await fs_1.default.promises.writeFile(path_1.default.join(process.cwd(), 'package.json'), JSON.stringify(pkgJson, null, 2));
|
|
158
|
+
clack.log.success(`Added a ${chalk_1.default.cyan(`post${deployCommand}`)} script to your ${chalk_1.default.cyan('package.json')}.`);
|
|
159
|
+
}
|
|
160
|
+
async function modifyDeployCommand(deployCommand, outDir) {
|
|
161
|
+
const pkgJson = await (0, clack_1.getPackageDotJson)();
|
|
162
|
+
pkgJson.scripts = pkgJson.scripts ?? {};
|
|
163
|
+
const oldDeployCommand = pkgJson.scripts[deployCommand];
|
|
164
|
+
if (!oldDeployCommand) {
|
|
165
|
+
clack.log.warn(`The ${chalk_1.default.cyan(deployCommand)} script doesn't seem to be part of your package.json scripts anymore. Cannot modify it. Please modify it manually:`);
|
|
166
|
+
await (0, clack_1.showCopyPasteInstructions)({
|
|
167
|
+
codeSnippet: `wrangler deploy --outdir ${outDir} --var SENTRY_RELEASE:$(sentry-cli releases propose-version) --upload-source-maps`,
|
|
168
|
+
filename: 'package.json',
|
|
169
|
+
});
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const newDeployCommand = safeInsertArgsToWranglerDeployCommand(oldDeployCommand, outDir);
|
|
173
|
+
if (!newDeployCommand) {
|
|
174
|
+
clack.log.warn(`The ${chalk_1.default.cyan(deployCommand)} script doesn't seem to be a valid ${chalk_1.default.cyan('wrangler deploy')} command. Cannot modify it. Please modify it manually:`);
|
|
175
|
+
await (0, clack_1.showCopyPasteInstructions)({
|
|
176
|
+
codeSnippet: oldDeployCommand,
|
|
177
|
+
filename: 'package.json',
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
pkgJson.scripts[deployCommand] = newDeployCommand;
|
|
182
|
+
await fs_1.default.promises.writeFile(path_1.default.join(process.cwd(), 'package.json'), JSON.stringify(pkgJson, null, 2));
|
|
183
|
+
clack.log.success(`Modified your ${chalk_1.default.cyan(deployCommand)} script to enable uploading source maps.`);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Takes care of inserting the necessary arguments into the deploy command.
|
|
187
|
+
* Ensures that existing arguments and values are kept and that the
|
|
188
|
+
* wrangler deploy command is valid.
|
|
189
|
+
*
|
|
190
|
+
* only exported for testing
|
|
191
|
+
*/
|
|
192
|
+
function safeInsertArgsToWranglerDeployCommand(deployCommand, outDir) {
|
|
193
|
+
// split deployCommand into individual bash commands (potentially separated by &&, ||, >> etc.)
|
|
194
|
+
const originalWranglerDeployCommand = getWranglerDeployCommand(deployCommand);
|
|
195
|
+
if (!originalWranglerDeployCommand) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
const existingArgs = originalWranglerDeployCommand
|
|
199
|
+
.split(' ')
|
|
200
|
+
.map((arg) => arg.trim())
|
|
201
|
+
.filter(Boolean);
|
|
202
|
+
const parsedArgs = (0, yargs_1.default)((0, helpers_1.hideBin)(existingArgs)).parse();
|
|
203
|
+
const newArgs = [];
|
|
204
|
+
if (!parsedArgs.outdir) {
|
|
205
|
+
newArgs.push('--outdir', outDir);
|
|
206
|
+
}
|
|
207
|
+
// Adding --upload-source-maps saves us from having to
|
|
208
|
+
// modify the `wrangler.toml` or `wrangler.jsonc` files.
|
|
209
|
+
// Not ideal because this forces source maps to be uploaded
|
|
210
|
+
// but we'll live with it for now.
|
|
211
|
+
if (!parsedArgs['upload-source-maps']) {
|
|
212
|
+
newArgs.push('--upload-source-maps');
|
|
213
|
+
}
|
|
214
|
+
// This is how we inject the SENTRY_RELEASE variable,
|
|
215
|
+
// which is picked up by the CloudFlare SDK.
|
|
216
|
+
// multiple --var arguments are allowed, so no need to check for existing --var arguments.
|
|
217
|
+
newArgs.push('--var', 'SENTRY_RELEASE:$(sentry-cli releases propose-version)');
|
|
218
|
+
return deployCommand
|
|
219
|
+
.replace(originalWranglerDeployCommand, `${originalWranglerDeployCommand} ${newArgs.join(' ')} `)
|
|
220
|
+
.trim();
|
|
221
|
+
}
|
|
222
|
+
exports.safeInsertArgsToWranglerDeployCommand = safeInsertArgsToWranglerDeployCommand;
|
|
223
|
+
/**
|
|
224
|
+
* Look up an already specified --outdir argument and return it if found.
|
|
225
|
+
* Otherwise, we defined `dist` as the default outdir.
|
|
226
|
+
*/
|
|
227
|
+
async function getWranglerOutDir(deployScript) {
|
|
228
|
+
const pkgJson = await (0, clack_1.getPackageDotJson)();
|
|
229
|
+
const scripts = pkgJson.scripts ?? {};
|
|
230
|
+
const deployCommand = scripts[deployScript];
|
|
231
|
+
if (!deployCommand) {
|
|
232
|
+
return exports.DIST_DIR;
|
|
233
|
+
}
|
|
234
|
+
return findOutDir(deployCommand);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* only exported for testing
|
|
238
|
+
*/
|
|
239
|
+
function findOutDir(deployCommand) {
|
|
240
|
+
const args = getWranglerDeployCommand(deployCommand)
|
|
241
|
+
?.split(' ')
|
|
242
|
+
.map((arg) => arg.trim());
|
|
243
|
+
if (!args) {
|
|
244
|
+
return exports.DIST_DIR;
|
|
245
|
+
}
|
|
246
|
+
const outDirArgIndex = args.findIndex((arg) => arg.startsWith('--outdir'));
|
|
247
|
+
if (outDirArgIndex === -1) {
|
|
248
|
+
return exports.DIST_DIR;
|
|
249
|
+
}
|
|
250
|
+
const outDirArg = args[outDirArgIndex];
|
|
251
|
+
if (outDirArg.startsWith('--outdir=')) {
|
|
252
|
+
return outDirArg.split('=')[1].trim().replace(/['"]/g, '');
|
|
253
|
+
}
|
|
254
|
+
const maybeOutDir = args[outDirArgIndex + 1];
|
|
255
|
+
if (maybeOutDir && !maybeOutDir.startsWith('--')) {
|
|
256
|
+
return maybeOutDir.replace(/['"]/g, '');
|
|
257
|
+
}
|
|
258
|
+
return exports.DIST_DIR;
|
|
259
|
+
}
|
|
260
|
+
exports.findOutDir = findOutDir;
|
|
261
|
+
/**
|
|
262
|
+
* Exported for testing
|
|
263
|
+
*/
|
|
264
|
+
function getWranglerDeployCommand(deployCommand) {
|
|
265
|
+
const individualCommands = deployCommand.split(/&&|\|\||>>|>|<|\||;/);
|
|
266
|
+
const originalWranglerDeployCommand = individualCommands.find((cmd) => {
|
|
267
|
+
const argv = cmd
|
|
268
|
+
.split(' ')
|
|
269
|
+
.map((arg) => arg.trim())
|
|
270
|
+
.filter(Boolean);
|
|
271
|
+
return argv[0] === 'wrangler' && argv.includes('deploy');
|
|
272
|
+
});
|
|
273
|
+
return originalWranglerDeployCommand;
|
|
274
|
+
}
|
|
275
|
+
exports.getWranglerDeployCommand = getWranglerDeployCommand;
|
|
276
|
+
//# sourceMappingURL=wrangler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../../../../src/sourcemaps/tools/wrangler.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport chalk from 'chalk';\nimport {\n abort,\n abortIfCancelled,\n addSentryCliConfig,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n showCopyPasteInstructions,\n} from '../../utils/clack';\nimport { hasPackageInstalled } from '../../utils/package-json';\nimport { NPM } from '../../utils/package-manager';\nimport type { SourceMapUploadToolConfigurationOptions } from './types';\nimport path from 'path';\nimport fs from 'fs';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nconst SENTRY_NPM_SCRIPT_NAME = 'sentry:sourcemaps';\n\n/**\n * only exported for testing\n */\nexport const DIST_DIR = path.join('.', 'dist');\n\nexport async function configureWrangler(\n options: SourceMapUploadToolConfigurationOptions,\n) {\n clack.note(\n chalk.whiteBright(\n `Configuring source maps upload with Cloudflare Wrangler requires the wizard to:\n- Modify your deploy command to access source maps\n- Set the SENTRY_RELEASE env var to identify source maps\n\nNote: This setup may need additional configuration. \nWe recommend using Vite to build your worker instead, for an easier and more reliable setup.\n\nLearn more about CloudFlare's Vite setup here:\n${chalk.underline(\n chalk.cyan(\n 'https://developers.cloudflare.com/workers/vite-plugin/get-started/',\n ),\n)}\n\nYou can switch to Vite and re-run this wizard later. \nOtherwise, let's proceed with the Wrangler setup.`,\n ),\n 'Before we get started',\n );\n\n const proceed = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to proceed with the Wrangler setup?',\n }),\n );\n\n if (!proceed) {\n await abort(\n 'Got it! You can switch to Vite and re-run this wizard later.',\n 0,\n );\n return;\n }\n\n await installPackage({\n packageName: '@sentry/cli',\n alreadyInstalled: hasPackageInstalled(\n '@sentry/cli',\n await getPackageDotJson(),\n ),\n devDependency: true,\n });\n\n if (!(await askContinueIfHasSentrySourcemapsScript())) {\n return;\n }\n\n const deployCommand = await getDeployCommand();\n if (!deployCommand) {\n return;\n }\n\n const outDir = await getWranglerOutDir(deployCommand);\n\n await createAndAddSentrySourcemapsScript({ ...options, outDir });\n\n await writePostDeployCommand(deployCommand);\n\n await modifyDeployCommand(deployCommand, outDir);\n\n await addSentryCliConfig({ authToken: options.authToken });\n}\n\nasync function createAndAddSentrySourcemapsScript(\n options: SourceMapUploadToolConfigurationOptions & { outDir: string },\n) {\n const pkgJson = await getPackageDotJson();\n pkgJson.scripts = pkgJson.scripts ?? {};\n pkgJson.scripts[SENTRY_NPM_SCRIPT_NAME] = getSentryCliCommand(options);\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(pkgJson, null, 2),\n );\n\n clack.log.success(\n `Added a ${chalk.cyan(SENTRY_NPM_SCRIPT_NAME)} script to your ${chalk.cyan(\n 'package.json',\n )}.`,\n );\n}\n\n/**\n * only exported for testing\n */\nexport function getSentryCliCommand(\n options: SourceMapUploadToolConfigurationOptions & { outDir: string },\n) {\n const sentryCliOptions = options.selfHosted ? ` --url ${options.url}` : '';\n const orgAndProjectArgs = `--org=${options.orgSlug} --project=${options.projectSlug}`;\n\n const stripPrefixPath = `${options.outDir}${path.sep}..`;\n\n return [\n '_SENTRY_RELEASE=$(sentry-cli releases propose-version)',\n `sentry-cli${sentryCliOptions} releases new $_SENTRY_RELEASE ${orgAndProjectArgs}`,\n `sentry-cli${sentryCliOptions} sourcemaps upload ${orgAndProjectArgs} --release=$_SENTRY_RELEASE --strip-prefix '${stripPrefixPath}' ${options.outDir}`,\n ].join(' && ');\n}\n\nasync function askContinueIfHasSentrySourcemapsScript(): Promise<boolean> {\n const pkgJson = await getPackageDotJson();\n\n pkgJson.scripts = pkgJson.scripts ?? {};\n\n if (pkgJson.scripts[SENTRY_NPM_SCRIPT_NAME]) {\n clack.log.warn(\n `The ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} script already exists in your ${chalk.cyan('package.json')}.\nThis likely means that you already ran this wizard once.\nIf things don't work yet, try overwriting the script and continue with the wizard.`,\n );\n\n const overwrite = await abortIfCancelled(\n clack.select({\n message: 'Do you want to overwrite it?',\n options: [\n { label: 'Yes', value: true, hint: 'Overwrite the existing script' },\n { label: 'No', value: false, hint: 'This will exit the wizard' },\n ],\n }),\n );\n\n if (!overwrite) {\n return false;\n }\n }\n\n return true;\n}\n\nasync function getDeployCommand(): Promise<string | undefined> {\n const pkgJson = await getPackageDotJson();\n const scripts = pkgJson.scripts ?? {};\n\n let deployCommand = Object.keys(scripts).find((key) =>\n /wrangler\\s+deploy/.test(scripts[key] ?? ''),\n );\n\n const packageManager = await getPackageManager(NPM);\n const isDeployCommand =\n !!deployCommand &&\n (await abortIfCancelled(\n clack.confirm({\n message: `Is ${chalk.cyan(\n `${packageManager.runScriptCommand} ${deployCommand}`,\n )} your build and deploy command?`,\n }),\n ));\n\n if (Object.keys(scripts).length && (!deployCommand || !isDeployCommand)) {\n deployCommand = await abortIfCancelled(\n clack.select({\n message: `Which ${packageManager.name} command in your ${chalk.cyan(\n 'package.json',\n )} builds your worker and deploys it?`,\n options: Object.keys(scripts)\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 (!deployCommand || deployCommand === '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 undefined;\n }\n\n return deployCommand;\n}\n\nasync function writePostDeployCommand(deployCommand: string): Promise<void> {\n const pkgJson = await getPackageDotJson();\n const packageManager = await getPackageManager(NPM);\n pkgJson.scripts = pkgJson.scripts ?? {};\n pkgJson.scripts[\n `post${deployCommand}`\n ] = `${packageManager.runScriptCommand} ${SENTRY_NPM_SCRIPT_NAME}`;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(pkgJson, null, 2),\n );\n\n clack.log.success(\n `Added a ${chalk.cyan(`post${deployCommand}`)} script to your ${chalk.cyan(\n 'package.json',\n )}.`,\n );\n}\n\nasync function modifyDeployCommand(\n deployCommand: string,\n outDir: string,\n): Promise<void> {\n const pkgJson = await getPackageDotJson();\n pkgJson.scripts = pkgJson.scripts ?? {};\n const oldDeployCommand = pkgJson.scripts[deployCommand];\n\n if (!oldDeployCommand) {\n clack.log.warn(\n `The ${chalk.cyan(\n deployCommand,\n )} script doesn't seem to be part of your package.json scripts anymore. Cannot modify it. Please modify it manually:`,\n );\n\n await showCopyPasteInstructions({\n codeSnippet: `wrangler deploy --outdir ${outDir} --var SENTRY_RELEASE:$(sentry-cli releases propose-version) --upload-source-maps`,\n filename: 'package.json',\n });\n\n return;\n }\n\n const newDeployCommand = safeInsertArgsToWranglerDeployCommand(\n oldDeployCommand,\n outDir,\n );\n\n if (!newDeployCommand) {\n clack.log.warn(\n `The ${chalk.cyan(\n deployCommand,\n )} script doesn't seem to be a valid ${chalk.cyan(\n 'wrangler deploy',\n )} command. Cannot modify it. Please modify it manually:`,\n );\n\n await showCopyPasteInstructions({\n codeSnippet: oldDeployCommand,\n filename: 'package.json',\n });\n\n return;\n }\n\n pkgJson.scripts[deployCommand] = newDeployCommand;\n\n await fs.promises.writeFile(\n path.join(process.cwd(), 'package.json'),\n JSON.stringify(pkgJson, null, 2),\n );\n\n clack.log.success(\n `Modified your ${chalk.cyan(\n deployCommand,\n )} script to enable uploading source maps.`,\n );\n}\n\n/**\n * Takes care of inserting the necessary arguments into the deploy command.\n * Ensures that existing arguments and values are kept and that the\n * wrangler deploy command is valid.\n *\n * only exported for testing\n */\nexport function safeInsertArgsToWranglerDeployCommand(\n deployCommand: string,\n outDir: string,\n): string | undefined {\n // split deployCommand into individual bash commands (potentially separated by &&, ||, >> etc.)\n const originalWranglerDeployCommand = getWranglerDeployCommand(deployCommand);\n\n if (!originalWranglerDeployCommand) {\n return undefined;\n }\n\n const existingArgs = originalWranglerDeployCommand\n .split(' ')\n .map((arg) => arg.trim())\n .filter(Boolean);\n\n const parsedArgs = yargs(hideBin(existingArgs)).parse();\n\n const newArgs = [];\n\n if (!parsedArgs.outdir) {\n newArgs.push('--outdir', outDir);\n }\n\n // Adding --upload-source-maps saves us from having to\n // modify the `wrangler.toml` or `wrangler.jsonc` files.\n // Not ideal because this forces source maps to be uploaded\n // but we'll live with it for now.\n if (!parsedArgs['upload-source-maps']) {\n newArgs.push('--upload-source-maps');\n }\n\n // This is how we inject the SENTRY_RELEASE variable,\n // which is picked up by the CloudFlare SDK.\n // multiple --var arguments are allowed, so no need to check for existing --var arguments.\n newArgs.push(\n '--var',\n 'SENTRY_RELEASE:$(sentry-cli releases propose-version)',\n );\n\n return deployCommand\n .replace(\n originalWranglerDeployCommand,\n `${originalWranglerDeployCommand} ${newArgs.join(' ')} `,\n )\n .trim();\n}\n\n/**\n * Look up an already specified --outdir argument and return it if found.\n * Otherwise, we defined `dist` as the default outdir.\n */\nasync function getWranglerOutDir(deployScript: string): Promise<string> {\n const pkgJson = await getPackageDotJson();\n const scripts = pkgJson.scripts ?? {};\n const deployCommand = scripts[deployScript];\n\n if (!deployCommand) {\n return DIST_DIR;\n }\n\n return findOutDir(deployCommand);\n}\n\n/**\n * only exported for testing\n */\nexport function findOutDir(deployCommand: string): string {\n const args = getWranglerDeployCommand(deployCommand)\n ?.split(' ')\n .map((arg) => arg.trim());\n\n if (!args) {\n return DIST_DIR;\n }\n\n const outDirArgIndex = args.findIndex((arg) => arg.startsWith('--outdir'));\n if (outDirArgIndex === -1) {\n return DIST_DIR;\n }\n\n const outDirArg = args[outDirArgIndex];\n\n if (outDirArg.startsWith('--outdir=')) {\n return outDirArg.split('=')[1].trim().replace(/['\"]/g, '');\n }\n\n const maybeOutDir = args[outDirArgIndex + 1];\n\n if (maybeOutDir && !maybeOutDir.startsWith('--')) {\n return maybeOutDir.replace(/['\"]/g, '');\n }\n\n return DIST_DIR;\n}\n\n/**\n * Exported for testing\n */\nexport function getWranglerDeployCommand(deployCommand: string) {\n const individualCommands = deployCommand.split(/&&|\\|\\||>>|>|<|\\||;/);\n\n const originalWranglerDeployCommand = individualCommands.find((cmd) => {\n const argv = cmd\n .split(' ')\n .map((arg) => arg.trim())\n .filter(Boolean);\n\n return argv[0] === 'wrangler' && argv.includes('deploy');\n });\n return originalWranglerDeployCommand;\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type SupportedTools = 'webpack' | 'vite' | 'rollup' | 'esbuild' | 'tsc' | 'sentry-cli' | 'create-react-app' | 'angular' | 'nextjs' | 'remix' | 'no-tool';
|
|
1
|
+
export type SupportedTools = 'webpack' | 'vite' | 'rollup' | 'esbuild' | 'tsc' | 'sentry-cli' | 'create-react-app' | 'angular' | 'nextjs' | 'remix' | 'wrangler' | 'no-tool';
|
|
2
2
|
export declare const TOOL_PACKAGE_MAP: Record<string, SupportedTools>;
|
|
3
3
|
export declare function detectUsedTool(): Promise<SupportedTools>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-tool.js","sourceRoot":"","sources":["../../../../src/sourcemaps/utils/detect-tool.ts"],"names":[],"mappings":";;;AAAA,6CAAsD;AACtD,2DAAwE;
|
|
1
|
+
{"version":3,"file":"detect-tool.js","sourceRoot":"","sources":["../../../../src/sourcemaps/utils/detect-tool.ts"],"names":[],"mappings":";;;AAAA,6CAAsD;AACtD,2DAAwE;AAgBxE,oDAAoD;AACpD,kFAAkF;AAClF,sEAAsE;AACtE,YAAY;AACC,QAAA,gBAAgB,GAAmC;IAC9D,eAAe,EAAE,SAAS;IAC1B,kBAAkB,EAAE,kBAAkB;IACtC,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,KAAK;CAClB,CAAC;AAEK,KAAK,UAAU,cAAc;IAClC,MAAM,WAAW,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;IAE9C,MAAM,gBAAgB,GAAG,IAAA,2CAA4B,EACnD,MAAM,CAAC,IAAI,CAAC,wBAAgB,CAAC,EAC7B,WAAW,CACZ,CAAC;IAEF,IAAI,gBAAgB,EAAE;QACpB,OAAO,wBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;KAChD;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAbD,wCAaC","sourcesContent":["import { getPackageDotJson } from '../../utils/clack';\nimport { findInstalledPackageFromList } from '../../utils/package-json';\n\nexport type SupportedTools =\n | 'webpack'\n | 'vite'\n | 'rollup'\n | 'esbuild'\n | 'tsc'\n | 'sentry-cli'\n | 'create-react-app'\n | 'angular'\n | 'nextjs'\n | 'remix'\n | 'wrangler'\n | 'no-tool';\n\n// A map of package names pointing to the tool slug.\n// The order is important, because we want to detect the most specific tool first.\n// For instance, webpack needs to come before tsc because typescript c\n// Similarly\nexport const TOOL_PACKAGE_MAP: Record<string, SupportedTools> = {\n '@angular/core': 'angular',\n 'create-react-app': 'create-react-app',\n wrangler: 'wrangler',\n webpack: 'webpack',\n vite: 'vite',\n esbuild: 'esbuild',\n rollup: 'rollup',\n typescript: 'tsc',\n};\n\nexport async function detectUsedTool(): Promise<SupportedTools> {\n const packageJson = await getPackageDotJson();\n\n const foundToolPackage = findInstalledPackageFromList(\n Object.keys(TOOL_PACKAGE_MAP),\n packageJson,\n );\n\n if (foundToolPackage) {\n return TOOL_PACKAGE_MAP[foundToolPackage.name];\n }\n\n return 'sentry-cli';\n}\n"]}
|
|
@@ -118,6 +118,7 @@ Feel free to delete this file and the entire sentry route.
|
|
|
118
118
|
<button
|
|
119
119
|
type="button"
|
|
120
120
|
onclick={getSentryData}
|
|
121
|
+
disabled={!isConnected}
|
|
121
122
|
>
|
|
122
123
|
<span>
|
|
123
124
|
Throw Sample Error
|
|
@@ -130,16 +131,12 @@ Feel free to delete this file and the entire sentry route.
|
|
|
130
131
|
</p>
|
|
131
132
|
{:else if !isConnected}
|
|
132
133
|
<div class="connectivity-error">
|
|
133
|
-
<p>
|
|
134
|
+
<p>It looks like network requests to Sentry are being blocked, which will prevent errors from being captured. Try disabling your ad-blocker to complete the test.</p>
|
|
134
135
|
</div>
|
|
135
136
|
{:else}
|
|
136
137
|
<div class="success_placeholder"></div>
|
|
137
138
|
{/if}
|
|
138
|
-
|
|
139
|
-
<div class="flex-spacer"></div>
|
|
140
|
-
<p class="description">
|
|
141
|
-
Adblockers will prevent errors from being sent to Sentry.
|
|
142
|
-
</p>
|
|
139
|
+
<div class="flex-spacer"></div>
|
|
143
140
|
</main>
|
|
144
141
|
</div>
|
|
145
142
|
|
|
@@ -218,6 +215,16 @@ Feel free to delete this file and the entire sentry route.
|
|
|
218
215
|
&:active > span {
|
|
219
216
|
transform: translateY(0);
|
|
220
217
|
}
|
|
218
|
+
|
|
219
|
+
&:disabled {
|
|
220
|
+
cursor: not-allowed;
|
|
221
|
+
opacity: 0.6;
|
|
222
|
+
|
|
223
|
+
& > span {
|
|
224
|
+
transform: translateY(0);
|
|
225
|
+
border: none;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
221
228
|
}
|
|
222
229
|
|
|
223
230
|
.description {
|