@sentry/wizard 1.2.17 → 2.0.1
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 +13 -1
- package/README.md +10 -6
- package/dist/Electron/symbols.js +5 -16
- package/dist/NextJs/configs/_error.js +30 -56
- package/dist/NextJs/sentry_sample_error.js +47 -0
- package/dist/lib/Steps/Integrations/NextJs.d.ts +1 -1
- package/dist/lib/Steps/Integrations/NextJs.js +31 -16
- package/dist/lib/Steps/Integrations/NextJs.js.map +1 -1
- package/dist/lib/Steps/Integrations/ReactNative.js +8 -21
- package/dist/lib/Steps/Integrations/ReactNative.js.map +1 -1
- package/lib/Steps/Integrations/NextJs.ts +64 -11
- package/lib/Steps/Integrations/ReactNative.ts +9 -29
- package/package.json +3 -2
- package/scripts/Electron/symbols.js +5 -16
- package/scripts/NextJs/configs/_error.js +30 -56
- package/scripts/NextJs/sentry_sample_error.js +47 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 2.0.1
|
|
4
|
+
|
|
5
|
+
- feat(nextjs): Add page to send onboarding sample error for Next.js (#179)
|
|
6
|
+
|
|
7
|
+
## 2.0.0
|
|
8
|
+
|
|
9
|
+
- fix(react-native) Xcode linking for RN 0.69 and higher (#178)
|
|
10
|
+
|
|
11
|
+
## 1.3.0
|
|
12
|
+
|
|
13
|
+
- chore(deps): Bump sentry-cli to 1.72.0 (#154)
|
|
14
|
+
- feat(nextjs): Use helper function in `_error.js` (#170)
|
|
15
|
+
- fix(electron): Fix version detection to use electron/package.json (#161)
|
|
4
16
|
|
|
5
17
|
## 1.2.17
|
|
6
18
|
|
package/README.md
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
<a href="https://sentry.io/?utm_source=github&utm_medium=logo" target="_blank">
|
|
3
|
+
<picture>
|
|
4
|
+
<source srcset="https://sentry-brand.storage.googleapis.com/sentry-logo-white.png" media="(prefers-color-scheme: dark)" />
|
|
5
|
+
<source srcset="https://sentry-brand.storage.googleapis.com/sentry-logo-black.png" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" />
|
|
6
|
+
<img src="https://sentry-brand.storage.googleapis.com/sentry-logo-black.png" alt="Sentry" width="280">
|
|
7
|
+
</picture>
|
|
8
|
+
</a>
|
|
8
9
|
</p>
|
|
9
10
|
|
|
11
|
+
<h1>Sentry Wizard</h1>
|
|
12
|
+
<h4>The Sentry Wizard helps you set up your React Native, Cordova, Electron or Next.js projects with Sentry.</h4>
|
|
13
|
+
|
|
10
14
|
[](https://www.npmjs.com/package/@sentry/wizard)
|
|
11
15
|
[](https://www.npmjs.com/package/@sentry/wizard)
|
|
12
16
|
[](https://www.npmjs.com/package/@sentry/wizard)
|
package/dist/Electron/symbols.js
CHANGED
|
@@ -12,15 +12,13 @@ try {
|
|
|
12
12
|
process.exit(1);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const VERSION = /\bv?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)?\b/i;
|
|
16
15
|
const SYMBOL_CACHE_FOLDER = '.electron-symbols';
|
|
17
|
-
const package = require('./package.json');
|
|
18
16
|
const sentryCli = new SentryCli('./sentry.properties');
|
|
19
17
|
|
|
20
18
|
async function main() {
|
|
21
19
|
let version = getElectronVersion();
|
|
22
20
|
if (!version) {
|
|
23
|
-
console.error('Cannot detect electron version, check
|
|
21
|
+
console.error('Cannot detect electron version, check that electron is installed');
|
|
24
22
|
return;
|
|
25
23
|
}
|
|
26
24
|
|
|
@@ -68,20 +66,11 @@ async function main() {
|
|
|
68
66
|
}
|
|
69
67
|
|
|
70
68
|
function getElectronVersion() {
|
|
71
|
-
|
|
72
|
-
return
|
|
69
|
+
try {
|
|
70
|
+
return require('electron/package.json').version;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
return undefined;
|
|
73
73
|
}
|
|
74
|
-
|
|
75
|
-
let electronVersion =
|
|
76
|
-
(package.dependencies && package.dependencies.electron) ||
|
|
77
|
-
(package.devDependencies && package.devDependencies.electron);
|
|
78
|
-
|
|
79
|
-
if (!electronVersion) {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const matches = VERSION.exec(electronVersion);
|
|
84
|
-
return matches ? matches[0] : false;
|
|
85
74
|
}
|
|
86
75
|
|
|
87
76
|
async function downloadSymbols(options) {
|
|
@@ -1,65 +1,39 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* NOTE: This requires `@sentry/nextjs` version 7.3.0 or higher.
|
|
3
|
+
*
|
|
4
|
+
* NOTE: If using this with `next` version 12.2.0 or lower, uncomment the
|
|
5
|
+
* penultimate line in `CustomErrorComponent`.
|
|
6
|
+
*
|
|
7
|
+
* This page is loaded by Nextjs:
|
|
8
|
+
* - on the server, when data-fetching methods throw or reject
|
|
9
|
+
* - on the client, when `getInitialProps` throws or rejects
|
|
10
|
+
* - on the client, when a React lifecycle method throws or rejects, and it's
|
|
11
|
+
* caught by the built-in Nextjs error boundary
|
|
12
|
+
*
|
|
13
|
+
* See:
|
|
14
|
+
* - https://nextjs.org/docs/basic-features/data-fetching/overview
|
|
15
|
+
* - https://nextjs.org/docs/api-reference/data-fetching/get-initial-props
|
|
16
|
+
* - https://reactjs.org/docs/error-boundaries.html
|
|
17
|
+
*/
|
|
2
18
|
|
|
3
19
|
import * as Sentry from '@sentry/nextjs';
|
|
20
|
+
import NextErrorComponent from 'next/error';
|
|
4
21
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// err via _app.js so it can be captured
|
|
10
|
-
Sentry.captureException(err);
|
|
11
|
-
// Flushing is not required in this case as it only happens on the client
|
|
12
|
-
}
|
|
22
|
+
const CustomErrorComponent = props => {
|
|
23
|
+
// If you're using a Nextjs version prior to 12.2.1, uncomment this to
|
|
24
|
+
// compensate for https://github.com/vercel/next.js/issues/8592
|
|
25
|
+
// Sentry.captureUnderscoreErrorException(props);
|
|
13
26
|
|
|
14
|
-
return <NextErrorComponent statusCode={statusCode} />;
|
|
27
|
+
return <NextErrorComponent statusCode={props.statusCode} />;
|
|
15
28
|
};
|
|
16
29
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// Workaround for https://github.com/vercel/next.js/issues/8592, mark when
|
|
23
|
-
// getInitialProps has run
|
|
24
|
-
errorInitialProps.hasGetInitialPropsRun = true;
|
|
25
|
-
|
|
26
|
-
// Returning early because we don't want to log 404 errors to Sentry.
|
|
27
|
-
if (res?.statusCode === 404) {
|
|
28
|
-
return errorInitialProps;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Running on the server, the response object (`res`) is available.
|
|
32
|
-
//
|
|
33
|
-
// Next.js will pass an err on the server if a page's data fetching methods
|
|
34
|
-
// threw or returned a Promise that rejected
|
|
35
|
-
//
|
|
36
|
-
// Running on the client (browser), Next.js will provide an err if:
|
|
37
|
-
//
|
|
38
|
-
// - a page's `getInitialProps` threw or returned a Promise that rejected
|
|
39
|
-
// - an exception was thrown somewhere in the React lifecycle (render,
|
|
40
|
-
// componentDidMount, etc) that was caught by Next.js's React Error
|
|
41
|
-
// Boundary. Read more about what types of exceptions are caught by Error
|
|
42
|
-
// Boundaries: https://reactjs.org/docs/error-boundaries.html
|
|
43
|
-
|
|
44
|
-
if (err) {
|
|
45
|
-
Sentry.captureException(err);
|
|
46
|
-
|
|
47
|
-
// Flushing before returning is necessary if deploying to Vercel, see
|
|
48
|
-
// https://vercel.com/docs/platform/limits#streaming-responses
|
|
49
|
-
await Sentry.flush(2000);
|
|
50
|
-
|
|
51
|
-
return errorInitialProps;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// If this point is reached, getInitialProps was called without any
|
|
55
|
-
// information about what the error might be. This is unexpected and may
|
|
56
|
-
// indicate a bug introduced in Next.js, so record it in Sentry
|
|
57
|
-
Sentry.captureException(
|
|
58
|
-
new Error(`_error.js getInitialProps missing data at path: ${asPath}`),
|
|
59
|
-
);
|
|
60
|
-
await Sentry.flush(2000);
|
|
30
|
+
CustomErrorComponent.getInitialProps = async contextData => {
|
|
31
|
+
// In case this is running in a serverless function, await this in order to give Sentry
|
|
32
|
+
// time to send the error before the lambda exits
|
|
33
|
+
await Sentry.captureUnderscoreErrorException(contextData);
|
|
61
34
|
|
|
62
|
-
|
|
35
|
+
// This will contain the status code of the response
|
|
36
|
+
return NextErrorComponent.getInitialProps(contextData);
|
|
63
37
|
};
|
|
64
38
|
|
|
65
|
-
export default
|
|
39
|
+
export default CustomErrorComponent;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import Head from 'next/head'
|
|
2
|
+
|
|
3
|
+
const boxStyles = { padding: '12px', border: '1px solid #eaeaea', borderRadius: '10px' };
|
|
4
|
+
export default function Home() {
|
|
5
|
+
return (
|
|
6
|
+
<div>
|
|
7
|
+
<Head>
|
|
8
|
+
<title>Sentry Onboarding</title>
|
|
9
|
+
<meta name="description" content="Make your Next.js ready for Sentry" />
|
|
10
|
+
</Head>
|
|
11
|
+
|
|
12
|
+
<main style={{
|
|
13
|
+
minHeight: '100vh',
|
|
14
|
+
display: 'flex',
|
|
15
|
+
flexDirection: 'column',
|
|
16
|
+
justifyContent: 'center',
|
|
17
|
+
alignItems: 'center',
|
|
18
|
+
}}>
|
|
19
|
+
<h1 style={{ fontSize: '4rem' }}>
|
|
20
|
+
<svg style={{
|
|
21
|
+
height: '1em'
|
|
22
|
+
}} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 44">
|
|
23
|
+
<path fill="currentColor" d="M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z"></path>
|
|
24
|
+
</svg>
|
|
25
|
+
</h1>
|
|
26
|
+
|
|
27
|
+
<p >
|
|
28
|
+
Get started by sending us a sample error
|
|
29
|
+
</p>
|
|
30
|
+
<button type="button" style={{
|
|
31
|
+
...boxStyles,
|
|
32
|
+
backgroundColor: '#c73852',
|
|
33
|
+
borderRadius: '12px',
|
|
34
|
+
border: 'none'
|
|
35
|
+
}} onClick={() => {
|
|
36
|
+
throw new Error("Sentry Frontend Error");
|
|
37
|
+
}}>
|
|
38
|
+
Throw error
|
|
39
|
+
</button>
|
|
40
|
+
|
|
41
|
+
<p>
|
|
42
|
+
For more information, see <a href="https://docs.sentry.io/platforms/javascript/guides/nextjs/">https://docs.sentry.io/platforms/javascript/guides/nextjs/</a>
|
|
43
|
+
</p>
|
|
44
|
+
</main>
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
@@ -13,7 +13,7 @@ export declare class NextJs extends BaseIntegration {
|
|
|
13
13
|
private _createNextConfig;
|
|
14
14
|
private _setTemplate;
|
|
15
15
|
private _fillAndCopyTemplate;
|
|
16
|
-
private
|
|
16
|
+
private _checkPackageVersion;
|
|
17
17
|
private _fulfillsVersionRange;
|
|
18
18
|
private _spliceInPlace;
|
|
19
19
|
}
|
|
@@ -69,6 +69,7 @@ var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
|
69
69
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
70
70
|
exports.NextJs = void 0;
|
|
71
71
|
/* eslint-disable max-lines */
|
|
72
|
+
var chalk_1 = require("chalk");
|
|
72
73
|
var fs = require("fs");
|
|
73
74
|
var inquirer_1 = require("inquirer");
|
|
74
75
|
var _ = require("lodash");
|
|
@@ -78,6 +79,7 @@ var Logging_1 = require("../../Helper/Logging");
|
|
|
78
79
|
var SentryCli_1 = require("../../Helper/SentryCli");
|
|
79
80
|
var BaseIntegration_1 = require("./BaseIntegration");
|
|
80
81
|
var COMPATIBLE_NEXTJS_VERSIONS = '>=10.0.8 <13.0.0';
|
|
82
|
+
var COMPATIBLE_SDK_VERSIONS = '>=7.3.0';
|
|
81
83
|
var PROPERTIES_FILENAME = 'sentry.properties';
|
|
82
84
|
var SENTRYCLIRC_FILENAME = '.sentryclirc';
|
|
83
85
|
var GITIGNORE_FILENAME = '.gitignore';
|
|
@@ -107,18 +109,20 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
107
109
|
return _this;
|
|
108
110
|
}
|
|
109
111
|
NextJs.prototype.emit = function (answers) {
|
|
112
|
+
var _a, _b, _c, _d, _e, _f;
|
|
110
113
|
return __awaiter(this, void 0, void 0, function () {
|
|
111
|
-
var dsn, sentryCliProps, configDirectory;
|
|
112
|
-
return __generator(this, function (
|
|
113
|
-
switch (
|
|
114
|
+
var dsn, sentryCliProps, templateDirectory, configDirectory, selectedProjectSlug, hasFirstEvent;
|
|
115
|
+
return __generator(this, function (_g) {
|
|
116
|
+
switch (_g.label) {
|
|
114
117
|
case 0:
|
|
115
118
|
dsn = _.get(answers, ['config', 'dsn', 'public'], null);
|
|
116
119
|
Logging_1.nl();
|
|
117
120
|
sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);
|
|
118
121
|
return [4 /*yield*/, this._createSentryCliConfig(sentryCliProps)];
|
|
119
122
|
case 1:
|
|
120
|
-
|
|
121
|
-
|
|
123
|
+
_g.sent();
|
|
124
|
+
templateDirectory = path.join(__dirname, '..', '..', '..', 'NextJs');
|
|
125
|
+
configDirectory = path.join(templateDirectory, CONFIG_DIR);
|
|
122
126
|
if (fs.existsSync(configDirectory)) {
|
|
123
127
|
this._createNextConfig(configDirectory, dsn);
|
|
124
128
|
}
|
|
@@ -126,6 +130,14 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
126
130
|
Logging_1.debug("Couldn't find " + configDirectory + ", probably because you ran this from inside of `/lib` rather than `/dist`");
|
|
127
131
|
Logging_1.nl();
|
|
128
132
|
}
|
|
133
|
+
selectedProjectSlug = (_b = (_a = answers.config) === null || _a === void 0 ? void 0 : _a.project) === null || _b === void 0 ? void 0 : _b.slug;
|
|
134
|
+
if (selectedProjectSlug) {
|
|
135
|
+
hasFirstEvent = (_f = (_e = (_d = (_c = answers.wizard) === null || _c === void 0 ? void 0 : _c.projects) === null || _d === void 0 ? void 0 : _d.find) === null || _e === void 0 ? void 0 : _e.call(_d, function (p) { return p.slug === selectedProjectSlug; })) === null || _f === void 0 ? void 0 : _f.firstEvent;
|
|
136
|
+
if (!hasFirstEvent) {
|
|
137
|
+
this._setTemplate(templateDirectory, 'sentry_sample_error.js', ['pages', 'src/pages'], dsn);
|
|
138
|
+
Logging_1.l(chalk_1.default.bgYellowBright("\n|------------------------------------------------------------------------|\n| Installation Complete |\n| To verify your installation and finish onboarding, launch your Next.js |\n| application, navigate to https://localhost:3000/sentry_sample_error |\n| and send us a sample error. |\n|------------------------------------------------------------------------|\n"));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
129
141
|
Logging_1.l('For more information, see https://docs.sentry.io/platforms/javascript/guides/nextjs/');
|
|
130
142
|
Logging_1.nl();
|
|
131
143
|
return [2 /*return*/, {}];
|
|
@@ -144,7 +156,9 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
144
156
|
}
|
|
145
157
|
Logging_1.nl();
|
|
146
158
|
userAnswers = { continue: true };
|
|
147
|
-
if (!(!this.
|
|
159
|
+
if (!((!this._checkPackageVersion('next', COMPATIBLE_NEXTJS_VERSIONS, true) ||
|
|
160
|
+
!this._checkPackageVersion('@sentry/nextjs', COMPATIBLE_SDK_VERSIONS, true)) &&
|
|
161
|
+
!this._argv.quiet)) return [3 /*break*/, 2];
|
|
148
162
|
return [4 /*yield*/, inquirer_1.prompt({
|
|
149
163
|
message: 'There were errors during your project checkup, do you still want to continue?',
|
|
150
164
|
name: 'continue',
|
|
@@ -286,7 +300,7 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
286
300
|
var filledTemplate = templateContent.replace('___DSN___', dsn);
|
|
287
301
|
fs.writeFileSync(targetPath, filledTemplate);
|
|
288
302
|
};
|
|
289
|
-
NextJs.prototype.
|
|
303
|
+
NextJs.prototype._checkPackageVersion = function (packageName, acceptableVersions, canBeLatest) {
|
|
290
304
|
var depsVersion = _.get(appPackage, ['dependencies', packageName]);
|
|
291
305
|
var devDepsVersion = _.get(appPackage, ['devDependencies', packageName]);
|
|
292
306
|
if (!depsVersion && !devDepsVersion) {
|
|
@@ -294,9 +308,9 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
294
308
|
Logging_1.red(' Please install it with yarn/npm.');
|
|
295
309
|
return false;
|
|
296
310
|
}
|
|
297
|
-
else if (!this._fulfillsVersionRange(depsVersion) &&
|
|
298
|
-
!this._fulfillsVersionRange(devDepsVersion)) {
|
|
299
|
-
Logging_1.red("\u2717 Your `package.json` specifies a version of `" + packageName + "` outside of the compatible version range " +
|
|
311
|
+
else if (!this._fulfillsVersionRange(depsVersion, acceptableVersions, canBeLatest) &&
|
|
312
|
+
!this._fulfillsVersionRange(devDepsVersion, acceptableVersions, canBeLatest)) {
|
|
313
|
+
Logging_1.red("\u2717 Your `package.json` specifies a version of `" + packageName + "` outside of the compatible version range " + acceptableVersions + ".\n");
|
|
300
314
|
return false;
|
|
301
315
|
}
|
|
302
316
|
else {
|
|
@@ -304,10 +318,9 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
304
318
|
return true;
|
|
305
319
|
}
|
|
306
320
|
};
|
|
307
|
-
NextJs.prototype._fulfillsVersionRange = function (version) {
|
|
308
|
-
// The latest version is currently 12.x, which is not yet supported.
|
|
321
|
+
NextJs.prototype._fulfillsVersionRange = function (version, acceptableVersions, canBeLatest) {
|
|
309
322
|
if (version === 'latest') {
|
|
310
|
-
return
|
|
323
|
+
return canBeLatest;
|
|
311
324
|
}
|
|
312
325
|
var cleanedUserVersion, isRange;
|
|
313
326
|
if (semver_1.valid(version)) {
|
|
@@ -318,10 +331,12 @@ var NextJs = /** @class */ (function (_super) {
|
|
|
318
331
|
cleanedUserVersion = semver_1.validRange(version);
|
|
319
332
|
isRange = true;
|
|
320
333
|
}
|
|
321
|
-
return (
|
|
334
|
+
return (
|
|
335
|
+
// If the given version is a bogus format, this will still be undefined and we'll automatically reject it
|
|
336
|
+
!!cleanedUserVersion &&
|
|
322
337
|
(isRange
|
|
323
|
-
? semver_1.subset(cleanedUserVersion,
|
|
324
|
-
: semver_1.satisfies(cleanedUserVersion,
|
|
338
|
+
? semver_1.subset(cleanedUserVersion, acceptableVersions)
|
|
339
|
+
: semver_1.satisfies(cleanedUserVersion, acceptableVersions)));
|
|
325
340
|
};
|
|
326
341
|
NextJs.prototype._spliceInPlace = function (arr, start, deleteCount) {
|
|
327
342
|
var inserts = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NextJs.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/NextJs.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport * as fs from 'fs';\nimport { Answers, prompt } from 'inquirer';\nimport * as _ from 'lodash';\nimport * as path from 'path';\nimport { satisfies, subset, valid, validRange } from 'semver';\n\nimport { Args } from '../../Constants';\nimport { debug, green, l, nl, red } from '../../Helper/Logging';\nimport { SentryCli, SentryCliProps } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nconst COMPATIBLE_NEXTJS_VERSIONS = '>=10.0.8 <13.0.0';\nconst PROPERTIES_FILENAME = 'sentry.properties';\nconst SENTRYCLIRC_FILENAME = '.sentryclirc';\nconst GITIGNORE_FILENAME = '.gitignore';\nconst CONFIG_DIR = 'configs/';\nconst MERGEABLE_CONFIG_INFIX = 'wizardcopy';\n\n// for those files which can go in more than one place, the list of places they\n// could go (the first one which works will be used)\nconst TEMPLATE_DESTINATIONS: { [key: string]: string[] } = {\n '_error.js': ['pages', 'src/pages'],\n 'next.config.js': ['.'],\n 'sentry.server.config.js': ['.'],\n 'sentry.client.config.js': ['.'],\n};\n\nlet appPackage: any = {};\n\ntry {\n appPackage = require(path.join(process.cwd(), 'package.json'));\n} catch {\n // We don't need to have this\n}\n\nexport class NextJs extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n const dsn = _.get(answers, ['config', 'dsn', 'public'], null);\n nl();\n\n const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);\n await this._createSentryCliConfig(sentryCliProps);\n\n const configDirectory = path.join(\n __dirname,\n '..',\n '..',\n '..',\n 'NextJs',\n CONFIG_DIR,\n );\n\n if (fs.existsSync(configDirectory)) {\n this._createNextConfig(configDirectory, dsn);\n } else {\n debug(\n `Couldn't find ${configDirectory}, probably because you ran this from inside of \\`/lib\\` rather than \\`/dist\\``,\n );\n nl();\n }\n\n l(\n 'For more information, see https://docs.sentry.io/platforms/javascript/guides/nextjs/',\n );\n nl();\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n nl();\n\n let userAnswers: Answers = { continue: true };\n if (!this._checkUserNextVersion('next') && !this._argv.quiet) {\n userAnswers = await prompt({\n message:\n 'There were errors during your project checkup, do you still want to continue?',\n name: 'continue',\n default: false,\n type: 'confirm',\n });\n }\n\n nl();\n\n if (!userAnswers['continue']) {\n throw new Error('Please install the required dependencies to continue.');\n }\n\n this._shouldConfigure = Promise.resolve({ nextjs: true });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private async _createSentryCliConfig(\n cliProps: SentryCliProps,\n ): Promise<void> {\n const { 'auth/token': authToken, ...cliPropsToWrite } = cliProps;\n\n /**\n * To not commit the auth token to the VCS, instead of adding it to the\n * properties file (like the rest of props), it's added to the Sentry CLI\n * config, which is added to the gitignore. This way makes the properties\n * file safe to commit without exposing any auth tokens.\n */\n if (authToken) {\n try {\n await fs.promises.appendFile(\n SENTRYCLIRC_FILENAME,\n this._sentryCli.dumpConfig({ auth: { token: authToken } }),\n );\n green(`✓ Successfully added the auth token to ${SENTRYCLIRC_FILENAME}`);\n } catch {\n red(\n `⚠ Could not add the auth token to ${SENTRYCLIRC_FILENAME}, ` +\n `please add it to identify your user account:\\n${authToken}`,\n );\n nl();\n }\n } else {\n red(\n `⚠ Did not find an auth token, please add your token to ${SENTRYCLIRC_FILENAME}`,\n );\n l(\n 'To generate an auth token, visit https://sentry.io/settings/account/api/auth-tokens/',\n );\n l(\n 'To learn how to configure Sentry CLI, visit ' +\n 'https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',\n );\n }\n\n await this._addToGitignore(\n SENTRYCLIRC_FILENAME,\n `⚠ Could not add ${SENTRYCLIRC_FILENAME} to ${GITIGNORE_FILENAME}, ` +\n 'please add it to not commit your auth key.',\n );\n\n try {\n await fs.promises.writeFile(\n `./${PROPERTIES_FILENAME}`,\n this._sentryCli.dumpProperties(cliPropsToWrite),\n );\n green(`✓ Successfully created sentry.properties`);\n } catch {\n red(`⚠ Could not add org and project data to ${PROPERTIES_FILENAME}`);\n l(\n 'See docs for a manual setup: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',\n );\n }\n nl();\n }\n\n private async _addToGitignore(\n filepath: string,\n errorMsg: string,\n ): Promise<void> {\n /**\n * Don't check whether the given file is ignored because:\n * 1. It's tricky to check it without git.\n * 2. Git might not be installed or accessible.\n * 3. It's convenient to use a module to interact with git, but it would\n * increase the size x2 approximately. Docs say to run the Wizard without\n * installing it, and duplicating the size would slow the set-up down.\n * 4. The Wizard is meant to be run once.\n * 5. A message is logged informing users it's been added to the gitignore.\n * 6. It will be added to the gitignore as many times as it runs - not a big\n * deal.\n * 7. It's straightforward to remove it from the gitignore.\n */\n try {\n await fs.promises.appendFile(\n GITIGNORE_FILENAME,\n `\\n# Sentry\\n${filepath}\\n`,\n );\n green(`✓ ${filepath} added to ${GITIGNORE_FILENAME}`);\n } catch {\n red(errorMsg);\n }\n }\n\n private _createNextConfig(configDirectory: string, dsn: any): void {\n const templates = fs.readdirSync(configDirectory);\n for (const template of templates) {\n this._setTemplate(\n configDirectory,\n template,\n TEMPLATE_DESTINATIONS[template],\n dsn,\n );\n }\n red(\n '⚠ Performance monitoring is enabled capturing 100% of transactions.\\n' +\n ' Learn more in https://docs.sentry.io/product/performance/',\n );\n nl();\n }\n\n private _setTemplate(\n configDirectory: string,\n templateFile: string,\n destinationOptions: string[],\n dsn: string,\n ): void {\n const templatePath = path.join(configDirectory, templateFile);\n\n for (const destinationDir of destinationOptions) {\n if (!fs.existsSync(destinationDir)) {\n continue;\n }\n\n const destinationPath = path.join(destinationDir, templateFile);\n // in case the file in question already exists, we'll make a copy with\n // `MERGEABLE_CONFIG_INFIX` inserted just before the extension, so as not\n // to overwrite the existing file\n const mergeableFilePath = path.join(\n destinationDir,\n this._spliceInPlace(\n templateFile.split('.'),\n -1,\n 0,\n MERGEABLE_CONFIG_INFIX,\n ).join('.'),\n );\n\n if (!fs.existsSync(destinationPath)) {\n this._fillAndCopyTemplate(templatePath, destinationPath, dsn);\n } else if (!fs.existsSync(mergeableFilePath)) {\n this._fillAndCopyTemplate(templatePath, mergeableFilePath, dsn);\n red(\n `File \\`${templateFile}\\` already exists, so created \\`${mergeableFilePath}\\`.\\n` +\n 'Please merge those files.',\n );\n nl();\n } else {\n red(\n `Both \\`${templateFile}\\` and \\`${mergeableFilePath}\\` already exist.\\n` +\n 'Please merge those files.',\n );\n nl();\n }\n return;\n }\n\n red(\n `Could not find appropriate destination for \\`${templateFile}\\`. Tried: ${destinationOptions}.`,\n );\n nl();\n }\n\n private _fillAndCopyTemplate(\n sourcePath: string,\n targetPath: string,\n dsn: string,\n ): void {\n const templateContent = fs.readFileSync(sourcePath).toString();\n const filledTemplate = templateContent.replace('___DSN___', dsn);\n fs.writeFileSync(targetPath, filledTemplate);\n }\n\n private _checkUserNextVersion(packageName: string): boolean {\n const depsVersion = _.get(appPackage, ['dependencies', packageName]);\n const devDepsVersion = _.get(appPackage, ['devDependencies', packageName]);\n\n if (!depsVersion && !devDepsVersion) {\n red(`✗ ${packageName} isn't in your dependencies.`);\n red(' Please install it with yarn/npm.');\n return false;\n } else if (\n !this._fulfillsVersionRange(depsVersion) &&\n !this._fulfillsVersionRange(devDepsVersion)\n ) {\n red(\n `✗ Your \\`package.json\\` specifies a version of \\`${packageName}\\` outside of the compatible version range ${COMPATIBLE_NEXTJS_VERSIONS}.\\n`,\n );\n return false;\n } else {\n green(\n `✓ A compatible version of \\`${packageName}\\` is specified in \\`package.json\\`.`,\n );\n return true;\n }\n }\n\n private _fulfillsVersionRange(version: string): boolean {\n // The latest version is currently 12.x, which is not yet supported.\n if (version === 'latest') {\n return false;\n }\n\n let cleanedUserVersion, isRange;\n\n if (valid(version)) {\n cleanedUserVersion = valid(version);\n isRange = false;\n } else if (validRange(version)) {\n cleanedUserVersion = validRange(version);\n isRange = true;\n }\n\n return (\n !!cleanedUserVersion &&\n (isRange\n ? subset(cleanedUserVersion, COMPATIBLE_NEXTJS_VERSIONS)\n : satisfies(cleanedUserVersion, COMPATIBLE_NEXTJS_VERSIONS))\n );\n }\n\n private _spliceInPlace(\n arr: Array<any>,\n start: number,\n deleteCount: number,\n ...inserts: any[]\n ): Array<any> {\n arr.splice(start, deleteCount, ...inserts);\n return arr;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NextJs.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/NextJs.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport Chalk from 'chalk';\nimport * as fs from 'fs';\nimport { Answers, prompt } from 'inquirer';\nimport * as _ from 'lodash';\nimport * as path from 'path';\nimport { satisfies, subset, valid, validRange } from 'semver';\n\nimport { Args } from '../../Constants';\nimport { debug, green, l, nl, red } from '../../Helper/Logging';\nimport { SentryCli, SentryCliProps } from '../../Helper/SentryCli';\nimport { BaseIntegration } from './BaseIntegration';\n\nconst COMPATIBLE_NEXTJS_VERSIONS = '>=10.0.8 <13.0.0';\nconst COMPATIBLE_SDK_VERSIONS = '>=7.3.0';\nconst PROPERTIES_FILENAME = 'sentry.properties';\nconst SENTRYCLIRC_FILENAME = '.sentryclirc';\nconst GITIGNORE_FILENAME = '.gitignore';\nconst CONFIG_DIR = 'configs/';\nconst MERGEABLE_CONFIG_INFIX = 'wizardcopy';\n\n// for those files which can go in more than one place, the list of places they\n// could go (the first one which works will be used)\nconst TEMPLATE_DESTINATIONS: { [key: string]: string[] } = {\n '_error.js': ['pages', 'src/pages'],\n 'next.config.js': ['.'],\n 'sentry.server.config.js': ['.'],\n 'sentry.client.config.js': ['.'],\n};\n\nlet appPackage: any = {};\n\ntry {\n appPackage = require(path.join(process.cwd(), 'package.json'));\n} catch {\n // We don't need to have this\n}\n\nexport class NextJs extends BaseIntegration {\n protected _sentryCli: SentryCli;\n\n constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n const dsn = _.get(answers, ['config', 'dsn', 'public'], null);\n nl();\n\n const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);\n await this._createSentryCliConfig(sentryCliProps);\n\n const templateDirectory = path.join(\n __dirname,\n '..',\n '..',\n '..',\n 'NextJs',\n );\n const configDirectory = path.join(\n templateDirectory,\n CONFIG_DIR,\n );\n\n if (fs.existsSync(configDirectory)) {\n this._createNextConfig(configDirectory, dsn);\n } else {\n debug(\n `Couldn't find ${configDirectory}, probably because you ran this from inside of \\`/lib\\` rather than \\`/dist\\``,\n );\n nl();\n }\n\n const selectedProjectSlug: string | null = answers.config?.project?.slug;\n if (selectedProjectSlug) {\n const hasFirstEvent = answers.wizard?.projects?.find?.((p: { slug: string; }) => p.slug === selectedProjectSlug)?.firstEvent;\n if (!hasFirstEvent) {\n this._setTemplate(\n templateDirectory,\n 'sentry_sample_error.js',\n ['pages', 'src/pages'],\n dsn,\n );\n l(\n Chalk.bgYellowBright(`\n|------------------------------------------------------------------------|\n| Installation Complete |\n| To verify your installation and finish onboarding, launch your Next.js |\n| application, navigate to https://localhost:3000/sentry_sample_error |\n| and send us a sample error. |\n|------------------------------------------------------------------------|\n`\n )\n );\n }\n }\n\n l(\n 'For more information, see https://docs.sentry.io/platforms/javascript/guides/nextjs/',\n );\n nl();\n\n return {};\n }\n\n public async shouldConfigure(_answers: Answers): Promise<Answers> {\n if (this._shouldConfigure) {\n return this._shouldConfigure;\n }\n\n nl();\n\n let userAnswers: Answers = { continue: true };\n if (\n (!this._checkPackageVersion('next', COMPATIBLE_NEXTJS_VERSIONS, true) ||\n !this._checkPackageVersion(\n '@sentry/nextjs',\n COMPATIBLE_SDK_VERSIONS,\n true,\n )) &&\n !this._argv.quiet\n ) {\n userAnswers = await prompt({\n message:\n 'There were errors during your project checkup, do you still want to continue?',\n name: 'continue',\n default: false,\n type: 'confirm',\n });\n }\n\n nl();\n\n if (!userAnswers['continue']) {\n throw new Error('Please install the required dependencies to continue.');\n }\n\n this._shouldConfigure = Promise.resolve({ nextjs: true });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n return this.shouldConfigure;\n }\n\n private async _createSentryCliConfig(\n cliProps: SentryCliProps,\n ): Promise<void> {\n const { 'auth/token': authToken, ...cliPropsToWrite } = cliProps;\n\n /**\n * To not commit the auth token to the VCS, instead of adding it to the\n * properties file (like the rest of props), it's added to the Sentry CLI\n * config, which is added to the gitignore. This way makes the properties\n * file safe to commit without exposing any auth tokens.\n */\n if (authToken) {\n try {\n await fs.promises.appendFile(\n SENTRYCLIRC_FILENAME,\n this._sentryCli.dumpConfig({ auth: { token: authToken } }),\n );\n green(`✓ Successfully added the auth token to ${SENTRYCLIRC_FILENAME}`);\n } catch {\n red(\n `⚠ Could not add the auth token to ${SENTRYCLIRC_FILENAME}, ` +\n `please add it to identify your user account:\\n${authToken}`,\n );\n nl();\n }\n } else {\n red(\n `⚠ Did not find an auth token, please add your token to ${SENTRYCLIRC_FILENAME}`,\n );\n l(\n 'To generate an auth token, visit https://sentry.io/settings/account/api/auth-tokens/',\n );\n l(\n 'To learn how to configure Sentry CLI, visit ' +\n 'https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',\n );\n }\n\n await this._addToGitignore(\n SENTRYCLIRC_FILENAME,\n `⚠ Could not add ${SENTRYCLIRC_FILENAME} to ${GITIGNORE_FILENAME}, ` +\n 'please add it to not commit your auth key.',\n );\n\n try {\n await fs.promises.writeFile(\n `./${PROPERTIES_FILENAME}`,\n this._sentryCli.dumpProperties(cliPropsToWrite),\n );\n green(`✓ Successfully created sentry.properties`);\n } catch {\n red(`⚠ Could not add org and project data to ${PROPERTIES_FILENAME}`);\n l(\n 'See docs for a manual setup: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-sentry-cli',\n );\n }\n nl();\n }\n\n private async _addToGitignore(\n filepath: string,\n errorMsg: string,\n ): Promise<void> {\n /**\n * Don't check whether the given file is ignored because:\n * 1. It's tricky to check it without git.\n * 2. Git might not be installed or accessible.\n * 3. It's convenient to use a module to interact with git, but it would\n * increase the size x2 approximately. Docs say to run the Wizard without\n * installing it, and duplicating the size would slow the set-up down.\n * 4. The Wizard is meant to be run once.\n * 5. A message is logged informing users it's been added to the gitignore.\n * 6. It will be added to the gitignore as many times as it runs - not a big\n * deal.\n * 7. It's straightforward to remove it from the gitignore.\n */\n try {\n await fs.promises.appendFile(\n GITIGNORE_FILENAME,\n `\\n# Sentry\\n${filepath}\\n`,\n );\n green(`✓ ${filepath} added to ${GITIGNORE_FILENAME}`);\n } catch {\n red(errorMsg);\n }\n }\n\n private _createNextConfig(configDirectory: string, dsn: any): void {\n const templates = fs.readdirSync(configDirectory);\n for (const template of templates) {\n this._setTemplate(\n configDirectory,\n template,\n TEMPLATE_DESTINATIONS[template],\n dsn,\n );\n }\n red(\n '⚠ Performance monitoring is enabled capturing 100% of transactions.\\n' +\n ' Learn more in https://docs.sentry.io/product/performance/',\n );\n nl();\n }\n\n private _setTemplate(\n configDirectory: string,\n templateFile: string,\n destinationOptions: string[],\n dsn: string,\n ): void {\n const templatePath = path.join(configDirectory, templateFile);\n\n for (const destinationDir of destinationOptions) {\n if (!fs.existsSync(destinationDir)) {\n continue;\n }\n\n const destinationPath = path.join(destinationDir, templateFile);\n // in case the file in question already exists, we'll make a copy with\n // `MERGEABLE_CONFIG_INFIX` inserted just before the extension, so as not\n // to overwrite the existing file\n const mergeableFilePath = path.join(\n destinationDir,\n this._spliceInPlace(\n templateFile.split('.'),\n -1,\n 0,\n MERGEABLE_CONFIG_INFIX,\n ).join('.'),\n );\n\n if (!fs.existsSync(destinationPath)) {\n this._fillAndCopyTemplate(templatePath, destinationPath, dsn);\n } else if (!fs.existsSync(mergeableFilePath)) {\n this._fillAndCopyTemplate(templatePath, mergeableFilePath, dsn);\n red(\n `File \\`${templateFile}\\` already exists, so created \\`${mergeableFilePath}\\`.\\n` +\n 'Please merge those files.',\n );\n nl();\n } else {\n red(\n `Both \\`${templateFile}\\` and \\`${mergeableFilePath}\\` already exist.\\n` +\n 'Please merge those files.',\n );\n nl();\n }\n return;\n }\n\n red(\n `Could not find appropriate destination for \\`${templateFile}\\`. Tried: ${destinationOptions}.`,\n );\n nl();\n }\n\n private _fillAndCopyTemplate(\n sourcePath: string,\n targetPath: string,\n dsn: string,\n ): void {\n const templateContent = fs.readFileSync(sourcePath).toString();\n const filledTemplate = templateContent.replace('___DSN___', dsn);\n fs.writeFileSync(targetPath, filledTemplate);\n }\n\n private _checkPackageVersion(\n packageName: string,\n acceptableVersions: string,\n canBeLatest: boolean,\n ): boolean {\n const depsVersion = _.get(appPackage, ['dependencies', packageName]);\n const devDepsVersion = _.get(appPackage, ['devDependencies', packageName]);\n\n if (!depsVersion && !devDepsVersion) {\n red(`✗ ${packageName} isn't in your dependencies.`);\n red(' Please install it with yarn/npm.');\n return false;\n } else if (\n !this._fulfillsVersionRange(\n depsVersion,\n acceptableVersions,\n canBeLatest,\n ) &&\n !this._fulfillsVersionRange(\n devDepsVersion,\n acceptableVersions,\n canBeLatest,\n )\n ) {\n red(\n `✗ Your \\`package.json\\` specifies a version of \\`${packageName}\\` outside of the compatible version range ${acceptableVersions}.\\n`,\n );\n return false;\n } else {\n green(\n `✓ A compatible version of \\`${packageName}\\` is specified in \\`package.json\\`.`,\n );\n return true;\n }\n }\n\n private _fulfillsVersionRange(\n version: string,\n acceptableVersions: string,\n canBeLatest: boolean,\n ): boolean {\n if (version === 'latest') {\n return canBeLatest;\n }\n\n let cleanedUserVersion, isRange;\n\n if (valid(version)) {\n cleanedUserVersion = valid(version);\n isRange = false;\n } else if (validRange(version)) {\n cleanedUserVersion = validRange(version);\n isRange = true;\n }\n\n return (\n // If the given version is a bogus format, this will still be undefined and we'll automatically reject it\n !!cleanedUserVersion &&\n (isRange\n ? subset(cleanedUserVersion, acceptableVersions)\n : satisfies(cleanedUserVersion, acceptableVersions))\n );\n }\n\n private _spliceInPlace(\n arr: Array<any>,\n start: number,\n deleteCount: number,\n ...inserts: any[]\n ): Array<any> {\n arr.splice(start, deleteCount, ...inserts);\n return arr;\n }\n}\n"]}
|
|
@@ -255,8 +255,8 @@ var ReactNative = /** @class */ (function (_super) {
|
|
|
255
255
|
ReactNative.prototype._patchExistingXcodeBuildScripts = function (buildScripts) {
|
|
256
256
|
for (var _i = 0, buildScripts_1 = buildScripts; _i < buildScripts_1.length; _i++) {
|
|
257
257
|
var script = buildScripts_1[_i];
|
|
258
|
-
if (!script.shellScript.match(
|
|
259
|
-
script.shellScript.match(/sentry-cli\s+react-native
|
|
258
|
+
if (!script.shellScript.match(/\/scripts\/react-native-xcode\.sh/i) ||
|
|
259
|
+
script.shellScript.match(/sentry-cli\s+react-native\s+xcode/i)) {
|
|
260
260
|
continue;
|
|
261
261
|
}
|
|
262
262
|
var code = JSON.parse(script.shellScript);
|
|
@@ -264,8 +264,9 @@ var ReactNative = /** @class */ (function (_super) {
|
|
|
264
264
|
// eslint-disable-next-line prefer-template
|
|
265
265
|
'export SENTRY_PROPERTIES=sentry.properties\n' +
|
|
266
266
|
'export EXTRA_PACKAGER_ARGS="--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map"\n' +
|
|
267
|
-
code.replace(
|
|
268
|
-
|
|
267
|
+
code.replace('$REACT_NATIVE_XCODE', function () {
|
|
268
|
+
// eslint-disable-next-line no-useless-escape
|
|
269
|
+
return '\\\"../node_modules/@sentry/cli/bin/sentry-cli react-native xcode $REACT_NATIVE_XCODE\\\"';
|
|
269
270
|
});
|
|
270
271
|
script.shellScript = JSON.stringify(code);
|
|
271
272
|
}
|
|
@@ -345,29 +346,16 @@ var ReactNative = /** @class */ (function (_super) {
|
|
|
345
346
|
continue;
|
|
346
347
|
}
|
|
347
348
|
// ignore scripts that do not invoke the react-native-xcode command.
|
|
348
|
-
if (!script.shellScript.match(/sentry-cli\s+react-native
|
|
349
|
+
if (!script.shellScript.match(/sentry-cli\s+react-native\s+xcode/i)) {
|
|
349
350
|
continue;
|
|
350
351
|
}
|
|
351
352
|
script.shellScript = JSON.stringify(JSON.parse(script.shellScript)
|
|
352
|
-
// "legacy" location for this. This is what happens if users followed
|
|
353
|
-
// the old documentation for where to add the bundle command
|
|
354
|
-
.replace(/^..\/node_modules\/@sentry\/react-native\/bin\/bundle-frameworks\s*?\r\n?/m, '')
|
|
355
|
-
// legacy location for dsym upload
|
|
356
|
-
.replace(/^..\/node_modules\/@sentry\/cli\/bin\/sentry-cli upload-dsym\s*?\r?\n/m, '')
|
|
357
353
|
// remove sentry properties export
|
|
358
354
|
.replace(/^export SENTRY_PROPERTIES=sentry.properties\r?\n/m, '')
|
|
359
355
|
// unwrap react-native-xcode.sh command. In case someone replaced it
|
|
360
356
|
// entirely with the sentry-cli command we need to put the original
|
|
361
357
|
// version back in.
|
|
362
|
-
.replace(
|
|
363
|
-
var rv = m1.trim();
|
|
364
|
-
if (rv === '') {
|
|
365
|
-
return '../node_modules/react-native/scripts/react-native-xcode.sh';
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
return rv;
|
|
369
|
-
}
|
|
370
|
-
}));
|
|
358
|
+
.replace(/\.\.\/node_modules\/@sentry\/cli\/bin\/sentry-cli\s+react-native\s+xcode\s+\$REACT_NATIVE_XCODE/i, '$REACT_NATIVE_XCODE'));
|
|
371
359
|
}
|
|
372
360
|
// scripts to kill entirely.
|
|
373
361
|
for (var _b = 0, _c = Object.keys(scripts); _b < _c.length; _b++) {
|
|
@@ -377,8 +365,7 @@ var ReactNative = /** @class */ (function (_super) {
|
|
|
377
365
|
if (typeof script === 'string' || script === undefined) {
|
|
378
366
|
continue;
|
|
379
367
|
}
|
|
380
|
-
if (script.shellScript.match(/@sentry\/
|
|
381
|
-
script.shellScript.match(/@sentry\/cli\/bin\/sentry-cli\s+upload-dsym\b/)) {
|
|
368
|
+
if (script.shellScript.match(/@sentry\/cli\/bin\/sentry-cli\s+upload-dsym\b/)) {
|
|
382
369
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
383
370
|
delete scripts[key];
|
|
384
371
|
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactNative.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/ReactNative.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport * as fs from 'fs';\nimport { Answers } from 'inquirer';\nimport * as _ from 'lodash';\nimport * as path from 'path';\n\nimport { Args } from '../../Constants';\nimport { exists, matchesContent, patchMatchingFile } from '../../Helper/File';\nimport { dim, green, red } from '../../Helper/Logging';\nimport { SentryCli } from '../../Helper/SentryCli';\nimport { MobileProject } from './MobileProject';\n\nconst xcode = require('xcode');\n\nexport class ReactNative extends MobileProject {\n protected _answers: Answers;\n protected _sentryCli: SentryCli;\n\n constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n if (this._argv.uninstall) {\n return this.uninstall(answers);\n }\n if (!(await this.shouldEmit(answers))) {\n return {};\n }\n\n const sentryCliProperties = this._sentryCli.convertAnswersToProperties(\n answers,\n );\n\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n const promises = this.getPlatforms(answers).map(\n async (platform: string) => {\n try {\n if (platform === 'ios') {\n await patchMatchingFile(\n 'ios/*.xcodeproj/project.pbxproj',\n this._patchXcodeProj.bind(this),\n );\n dim(`✅ Patched build script in Xcode project.`);\n } else {\n await patchMatchingFile(\n '**/app/build.gradle',\n this._patchBuildGradle.bind(this),\n );\n dim(`✅ Patched build.gradle file.`);\n }\n await patchMatchingFile(\n `index.${platform}.js`,\n this._patchJs.bind(this),\n answers,\n platform,\n );\n // rm 0.49 introduced an App.js for both platforms\n await patchMatchingFile(\n 'App.js',\n this._patchJs.bind(this),\n answers,\n platform,\n );\n dim(`✅ Patched App.js file.`);\n await this._addSentryProperties(platform, sentryCliProperties);\n dim(`✅ Added sentry.properties file to ${platform}`);\n\n green(`Successfully set up ${platform} for react-native`);\n } catch (e) {\n red(e);\n }\n },\n );\n Promise.all(promises)\n .then(resolve)\n .catch(reject);\n });\n }\n\n public async uninstall(_answers: Answers): Promise<Answers> {\n await patchMatchingFile(\n '**/*.xcodeproj/project.pbxproj',\n this._unpatchXcodeProj.bind(this),\n );\n await patchMatchingFile(\n '**/app/build.gradle',\n this._unpatchBuildGradle.bind(this),\n );\n return {};\n }\n\n protected async _shouldConfigurePlatform(platform: string): Promise<boolean> {\n let result = false;\n\n if (!exists(`${platform}/sentry.properties`)) {\n result = true;\n this.debug(`${platform}/sentry.properties not exists`);\n }\n\n if (!matchesContent('**/*.xcodeproj/project.pbxproj', /sentry-cli/gi)) {\n result = true;\n this.debug('**/*.xcodeproj/project.pbxproj not matched');\n }\n\n if (!matchesContent('**/app/build.gradle', /sentry\\.gradle/gi)) {\n result = true;\n this.debug('**/app/build.gradle not matched');\n }\n\n const regex = /Sentry/gi;\n if (\n exists(`index.${platform}.js`) &&\n !matchesContent(`index.${platform}.js`, regex)\n ) {\n result = true;\n this.debug(`index.${platform}.js not matched`);\n }\n if (exists('App.js') && !matchesContent('App.js', regex)) {\n result = true;\n this.debug('index.js or App.js not matched');\n }\n\n if (this._argv.uninstall) {\n // if we uninstall we need to invert the result so we remove already patched\n // but leave untouched platforms as they are\n return !result;\n }\n\n return result;\n }\n\n private _addSentryProperties(\n platform: string,\n properties: any,\n ): Promise<void> {\n let rv = Promise.resolve();\n\n // This will create the ios/android folder before trying to write\n // sentry.properties in it which would fail otherwise\n if (!fs.existsSync(platform)) {\n dim(`${platform} folder did not exist, creating it.`);\n fs.mkdirSync(platform);\n }\n const fn = path.join(platform, 'sentry.properties');\n\n if (platform === 'android' && properties['cli/executable']) {\n // We don't need to write the sentry-cli path in the properties file\n // since our gradle plugins already pick it up on the correct spot\n delete properties['cli/executable'];\n }\n rv = rv.then(() =>\n fs.writeFileSync(fn, this._sentryCli.dumpProperties(properties)),\n );\n\n return rv;\n }\n\n private _patchJs(\n contents: string,\n _filename: string,\n answers: Answers,\n platform?: string,\n ): Promise<string | null> {\n // since the init call could live in other places too, we really only\n // want to do this if we managed to patch any of the other files as well.\n if (contents.match(/Sentry.config\\(/)) {\n return Promise.resolve(null);\n }\n\n // if we match @sentry\\/react-native somewhere, we already patched the file\n // and no longer need to\n if (contents.match('@sentry/react-native')) {\n return Promise.resolve(contents);\n }\n\n let dsn = '__DSN__';\n this.getPlatforms(answers).forEach((selectedPlatform: string) => {\n if (platform && selectedPlatform === platform) {\n dsn = _.get(answers, 'config.dsn.public', null);\n } else if (platform === undefined) {\n dsn = _.get(answers, 'config.dsn.public', null);\n }\n });\n\n return Promise.resolve(\n contents.replace(\n /^([^]*)(import\\s+[^;]*?;$)/m,\n match =>\n // eslint-disable-next-line prefer-template\n match +\n \"\\n\\nimport * as Sentry from '@sentry/react-native';\\n\\n\" +\n `Sentry.init({ \\n` +\n ` dsn: '${dsn}', \\n` +\n `});\\n`,\n ),\n );\n }\n\n // ANDROID -----------------------------------------\n\n private _patchBuildGradle(contents: string): Promise<string | null> {\n const applyFrom =\n 'apply from: \"../../node_modules/@sentry/react-native/sentry.gradle\"';\n if (contents.indexOf(applyFrom) >= 0) {\n return Promise.resolve(null);\n }\n return Promise.resolve(\n contents.replace(\n /^apply from: \"..\\/..\\/node_modules\\/react-native\\/react.gradle\"/m,\n // eslint-disable-next-line prefer-template\n match => match + '\\n' + applyFrom,\n ),\n );\n }\n\n private _unpatchBuildGradle(contents: string): Promise<string> {\n return Promise.resolve(\n contents.replace(\n /^\\s*apply from: [\"']..\\/..\\/node_modules\\/@sentry\\/react-native\\/sentry.gradle[\"'];?\\s*?\\r?\\n/m,\n '',\n ),\n );\n }\n\n // IOS -----------------------------------------\n\n private _patchExistingXcodeBuildScripts(buildScripts: any): void {\n for (const script of buildScripts) {\n if (\n !script.shellScript.match(\n /(packager|scripts)\\/react-native-xcode\\.sh\\b/,\n ) ||\n script.shellScript.match(/sentry-cli\\s+react-native[\\s-]xcode/)\n ) {\n continue;\n }\n let code = JSON.parse(script.shellScript);\n code =\n // eslint-disable-next-line prefer-template\n 'export SENTRY_PROPERTIES=sentry.properties\\n' +\n 'export EXTRA_PACKAGER_ARGS=\"--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map\"\\n' +\n code.replace(\n /^.*?\\/(packager|scripts)\\/react-native-xcode\\.sh\\s*/m,\n (match: any) =>\n `../node_modules/@sentry/cli/bin/sentry-cli react-native xcode ${match}`,\n );\n script.shellScript = JSON.stringify(code);\n }\n }\n\n private _addNewXcodeBuildPhaseForSymbols(buildScripts: any, proj: any): void {\n for (const script of buildScripts) {\n if (script.shellScript.match(/sentry-cli\\s+upload-dsym/)) {\n return;\n }\n }\n\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n 'export SENTRY_PROPERTIES=sentry.properties\\\\n' +\n '../node_modules/@sentry/cli/bin/sentry-cli upload-dsym',\n },\n );\n }\n\n private _patchXcodeProj(contents: string, filename: string): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n const buildScripts = [];\n for (const key in proj.hash.project.objects.PBXShellScriptBuildPhase ||\n {}) {\n if (\n // eslint-disable-next-line no-prototype-builtins\n proj.hash.project.objects.PBXShellScriptBuildPhase.hasOwnProperty(\n key,\n )\n ) {\n const val = proj.hash.project.objects.PBXShellScriptBuildPhase[key];\n if (val.isa) {\n buildScripts.push(val);\n }\n }\n }\n\n try {\n this._patchExistingXcodeBuildScripts(buildScripts);\n } catch (e) {\n red(e);\n }\n try {\n this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);\n } catch (e) {\n red(e);\n }\n\n // we always modify the xcode file in memory but we only want to save it\n // in case the user wants configuration for ios. This is why we check\n // here first if changes are made before we might prompt the platform\n // continue prompt.\n const newContents = proj.writeSync();\n if (newContents === contents) {\n resolve();\n } else {\n resolve(newContents);\n }\n });\n });\n }\n\n private _unpatchXcodeBuildScripts(proj: any): void {\n const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};\n const firstTarget = proj.getFirstTarget().uuid;\n const nativeTargets = proj.hash.project.objects.PBXNativeTarget;\n\n // scripts to patch partially. Run this first so that we don't\n // accidentally delete some scripts later entirely that we only want to\n // rewrite.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments\n if (typeof script === 'string') {\n continue;\n }\n\n // ignore scripts that do not invoke the react-native-xcode command.\n if (!script.shellScript.match(/sentry-cli\\s+react-native[\\s-]xcode\\b/)) {\n continue;\n }\n\n script.shellScript = JSON.stringify(\n JSON.parse(script.shellScript)\n // \"legacy\" location for this. This is what happens if users followed\n // the old documentation for where to add the bundle command\n .replace(\n /^..\\/node_modules\\/@sentry\\/react-native\\/bin\\/bundle-frameworks\\s*?\\r\\n?/m,\n '',\n )\n // legacy location for dsym upload\n .replace(\n /^..\\/node_modules\\/@sentry\\/cli\\/bin\\/sentry-cli upload-dsym\\s*?\\r?\\n/m,\n '',\n )\n // remove sentry properties export\n .replace(/^export SENTRY_PROPERTIES=sentry.properties\\r?\\n/m, '')\n // unwrap react-native-xcode.sh command. In case someone replaced it\n // entirely with the sentry-cli command we need to put the original\n // version back in.\n .replace(\n /^(?:..\\/node_modules\\/@sentry\\/cli\\/bin\\/)?sentry-cli\\s+react-native[\\s-]xcode(\\s+.*?)$/m,\n (match: any, m1: string) => {\n const rv = m1.trim();\n if (rv === '') {\n return '../node_modules/react-native/scripts/react-native-xcode.sh';\n } else {\n return rv;\n }\n },\n ),\n );\n }\n\n // scripts to kill entirely.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments and keys that got deleted\n if (typeof script === 'string' || script === undefined) {\n continue;\n }\n\n if (\n script.shellScript.match(\n /@sentry\\/react-native\\/bin\\/bundle-frameworks\\b/,\n ) ||\n script.shellScript.match(\n /@sentry\\/cli\\/bin\\/sentry-cli\\s+upload-dsym\\b/,\n )\n ) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[`${key}_comment`];\n const phases = nativeTargets[firstTarget].buildPhases;\n if (phases) {\n for (let i = 0; i < phases.length; i++) {\n if (phases[i].value === key) {\n phases.splice(i, 1);\n break;\n }\n }\n }\n continue;\n }\n }\n }\n\n private _unpatchXcodeProj(\n _contents: string,\n filename: string,\n ): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n this._unpatchXcodeBuildScripts(proj);\n resolve(proj.writeSync());\n });\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ReactNative.js","sourceRoot":"","sources":["../../../../lib/Steps/Integrations/ReactNative.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport * as fs from 'fs';\nimport { Answers } from 'inquirer';\nimport * as _ from 'lodash';\nimport * as path from 'path';\n\nimport { Args } from '../../Constants';\nimport { exists, matchesContent, patchMatchingFile } from '../../Helper/File';\nimport { dim, green, red } from '../../Helper/Logging';\nimport { SentryCli } from '../../Helper/SentryCli';\nimport { MobileProject } from './MobileProject';\n\nconst xcode = require('xcode');\n\nexport class ReactNative extends MobileProject {\n protected _answers: Answers;\n protected _sentryCli: SentryCli;\n\n constructor(protected _argv: Args) {\n super(_argv);\n this._sentryCli = new SentryCli(this._argv);\n }\n\n public async emit(answers: Answers): Promise<Answers> {\n if (this._argv.uninstall) {\n return this.uninstall(answers);\n }\n if (!(await this.shouldEmit(answers))) {\n return {};\n }\n\n const sentryCliProperties = this._sentryCli.convertAnswersToProperties(\n answers,\n );\n\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n const promises = this.getPlatforms(answers).map(\n async (platform: string) => {\n try {\n if (platform === 'ios') {\n await patchMatchingFile(\n 'ios/*.xcodeproj/project.pbxproj',\n this._patchXcodeProj.bind(this),\n );\n dim(`✅ Patched build script in Xcode project.`);\n } else {\n await patchMatchingFile(\n '**/app/build.gradle',\n this._patchBuildGradle.bind(this),\n );\n dim(`✅ Patched build.gradle file.`);\n }\n await patchMatchingFile(\n `index.${platform}.js`,\n this._patchJs.bind(this),\n answers,\n platform,\n );\n // rm 0.49 introduced an App.js for both platforms\n await patchMatchingFile(\n 'App.js',\n this._patchJs.bind(this),\n answers,\n platform,\n );\n dim(`✅ Patched App.js file.`);\n await this._addSentryProperties(platform, sentryCliProperties);\n dim(`✅ Added sentry.properties file to ${platform}`);\n\n green(`Successfully set up ${platform} for react-native`);\n } catch (e) {\n red(e);\n }\n },\n );\n Promise.all(promises)\n .then(resolve)\n .catch(reject);\n });\n }\n\n public async uninstall(_answers: Answers): Promise<Answers> {\n await patchMatchingFile(\n '**/*.xcodeproj/project.pbxproj',\n this._unpatchXcodeProj.bind(this),\n );\n await patchMatchingFile(\n '**/app/build.gradle',\n this._unpatchBuildGradle.bind(this),\n );\n return {};\n }\n\n protected async _shouldConfigurePlatform(platform: string): Promise<boolean> {\n let result = false;\n\n if (!exists(`${platform}/sentry.properties`)) {\n result = true;\n this.debug(`${platform}/sentry.properties not exists`);\n }\n\n if (!matchesContent('**/*.xcodeproj/project.pbxproj', /sentry-cli/gi)) {\n result = true;\n this.debug('**/*.xcodeproj/project.pbxproj not matched');\n }\n\n if (!matchesContent('**/app/build.gradle', /sentry\\.gradle/gi)) {\n result = true;\n this.debug('**/app/build.gradle not matched');\n }\n\n const regex = /Sentry/gi;\n if (\n exists(`index.${platform}.js`) &&\n !matchesContent(`index.${platform}.js`, regex)\n ) {\n result = true;\n this.debug(`index.${platform}.js not matched`);\n }\n if (exists('App.js') && !matchesContent('App.js', regex)) {\n result = true;\n this.debug('index.js or App.js not matched');\n }\n\n if (this._argv.uninstall) {\n // if we uninstall we need to invert the result so we remove already patched\n // but leave untouched platforms as they are\n return !result;\n }\n\n return result;\n }\n\n private _addSentryProperties(\n platform: string,\n properties: any,\n ): Promise<void> {\n let rv = Promise.resolve();\n\n // This will create the ios/android folder before trying to write\n // sentry.properties in it which would fail otherwise\n if (!fs.existsSync(platform)) {\n dim(`${platform} folder did not exist, creating it.`);\n fs.mkdirSync(platform);\n }\n const fn = path.join(platform, 'sentry.properties');\n\n if (platform === 'android' && properties['cli/executable']) {\n // We don't need to write the sentry-cli path in the properties file\n // since our gradle plugins already pick it up on the correct spot\n delete properties['cli/executable'];\n }\n rv = rv.then(() =>\n fs.writeFileSync(fn, this._sentryCli.dumpProperties(properties)),\n );\n\n return rv;\n }\n\n private _patchJs(\n contents: string,\n _filename: string,\n answers: Answers,\n platform?: string,\n ): Promise<string | null> {\n // since the init call could live in other places too, we really only\n // want to do this if we managed to patch any of the other files as well.\n if (contents.match(/Sentry.config\\(/)) {\n return Promise.resolve(null);\n }\n\n // if we match @sentry\\/react-native somewhere, we already patched the file\n // and no longer need to\n if (contents.match('@sentry/react-native')) {\n return Promise.resolve(contents);\n }\n\n let dsn = '__DSN__';\n this.getPlatforms(answers).forEach((selectedPlatform: string) => {\n if (platform && selectedPlatform === platform) {\n dsn = _.get(answers, 'config.dsn.public', null);\n } else if (platform === undefined) {\n dsn = _.get(answers, 'config.dsn.public', null);\n }\n });\n\n return Promise.resolve(\n contents.replace(\n /^([^]*)(import\\s+[^;]*?;$)/m,\n match =>\n // eslint-disable-next-line prefer-template\n match +\n \"\\n\\nimport * as Sentry from '@sentry/react-native';\\n\\n\" +\n `Sentry.init({ \\n` +\n ` dsn: '${dsn}', \\n` +\n `});\\n`,\n ),\n );\n }\n\n // ANDROID -----------------------------------------\n\n private _patchBuildGradle(contents: string): Promise<string | null> {\n const applyFrom =\n 'apply from: \"../../node_modules/@sentry/react-native/sentry.gradle\"';\n if (contents.indexOf(applyFrom) >= 0) {\n return Promise.resolve(null);\n }\n return Promise.resolve(\n contents.replace(\n /^apply from: \"..\\/..\\/node_modules\\/react-native\\/react.gradle\"/m,\n // eslint-disable-next-line prefer-template\n match => match + '\\n' + applyFrom,\n ),\n );\n }\n\n private _unpatchBuildGradle(contents: string): Promise<string> {\n return Promise.resolve(\n contents.replace(\n /^\\s*apply from: [\"']..\\/..\\/node_modules\\/@sentry\\/react-native\\/sentry.gradle[\"'];?\\s*?\\r?\\n/m,\n '',\n ),\n );\n }\n\n // IOS -----------------------------------------\n\n private _patchExistingXcodeBuildScripts(buildScripts: any): void {\n for (const script of buildScripts) {\n if (\n !script.shellScript.match(\n /\\/scripts\\/react-native-xcode\\.sh/i,\n ) ||\n script.shellScript.match(/sentry-cli\\s+react-native\\s+xcode/i)\n ) {\n continue;\n }\n let code = JSON.parse(script.shellScript);\n code =\n // eslint-disable-next-line prefer-template\n 'export SENTRY_PROPERTIES=sentry.properties\\n' +\n 'export EXTRA_PACKAGER_ARGS=\"--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map\"\\n' +\n code.replace(\n '$REACT_NATIVE_XCODE',\n () =>\n // eslint-disable-next-line no-useless-escape\n '\\\\\\\"../node_modules/@sentry/cli/bin/sentry-cli react-native xcode $REACT_NATIVE_XCODE\\\\\\\"',\n );\n script.shellScript = JSON.stringify(code);\n }\n }\n\n private _addNewXcodeBuildPhaseForSymbols(buildScripts: any, proj: any): void {\n for (const script of buildScripts) {\n if (script.shellScript.match(/sentry-cli\\s+upload-dsym/)) {\n return;\n }\n }\n\n proj.addBuildPhase(\n [],\n 'PBXShellScriptBuildPhase',\n 'Upload Debug Symbols to Sentry',\n null,\n {\n shellPath: '/bin/sh',\n shellScript:\n 'export SENTRY_PROPERTIES=sentry.properties\\\\n' +\n '../node_modules/@sentry/cli/bin/sentry-cli upload-dsym',\n },\n );\n }\n\n private _patchXcodeProj(contents: string, filename: string): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n const buildScripts = [];\n for (const key in proj.hash.project.objects.PBXShellScriptBuildPhase ||\n {}) {\n if (\n // eslint-disable-next-line no-prototype-builtins\n proj.hash.project.objects.PBXShellScriptBuildPhase.hasOwnProperty(\n key,\n )\n ) {\n const val = proj.hash.project.objects.PBXShellScriptBuildPhase[key];\n if (val.isa) {\n buildScripts.push(val);\n }\n }\n }\n\n try {\n this._patchExistingXcodeBuildScripts(buildScripts);\n } catch (e) {\n red(e);\n }\n try {\n this._addNewXcodeBuildPhaseForSymbols(buildScripts, proj);\n } catch (e) {\n red(e);\n }\n\n // we always modify the xcode file in memory but we only want to save it\n // in case the user wants configuration for ios. This is why we check\n // here first if changes are made before we might prompt the platform\n // continue prompt.\n const newContents = proj.writeSync();\n if (newContents === contents) {\n resolve();\n } else {\n resolve(newContents);\n }\n });\n });\n }\n\n private _unpatchXcodeBuildScripts(proj: any): void {\n const scripts = proj.hash.project.objects.PBXShellScriptBuildPhase || {};\n const firstTarget = proj.getFirstTarget().uuid;\n const nativeTargets = proj.hash.project.objects.PBXNativeTarget;\n\n // scripts to patch partially. Run this first so that we don't\n // accidentally delete some scripts later entirely that we only want to\n // rewrite.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments\n if (typeof script === 'string') {\n continue;\n }\n\n // ignore scripts that do not invoke the react-native-xcode command.\n if (!script.shellScript.match(/sentry-cli\\s+react-native\\s+xcode/i)) {\n continue;\n }\n\n script.shellScript = JSON.stringify(\n JSON.parse(script.shellScript)\n // remove sentry properties export\n .replace(/^export SENTRY_PROPERTIES=sentry.properties\\r?\\n/m, '')\n // unwrap react-native-xcode.sh command. In case someone replaced it\n // entirely with the sentry-cli command we need to put the original\n // version back in.\n .replace(\n /\\.\\.\\/node_modules\\/@sentry\\/cli\\/bin\\/sentry-cli\\s+react-native\\s+xcode\\s+\\$REACT_NATIVE_XCODE/i,\n '$REACT_NATIVE_XCODE',\n ),\n );\n }\n\n // scripts to kill entirely.\n for (const key of Object.keys(scripts)) {\n const script = scripts[key];\n\n // ignore comments and keys that got deleted\n if (typeof script === 'string' || script === undefined) {\n continue;\n }\n\n if (\n script.shellScript.match(\n /@sentry\\/cli\\/bin\\/sentry-cli\\s+upload-dsym\\b/,\n )\n ) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[key];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete scripts[`${key}_comment`];\n const phases = nativeTargets[firstTarget].buildPhases;\n if (phases) {\n for (let i = 0; i < phases.length; i++) {\n if (phases[i].value === key) {\n phases.splice(i, 1);\n break;\n }\n }\n }\n continue;\n }\n }\n }\n\n private _unpatchXcodeProj(\n _contents: string,\n filename: string,\n ): Promise<string> {\n const proj = xcode.project(filename);\n return new Promise((resolve, reject) => {\n proj.parse((err: any) => {\n if (err) {\n reject(err);\n return;\n }\n\n this._unpatchXcodeBuildScripts(proj);\n resolve(proj.writeSync());\n });\n });\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* eslint-disable max-lines */
|
|
2
|
+
import Chalk from 'chalk';
|
|
2
3
|
import * as fs from 'fs';
|
|
3
4
|
import { Answers, prompt } from 'inquirer';
|
|
4
5
|
import * as _ from 'lodash';
|
|
@@ -11,6 +12,7 @@ import { SentryCli, SentryCliProps } from '../../Helper/SentryCli';
|
|
|
11
12
|
import { BaseIntegration } from './BaseIntegration';
|
|
12
13
|
|
|
13
14
|
const COMPATIBLE_NEXTJS_VERSIONS = '>=10.0.8 <13.0.0';
|
|
15
|
+
const COMPATIBLE_SDK_VERSIONS = '>=7.3.0';
|
|
14
16
|
const PROPERTIES_FILENAME = 'sentry.properties';
|
|
15
17
|
const SENTRYCLIRC_FILENAME = '.sentryclirc';
|
|
16
18
|
const GITIGNORE_FILENAME = '.gitignore';
|
|
@@ -49,12 +51,15 @@ export class NextJs extends BaseIntegration {
|
|
|
49
51
|
const sentryCliProps = this._sentryCli.convertAnswersToProperties(answers);
|
|
50
52
|
await this._createSentryCliConfig(sentryCliProps);
|
|
51
53
|
|
|
52
|
-
const
|
|
54
|
+
const templateDirectory = path.join(
|
|
53
55
|
__dirname,
|
|
54
56
|
'..',
|
|
55
57
|
'..',
|
|
56
58
|
'..',
|
|
57
59
|
'NextJs',
|
|
60
|
+
);
|
|
61
|
+
const configDirectory = path.join(
|
|
62
|
+
templateDirectory,
|
|
58
63
|
CONFIG_DIR,
|
|
59
64
|
);
|
|
60
65
|
|
|
@@ -67,6 +72,30 @@ export class NextJs extends BaseIntegration {
|
|
|
67
72
|
nl();
|
|
68
73
|
}
|
|
69
74
|
|
|
75
|
+
const selectedProjectSlug: string | null = answers.config?.project?.slug;
|
|
76
|
+
if (selectedProjectSlug) {
|
|
77
|
+
const hasFirstEvent = answers.wizard?.projects?.find?.((p: { slug: string; }) => p.slug === selectedProjectSlug)?.firstEvent;
|
|
78
|
+
if (!hasFirstEvent) {
|
|
79
|
+
this._setTemplate(
|
|
80
|
+
templateDirectory,
|
|
81
|
+
'sentry_sample_error.js',
|
|
82
|
+
['pages', 'src/pages'],
|
|
83
|
+
dsn,
|
|
84
|
+
);
|
|
85
|
+
l(
|
|
86
|
+
Chalk.bgYellowBright(`
|
|
87
|
+
|------------------------------------------------------------------------|
|
|
88
|
+
| Installation Complete |
|
|
89
|
+
| To verify your installation and finish onboarding, launch your Next.js |
|
|
90
|
+
| application, navigate to https://localhost:3000/sentry_sample_error |
|
|
91
|
+
| and send us a sample error. |
|
|
92
|
+
|------------------------------------------------------------------------|
|
|
93
|
+
`
|
|
94
|
+
)
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
70
99
|
l(
|
|
71
100
|
'For more information, see https://docs.sentry.io/platforms/javascript/guides/nextjs/',
|
|
72
101
|
);
|
|
@@ -83,7 +112,15 @@ export class NextJs extends BaseIntegration {
|
|
|
83
112
|
nl();
|
|
84
113
|
|
|
85
114
|
let userAnswers: Answers = { continue: true };
|
|
86
|
-
if (
|
|
115
|
+
if (
|
|
116
|
+
(!this._checkPackageVersion('next', COMPATIBLE_NEXTJS_VERSIONS, true) ||
|
|
117
|
+
!this._checkPackageVersion(
|
|
118
|
+
'@sentry/nextjs',
|
|
119
|
+
COMPATIBLE_SDK_VERSIONS,
|
|
120
|
+
true,
|
|
121
|
+
)) &&
|
|
122
|
+
!this._argv.quiet
|
|
123
|
+
) {
|
|
87
124
|
userAnswers = await prompt({
|
|
88
125
|
message:
|
|
89
126
|
'There were errors during your project checkup, do you still want to continue?',
|
|
@@ -270,7 +307,11 @@ export class NextJs extends BaseIntegration {
|
|
|
270
307
|
fs.writeFileSync(targetPath, filledTemplate);
|
|
271
308
|
}
|
|
272
309
|
|
|
273
|
-
private
|
|
310
|
+
private _checkPackageVersion(
|
|
311
|
+
packageName: string,
|
|
312
|
+
acceptableVersions: string,
|
|
313
|
+
canBeLatest: boolean,
|
|
314
|
+
): boolean {
|
|
274
315
|
const depsVersion = _.get(appPackage, ['dependencies', packageName]);
|
|
275
316
|
const devDepsVersion = _.get(appPackage, ['devDependencies', packageName]);
|
|
276
317
|
|
|
@@ -279,11 +320,19 @@ export class NextJs extends BaseIntegration {
|
|
|
279
320
|
red(' Please install it with yarn/npm.');
|
|
280
321
|
return false;
|
|
281
322
|
} else if (
|
|
282
|
-
!this._fulfillsVersionRange(
|
|
283
|
-
|
|
323
|
+
!this._fulfillsVersionRange(
|
|
324
|
+
depsVersion,
|
|
325
|
+
acceptableVersions,
|
|
326
|
+
canBeLatest,
|
|
327
|
+
) &&
|
|
328
|
+
!this._fulfillsVersionRange(
|
|
329
|
+
devDepsVersion,
|
|
330
|
+
acceptableVersions,
|
|
331
|
+
canBeLatest,
|
|
332
|
+
)
|
|
284
333
|
) {
|
|
285
334
|
red(
|
|
286
|
-
`✗ Your \`package.json\` specifies a version of \`${packageName}\` outside of the compatible version range ${
|
|
335
|
+
`✗ Your \`package.json\` specifies a version of \`${packageName}\` outside of the compatible version range ${acceptableVersions}.\n`,
|
|
287
336
|
);
|
|
288
337
|
return false;
|
|
289
338
|
} else {
|
|
@@ -294,10 +343,13 @@ export class NextJs extends BaseIntegration {
|
|
|
294
343
|
}
|
|
295
344
|
}
|
|
296
345
|
|
|
297
|
-
private _fulfillsVersionRange(
|
|
298
|
-
|
|
346
|
+
private _fulfillsVersionRange(
|
|
347
|
+
version: string,
|
|
348
|
+
acceptableVersions: string,
|
|
349
|
+
canBeLatest: boolean,
|
|
350
|
+
): boolean {
|
|
299
351
|
if (version === 'latest') {
|
|
300
|
-
return
|
|
352
|
+
return canBeLatest;
|
|
301
353
|
}
|
|
302
354
|
|
|
303
355
|
let cleanedUserVersion, isRange;
|
|
@@ -311,10 +363,11 @@ export class NextJs extends BaseIntegration {
|
|
|
311
363
|
}
|
|
312
364
|
|
|
313
365
|
return (
|
|
366
|
+
// If the given version is a bogus format, this will still be undefined and we'll automatically reject it
|
|
314
367
|
!!cleanedUserVersion &&
|
|
315
368
|
(isRange
|
|
316
|
-
? subset(cleanedUserVersion,
|
|
317
|
-
: satisfies(cleanedUserVersion,
|
|
369
|
+
? subset(cleanedUserVersion, acceptableVersions)
|
|
370
|
+
: satisfies(cleanedUserVersion, acceptableVersions))
|
|
318
371
|
);
|
|
319
372
|
}
|
|
320
373
|
|
|
@@ -231,9 +231,9 @@ export class ReactNative extends MobileProject {
|
|
|
231
231
|
for (const script of buildScripts) {
|
|
232
232
|
if (
|
|
233
233
|
!script.shellScript.match(
|
|
234
|
-
|
|
234
|
+
/\/scripts\/react-native-xcode\.sh/i,
|
|
235
235
|
) ||
|
|
236
|
-
script.shellScript.match(/sentry-cli\s+react-native
|
|
236
|
+
script.shellScript.match(/sentry-cli\s+react-native\s+xcode/i)
|
|
237
237
|
) {
|
|
238
238
|
continue;
|
|
239
239
|
}
|
|
@@ -243,9 +243,10 @@ export class ReactNative extends MobileProject {
|
|
|
243
243
|
'export SENTRY_PROPERTIES=sentry.properties\n' +
|
|
244
244
|
'export EXTRA_PACKAGER_ARGS="--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map"\n' +
|
|
245
245
|
code.replace(
|
|
246
|
-
|
|
247
|
-
(
|
|
248
|
-
|
|
246
|
+
'$REACT_NATIVE_XCODE',
|
|
247
|
+
() =>
|
|
248
|
+
// eslint-disable-next-line no-useless-escape
|
|
249
|
+
'\\\"../node_modules/@sentry/cli/bin/sentry-cli react-native xcode $REACT_NATIVE_XCODE\\\"',
|
|
249
250
|
);
|
|
250
251
|
script.shellScript = JSON.stringify(code);
|
|
251
252
|
}
|
|
@@ -339,38 +340,20 @@ export class ReactNative extends MobileProject {
|
|
|
339
340
|
}
|
|
340
341
|
|
|
341
342
|
// ignore scripts that do not invoke the react-native-xcode command.
|
|
342
|
-
if (!script.shellScript.match(/sentry-cli\s+react-native
|
|
343
|
+
if (!script.shellScript.match(/sentry-cli\s+react-native\s+xcode/i)) {
|
|
343
344
|
continue;
|
|
344
345
|
}
|
|
345
346
|
|
|
346
347
|
script.shellScript = JSON.stringify(
|
|
347
348
|
JSON.parse(script.shellScript)
|
|
348
|
-
// "legacy" location for this. This is what happens if users followed
|
|
349
|
-
// the old documentation for where to add the bundle command
|
|
350
|
-
.replace(
|
|
351
|
-
/^..\/node_modules\/@sentry\/react-native\/bin\/bundle-frameworks\s*?\r\n?/m,
|
|
352
|
-
'',
|
|
353
|
-
)
|
|
354
|
-
// legacy location for dsym upload
|
|
355
|
-
.replace(
|
|
356
|
-
/^..\/node_modules\/@sentry\/cli\/bin\/sentry-cli upload-dsym\s*?\r?\n/m,
|
|
357
|
-
'',
|
|
358
|
-
)
|
|
359
349
|
// remove sentry properties export
|
|
360
350
|
.replace(/^export SENTRY_PROPERTIES=sentry.properties\r?\n/m, '')
|
|
361
351
|
// unwrap react-native-xcode.sh command. In case someone replaced it
|
|
362
352
|
// entirely with the sentry-cli command we need to put the original
|
|
363
353
|
// version back in.
|
|
364
354
|
.replace(
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
const rv = m1.trim();
|
|
368
|
-
if (rv === '') {
|
|
369
|
-
return '../node_modules/react-native/scripts/react-native-xcode.sh';
|
|
370
|
-
} else {
|
|
371
|
-
return rv;
|
|
372
|
-
}
|
|
373
|
-
},
|
|
355
|
+
/\.\.\/node_modules\/@sentry\/cli\/bin\/sentry-cli\s+react-native\s+xcode\s+\$REACT_NATIVE_XCODE/i,
|
|
356
|
+
'$REACT_NATIVE_XCODE',
|
|
374
357
|
),
|
|
375
358
|
);
|
|
376
359
|
}
|
|
@@ -385,9 +368,6 @@ export class ReactNative extends MobileProject {
|
|
|
385
368
|
}
|
|
386
369
|
|
|
387
370
|
if (
|
|
388
|
-
script.shellScript.match(
|
|
389
|
-
/@sentry\/react-native\/bin\/bundle-frameworks\b/,
|
|
390
|
-
) ||
|
|
391
371
|
script.shellScript.match(
|
|
392
372
|
/@sentry\/cli\/bin\/sentry-cli\s+upload-dsym\b/,
|
|
393
373
|
)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/wizard",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"homepage": "https://github.com/getsentry/sentry-wizard",
|
|
5
5
|
"repository": "https://github.com/getsentry/sentry-wizard",
|
|
6
6
|
"description": "Sentry wizard helping you to configure your project",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"definition": "dist/index.d.ts"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@sentry/cli": "^1.
|
|
26
|
+
"@sentry/cli": "^1.72.0",
|
|
27
27
|
"chalk": "^2.4.1",
|
|
28
28
|
"glob": "^7.1.3",
|
|
29
29
|
"inquirer": "^6.2.0",
|
|
@@ -75,6 +75,7 @@
|
|
|
75
75
|
"fix:eslint": "eslint . --format stylish --fix",
|
|
76
76
|
"test": "yarn build && jest",
|
|
77
77
|
"try": "ts-node bin.ts",
|
|
78
|
+
"try:uninstall": "ts-node bin.ts --uninstall",
|
|
78
79
|
"test:watch": "jest --watch --notify"
|
|
79
80
|
},
|
|
80
81
|
"jest": {
|
|
@@ -12,15 +12,13 @@ try {
|
|
|
12
12
|
process.exit(1);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const VERSION = /\bv?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)?\b/i;
|
|
16
15
|
const SYMBOL_CACHE_FOLDER = '.electron-symbols';
|
|
17
|
-
const package = require('./package.json');
|
|
18
16
|
const sentryCli = new SentryCli('./sentry.properties');
|
|
19
17
|
|
|
20
18
|
async function main() {
|
|
21
19
|
let version = getElectronVersion();
|
|
22
20
|
if (!version) {
|
|
23
|
-
console.error('Cannot detect electron version, check
|
|
21
|
+
console.error('Cannot detect electron version, check that electron is installed');
|
|
24
22
|
return;
|
|
25
23
|
}
|
|
26
24
|
|
|
@@ -68,20 +66,11 @@ async function main() {
|
|
|
68
66
|
}
|
|
69
67
|
|
|
70
68
|
function getElectronVersion() {
|
|
71
|
-
|
|
72
|
-
return
|
|
69
|
+
try {
|
|
70
|
+
return require('electron/package.json').version;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
return undefined;
|
|
73
73
|
}
|
|
74
|
-
|
|
75
|
-
let electronVersion =
|
|
76
|
-
(package.dependencies && package.dependencies.electron) ||
|
|
77
|
-
(package.devDependencies && package.devDependencies.electron);
|
|
78
|
-
|
|
79
|
-
if (!electronVersion) {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const matches = VERSION.exec(electronVersion);
|
|
84
|
-
return matches ? matches[0] : false;
|
|
85
74
|
}
|
|
86
75
|
|
|
87
76
|
async function downloadSymbols(options) {
|
|
@@ -1,65 +1,39 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* NOTE: This requires `@sentry/nextjs` version 7.3.0 or higher.
|
|
3
|
+
*
|
|
4
|
+
* NOTE: If using this with `next` version 12.2.0 or lower, uncomment the
|
|
5
|
+
* penultimate line in `CustomErrorComponent`.
|
|
6
|
+
*
|
|
7
|
+
* This page is loaded by Nextjs:
|
|
8
|
+
* - on the server, when data-fetching methods throw or reject
|
|
9
|
+
* - on the client, when `getInitialProps` throws or rejects
|
|
10
|
+
* - on the client, when a React lifecycle method throws or rejects, and it's
|
|
11
|
+
* caught by the built-in Nextjs error boundary
|
|
12
|
+
*
|
|
13
|
+
* See:
|
|
14
|
+
* - https://nextjs.org/docs/basic-features/data-fetching/overview
|
|
15
|
+
* - https://nextjs.org/docs/api-reference/data-fetching/get-initial-props
|
|
16
|
+
* - https://reactjs.org/docs/error-boundaries.html
|
|
17
|
+
*/
|
|
2
18
|
|
|
3
19
|
import * as Sentry from '@sentry/nextjs';
|
|
20
|
+
import NextErrorComponent from 'next/error';
|
|
4
21
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// err via _app.js so it can be captured
|
|
10
|
-
Sentry.captureException(err);
|
|
11
|
-
// Flushing is not required in this case as it only happens on the client
|
|
12
|
-
}
|
|
22
|
+
const CustomErrorComponent = props => {
|
|
23
|
+
// If you're using a Nextjs version prior to 12.2.1, uncomment this to
|
|
24
|
+
// compensate for https://github.com/vercel/next.js/issues/8592
|
|
25
|
+
// Sentry.captureUnderscoreErrorException(props);
|
|
13
26
|
|
|
14
|
-
return <NextErrorComponent statusCode={statusCode} />;
|
|
27
|
+
return <NextErrorComponent statusCode={props.statusCode} />;
|
|
15
28
|
};
|
|
16
29
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// Workaround for https://github.com/vercel/next.js/issues/8592, mark when
|
|
23
|
-
// getInitialProps has run
|
|
24
|
-
errorInitialProps.hasGetInitialPropsRun = true;
|
|
25
|
-
|
|
26
|
-
// Returning early because we don't want to log 404 errors to Sentry.
|
|
27
|
-
if (res?.statusCode === 404) {
|
|
28
|
-
return errorInitialProps;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Running on the server, the response object (`res`) is available.
|
|
32
|
-
//
|
|
33
|
-
// Next.js will pass an err on the server if a page's data fetching methods
|
|
34
|
-
// threw or returned a Promise that rejected
|
|
35
|
-
//
|
|
36
|
-
// Running on the client (browser), Next.js will provide an err if:
|
|
37
|
-
//
|
|
38
|
-
// - a page's `getInitialProps` threw or returned a Promise that rejected
|
|
39
|
-
// - an exception was thrown somewhere in the React lifecycle (render,
|
|
40
|
-
// componentDidMount, etc) that was caught by Next.js's React Error
|
|
41
|
-
// Boundary. Read more about what types of exceptions are caught by Error
|
|
42
|
-
// Boundaries: https://reactjs.org/docs/error-boundaries.html
|
|
43
|
-
|
|
44
|
-
if (err) {
|
|
45
|
-
Sentry.captureException(err);
|
|
46
|
-
|
|
47
|
-
// Flushing before returning is necessary if deploying to Vercel, see
|
|
48
|
-
// https://vercel.com/docs/platform/limits#streaming-responses
|
|
49
|
-
await Sentry.flush(2000);
|
|
50
|
-
|
|
51
|
-
return errorInitialProps;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// If this point is reached, getInitialProps was called without any
|
|
55
|
-
// information about what the error might be. This is unexpected and may
|
|
56
|
-
// indicate a bug introduced in Next.js, so record it in Sentry
|
|
57
|
-
Sentry.captureException(
|
|
58
|
-
new Error(`_error.js getInitialProps missing data at path: ${asPath}`),
|
|
59
|
-
);
|
|
60
|
-
await Sentry.flush(2000);
|
|
30
|
+
CustomErrorComponent.getInitialProps = async contextData => {
|
|
31
|
+
// In case this is running in a serverless function, await this in order to give Sentry
|
|
32
|
+
// time to send the error before the lambda exits
|
|
33
|
+
await Sentry.captureUnderscoreErrorException(contextData);
|
|
61
34
|
|
|
62
|
-
|
|
35
|
+
// This will contain the status code of the response
|
|
36
|
+
return NextErrorComponent.getInitialProps(contextData);
|
|
63
37
|
};
|
|
64
38
|
|
|
65
|
-
export default
|
|
39
|
+
export default CustomErrorComponent;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import Head from 'next/head'
|
|
2
|
+
|
|
3
|
+
const boxStyles = { padding: '12px', border: '1px solid #eaeaea', borderRadius: '10px' };
|
|
4
|
+
export default function Home() {
|
|
5
|
+
return (
|
|
6
|
+
<div>
|
|
7
|
+
<Head>
|
|
8
|
+
<title>Sentry Onboarding</title>
|
|
9
|
+
<meta name="description" content="Make your Next.js ready for Sentry" />
|
|
10
|
+
</Head>
|
|
11
|
+
|
|
12
|
+
<main style={{
|
|
13
|
+
minHeight: '100vh',
|
|
14
|
+
display: 'flex',
|
|
15
|
+
flexDirection: 'column',
|
|
16
|
+
justifyContent: 'center',
|
|
17
|
+
alignItems: 'center',
|
|
18
|
+
}}>
|
|
19
|
+
<h1 style={{ fontSize: '4rem' }}>
|
|
20
|
+
<svg style={{
|
|
21
|
+
height: '1em'
|
|
22
|
+
}} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 44">
|
|
23
|
+
<path fill="currentColor" d="M124.32,28.28,109.56,9.22h-3.68V34.77h3.73V15.19l15.18,19.58h3.26V9.22h-3.73ZM87.15,23.54h13.23V20.22H87.14V12.53h14.93V9.21H83.34V34.77h18.92V31.45H87.14ZM71.59,20.3h0C66.44,19.06,65,18.08,65,15.7c0-2.14,1.89-3.59,4.71-3.59a12.06,12.06,0,0,1,7.07,2.55l2-2.83a14.1,14.1,0,0,0-9-3c-5.06,0-8.59,3-8.59,7.27,0,4.6,3,6.19,8.46,7.52C74.51,24.74,76,25.78,76,28.11s-2,3.77-5.09,3.77a12.34,12.34,0,0,1-8.3-3.26l-2.25,2.69a15.94,15.94,0,0,0,10.42,3.85c5.48,0,9-2.95,9-7.51C79.75,23.79,77.47,21.72,71.59,20.3ZM195.7,9.22l-7.69,12-7.64-12h-4.46L186,24.67V34.78h3.84V24.55L200,9.22Zm-64.63,3.46h8.37v22.1h3.84V12.68h8.37V9.22H131.08ZM169.41,24.8c3.86-1.07,6-3.77,6-7.63,0-4.91-3.59-8-9.38-8H154.67V34.76h3.8V25.58h6.45l6.48,9.2h4.44l-7-9.82Zm-10.95-2.5V12.6h7.17c3.74,0,5.88,1.77,5.88,4.84s-2.29,4.86-5.84,4.86Z M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z"></path>
|
|
24
|
+
</svg>
|
|
25
|
+
</h1>
|
|
26
|
+
|
|
27
|
+
<p >
|
|
28
|
+
Get started by sending us a sample error
|
|
29
|
+
</p>
|
|
30
|
+
<button type="button" style={{
|
|
31
|
+
...boxStyles,
|
|
32
|
+
backgroundColor: '#c73852',
|
|
33
|
+
borderRadius: '12px',
|
|
34
|
+
border: 'none'
|
|
35
|
+
}} onClick={() => {
|
|
36
|
+
throw new Error("Sentry Frontend Error");
|
|
37
|
+
}}>
|
|
38
|
+
Throw error
|
|
39
|
+
</button>
|
|
40
|
+
|
|
41
|
+
<p>
|
|
42
|
+
For more information, see <a href="https://docs.sentry.io/platforms/javascript/guides/nextjs/">https://docs.sentry.io/platforms/javascript/guides/nextjs/</a>
|
|
43
|
+
</p>
|
|
44
|
+
</main>
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
}
|