@medipass/utils 12.0.4 → 12.0.5-feat-sentry-reform.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sentry.d.ts CHANGED
@@ -1,22 +1,114 @@
1
+ import * as Sentry from "@sentry/react";
2
+
1
3
  //#region src/sentry.d.ts
4
+ type SentryPrimitive = string | number | boolean | null | undefined;
5
+ type SentryTags = Record<string, SentryPrimitive>;
6
+ type SentryContext = Record<string, unknown>;
7
+ type SentrySetupOptions = {
8
+ app?: string;
9
+ beforeSend?: Sentry.BrowserOptions['beforeSend'];
10
+ debug?: boolean;
11
+ dsn?: string;
12
+ enableLogs?: boolean;
13
+ enabled?: boolean;
14
+ environment?: string;
15
+ release?: string;
16
+ replayErrorSampleRate?: number;
17
+ replaySessionSampleRate?: number;
18
+ replaysOnErrorSampleRate?: number;
19
+ replaysSessionSampleRate?: number;
20
+ tracePropagationTargets?: Sentry.BrowserOptions['tracePropagationTargets'];
21
+ tracesSampleRate?: number;
22
+ tunnel?: string;
23
+ url?: string;
24
+ version?: string;
25
+ };
26
+ type CaptureErrorOptions = {
27
+ contexts?: Record<string, SentryContext>;
28
+ data?: SentryContext;
29
+ fingerprint?: string[];
30
+ ignoreExpected?: boolean;
31
+ level?: Sentry.SeverityLevel;
32
+ name?: string;
33
+ tags?: SentryTags;
34
+ };
35
+ type CaptureMessageOptions = Omit<CaptureErrorOptions, 'name'>;
36
+ type CaptureFlowEventOptions = {
37
+ context?: SentryContext;
38
+ contexts?: Record<string, SentryContext>;
39
+ data?: SentryContext;
40
+ errorCode?: string | number;
41
+ error?: unknown;
42
+ extra?: SentryContext;
43
+ fingerprint?: string[];
44
+ flow: string;
45
+ funder?: string;
46
+ isSdk?: boolean;
47
+ isStandalone?: boolean;
48
+ level?: Sentry.SeverityLevel;
49
+ message?: string;
50
+ operation: string;
51
+ outcome: 'cancelled' | 'failure' | 'info' | 'success' | 'validation' | 'warning';
52
+ statusCode?: string | number;
53
+ surface?: string;
54
+ tags?: SentryTags;
55
+ };
2
56
  declare const clearUserContext: () => void;
3
- declare const createReduxMiddleware: () => any;
4
- declare const logError: (_error: any, {
5
- name,
6
- data
7
- }?: {}) => null | undefined;
57
+ declare const createReduxEnhancer: () => any;
58
+ declare const createReduxMiddleware: () => () => (next: (action: unknown) => unknown) => (action: unknown) => unknown;
59
+ declare const addBreadcrumb: (breadcrumb: Sentry.Breadcrumb) => void;
60
+ declare const setTag: (key: string, value: SentryPrimitive) => void;
61
+ declare const setTags: (tags?: SentryTags) => void;
62
+ declare const setUserContext: (user?: Record<string, unknown>) => void;
63
+ declare const captureError: (error: unknown, options?: CaptureErrorOptions) => null | undefined;
64
+ declare const logError: (error: unknown, {
65
+ data,
66
+ name
67
+ }?: {
68
+ data?: SentryContext;
69
+ name?: string;
70
+ }) => null | undefined;
71
+ declare const captureMessage: (message: string, options?: CaptureMessageOptions) => void;
72
+ declare const captureFlowEvent: ({
73
+ context,
74
+ contexts,
75
+ data,
76
+ errorCode,
77
+ error,
78
+ extra,
79
+ fingerprint,
80
+ flow,
81
+ funder,
82
+ isSdk,
83
+ isStandalone,
84
+ level,
85
+ message,
86
+ operation,
87
+ outcome,
88
+ statusCode,
89
+ surface,
90
+ tags
91
+ }: CaptureFlowEventOptions) => void | null;
8
92
  declare const setup: ({
93
+ app,
94
+ beforeSend,
95
+ debug,
96
+ dsn,
97
+ enableLogs,
98
+ enabled,
9
99
  environment,
100
+ release,
101
+ replayErrorSampleRate,
102
+ replaySessionSampleRate,
103
+ replaysOnErrorSampleRate,
104
+ replaysSessionSampleRate,
105
+ tracePropagationTargets,
106
+ tracesSampleRate,
107
+ tunnel,
10
108
  url,
11
109
  version
12
- }: {
13
- environment: any;
14
- url: any;
15
- version: any;
16
- }) => void;
17
- declare const setUserContext: (user: any) => void;
18
- declare const setTag: (key: any, value: any) => void;
110
+ }?: SentrySetupOptions) => void;
19
111
  declare const sentry: {};
20
112
  //#endregion
21
- export { clearUserContext, createReduxMiddleware, sentry as default, logError, setTag, setUserContext, setup };
113
+ export { CaptureErrorOptions, CaptureFlowEventOptions, CaptureMessageOptions, SentrySetupOptions, addBreadcrumb, captureError, captureFlowEvent, captureMessage, clearUserContext, createReduxEnhancer, createReduxMiddleware, sentry as default, logError, setTag, setTags, setUserContext, setup };
22
114
  //# sourceMappingURL=sentry.d.ts.map
package/dist/sentry.js CHANGED
@@ -2,58 +2,321 @@ import { getProcessEnv } from "./process-env.js";
2
2
  import masked_default from "./masked.js";
3
3
  import sensitive_keys_default from "./sensitive-keys.js";
4
4
  import _get from "lodash/get.js";
5
- import * as Sentry from "@sentry/browser";
6
- import createSentryMiddleware from "redux-sentry-middleware";
5
+ import * as Sentry from "@sentry/react";
7
6
  import _set from "lodash/set.js";
8
7
 
9
8
  //#region src/sentry.ts
10
9
  const ERROR_CODES = { INVALID_AUTHENTICATION: 10007 };
11
10
  const ERROR_MESSAGES = { NETWORK_ERROR: "Network Error" };
12
- const STATUS_CODES = {
13
- UNAUTHORIZED: 401,
14
- SERVER_ERROR: 500
15
- };
16
- const _ignore = (error) => getProcessEnv().NODE_ENV === "test" || error.message === ERROR_MESSAGES.NETWORK_ERROR || _get(error, "data.statusCode") === STATUS_CODES.UNAUTHORIZED || _get(error, "data.statusCode") >= STATUS_CODES.SERVER_ERROR || _get(error, "data.errorCode") === ERROR_CODES.INVALID_AUTHENTICATION;
17
- const clearUserContext = () => Sentry.setUser();
18
- const createReduxMiddleware = () => createSentryMiddleware(Sentry, {
19
- actionTransformer: (action) => masked_default(action, sensitive_keys_default),
20
- stateTransformer: (state) => masked_default(state, sensitive_keys_default)
21
- });
22
- const logError = (_error, { name, data } = {}) => {
23
- let error = _error;
11
+ const STATUS_CODES = { UNAUTHORIZED: 401 };
12
+ const HIGH_CARDINALITY_CONTEXT_KEYS = [
13
+ "accountId",
14
+ "appId",
15
+ "businessId",
16
+ "claimId",
17
+ "futureId",
18
+ "patientId",
19
+ "paymentId",
20
+ "staffId",
21
+ "transactionId"
22
+ ];
23
+ const EXTRA_SENSITIVE_KEYS = [
24
+ ...sensitive_keys_default,
25
+ "accountNumber",
26
+ "apiKey",
27
+ "authToken",
28
+ "bankAccount",
29
+ "bankAccountNumber",
30
+ "bearer",
31
+ "card",
32
+ "cardNumber",
33
+ "cardRank",
34
+ "cvv",
35
+ "fundAccountNumber",
36
+ "idToken",
37
+ "memberId",
38
+ "nonce",
39
+ "pan",
40
+ "paymentMethod",
41
+ "requestBody",
42
+ "secret",
43
+ "sessionToken"
44
+ ];
45
+ const STANDARD_TAG_KEYS = [
46
+ "app",
47
+ "environment",
48
+ "error_code",
49
+ "flow",
50
+ "funder",
51
+ "is_sdk",
52
+ "is_standalone",
53
+ "operation",
54
+ "outcome",
55
+ "status_code",
56
+ "surface"
57
+ ];
58
+ const idsContext = {};
59
+ function normaliseTagValue(value) {
60
+ if (value === null || value === void 0) return;
61
+ return String(value);
62
+ }
63
+ function sanitiseValue(value) {
64
+ return masked_default(value, EXTRA_SENSITIVE_KEYS);
65
+ }
66
+ function stripUrlQuery(url) {
67
+ if (!url || typeof url !== "string") return url;
68
+ try {
69
+ const parsedUrl = new URL(url, window.location.origin);
70
+ parsedUrl.search = "";
71
+ parsedUrl.hash = "";
72
+ return parsedUrl.toString();
73
+ } catch (err) {
74
+ return url.split("?")[0].split("#")[0];
75
+ }
76
+ }
77
+ function getStatusCode(error) {
78
+ return _get(error, "status") || _get(error, "data.statusCode") || _get(error, "response.status") || _get(error, "config.status");
79
+ }
80
+ function getErrorCode(error) {
81
+ return _get(error, "data.errorCode") || _get(error, "response.data.errorCode");
82
+ }
83
+ function isExpectedError(error) {
84
+ const statusCode = getStatusCode(error);
85
+ const errorCode = getErrorCode(error);
86
+ return getProcessEnv().NODE_ENV === "test" || _get(error, "message") === ERROR_MESSAGES.NETWORK_ERROR || statusCode === STATUS_CODES.UNAUTHORIZED || errorCode === ERROR_CODES.INVALID_AUTHENTICATION;
87
+ }
88
+ function sanitiseError(error) {
89
+ if (!(error instanceof Error)) return sanitiseValue(error);
90
+ let sanitisedError = error;
91
+ const errorHeaders = sanitisedError?.config?.headers;
92
+ const maskedErrorHeaders = sanitiseValue(errorHeaders);
93
+ sanitisedError = _set(sanitisedError, "config.headers", maskedErrorHeaders);
94
+ try {
95
+ const errorData = sanitisedError?.config?.data;
96
+ const maskedErrorData = sanitiseValue(typeof errorData === "string" ? JSON.parse(errorData) : errorData);
97
+ sanitisedError = _set(sanitisedError, "config.data", JSON.stringify(maskedErrorData));
98
+ } catch (err) {
99
+ sanitisedError = _set(sanitisedError, "config.data", void 0);
100
+ }
101
+ if (sanitisedError?.config?.url) sanitisedError = _set(sanitisedError, "config.url", stripUrlQuery(sanitisedError.config.url));
102
+ return sanitisedError;
103
+ }
104
+ function applyScopeData(scope, options = {}) {
105
+ const { contexts = {}, data, fingerprint, level, tags = {} } = options;
106
+ const highCardinalityContext = {};
107
+ Object.entries(tags).forEach(([key, value]) => {
108
+ if (HIGH_CARDINALITY_CONTEXT_KEYS.includes(key)) {
109
+ highCardinalityContext[key] = value;
110
+ return;
111
+ }
112
+ const tagValue = normaliseTagValue(value);
113
+ if (tagValue !== void 0) scope.setTag(key, tagValue);
114
+ });
115
+ if (Object.keys(highCardinalityContext).length > 0) scope.setContext("ids", sanitiseValue(highCardinalityContext));
116
+ Object.entries(contexts).forEach(([key, context]) => {
117
+ scope.setContext(key, sanitiseValue(context));
118
+ });
119
+ if (data) scope.setExtra("data", sanitiseValue(data));
120
+ if (level) scope.setLevel(level);
121
+ if (fingerprint) scope.setFingerprint(fingerprint);
122
+ }
123
+ function createErrorFromUnknown(error, name) {
24
124
  if (error instanceof Error) {
25
- const errorHeaders = error?.config?.headers;
26
- const maskedErrorHeaders = masked_default(errorHeaders, ["Authorization"]);
27
- error = _set(error, "config.headers", maskedErrorHeaders);
28
- try {
29
- const errorData = error?.config?.data;
30
- const maskedErrorData = masked_default(JSON.parse(errorData), sensitive_keys_default);
31
- error = _set(error, "config.data", JSON.stringify(maskedErrorData));
32
- } catch (err) {}
125
+ if (name) error.name = name;
126
+ return error;
127
+ }
128
+ const message = _get(error, "data.message") || _get(error, "message") || "Unknown error";
129
+ const sentryError = new Error(String(message));
130
+ if (name) sentryError.name = name;
131
+ return sentryError;
132
+ }
133
+ function sanitiseEvent(event) {
134
+ const sanitisedEvent = sanitiseValue({ ...event });
135
+ if (sanitisedEvent.request?.url) sanitisedEvent.request.url = stripUrlQuery(sanitisedEvent.request.url);
136
+ if (sanitisedEvent.breadcrumbs) sanitisedEvent.breadcrumbs = sanitisedEvent.breadcrumbs.map((breadcrumb) => ({
137
+ ...breadcrumb,
138
+ data: sanitiseValue(breadcrumb.data || {})
139
+ }));
140
+ return sanitisedEvent;
141
+ }
142
+ function createIntegrations(options) {
143
+ const integrations = [];
144
+ if ((options.tracesSampleRate || 0) > 0) integrations.push(Sentry.browserTracingIntegration());
145
+ if ((options.replaysOnErrorSampleRate || 0) > 0 || (options.replaysSessionSampleRate || 0) > 0) integrations.push(Sentry.replayIntegration({
146
+ blockAllMedia: true,
147
+ maskAllInputs: true,
148
+ maskAllText: true
149
+ }));
150
+ return integrations;
151
+ }
152
+ const clearUserContext = () => {
153
+ Sentry.setUser(null);
154
+ Sentry.setContext("user", null);
155
+ };
156
+ const createReduxEnhancer = () => Sentry.createReduxEnhancer({
157
+ actionTransformer: (action) => sanitiseValue(action),
158
+ stateTransformer: (state) => sanitiseValue(state)
159
+ });
160
+ const createReduxMiddleware = () => () => (next) => (action) => {
161
+ Sentry.addBreadcrumb({
162
+ category: "redux.action",
163
+ data: sanitiseValue({ action }),
164
+ level: "info"
165
+ });
166
+ return next(action);
167
+ };
168
+ const addBreadcrumb = (breadcrumb) => Sentry.addBreadcrumb({
169
+ ...breadcrumb,
170
+ data: sanitiseValue(breadcrumb.data || {})
171
+ });
172
+ const setTag = (key, value) => {
173
+ const tagValue = normaliseTagValue(value);
174
+ if (tagValue !== void 0 && HIGH_CARDINALITY_CONTEXT_KEYS.includes(key)) {
175
+ idsContext[key] = tagValue;
176
+ Sentry.setContext("ids", sanitiseValue(idsContext));
177
+ return;
178
+ }
179
+ if (tagValue !== void 0) Sentry.setTag(key, tagValue);
180
+ };
181
+ const setTags = (tags = {}) => {
182
+ Object.entries(tags).forEach(([key, value]) => {
183
+ setTag(key, value);
184
+ });
185
+ };
186
+ const setUserContext = (user = {}) => {
187
+ const id = user.id || user._id || user.accountId;
188
+ if (!id) {
189
+ clearUserContext();
190
+ return;
33
191
  }
34
- if (_ignore(error)) return null;
192
+ Sentry.setUser({ id: String(id) });
193
+ Sentry.setContext("user", sanitiseValue({
194
+ accountId: user.accountId || id,
195
+ businessId: user.businessId,
196
+ staffId: user.staffId
197
+ }));
198
+ };
199
+ const captureError = (error, options = {}) => {
200
+ if (options.ignoreExpected !== false && isExpectedError(error)) return null;
201
+ const sanitisedError = sanitiseError(error);
202
+ const statusCode = getStatusCode(error);
203
+ const errorCode = getErrorCode(error);
204
+ Sentry.withScope((scope) => {
205
+ scope.setExtra("error", sanitiseValue(sanitisedError));
206
+ applyScopeData(scope, {
207
+ ...options,
208
+ tags: {
209
+ ...options.tags,
210
+ ...statusCode ? { status_code: statusCode } : {},
211
+ ...errorCode ? { error_code: errorCode } : {}
212
+ }
213
+ });
214
+ Sentry.captureException(createErrorFromUnknown(sanitisedError, options.name));
215
+ });
216
+ console.error(sanitisedError);
217
+ };
218
+ const logError = (error, { data, name } = {}) => captureError(error, {
219
+ data,
220
+ name
221
+ });
222
+ const captureMessage = (message, options = {}) => {
35
223
  Sentry.withScope((scope) => {
36
- scope.setExtra("error", error);
37
- scope.setExtra("data", masked_default(data, sensitive_keys_default));
38
- const message = _get(error, "data.message", error.message);
39
- const sentryError = error instanceof Error ? error : new Error(message);
40
- if (name) sentryError.name = name || message;
41
- Sentry.captureException(sentryError);
42
- });
43
- console.error(error);
44
- };
45
- const setup = ({ environment, url, version }) => {
46
- if (window.location.hostname !== "localhost") Sentry.init({
47
- dsn: url,
224
+ applyScopeData(scope, options);
225
+ Sentry.captureMessage(message, options.level);
226
+ });
227
+ };
228
+ const captureFlowEvent = ({ context, contexts, data, errorCode, error, extra, fingerprint, flow, funder, isSdk, isStandalone, level, message, operation, outcome, statusCode, surface, tags = {} }) => {
229
+ const nextTags = {
230
+ ...Object.keys(tags).reduce((normalisedTags, key) => {
231
+ if (STANDARD_TAG_KEYS.includes(key) || HIGH_CARDINALITY_CONTEXT_KEYS.includes(key)) normalisedTags[key] = tags[key];
232
+ return normalisedTags;
233
+ }, {}),
234
+ flow,
235
+ ...funder && { funder },
236
+ ...isSdk !== void 0 && { is_sdk: isSdk },
237
+ ...isStandalone !== void 0 && { is_standalone: isStandalone },
238
+ operation,
239
+ outcome,
240
+ ...statusCode && { status_code: statusCode },
241
+ ...errorCode && { error_code: errorCode },
242
+ ...surface && { surface }
243
+ };
244
+ const nextFingerprint = fingerprint || [
245
+ "flow-event",
246
+ flow,
247
+ operation,
248
+ outcome
249
+ ];
250
+ const eventMessage = message || `${flow}.${operation}.${outcome}`;
251
+ const nextContexts = {
252
+ ...contexts,
253
+ ...context && { context }
254
+ };
255
+ const nextData = extra || data;
256
+ addBreadcrumb({
257
+ category: "flow",
258
+ data: {
259
+ errorCode: errorCode || (error ? getErrorCode(error) : void 0),
260
+ flow,
261
+ operation,
262
+ outcome,
263
+ statusCode: statusCode || (error ? getStatusCode(error) : void 0)
264
+ },
265
+ level: outcome === "failure" ? "error" : outcome === "warning" || outcome === "validation" ? "warning" : "info",
266
+ message: eventMessage
267
+ });
268
+ if (error) return captureError(error, {
269
+ contexts: nextContexts,
270
+ data: nextData,
271
+ fingerprint: nextFingerprint,
272
+ ignoreExpected: outcome !== "validation" && outcome !== "warning",
273
+ level: level || (outcome === "validation" || outcome === "warning" ? "warning" : "error"),
274
+ name: eventMessage,
275
+ tags: nextTags
276
+ });
277
+ return captureMessage(eventMessage, {
278
+ contexts: nextContexts,
279
+ data: nextData,
280
+ fingerprint: nextFingerprint,
281
+ level: level || (outcome === "failure" ? "error" : outcome === "warning" || outcome === "validation" ? "warning" : "info"),
282
+ tags: nextTags
283
+ });
284
+ };
285
+ const setup = ({ app, beforeSend, debug, dsn, enableLogs, enabled, environment, release, replayErrorSampleRate, replaySessionSampleRate, replaysOnErrorSampleRate = 0, replaysSessionSampleRate = 0, tracePropagationTargets, tracesSampleRate = 0, tunnel, url, version } = {}) => {
286
+ const replayOnErrorSampleRate = replayErrorSampleRate ?? replaysOnErrorSampleRate;
287
+ const replaySampleRate = replaySessionSampleRate ?? replaysSessionSampleRate;
288
+ const processEnv = getProcessEnv();
289
+ const isLocalHost = typeof window !== "undefined" && ["localhost", "127.0.0.1"].includes(window.location.hostname || "");
290
+ const isEnabled = enabled ?? (!isLocalHost && processEnv.NODE_ENV !== "test" && processEnv.DISABLE_SENTRY !== "true");
291
+ Sentry.init({
292
+ beforeSend: (event, hint) => {
293
+ const sanitisedEvent = sanitiseEvent(event);
294
+ if (beforeSend) return beforeSend(sanitisedEvent, hint);
295
+ return sanitisedEvent;
296
+ },
297
+ debug,
298
+ dsn: dsn || url,
299
+ enableLogs,
300
+ enabled: Boolean(isEnabled && (dsn || url)),
48
301
  environment,
49
- release: version
302
+ integrations: createIntegrations({
303
+ replaysOnErrorSampleRate: replayOnErrorSampleRate,
304
+ replaysSessionSampleRate: replaySampleRate,
305
+ tracesSampleRate
306
+ }),
307
+ release: release || version,
308
+ replaysOnErrorSampleRate: replayOnErrorSampleRate,
309
+ replaysSessionSampleRate: replaySampleRate,
310
+ sendDefaultPii: false,
311
+ tracesSampleRate,
312
+ tracePropagationTargets,
313
+ tunnel
50
314
  });
315
+ if (app) setTag("app", app);
51
316
  };
52
- const setUserContext = (user) => Sentry.setUser(masked_default(user, sensitive_keys_default));
53
- const setTag = (key, value) => Sentry.setTag(key, value);
54
317
  const sentry = {};
55
318
  var sentry_default = sentry;
56
319
 
57
320
  //#endregion
58
- export { clearUserContext, createReduxMiddleware, sentry_default as default, logError, setTag, setUserContext, setup };
321
+ export { addBreadcrumb, captureError, captureFlowEvent, captureMessage, clearUserContext, createReduxEnhancer, createReduxMiddleware, sentry_default as default, logError, setTag, setTags, setUserContext, setup };
59
322
  //# sourceMappingURL=sentry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sentry.js","names":["masked","sensitiveKeys"],"sources":["../src/sentry.ts"],"sourcesContent":["import * as Sentry from '@sentry/browser';\n// @ts-expect-error TS(7016): Could not find a declaration file for module 'redu... Remove this comment to see the full error message\nimport createSentryMiddleware from 'redux-sentry-middleware';\nimport masked from './masked';\nimport _get from 'lodash/get.js';\nimport _set from 'lodash/set.js';\nimport sensitiveKeys from './sensitive-keys';\nimport { getProcessEnv } from './process-env';\nconst ERROR_CODES = {\n INVALID_AUTHENTICATION: 10007\n};\nconst ERROR_MESSAGES = {\n NETWORK_ERROR: 'Network Error'\n};\nconst STATUS_CODES = {\n UNAUTHORIZED: 401,\n SERVER_ERROR: 500\n};\n\n// @ts-expect-error TS(7006): Parameter 'error' implicitly has an 'any' type.\nconst _ignore = error =>\n getProcessEnv().NODE_ENV === 'test' ||\n error.message === ERROR_MESSAGES.NETWORK_ERROR ||\n _get(error, 'data.statusCode') === STATUS_CODES.UNAUTHORIZED ||\n _get(error, 'data.statusCode') >= STATUS_CODES.SERVER_ERROR ||\n _get(error, 'data.errorCode') === ERROR_CODES.INVALID_AUTHENTICATION;\n\n// @ts-expect-error TS(2554): Expected 1 arguments, but got 0.\nexport const clearUserContext = () => Sentry.setUser();\nexport const createReduxMiddleware = () =>\n createSentryMiddleware(Sentry, {\n // @ts-expect-error TS(7006): Parameter 'action' implicitly has an 'any' type.\n actionTransformer: action => masked(action, sensitiveKeys),\n // @ts-expect-error TS(7006): Parameter 'state' implicitly has an 'any' type.\n stateTransformer: state => masked(state, sensitiveKeys)\n });\nexport const logError = (\n // @ts-expect-error TS(7006): Parameter '_error' implicitly has an 'any' type.\n _error,\n {\n // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message\n name,\n // @ts-expect-error TS(2525): Initializer provides no value for this binding ele... Remove this comment to see the full error message\n data\n } = {}\n) => {\n let error = _error;\n\n if (error instanceof Error) {\n // @ts-expect-error TS(2339): Property 'config' does not exist on type 'Error'.\n const errorHeaders = error?.config?.headers;\n const maskedErrorHeaders = masked(errorHeaders, ['Authorization']);\n error = _set(error, 'config.headers', maskedErrorHeaders);\n\n try {\n const errorData = error?.config?.data;\n const maskedErrorData = masked(JSON.parse(errorData), sensitiveKeys);\n error = _set(error, 'config.data', JSON.stringify(maskedErrorData));\n } catch (err) {}\n }\n\n if (_ignore(error)) {\n return null;\n }\n\n Sentry.withScope(scope => {\n scope.setExtra('error', error);\n scope.setExtra('data', masked(data, sensitiveKeys));\n\n const message = _get(error, 'data.message', error.message);\n\n const sentryError = error instanceof Error ? error : new Error(message);\n\n if (name) {\n sentryError.name = name || message;\n }\n\n Sentry.captureException(sentryError);\n });\n console.error(error);\n};\n// @ts-expect-error TS(7031): Binding element 'environment' implicitly has an 'a... Remove this comment to see the full error message\nexport const setup = ({ environment, url, version }) => {\n if (window.location.hostname !== 'localhost') {\n Sentry.init({\n dsn: url,\n environment,\n release: version\n });\n }\n};\n// @ts-expect-error TS(7006): Parameter 'user' implicitly has an 'any' type.\nexport const setUserContext = user => Sentry.setUser(masked(user, sensitiveKeys));\n// @ts-expect-error TS(7006): Parameter 'key' implicitly has an 'any' type.\nexport const setTag = (key, value) => Sentry.setTag(key, value);\nconst sentry = {};\n\nexport default sentry;\n"],"mappings":";;;;;;;;;AAQA,MAAM,cAAc,EAClB,wBAAwB,OACzB;AACD,MAAM,iBAAiB,EACrB,eAAe,iBAChB;AACD,MAAM,eAAe;CACnB,cAAc;CACd,cAAc;CACf;AAGD,MAAM,WAAU,UACd,eAAe,CAAC,aAAa,UAC7B,MAAM,YAAY,eAAe,iBACjC,KAAK,OAAO,kBAAkB,KAAK,aAAa,gBAChD,KAAK,OAAO,kBAAkB,IAAI,aAAa,gBAC/C,KAAK,OAAO,iBAAiB,KAAK,YAAY;AAGhD,MAAa,yBAAyB,OAAO,SAAS;AACtD,MAAa,8BACX,uBAAuB,QAAQ;CAE7B,oBAAmB,WAAUA,eAAO,QAAQC,uBAAc;CAE1D,mBAAkB,UAASD,eAAO,OAAOC,uBAAc;CACxD,CAAC;AACJ,MAAa,YAEX,QACA,EAEE,MAEA,SACE,EAAE,KACH;CACH,IAAI,QAAQ;AAEZ,KAAI,iBAAiB,OAAO;EAE1B,MAAM,eAAe,OAAO,QAAQ;EACpC,MAAM,qBAAqBD,eAAO,cAAc,CAAC,gBAAgB,CAAC;AAClE,UAAQ,KAAK,OAAO,kBAAkB,mBAAmB;AAEzD,MAAI;GACF,MAAM,YAAY,OAAO,QAAQ;GACjC,MAAM,kBAAkBA,eAAO,KAAK,MAAM,UAAU,EAAEC,uBAAc;AACpE,WAAQ,KAAK,OAAO,eAAe,KAAK,UAAU,gBAAgB,CAAC;WAC5D,KAAK;;AAGhB,KAAI,QAAQ,MAAM,CAChB,QAAO;AAGT,QAAO,WAAU,UAAS;AACxB,QAAM,SAAS,SAAS,MAAM;AAC9B,QAAM,SAAS,QAAQD,eAAO,MAAMC,uBAAc,CAAC;EAEnD,MAAM,UAAU,KAAK,OAAO,gBAAgB,MAAM,QAAQ;EAE1D,MAAM,cAAc,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,QAAQ;AAEvE,MAAI,KACF,aAAY,OAAO,QAAQ;AAG7B,SAAO,iBAAiB,YAAY;GACpC;AACF,SAAQ,MAAM,MAAM;;AAGtB,MAAa,SAAS,EAAE,aAAa,KAAK,cAAc;AACtD,KAAI,OAAO,SAAS,aAAa,YAC/B,QAAO,KAAK;EACV,KAAK;EACL;EACA,SAAS;EACV,CAAC;;AAIN,MAAa,kBAAiB,SAAQ,OAAO,QAAQD,eAAO,MAAMC,uBAAc,CAAC;AAEjF,MAAa,UAAU,KAAK,UAAU,OAAO,OAAO,KAAK,MAAM;AAC/D,MAAM,SAAS,EAAE;AAEjB,qBAAe"}
1
+ {"version":3,"file":"sentry.js","names":["sensitiveKeys","idsContext: SentryContext","masked","highCardinalityContext: SentryContext","integrations: Array<\n ReturnType<typeof Sentry.browserTracingIntegration> | ReturnType<typeof Sentry.replayIntegration>\n >"],"sources":["../src/sentry.ts"],"sourcesContent":["import * as Sentry from '@sentry/react';\nimport _get from 'lodash/get.js';\nimport _set from 'lodash/set.js';\nimport type { AnyAction } from 'redux';\nimport masked from './masked';\nimport { getProcessEnv } from './process-env';\nimport sensitiveKeys from './sensitive-keys';\n\nconst ERROR_CODES = {\n INVALID_AUTHENTICATION: 10007\n};\n\nconst ERROR_MESSAGES = {\n NETWORK_ERROR: 'Network Error'\n};\n\nconst STATUS_CODES = {\n UNAUTHORIZED: 401\n};\n\nconst HIGH_CARDINALITY_CONTEXT_KEYS = [\n 'accountId',\n 'appId',\n 'businessId',\n 'claimId',\n 'futureId',\n 'patientId',\n 'paymentId',\n 'staffId',\n 'transactionId'\n];\n\nconst EXTRA_SENSITIVE_KEYS = [\n ...sensitiveKeys,\n 'accountNumber',\n 'apiKey',\n 'authToken',\n 'bankAccount',\n 'bankAccountNumber',\n 'bearer',\n 'card',\n 'cardNumber',\n 'cardRank',\n 'cvv',\n 'fundAccountNumber',\n 'idToken',\n 'memberId',\n 'nonce',\n 'pan',\n 'paymentMethod',\n 'requestBody',\n 'secret',\n 'sessionToken'\n];\n\nconst STANDARD_TAG_KEYS = [\n 'app',\n 'environment',\n 'error_code',\n 'flow',\n 'funder',\n 'is_sdk',\n 'is_standalone',\n 'operation',\n 'outcome',\n 'status_code',\n 'surface'\n];\n\ntype SentryPrimitive = string | number | boolean | null | undefined;\ntype SentryTags = Record<string, SentryPrimitive>;\ntype SentryContext = Record<string, unknown>;\n\ntype ErrorWithConfig = Error & {\n config?: {\n data?: unknown;\n headers?: Record<string, unknown>;\n url?: string;\n };\n data?: {\n errorCode?: number;\n message?: string;\n statusCode?: number;\n };\n status?: number;\n};\n\nexport type SentrySetupOptions = {\n app?: string;\n beforeSend?: Sentry.BrowserOptions['beforeSend'];\n debug?: boolean;\n dsn?: string;\n enableLogs?: boolean;\n enabled?: boolean;\n environment?: string;\n release?: string;\n replayErrorSampleRate?: number;\n replaySessionSampleRate?: number;\n replaysOnErrorSampleRate?: number;\n replaysSessionSampleRate?: number;\n tracePropagationTargets?: Sentry.BrowserOptions['tracePropagationTargets'];\n tracesSampleRate?: number;\n tunnel?: string;\n url?: string;\n version?: string;\n};\n\nexport type CaptureErrorOptions = {\n contexts?: Record<string, SentryContext>;\n data?: SentryContext;\n fingerprint?: string[];\n ignoreExpected?: boolean;\n level?: Sentry.SeverityLevel;\n name?: string;\n tags?: SentryTags;\n};\n\nexport type CaptureMessageOptions = Omit<CaptureErrorOptions, 'name'>;\n\nexport type CaptureFlowEventOptions = {\n context?: SentryContext;\n contexts?: Record<string, SentryContext>;\n data?: SentryContext;\n errorCode?: string | number;\n error?: unknown;\n extra?: SentryContext;\n fingerprint?: string[];\n flow: string;\n funder?: string;\n isSdk?: boolean;\n isStandalone?: boolean;\n level?: Sentry.SeverityLevel;\n message?: string;\n operation: string;\n outcome: 'cancelled' | 'failure' | 'info' | 'success' | 'validation' | 'warning';\n statusCode?: string | number;\n surface?: string;\n tags?: SentryTags;\n};\n\nconst idsContext: SentryContext = {};\n\nfunction normaliseTagValue(value: SentryPrimitive) {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n return String(value);\n}\n\nfunction sanitiseValue<T>(value: T): T {\n return masked(value as Record<string, any>, EXTRA_SENSITIVE_KEYS) as T;\n}\n\nfunction stripUrlQuery(url?: string) {\n if (!url || typeof url !== 'string') {\n return url;\n }\n\n try {\n const parsedUrl = new URL(url, window.location.origin);\n parsedUrl.search = '';\n parsedUrl.hash = '';\n return parsedUrl.toString();\n } catch (err) {\n return url.split('?')[0].split('#')[0];\n }\n}\n\nfunction getStatusCode(error: unknown) {\n return (\n _get(error, 'status') ||\n _get(error, 'data.statusCode') ||\n _get(error, 'response.status') ||\n _get(error, 'config.status')\n );\n}\n\nfunction getErrorCode(error: unknown) {\n return _get(error, 'data.errorCode') || _get(error, 'response.data.errorCode');\n}\n\nfunction isExpectedError(error: unknown) {\n const statusCode = getStatusCode(error);\n const errorCode = getErrorCode(error);\n\n return (\n getProcessEnv().NODE_ENV === 'test' ||\n _get(error, 'message') === ERROR_MESSAGES.NETWORK_ERROR ||\n statusCode === STATUS_CODES.UNAUTHORIZED ||\n errorCode === ERROR_CODES.INVALID_AUTHENTICATION\n );\n}\n\nfunction sanitiseError<T extends unknown>(error: T): T {\n if (!(error instanceof Error)) {\n return sanitiseValue(error);\n }\n\n let sanitisedError = error as ErrorWithConfig;\n const errorHeaders = sanitisedError?.config?.headers;\n const maskedErrorHeaders = sanitiseValue(errorHeaders);\n sanitisedError = _set(sanitisedError, 'config.headers', maskedErrorHeaders);\n\n try {\n const errorData = sanitisedError?.config?.data;\n const maskedErrorData = sanitiseValue(\n typeof errorData === 'string' ? JSON.parse(errorData) : (errorData as Record<string, unknown>)\n );\n sanitisedError = _set(sanitisedError, 'config.data', JSON.stringify(maskedErrorData));\n } catch (err) {\n sanitisedError = _set(sanitisedError, 'config.data', undefined);\n }\n\n if (sanitisedError?.config?.url) {\n sanitisedError = _set(sanitisedError, 'config.url', stripUrlQuery(sanitisedError.config.url));\n }\n\n return sanitisedError as T;\n}\n\nfunction applyScopeData(scope: Sentry.Scope, options: CaptureErrorOptions = {}) {\n const { contexts = {}, data, fingerprint, level, tags = {} } = options;\n const highCardinalityContext: SentryContext = {};\n\n Object.entries(tags).forEach(([key, value]) => {\n if (HIGH_CARDINALITY_CONTEXT_KEYS.includes(key)) {\n highCardinalityContext[key] = value;\n return;\n }\n\n const tagValue = normaliseTagValue(value);\n\n if (tagValue !== undefined) {\n scope.setTag(key, tagValue);\n }\n });\n\n if (Object.keys(highCardinalityContext).length > 0) {\n scope.setContext('ids', sanitiseValue(highCardinalityContext));\n }\n\n Object.entries(contexts).forEach(([key, context]) => {\n scope.setContext(key, sanitiseValue(context));\n });\n\n if (data) {\n scope.setExtra('data', sanitiseValue(data));\n }\n\n if (level) {\n scope.setLevel(level);\n }\n\n if (fingerprint) {\n scope.setFingerprint(fingerprint);\n }\n}\n\nfunction createErrorFromUnknown(error: unknown, name?: string) {\n if (error instanceof Error) {\n if (name) {\n error.name = name;\n }\n\n return error;\n }\n\n const message = _get(error, 'data.message') || _get(error, 'message') || 'Unknown error';\n const sentryError = new Error(String(message));\n\n if (name) {\n sentryError.name = name;\n }\n\n return sentryError;\n}\n\nfunction sanitiseEvent<T extends Sentry.Event>(event: T): T {\n const sanitisedEvent = sanitiseValue({ ...event }) as T;\n\n if (sanitisedEvent.request?.url) {\n sanitisedEvent.request.url = stripUrlQuery(sanitisedEvent.request.url);\n }\n\n if (sanitisedEvent.breadcrumbs) {\n sanitisedEvent.breadcrumbs = sanitisedEvent.breadcrumbs.map(breadcrumb => ({\n ...breadcrumb,\n data: sanitiseValue(breadcrumb.data || {})\n }));\n }\n\n return sanitisedEvent;\n}\n\nfunction createIntegrations(options: SentrySetupOptions) {\n const integrations: Array<\n ReturnType<typeof Sentry.browserTracingIntegration> | ReturnType<typeof Sentry.replayIntegration>\n > = [];\n\n if ((options.tracesSampleRate || 0) > 0) {\n integrations.push(Sentry.browserTracingIntegration());\n }\n\n if ((options.replaysOnErrorSampleRate || 0) > 0 || (options.replaysSessionSampleRate || 0) > 0) {\n integrations.push(\n Sentry.replayIntegration({\n blockAllMedia: true,\n maskAllInputs: true,\n maskAllText: true\n })\n );\n }\n\n return integrations;\n}\n\nexport const clearUserContext = () => {\n Sentry.setUser(null);\n Sentry.setContext('user', null);\n};\n\nexport const createReduxEnhancer = () =>\n Sentry.createReduxEnhancer({\n actionTransformer: (action: AnyAction) => sanitiseValue(action) as AnyAction,\n stateTransformer: (state: unknown) => sanitiseValue(state as Record<string, any>)\n });\n\nexport const createReduxMiddleware = () => () => (next: (action: unknown) => unknown) => (action: unknown) => {\n Sentry.addBreadcrumb({\n category: 'redux.action',\n data: sanitiseValue({ action }),\n level: 'info'\n });\n\n return next(action);\n};\n\nexport const addBreadcrumb = (breadcrumb: Sentry.Breadcrumb) =>\n Sentry.addBreadcrumb({\n ...breadcrumb,\n data: sanitiseValue(breadcrumb.data || {})\n });\n\nexport const setTag = (key: string, value: SentryPrimitive) => {\n const tagValue = normaliseTagValue(value);\n\n if (tagValue !== undefined && HIGH_CARDINALITY_CONTEXT_KEYS.includes(key)) {\n idsContext[key] = tagValue;\n Sentry.setContext('ids', sanitiseValue(idsContext));\n return;\n }\n\n if (tagValue !== undefined) {\n Sentry.setTag(key, tagValue);\n }\n};\n\nexport const setTags = (tags: SentryTags = {}) => {\n Object.entries(tags).forEach(([key, value]) => {\n setTag(key, value);\n });\n};\n\nexport const setUserContext = (user: Record<string, unknown> = {}) => {\n const id = user.id || user._id || user.accountId;\n\n if (!id) {\n clearUserContext();\n return;\n }\n\n Sentry.setUser({ id: String(id) });\n Sentry.setContext(\n 'user',\n sanitiseValue({\n accountId: user.accountId || id,\n businessId: user.businessId,\n staffId: user.staffId\n })\n );\n};\n\nexport const captureError = (error: unknown, options: CaptureErrorOptions = {}) => {\n if (options.ignoreExpected !== false && isExpectedError(error)) {\n return null;\n }\n\n const sanitisedError = sanitiseError(error);\n const statusCode = getStatusCode(error);\n const errorCode = getErrorCode(error);\n\n Sentry.withScope(scope => {\n scope.setExtra('error', sanitiseValue(sanitisedError));\n applyScopeData(scope, {\n ...options,\n tags: {\n ...options.tags,\n ...(statusCode ? { status_code: statusCode } : {}),\n ...(errorCode ? { error_code: errorCode } : {})\n }\n });\n\n Sentry.captureException(createErrorFromUnknown(sanitisedError, options.name));\n });\n\n console.error(sanitisedError);\n};\n\nexport const logError = (\n error: unknown,\n {\n data,\n name\n }: {\n data?: SentryContext;\n name?: string;\n } = {}\n) => captureError(error, { data, name });\n\nexport const captureMessage = (message: string, options: CaptureMessageOptions = {}) => {\n Sentry.withScope(scope => {\n applyScopeData(scope, options);\n Sentry.captureMessage(message, options.level);\n });\n};\n\nexport const captureFlowEvent = ({\n context,\n contexts,\n data,\n errorCode,\n error,\n extra,\n fingerprint,\n flow,\n funder,\n isSdk,\n isStandalone,\n level,\n message,\n operation,\n outcome,\n statusCode,\n surface,\n tags = {}\n}: CaptureFlowEventOptions) => {\n const standardTags = Object.keys(tags).reduce<SentryTags>((normalisedTags, key) => {\n if (STANDARD_TAG_KEYS.includes(key) || HIGH_CARDINALITY_CONTEXT_KEYS.includes(key)) {\n normalisedTags[key] = tags[key];\n }\n\n return normalisedTags;\n }, {});\n\n const nextTags = {\n ...standardTags,\n flow,\n ...(funder && { funder }),\n ...(isSdk !== undefined && { is_sdk: isSdk }),\n ...(isStandalone !== undefined && { is_standalone: isStandalone }),\n operation,\n outcome,\n ...(statusCode && { status_code: statusCode }),\n ...(errorCode && { error_code: errorCode }),\n ...(surface && { surface })\n };\n const nextFingerprint = fingerprint || ['flow-event', flow, operation, outcome];\n const eventMessage = message || `${flow}.${operation}.${outcome}`;\n const nextContexts = {\n ...contexts,\n ...(context && { context })\n };\n const nextData = extra || data;\n\n addBreadcrumb({\n category: 'flow',\n data: {\n errorCode: errorCode || (error ? getErrorCode(error) : undefined),\n flow,\n operation,\n outcome,\n statusCode: statusCode || (error ? getStatusCode(error) : undefined)\n },\n level: outcome === 'failure' ? 'error' : outcome === 'warning' || outcome === 'validation' ? 'warning' : 'info',\n message: eventMessage\n });\n\n if (error) {\n return captureError(error, {\n contexts: nextContexts,\n data: nextData,\n fingerprint: nextFingerprint,\n ignoreExpected: outcome !== 'validation' && outcome !== 'warning',\n level: level || (outcome === 'validation' || outcome === 'warning' ? 'warning' : 'error'),\n name: eventMessage,\n tags: nextTags\n });\n }\n\n return captureMessage(eventMessage, {\n contexts: nextContexts,\n data: nextData,\n fingerprint: nextFingerprint,\n level:\n level ||\n (outcome === 'failure' ? 'error' : outcome === 'warning' || outcome === 'validation' ? 'warning' : 'info'),\n tags: nextTags\n });\n};\n\nexport const setup = ({\n app,\n beforeSend,\n debug,\n dsn,\n enableLogs,\n enabled,\n environment,\n release,\n replayErrorSampleRate,\n replaySessionSampleRate,\n replaysOnErrorSampleRate = 0,\n replaysSessionSampleRate = 0,\n tracePropagationTargets,\n tracesSampleRate = 0,\n tunnel,\n url,\n version\n}: SentrySetupOptions = {}) => {\n const replayOnErrorSampleRate = replayErrorSampleRate ?? replaysOnErrorSampleRate;\n const replaySampleRate = replaySessionSampleRate ?? replaysSessionSampleRate;\n const processEnv = getProcessEnv();\n const isLocalHost =\n typeof window !== 'undefined' && ['localhost', '127.0.0.1'].includes(window.location.hostname || '');\n const isEnabled = enabled ?? (!isLocalHost && processEnv.NODE_ENV !== 'test' && processEnv.DISABLE_SENTRY !== 'true');\n\n Sentry.init({\n beforeSend: (event, hint) => {\n const sanitisedEvent = sanitiseEvent(event);\n\n if (beforeSend) {\n return beforeSend(sanitisedEvent, hint);\n }\n\n return sanitisedEvent;\n },\n debug,\n dsn: dsn || url,\n enableLogs,\n enabled: Boolean(isEnabled && (dsn || url)),\n environment,\n integrations: createIntegrations({\n replaysOnErrorSampleRate: replayOnErrorSampleRate,\n replaysSessionSampleRate: replaySampleRate,\n tracesSampleRate\n }),\n release: release || version,\n replaysOnErrorSampleRate: replayOnErrorSampleRate,\n replaysSessionSampleRate: replaySampleRate,\n sendDefaultPii: false,\n tracesSampleRate,\n tracePropagationTargets,\n tunnel\n });\n\n if (app) {\n setTag('app', app);\n }\n};\n\nconst sentry = {};\n\nexport default sentry;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medipass/utils",
3
- "version": "12.0.4",
3
+ "version": "12.0.5-feat-sentry-reform.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -114,7 +114,7 @@
114
114
  "react-dom": ">=18.2.0 <19"
115
115
  },
116
116
  "dependencies": {
117
- "@sentry/browser": "5.12.0",
117
+ "@sentry/react": "10.63.0",
118
118
  "date-fns": "2.16.1",
119
119
  "escape-html": "1.0.3",
120
120
  "google-libphonenumber": "3.2.44",
@@ -123,7 +123,6 @@
123
123
  "react-places-autocomplete": "7.3.0",
124
124
  "react-redux": "8.0.5",
125
125
  "redux": "4.2.1",
126
- "redux-sentry-middleware": "0.1.3",
127
126
  "yup": "0.32.9"
128
127
  },
129
128
  "devDependencies": {
@@ -139,5 +138,5 @@
139
138
  "vite-tsconfig-paths": "6.1.1",
140
139
  "vitest": "4.1.5"
141
140
  },
142
- "gitHead": "181b32eb8a27c3f454aad5fda67a70f084d62853"
141
+ "gitHead": "2d9251c9df6892b13a1f86941112a51002278017"
143
142
  }