@sentry/wizard 4.0.1 → 4.1.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 +10 -1
- package/dist/NextJs/configs/next.config.js +1 -1
- package/dist/bin.js +2 -1
- package/dist/bin.js.map +1 -1
- package/dist/bump-version.js +28 -0
- package/dist/craft-pre-release.sh +2 -0
- package/dist/lib/Steps/Initial.js +2 -12
- package/dist/lib/Steps/Initial.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +2 -2
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/templates.js +1 -1
- package/dist/src/nextjs/templates.js.map +1 -1
- package/dist/src/nuxt/sdk-setup.js +59 -14
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/run.js +2 -18
- package/dist/src/run.js.map +1 -1
- package/dist/src/telemetry.js +2 -16
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +16 -0
- package/dist/src/utils/clack-utils.js +57 -46
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +7 -0
- package/dist/src/version.js.map +1 -0
- package/dist/test/apple/xcode-manager.test.js +1 -2
- package/dist/test/apple/xcode-manager.test.js.map +1 -1
- package/dist/test/nextjs/templates.test.js +4 -4
- package/dist/test/nextjs/templates.test.js.map +1 -1
- package/dist/test/utils/clack-utils.test.js +105 -0
- package/dist/test/utils/clack-utils.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -77,15 +77,36 @@ async function askDeploymentPlatform() {
|
|
|
77
77
|
}
|
|
78
78
|
exports.askDeploymentPlatform = askDeploymentPlatform;
|
|
79
79
|
async function addSDKModule(config, options, deploymentPlatform) {
|
|
80
|
+
const failureTagKey = 'modify-nuxt-config-error';
|
|
80
81
|
const shouldTopLevelImport = deploymentPlatform === 'vercel' || deploymentPlatform === 'netlify';
|
|
81
82
|
if (shouldTopLevelImport) {
|
|
82
83
|
clack.log.warn(`Sentry needs to be initialized before the application starts. ${chalk_1.default.cyan(`${deploymentPlatform
|
|
83
84
|
.charAt(0)
|
|
84
85
|
.toUpperCase()}${deploymentPlatform.slice(1)}`)} does not support this yet.\n\nWe will inject the Sentry server-side config at the top of your Nuxt server entry file instead.\n\nThis comes with some restrictions, for more info see:\n\n${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/nuxt/install/top-level-import/')} `);
|
|
85
86
|
}
|
|
87
|
+
let module;
|
|
86
88
|
try {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
module = await (0, magicast_1.loadFile)(config);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
if (e instanceof Error) {
|
|
93
|
+
if (e instanceof SyntaxError || e.message.includes('Unexpected token')) {
|
|
94
|
+
Sentry.setTag(failureTagKey, 'loadFile-failed-syntax-error');
|
|
95
|
+
}
|
|
96
|
+
else if (e.message.includes('ENOENT') ||
|
|
97
|
+
e.message.includes('no such file')) {
|
|
98
|
+
Sentry.setTag(failureTagKey, 'loadFile-failed-file-not-found');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
Sentry.setTag(failureTagKey, 'loadFile-failed');
|
|
103
|
+
}
|
|
104
|
+
clack.log.error(`Error while loading Nuxt config file: ${e instanceof Error ? e.message : 'Unknown'}`);
|
|
105
|
+
showFallbackInstructions(config, options, shouldTopLevelImport);
|
|
106
|
+
throw e;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
(0, helpers_1.addNuxtModule)(module, '@sentry/nuxt/module', 'sentry', {
|
|
89
110
|
sourceMapsUploadOptions: {
|
|
90
111
|
org: options.org,
|
|
91
112
|
project: options.project,
|
|
@@ -95,27 +116,51 @@ async function addSDKModule(config, options, deploymentPlatform) {
|
|
|
95
116
|
autoInjectServerSentry: 'top-level-import',
|
|
96
117
|
}),
|
|
97
118
|
});
|
|
98
|
-
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
Sentry.setTag(failureTagKey, 'adding-sentry-options-failed');
|
|
122
|
+
clack.log.error(`Error while modifying 'sentry' in Nuxt config: ${e instanceof Error ? e.message : 'Unknown'}`);
|
|
123
|
+
showFallbackInstructions(config, options, shouldTopLevelImport);
|
|
124
|
+
throw e;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
(0, helpers_1.addNuxtModule)(module, '@sentry/nuxt/module', 'sourcemap', {
|
|
99
128
|
client: 'hidden',
|
|
100
129
|
});
|
|
101
|
-
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
Sentry.setTag(failureTagKey, 'adding-sourcemap-options-failed');
|
|
133
|
+
clack.log.error(`Error while modifying 'sourcemap' in Nuxt config: ${e instanceof Error ? e.message : 'Unknown'}`);
|
|
134
|
+
showFallbackInstructions(config, options, shouldTopLevelImport);
|
|
135
|
+
throw e;
|
|
136
|
+
}
|
|
137
|
+
let code;
|
|
138
|
+
try {
|
|
139
|
+
({ code } = (0, magicast_1.generateCode)(module));
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
Sentry.setTag(failureTagKey, 'generateCode-failed');
|
|
143
|
+
clack.log.error(`Error while generating module code: ${e instanceof Error ? e.message : 'Unknown'}`);
|
|
144
|
+
showFallbackInstructions(config, options, shouldTopLevelImport);
|
|
145
|
+
throw e;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
102
148
|
await node_fs_1.default.promises.writeFile(config, code, { encoding: 'utf-8', flag: 'w' });
|
|
103
149
|
clack.log.success(`Added Sentry Nuxt Module to ${chalk_1.default.cyan(node_path_1.default.basename(config))}.`);
|
|
104
150
|
}
|
|
105
151
|
catch (e) {
|
|
106
|
-
|
|
107
|
-
clack.log.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
? e
|
|
111
|
-
: 'Unknown error'));
|
|
112
|
-
Sentry.captureException('Error while setting up the Nuxt Module in nuxt config');
|
|
113
|
-
clack.log.warn(`Please add the following settings to ${chalk_1.default.cyan(node_path_1.default.basename(config))}:`);
|
|
114
|
-
// eslint-disable-next-line no-console
|
|
115
|
-
console.log(`\n\n${(0, templates_1.getNuxtModuleFallbackTemplate)(options, shouldTopLevelImport)}\n\n`);
|
|
152
|
+
Sentry.setTag(failureTagKey, 'writeFile-failed');
|
|
153
|
+
clack.log.error(`Error while writing Nuxt config: ${e instanceof Error ? e.message : 'Unknown'}`);
|
|
154
|
+
showFallbackInstructions(config, options, shouldTopLevelImport);
|
|
155
|
+
throw e;
|
|
116
156
|
}
|
|
117
157
|
}
|
|
118
158
|
exports.addSDKModule = addSDKModule;
|
|
159
|
+
function showFallbackInstructions(config, options, shouldTopLevelImport) {
|
|
160
|
+
clack.log.warn(`Please add the following settings to ${chalk_1.default.cyan(node_path_1.default.basename(config))}:`);
|
|
161
|
+
// eslint-disable-next-line no-console
|
|
162
|
+
console.log(`\n\n${(0, templates_1.getNuxtModuleFallbackTemplate)(options, shouldTopLevelImport)}\n\n`);
|
|
163
|
+
}
|
|
119
164
|
async function createConfigFiles(dsn) {
|
|
120
165
|
const selectedFeatures = await (0, clack_utils_1.featureSelectionPrompt)([
|
|
121
166
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/nuxt/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, loadFile } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { addNuxtModule } from 'magicast/helpers';\nimport opn from 'opn';\nimport { type SemVer, lt } from 'semver';\nimport { traceStep } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldAddPackageOverride,\n askShouldInstallPackage,\n featureSelectionPrompt,\n installPackage,\n isUsingTypeScript,\n} from '../utils/clack-utils';\nimport {\n type PackageDotJson,\n hasPackageInstalled,\n} from '../utils/package-json';\nimport { PNPM, type PackageManager } from '../utils/package-manager';\nimport {\n getConfigBody,\n getDefaultNuxtConfig,\n getNuxtModuleFallbackTemplate,\n getSentryConfigContents,\n} from './templates';\nimport { type DeploymentPlatform, deploymentPlatforms } from './types';\n\nconst possibleNuxtConfig = [\n 'nuxt.config.js',\n 'nuxt.config.mjs',\n 'nuxt.config.cjs',\n 'nuxt.config.ts',\n 'nuxt.config.mts',\n 'nuxt.config.cts',\n];\n\nexport async function getNuxtConfig(): Promise<string> {\n let configFile = possibleNuxtConfig.find((fileName) =>\n fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!configFile) {\n clack.log.info('No Nuxt config file found, creating a new one.');\n Sentry.setTag('nuxt-config-strategy', 'create');\n // nuxt recommends its config to be .ts by default\n configFile = 'nuxt.config.ts';\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFile),\n getDefaultNuxtConfig(),\n { encoding: 'utf-8', flag: 'w' },\n );\n\n clack.log.success(`Created ${chalk.cyan('nuxt.config.ts')}.`);\n }\n\n return path.join(process.cwd(), configFile);\n}\n\nexport async function askDeploymentPlatform(): Promise<\n DeploymentPlatform | symbol\n> {\n return await abortIfCancelled(\n clack.select({\n message: 'Please select your deployment platform.',\n options: deploymentPlatforms.map((platform) => ({\n value: platform,\n label: `${platform.charAt(0).toUpperCase()}${platform.slice(1)}`,\n })),\n }),\n );\n}\n\nexport async function addSDKModule(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n deploymentPlatform: DeploymentPlatform | symbol,\n): Promise<void> {\n const shouldTopLevelImport =\n deploymentPlatform === 'vercel' || deploymentPlatform === 'netlify';\n\n if (shouldTopLevelImport) {\n clack.log.warn(\n `Sentry needs to be initialized before the application starts. ${chalk.cyan(\n `${deploymentPlatform\n .charAt(0)\n .toUpperCase()}${deploymentPlatform.slice(1)}`,\n )} does not support this yet.\\n\\nWe will inject the Sentry server-side config at the top of your Nuxt server entry file instead.\\n\\nThis comes with some restrictions, for more info see:\\n\\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/top-level-import/',\n )} `,\n );\n }\n\n try {\n const mod = await loadFile(config);\n\n addNuxtModule(mod, '@sentry/nuxt/module', 'sentry', {\n sourceMapsUploadOptions: {\n org: options.org,\n project: options.project,\n ...(options.selfHosted && { url: options.url }),\n },\n ...(shouldTopLevelImport && {\n autoInjectServerSentry: 'top-level-import',\n }),\n });\n addNuxtModule(mod, '@sentry/nuxt/module', 'sourcemap', {\n client: 'hidden',\n });\n\n const { code } = generateCode(mod);\n\n await fs.promises.writeFile(config, code, { encoding: 'utf-8', flag: 'w' });\n\n clack.log.success(\n `Added Sentry Nuxt Module to ${chalk.cyan(path.basename(config))}.`,\n );\n } catch (e: unknown) {\n clack.log.error(\n 'Error while adding the Sentry Nuxt Module to the Nuxt config.',\n );\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 setting up the Nuxt Module in nuxt config',\n );\n\n clack.log.warn(\n `Please add the following settings to ${chalk.cyan(\n path.basename(config),\n )}:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n `\\n\\n${getNuxtModuleFallbackTemplate(options, shouldTopLevelImport)}\\n\\n`,\n );\n }\n}\n\nexport async function createConfigFiles(dsn: string) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(dsn, configVariant, selectedFeatures),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created new ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n } else {\n clack.log.info(\n `Okay, here are the changes your ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )} should contain:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n '\\n\\n ' +\n getConfigBody(dsn, configVariant, selectedFeatures) +\n '\\n\\n',\n );\n }\n });\n }\n}\n\nexport async function addNuxtOverrides(\n packageJson: PackageDotJson,\n packageManager: PackageManager,\n nuxtMinVer: SemVer | null,\n forceInstall?: boolean,\n) {\n const isPNPM = PNPM.detect();\n\n const overrides = [\n {\n pkgName: '@vercel/nft',\n pkgVersion: '^0.27.4',\n },\n ...(nuxtMinVer && lt(nuxtMinVer, '3.14.0')\n ? [{ pkgName: 'ofetch', pkgVersion: '^1.4.0' }]\n : []),\n ];\n\n clack.log.warn(\n `To ensure Sentry can properly instrument your code it needs to add version overrides for some Nuxt dependencies${\n isPNPM ? ` and install ${chalk.cyan('import-in-the-middle')}.` : '.'\n }\\n\\nFor more info see: ${chalk.underline(\n 'https://github.com/getsentry/sentry-javascript/issues/14514',\n )}${\n isPNPM\n ? `\\n\\nand ${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle',\n )}`\n : ''\n }`,\n );\n\n for (const { pkgName, pkgVersion } of overrides) {\n const shouldAddOverride = await askShouldAddPackageOverride(\n pkgName,\n pkgVersion,\n );\n\n if (shouldAddOverride) {\n await packageManager.addOverride(pkgName, pkgVersion);\n }\n }\n\n if (PNPM.detect()) {\n // For pnpm, we want to install iitm\n // See: https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle\n const iitmAlreadyInstalled = hasPackageInstalled(\n 'import-in-the-middle',\n packageJson,\n );\n Sentry.setTag('iitm-already-installed', iitmAlreadyInstalled);\n\n const shouldInstallIitm = await askShouldInstallPackage(\n 'import-in-the-middle',\n );\n\n if (shouldInstallIitm) {\n await installPackage({\n packageName: 'import-in-the-middle',\n alreadyInstalled: iitmAlreadyInstalled,\n packageManager,\n forceInstall,\n });\n }\n }\n}\n\nexport async function confirmReadImportDocs(\n deploymentPlatform: DeploymentPlatform | symbol,\n) {\n const canImportSentryServerConfigFile =\n deploymentPlatform !== 'vercel' && deploymentPlatform !== 'netlify';\n\n if (!canImportSentryServerConfigFile) {\n // Nothing to do, users have been set up with automatic top-level-import instead\n return;\n }\n\n const docsUrl =\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/cli-import/#initializing-sentry-with---import';\n\n clack.log.info(\n `After building your Nuxt app, you need to ${chalk.bold(\n '--import',\n )} the Sentry server config file when running your app.\\n\\nFor more info, see:\\n\\n${chalk.underline(\n docsUrl,\n )}`,\n );\n\n const shouldOpenDocs = await abortIfCancelled(\n clack.confirm({ message: 'Do you want to open the docs?' }),\n );\n\n Sentry.setTag('init-with-import-docs-opened', shouldOpenDocs);\n\n if (shouldOpenDocs) {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n const noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n opn(docsUrl, { wait: false }).then((cp) => cp.on('error', noop), noop);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-setup.js","sourceRoot":"","sources":["../../../src/nuxt/sdk-setup.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport * as Sentry from '@sentry/node';\nimport chalk from 'chalk';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { generateCode, loadFile } from 'magicast';\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { addNuxtModule } from 'magicast/helpers';\nimport opn from 'opn';\nimport { type SemVer, lt } from 'semver';\nimport { traceStep } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldAddPackageOverride,\n askShouldInstallPackage,\n featureSelectionPrompt,\n installPackage,\n isUsingTypeScript,\n} from '../utils/clack-utils';\nimport {\n type PackageDotJson,\n hasPackageInstalled,\n} from '../utils/package-json';\nimport { PNPM, type PackageManager } from '../utils/package-manager';\nimport {\n getConfigBody,\n getDefaultNuxtConfig,\n getNuxtModuleFallbackTemplate,\n getSentryConfigContents,\n} from './templates';\nimport { type DeploymentPlatform, deploymentPlatforms } from './types';\n\nconst possibleNuxtConfig = [\n 'nuxt.config.js',\n 'nuxt.config.mjs',\n 'nuxt.config.cjs',\n 'nuxt.config.ts',\n 'nuxt.config.mts',\n 'nuxt.config.cts',\n];\n\nexport async function getNuxtConfig(): Promise<string> {\n let configFile = possibleNuxtConfig.find((fileName) =>\n fs.existsSync(path.join(process.cwd(), fileName)),\n );\n\n if (!configFile) {\n clack.log.info('No Nuxt config file found, creating a new one.');\n Sentry.setTag('nuxt-config-strategy', 'create');\n // nuxt recommends its config to be .ts by default\n configFile = 'nuxt.config.ts';\n\n await fs.promises.writeFile(\n path.join(process.cwd(), configFile),\n getDefaultNuxtConfig(),\n { encoding: 'utf-8', flag: 'w' },\n );\n\n clack.log.success(`Created ${chalk.cyan('nuxt.config.ts')}.`);\n }\n\n return path.join(process.cwd(), configFile);\n}\n\nexport async function askDeploymentPlatform(): Promise<\n DeploymentPlatform | symbol\n> {\n return await abortIfCancelled(\n clack.select({\n message: 'Please select your deployment platform.',\n options: deploymentPlatforms.map((platform) => ({\n value: platform,\n label: `${platform.charAt(0).toUpperCase()}${platform.slice(1)}`,\n })),\n }),\n );\n}\n\nexport async function addSDKModule(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n deploymentPlatform: DeploymentPlatform | symbol,\n): Promise<void> {\n const failureTagKey = 'modify-nuxt-config-error';\n\n const shouldTopLevelImport =\n deploymentPlatform === 'vercel' || deploymentPlatform === 'netlify';\n\n if (shouldTopLevelImport) {\n clack.log.warn(\n `Sentry needs to be initialized before the application starts. ${chalk.cyan(\n `${deploymentPlatform\n .charAt(0)\n .toUpperCase()}${deploymentPlatform.slice(1)}`,\n )} does not support this yet.\\n\\nWe will inject the Sentry server-side config at the top of your Nuxt server entry file instead.\\n\\nThis comes with some restrictions, for more info see:\\n\\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/top-level-import/',\n )} `,\n );\n }\n\n let module;\n\n try {\n module = await loadFile(config);\n } catch (e) {\n if (e instanceof Error) {\n if (e instanceof SyntaxError || e.message.includes('Unexpected token')) {\n Sentry.setTag(failureTagKey, 'loadFile-failed-syntax-error');\n } else if (\n e.message.includes('ENOENT') ||\n e.message.includes('no such file')\n ) {\n Sentry.setTag(failureTagKey, 'loadFile-failed-file-not-found');\n }\n } else {\n Sentry.setTag(failureTagKey, 'loadFile-failed');\n }\n\n clack.log.error(\n `Error while loading Nuxt config file: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n addNuxtModule(module, '@sentry/nuxt/module', 'sentry', {\n sourceMapsUploadOptions: {\n org: options.org,\n project: options.project,\n ...(options.selfHosted && { url: options.url }),\n },\n ...(shouldTopLevelImport && {\n autoInjectServerSentry: 'top-level-import',\n }),\n });\n } catch (e) {\n Sentry.setTag(failureTagKey, 'adding-sentry-options-failed');\n\n clack.log.error(\n `Error while modifying 'sentry' in Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n addNuxtModule(module, '@sentry/nuxt/module', 'sourcemap', {\n client: 'hidden',\n });\n } catch (e) {\n Sentry.setTag(failureTagKey, 'adding-sourcemap-options-failed');\n\n clack.log.error(\n `Error while modifying 'sourcemap' in Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n let code;\n\n try {\n ({ code } = generateCode(module));\n } catch (e) {\n Sentry.setTag(failureTagKey, 'generateCode-failed');\n\n clack.log.error(\n `Error while generating module code: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n\n try {\n await fs.promises.writeFile(config, code, { encoding: 'utf-8', flag: 'w' });\n\n clack.log.success(\n `Added Sentry Nuxt Module to ${chalk.cyan(path.basename(config))}.`,\n );\n } catch (e: unknown) {\n Sentry.setTag(failureTagKey, 'writeFile-failed');\n\n clack.log.error(\n `Error while writing Nuxt config: ${\n e instanceof Error ? e.message : 'Unknown'\n }`,\n );\n\n showFallbackInstructions(config, options, shouldTopLevelImport);\n throw e;\n }\n}\n\nfunction showFallbackInstructions(\n config: string,\n options: { org: string; project: string; url: string; selfHosted: boolean },\n shouldTopLevelImport: boolean,\n) {\n clack.log.warn(\n `Please add the following settings to ${chalk.cyan(\n path.basename(config),\n )}:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n `\\n\\n${getNuxtModuleFallbackTemplate(options, shouldTopLevelImport)}\\n\\n`,\n );\n}\n\nexport async function createConfigFiles(dsn: string) {\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n const typeScriptDetected = isUsingTypeScript();\n\n const configVariants = ['server', 'client'] as const;\n\n for (const configVariant of configVariants) {\n await traceStep(`create-sentry-${configVariant}-config`, async () => {\n const jsConfig = `sentry.${configVariant}.config.js`;\n const tsConfig = `sentry.${configVariant}.config.ts`;\n\n const jsConfigExists = fs.existsSync(path.join(process.cwd(), jsConfig));\n const tsConfigExists = fs.existsSync(path.join(process.cwd(), tsConfig));\n\n let shouldWriteFile = true;\n\n if (jsConfigExists || tsConfigExists) {\n const existingConfigs = [];\n\n if (jsConfigExists) {\n existingConfigs.push(jsConfig);\n }\n\n if (tsConfigExists) {\n existingConfigs.push(tsConfig);\n }\n\n const overwriteExistingConfigs = await abortIfCancelled(\n clack.confirm({\n message: `Found existing Sentry ${configVariant} config (${existingConfigs.join(\n ', ',\n )}). Overwrite ${existingConfigs.length > 1 ? 'them' : 'it'}?`,\n }),\n );\n Sentry.setTag(\n `overwrite-${configVariant}-config`,\n overwriteExistingConfigs,\n );\n\n shouldWriteFile = overwriteExistingConfigs;\n\n if (overwriteExistingConfigs) {\n if (jsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), jsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(jsConfig)}.`);\n }\n if (tsConfigExists) {\n fs.unlinkSync(path.join(process.cwd(), tsConfig));\n clack.log.warn(`Removed existing ${chalk.cyan(tsConfig)}.`);\n }\n }\n }\n\n if (shouldWriteFile) {\n await fs.promises.writeFile(\n path.join(process.cwd(), typeScriptDetected ? tsConfig : jsConfig),\n getSentryConfigContents(dsn, configVariant, selectedFeatures),\n { encoding: 'utf8', flag: 'w' },\n );\n clack.log.success(\n `Created new ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )}.`,\n );\n Sentry.setTag(`created-${configVariant}-config`, true);\n } else {\n clack.log.info(\n `Okay, here are the changes your ${chalk.cyan(\n typeScriptDetected ? tsConfig : jsConfig,\n )} should contain:`,\n );\n // eslint-disable-next-line no-console\n console.log(\n '\\n\\n ' +\n getConfigBody(dsn, configVariant, selectedFeatures) +\n '\\n\\n',\n );\n }\n });\n }\n}\n\nexport async function addNuxtOverrides(\n packageJson: PackageDotJson,\n packageManager: PackageManager,\n nuxtMinVer: SemVer | null,\n forceInstall?: boolean,\n) {\n const isPNPM = PNPM.detect();\n\n const overrides = [\n {\n pkgName: '@vercel/nft',\n pkgVersion: '^0.27.4',\n },\n ...(nuxtMinVer && lt(nuxtMinVer, '3.14.0')\n ? [{ pkgName: 'ofetch', pkgVersion: '^1.4.0' }]\n : []),\n ];\n\n clack.log.warn(\n `To ensure Sentry can properly instrument your code it needs to add version overrides for some Nuxt dependencies${\n isPNPM ? ` and install ${chalk.cyan('import-in-the-middle')}.` : '.'\n }\\n\\nFor more info see: ${chalk.underline(\n 'https://github.com/getsentry/sentry-javascript/issues/14514',\n )}${\n isPNPM\n ? `\\n\\nand ${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle',\n )}`\n : ''\n }`,\n );\n\n for (const { pkgName, pkgVersion } of overrides) {\n const shouldAddOverride = await askShouldAddPackageOverride(\n pkgName,\n pkgVersion,\n );\n\n if (shouldAddOverride) {\n await packageManager.addOverride(pkgName, pkgVersion);\n }\n }\n\n if (PNPM.detect()) {\n // For pnpm, we want to install iitm\n // See: https://docs.sentry.io/platforms/javascript/guides/nuxt/troubleshooting/#pnpm-dev-cannot-find-package-import-in-the-middle\n const iitmAlreadyInstalled = hasPackageInstalled(\n 'import-in-the-middle',\n packageJson,\n );\n Sentry.setTag('iitm-already-installed', iitmAlreadyInstalled);\n\n const shouldInstallIitm = await askShouldInstallPackage(\n 'import-in-the-middle',\n );\n\n if (shouldInstallIitm) {\n await installPackage({\n packageName: 'import-in-the-middle',\n alreadyInstalled: iitmAlreadyInstalled,\n packageManager,\n forceInstall,\n });\n }\n }\n}\n\nexport async function confirmReadImportDocs(\n deploymentPlatform: DeploymentPlatform | symbol,\n) {\n const canImportSentryServerConfigFile =\n deploymentPlatform !== 'vercel' && deploymentPlatform !== 'netlify';\n\n if (!canImportSentryServerConfigFile) {\n // Nothing to do, users have been set up with automatic top-level-import instead\n return;\n }\n\n const docsUrl =\n 'https://docs.sentry.io/platforms/javascript/guides/nuxt/install/cli-import/#initializing-sentry-with---import';\n\n clack.log.info(\n `After building your Nuxt app, you need to ${chalk.bold(\n '--import',\n )} the Sentry server config file when running your app.\\n\\nFor more info, see:\\n\\n${chalk.underline(\n docsUrl,\n )}`,\n );\n\n const shouldOpenDocs = await abortIfCancelled(\n clack.confirm({ message: 'Do you want to open the docs?' }),\n );\n\n Sentry.setTag('init-with-import-docs-opened', shouldOpenDocs);\n\n if (shouldOpenDocs) {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n const noop = () => {}; // eslint-disable-line @typescript-eslint/no-empty-function\n opn(docsUrl, { wait: false }).then((cp) => cp.on('error', noop), noop);\n }\n}\n"]}
|
package/dist/src/run.js
CHANGED
|
@@ -38,7 +38,7 @@ const remix_wizard_1 = require("./remix/remix-wizard");
|
|
|
38
38
|
const sveltekit_wizard_1 = require("./sveltekit/sveltekit-wizard");
|
|
39
39
|
const sourcemaps_wizard_1 = require("./sourcemaps/sourcemaps-wizard");
|
|
40
40
|
const Env_1 = require("../lib/Helper/Env");
|
|
41
|
-
const
|
|
41
|
+
const version_1 = require("./version");
|
|
42
42
|
function preSelectedProjectArgsToObject(args) {
|
|
43
43
|
if (!args.preSelectedProject) {
|
|
44
44
|
return undefined;
|
|
@@ -71,7 +71,7 @@ async function run(argv) {
|
|
|
71
71
|
};
|
|
72
72
|
let integration = finalArgs.integration;
|
|
73
73
|
if (!integration) {
|
|
74
|
-
clack.intro(`Sentry Wizard ${
|
|
74
|
+
clack.intro(`Sentry Wizard ${version_1.WIZARD_VERSION}`);
|
|
75
75
|
integration = await (0, clack_utils_1.abortIfCancelled)(clack.select({
|
|
76
76
|
message: 'What do you want to set up?',
|
|
77
77
|
options: [
|
|
@@ -148,20 +148,4 @@ async function run(argv) {
|
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
exports.run = run;
|
|
151
|
-
/**
|
|
152
|
-
* TODO: replace with rollup replace whenever we switch to rollup
|
|
153
|
-
*/
|
|
154
|
-
function tryGetWizardVersion() {
|
|
155
|
-
let version = process.env.npm_package_version;
|
|
156
|
-
if (!version) {
|
|
157
|
-
try {
|
|
158
|
-
const wizardPkgJson = JSON.parse((0, node_fs_1.readFileSync)('../package.json', 'utf-8'));
|
|
159
|
-
version = wizardPkgJson.version;
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// ignore
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return version ?? '';
|
|
166
|
-
}
|
|
167
151
|
//# sourceMappingURL=run.js.map
|
package/dist/src/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yEAAyE;AACzE,sDAAwC;AACxC,qDAAuD;AACvD,4EAA0E;AAE1E,wCAAgD;AAEhD,6DAA4D;AAC5D,6DAA4D;AAC5D,uDAAsD;AACtD,0DAAyD;AACzD,oDAAmD;AACnD,uDAAsD;AACtD,mEAAkE;AAClE,sEAAqE;AACrE,2CAAoD;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { abortIfCancelled } from './utils/clack-utils';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\n\nimport { run as legacyRun } from '../lib/Setup';\nimport type { PreselectedProject, WizardOptions } from './utils/types';\nimport { runFlutterWizard } from './flutter/flutter-wizard';\nimport { runAndroidWizard } from './android/android-wizard';\nimport { runAppleWizard } from './apple/apple-wizard';\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport { runNuxtWizard } from './nuxt/nuxt-wizard';\nimport { runRemixWizard } from './remix/remix-wizard';\nimport { runSvelteKitWizard } from './sveltekit/sveltekit-wizard';\nimport { runSourcemapsWizard } from './sourcemaps/sourcemaps-wizard';\nimport { readEnvironment } from '../lib/Helper/Env';\nimport type { Platform } from '../lib/Constants';\nimport { WIZARD_VERSION } from './version';\n\ntype WizardIntegration =\n | 'reactNative'\n | 'flutter'\n | 'ios'\n | 'android'\n | 'cordova'\n | 'electron'\n | 'nextjs'\n | 'nuxt'\n | 'remix'\n | 'sveltekit'\n | 'sourcemaps';\n\ntype Args = {\n integration?: WizardIntegration;\n\n uninstall: boolean;\n signup: boolean;\n skipConnect: boolean;\n debug: boolean;\n quiet: boolean;\n disableTelemetry: boolean;\n promoCode?: string;\n preSelectedProject?: {\n authToken: string;\n selfHosted: boolean;\n dsn: string;\n projectId: string;\n projectSlug: string;\n projectName: string;\n orgId: string;\n orgName: string;\n orgSlug: string;\n };\n url?: string;\n platform?: Platform[];\n org?: string;\n project?: string;\n saas?: boolean;\n forceInstall?: boolean;\n};\n\nfunction preSelectedProjectArgsToObject(\n args: Args,\n): PreselectedProject | undefined {\n if (!args.preSelectedProject) {\n return undefined;\n }\n\n return {\n authToken: args.preSelectedProject.authToken,\n selfHosted: args.preSelectedProject.selfHosted,\n project: {\n id: args.preSelectedProject.projectId,\n keys: [\n {\n dsn: {\n public: args.preSelectedProject.dsn,\n },\n },\n ],\n organization: {\n id: args.preSelectedProject.orgId,\n name: args.preSelectedProject.orgName,\n slug: args.preSelectedProject.orgSlug,\n },\n slug: args.preSelectedProject.projectSlug,\n },\n };\n}\n\nexport async function run(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let integration = finalArgs.integration;\n if (!integration) {\n clack.intro(`Sentry Wizard ${WIZARD_VERSION}`);\n\n integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: 'reactNative', label: 'React Native' },\n { value: 'flutter', label: 'Flutter' },\n { value: 'ios', label: 'iOS' },\n { value: 'android', label: 'Android' },\n { value: 'cordova', label: 'Cordova' },\n { value: 'electron', label: 'Electron' },\n { value: 'nextjs', label: 'Next.js' },\n { value: 'nuxt', label: 'Nuxt' },\n { value: 'remix', label: 'Remix' },\n { value: 'sveltekit', label: 'SvelteKit' },\n { value: 'sourcemaps', label: 'Configure Source Maps Upload' },\n ],\n }),\n );\n\n if (!integration) {\n clack.log.error('No integration selected. Exiting.');\n return;\n }\n\n clack.outro(`Starting ${integration} setup`);\n }\n\n const wizardOptions: WizardOptions = {\n telemetryEnabled: !finalArgs.disableTelemetry,\n promoCode: finalArgs.promoCode,\n url: finalArgs.url,\n orgSlug: finalArgs.org,\n projectSlug: finalArgs.project,\n saas: finalArgs.saas,\n preSelectedProject: preSelectedProjectArgsToObject(finalArgs),\n forceInstall: finalArgs.forceInstall,\n };\n\n switch (integration) {\n case 'reactNative':\n await runReactNativeWizard({\n ...wizardOptions,\n uninstall: finalArgs.uninstall,\n });\n break;\n\n case 'flutter':\n await runFlutterWizard(wizardOptions);\n break;\n\n case 'ios':\n await runAppleWizard(wizardOptions);\n break;\n\n case 'android':\n await runAndroidWizard(wizardOptions);\n break;\n\n case 'nextjs':\n await runNextjsWizard(wizardOptions);\n break;\n\n case 'nuxt':\n await runNuxtWizard(wizardOptions);\n break;\n\n case 'remix':\n await runRemixWizard(wizardOptions);\n break;\n\n case 'sveltekit':\n await runSvelteKitWizard(wizardOptions);\n break;\n\n case 'sourcemaps':\n await runSourcemapsWizard(wizardOptions);\n break;\n\n case 'cordova':\n argv.integration = 'cordova';\n void legacyRun(argv);\n break;\n\n case 'electron':\n argv.integration = 'electron';\n void legacyRun(argv);\n break;\n\n default:\n clack.log.error('No setup wizard selected!');\n }\n}\n"]}
|
package/dist/src/telemetry.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.updateProgress = exports.traceStep = exports.withTelemetry = void 0;
|
|
4
4
|
const node_1 = require("@sentry/node");
|
|
5
|
-
const
|
|
6
|
-
const node_path_1 = require("node:path");
|
|
5
|
+
const version_1 = require("./version");
|
|
7
6
|
async function withTelemetry(options, callback) {
|
|
8
7
|
const { sentryHub, sentryClient } = createSentryInstance(options.enabled, options.integration);
|
|
9
8
|
(0, node_1.makeMain)(sentryHub);
|
|
@@ -42,26 +41,13 @@ async function withTelemetry(options, callback) {
|
|
|
42
41
|
}
|
|
43
42
|
exports.withTelemetry = withTelemetry;
|
|
44
43
|
function createSentryInstance(enabled, integration) {
|
|
45
|
-
let version = process.env.npm_package_version;
|
|
46
|
-
if (!version) {
|
|
47
|
-
try {
|
|
48
|
-
const pathToPackageJson = (0, node_path_1.join)((0, node_path_1.dirname)(require.resolve('@sentry/wizard')), '..', 'package.json');
|
|
49
|
-
const packageJsonData = (0, node_fs_1.readFileSync)(pathToPackageJson, 'utf-8');
|
|
50
|
-
const parsedPackageJson = JSON.parse(packageJsonData);
|
|
51
|
-
version = parsedPackageJson.version;
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
// If we fail to read the package.json file, we don't want to crash the wizard
|
|
55
|
-
// so we just don't set the version
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
44
|
const client = new node_1.NodeClient({
|
|
59
45
|
dsn: 'https://8871d3ff64814ed8960c96d1fcc98a27@o1.ingest.sentry.io/4505425820712960',
|
|
60
46
|
enabled: enabled,
|
|
61
47
|
environment: `production-${integration}`,
|
|
62
48
|
tracesSampleRate: 1,
|
|
63
49
|
sampleRate: 1,
|
|
64
|
-
release:
|
|
50
|
+
release: version_1.WIZARD_VERSION,
|
|
65
51
|
integrations: [new node_1.Integrations.Http()],
|
|
66
52
|
tracePropagationTargets: [/^https:\/\/sentry.io\//],
|
|
67
53
|
stackParser: node_1.defaultStackParser,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":";;;AAAA,uCAYsB;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Hub,\n Integrations,\n NodeClient,\n type Span,\n defaultStackParser,\n flush,\n makeMain,\n makeNodeTransport,\n runWithAsyncContext,\n setTag,\n startSpan,\n} 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 { sentryHub, sentryClient } = createSentryInstance(\n options.enabled,\n options.integration,\n );\n\n makeMain(sentryHub);\n\n const sentrySession = sentryHub.startSession();\n sentryHub.captureSession();\n\n // Set tag for passed CLI args\n sentryHub.setTag('args.project', !!options.wizardOptions.projectSlug);\n sentryHub.setTag('args.org', !!options.wizardOptions.orgSlug);\n sentryHub.setTag('args.saas', !!options.wizardOptions.saas);\n\n try {\n return await startSpan(\n {\n name: 'sentry-wizard-execution',\n status: 'ok',\n op: 'wizard.flow',\n },\n async () => {\n updateProgress('start');\n const res = await runWithAsyncContext(callback);\n updateProgress('finished');\n\n return res;\n },\n );\n } catch (e) {\n sentryHub.captureException('Error during wizard execution.');\n sentrySession.status = 'crashed';\n throw e;\n } finally {\n sentryHub.endSession();\n await sentryClient.flush(3000).then(null, () => {\n // If telemetry flushing fails we generally don't care\n });\n await flush(3000).then(null, () => {\n // If telemetry flushing fails we generally don't care\n });\n }\n}\n\nfunction createSentryInstance(enabled: boolean, integration: string) {\n const client = new NodeClient({\n dsn: 'https://8871d3ff64814ed8960c96d1fcc98a27@o1.ingest.sentry.io/4505425820712960',\n enabled: enabled,\n\n environment: `production-${integration}`,\n\n tracesSampleRate: 1,\n sampleRate: 1,\n\n release: WIZARD_VERSION,\n integrations: [new Integrations.Http()],\n tracePropagationTargets: [/^https:\\/\\/sentry.io\\//],\n\n stackParser: defaultStackParser,\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 transport: makeNodeTransport,\n\n debug: true,\n });\n\n const hub = new Hub(client);\n\n hub.setTag('integration', integration);\n hub.setTag('node', process.version);\n hub.setTag('platform', process.platform);\n\n return { sentryHub: hub, sentryClient: client };\n}\n\nexport function traceStep<T>(\n step: string,\n callback: (span: Span | undefined) => T,\n): T {\n updateProgress(step);\n return startSpan({ name: step, op: 'wizard.step' }, (span) => callback(span));\n}\n\nexport function updateProgress(step: string) {\n setTag('progress', step);\n}\n"]}
|
|
@@ -4,6 +4,12 @@ import type { Feature, SentryProjectData, WizardOptions } from './types';
|
|
|
4
4
|
export declare const SENTRY_DOT_ENV_FILE = ".env.sentry-build-plugin";
|
|
5
5
|
export declare const SENTRY_CLI_RC_FILE = ".sentryclirc";
|
|
6
6
|
export declare const SENTRY_PROPERTIES_FILE = "sentry.properties";
|
|
7
|
+
interface WizardProjectData {
|
|
8
|
+
apiKeys?: {
|
|
9
|
+
token?: string;
|
|
10
|
+
};
|
|
11
|
+
projects?: SentryProjectData[];
|
|
12
|
+
}
|
|
7
13
|
export interface CliSetupConfig {
|
|
8
14
|
filename: string;
|
|
9
15
|
name: string;
|
|
@@ -100,6 +106,16 @@ export declare function getOrAskForProjectData(options: WizardOptions, platform?
|
|
|
100
106
|
selectedProject: SentryProjectData;
|
|
101
107
|
authToken: string;
|
|
102
108
|
}>;
|
|
109
|
+
/**
|
|
110
|
+
* Exported for testing
|
|
111
|
+
*/
|
|
112
|
+
export declare function askForWizardLogin(options: {
|
|
113
|
+
url: string;
|
|
114
|
+
promoCode?: string;
|
|
115
|
+
platform?: 'javascript-nextjs' | 'javascript-nuxt' | 'javascript-remix' | 'javascript-sveltekit' | 'apple-ios' | 'android' | 'react-native' | 'flutter';
|
|
116
|
+
orgSlug?: string;
|
|
117
|
+
projectSlug?: string;
|
|
118
|
+
}): Promise<WizardProjectData>;
|
|
103
119
|
/**
|
|
104
120
|
* Asks users if they have a config file for @param tool (e.g. Vite).
|
|
105
121
|
* If yes, asks users to specify the path to their config file.
|
|
@@ -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.askShouldAddPackageOverride = exports.askShouldInstallPackage = exports.featureSelectionPrompt = exports.askShouldCreateExampleComponent = exports.askShouldCreateExamplePage = exports.createNewConfigFile = exports.makeCodeSnippet = exports.showCopyPasteInstructions = exports.askForToolConfigPath = 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.getUncommittedOrUntrackedFiles = exports.isInGitRepo = 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.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.getUncommittedOrUntrackedFiles = exports.isInGitRepo = 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 os = __importStar(require("node:os"));
|
|
@@ -44,6 +44,7 @@ const debug_1 = require("./debug");
|
|
|
44
44
|
const package_json_1 = require("./package-json");
|
|
45
45
|
const package_manager_1 = require("./package-manager");
|
|
46
46
|
const semver_1 = require("./semver");
|
|
47
|
+
const version_1 = require("../version");
|
|
47
48
|
exports.SENTRY_DOT_ENV_FILE = '.env.sentry-build-plugin';
|
|
48
49
|
exports.SENTRY_CLI_RC_FILE = '.sentryclirc';
|
|
49
50
|
exports.SENTRY_PROPERTIES_FILE = 'sentry.properties';
|
|
@@ -96,7 +97,10 @@ async function abort(message, status) {
|
|
|
96
97
|
clack.outro(message ?? 'Wizard setup cancelled.');
|
|
97
98
|
const sentryHub = Sentry.getCurrentHub();
|
|
98
99
|
const sentryTransaction = sentryHub.getScope().getTransaction();
|
|
99
|
-
|
|
100
|
+
// 'cancelled' doesn't increase the `failureRate()` shown in the Sentry UI
|
|
101
|
+
// 'aborted' increases the failure rate
|
|
102
|
+
// see: https://docs.sentry.io/product/insights/overview/metrics/#failure-rate
|
|
103
|
+
sentryTransaction?.setStatus(status === 0 ? 'cancelled' : 'aborted');
|
|
100
104
|
sentryTransaction?.finish();
|
|
101
105
|
const sentrySession = sentryHub.getScope().getSession();
|
|
102
106
|
if (sentrySession) {
|
|
@@ -124,15 +128,6 @@ async function abortIfCancelled(input) {
|
|
|
124
128
|
}
|
|
125
129
|
exports.abortIfCancelled = abortIfCancelled;
|
|
126
130
|
function printWelcome(options) {
|
|
127
|
-
let wizardVersion = process.env.npm_package_version;
|
|
128
|
-
if (!wizardVersion) {
|
|
129
|
-
try {
|
|
130
|
-
wizardVersion = JSON.parse(fs.readFileSync((0, node_path_1.join)((0, node_path_1.dirname)(require.resolve('@sentry/wizard')), '..', 'package.json'), 'utf-8')).version;
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// We don't need to have this
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
131
|
// eslint-disable-next-line no-console
|
|
137
132
|
console.log('');
|
|
138
133
|
clack.intro(chalk_1.default.inverse(` ${options.wizardName} `));
|
|
@@ -141,9 +136,7 @@ function printWelcome(options) {
|
|
|
141
136
|
if (options.promoCode) {
|
|
142
137
|
welcomeText = `${welcomeText}\n\nUsing promo-code: ${options.promoCode}`;
|
|
143
138
|
}
|
|
144
|
-
|
|
145
|
-
welcomeText = `${welcomeText}\n\nVersion: ${wizardVersion}`;
|
|
146
|
-
}
|
|
139
|
+
welcomeText = `${welcomeText}\n\nVersion: ${version_1.WIZARD_VERSION}`;
|
|
147
140
|
if (options.telemetryEnabled) {
|
|
148
141
|
welcomeText = `${welcomeText}
|
|
149
142
|
|
|
@@ -681,44 +674,31 @@ async function askForSelfHosted(urlFromArgs, saas) {
|
|
|
681
674
|
Sentry.setTag('self-hosted', isSelfHostedUrl);
|
|
682
675
|
return { url: validUrl, selfHosted: true };
|
|
683
676
|
}
|
|
677
|
+
/**
|
|
678
|
+
* Exported for testing
|
|
679
|
+
*/
|
|
684
680
|
async function askForWizardLogin(options) {
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
hasSentryAccount = await abortIfCancelled(hasSentryAccount);
|
|
681
|
+
const { orgSlug, projectSlug, url, platform, promoCode } = options;
|
|
682
|
+
Sentry.setTag('has-promo-code', !!promoCode);
|
|
683
|
+
const projectAndOrgPreselected = !!(orgSlug && projectSlug);
|
|
684
|
+
const hasSentryAccount = projectAndOrgPreselected || (await askHasSentryAccount());
|
|
690
685
|
Sentry.setTag('already-has-sentry-account', hasSentryAccount);
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
catch (e) {
|
|
696
|
-
if (options.url !== SAAS_URL) {
|
|
697
|
-
clack.log.error('Loading Wizard failed. Did you provide the right URL?');
|
|
698
|
-
clack.log.info(JSON.stringify(e, null, 2));
|
|
699
|
-
await abort(chalk_1.default.red('Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues'));
|
|
700
|
-
}
|
|
701
|
-
else {
|
|
702
|
-
clack.log.error('Loading Wizard failed.');
|
|
703
|
-
clack.log.info(JSON.stringify(e, null, 2));
|
|
704
|
-
await abort(chalk_1.default.red('Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues'));
|
|
705
|
-
}
|
|
686
|
+
const wizardHash = await makeInitialWizardHashRequest(url);
|
|
687
|
+
const loginUrl = new node_url_1.URL(`${url}account/settings/wizard/${wizardHash}/`);
|
|
688
|
+
if (orgSlug) {
|
|
689
|
+
loginUrl.searchParams.set('org_slug', orgSlug);
|
|
706
690
|
}
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
loginUrl.searchParams.set('org_slug', options.orgSlug);
|
|
710
|
-
}
|
|
711
|
-
if (options.projectSlug) {
|
|
712
|
-
loginUrl.searchParams.set('project_slug', options.projectSlug);
|
|
691
|
+
if (projectSlug) {
|
|
692
|
+
loginUrl.searchParams.set('project_slug', projectSlug);
|
|
713
693
|
}
|
|
714
694
|
if (!hasSentryAccount) {
|
|
715
695
|
loginUrl.searchParams.set('signup', '1');
|
|
716
696
|
}
|
|
717
|
-
if (
|
|
718
|
-
loginUrl.searchParams.set('project_platform',
|
|
697
|
+
if (platform) {
|
|
698
|
+
loginUrl.searchParams.set('project_platform', platform);
|
|
719
699
|
}
|
|
720
|
-
if (
|
|
721
|
-
loginUrl.searchParams.set('code',
|
|
700
|
+
if (promoCode) {
|
|
701
|
+
loginUrl.searchParams.set('code', promoCode);
|
|
722
702
|
}
|
|
723
703
|
const urlToOpen = loginUrl.toString();
|
|
724
704
|
clack.log.info(`${chalk_1.default.bold(`If the browser window didn't open automatically, please open the following link to ${hasSentryAccount ? 'log' : 'sign'} into Sentry:`)}\n\n${chalk_1.default.cyan(urlToOpen)}`);
|
|
@@ -730,7 +710,7 @@ async function askForWizardLogin(options) {
|
|
|
730
710
|
const data = await new Promise((resolve) => {
|
|
731
711
|
const pollingInterval = (0, node_timers_1.setInterval)(() => {
|
|
732
712
|
axios_1.default
|
|
733
|
-
.get(`${
|
|
713
|
+
.get(`${url}api/0/wizard/${wizardHash}/`, {
|
|
734
714
|
headers: {
|
|
735
715
|
'Accept-Encoding': 'deflate',
|
|
736
716
|
},
|
|
@@ -739,7 +719,7 @@ async function askForWizardLogin(options) {
|
|
|
739
719
|
resolve(result.data);
|
|
740
720
|
clearTimeout(timeout);
|
|
741
721
|
clearInterval(pollingInterval);
|
|
742
|
-
void axios_1.default.delete(`${
|
|
722
|
+
void axios_1.default.delete(`${url}api/0/wizard/${wizardHash}/`);
|
|
743
723
|
})
|
|
744
724
|
.catch(() => {
|
|
745
725
|
// noop - just try again
|
|
@@ -756,6 +736,37 @@ async function askForWizardLogin(options) {
|
|
|
756
736
|
Sentry.setTag('opened-wizard-link', true);
|
|
757
737
|
return data;
|
|
758
738
|
}
|
|
739
|
+
exports.askForWizardLogin = askForWizardLogin;
|
|
740
|
+
/**
|
|
741
|
+
* This first request to Sentry creates a cache on the Sentry backend whose key is returned.
|
|
742
|
+
* We use this key later on to poll for the actual project data.
|
|
743
|
+
*/
|
|
744
|
+
async function makeInitialWizardHashRequest(url) {
|
|
745
|
+
const reqUrl = `${url}api/0/wizard/`;
|
|
746
|
+
try {
|
|
747
|
+
return (await axios_1.default.get(reqUrl)).data.hash;
|
|
748
|
+
}
|
|
749
|
+
catch (e) {
|
|
750
|
+
if (url !== SAAS_URL) {
|
|
751
|
+
clack.log.error(`Loading Wizard failed. Did you provide the right URL? (url: ${reqUrl})`);
|
|
752
|
+
clack.log.info(JSON.stringify(e, null, 2));
|
|
753
|
+
await abort(chalk_1.default.red('Please check your configuration and try again.\n\n Let us know if you think this is an issue with the wizard or Sentry: https://github.com/getsentry/sentry-wizard/issues'));
|
|
754
|
+
}
|
|
755
|
+
else {
|
|
756
|
+
clack.log.error('Loading Wizard failed.');
|
|
757
|
+
clack.log.info(JSON.stringify(e, null, 2));
|
|
758
|
+
await abort(chalk_1.default.red('Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues'));
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
// We don't get here as we abort in an error case but TS doesn't know that
|
|
762
|
+
return 'invalid hash';
|
|
763
|
+
}
|
|
764
|
+
async function askHasSentryAccount() {
|
|
765
|
+
const hasSentryAccount = await clack.confirm({
|
|
766
|
+
message: 'Do you already have a Sentry account?',
|
|
767
|
+
});
|
|
768
|
+
return abortIfCancelled(hasSentryAccount);
|
|
769
|
+
}
|
|
759
770
|
async function askForProjectSelection(projects, orgSlug, projectSlug) {
|
|
760
771
|
const label = (project) => {
|
|
761
772
|
return `${project.organization.slug}/${project.slug}`;
|