Skip to content

Commit ea2fdac

Browse files
authored
feat: use @stoplight/reporter (#2)
1 parent 05b63bf commit ea2fdac

File tree

10 files changed

+155
-24
lines changed

10 files changed

+155
-24
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"@stoplight/types": "^11.1.0"
4545
},
4646
"devDependencies": {
47+
"@stoplight/reporter": "^1.1.1",
4748
"@stoplight/scripts": "^7.0.3",
4849
"@stoplight/storybook-config": "^2.0.4",
4950
"@types/enzyme": "^3.10.3",

src/ErrorBoundary.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ export class ErrorBoundary<P extends object = {}> extends React.PureComponent<
3838
protected handleError(error: Error, errorInfo: React.ErrorInfo | null) {
3939
if (this.props.reportErrors !== false) {
4040
try {
41-
this.context.reportError(error);
41+
if (errorInfo !== null) {
42+
this.context.error(error.message, { errorInfo });
43+
} else {
44+
this.context.error(error);
45+
}
4246
} catch (ex) {
4347
console.error('Error could not be reported', ex);
4448
}

src/ErrorBoundaryProvider.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1+
import { IReportingAPI } from '@stoplight/reporter';
12
import * as React from 'react';
2-
import { Reporter } from './types';
33

4-
const stubbedReporter: Reporter = {
5-
reportError() {
6-
// noop
7-
},
8-
};
4+
export const ErrorBoundaryContext = React.createContext<IReportingAPI>(console);
95

10-
export const ErrorBoundaryContext = React.createContext<Reporter>(stubbedReporter);
11-
12-
export const ErrorBoundaryProvider: React.FunctionComponent<{ reporter: Reporter }> = ({ reporter, children }) => (
6+
export const ErrorBoundaryProvider: React.FunctionComponent<{ reporter: IReportingAPI }> = ({ reporter, children }) => (
137
<ErrorBoundaryContext.Provider value={reporter}>{children}</ErrorBoundaryContext.Provider>
148
);

src/__tests__/ErrorBoundary.test.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
/* tslint:disable:jsx-wrap-multiline */
2+
import { IReportingAPI } from '@stoplight/reporter';
23
import { mount } from 'enzyme';
34
import * as React from 'react';
45

56
import { ErrorBoundary } from '../ErrorBoundary';
67
import { ErrorBoundaryProvider } from '../ErrorBoundaryProvider';
78
import { FallbackComponent } from '../FallbackComponent';
8-
import { Reporter } from '../types';
99

1010
describe('ErrorBoundary component', () => {
1111
const ex = new TypeError('String expected');
@@ -20,11 +20,12 @@ describe('ErrorBoundary component', () => {
2020
return <span>{String(value)}</span>;
2121
};
2222

23-
let reporter: Reporter;
23+
let reporter: IReportingAPI;
2424

2525
beforeEach(() => {
2626
reporter = {
27-
reportError: jest.fn(),
27+
...console,
28+
error: jest.fn(),
2829
};
2930
});
3031

@@ -89,7 +90,11 @@ describe('ErrorBoundary component', () => {
8990
</ErrorBoundaryProvider>,
9091
);
9192

92-
expect(reporter.reportError).toBeCalledWith(ex);
93+
expect(reporter.error).toBeCalledWith(ex.message, {
94+
errorInfo: {
95+
componentStack: expect.any(String),
96+
},
97+
});
9398

9499
wrapper.unmount();
95100
});
@@ -103,7 +108,7 @@ describe('ErrorBoundary component', () => {
103108
</ErrorBoundaryProvider>,
104109
);
105110

106-
expect(reporter.reportError).not.toBeCalled();
111+
expect(reporter.error).not.toBeCalled();
107112

108113
wrapper.unmount();
109114
});

src/hooks/__tests__/useHandledCallback.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useReporter } from '../useReporter';
44

55
jest.mock('../useReporter', () => ({
66
useReporter: jest.fn().mockReturnValue({
7-
reportError: jest.fn(),
7+
error: jest.fn(),
88
}),
99
}));
1010

@@ -38,6 +38,6 @@ describe('useHandledCallback hook', () => {
3838
const callback = useHandledCallback(fn, []);
3939

4040
expect(callback).not.toThrow();
41-
expect(useReporter().reportError).toBeCalledWith(new Error('Test'));
41+
expect(useReporter().error).toBeCalledWith(new Error('Test'));
4242
});
4343
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { useContext } from 'react';
2+
import { ErrorBoundaryContext } from '../../ErrorBoundaryProvider';
3+
import { useReporter } from '../useReporter';
4+
5+
jest.mock('react', () => ({
6+
useContext: jest.fn(),
7+
}));
8+
9+
jest.mock('../../ErrorBoundaryProvider', () => ({
10+
ErrorBoundaryContext: {
11+
_context: true,
12+
},
13+
}));
14+
15+
describe('useReporter hook', () => {
16+
afterAll(() => {
17+
jest.resetAllMocks();
18+
});
19+
20+
it('calls useContext with ErrorBoundaryContext and returns', () => {
21+
const context = {};
22+
(useContext as jest.Mock).mockReturnValueOnce(context);
23+
expect(useReporter()).toBe(context);
24+
expect(useContext).toBeCalledWith(ErrorBoundaryContext);
25+
});
26+
});

src/hooks/useHandledCallback.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const useHandledCallback: typeof useCallback = (fn, deps): any => {
88
try {
99
return fn(...args);
1010
} catch (ex) {
11-
reporter.reportError(ex);
11+
reporter.error(ex);
1212
}
1313
}, deps);
1414
};

src/hooks/useReporter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import { IReportingAPI } from '@stoplight/reporter';
12
import { useContext } from 'react';
23
import { ErrorBoundaryContext } from '../ErrorBoundaryProvider';
3-
import { Reporter } from '../types';
44

5-
export const useReporter: Reporter = () => {
6-
return useContext<Reporter>(ErrorBoundaryContext);
5+
export const useReporter = (): IReportingAPI => {
6+
return useContext<IReportingAPI>(ErrorBoundaryContext);
77
};

src/types.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,3 @@ export type ErrorBoundaryForwardedProps = {
2626
};
2727

2828
export type ErrorEventHandler = (error: Error, componentStack: string | null) => void;
29-
30-
// todo: this should be defined in a different repo concerning reporting
31-
export type Reporter = any; // any for now

yarn.lock

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,67 @@
17611761
lodash "^4.17.4"
17621762
read-pkg-up "^6.0.0"
17631763

1764+
"@sentry/browser@^5.7.1":
1765+
version "5.7.1"
1766+
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.7.1.tgz#1f8435e2a325d7a09f830065ebce40a2b3c708a4"
1767+
integrity sha512-K0x1XhsHS8PPdtlVOLrKZyYvi5Vexs9WApdd214bO6KaGF296gJvH1mG8XOY0+7aA5i2A7T3ttcaJNDYS49lzw==
1768+
dependencies:
1769+
"@sentry/core" "5.7.1"
1770+
"@sentry/types" "5.7.1"
1771+
"@sentry/utils" "5.7.1"
1772+
tslib "^1.9.3"
1773+
1774+
"@sentry/core@5.7.1":
1775+
version "5.7.1"
1776+
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.7.1.tgz#3eb2b7662cac68245931ee939ec809bf7a639d0e"
1777+
integrity sha512-AOn3k3uVWh2VyajcHbV9Ta4ieDIeLckfo7UMLM+CTk2kt7C89SayDGayJMSsIrsZlL4qxBoLB9QY4W2FgAGJrg==
1778+
dependencies:
1779+
"@sentry/hub" "5.7.1"
1780+
"@sentry/minimal" "5.7.1"
1781+
"@sentry/types" "5.7.1"
1782+
"@sentry/utils" "5.7.1"
1783+
tslib "^1.9.3"
1784+
1785+
"@sentry/hub@5.7.1":
1786+
version "5.7.1"
1787+
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.7.1.tgz#a52acd9fead7f3779d96e9965c6978aecc8b9cad"
1788+
integrity sha512-evGh323WR073WSBCg/RkhlUmCQyzU0xzBzCZPscvcoy5hd4SsLE6t9Zin+WACHB9JFsRQIDwNDn+D+pj3yKsig==
1789+
dependencies:
1790+
"@sentry/types" "5.7.1"
1791+
"@sentry/utils" "5.7.1"
1792+
tslib "^1.9.3"
1793+
1794+
"@sentry/minimal@5.7.1":
1795+
version "5.7.1"
1796+
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.7.1.tgz#56afc537737586929e25349765e37a367958c1e1"
1797+
integrity sha512-nS/Dg+jWAZtcxQW8wKbkkw4dYvF6uyY/vDiz/jFCaux0LX0uhgXAC9gMOJmgJ/tYBLJ64l0ca5LzpZa7BMJQ0g==
1798+
dependencies:
1799+
"@sentry/hub" "5.7.1"
1800+
"@sentry/types" "5.7.1"
1801+
tslib "^1.9.3"
1802+
1803+
"@sentry/types@5.7.1":
1804+
version "5.7.1"
1805+
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.7.1.tgz#4c4c1d4d891b6b8c2c3c7b367d306a8b1350f090"
1806+
integrity sha512-tbUnTYlSliXvnou5D4C8Zr+7/wJrHLbpYX1YkLXuIJRU0NSi81bHMroAuHWILcQKWhVjaV/HZzr7Y/hhWtbXVQ==
1807+
1808+
"@sentry/utils@5.7.1":
1809+
version "5.7.1"
1810+
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.7.1.tgz#cf37ad55f78e317665cd8680f202d307fa77f1d0"
1811+
integrity sha512-nhirUKj/qFLsR1i9kJ5BRvNyzdx/E2vorIsukuDrbo8e3iZ11JMgCOVrmC8Eq9YkHBqgwX4UnrPumjFyvGMZ2Q==
1812+
dependencies:
1813+
"@sentry/types" "5.7.1"
1814+
tslib "^1.9.3"
1815+
1816+
"@stoplight/reporter@^1.1.1":
1817+
version "1.1.1"
1818+
resolved "https://registry.yarnpkg.com/@stoplight/reporter/-/reporter-1.1.1.tgz#a4e00b7a85ae6220bee42e3c47ad1408654e9423"
1819+
integrity sha512-8Qv3ae1aE9RrQAMGW3/1eUI5AvPxA35L1S6k1uTkkmTgP3zkKgA6qkjY9kT6ercnc6c0UbvMBiF0RszRcObC6Q==
1820+
dependencies:
1821+
"@sentry/browser" "^5.7.1"
1822+
"@stoplight/types" "^11.1.1"
1823+
beaver-logger "^4.0.12"
1824+
17641825
"@stoplight/scripts@^7.0.3":
17651826
version "7.0.3"
17661827
resolved "https://registry.yarnpkg.com/@stoplight/scripts/-/scripts-7.0.3.tgz#024805f3a97c349836a50821b5ddf68d142be27d"
@@ -1833,6 +1894,13 @@
18331894
dependencies:
18341895
"@types/json-schema" "^7.0.3"
18351896

1897+
"@stoplight/types@^11.1.1":
1898+
version "11.1.1"
1899+
resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-11.1.1.tgz#a92d1833adb580a72439f42ba73de8f560fd68b4"
1900+
integrity sha512-IU8U9y/uO548z15DX/Jl053u9VQG8gCwNtypuD4RtskUA7pvHZl4+zzGK3klgIcO6Ql3Jk4/fcrFaN9vjmdEWg==
1901+
dependencies:
1902+
"@types/json-schema" "^7.0.3"
1903+
18361904
"@storybook/addon-actions@5.0.11":
18371905
version "5.0.11"
18381906
resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.0.11.tgz#7ca6d6ce9400b9b97f2699935edade88905767c3"
@@ -3624,11 +3692,28 @@ bcrypt-pbkdf@^1.0.0:
36243692
dependencies:
36253693
tweetnacl "^0.14.3"
36263694

3695+
beaver-logger@^4.0.12:
3696+
version "4.0.12"
3697+
resolved "https://registry.yarnpkg.com/beaver-logger/-/beaver-logger-4.0.12.tgz#2080918a57063b14f0e3b61e7161b963897acfc9"
3698+
integrity sha512-6RYZsB+YAb2N0GIf7nhtlDg7Zw0ZzqcGkJH5ET45a7SZJk4aHJD5zziIMCo7zYOhV7saTdvXOdfCFCeQPmG3vg==
3699+
dependencies:
3700+
belter "^1.0.17"
3701+
zalgo-promise "^1.0.26"
3702+
36273703
before-after-hook@^2.0.0:
36283704
version "2.1.0"
36293705
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
36303706
integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
36313707

3708+
belter@^1.0.17:
3709+
version "1.0.110"
3710+
resolved "https://registry.yarnpkg.com/belter/-/belter-1.0.110.tgz#0407f2595258039feb19d8e899abdca884f901ea"
3711+
integrity sha512-bEoTOmK1JgVTvCgrY0PouVCEqrBq5yxbTMVY2Gwe7kNeocvOirnS0B8Tz6xLzKMkZNLsxjJCCqrGcxEWdlpv8g==
3712+
dependencies:
3713+
cross-domain-safe-weakmap "^1.0.20"
3714+
cross-domain-utils "^2.0.10"
3715+
zalgo-promise "^1.0.28"
3716+
36323717
big.js@^5.2.2:
36333718
version "5.2.2"
36343719
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -4840,6 +4925,20 @@ create-react-context@^0.3.0:
48404925
gud "^1.0.0"
48414926
warning "^4.0.3"
48424927

4928+
cross-domain-safe-weakmap@^1.0.20:
4929+
version "1.0.27"
4930+
resolved "https://registry.yarnpkg.com/cross-domain-safe-weakmap/-/cross-domain-safe-weakmap-1.0.27.tgz#81a5eae012b3cfb7e7e5ca3d737a6c94c3499bab"
4931+
integrity sha512-f5etDzszteeGh99Dzd7o72FGwd8rLGzgEv50Vk0r8mLzPdQEzcb7Vmx3PfKWD4k66Hp8vN0BLPuBmmMs4UxseQ==
4932+
dependencies:
4933+
cross-domain-utils "^2.0.0"
4934+
4935+
cross-domain-utils@^2.0.0, cross-domain-utils@^2.0.10:
4936+
version "2.0.29"
4937+
resolved "https://registry.yarnpkg.com/cross-domain-utils/-/cross-domain-utils-2.0.29.tgz#f531cb8929427ba0a081d2037651dd7b02e7fcea"
4938+
integrity sha512-Kb0Mgtmo7OIN4QuIYuWNe63pxq9DnlyyzzALcHUPg8zVJIP5QFOGuTe5KgnlyLAx4IxckD6661WaawjSkuTvUA==
4939+
dependencies:
4940+
zalgo-promise "^1.0.11"
4941+
48434942
cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
48444943
version "6.0.5"
48454944
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@@ -14833,3 +14932,8 @@ yup@^0.27.0:
1483314932
property-expr "^1.5.0"
1483414933
synchronous-promise "^2.0.6"
1483514934
toposort "^2.0.2"
14935+
14936+
zalgo-promise@^1.0.11, zalgo-promise@^1.0.26, zalgo-promise@^1.0.28:
14937+
version "1.0.44"
14938+
resolved "https://registry.yarnpkg.com/zalgo-promise/-/zalgo-promise-1.0.44.tgz#10b6888def701abc0681ec760d73e2bfd2448ae2"
14939+
integrity sha512-CSQ1xh0vVwgrohObNdysPANonBV+3yl1Xy+qrtMWBvb/a0D/2OUNqb0GJvaAgGtP/gQawtiQAFil2bGSq8aoMA==

0 commit comments

Comments
 (0)