@sentry/wizard 3.4.0 → 3.5.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 +12 -0
- package/bin.ts +29 -19
- package/dist/bin.js +23 -18
- package/dist/bin.js.map +1 -1
- package/dist/lib/Helper/Wizard.js +0 -9
- package/dist/lib/Helper/Wizard.js.map +1 -1
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/ChooseIntegration.js +26 -10
- package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
- package/dist/lib/Steps/Integrations/{NextJs.d.ts → NextJsShim.d.ts} +1 -1
- package/dist/lib/Steps/Integrations/{NextJs.js → NextJsShim.js} +13 -10
- package/dist/lib/Steps/Integrations/NextJsShim.js.map +1 -0
- package/dist/lib/Steps/Integrations/SourceMapsShim.js +4 -1
- package/dist/lib/Steps/Integrations/SourceMapsShim.js.map +1 -1
- package/dist/lib/Steps/Integrations/{SvelteKit.d.ts → SvelteKitShim.d.ts} +1 -1
- package/dist/lib/Steps/Integrations/{SvelteKit.js → SvelteKitShim.js} +13 -10
- package/dist/lib/Steps/Integrations/SvelteKitShim.js.map +1 -0
- package/dist/package.json +3 -3
- package/dist/src/nextjs/nextjs-wizard.d.ts +2 -5
- package/dist/src/nextjs/nextjs-wizard.js +1 -1
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/sourcemaps/sourcemaps-wizard.d.ts +2 -5
- package/dist/src/sourcemaps/sourcemaps-wizard.js +34 -19
- package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
- package/dist/src/sourcemaps/tools/create-react-app.d.ts +1 -0
- package/dist/src/sourcemaps/tools/create-react-app.js +69 -0
- package/dist/src/sourcemaps/tools/create-react-app.js.map +1 -0
- package/dist/src/sourcemaps/tools/sentry-cli.js +5 -0
- package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
- package/dist/src/sourcemaps/utils/sdk-version.d.ts +14 -0
- package/dist/src/sourcemaps/utils/sdk-version.js +275 -0
- package/dist/src/sourcemaps/utils/sdk-version.js.map +1 -0
- package/dist/src/sveltekit/sveltekit-wizard.d.ts +2 -5
- package/dist/src/sveltekit/sveltekit-wizard.js +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +13 -2
- package/dist/src/utils/clack-utils.js +76 -43
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +12 -0
- package/dist/src/utils/types.js +3 -0
- package/dist/src/utils/types.js.map +1 -0
- package/lib/Helper/Wizard.ts +0 -9
- package/lib/Setup.ts +1 -0
- package/lib/Steps/ChooseIntegration.ts +35 -11
- package/lib/Steps/Integrations/{NextJs.ts → NextJsShim.ts} +5 -2
- package/lib/Steps/Integrations/SourceMapsShim.ts +4 -1
- package/lib/Steps/Integrations/{SvelteKit.ts → SvelteKitShim.ts} +5 -2
- package/package.json +3 -3
- package/src/nextjs/nextjs-wizard.ts +3 -8
- package/src/sourcemaps/sourcemaps-wizard.ts +21 -11
- package/src/sourcemaps/tools/create-react-app.ts +19 -0
- package/src/sourcemaps/tools/sentry-cli.ts +5 -0
- package/src/sourcemaps/utils/sdk-version.ts +264 -0
- package/src/sveltekit/sveltekit-wizard.ts +3 -6
- package/src/utils/clack-utils.ts +69 -27
- package/src/utils/types.ts +13 -0
- package/dist/lib/Steps/Integrations/NextJs.js.map +0 -1
- package/dist/lib/Steps/Integrations/SvelteKit.js.map +0 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
2
|
+
import clack from '@clack/prompts';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { minVersion, satisfies } from 'semver';
|
|
5
|
+
import {
|
|
6
|
+
abortIfCancelled,
|
|
7
|
+
getPackageDotJson,
|
|
8
|
+
getPackageVersion,
|
|
9
|
+
installPackage,
|
|
10
|
+
} from '../../utils/clack-utils';
|
|
11
|
+
|
|
12
|
+
import * as Sentry from '@sentry/node';
|
|
13
|
+
|
|
14
|
+
const MINIMUM_DEBUG_ID_SDK_VERSION = '7.47.0';
|
|
15
|
+
|
|
16
|
+
// This array is orderd by the SDKs we want to check for first.
|
|
17
|
+
// The reason is that some SDKs depend on others and some users might
|
|
18
|
+
// have added the dependencies to their package.json. We want to make sure
|
|
19
|
+
// that we actually detect the "top-level" SDK first.
|
|
20
|
+
const SENTRY_SDK_PACKAGE_NAMES = [
|
|
21
|
+
// SDKs using other framework SDKs need to be checked first
|
|
22
|
+
'@sentry/gatsby',
|
|
23
|
+
'@sentry/nextjs',
|
|
24
|
+
'@sentry/remix',
|
|
25
|
+
'@sentry/sveltekit',
|
|
26
|
+
|
|
27
|
+
// Framework SDKs
|
|
28
|
+
'@sentry/angular',
|
|
29
|
+
'@sentry/angular-ivy',
|
|
30
|
+
'@sentry/ember',
|
|
31
|
+
'@sentry/react',
|
|
32
|
+
'@sentry/svelte',
|
|
33
|
+
'@sentry/vue',
|
|
34
|
+
'@sentry/serverless',
|
|
35
|
+
|
|
36
|
+
// Base SDKs
|
|
37
|
+
'@sentry/browser',
|
|
38
|
+
'@sentry/node',
|
|
39
|
+
] as const;
|
|
40
|
+
|
|
41
|
+
type SdkPackage = {
|
|
42
|
+
name: (typeof SENTRY_SDK_PACKAGE_NAMES)[number];
|
|
43
|
+
version: string;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Check for a minimum SDK version and prompt the user to upgrade if necessary.
|
|
48
|
+
* We distinguish between 4 cases here:
|
|
49
|
+
*
|
|
50
|
+
* 1. Users didn't install any SDK yet
|
|
51
|
+
* -> We tell them to install an SDK and then continue with the wizard
|
|
52
|
+
* 2. Users installed an SDK in the range >=7.47.0
|
|
53
|
+
* -> All good, no need to do anything!
|
|
54
|
+
* 3. Users installed an SDK in the range >=7.0.0 <= 7.46.0
|
|
55
|
+
* -> We ask if they want to auto-update to the latest version
|
|
56
|
+
* 4. Users installed an SDK in the range <7.x
|
|
57
|
+
* -> We tell users to manually upgrade (migrate between majors)
|
|
58
|
+
*/
|
|
59
|
+
export async function ensureMinimumSdkVersionIsInstalled(): Promise<void> {
|
|
60
|
+
const packageJson = await getPackageDotJson();
|
|
61
|
+
|
|
62
|
+
const installedSdkPackages = SENTRY_SDK_PACKAGE_NAMES.map((packageName) => ({
|
|
63
|
+
name: packageName,
|
|
64
|
+
version: getPackageVersion(packageName, packageJson),
|
|
65
|
+
})).filter((sdkPackage): sdkPackage is SdkPackage => !!sdkPackage.version);
|
|
66
|
+
|
|
67
|
+
const installedSdkPackage =
|
|
68
|
+
installedSdkPackages.length > 0 && installedSdkPackages[0];
|
|
69
|
+
|
|
70
|
+
// Case 1:
|
|
71
|
+
if (!installedSdkPackage) {
|
|
72
|
+
return await handleNoSdkInstalled();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const { name: installedSdkName, version: installedSdkVersionOrRange } =
|
|
76
|
+
installedSdkPackage;
|
|
77
|
+
|
|
78
|
+
const minInstalledVersion = getMinInstalledVersion(
|
|
79
|
+
installedSdkVersionOrRange,
|
|
80
|
+
installedSdkName,
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
if (!minInstalledVersion) {
|
|
84
|
+
// This is handled in the getMinInstalledVersion function
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const hasDebugIdCompatibleSdkVersion = satisfies(
|
|
89
|
+
minInstalledVersion,
|
|
90
|
+
`>=${MINIMUM_DEBUG_ID_SDK_VERSION}`,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Case 2:
|
|
94
|
+
if (hasDebugIdCompatibleSdkVersion) {
|
|
95
|
+
Sentry.setTag('initial-sdk-version', '>=7.47.0');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const hasV7SdkVersion = satisfies(minInstalledVersion, '>=7.0.0');
|
|
100
|
+
|
|
101
|
+
clack.log.warn(
|
|
102
|
+
`${chalk.yellowBright(
|
|
103
|
+
`It seems like you're using an outdated version (${installedSdkVersionOrRange}) of the ${chalk.bold(
|
|
104
|
+
installedSdkName,
|
|
105
|
+
)} SDK.`,
|
|
106
|
+
)}
|
|
107
|
+
Uploading source maps is easiest with an SDK from version ${chalk.bold(
|
|
108
|
+
MINIMUM_DEBUG_ID_SDK_VERSION,
|
|
109
|
+
)} or newer.
|
|
110
|
+
`,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// Case 3:
|
|
114
|
+
if (hasV7SdkVersion) {
|
|
115
|
+
await handleAutoUpdateSdk(installedSdkName);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Case 4:
|
|
120
|
+
await handleManuallyUpdateSdk(minInstalledVersion);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function handleManuallyUpdateSdk(minInstalledVersion: string) {
|
|
124
|
+
Sentry.setTag(
|
|
125
|
+
'initial-sdk-version',
|
|
126
|
+
`${satisfies(minInstalledVersion, '>=6.0.0') ? '6.x' : '<6.0.0'}`,
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
clack.log
|
|
130
|
+
.info(`When upgrading from a version older than 7.0.0, make sure to follow the migration guide:
|
|
131
|
+
https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#upgrading-from-6x-to-7x
|
|
132
|
+
`);
|
|
133
|
+
|
|
134
|
+
const didUpdate = await abortIfCancelled(
|
|
135
|
+
clack.select({
|
|
136
|
+
message: 'Did you update your SDK to the latest version?',
|
|
137
|
+
options: [
|
|
138
|
+
{
|
|
139
|
+
label: 'Yes!',
|
|
140
|
+
value: true,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
label: "No, I'll do it later...",
|
|
144
|
+
value: false,
|
|
145
|
+
hint: chalk.yellow(
|
|
146
|
+
`Remember to update your SDK to at least ${MINIMUM_DEBUG_ID_SDK_VERSION}.`,
|
|
147
|
+
),
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
initialValue: true,
|
|
151
|
+
}),
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
Sentry.setTag(
|
|
155
|
+
'resolved-sdk-status',
|
|
156
|
+
didUpdate ? 'updated-manually' : 'update-later',
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function handleAutoUpdateSdk(packageName: string) {
|
|
161
|
+
Sentry.setTag('initial-sdk-version', '>=7.0.0 <7.47.0');
|
|
162
|
+
|
|
163
|
+
const shouldUpdate = await abortIfCancelled(
|
|
164
|
+
clack.select({
|
|
165
|
+
message:
|
|
166
|
+
'Do you want to automatically update your SDK to the latest version?',
|
|
167
|
+
options: [
|
|
168
|
+
{
|
|
169
|
+
label: 'Yes!',
|
|
170
|
+
value: true,
|
|
171
|
+
hint: chalk.green('Recommended'),
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
label: "No, I'll do it later...",
|
|
175
|
+
value: false,
|
|
176
|
+
hint: chalk.yellow(
|
|
177
|
+
`Remember to update your SDK to at least ${MINIMUM_DEBUG_ID_SDK_VERSION}.`,
|
|
178
|
+
),
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
initialValue: true,
|
|
182
|
+
}),
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
if (shouldUpdate) {
|
|
186
|
+
await installPackage({
|
|
187
|
+
packageName,
|
|
188
|
+
alreadyInstalled: true,
|
|
189
|
+
askBeforeUpdating: false, // we already did this above
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
Sentry.setTag(
|
|
194
|
+
'resolved-sdk-status',
|
|
195
|
+
shouldUpdate ? 'updated-automatically' : 'update-later',
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
async function handleNoSdkInstalled(): Promise<void> {
|
|
200
|
+
Sentry.setTag('initial-sdk-version', 'none');
|
|
201
|
+
|
|
202
|
+
clack.log.warn(
|
|
203
|
+
`${chalk.yellowBright(
|
|
204
|
+
`It seems like you didn't yet install a Sentry SDK in your project.`,
|
|
205
|
+
)}
|
|
206
|
+
We recommend setting up the SDK before continuing with the source maps wizard.
|
|
207
|
+
|
|
208
|
+
${chalk.dim(`Take a look at our docs to get started:
|
|
209
|
+
https://docs.sentry.io/`)}`,
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
const installedSDK = await abortIfCancelled(
|
|
213
|
+
clack.select({
|
|
214
|
+
message: 'Did you set up your Sentry SDK?',
|
|
215
|
+
options: [
|
|
216
|
+
{ label: 'Yes, continue!', value: true },
|
|
217
|
+
{
|
|
218
|
+
label: "I'll do it later...",
|
|
219
|
+
value: false,
|
|
220
|
+
hint: chalk.yellow(
|
|
221
|
+
'You need to set up an SDK before you can use Sentry',
|
|
222
|
+
),
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
initialValue: true,
|
|
226
|
+
}),
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
Sentry.setTag(
|
|
230
|
+
'resolved-sdk-status',
|
|
231
|
+
installedSDK ? 'installed-manually' : 'install-later',
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function getMinInstalledVersion(
|
|
236
|
+
installedSdkVersionOrRange: string,
|
|
237
|
+
installedSdkName: string,
|
|
238
|
+
): string | undefined {
|
|
239
|
+
try {
|
|
240
|
+
// If `minVersion` is unable to parse the version it will throw an error
|
|
241
|
+
// However, it will also return `null` if the parameter is undefined, which
|
|
242
|
+
// we explicitly checked before but the typing doesn't know that.
|
|
243
|
+
const minInstalledVersion = minVersion(installedSdkVersionOrRange)?.version;
|
|
244
|
+
if (minInstalledVersion) {
|
|
245
|
+
return minInstalledVersion;
|
|
246
|
+
}
|
|
247
|
+
} catch {
|
|
248
|
+
// handling this, along with the `null` case below
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
Sentry.setTag('initial-sdk-version', 'unknown');
|
|
252
|
+
clack.log.warn(
|
|
253
|
+
`${chalk.yellow(
|
|
254
|
+
`Could not parse the version of your installed SDK ("${installedSdkName}": "${installedSdkVersionOrRange}")`,
|
|
255
|
+
)}
|
|
256
|
+
|
|
257
|
+
Please make sure that your Sentry SDK is updated to version ${chalk.bold(
|
|
258
|
+
MINIMUM_DEBUG_ID_SDK_VERSION,
|
|
259
|
+
)} or newer.
|
|
260
|
+
`,
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
@@ -13,17 +13,14 @@ import {
|
|
|
13
13
|
installPackage,
|
|
14
14
|
printWelcome,
|
|
15
15
|
} from '../utils/clack-utils';
|
|
16
|
+
import { WizardOptions } from '../utils/types';
|
|
16
17
|
import { createExamplePage } from './sdk-example';
|
|
17
18
|
import { createOrMergeSvelteKitFiles, loadSvelteConfig } from './sdk-setup';
|
|
18
19
|
|
|
19
20
|
import { setupCLIConfig } from './sentry-cli-setup';
|
|
20
21
|
|
|
21
|
-
interface SvelteKitWizardOptions {
|
|
22
|
-
promoCode?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
22
|
export async function runSvelteKitWizard(
|
|
26
|
-
options:
|
|
23
|
+
options: WizardOptions,
|
|
27
24
|
): Promise<void> {
|
|
28
25
|
printWelcome({
|
|
29
26
|
wizardName: 'Sentry SvelteKit Wizard',
|
|
@@ -35,7 +32,7 @@ export async function runSvelteKitWizard(
|
|
|
35
32
|
const packageJson = await getPackageDotJson();
|
|
36
33
|
await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', 'Sveltekit');
|
|
37
34
|
|
|
38
|
-
const { url: sentryUrl, selfHosted } = await askForSelfHosted();
|
|
35
|
+
const { url: sentryUrl, selfHosted } = await askForSelfHosted(options.url);
|
|
39
36
|
|
|
40
37
|
const { projects, apiKeys } = await askForWizardLogin({
|
|
41
38
|
promoCode: options.promoCode,
|
package/src/utils/clack-utils.ts
CHANGED
|
@@ -11,6 +11,10 @@ import { promisify } from 'util';
|
|
|
11
11
|
import * as Sentry from '@sentry/node';
|
|
12
12
|
import { windowedSelect } from './vendor/clack-custom-select';
|
|
13
13
|
|
|
14
|
+
const opn = require('opn') as (
|
|
15
|
+
url: string,
|
|
16
|
+
) => Promise<childProcess.ChildProcess>;
|
|
17
|
+
|
|
14
18
|
const SAAS_URL = 'https://sentry.io/';
|
|
15
19
|
|
|
16
20
|
interface WizardProjectData {
|
|
@@ -179,14 +183,19 @@ export async function askForWizardLogin(options: {
|
|
|
179
183
|
loginUrl.searchParams.set('code', options.promoCode);
|
|
180
184
|
}
|
|
181
185
|
|
|
186
|
+
const urlToOpen = loginUrl.toString();
|
|
182
187
|
clack.log.info(
|
|
183
188
|
`${chalk.bold(
|
|
184
|
-
`
|
|
189
|
+
`If the browser window didn't open automatically, please open the following link to ${
|
|
185
190
|
hasSentryAccount ? 'log' : 'sign'
|
|
186
191
|
} into Sentry:`,
|
|
187
|
-
)}\n\n${chalk.cyan(
|
|
192
|
+
)}\n\n${chalk.cyan(urlToOpen)}`,
|
|
188
193
|
);
|
|
189
194
|
|
|
195
|
+
opn(urlToOpen).catch(() => {
|
|
196
|
+
// opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here
|
|
197
|
+
});
|
|
198
|
+
|
|
190
199
|
const loginSpinner = clack.spinner();
|
|
191
200
|
|
|
192
201
|
loginSpinner.start(
|
|
@@ -250,11 +259,13 @@ export async function askForProjectSelection(
|
|
|
250
259
|
export async function installPackage({
|
|
251
260
|
packageName,
|
|
252
261
|
alreadyInstalled,
|
|
262
|
+
askBeforeUpdating = true,
|
|
253
263
|
}: {
|
|
254
264
|
packageName: string;
|
|
255
265
|
alreadyInstalled: boolean;
|
|
266
|
+
askBeforeUpdating?: boolean;
|
|
256
267
|
}): Promise<void> {
|
|
257
|
-
if (alreadyInstalled) {
|
|
268
|
+
if (alreadyInstalled && askBeforeUpdating) {
|
|
258
269
|
const shouldUpdatePackage = await abortIfCancelled(
|
|
259
270
|
clack.confirm({
|
|
260
271
|
message: `The ${chalk.bold.cyan(
|
|
@@ -306,34 +317,55 @@ export async function installPackage({
|
|
|
306
317
|
);
|
|
307
318
|
}
|
|
308
319
|
|
|
309
|
-
|
|
320
|
+
/**
|
|
321
|
+
* Asks users if they are using SaaS or self-hosted Sentry and returns the validated URL.
|
|
322
|
+
*
|
|
323
|
+
* If users started the wizard with a --url arg, that URL is used as the default and we skip
|
|
324
|
+
* the self-hosted question. However, the passed url is still validated and in case it's
|
|
325
|
+
* invalid, users are asked to enter a new one until it is valid.
|
|
326
|
+
*
|
|
327
|
+
* @param urlFromArgs the url passed via the --url arg
|
|
328
|
+
*/
|
|
329
|
+
export async function askForSelfHosted(urlFromArgs?: string): Promise<{
|
|
310
330
|
url: string;
|
|
311
331
|
selfHosted: boolean;
|
|
312
332
|
}> {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
333
|
+
if (!urlFromArgs) {
|
|
334
|
+
const choice: 'saas' | 'self-hosted' | symbol = await abortIfCancelled(
|
|
335
|
+
clack.select({
|
|
336
|
+
message: 'Are you using Sentry SaaS or self-hosted Sentry?',
|
|
337
|
+
options: [
|
|
338
|
+
{ value: 'saas', label: 'Sentry SaaS (sentry.io)' },
|
|
339
|
+
{
|
|
340
|
+
value: 'self-hosted',
|
|
341
|
+
label: 'Self-hosted/on-premise/single-tenant',
|
|
342
|
+
},
|
|
343
|
+
],
|
|
344
|
+
}),
|
|
345
|
+
);
|
|
322
346
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
347
|
+
if (choice === 'saas') {
|
|
348
|
+
Sentry.setTag('url', SAAS_URL);
|
|
349
|
+
Sentry.setTag('self-hosted', false);
|
|
350
|
+
return { url: SAAS_URL, selfHosted: false };
|
|
351
|
+
}
|
|
327
352
|
}
|
|
328
353
|
|
|
329
354
|
let validUrl: string | undefined;
|
|
355
|
+
let tmpUrlFromArgs = urlFromArgs;
|
|
356
|
+
|
|
330
357
|
while (validUrl === undefined) {
|
|
331
|
-
const url =
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
358
|
+
const url =
|
|
359
|
+
tmpUrlFromArgs ||
|
|
360
|
+
(await abortIfCancelled(
|
|
361
|
+
clack.text({
|
|
362
|
+
message: `Please enter the URL of your ${
|
|
363
|
+
urlFromArgs ? '' : 'self-hosted '
|
|
364
|
+
}Sentry instance.`,
|
|
365
|
+
placeholder: 'https://sentry.io/',
|
|
366
|
+
}),
|
|
367
|
+
));
|
|
368
|
+
tmpUrlFromArgs = undefined;
|
|
337
369
|
|
|
338
370
|
try {
|
|
339
371
|
validUrl = new URL(url).toString();
|
|
@@ -344,13 +376,16 @@ export async function askForSelfHosted(): Promise<{
|
|
|
344
376
|
}
|
|
345
377
|
} catch {
|
|
346
378
|
clack.log.error(
|
|
347
|
-
'Please enter a valid URL. (It should look something like "
|
|
379
|
+
'Please enter a valid URL. (It should look something like "https://sentry.mydomain.com/")',
|
|
348
380
|
);
|
|
349
381
|
}
|
|
350
382
|
}
|
|
351
383
|
|
|
384
|
+
const isSelfHostedUrl = new URL(validUrl).host !== new URL(SAAS_URL).host;
|
|
385
|
+
|
|
352
386
|
Sentry.setTag('url', validUrl);
|
|
353
|
-
Sentry.setTag('self-hosted',
|
|
387
|
+
Sentry.setTag('self-hosted', isSelfHostedUrl);
|
|
388
|
+
|
|
354
389
|
return { url: validUrl, selfHosted: true };
|
|
355
390
|
}
|
|
356
391
|
|
|
@@ -553,9 +588,16 @@ export function hasPackageInstalled(
|
|
|
553
588
|
packageName: string,
|
|
554
589
|
packageJson: PackageDotJson,
|
|
555
590
|
): boolean {
|
|
591
|
+
return getPackageVersion(packageName, packageJson) !== undefined;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
export function getPackageVersion(
|
|
595
|
+
packageName: string,
|
|
596
|
+
packageJson: PackageDotJson,
|
|
597
|
+
): string | undefined {
|
|
556
598
|
return (
|
|
557
|
-
|
|
558
|
-
|
|
599
|
+
packageJson?.dependencies?.[packageName] ||
|
|
600
|
+
packageJson?.devDependencies?.[packageName]
|
|
559
601
|
);
|
|
560
602
|
}
|
|
561
603
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type WizardOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* The promo code to use while signing up for Sentry.
|
|
4
|
+
* This can be passed via the --promo-code arg.
|
|
5
|
+
*/
|
|
6
|
+
promoCode?: string;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The url of the Sentry instance to use.
|
|
10
|
+
* This can be passed via the `-u` or `--url` arg.
|
|
11
|
+
*/
|
|
12
|
+
url?: string;
|
|
13
|
+
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NextJs.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/NextJs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mEAAoE;AAGpE,qDAAoD;AAEpD;;;GAGG;AACH;IAA4B,0BAAe;IACzC,gBAA6B,KAAW;QAAxC,YACE,kBAAM,KAAK,CAAC,SACb;QAF4B,WAAK,GAAL,KAAK,CAAM;;IAExC,CAAC;IAEY,qBAAI,GAAjB,UAAkB,QAAiB;;;;4BACjC,qBAAM,IAAA,+BAAe,EAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAA;;wBAA1D,SAA0D,CAAC;wBAC3D,sBAAO,EAAE,EAAC;;;;KACX;IAEY,gCAAe,GAA5B,UAA6B,QAAiB;;;gBAC5C,kEAAkE;gBAClE,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACzB,sBAAO,IAAI,CAAC,gBAAgB,EAAC;iBAC9B;gBACD,6DAA6D;gBAC7D,sBAAO,IAAI,CAAC,eAAe,EAAC;;;KAC7B;IACH,aAAC;AAAD,CAAC,AAlBD,CAA4B,iCAAe,GAkB1C;AAlBY,wBAAM","sourcesContent":["import type { Answers } from 'inquirer';\nimport { runNextjsWizard } from '../../../src/nextjs/nextjs-wizard';\n\nimport type { Args } from '../../Constants';\nimport { BaseIntegration } from './BaseIntegration';\n\n/**\n * This class just redirects to the new `nextjs-wizard.ts` flow\n * for anyone calling the wizard without the '-i nextjs' flag.\n */\nexport class NextJs extends BaseIntegration {\n public constructor(protected _argv: Args) {\n super(_argv);\n }\n\n public async emit(_answers: Answers): Promise<Answers> {\n await runNextjsWizard({ promoCode: this._argv.promoCode });\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SvelteKit.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/SvelteKit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4EAA6E;AAG7E,qDAAoD;AAEpD;;;GAGG;AACH;IAA+B,6BAAe;IAC5C,mBAA6B,KAAW;QAAxC,YACE,kBAAM,KAAK,CAAC,SACb;QAF4B,WAAK,GAAL,KAAK,CAAM;;IAExC,CAAC;IAEY,wBAAI,GAAjB,UAAkB,QAAiB;;;;4BACjC,qBAAM,IAAA,qCAAkB,EAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,EAAA;;wBAA7D,SAA6D,CAAC;wBAC9D,sBAAO,EAAE,EAAC;;;;KACX;IAEY,mCAAe,GAA5B,UAA6B,QAAiB;;;gBAC5C,kEAAkE;gBAClE,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACzB,sBAAO,IAAI,CAAC,gBAAgB,EAAC;iBAC9B;gBACD,6DAA6D;gBAC7D,sBAAO,IAAI,CAAC,eAAe,EAAC;;;KAC7B;IACH,gBAAC;AAAD,CAAC,AAlBD,CAA+B,iCAAe,GAkB7C;AAlBY,8BAAS","sourcesContent":["import type { Answers } from 'inquirer';\nimport { runSvelteKitWizard } from '../../../src/sveltekit/sveltekit-wizard';\n\nimport type { Args } from '../../Constants';\nimport { BaseIntegration } from './BaseIntegration';\n\n/**\n * This class just redirects to the new `sveltekit-wizard.ts` flow\n * for anyone calling the wizard without the '-i sveltekit' flag.\n */\nexport class SvelteKit extends BaseIntegration {\n public constructor(protected _argv: Args) {\n super(_argv);\n }\n\n public async emit(_answers: Answers): Promise<Answers> {\n await runSvelteKitWizard({ promoCode: this._argv.promoCode });\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n}\n"]}
|