@sentry/wizard 6.9.0 → 6.10.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 +36 -1
- package/dist/e2e-tests/tests/nextjs-14.test.js +6 -6
- package/dist/e2e-tests/tests/nextjs-14.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-15.test.js +6 -6
- package/dist/e2e-tests/tests/nextjs-15.test.js.map +1 -1
- package/dist/e2e-tests/tests/nextjs-16.test.d.ts +1 -0
- package/dist/e2e-tests/tests/nextjs-16.test.js +120 -0
- package/dist/e2e-tests/tests/nextjs-16.test.js.map +1 -0
- package/dist/e2e-tests/utils/index.d.ts +6 -0
- package/dist/e2e-tests/utils/index.js +16 -1
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +46 -8
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.d.ts +6 -3
- package/dist/src/nextjs/templates.js +144 -93
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.js +4 -1
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/sdk-example.js +5 -2
- package/dist/src/react-router/sdk-example.js.map +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js +1 -1
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/tools/wrangler.js +1 -1
- package/dist/src/sourcemaps/tools/wrangler.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +2 -2
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/telemetry.d.ts +1 -1
- package/dist/src/telemetry.js +52 -31
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/utils/clack/index.d.ts +17 -0
- package/dist/src/utils/clack/index.js +174 -12
- 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/apple/cocoapod.test.js +7 -3
- package/dist/test/apple/cocoapod.test.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +8 -2
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/nextjs/templates.test.js +156 -87
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.js +12 -7
- package/dist/test/nextjs/wizard-double-wrap-prevention.test.js.map +1 -1
- package/dist/test/utils/clack/index.test.js +37 -29
- package/dist/test/utils/clack/index.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -31,6 +31,7 @@ const fs = __importStar(require("fs"));
|
|
|
31
31
|
const path = __importStar(require("path"));
|
|
32
32
|
// @ts-expect-error - clack is ESM and TS complains about that. It works though
|
|
33
33
|
const prompts_1 = __importDefault(require("@clack/prompts"));
|
|
34
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
34
35
|
const routes_config_1 = require("./codemods/routes-config");
|
|
35
36
|
const sdk_setup_1 = require("./sdk-setup");
|
|
36
37
|
async function createExamplePage(options) {
|
|
@@ -39,6 +40,7 @@ async function createExamplePage(options) {
|
|
|
39
40
|
fs.mkdirSync(routesPath, { recursive: true });
|
|
40
41
|
}
|
|
41
42
|
const exampleRoutePath = (0, sdk_setup_1.getRouteFilePath)('sentry-example-page', options.isTS);
|
|
43
|
+
const exampleRouteRelative = path.join('app', 'routes', `sentry-example-page.${options.isTS ? 'tsx' : 'jsx'}`);
|
|
42
44
|
if (fs.existsSync(exampleRoutePath)) {
|
|
43
45
|
prompts_1.default.log.warn(`It seems like a sentry example page already exists (${path.basename(exampleRoutePath)}). Skipping creation of example route.`);
|
|
44
46
|
return;
|
|
@@ -46,9 +48,10 @@ async function createExamplePage(options) {
|
|
|
46
48
|
await fs.promises.writeFile(exampleRoutePath, getSentryExamplePageContents(options));
|
|
47
49
|
// Create the API route for backend error testing
|
|
48
50
|
const apiRoutePath = path.join(routesPath, `api.sentry-example-api.${options.isTS ? 'ts' : 'js'}`);
|
|
51
|
+
const apiRouteRelative = path.join('app', 'routes', `api.sentry-example-api.${options.isTS ? 'ts' : 'js'}`);
|
|
49
52
|
if (!fs.existsSync(apiRoutePath)) {
|
|
50
53
|
await fs.promises.writeFile(apiRoutePath, getSentryExampleApiContents(options));
|
|
51
|
-
prompts_1.default.log.info(`Created
|
|
54
|
+
prompts_1.default.log.info(`Created ${chalk_1.default.cyan(apiRouteRelative)}.`);
|
|
52
55
|
}
|
|
53
56
|
// Check if there's a routes.ts configuration file and add the route using codemod
|
|
54
57
|
const routesConfigPath = path.join(options.projectDir, 'app', 'routes.ts');
|
|
@@ -61,7 +64,7 @@ async function createExamplePage(options) {
|
|
|
61
64
|
prompts_1.default.log.info('Please manually add these routes to your routes.ts file: route("/sentry-example-page", "routes/sentry-example-page.tsx") and route("/api/sentry-example-api", "routes/api.sentry-example-api.ts")');
|
|
62
65
|
}
|
|
63
66
|
}
|
|
64
|
-
prompts_1.default.log.info(`Created
|
|
67
|
+
prompts_1.default.log.info(`Created ${chalk_1.default.cyan(exampleRouteRelative)}.`);
|
|
65
68
|
}
|
|
66
69
|
exports.createExamplePage = createExamplePage;
|
|
67
70
|
function getSentryExamplePageContents(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-example.js","sourceRoot":"","sources":["../../../src/react-router/sdk-example.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport { addRoutesToConfig } from './codemods/routes-config';\nimport { getRouteFilePath } from './sdk-setup';\n\nexport async function createExamplePage(options: {\n selfHosted: boolean;\n orgSlug: string;\n projectId: string;\n url: string;\n isTS: boolean;\n projectDir: string;\n}) {\n const routesPath = path.join(options.projectDir, 'app', 'routes');\n\n if (!fs.existsSync(routesPath)) {\n fs.mkdirSync(routesPath, { recursive: true });\n }\n\n const exampleRoutePath = getRouteFilePath(\n 'sentry-example-page',\n options.isTS,\n );\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 // Create the API route for backend error testing\n const apiRoutePath = path.join(\n routesPath,\n `api.sentry-example-api.${options.isTS ? 'ts' : 'js'}`,\n );\n\n if (!fs.existsSync(apiRoutePath)) {\n await fs.promises.writeFile(\n apiRoutePath,\n getSentryExampleApiContents(options),\n );\n clack.log.info(`Created sentry example API route at ${apiRoutePath}.`);\n }\n\n // Check if there's a routes.ts configuration file and add the route using codemod\n const routesConfigPath = path.join(options.projectDir, 'app', 'routes.ts');\n if (fs.existsSync(routesConfigPath)) {\n try {\n await addRoutesToConfig(routesConfigPath, options.isTS);\n } catch (e) {\n clack.log.warn(\n `Could not update routes.ts configuration: ${\n e instanceof Error ? e.message : String(e)\n }`,\n );\n clack.log.info(\n 'Please manually add these routes to your routes.ts file: route(\"/sentry-example-page\", \"routes/sentry-example-page.tsx\") and route(\"/api/sentry-example-api\", \"routes/api.sentry-example-api.ts\")',\n );\n }\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/react-router';\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/react-router/\">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\nexport function getSentryExampleApiContents(options: { isTS?: boolean }) {\n return `import * as Sentry from '@sentry/react-router';\n\nclass SentryExampleBackendError extends Error {\n constructor(message${options.isTS ? ': string | undefined' : ''}) {\n super(message);\n this.name = \"SentryExampleBackendError\";\n }\n}\n\nexport async function loader() {\n await Sentry.startSpan({\n name: 'Example Backend Span',\n op: 'test'\n }, async () => {\n // Simulate some backend work\n await new Promise(resolve => setTimeout(resolve, 100));\n });\n\n throw new SentryExampleBackendError(\"This error is raised on the backend API route.\");\n}\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-example.js","sourceRoot":"","sources":["../../../src/react-router/sdk-example.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\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 { addRoutesToConfig } from './codemods/routes-config';\nimport { getRouteFilePath } from './sdk-setup';\n\nexport async function createExamplePage(options: {\n selfHosted: boolean;\n orgSlug: string;\n projectId: string;\n url: string;\n isTS: boolean;\n projectDir: string;\n}) {\n const routesPath = path.join(options.projectDir, 'app', 'routes');\n\n if (!fs.existsSync(routesPath)) {\n fs.mkdirSync(routesPath, { recursive: true });\n }\n\n const exampleRoutePath = getRouteFilePath(\n 'sentry-example-page',\n options.isTS,\n );\n\n const exampleRouteRelative = path.join(\n 'app',\n 'routes',\n `sentry-example-page.${options.isTS ? 'tsx' : 'jsx'}`,\n );\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 // Create the API route for backend error testing\n const apiRoutePath = path.join(\n routesPath,\n `api.sentry-example-api.${options.isTS ? 'ts' : 'js'}`,\n );\n\n const apiRouteRelative = path.join(\n 'app',\n 'routes',\n `api.sentry-example-api.${options.isTS ? 'ts' : 'js'}`,\n );\n\n if (!fs.existsSync(apiRoutePath)) {\n await fs.promises.writeFile(\n apiRoutePath,\n getSentryExampleApiContents(options),\n );\n clack.log.info(`Created ${chalk.cyan(apiRouteRelative)}.`);\n }\n\n // Check if there's a routes.ts configuration file and add the route using codemod\n const routesConfigPath = path.join(options.projectDir, 'app', 'routes.ts');\n if (fs.existsSync(routesConfigPath)) {\n try {\n await addRoutesToConfig(routesConfigPath, options.isTS);\n } catch (e) {\n clack.log.warn(\n `Could not update routes.ts configuration: ${\n e instanceof Error ? e.message : String(e)\n }`,\n );\n clack.log.info(\n 'Please manually add these routes to your routes.ts file: route(\"/sentry-example-page\", \"routes/sentry-example-page.tsx\") and route(\"/api/sentry-example-api\", \"routes/api.sentry-example-api.ts\")',\n );\n }\n }\n\n clack.log.info(`Created ${chalk.cyan(exampleRouteRelative)}.`);\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/react-router';\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/react-router/\">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\nexport function getSentryExampleApiContents(options: { isTS?: boolean }) {\n return `import * as Sentry from '@sentry/react-router';\n\nclass SentryExampleBackendError extends Error {\n constructor(message${options.isTS ? ': string | undefined' : ''}) {\n super(message);\n this.name = \"SentryExampleBackendError\";\n }\n}\n\nexport async function loader() {\n await Sentry.startSpan({\n name: 'Example Backend Span',\n op: 'test'\n }, async () => {\n // Simulate some backend work\n await new Promise(resolve => setTimeout(resolve, 100));\n });\n\n throw new SentryExampleBackendError(\"This error is raised on the backend API route.\");\n}\n`;\n}\n"]}
|
|
@@ -42,7 +42,7 @@ let addedToBuildCommand = false;
|
|
|
42
42
|
async function configureSentryCLI(options, configureSourcemapGenerationFlow = defaultConfigureSourcemapGenerationFlow, skipValidation = false) {
|
|
43
43
|
const packageDotJson = await (0, clack_1.getPackageDotJson)();
|
|
44
44
|
await (0, clack_1.installPackage)({
|
|
45
|
-
packageName: '@sentry/cli',
|
|
45
|
+
packageName: '@sentry/cli@^2',
|
|
46
46
|
alreadyInstalled: (0, package_json_1.hasPackageInstalled)('@sentry/cli', packageDotJson),
|
|
47
47
|
});
|
|
48
48
|
let validPath = false;
|
|
@@ -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-expect-error - 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 getPackageManager,\n installPackage,\n artifactsExist,\n askToRunBuildOrEnterPathOrProceed,\n} from '../../utils/clack';\n\nimport { SourceMapUploadToolConfigurationOptions } from './types';\nimport { hasPackageInstalled } from '../../utils/package-json';\nimport { traceStep } from '../../telemetry';\nimport { NPM } from '../../utils/package-manager';\n\nconst SENTRY_NPM_SCRIPT_NAME = 'sentry:sourcemaps';\n\nlet addedToBuildCommand = false;\n\ntype configureSentryCLIOptions = SourceMapUploadToolConfigurationOptions & {\n defaultArtifactPath?: string;\n};\n\nexport async function configureSentryCLI(\n options: configureSentryCLIOptions,\n configureSourcemapGenerationFlow: () => Promise<void> = defaultConfigureSourcemapGenerationFlow,\n skipValidation = false,\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: string | undefined;\n do {\n const rawArtifactPath = await abortIfCancelled(\n clack.text({\n message: 'Where are your build artifacts located?',\n placeholder:\n relativeArtifactPath ??\n options.defaultArtifactPath ??\n `.${path.sep}out`,\n initialValue:\n relativeArtifactPath ??\n options.defaultArtifactPath ??\n `.${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 if (artifactsExist(relativeArtifactPath)) {\n validPath = true;\n continue;\n }\n\n const runBuildOrEnterPathOrProceed =\n await askToRunBuildOrEnterPathOrProceed({\n relativeArtifactPath,\n });\n\n validPath = runBuildOrEnterPathOrProceed?.validPath ?? false;\n relativeArtifactPath =\n runBuildOrEnterPathOrProceed?.relativeArtifactPath ??\n relativeArtifactPath;\n } while (!validPath);\n\n const relativePosixArtifactPath = relativeArtifactPath\n .split(path.sep)\n .join(path.posix.sep);\n\n if (!skipValidation) {\n await configureSourcemapGenerationFlow();\n }\n\n await createAndAddNpmScript(options, relativePosixArtifactPath);\n\n if (await askShouldAddToBuildCommand()) {\n await traceStep('sentry-cli-add-to-build-cmd', () =>\n addSentryCommandToBuildCommand(),\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({ authToken: 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 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 const packageDotJson = await getPackageDotJson();\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(): Promise<void> {\n const packageDotJson = await getPackageDotJson();\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 = await getPackageManager(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 const newCommand = `${oldCommand} && ${packageManager.runScriptCommand} ${SENTRY_NPM_SCRIPT_NAME}`;\n\n if (oldCommand.endsWith(SENTRY_NPM_SCRIPT_NAME)) {\n clack.log.info(\n `It seems like ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} is already part of your ${chalk.cyan(\n buildCommand,\n )} command. Will not add it again.\nCurrent command: ${chalk.dim(oldCommand)}\nWould have injected: ${chalk.dim(newCommand)}`,\n );\n\n return;\n }\n\n packageDotJson.scripts[buildCommand] = newCommand;\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-expect-error - 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 getPackageManager,\n installPackage,\n artifactsExist,\n askToRunBuildOrEnterPathOrProceed,\n} from '../../utils/clack';\n\nimport { SourceMapUploadToolConfigurationOptions } from './types';\nimport { hasPackageInstalled } from '../../utils/package-json';\nimport { traceStep } from '../../telemetry';\nimport { NPM } from '../../utils/package-manager';\n\nconst SENTRY_NPM_SCRIPT_NAME = 'sentry:sourcemaps';\n\nlet addedToBuildCommand = false;\n\ntype configureSentryCLIOptions = SourceMapUploadToolConfigurationOptions & {\n defaultArtifactPath?: string;\n};\n\nexport async function configureSentryCLI(\n options: configureSentryCLIOptions,\n configureSourcemapGenerationFlow: () => Promise<void> = defaultConfigureSourcemapGenerationFlow,\n skipValidation = false,\n): Promise<void> {\n const packageDotJson = await getPackageDotJson();\n\n await installPackage({\n packageName: '@sentry/cli@^2',\n alreadyInstalled: hasPackageInstalled('@sentry/cli', packageDotJson),\n });\n\n let validPath = false;\n let relativeArtifactPath: string | undefined;\n do {\n const rawArtifactPath = await abortIfCancelled(\n clack.text({\n message: 'Where are your build artifacts located?',\n placeholder:\n relativeArtifactPath ??\n options.defaultArtifactPath ??\n `.${path.sep}out`,\n initialValue:\n relativeArtifactPath ??\n options.defaultArtifactPath ??\n `.${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 if (artifactsExist(relativeArtifactPath)) {\n validPath = true;\n continue;\n }\n\n const runBuildOrEnterPathOrProceed =\n await askToRunBuildOrEnterPathOrProceed({\n relativeArtifactPath,\n });\n\n validPath = runBuildOrEnterPathOrProceed?.validPath ?? false;\n relativeArtifactPath =\n runBuildOrEnterPathOrProceed?.relativeArtifactPath ??\n relativeArtifactPath;\n } while (!validPath);\n\n const relativePosixArtifactPath = relativeArtifactPath\n .split(path.sep)\n .join(path.posix.sep);\n\n if (!skipValidation) {\n await configureSourcemapGenerationFlow();\n }\n\n await createAndAddNpmScript(options, relativePosixArtifactPath);\n\n if (await askShouldAddToBuildCommand()) {\n await traceStep('sentry-cli-add-to-build-cmd', () =>\n addSentryCommandToBuildCommand(),\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({ authToken: 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 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 const packageDotJson = await getPackageDotJson();\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(): Promise<void> {\n const packageDotJson = await getPackageDotJson();\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 = await getPackageManager(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 const newCommand = `${oldCommand} && ${packageManager.runScriptCommand} ${SENTRY_NPM_SCRIPT_NAME}`;\n\n if (oldCommand.endsWith(SENTRY_NPM_SCRIPT_NAME)) {\n clack.log.info(\n `It seems like ${chalk.cyan(\n SENTRY_NPM_SCRIPT_NAME,\n )} is already part of your ${chalk.cyan(\n buildCommand,\n )} command. Will not add it again.\nCurrent command: ${chalk.dim(oldCommand)}\nWould have injected: ${chalk.dim(newCommand)}`,\n );\n\n return;\n }\n\n packageDotJson.scripts[buildCommand] = newCommand;\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"]}
|
|
@@ -63,7 +63,7 @@ Otherwise, let's proceed with the Wrangler setup.`), 'Before we get started');
|
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
65
|
await (0, clack_1.installPackage)({
|
|
66
|
-
packageName: '@sentry/cli',
|
|
66
|
+
packageName: '@sentry/cli@^2',
|
|
67
67
|
alreadyInstalled: (0, package_json_1.hasPackageInstalled)('@sentry/cli', await (0, clack_1.getPackageDotJson)()),
|
|
68
68
|
devDependency: true,
|
|
69
69
|
});
|
|
@@ -1 +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
|
+
{"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@^2',\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"]}
|
|
@@ -84,14 +84,14 @@ async function runSvelteKitWizardWithTelemetry(options) {
|
|
|
84
84
|
}
|
|
85
85
|
let setupForSvelteKitTracing = kitVersionBucket === '>=2.31.0';
|
|
86
86
|
if (kitVersionBucket !== '>=2.31.0') {
|
|
87
|
-
clack.log.warn(`It seems you're using a SvelteKit version ${chalk_1.default.cyan('<2.31.0')} (detected ${chalk_1.default.cyan(kitVersion ?? 'unknown')}).
|
|
87
|
+
clack.log.warn(`It seems you're using a SvelteKit version ${chalk_1.default.cyan('<2.31.0')} (detected ${chalk_1.default.cyan(kitVersion ?? 'unknown')}).
|
|
88
88
|
|
|
89
89
|
We recommend upgrading SvelteKit to version ${chalk_1.default.cyan('>=2.31.0')} to use SvelteKit's builtin observability:
|
|
90
90
|
${chalk_1.default.cyan('https://svelte.dev/docs/kit/observability')}
|
|
91
91
|
|
|
92
92
|
Sentry works best with SvelteKit versions ${chalk_1.default.cyan('>=2.31.0')}.
|
|
93
93
|
|
|
94
|
-
If you prefer, you can stay on your current version and use the Sentry SDK
|
|
94
|
+
If you prefer, you can stay on your current version and use the Sentry SDK
|
|
95
95
|
without SvelteKit's builtin observability.`);
|
|
96
96
|
const decision = await (0, clack_1.abortIfCancelled)(clack.select({
|
|
97
97
|
message: 'Do you want to continue anyway?',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sveltekit-wizard.js","sourceRoot":"","sources":["../../../src/sveltekit/sveltekit-wizard.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';\n\nimport * as Sentry from '@sentry/node';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { NPM } from '../utils/package-manager';\nimport type { WizardOptions } from '../utils/types';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { createExamplePage } from './sdk-example';\nimport { createOrMergeSvelteKitFiles } from './sdk-setup/setup';\nimport { loadSvelteConfig } from './sdk-setup/svelte-config';\nimport { getKitVersionBucket, getSvelteVersionBucket } from './utils';\n\nexport async function runSvelteKitWizard(\n options: WizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'sveltekit',\n wizardOptions: options,\n },\n () => runSvelteKitWizardWithTelemetry(options),\n );\n}\n\nexport async function runSvelteKitWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry SvelteKit Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', 'Sveltekit');\n\n const kitVersion = getPackageVersion('@sveltejs/kit', packageJson);\n const kitVersionBucket = getKitVersionBucket(kitVersion);\n Sentry.setTag('sveltekit-version', kitVersionBucket);\n\n if (kitVersionBucket === '0.x') {\n clack.log.warn(\n \"It seems you're using a SvelteKit version <1.0.0 which is not supported by Sentry.\\nWe recommend upgrading to the latest 1.x version before you continue.\",\n );\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: 'Do you want to continue anyway?',\n options: [\n {\n label: 'Yes, continue',\n hint: 'The SDK might not work correctly',\n value: true,\n },\n { label: \"No, I'll upgrade first\", value: false },\n ],\n }),\n );\n if (!shouldContinue) {\n await abort('Exiting Wizard', 0);\n return;\n }\n }\n\n let setupForSvelteKitTracing = kitVersionBucket === '>=2.31.0';\n\n if (kitVersionBucket !== '>=2.31.0') {\n clack.log.warn(\n `It seems you're using a SvelteKit version ${chalk.cyan(\n '<2.31.0',\n )} (detected ${chalk.cyan(kitVersion ?? 'unknown')}). \n\nWe recommend upgrading SvelteKit to version ${chalk.cyan(\n '>=2.31.0',\n )} to use SvelteKit's builtin observability:\n${chalk.cyan('https://svelte.dev/docs/kit/observability')}\n\nSentry works best with SvelteKit versions ${chalk.cyan('>=2.31.0')}.\n\nIf you prefer, you can stay on your current version and use the Sentry SDK \nwithout SvelteKit's builtin observability.`,\n );\n\n const decision = await abortIfCancelled(\n clack.select({\n message: 'Do you want to continue anyway?',\n options: [\n {\n label: \"No, I'll upgrade SvelteKit first\",\n hint: 'Recommended',\n value: 'exit-to-upgrade',\n },\n {\n label: \"I'm already on SvelteKit >=2.31.0\",\n hint: 'Sorry, my bad!',\n value: 'install-with-kit-tracing',\n },\n {\n label: 'Yes, continue',\n hint: 'No Problem!',\n value: 'install-without-kit-tracing',\n },\n ],\n }),\n );\n\n if (decision === 'install-with-kit-tracing') {\n setupForSvelteKitTracing = true;\n }\n\n if (decision === 'exit-to-upgrade') {\n await abort('Exiting Wizard', 0);\n return;\n }\n }\n\n const svelteVersionBucket = getSvelteVersionBucket(\n getPackageVersion('svelte', packageJson),\n );\n Sentry.setTag('svelte-version', svelteVersionBucket);\n\n const projectData = await getOrAskForProjectData(\n options,\n 'javascript-sveltekit',\n );\n\n if (projectData.spotlight) {\n clack.log.warn('Spotlight mode is not yet supported for SvelteKit.');\n clack.log.info('Spotlight is currently only available for Next.js.');\n await abort('Exiting wizard', 0);\n return;\n }\n\n const { selectedProject, selfHosted, sentryUrl, authToken } = projectData;\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/sveltekit',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/sveltekit@^10',\n packageNameDisplayLabel: '@sentry/sveltekit',\n alreadyInstalled: sdkAlreadyInstalled,\n forceInstall,\n });\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const svelteConfig = await traceStep('load-svelte-config', loadSvelteConfig);\n\n try {\n await traceStep('configure-sdk', () =>\n createOrMergeSvelteKitFiles(\n {\n dsn: selectedProject.keys[0].dsn.public,\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n },\n svelteConfig,\n setupForSvelteKitTracing,\n ),\n );\n } catch (e: unknown) {\n clack.log.error('Error while setting up the SvelteKit SDK:');\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 Sentry.captureException('Error while setting up the SvelteKit SDK');\n await abort('Exiting Wizard');\n return;\n }\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage(\n '/sentry-example-page',\n );\n\n if (shouldCreateExamplePage) {\n try {\n await traceStep('create-example-page', async () =>\n createExamplePage(svelteConfig, {\n selfHosted,\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n isUsingSvelte5: ['5.x', '>5.x'].includes(svelteVersionBucket),\n }),\n );\n } catch (e: unknown) {\n clack.log.error('Error while creating an example page to test Sentry:');\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 Sentry.captureException(\n 'Error while creating an example Svelte page to test Sentry',\n );\n await abort('Exiting Wizard');\n return;\n }\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n clack.outro(await buildOutroMessage(shouldCreateExamplePage));\n}\n\nasync function buildOutroMessage(\n shouldCreateExamplePage: boolean,\n): Promise<string> {\n const packageManager = await getPackageManager(NPM);\n\n let msg = chalk.green('Successfully installed the Sentry SvelteKit SDK!');\n\n if (shouldCreateExamplePage) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n `\\`${packageManager.runScriptCommand} dev\\``,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/sveltekit/`;\n\n return msg;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sveltekit-wizard.js","sourceRoot":"","sources":["../../../src/sveltekit/sveltekit-wizard.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';\n\nimport * as Sentry from '@sentry/node';\n\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abort,\n abortIfCancelled,\n addDotEnvSentryBuildPluginFile,\n askShouldCreateExamplePage,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { NPM } from '../utils/package-manager';\nimport type { WizardOptions } from '../utils/types';\nimport { offerProjectScopedMcpConfig } from '../utils/clack/mcp-config';\nimport { createExamplePage } from './sdk-example';\nimport { createOrMergeSvelteKitFiles } from './sdk-setup/setup';\nimport { loadSvelteConfig } from './sdk-setup/svelte-config';\nimport { getKitVersionBucket, getSvelteVersionBucket } from './utils';\n\nexport async function runSvelteKitWizard(\n options: WizardOptions,\n): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'sveltekit',\n wizardOptions: options,\n },\n () => runSvelteKitWizardWithTelemetry(options),\n );\n}\n\nexport async function runSvelteKitWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n const { promoCode, telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'Sentry SvelteKit Wizard',\n promoCode,\n telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', 'Sveltekit');\n\n const kitVersion = getPackageVersion('@sveltejs/kit', packageJson);\n const kitVersionBucket = getKitVersionBucket(kitVersion);\n Sentry.setTag('sveltekit-version', kitVersionBucket);\n\n if (kitVersionBucket === '0.x') {\n clack.log.warn(\n \"It seems you're using a SvelteKit version <1.0.0 which is not supported by Sentry.\\nWe recommend upgrading to the latest 1.x version before you continue.\",\n );\n const shouldContinue = await abortIfCancelled(\n clack.select({\n message: 'Do you want to continue anyway?',\n options: [\n {\n label: 'Yes, continue',\n hint: 'The SDK might not work correctly',\n value: true,\n },\n { label: \"No, I'll upgrade first\", value: false },\n ],\n }),\n );\n if (!shouldContinue) {\n await abort('Exiting Wizard', 0);\n return;\n }\n }\n\n let setupForSvelteKitTracing = kitVersionBucket === '>=2.31.0';\n\n if (kitVersionBucket !== '>=2.31.0') {\n clack.log.warn(\n `It seems you're using a SvelteKit version ${chalk.cyan(\n '<2.31.0',\n )} (detected ${chalk.cyan(kitVersion ?? 'unknown')}).\n\nWe recommend upgrading SvelteKit to version ${chalk.cyan(\n '>=2.31.0',\n )} to use SvelteKit's builtin observability:\n${chalk.cyan('https://svelte.dev/docs/kit/observability')}\n\nSentry works best with SvelteKit versions ${chalk.cyan('>=2.31.0')}.\n\nIf you prefer, you can stay on your current version and use the Sentry SDK\nwithout SvelteKit's builtin observability.`,\n );\n\n const decision = await abortIfCancelled(\n clack.select({\n message: 'Do you want to continue anyway?',\n options: [\n {\n label: \"No, I'll upgrade SvelteKit first\",\n hint: 'Recommended',\n value: 'exit-to-upgrade',\n },\n {\n label: \"I'm already on SvelteKit >=2.31.0\",\n hint: 'Sorry, my bad!',\n value: 'install-with-kit-tracing',\n },\n {\n label: 'Yes, continue',\n hint: 'No Problem!',\n value: 'install-without-kit-tracing',\n },\n ],\n }),\n );\n\n if (decision === 'install-with-kit-tracing') {\n setupForSvelteKitTracing = true;\n }\n\n if (decision === 'exit-to-upgrade') {\n await abort('Exiting Wizard', 0);\n return;\n }\n }\n\n const svelteVersionBucket = getSvelteVersionBucket(\n getPackageVersion('svelte', packageJson),\n );\n Sentry.setTag('svelte-version', svelteVersionBucket);\n\n const projectData = await getOrAskForProjectData(\n options,\n 'javascript-sveltekit',\n );\n\n if (projectData.spotlight) {\n clack.log.warn('Spotlight mode is not yet supported for SvelteKit.');\n clack.log.info('Spotlight is currently only available for Next.js.');\n await abort('Exiting wizard', 0);\n return;\n }\n\n const { selectedProject, selfHosted, sentryUrl, authToken } = projectData;\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/sveltekit',\n packageJson,\n );\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/sveltekit@^10',\n packageNameDisplayLabel: '@sentry/sveltekit',\n alreadyInstalled: sdkAlreadyInstalled,\n forceInstall,\n });\n\n await addDotEnvSentryBuildPluginFile(authToken);\n\n const svelteConfig = await traceStep('load-svelte-config', loadSvelteConfig);\n\n try {\n await traceStep('configure-sdk', () =>\n createOrMergeSvelteKitFiles(\n {\n dsn: selectedProject.keys[0].dsn.public,\n org: selectedProject.organization.slug,\n project: selectedProject.slug,\n selfHosted,\n url: sentryUrl,\n },\n svelteConfig,\n setupForSvelteKitTracing,\n ),\n );\n } catch (e: unknown) {\n clack.log.error('Error while setting up the SvelteKit SDK:');\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 Sentry.captureException('Error while setting up the SvelteKit SDK');\n await abort('Exiting Wizard');\n return;\n }\n\n const shouldCreateExamplePage = await askShouldCreateExamplePage(\n '/sentry-example-page',\n );\n\n if (shouldCreateExamplePage) {\n try {\n await traceStep('create-example-page', async () =>\n createExamplePage(svelteConfig, {\n selfHosted,\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n isUsingSvelte5: ['5.x', '>5.x'].includes(svelteVersionBucket),\n }),\n );\n } catch (e: unknown) {\n clack.log.error('Error while creating an example page to test Sentry:');\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 Sentry.captureException(\n 'Error while creating an example Svelte page to test Sentry',\n );\n await abort('Exiting Wizard');\n return;\n }\n }\n\n await runPrettierIfInstalled({ cwd: undefined });\n\n // Offer optional project-scoped MCP config for Sentry with org and project scope\n await offerProjectScopedMcpConfig(\n selectedProject.organization.slug,\n selectedProject.slug,\n );\n\n clack.outro(await buildOutroMessage(shouldCreateExamplePage));\n}\n\nasync function buildOutroMessage(\n shouldCreateExamplePage: boolean,\n): Promise<string> {\n const packageManager = await getPackageManager(NPM);\n\n let msg = chalk.green('Successfully installed the Sentry SvelteKit SDK!');\n\n if (shouldCreateExamplePage) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n `\\`${packageManager.runScriptCommand} dev\\``,\n )}) and visiting ${chalk.cyan('\"/sentry-example-page\"')}.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/sveltekit/`;\n\n return msg;\n}\n"]}
|
package/dist/src/telemetry.d.ts
CHANGED
package/dist/src/telemetry.js
CHANGED
|
@@ -1,56 +1,80 @@
|
|
|
1
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
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.updateProgress = exports.traceStep = exports.withTelemetry = void 0;
|
|
4
|
-
const
|
|
27
|
+
const Sentry = __importStar(require("@sentry/node"));
|
|
5
28
|
const version_1 = require("./version");
|
|
6
29
|
async function withTelemetry(options, callback) {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
sentryHub.captureSession();
|
|
30
|
+
const client = initSentry(options.enabled, options.integration);
|
|
31
|
+
Sentry.startSession();
|
|
32
|
+
Sentry.captureSession();
|
|
11
33
|
// Set tag for passed CLI args
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
34
|
+
Sentry.setTag('args.project', !!options.wizardOptions.projectSlug);
|
|
35
|
+
Sentry.setTag('args.org', !!options.wizardOptions.orgSlug);
|
|
36
|
+
Sentry.setTag('args.saas', !!options.wizardOptions.saas);
|
|
15
37
|
try {
|
|
16
|
-
return await
|
|
38
|
+
return await Sentry.startSpan({
|
|
17
39
|
name: 'sentry-wizard-execution',
|
|
18
|
-
status: 'ok',
|
|
19
40
|
op: 'wizard.flow',
|
|
20
41
|
}, async () => {
|
|
21
42
|
updateProgress('start');
|
|
22
|
-
const res = await
|
|
43
|
+
const res = await Sentry.withIsolationScope(callback);
|
|
23
44
|
updateProgress('finished');
|
|
24
45
|
return res;
|
|
25
46
|
});
|
|
26
47
|
}
|
|
27
48
|
catch (e) {
|
|
28
|
-
|
|
29
|
-
|
|
49
|
+
Sentry.captureException('Error during wizard execution.');
|
|
50
|
+
const currentSession = Sentry.getCurrentScope().getSession();
|
|
51
|
+
if (currentSession) {
|
|
52
|
+
currentSession.status = 'crashed';
|
|
53
|
+
}
|
|
30
54
|
throw e;
|
|
31
55
|
}
|
|
32
56
|
finally {
|
|
33
|
-
|
|
34
|
-
await
|
|
57
|
+
Sentry.endSession();
|
|
58
|
+
await client?.flush(3000).then(null, () => {
|
|
35
59
|
// If telemetry flushing fails we generally don't care
|
|
36
60
|
});
|
|
37
|
-
await
|
|
61
|
+
await Sentry.flush(3000).then(null, () => {
|
|
38
62
|
// If telemetry flushing fails we generally don't care
|
|
39
63
|
});
|
|
40
64
|
}
|
|
41
65
|
}
|
|
42
66
|
exports.withTelemetry = withTelemetry;
|
|
43
|
-
function
|
|
44
|
-
const client =
|
|
67
|
+
function initSentry(enabled, integration) {
|
|
68
|
+
const client = Sentry.init({
|
|
45
69
|
dsn: 'https://8871d3ff64814ed8960c96d1fcc98a27@o1.ingest.sentry.io/4505425820712960',
|
|
46
70
|
enabled: enabled,
|
|
71
|
+
defaultIntegrations: false,
|
|
72
|
+
integrations: [Sentry.httpIntegration()],
|
|
47
73
|
environment: `production-${integration}`,
|
|
48
74
|
tracesSampleRate: 1,
|
|
49
75
|
sampleRate: 1,
|
|
50
76
|
release: version_1.WIZARD_VERSION,
|
|
51
|
-
integrations: [new node_1.Integrations.Http()],
|
|
52
77
|
tracePropagationTargets: [/^https:\/\/sentry.io\//],
|
|
53
|
-
stackParser: node_1.defaultStackParser,
|
|
54
78
|
beforeSendTransaction: (event) => {
|
|
55
79
|
delete event.server_name; // Server name might contain PII
|
|
56
80
|
return event;
|
|
@@ -62,33 +86,30 @@ function createSentryInstance(enabled, integration) {
|
|
|
62
86
|
delete event.server_name; // Server name might contain PII
|
|
63
87
|
return event;
|
|
64
88
|
},
|
|
65
|
-
transport: node_1.makeNodeTransport,
|
|
66
|
-
debug: true,
|
|
67
89
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
hub.setTag('platform', process.platform);
|
|
90
|
+
Sentry.setTag('integration', integration);
|
|
91
|
+
Sentry.setTag('node', process.version);
|
|
92
|
+
Sentry.setTag('platform', process.platform);
|
|
72
93
|
try {
|
|
73
94
|
// The `require` call here is fine because the binary node versions
|
|
74
95
|
// support `require` and we try/catch the call anyway for any other
|
|
75
96
|
// version of node.
|
|
76
97
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
77
98
|
const sea = require('node:sea');
|
|
78
|
-
|
|
99
|
+
Sentry.setTag('is_binary', sea.isSea());
|
|
79
100
|
}
|
|
80
101
|
catch {
|
|
81
|
-
|
|
102
|
+
Sentry.setTag('is_binary', false);
|
|
82
103
|
}
|
|
83
|
-
return
|
|
104
|
+
return client;
|
|
84
105
|
}
|
|
85
106
|
function traceStep(step, callback) {
|
|
86
107
|
updateProgress(step);
|
|
87
|
-
return
|
|
108
|
+
return Sentry.startSpan({ name: step, op: 'wizard.step' }, (span) => callback(span));
|
|
88
109
|
}
|
|
89
110
|
exports.traceStep = traceStep;
|
|
90
111
|
function updateProgress(step) {
|
|
91
|
-
|
|
112
|
+
Sentry.setTag('progress', step);
|
|
92
113
|
}
|
|
93
114
|
exports.updateProgress = updateProgress;
|
|
94
115
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport type { Span } from '@sentry/node';\nimport type { WizardOptions } from './utils/types';\nimport { WIZARD_VERSION } from './version';\n\nexport async function withTelemetry<F>(\n options: {\n enabled: boolean;\n integration: string;\n wizardOptions: WizardOptions;\n },\n callback: () => F | Promise<F>,\n): Promise<F> {\n const client = initSentry(options.enabled, options.integration);\n\n Sentry.startSession();\n Sentry.captureSession();\n\n // Set tag for passed CLI args\n Sentry.setTag('args.project', !!options.wizardOptions.projectSlug);\n Sentry.setTag('args.org', !!options.wizardOptions.orgSlug);\n Sentry.setTag('args.saas', !!options.wizardOptions.saas);\n\n try {\n return await Sentry.startSpan(\n {\n name: 'sentry-wizard-execution',\n op: 'wizard.flow',\n },\n async () => {\n updateProgress('start');\n const res = await Sentry.withIsolationScope(callback);\n updateProgress('finished');\n\n return res;\n },\n );\n } catch (e) {\n Sentry.captureException('Error during wizard execution.');\n const currentSession = Sentry.getCurrentScope().getSession();\n if (currentSession) {\n currentSession.status = 'crashed';\n }\n throw e;\n } finally {\n Sentry.endSession();\n await client?.flush(3000).then(null, () => {\n // If telemetry flushing fails we generally don't care\n });\n await Sentry.flush(3000).then(null, () => {\n // If telemetry flushing fails we generally don't care\n });\n }\n}\n\nfunction initSentry(\n enabled: boolean,\n integration: string,\n): Sentry.NodeClient | undefined {\n const client = Sentry.init({\n dsn: 'https://8871d3ff64814ed8960c96d1fcc98a27@o1.ingest.sentry.io/4505425820712960',\n enabled: enabled,\n defaultIntegrations: false,\n integrations: [Sentry.httpIntegration()],\n environment: `production-${integration}`,\n\n tracesSampleRate: 1,\n sampleRate: 1,\n\n release: WIZARD_VERSION,\n tracePropagationTargets: [/^https:\\/\\/sentry.io\\//],\n\n beforeSendTransaction: (event) => {\n delete event.server_name; // Server name might contain PII\n return event;\n },\n\n beforeSend: (event) => {\n event.exception?.values?.forEach((exception) => {\n delete exception.stacktrace;\n });\n\n delete event.server_name; // Server name might contain PII\n return event;\n },\n });\n\n Sentry.setTag('integration', integration);\n Sentry.setTag('node', process.version);\n Sentry.setTag('platform', process.platform);\n\n try {\n // The `require` call here is fine because the binary node versions\n // support `require` and we try/catch the call anyway for any other\n // version of node.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const sea = require('node:sea') as { isSea: () => boolean };\n Sentry.setTag('is_binary', sea.isSea());\n } catch {\n Sentry.setTag('is_binary', false);\n }\n\n return client;\n}\n\nexport function traceStep<T>(\n step: string,\n callback: (span: Span | undefined) => T,\n): T {\n updateProgress(step);\n return Sentry.startSpan({ name: step, op: 'wizard.step' }, (span) =>\n callback(span),\n );\n}\n\nexport function updateProgress(step: string) {\n Sentry.setTag('progress', step);\n}\n"]}
|