@salesforce/pwa-kit-react-sdk 3.8.0-preview.0-basepath → 3.8.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +3 -7
  2. package/package.json +6 -5
  3. package/ssr/browser/main.js +130 -0
  4. package/ssr/browser/main.test.js +54 -0
  5. package/ssr/server/react-rendering.js +434 -0
  6. package/ssr/server/react-rendering.test.js +745 -0
  7. package/ssr/universal/compatibility.js +31 -0
  8. package/ssr/universal/components/_app/index.js +35 -0
  9. package/ssr/universal/components/_app/index.test.js +20 -0
  10. package/ssr/universal/components/_app-config/index.js +87 -0
  11. package/ssr/universal/components/_app-config/index.test.js +21 -0
  12. package/ssr/universal/components/_document/index.js +92 -0
  13. package/ssr/universal/components/_document/index.test.js +58 -0
  14. package/ssr/universal/components/_error/index.js +55 -0
  15. package/ssr/universal/components/_error/index.test.js +28 -0
  16. package/ssr/universal/components/app-error-boundary/index.js +113 -0
  17. package/ssr/universal/components/app-error-boundary/index.test.js +109 -0
  18. package/ssr/universal/components/fetch-strategy/index.js +42 -0
  19. package/ssr/universal/components/refresh/index.js +123 -0
  20. package/ssr/universal/components/refresh/index.test.js +78 -0
  21. package/ssr/universal/components/route-component/index.js +415 -0
  22. package/ssr/universal/components/route-component/index.test.js +378 -0
  23. package/ssr/universal/components/switch/index.js +62 -0
  24. package/ssr/universal/components/throw-404/index.js +36 -0
  25. package/ssr/universal/components/throw-404/index.test.js +26 -0
  26. package/ssr/universal/components/with-correlation-id/index.js +36 -0
  27. package/ssr/universal/components/with-legacy-get-props/index.js +100 -0
  28. package/ssr/universal/components/with-legacy-get-props/index.test.js +35 -0
  29. package/ssr/universal/components/with-react-query/index.js +130 -0
  30. package/ssr/universal/components/with-react-query/index.test.js +101 -0
  31. package/ssr/universal/contexts/index.js +72 -0
  32. package/ssr/universal/contexts/index.test.js +101 -0
  33. package/ssr/universal/errors.js +34 -0
  34. package/ssr/universal/errors.test.js +20 -0
  35. package/ssr/universal/events.js +38 -0
  36. package/ssr/universal/events.test.js +39 -0
  37. package/ssr/universal/hooks/index.js +84 -0
  38. package/ssr/universal/routes.js +15 -0
  39. package/ssr/universal/utils.client.test.js +46 -0
  40. package/ssr/universal/utils.js +61 -0
  41. package/ssr/universal/utils.server.test.js +24 -0
  42. package/utils/assets.js +120 -0
  43. package/utils/assets.test.js +106 -0
  44. package/utils/logger-instance.js +19 -0
  45. package/utils/performance.js +126 -0
  46. package/utils/performance.test.js +50 -0
  47. package/utils/url.js +41 -0
  48. package/utils/url.test.js +47 -0
  49. package/utils/uuidv4.client.js +21 -0
  50. package/utils/uuidv4.client.test.js +27 -0
  51. package/utils/warnings.js +81 -0
  52. package/utils/warnings.test.js +48 -0
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.withReactQuery = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _hoistNonReactStatics = _interopRequireDefault(require("hoist-non-react-statics"));
9
+ var _reactSsrPrepass = _interopRequireDefault(require("react-ssr-prepass"));
10
+ var _reactQuery = require("@tanstack/react-query");
11
+ var _fetchStrategy = require("../fetch-strategy");
12
+ var _performance = require("../../../../utils/performance");
13
+ var _loggerInstance = _interopRequireDefault(require("../../../../utils/logger-instance"));
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
16
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /*
17
+ * Copyright (c) 2022, Salesforce, Inc.
18
+ * All rights reserved.
19
+ * SPDX-License-Identifier: BSD-3-Clause
20
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
21
+ */
22
+ const STATE_KEY = '__reactQuery';
23
+ const passthrough = input => input;
24
+
25
+ /**
26
+ * A HoC for adding React Query support to your application.
27
+ *
28
+ * @param {React.ReactElement} Wrapped The component to be wrapped
29
+ * @param {Object} options
30
+ * @param {Object} options.queryClientConfig The react query client configuration object to be used.
31
+ *
32
+ * @returns {React.ReactElement}
33
+ */
34
+ const withReactQuery = (Wrapped, options = {}) => {
35
+ const isServerSide = typeof window === 'undefined';
36
+ /* istanbul ignore next */
37
+ const wrappedComponentName = Wrapped.displayName || Wrapped.name;
38
+ const queryClientConfig = options.queryClientConfig;
39
+ const beforeHydrate = options.beforeHydrate || passthrough;
40
+
41
+ /**
42
+ * @private
43
+ */
44
+ class WithReactQuery extends _fetchStrategy.FetchStrategy {
45
+ render() {
46
+ let preloadedState = {};
47
+ this.props.locals.__queryClient = this.props.locals.__queryClient || new _reactQuery.QueryClient(queryClientConfig);
48
+ if (!isServerSide) {
49
+ try {
50
+ var _window$__PRELOADED_S;
51
+ preloadedState = beforeHydrate(((_window$__PRELOADED_S = window.__PRELOADED_STATE__) === null || _window$__PRELOADED_S === void 0 ? void 0 : _window$__PRELOADED_S[STATE_KEY]) || {});
52
+ } catch (e) {
53
+ _loggerInstance.default.error('Client `beforeHydrate` failed', {
54
+ namespace: 'with-react-query.render',
55
+ additionalProperties: {
56
+ error: e
57
+ }
58
+ });
59
+ }
60
+ }
61
+ return /*#__PURE__*/_react.default.createElement(_reactQuery.QueryClientProvider, {
62
+ client: this.props.locals.__queryClient
63
+ }, /*#__PURE__*/_react.default.createElement(_reactQuery.Hydrate, {
64
+ state: preloadedState
65
+ }, /*#__PURE__*/_react.default.createElement(Wrapped, this.props)));
66
+ }
67
+
68
+ /**
69
+ * @private
70
+ */
71
+ static doInitAppState({
72
+ res,
73
+ appJSX
74
+ }) {
75
+ return _asyncToGenerator(function* () {
76
+ const queryClient = res.locals.__queryClient = res.locals.__queryClient || new _reactQuery.QueryClient(queryClientConfig);
77
+ res.__performanceTimer.mark(_performance.PERFORMANCE_MARKS.reactQueryPrerender, 'start');
78
+ // Use `ssrPrepass` to collect all uses of `useQuery`.
79
+ yield (0, _reactSsrPrepass.default)(appJSX);
80
+ res.__performanceTimer.mark(_performance.PERFORMANCE_MARKS.reactQueryPrerender, 'end');
81
+ const queryCache = queryClient.getQueryCache();
82
+ const queries = queryCache.getAll().filter(q => q.options.enabled !== false);
83
+ yield Promise.all(queries.map((q, i) => {
84
+ var _q$meta, _q$meta2;
85
+ // always include the index to avoid duplicate entries
86
+ const displayName = (_q$meta = q.meta) !== null && _q$meta !== void 0 && _q$meta.displayName ? `${(_q$meta2 = q.meta) === null || _q$meta2 === void 0 ? void 0 : _q$meta2.displayName}:${i}` : `${i}`;
87
+ res.__performanceTimer.mark(`${_performance.PERFORMANCE_MARKS.reactQueryUseQuery}::${displayName}`, 'start');
88
+ return q.fetch().then(result => {
89
+ res.__performanceTimer.mark(`${_performance.PERFORMANCE_MARKS.reactQueryUseQuery}::${displayName}`, 'end', {
90
+ detail: q.queryHash
91
+ });
92
+ return result;
93
+ }).catch(() => {
94
+ // If there's an error in this fetch, react-query will log the error
95
+ // On our end, simply catch any error and move on to the next query
96
+ });
97
+ }));
98
+ return {
99
+ [STATE_KEY]: (0, _reactQuery.dehydrate)(queryClient)
100
+ };
101
+ })();
102
+ }
103
+
104
+ /**
105
+ * @private
106
+ */
107
+ static getInitializers() {
108
+ var _Wrapped$getInitializ;
109
+ return [WithReactQuery.doInitAppState, ...(((_Wrapped$getInitializ = Wrapped.getInitializers) === null || _Wrapped$getInitializ === void 0 ? void 0 : _Wrapped$getInitializ.call(Wrapped)) ?? [])];
110
+ }
111
+
112
+ /**
113
+ * @private
114
+ */
115
+ static getHOCsInUse() {
116
+ var _Wrapped$getHOCsInUse;
117
+ return [withReactQuery, ...(((_Wrapped$getHOCsInUse = Wrapped.getHOCsInUse) === null || _Wrapped$getHOCsInUse === void 0 ? void 0 : _Wrapped$getHOCsInUse.call(Wrapped)) ?? [])];
118
+ }
119
+ }
120
+ WithReactQuery.displayName = `withReactQuery(${wrappedComponentName})`;
121
+ const exclude = {
122
+ doInitAppState: true,
123
+ getInitializers: true,
124
+ initAppState: true,
125
+ getHOCsInUse: true
126
+ };
127
+ (0, _hoistNonReactStatics.default)(WithReactQuery, Wrapped, exclude);
128
+ return WithReactQuery;
129
+ };
130
+ exports.withReactQuery = withReactQuery;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ var _index = require("./index");
4
+ var _react = require("@testing-library/react");
5
+ var _react2 = _interopRequireDefault(require("react"));
6
+ var _loggerInstance = _interopRequireDefault(require("../../../../utils/logger-instance"));
7
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ /*
9
+ * Copyright (c) 2022, Salesforce, Inc.
10
+ * All rights reserved.
11
+ * SPDX-License-Identifier: BSD-3-Clause
12
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
13
+ */
14
+
15
+ jest.mock('../../../../utils/logger-instance', () => {
16
+ return {
17
+ error: jest.fn()
18
+ };
19
+ });
20
+ describe('withReactQuery', function () {
21
+ let windowSpy;
22
+ let oldPreloadedState = window.__PRELOADED_STATE__;
23
+ beforeEach(() => {
24
+ windowSpy = jest.spyOn(window, 'window', 'get');
25
+ jest.spyOn(console, 'warn').mockImplementation(jest.fn());
26
+ });
27
+ afterEach(() => {
28
+ console.warn.mockRestore();
29
+ windowSpy.mockRestore();
30
+ window.__PRELOADED_STATE__ = oldPreloadedState;
31
+ });
32
+ test('Renders correctly', () => {
33
+ const Wrapped = () => /*#__PURE__*/_react2.default.createElement("p", null, "Hello world");
34
+ const Component = (0, _index.withReactQuery)(Wrapped);
35
+ (0, _react.render)( /*#__PURE__*/_react2.default.createElement(Component, {
36
+ locals: {}
37
+ }));
38
+ expect(_react.screen.getByText(/Hello world/i)).toBeInTheDocument();
39
+ });
40
+ test('`beforeHydrate` called on mount', () => {
41
+ const mockPreloadedState = {
42
+ payload: {}
43
+ };
44
+ const mockBeforeHydrate = jest.fn();
45
+ const Wrapped = () => /*#__PURE__*/_react2.default.createElement("p", null, "Hello world");
46
+ const Component = (0, _index.withReactQuery)(Wrapped, {
47
+ beforeHydrate: mockBeforeHydrate
48
+ });
49
+ window.__PRELOADED_STATE__ = {
50
+ __reactQuery: mockPreloadedState
51
+ };
52
+ (0, _react.render)( /*#__PURE__*/_react2.default.createElement(Component, {
53
+ locals: {}
54
+ }));
55
+ expect(_react.screen.getByText(/Hello world/i)).toBeInTheDocument();
56
+ expect(mockBeforeHydrate).toHaveBeenCalledTimes(1);
57
+ expect(mockBeforeHydrate).toHaveBeenCalledWith(mockPreloadedState);
58
+ });
59
+ test('Renders correctly when `beforeHydrate` throws', () => {
60
+ const mockPreloadedState = {
61
+ payload: {}
62
+ };
63
+ const mockError = new Error('Test Error');
64
+ const mockBeforeHydrate = jest.fn().mockImplementation(() => {
65
+ throw mockError;
66
+ });
67
+ const Wrapped = () => /*#__PURE__*/_react2.default.createElement("p", null, "Hello world");
68
+ const Component = (0, _index.withReactQuery)(Wrapped, {
69
+ beforeHydrate: mockBeforeHydrate
70
+ });
71
+ window.__PRELOADED_STATE__ = {
72
+ __reactQuery: mockPreloadedState
73
+ };
74
+ _loggerInstance.default.error = jest.fn();
75
+ (0, _react.render)( /*#__PURE__*/_react2.default.createElement(Component, {
76
+ locals: {}
77
+ }));
78
+ expect(_react.screen.getByText(/Hello world/i)).toBeInTheDocument();
79
+ expect(mockBeforeHydrate).toHaveBeenCalledTimes(1);
80
+ expect(mockBeforeHydrate).toHaveBeenCalledWith(mockPreloadedState);
81
+ expect(_loggerInstance.default.error).toHaveBeenCalledTimes(1);
82
+ expect(_loggerInstance.default.error).toHaveBeenCalledWith('Client `beforeHydrate` failed', {
83
+ additionalProperties: {
84
+ error: mockError
85
+ },
86
+ namespace: 'with-react-query.render'
87
+ });
88
+ });
89
+ test(`Has working getInitializers method`, () => {
90
+ expect((0, _index.withReactQuery)({}).getInitializers()).toHaveLength(1);
91
+ expect((0, _index.withReactQuery)({
92
+ getInitializers: () => ['xyz']
93
+ }).getInitializers()).toHaveLength(2);
94
+ });
95
+ test(`Has working getHOCsInUse method`, () => {
96
+ expect((0, _index.withReactQuery)({}).getHOCsInUse()).toHaveLength(1);
97
+ expect((0, _index.withReactQuery)({
98
+ getHOCsInUse: () => ['xyz']
99
+ }).getHOCsInUse()).toHaveLength(2);
100
+ });
101
+ });
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ServerContext = exports.CorrelationIdProvider = exports.CorrelationIdContext = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactRouterDom = require("react-router-dom");
10
+ var _loggerInstance = _interopRequireDefault(require("../../../utils/logger-instance"));
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
+ /*
15
+ * Copyright (c) 2021, salesforce.com, inc.
16
+ * All rights reserved.
17
+ * SPDX-License-Identifier: BSD-3-Clause
18
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
19
+ */
20
+
21
+ const CorrelationIdContext = exports.CorrelationIdContext = /*#__PURE__*/_react.default.createContext();
22
+ const ServerContext = exports.ServerContext = /*#__PURE__*/_react.default.createContext();
23
+
24
+ /**
25
+ * This provider initializes the correlation id,
26
+ * and will generate a new id whenever there is a location change
27
+ * @private
28
+ * @param children
29
+ * @param correlationId - default correlation id
30
+ * @param resetOnPageChange - a boolean to indicate if it needs to generate a new id when navigating to a new page
31
+ */
32
+ const CorrelationIdProvider = ({
33
+ children,
34
+ correlationId,
35
+ resetOnPageChange = true
36
+ }) => {
37
+ const _correlationIdFn = typeof correlationId === 'function' && correlationId;
38
+ const _correlationId = typeof correlationId !== 'function' && correlationId;
39
+ if (resetOnPageChange && !_correlationIdFn) {
40
+ _loggerInstance.default.warn('correlationId needs to be a function returning a uuid string when resetOnPageChange is true', {
41
+ namespace: 'contexts.CorrelationIdProvider'
42
+ });
43
+ }
44
+ const [id, setId] = _react.default.useState(_correlationId || _correlationIdFn());
45
+ const location = (0, _reactRouterDom.useLocation)();
46
+ const isFirstRun = (0, _react.useRef)(true);
47
+ (0, _react.useEffect)(() => {
48
+ // this hook only runs on client-side
49
+ // don't run this on first render
50
+ if (isFirstRun.current) {
51
+ isFirstRun.current = false;
52
+ return;
53
+ }
54
+ if (resetOnPageChange && _correlationIdFn) {
55
+ // NOTE: the function needs to be an uuid v4.
56
+ const newId = _correlationIdFn();
57
+ setId(newId);
58
+ }
59
+ }, [location.pathname]);
60
+ return /*#__PURE__*/_react.default.createElement(CorrelationIdContext.Provider, {
61
+ value: {
62
+ correlationId: id
63
+ }
64
+ }, children);
65
+ };
66
+ exports.CorrelationIdProvider = CorrelationIdProvider;
67
+ CorrelationIdProvider.propTypes = {
68
+ children: _propTypes.default.element.isRequired,
69
+ resetOnPageChange: _propTypes.default.bool,
70
+ correlationId: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]).isRequired,
71
+ location: _propTypes.default.object
72
+ };
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ var _react = _interopRequireDefault(require("react"));
4
+ var _react2 = require("@testing-library/react");
5
+ var _reactRouterDom = require("react-router-dom");
6
+ var _history = require("history");
7
+ var _index = require("./index");
8
+ var _hooks = require("../hooks");
9
+ var _crypto = _interopRequireDefault(require("crypto"));
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
14
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /*
15
+ * Copyright (c) 2022, salesforce.com, inc.
16
+ * All rights reserved.
17
+ * SPDX-License-Identifier: BSD-3-Clause
18
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
19
+ */
20
+ const SampleProvider = props => {
21
+ const {
22
+ correlationId,
23
+ resetOnPageChange
24
+ } = props;
25
+ return /*#__PURE__*/_react.default.createElement(_index.CorrelationIdProvider, {
26
+ correlationId: correlationId,
27
+ resetOnPageChange: resetOnPageChange
28
+ }, props.children);
29
+ };
30
+ SampleProvider.propTypes = {
31
+ children: _propTypes.default.element.isRequired,
32
+ resetOnPageChange: _propTypes.default.bool,
33
+ correlationId: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]).isRequired
34
+ };
35
+ const Component = () => {
36
+ const {
37
+ correlationId
38
+ } = (0, _hooks.useCorrelationId)();
39
+ return /*#__PURE__*/_react.default.createElement("div", {
40
+ className: 'correlation-id'
41
+ }, correlationId);
42
+ };
43
+ describe('CorrelationIdProvider', function () {
44
+ test('Renders without errors', () => {
45
+ const history = (0, _history.createMemoryHistory)();
46
+ const id = _crypto.default.randomUUID();
47
+ (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_reactRouterDom.Router, {
48
+ history: history
49
+ }, /*#__PURE__*/_react.default.createElement(SampleProvider, {
50
+ correlationId: () => id
51
+ }, /*#__PURE__*/_react.default.createElement(Component, null))));
52
+ expect(_react2.screen.getByText(id)).toBeInTheDocument();
53
+ });
54
+ test('renders when correlationId is passed as a function', () => {
55
+ const id = _crypto.default.randomUUID();
56
+ const history = (0, _history.createMemoryHistory)();
57
+ (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_reactRouterDom.Router, {
58
+ history: history
59
+ }, /*#__PURE__*/_react.default.createElement(SampleProvider, {
60
+ correlationId: () => id
61
+ }, /*#__PURE__*/_react.default.createElement(Component, null))));
62
+ expect(_react2.screen.getByText(id)).toBeInTheDocument();
63
+ });
64
+ test('renders when correlationId is passed as a string', () => {
65
+ const id = _crypto.default.randomUUID();
66
+ const history = (0, _history.createMemoryHistory)();
67
+ (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_reactRouterDom.Router, {
68
+ history: history
69
+ }, /*#__PURE__*/_react.default.createElement(SampleProvider, {
70
+ correlationId: id,
71
+ resetOnPageChange: false
72
+ }, /*#__PURE__*/_react.default.createElement(Component, null))));
73
+ expect(_react2.screen.getByText(id)).toBeInTheDocument();
74
+ });
75
+ test('generates a new id when changing page', /*#__PURE__*/_asyncToGenerator(function* () {
76
+ const user = _userEvent.default.setup();
77
+ const history = (0, _history.createMemoryHistory)();
78
+ const Component = () => {
79
+ const {
80
+ correlationId
81
+ } = (0, _hooks.useCorrelationId)();
82
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
83
+ "data-testid": "correlation-id"
84
+ }, correlationId), /*#__PURE__*/_react.default.createElement("button", {
85
+ className: "button",
86
+ onClick: () => history.push('/page-1')
87
+ }, "Go to another page"));
88
+ };
89
+ (0, _react2.render)( /*#__PURE__*/_react.default.createElement(_reactRouterDom.Router, {
90
+ history: history
91
+ }, /*#__PURE__*/_react.default.createElement(SampleProvider, {
92
+ correlationId: () => _crypto.default.randomUUID()
93
+ }, /*#__PURE__*/_react.default.createElement(Component, null))));
94
+ const firstRenderedId = _react2.screen.getByTestId('correlation-id').innerHTML;
95
+ const button = _react2.screen.getByText(/go to another page/i);
96
+ yield user.click(button);
97
+ const secondRenderedId = _react2.screen.getByTestId('correlation-id').innerHTML;
98
+ // expecting the provider to have a different correlation id when a page navigation happens
99
+ expect(firstRenderedId).not.toEqual(secondRenderedId);
100
+ }));
101
+ });
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.HTTPNotFound = exports.HTTPError = void 0;
7
+ /*
8
+ * Copyright (c) 2021, salesforce.com, inc.
9
+ * All rights reserved.
10
+ * SPDX-License-Identifier: BSD-3-Clause
11
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
12
+ */
13
+
14
+ class HTTPError extends Error {
15
+ constructor(status, message) {
16
+ super(message);
17
+ this.constructor = HTTPError;
18
+ this.__proto__ = HTTPError.prototype;
19
+ this.message = message;
20
+ this.status = status;
21
+ }
22
+ toString() {
23
+ return `HTTPError ${this.status}: ${this.message}`;
24
+ }
25
+ }
26
+ exports.HTTPError = HTTPError;
27
+ class HTTPNotFound extends HTTPError {
28
+ constructor(message) {
29
+ super(404, message);
30
+ this.constructor = HTTPNotFound;
31
+ this.__proto__ = HTTPNotFound.prototype;
32
+ }
33
+ }
34
+ exports.HTTPNotFound = HTTPNotFound;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var errors = _interopRequireWildcard(require("./errors"));
4
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
5
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
6
+ /*
7
+ * Copyright (c) 2021, salesforce.com, inc.
8
+ * All rights reserved.
9
+ * SPDX-License-Identifier: BSD-3-Clause
10
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
11
+ */
12
+
13
+ describe('Errors', () => {
14
+ test('HTTP Errors should have a working toString()', () => {
15
+ const status = 400;
16
+ const msg = 'This is a bad request';
17
+ const err = new errors.HTTPError(status, msg);
18
+ expect(err.toString()).toBe(`HTTPError ${status}: ${msg}`);
19
+ });
20
+ });
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.pages = exports.PAGEEVENTS = void 0;
7
+ var _eventEmitter = _interopRequireDefault(require("event-emitter"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ /*
10
+ * Copyright (c) 2021, salesforce.com, inc.
11
+ * All rights reserved.
12
+ * SPDX-License-Identifier: BSD-3-Clause
13
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
14
+ */
15
+
16
+ const PAGEEVENTS = exports.PAGEEVENTS = {
17
+ PAGELOAD: 'PAGELOAD',
18
+ ERROR: 'ERROR'
19
+ };
20
+ class Pages {
21
+ pageLoad(templateName, start, end) {
22
+ const payload = {
23
+ templateName,
24
+ start,
25
+ end
26
+ };
27
+ this.emit(PAGEEVENTS.PAGELOAD, payload);
28
+ }
29
+ error(name, content) {
30
+ const payload = {
31
+ name,
32
+ content
33
+ };
34
+ this.emit(PAGEEVENTS.ERROR, payload);
35
+ }
36
+ }
37
+ (0, _eventEmitter.default)(Pages.prototype);
38
+ const pages = exports.pages = new Pages();
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _events = require("./events");
4
+ /*
5
+ * Copyright (c) 2021, salesforce.com, inc.
6
+ * All rights reserved.
7
+ * SPDX-License-Identifier: BSD-3-Clause
8
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
9
+ */
10
+
11
+ describe('Page Events', () => {
12
+ test('emit and receive a PAGELOAD Page Event', () => {
13
+ expect.assertions(1);
14
+ return new Promise(resolve => {
15
+ _events.pages.on(_events.PAGEEVENTS.PAGELOAD, evt => {
16
+ expect(JSON.stringify(evt)).toEqual(JSON.stringify({
17
+ templateName: 'blah',
18
+ start: 123,
19
+ end: 456
20
+ }));
21
+ return resolve();
22
+ });
23
+ _events.pages.pageLoad('blah', 123, 456);
24
+ });
25
+ });
26
+ test('emit and receive a ERROR Page Event', () => {
27
+ expect.assertions(1);
28
+ return new Promise(resolve => {
29
+ _events.pages.on(_events.PAGEEVENTS.ERROR, evt => {
30
+ expect(JSON.stringify(evt)).toEqual(JSON.stringify({
31
+ name: 'blah',
32
+ content: 'more blah'
33
+ }));
34
+ return resolve();
35
+ });
36
+ _events.pages.error('blah', 'more blah');
37
+ });
38
+ });
39
+ });
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useServerContext = exports.useOrigin = exports.useCorrelationId = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _contexts = require("../contexts");
9
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ /*
12
+ * Copyright (c) 2024, salesforce.com, inc.
13
+ * All rights reserved.
14
+ * SPDX-License-Identifier: BSD-3-Clause
15
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
16
+ */
17
+ /* istanbul ignore file */
18
+
19
+ /**
20
+ * Use this hook to get the correlation id value of the closest CorrelationIdProvider component.
21
+ *
22
+ * @returns {object} The correlation id
23
+ */
24
+ const useCorrelationId = () => {
25
+ const context = _react.default.useContext(_contexts.CorrelationIdContext);
26
+ if (context === undefined) {
27
+ throw new Error('useCorrelationId needs to be used within CorrelationIdProvider');
28
+ }
29
+ return context;
30
+ };
31
+
32
+ /**
33
+ * Server context
34
+ * @typedef {Object} ServerContext
35
+ * @property {Object} req - Request object
36
+ * @property {Object} res - Response object
37
+ */
38
+
39
+ /**
40
+ * Get the server context
41
+ * @returns {ServerContext} ServerContext object
42
+ *
43
+ * @example
44
+ * const {res} = useServerContext()
45
+ * if (res && query.error) { res.status(404) }
46
+ */
47
+ exports.useCorrelationId = useCorrelationId;
48
+ const useServerContext = () => {
49
+ const serverContext = (0, _react.useContext)(_contexts.ServerContext);
50
+ return serverContext;
51
+ };
52
+
53
+ /**
54
+ * Returns the application's origin.
55
+ *
56
+ * By default, it will return the ORIGIN under which we are serving the page.
57
+ *
58
+ * If `fromXForwardedHeader` is true, it will use the value of `x-forwarded-proto` and `x-forwarded-host` headers in req
59
+ * to build origin. (it is false by default)
60
+ *
61
+ * NOTE: this is a React hook, so it has to be used in a React rendering pipeline.
62
+ * @returns {string} origin string
63
+ *
64
+ */
65
+ exports.useServerContext = useServerContext;
66
+ const useOrigin = ({
67
+ fromXForwardedHeader = false
68
+ }) => {
69
+ const {
70
+ res
71
+ } = useServerContext();
72
+ if (typeof window !== 'undefined') {
73
+ return window.location.origin;
74
+ }
75
+ const {
76
+ APP_ORIGIN
77
+ } = process.env;
78
+ const xForwardedOrigin = res.locals.xForwardedOrigin;
79
+ if (fromXForwardedHeader && xForwardedOrigin) {
80
+ return xForwardedOrigin;
81
+ }
82
+ return APP_ORIGIN;
83
+ };
84
+ exports.useOrigin = useOrigin;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ /*
8
+ * Copyright (c) 2021, salesforce.com, inc.
9
+ * All rights reserved.
10
+ * SPDX-License-Identifier: BSD-3-Clause
11
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
12
+ */
13
+
14
+ const routes = [];
15
+ var _default = exports.default = routes;