@sentry/wizard 2.7.0 → 3.1.0-beta.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 +16 -3
- package/bin.ts +9 -2
- package/dist/NextJs/configs/next.config.template.js +1 -1
- package/dist/bin.js +16 -4
- package/dist/bin.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/Constants.js +1 -1
- package/dist/lib/Constants.js.map +1 -1
- package/dist/lib/Helper/BottomBar.js +2 -2
- package/dist/lib/Helper/BottomBar.js.map +1 -1
- package/dist/lib/Helper/File.js +10 -12
- package/dist/lib/Helper/File.js.map +1 -1
- package/dist/lib/Helper/Logging.js +1 -1
- package/dist/lib/Helper/Logging.js.map +1 -1
- package/dist/lib/Helper/MergeConfig.js +1 -0
- package/dist/lib/Helper/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/Package.js +10 -10
- package/dist/lib/Helper/Package.js.map +1 -1
- package/dist/lib/Helper/PackageManager.js +6 -9
- package/dist/lib/Helper/PackageManager.js.map +1 -1
- package/dist/lib/Helper/SentryCli.d.ts +3 -3
- package/dist/lib/Helper/SentryCli.js +3 -3
- package/dist/lib/Helper/SentryCli.js.map +1 -1
- package/dist/lib/Helper/Wizard.d.ts +4 -4
- package/dist/lib/Helper/Wizard.js +11 -11
- package/dist/lib/Helper/Wizard.js.map +1 -1
- package/dist/lib/Helper/__tests__/File.js +5 -5
- package/dist/lib/Helper/__tests__/File.js.map +1 -1
- package/dist/lib/Helper/__tests__/MergeConfig.js +9 -9
- package/dist/lib/Helper/__tests__/MergeConfig.js.map +1 -1
- package/dist/lib/Helper/__tests__/SentryCli.js.map +1 -1
- package/dist/lib/Setup.js +11 -9
- package/dist/lib/Setup.js.map +1 -1
- package/dist/lib/Steps/BaseStep.d.ts +2 -2
- package/dist/lib/Steps/BaseStep.js +3 -3
- package/dist/lib/Steps/BaseStep.js.map +1 -1
- package/dist/lib/Steps/ChooseIntegration.d.ts +1 -1
- package/dist/lib/Steps/ChooseIntegration.js +7 -5
- package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
- package/dist/lib/Steps/ConfigureProject.d.ts +1 -1
- package/dist/lib/Steps/ConfigureProject.js +5 -3
- package/dist/lib/Steps/ConfigureProject.js.map +1 -1
- package/dist/lib/Steps/Initial.d.ts +1 -1
- package/dist/lib/Steps/Initial.js +7 -4
- package/dist/lib/Steps/Initial.js.map +1 -1
- package/dist/lib/Steps/Integrations/BaseIntegration.d.ts +2 -2
- package/dist/lib/Steps/Integrations/BaseIntegration.js +7 -4
- package/dist/lib/Steps/Integrations/BaseIntegration.js.map +1 -1
- package/dist/lib/Steps/Integrations/Cordova.d.ts +2 -2
- package/dist/lib/Steps/Integrations/Cordova.js +13 -10
- package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
- package/dist/lib/Steps/Integrations/Electron.d.ts +2 -2
- package/dist/lib/Steps/Integrations/Electron.js +25 -21
- package/dist/lib/Steps/Integrations/Electron.js.map +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.d.ts +1 -1
- package/dist/lib/Steps/Integrations/MobileProject.js +8 -5
- package/dist/lib/Steps/Integrations/MobileProject.js.map +1 -1
- package/dist/lib/Steps/Integrations/NextJs.d.ts +2 -2
- package/dist/lib/Steps/Integrations/NextJs.js +57 -52
- package/dist/lib/Steps/Integrations/NextJs.js.map +1 -1
- package/dist/lib/Steps/Integrations/ReactNative.d.ts +2 -2
- package/dist/lib/Steps/Integrations/ReactNative.js +54 -52
- package/dist/lib/Steps/Integrations/ReactNative.js.map +1 -1
- package/dist/lib/Steps/Integrations/__tests__/ReactNative.js +1 -1
- package/dist/lib/Steps/Integrations/__tests__/ReactNative.js.map +1 -1
- package/dist/lib/Steps/OpenSentry.d.ts +1 -1
- package/dist/lib/Steps/OpenSentry.js +19 -17
- package/dist/lib/Steps/OpenSentry.js.map +1 -1
- package/dist/lib/Steps/PromptForParameters.d.ts +1 -1
- package/dist/lib/Steps/PromptForParameters.js +21 -19
- package/dist/lib/Steps/PromptForParameters.js.map +1 -1
- package/dist/lib/Steps/Result.d.ts +1 -1
- package/dist/lib/Steps/Result.js +8 -5
- package/dist/lib/Steps/Result.js.map +1 -1
- package/dist/lib/Steps/SentryProjectSelector.d.ts +1 -1
- package/dist/lib/Steps/SentryProjectSelector.js +6 -4
- package/dist/lib/Steps/SentryProjectSelector.js.map +1 -1
- package/dist/lib/Steps/ShouldConfigure.d.ts +1 -1
- package/dist/lib/Steps/ShouldConfigure.js +5 -3
- package/dist/lib/Steps/ShouldConfigure.js.map +1 -1
- package/dist/lib/Steps/WaitForSentry.d.ts +1 -1
- package/dist/lib/Steps/WaitForSentry.js +47 -50
- package/dist/lib/Steps/WaitForSentry.js.map +1 -1
- package/dist/lib/Steps/Welcome.d.ts +1 -1
- package/dist/lib/Steps/Welcome.js +8 -6
- package/dist/lib/Steps/Welcome.js.map +1 -1
- package/dist/lib/Steps/index.js +1 -0
- package/dist/lib/Steps/index.js.map +1 -1
- package/dist/lib/__tests__/Env.js +1 -1
- package/dist/lib/__tests__/Env.js.map +1 -1
- package/dist/lib/__tests__/Setup.js +1 -1
- package/dist/lib/__tests__/Setup.js.map +1 -1
- package/dist/src/clack-utils.d.ts +40 -0
- package/dist/src/clack-utils.js +329 -0
- package/dist/src/clack-utils.js.map +1 -0
- package/dist/src/nextjs-wizard.d.ts +5 -0
- package/dist/src/nextjs-wizard.js +346 -0
- package/dist/src/nextjs-wizard.js.map +1 -0
- package/lib/Helper/File.ts +2 -8
- package/lib/Helper/MergeConfig.ts +1 -0
- package/lib/Helper/SentryCli.ts +3 -3
- package/lib/Helper/Wizard.ts +6 -5
- package/lib/Helper/__tests__/File.ts +5 -5
- package/lib/Helper/__tests__/SentryCli.ts +3 -2
- package/lib/Helper/test-fixtures/next.config.1-merged.js +1 -1
- package/lib/Helper/test-fixtures/next.config.3-merged.js +1 -1
- package/lib/Helper/test-fixtures/next.config.4-merged.js +1 -1
- package/lib/Steps/BaseStep.ts +4 -4
- package/lib/Steps/ChooseIntegration.ts +2 -1
- package/lib/Steps/ConfigureProject.ts +1 -1
- package/lib/Steps/Initial.ts +2 -1
- package/lib/Steps/Integrations/BaseIntegration.ts +5 -3
- package/lib/Steps/Integrations/Cordova.ts +7 -6
- package/lib/Steps/Integrations/Electron.ts +10 -7
- package/lib/Steps/Integrations/MobileProject.ts +3 -1
- package/lib/Steps/Integrations/NextJs.ts +8 -6
- package/lib/Steps/Integrations/ReactNative.ts +47 -26
- package/lib/Steps/Integrations/__tests__/ReactNative.ts +3 -2
- package/lib/Steps/OpenSentry.ts +1 -1
- package/lib/Steps/PromptForParameters.ts +3 -2
- package/lib/Steps/Result.ts +2 -1
- package/lib/Steps/SentryProjectSelector.ts +3 -2
- package/lib/Steps/ShouldConfigure.ts +1 -1
- package/lib/Steps/WaitForSentry.ts +4 -4
- package/lib/Steps/Welcome.ts +3 -2
- package/lib/__tests__/Setup.ts +1 -1
- package/package.json +17 -14
- package/scripts/NextJs/configs/next.config.template.js +1 -1
- package/src/clack-utils.ts +346 -0
- package/src/nextjs-wizard.ts +619 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import * as clack from '@clack/prompts';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import * as childProcess from 'child_process';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { setInterval } from 'timers';
|
|
8
|
+
import { URL } from 'url';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
|
|
11
|
+
interface WizardProjectData {
|
|
12
|
+
apiKeys: {
|
|
13
|
+
token: string;
|
|
14
|
+
};
|
|
15
|
+
projects: SentryProjectData[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface SentryProjectData {
|
|
19
|
+
id: string;
|
|
20
|
+
slug: string;
|
|
21
|
+
name: string;
|
|
22
|
+
organization: {
|
|
23
|
+
slug: string;
|
|
24
|
+
};
|
|
25
|
+
keys: [{ dsn: { public: string } }];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function abort(): never {
|
|
29
|
+
clack.outro('Wizard setup cancelled.');
|
|
30
|
+
return process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function abortIfCancelled<T>(
|
|
34
|
+
input: T,
|
|
35
|
+
): asserts input is Exclude<T, symbol> {
|
|
36
|
+
if (clack.isCancel(input)) {
|
|
37
|
+
clack.cancel('Wizard setup cancelled.');
|
|
38
|
+
return process.exit(0);
|
|
39
|
+
} else {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function printWelcome(options: {
|
|
45
|
+
wizardName: string;
|
|
46
|
+
promoCode?: string;
|
|
47
|
+
}): void {
|
|
48
|
+
let wizardPackage: { version?: string } = {};
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
52
|
+
wizardPackage = require(path.join(
|
|
53
|
+
path.dirname(require.resolve('@sentry/wizard')),
|
|
54
|
+
'..',
|
|
55
|
+
'package.json',
|
|
56
|
+
));
|
|
57
|
+
} catch {
|
|
58
|
+
// We don't need to have this
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// eslint-disable-next-line no-console
|
|
62
|
+
console.log('');
|
|
63
|
+
clack.intro(chalk.inverse(` ${options.wizardName} `));
|
|
64
|
+
|
|
65
|
+
let welcomeText =
|
|
66
|
+
'This Wizard will help you to set up Sentry for your application.\nThank you for using Sentry :)';
|
|
67
|
+
|
|
68
|
+
if (options.promoCode) {
|
|
69
|
+
welcomeText += `\n\nUsing promo-code: ${options.promoCode}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (wizardPackage.version) {
|
|
73
|
+
welcomeText += `\n\nVersion: ${wizardPackage.version}`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
clack.note(welcomeText);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function confirmContinueEvenThoughNoGitRepo(): Promise<void> {
|
|
80
|
+
try {
|
|
81
|
+
childProcess.execSync('git rev-parse --is-inside-work-tree', {
|
|
82
|
+
stdio: 'ignore',
|
|
83
|
+
});
|
|
84
|
+
} catch (e) {
|
|
85
|
+
const continueWithoutGit = await clack.confirm({
|
|
86
|
+
message:
|
|
87
|
+
'You are not inside a git repository. The wizard will create and update files. Do you still want to continue?',
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
abortIfCancelled(continueWithoutGit);
|
|
91
|
+
|
|
92
|
+
if (!continueWithoutGit) {
|
|
93
|
+
abort();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function askForWizardLogin(options: {
|
|
99
|
+
url: string;
|
|
100
|
+
promoCode?: string;
|
|
101
|
+
}): Promise<WizardProjectData> {
|
|
102
|
+
const hasSentryAccount = await clack.confirm({
|
|
103
|
+
message: 'Do you already have a Sentry account?',
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
abortIfCancelled(hasSentryAccount);
|
|
107
|
+
|
|
108
|
+
let wizardHash: string;
|
|
109
|
+
try {
|
|
110
|
+
wizardHash = (
|
|
111
|
+
await axios.get<{ hash: string }>(`${options.url}api/0/wizard/`)
|
|
112
|
+
).data.hash;
|
|
113
|
+
} catch (e) {
|
|
114
|
+
clack.log.error('Loading Wizard failed.');
|
|
115
|
+
clack.outro(
|
|
116
|
+
chalk.red(
|
|
117
|
+
'Please try again in a few minutes and let us know if this issue persists: https://github.com/getsentry/sentry-wizard/issues',
|
|
118
|
+
),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
return process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const loginUrl = new URL(
|
|
125
|
+
`${options.url}account/settings/wizard/${wizardHash}/`,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
if (!hasSentryAccount) {
|
|
129
|
+
loginUrl.searchParams.set('signup', '1');
|
|
130
|
+
loginUrl.searchParams.set('project_platform', 'javascript-nextjs');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (options.promoCode) {
|
|
134
|
+
loginUrl.searchParams.set('code', options.promoCode);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
clack.log.info(
|
|
138
|
+
`${chalk.bold(
|
|
139
|
+
`Please open the following link in your browser to ${
|
|
140
|
+
hasSentryAccount ? 'log' : 'sign'
|
|
141
|
+
} into Sentry:`,
|
|
142
|
+
)}\n\n${chalk.cyan(loginUrl.toString())}`,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const loginSpinner = clack.spinner();
|
|
146
|
+
|
|
147
|
+
loginSpinner.start(
|
|
148
|
+
'Waiting for you to click the link above 👆. Take your time.',
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
const data = await new Promise<WizardProjectData>(resolve => {
|
|
152
|
+
const pollingInterval = setInterval(() => {
|
|
153
|
+
axios
|
|
154
|
+
.get<WizardProjectData>(`${options.url}api/0/wizard/${wizardHash}/`)
|
|
155
|
+
.then(result => {
|
|
156
|
+
resolve(result.data);
|
|
157
|
+
clearTimeout(timeout);
|
|
158
|
+
clearInterval(pollingInterval);
|
|
159
|
+
void axios.delete(`${options.url}api/0/wizard/${wizardHash}/`);
|
|
160
|
+
})
|
|
161
|
+
.catch(() => {
|
|
162
|
+
// noop - just try again
|
|
163
|
+
});
|
|
164
|
+
}, 500);
|
|
165
|
+
|
|
166
|
+
const timeout = setTimeout(() => {
|
|
167
|
+
clearInterval(pollingInterval);
|
|
168
|
+
loginSpinner.stop(
|
|
169
|
+
'Login timed out. No worries - it happens to the best of us.',
|
|
170
|
+
);
|
|
171
|
+
clack.outro(
|
|
172
|
+
'Please restart the Wizard and log in to complete the setup.',
|
|
173
|
+
);
|
|
174
|
+
return process.exit(0);
|
|
175
|
+
}, 180_000);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
loginSpinner.stop('Login complete.');
|
|
179
|
+
|
|
180
|
+
return data;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export async function installPackage({
|
|
184
|
+
packageName,
|
|
185
|
+
alreadyInstalled,
|
|
186
|
+
}: {
|
|
187
|
+
packageName: string;
|
|
188
|
+
alreadyInstalled: boolean;
|
|
189
|
+
}): Promise<void> {
|
|
190
|
+
if (alreadyInstalled) {
|
|
191
|
+
const shouldUpdatePackage = await clack.confirm({
|
|
192
|
+
message: `The ${chalk.bold.cyan(
|
|
193
|
+
packageName,
|
|
194
|
+
)} package is already installed. Do you want to update it to the latest version?`,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
abortIfCancelled(shouldUpdatePackage);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const sdkInstallSpinner = clack.spinner();
|
|
202
|
+
|
|
203
|
+
let detectedPackageManager;
|
|
204
|
+
if (fs.existsSync(path.join(process.cwd(), 'yarn.lock'))) {
|
|
205
|
+
detectedPackageManager = 'yarn';
|
|
206
|
+
} else if (fs.existsSync(path.join(process.cwd(), 'package-lock.json'))) {
|
|
207
|
+
detectedPackageManager = 'npm';
|
|
208
|
+
} else if (fs.existsSync(path.join(process.cwd(), 'pnpm-lock.yaml'))) {
|
|
209
|
+
detectedPackageManager = 'pnpm';
|
|
210
|
+
} else {
|
|
211
|
+
detectedPackageManager = 'npm';
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
sdkInstallSpinner.start(
|
|
215
|
+
`${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(
|
|
216
|
+
packageName,
|
|
217
|
+
)} with ${chalk.bold(detectedPackageManager)}.`,
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
if (detectedPackageManager === 'yarn') {
|
|
222
|
+
await promisify(childProcess.exec)(`yarn add ${packageName}@latest`);
|
|
223
|
+
} else if (detectedPackageManager === 'pnpm') {
|
|
224
|
+
await promisify(childProcess.exec)(`pnpm add ${packageName}@latest`);
|
|
225
|
+
} else if (detectedPackageManager === 'npm') {
|
|
226
|
+
await promisify(childProcess.exec)(`npm install ${packageName}@latest`);
|
|
227
|
+
}
|
|
228
|
+
} catch (e) {
|
|
229
|
+
sdkInstallSpinner.stop('Installation failed.');
|
|
230
|
+
clack.log.error(
|
|
231
|
+
`${chalk.red(
|
|
232
|
+
'Encountered the following error during installation:',
|
|
233
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
234
|
+
)}\n\n${e}\n\n${chalk.dim(
|
|
235
|
+
'If you think this issue is caused by the Sentry wizard, let us know here:\nhttps://github.com/getsentry/sentry-wizard/issues',
|
|
236
|
+
)}`,
|
|
237
|
+
);
|
|
238
|
+
clack.outro('Wizard setup cancelled.');
|
|
239
|
+
return process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
sdkInstallSpinner.stop(
|
|
243
|
+
`${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(
|
|
244
|
+
packageName,
|
|
245
|
+
)} with ${chalk.bold(detectedPackageManager)}.`,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export async function askForSelfHosted(): Promise<{
|
|
250
|
+
url: string;
|
|
251
|
+
selfHosted: boolean;
|
|
252
|
+
}> {
|
|
253
|
+
const choice: 'saas' | 'self-hosted' | symbol = await clack.select({
|
|
254
|
+
message: 'Are you using Sentry SaaS or self-hosted Sentry?',
|
|
255
|
+
options: [
|
|
256
|
+
{ value: 'saas', label: 'Sentry SaaS (sentry.io)' },
|
|
257
|
+
{ value: 'self-hosted', label: 'Self-hosted/on-premise' },
|
|
258
|
+
],
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
abortIfCancelled(choice);
|
|
262
|
+
|
|
263
|
+
if (choice === 'saas') {
|
|
264
|
+
return { url: 'https://sentry.io/', selfHosted: false };
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const url = await clack.text({
|
|
268
|
+
message: 'Please enter the URL of your self-hosted Sentry instance.',
|
|
269
|
+
placeholder: 'https://sentry.io/',
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
abortIfCancelled(url);
|
|
273
|
+
|
|
274
|
+
return { url, selfHosted: true };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export async function addSentryCliRc(authToken: string): Promise<void> {
|
|
278
|
+
const clircExists = fs.existsSync(path.join(process.cwd(), '.sentryclirc'));
|
|
279
|
+
if (clircExists) {
|
|
280
|
+
const clircContents = fs.readFileSync(
|
|
281
|
+
path.join(process.cwd(), '.sentryclirc'),
|
|
282
|
+
'utf8',
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const likelyAlreadyHasAuthToken = !!(
|
|
286
|
+
clircContents.includes('[auth]') && clircContents.match(/token=./g)
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
if (likelyAlreadyHasAuthToken) {
|
|
290
|
+
clack.log.warn(
|
|
291
|
+
`${chalk.bold(
|
|
292
|
+
'.sentryclirc',
|
|
293
|
+
)} already has auth token. Will not add one.`,
|
|
294
|
+
);
|
|
295
|
+
} else {
|
|
296
|
+
try {
|
|
297
|
+
await fs.promises.writeFile(
|
|
298
|
+
path.join(process.cwd(), '.sentryclirc'),
|
|
299
|
+
`${clircContents}\n[auth]\ntoken=${authToken}\n`,
|
|
300
|
+
{ encoding: 'utf8', flag: 'w' },
|
|
301
|
+
);
|
|
302
|
+
clack.log.success(`Added auth token to ${chalk.bold('.sentryclirc')}`);
|
|
303
|
+
} catch (e) {
|
|
304
|
+
clack.log.warning(
|
|
305
|
+
`Failed to add auth token to ${chalk.bold(
|
|
306
|
+
'.sentryclirc',
|
|
307
|
+
)}. Uploading source maps during build will likely not work.`,
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
} else {
|
|
312
|
+
try {
|
|
313
|
+
await fs.promises.writeFile(
|
|
314
|
+
path.join(process.cwd(), '.sentryclirc'),
|
|
315
|
+
`[auth]\ntoken=${authToken}\n`,
|
|
316
|
+
{ encoding: 'utf8', flag: 'w' },
|
|
317
|
+
);
|
|
318
|
+
clack.log.success(
|
|
319
|
+
`Created ${chalk.bold('.sentryclirc')} with auth token.`,
|
|
320
|
+
);
|
|
321
|
+
} catch (e) {
|
|
322
|
+
clack.log.warning(
|
|
323
|
+
`Failed to create ${chalk.bold(
|
|
324
|
+
'.sentryclirc',
|
|
325
|
+
)} with auth token. Uploading source maps during build will likely not work.`,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
try {
|
|
331
|
+
await fs.promises.appendFile(
|
|
332
|
+
path.join(process.cwd(), '.gitignore'),
|
|
333
|
+
'\n# Sentry Auth Token\n.sentryclirc\n',
|
|
334
|
+
{ encoding: 'utf8' },
|
|
335
|
+
);
|
|
336
|
+
clack.log.success(
|
|
337
|
+
`Added ${chalk.bold('.sentryclirc')} to ${chalk.bold('.gitignore')}.`,
|
|
338
|
+
);
|
|
339
|
+
} catch (e) {
|
|
340
|
+
clack.log.error(
|
|
341
|
+
`Failed adding ${chalk.bold('.sentryclirc')} to ${chalk.bold(
|
|
342
|
+
'.gitignore',
|
|
343
|
+
)}. Please add it manually!`,
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
}
|