@sentry/wizard 6.8.1 → 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 +47 -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/tests/nuxt-3.test.js +2 -4
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +2 -4
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +2 -4
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js +1 -3
- package/dist/e2e-tests/tests/sveltekit-hooks.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +2 -4
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- 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/nuxt/sdk-setup.js +3 -5
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/nuxt/templates.js +6 -3
- package/dist/src/nuxt/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/sdk-setup/vite.js +5 -9
- package/dist/src/sveltekit/sdk-setup/vite.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/nuxt/templates.test.js +35 -6
- package/dist/test/nuxt/templates.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../../../../src/sveltekit/sdk-setup/vite.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAuC;AACvC,uCAAyB;AACzB,2CAA6B;AAC7B,kDAA0B;AAE1B,8EAA8E;AAC9E,6DAAmC;AACnC,kFAAkF;AAClF,uCAAqD;AACrD,kFAAkF;AAClF,8CAAiD;AAMjD,qDAAyD;AACzD,6CAA0C;AAC1C,6CAAqD;AAErD,mCAA8C;AAEvC,KAAK,UAAU,gBAAgB,CACpC,cAAsB,EACtB,WAAwB;IAExB,MAAM,iBAAiB,GAAG,CACxB,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CACpD,CAAC,QAAQ,EAAE,CAAC;IAEb,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IAEtD,MAAM,wBAAwB,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3E,IAAI;QACF,MAAM,UAAU,GAAG,IAAA,sBAAW,EAAC,iBAAiB,CAAC,CAAC;QAElD,IAAI,IAAA,4BAAgB,EAAC,UAAU,CAAC,IAAiB,CAAC,EAAE;YAClD,iBAAK,CAAC,GAAG,CAAC,IAAI,CACZ,QAAQ,wBAAwB;yCACC,CAClC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;YAC5D,OAAO;SACR;QAED,MAAM,IAAA,2BAAmB,EACvB,GAAG,EAAE,CACH,IAAA,uBAAa,EAAC,UAAU,EAAE;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE;gBACP,
|
|
1
|
+
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../../../../src/sveltekit/sdk-setup/vite.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\n\n//@ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, parseModule } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { addVitePlugin } from 'magicast/helpers';\n\nimport * as recast from 'recast';\nimport x = recast.types;\nimport t = x.namedTypes;\n\nimport { hasSentryContent } from '../../utils/ast-utils';\nimport { debug } from '../../utils/debug';\nimport { abortIfCancelled } from '../../utils/clack';\nimport type { ProjectInfo } from './types';\nimport { modifyAndRecordFail } from './utils';\n\nexport async function modifyViteConfig(\n viteConfigPath: string,\n projectInfo: ProjectInfo,\n): Promise<void> {\n const viteConfigContent = (\n await fs.promises.readFile(viteConfigPath, 'utf-8')\n ).toString();\n\n const { org, project, url, selfHosted } = projectInfo;\n\n const prettyViteConfigFilename = chalk.cyan(path.basename(viteConfigPath));\n\n try {\n const viteModule = parseModule(viteConfigContent);\n\n if (hasSentryContent(viteModule.$ast as t.Program)) {\n clack.log.warn(\n `File ${prettyViteConfigFilename} already contains Sentry code.\nSkipping adding Sentry functionality to.`,\n );\n Sentry.setTag(`modified-vite-cfg`, 'fail');\n Sentry.setTag(`vite-cfg-fail-reason`, 'has-sentry-content');\n return;\n }\n\n await modifyAndRecordFail(\n () =>\n addVitePlugin(viteModule, {\n imported: 'sentrySvelteKit',\n from: '@sentry/sveltekit',\n constructor: 'sentrySvelteKit',\n options: {\n org,\n project,\n ...(selfHosted && { url }),\n },\n index: 0,\n }),\n 'add-vite-plugin',\n 'vite-cfg',\n );\n\n await modifyAndRecordFail(\n async () => {\n const code = generateCode(viteModule.$ast).code;\n await fs.promises.writeFile(viteConfigPath, code);\n },\n 'write-file',\n 'vite-cfg',\n );\n } catch (e) {\n debug(e);\n await showFallbackViteCopyPasteSnippet(\n viteConfigPath,\n getViteConfigCodeSnippet(org, project, selfHosted, url),\n );\n Sentry.captureException('Sveltekit Vite Config Modification Fail');\n }\n\n clack.log.success(`Added Sentry code to ${prettyViteConfigFilename}`);\n Sentry.setTag(`modified-vite-cfg`, 'success');\n}\n\nasync function showFallbackViteCopyPasteSnippet(\n viteConfigPath: string,\n codeSnippet: string,\n) {\n const viteConfigFilename = path.basename(viteConfigPath);\n\n clack.log.warning(\n `Couldn't automatically modify your ${chalk.cyan(viteConfigFilename)}\n${chalk.dim(`This sometimes happens when we encounter more complex vite configs.\nIt may not seem like it but sometimes our magical powers are limited ;)`)}`,\n );\n\n clack.log.info(\"But don't worry - it's super easy to do this yourself!\");\n\n clack.log.step(\n `Add the following code to your ${chalk.cyan(viteConfigFilename)}:`,\n );\n\n // Intentionally logging to console here for easier copy/pasting\n // eslint-disable-next-line no-console\n console.log(codeSnippet);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you copy the snippet above?',\n options: [\n { label: 'Yes!', value: true, hint: \"Great, that's already it!\" },\n ],\n initialValue: true,\n }),\n );\n}\n\nconst getViteConfigCodeSnippet = (\n org: string,\n project: string,\n selfHosted: boolean,\n url: string,\n) =>\n chalk.gray(`\nimport { sveltekit } from '@sveltejs/kit/vite';\nimport { defineConfig } from 'vite';\n${chalk.greenBright(\"import { sentrySvelteKit } from '@sentry/sveltekit'\")}\n\nexport default defineConfig({\n plugins: [\n // Make sure \\`sentrySvelteKit\\` is registered before \\`sveltekit\\`\n ${chalk.greenBright(`sentrySvelteKit({\n org: '${org}',\n project: '${project}',${selfHosted ? `\\n url: '${url}',` : ''}\n }),`)}\n sveltekit(),\n ]\n});\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"]}
|
|
@@ -89,6 +89,15 @@ export declare function installPackage({ packageName, alreadyInstalled, askBefor
|
|
|
89
89
|
}>;
|
|
90
90
|
export declare function addSentryCliConfig({ authToken, org, project, url }: CliSetupConfigContent, setupConfig?: CliSetupConfig): Promise<void>;
|
|
91
91
|
export declare function addDotEnvSentryBuildPluginFile(authToken: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Runs available formatters (Prettier and/or Biome) on the changed or untracked files in the project.
|
|
94
|
+
* This function provides a unified interface for running multiple formatters with a single user prompt.
|
|
95
|
+
*
|
|
96
|
+
* @param _opts The directory of the project. If undefined, the current process working directory will be used.
|
|
97
|
+
*/
|
|
98
|
+
export declare function runFormatters(_opts: {
|
|
99
|
+
cwd: string | undefined;
|
|
100
|
+
}): Promise<void>;
|
|
92
101
|
/**
|
|
93
102
|
* Runs prettier on the changed or untracked files in the project.
|
|
94
103
|
*
|
|
@@ -97,6 +106,14 @@ export declare function addDotEnvSentryBuildPluginFile(authToken: string): Promi
|
|
|
97
106
|
export declare function runPrettierIfInstalled(opts: {
|
|
98
107
|
cwd: string | undefined;
|
|
99
108
|
}): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Runs Biome on the changed or untracked files in the project.
|
|
111
|
+
*
|
|
112
|
+
* @param options.cwd The directory of the project. If undefined, the current process working directory will be used.
|
|
113
|
+
*/
|
|
114
|
+
export declare function runBiomeIfInstalled(opts: {
|
|
115
|
+
cwd: string | undefined;
|
|
116
|
+
}): Promise<void>;
|
|
100
117
|
/**
|
|
101
118
|
* Checks if @param packageId is listed as a dependency in @param packageJson.
|
|
102
119
|
* If not, it will ask users if they want to continue without the package.
|
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.askToRunBuildOrEnterPathOrProceed = exports.artifactsExist = exports.askShouldAddPackageOverride = exports.askShouldInstallPackage = exports.featureSelectionPrompt = exports.askShouldCreateExampleComponent = exports.askShouldCreateExamplePage = exports.createNewConfigFile = exports.makeCodeSnippet = exports.showCopyPasteInstructions = exports.askForToolConfigPath = exports.askForWizardLogin = exports.getOrAskForProjectData = exports.isUsingTypeScript = exports.getPackageManager = exports.updatePackageDotJson = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.runPrettierIfInstalled = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliConfig = exports.installPackage = exports.confirmContinueIfPackageVersionNotSupported = exports.askForItemSelection = exports.askToInstallSentryCLI = exports.confirmContinueIfNoOrDirtyGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = exports.propertiesCliSetupConfig = exports.rcCliSetupConfig = exports.SENTRY_PROPERTIES_FILE = exports.SENTRY_CLI_RC_FILE = exports.SENTRY_DOT_ENV_FILE = void 0;
|
|
29
|
+
exports.askToRunBuildOrEnterPathOrProceed = exports.artifactsExist = exports.askShouldAddPackageOverride = exports.askShouldInstallPackage = exports.featureSelectionPrompt = exports.askShouldCreateExampleComponent = exports.askShouldCreateExamplePage = exports.createNewConfigFile = exports.makeCodeSnippet = exports.showCopyPasteInstructions = exports.askForToolConfigPath = exports.askForWizardLogin = exports.getOrAskForProjectData = exports.isUsingTypeScript = exports.getPackageManager = exports.updatePackageDotJson = exports.getPackageDotJson = exports.ensurePackageIsInstalled = exports.runBiomeIfInstalled = exports.runPrettierIfInstalled = exports.runFormatters = exports.addDotEnvSentryBuildPluginFile = exports.addSentryCliConfig = exports.installPackage = exports.confirmContinueIfPackageVersionNotSupported = exports.askForItemSelection = exports.askToInstallSentryCLI = exports.confirmContinueIfNoOrDirtyGitRepo = exports.printWelcome = exports.abortIfCancelled = exports.abort = exports.propertiesCliSetupConfig = exports.rcCliSetupConfig = exports.SENTRY_PROPERTIES_FILE = exports.SENTRY_CLI_RC_FILE = exports.SENTRY_DOT_ENV_FILE = void 0;
|
|
30
30
|
const childProcess = __importStar(require("node:child_process"));
|
|
31
31
|
const fs = __importStar(require("node:fs"));
|
|
32
32
|
const node_child_process_1 = require("node:child_process");
|
|
@@ -104,17 +104,22 @@ exports.propertiesCliSetupConfig = {
|
|
|
104
104
|
*/
|
|
105
105
|
async function abort(message, status) {
|
|
106
106
|
clack.outro(message ?? 'Wizard setup cancelled.');
|
|
107
|
-
const
|
|
108
|
-
const
|
|
107
|
+
const activeSpan = Sentry.getActiveSpan();
|
|
108
|
+
const rootSpan = activeSpan ? Sentry.getRootSpan(activeSpan) : undefined;
|
|
109
109
|
// 'cancelled' doesn't increase the `failureRate()` shown in the Sentry UI
|
|
110
110
|
// 'aborted' increases the failure rate
|
|
111
111
|
// see: https://docs.sentry.io/product/insights/overview/metrics/#failure-rate
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
if (rootSpan) {
|
|
113
|
+
rootSpan.setStatus({
|
|
114
|
+
code: status === 0 ? 1 : 2,
|
|
115
|
+
message: status === 0 ? 'cancelled' : 'aborted',
|
|
116
|
+
});
|
|
117
|
+
rootSpan.end();
|
|
118
|
+
}
|
|
119
|
+
const sentrySession = Sentry.getCurrentScope().getSession();
|
|
115
120
|
if (sentrySession) {
|
|
116
121
|
sentrySession.status = status === 0 ? 'abnormal' : 'crashed';
|
|
117
|
-
|
|
122
|
+
Sentry.captureSession(true);
|
|
118
123
|
}
|
|
119
124
|
await Sentry.flush(3000).catch(() => {
|
|
120
125
|
// Ignore flush errors during abort
|
|
@@ -125,11 +130,13 @@ exports.abort = abort;
|
|
|
125
130
|
async function abortIfCancelled(input) {
|
|
126
131
|
if (clack.isCancel(await input)) {
|
|
127
132
|
clack.cancel('Wizard setup cancelled.');
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
+
const activeSpan = Sentry.getActiveSpan();
|
|
134
|
+
const rootSpan = activeSpan ? Sentry.getRootSpan(activeSpan) : undefined;
|
|
135
|
+
if (rootSpan) {
|
|
136
|
+
rootSpan.setStatus({ code: 1, message: 'cancelled' });
|
|
137
|
+
rootSpan.end();
|
|
138
|
+
}
|
|
139
|
+
Sentry.captureSession(true);
|
|
133
140
|
await Sentry.flush(3000).catch(() => {
|
|
134
141
|
// Ignore flush errors during abort
|
|
135
142
|
});
|
|
@@ -450,6 +457,99 @@ async function addCliConfigFileToGitIgnore(filename) {
|
|
|
450
457
|
clack.log.error(`Failed adding ${chalk_1.default.cyan(filename)} to ${chalk_1.default.cyan('.gitignore')}. Please add it manually!`);
|
|
451
458
|
}
|
|
452
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* Helper function to get the list of changed or untracked files for formatting.
|
|
462
|
+
* @returns Space-separated string of file paths, or null if not in git repo or no files changed.
|
|
463
|
+
*/
|
|
464
|
+
function getFormatterTargetFiles() {
|
|
465
|
+
if (!(0, git_1.isInGitRepo)({ cwd: undefined })) {
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
const changedOrUntrackedFiles = (0, git_1.getUncommittedOrUntrackedFiles)()
|
|
469
|
+
.map((filename) => {
|
|
470
|
+
return filename.startsWith('- ') ? filename.slice(2) : filename;
|
|
471
|
+
})
|
|
472
|
+
.join(' ');
|
|
473
|
+
return changedOrUntrackedFiles.length ? changedOrUntrackedFiles : null;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Runs available formatters (Prettier and/or Biome) on the changed or untracked files in the project.
|
|
477
|
+
* This function provides a unified interface for running multiple formatters with a single user prompt.
|
|
478
|
+
*
|
|
479
|
+
* @param _opts The directory of the project. If undefined, the current process working directory will be used.
|
|
480
|
+
*/
|
|
481
|
+
async function runFormatters(_opts) {
|
|
482
|
+
return (0, telemetry_1.traceStep)('run-formatters', async () => {
|
|
483
|
+
const targetFiles = getFormatterTargetFiles();
|
|
484
|
+
if (!targetFiles) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
const packageJson = await getPackageDotJson();
|
|
488
|
+
const prettierInstalled = (0, package_json_1.hasPackageInstalled)('prettier', packageJson);
|
|
489
|
+
const biomeInstalled = (0, package_json_1.hasPackageInstalled)('@biomejs/biome', packageJson);
|
|
490
|
+
Sentry.setTag('prettier-installed', prettierInstalled);
|
|
491
|
+
Sentry.setTag('biome-installed', biomeInstalled);
|
|
492
|
+
if (!prettierInstalled && !biomeInstalled) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
// Determine prompt message based on what's installed
|
|
496
|
+
const formattersAvailable = [];
|
|
497
|
+
if (prettierInstalled)
|
|
498
|
+
formattersAvailable.push('Prettier');
|
|
499
|
+
if (biomeInstalled)
|
|
500
|
+
formattersAvailable.push('Biome');
|
|
501
|
+
const message = formattersAvailable.length === 1
|
|
502
|
+
? `Looks like you have ${formattersAvailable[0]} in your project. Do you want to run it on your files?`
|
|
503
|
+
: `Looks like you have ${formattersAvailable.join(' and ')} in your project. Do you want to run them on your files?`;
|
|
504
|
+
const shouldRun = await abortIfCancelled(clack.confirm({ message }));
|
|
505
|
+
if (!shouldRun) {
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
const spinner = clack.spinner();
|
|
509
|
+
spinner.start('Running formatters on your files.');
|
|
510
|
+
try {
|
|
511
|
+
// Run Prettier first if installed (handles general formatting)
|
|
512
|
+
if (prettierInstalled) {
|
|
513
|
+
await new Promise((resolve, reject) => {
|
|
514
|
+
childProcess.exec(`npx prettier --ignore-unknown --write ${targetFiles}`, (err) => {
|
|
515
|
+
if (err) {
|
|
516
|
+
reject(err);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
resolve();
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
// Run Biome if installed (handles linting + additional formatting)
|
|
525
|
+
if (biomeInstalled) {
|
|
526
|
+
// Format first
|
|
527
|
+
await new Promise((resolve) => {
|
|
528
|
+
childProcess.exec(`npx @biomejs/biome format --write ${targetFiles}`, () => {
|
|
529
|
+
// Ignore errors, just continue
|
|
530
|
+
resolve();
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
// Then lint with fixes (using --unsafe for auto-fixable issues)
|
|
534
|
+
// See: https://biomejs.dev/linter/#unsafe-fixes
|
|
535
|
+
// The --unsafe flag applies potentially behavior-changing fixes like removing unused imports.
|
|
536
|
+
// This is acceptable for wizard-generated code which may have fixable issues.
|
|
537
|
+
await new Promise((resolve) => {
|
|
538
|
+
childProcess.exec(`npx @biomejs/biome check --write --unsafe ${targetFiles}`, () => {
|
|
539
|
+
// Ignore errors, Biome exits non-zero if there are remaining issues
|
|
540
|
+
resolve();
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
spinner.stop('Formatters have processed your files.');
|
|
545
|
+
}
|
|
546
|
+
catch (e) {
|
|
547
|
+
spinner.stop('Formatting encountered an issue.');
|
|
548
|
+
clack.log.warn('Formatting encountered an issue. There may be formatting or linting issues in your updated files.');
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
exports.runFormatters = runFormatters;
|
|
453
553
|
/**
|
|
454
554
|
* Runs prettier on the changed or untracked files in the project.
|
|
455
555
|
*
|
|
@@ -507,6 +607,68 @@ async function runPrettierIfInstalled(opts) {
|
|
|
507
607
|
});
|
|
508
608
|
}
|
|
509
609
|
exports.runPrettierIfInstalled = runPrettierIfInstalled;
|
|
610
|
+
/**
|
|
611
|
+
* Runs Biome on the changed or untracked files in the project.
|
|
612
|
+
*
|
|
613
|
+
* @param options.cwd The directory of the project. If undefined, the current process working directory will be used.
|
|
614
|
+
*/
|
|
615
|
+
async function runBiomeIfInstalled(opts) {
|
|
616
|
+
return (0, telemetry_1.traceStep)('run-biome', async () => {
|
|
617
|
+
if (!(0, git_1.isInGitRepo)({ cwd: opts.cwd })) {
|
|
618
|
+
// We only run formatting on changed files. If we're not in a git repo, we can't find
|
|
619
|
+
// changed files. So let's early-return without showing any formatting-related messages.
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
const changedOrUntrackedFiles = (0, git_1.getUncommittedOrUntrackedFiles)()
|
|
623
|
+
.map((filename) => {
|
|
624
|
+
return filename.startsWith('- ') ? filename.slice(2) : filename;
|
|
625
|
+
})
|
|
626
|
+
.join(' ');
|
|
627
|
+
if (!changedOrUntrackedFiles.length) {
|
|
628
|
+
// Likewise, if we can't find changed or untracked files, there's no point in running Biome.
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
const packageJson = await getPackageDotJson();
|
|
632
|
+
const biomeInstalled = (0, package_json_1.hasPackageInstalled)('@biomejs/biome', packageJson);
|
|
633
|
+
Sentry.setTag('biome-installed', biomeInstalled);
|
|
634
|
+
if (!biomeInstalled) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
// prompt the user if they want to run biome
|
|
638
|
+
const shouldRunBiome = await abortIfCancelled(clack.confirm({
|
|
639
|
+
message: 'Looks like you have Biome in your project. Do you want to run it on your files?',
|
|
640
|
+
}));
|
|
641
|
+
if (!shouldRunBiome) {
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
const biomeSpinner = clack.spinner();
|
|
645
|
+
biomeSpinner.start('Running Biome on your files.');
|
|
646
|
+
try {
|
|
647
|
+
// Use biome format --write for formatting (always succeeds if it can format)
|
|
648
|
+
// Then biome check --write for lint fixes
|
|
649
|
+
// We ignore exit codes because Biome exits non-zero if there are unfixable issues
|
|
650
|
+
await new Promise((resolve) => {
|
|
651
|
+
childProcess.exec(`npx @biomejs/biome format --write ${changedOrUntrackedFiles}`, () => {
|
|
652
|
+
// Ignore errors, just continue
|
|
653
|
+
resolve();
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
await new Promise((resolve) => {
|
|
657
|
+
childProcess.exec(`npx @biomejs/biome check --write --unsafe ${changedOrUntrackedFiles}`, () => {
|
|
658
|
+
// Ignore errors, Biome exits non-zero if there are remaining issues
|
|
659
|
+
resolve();
|
|
660
|
+
});
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
catch (e) {
|
|
664
|
+
biomeSpinner.stop('Biome encountered an issue.');
|
|
665
|
+
clack.log.warn('Biome encountered an issue. There may be formatting or linting issues in your updated files.');
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
biomeSpinner.stop('Biome has formatted your files.');
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
exports.runBiomeIfInstalled = runBiomeIfInstalled;
|
|
510
672
|
/**
|
|
511
673
|
* Checks if @param packageId is listed as a dependency in @param packageJson.
|
|
512
674
|
* If not, it will ask users if they want to continue without the package.
|