Skip to content

Commit d215be1

Browse files
committed
refactor(core): Extract validation utilities
- validation.ts moved to @hawk.so/core
1 parent 4a3d4e2 commit d215be1

File tree

5 files changed

+17
-25
lines changed

5 files changed

+17
-25
lines changed

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export type { RandomGenerator } from './utils/random';
33
export { HawkUserManager } from './users/hawk-user-manager';
44
export type { Logger, LogType } from './logger/logger';
55
export { isLoggerSet, setLogger, resetLogger, log } from './logger/logger';
6+
export { isPlainObject, validateUser, validateContext, isValidEventPayload, isValidBreadcrumb } from './utils/validation';

packages/javascript/src/utils/validation.ts renamed to packages/core/src/utils/validation.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
import { log } from '@hawk.so/core';
2-
import type { AffectedUser, Breadcrumb, EventContext, EventData, JavaScriptAddons } from '@hawk.so/types';
3-
import Sanitizer from '../modules/sanitizer';
1+
import { log } from '../logger/logger';
2+
import type { AffectedUser, Breadcrumb, EventAddons, EventContext, EventData } from '@hawk.so/types';
43

54
/**
65
* Validates user data - basic security checks
76
*
87
* @param user - user data to validate
98
*/
109
export function validateUser(user: AffectedUser): boolean {
11-
if (!user || !Sanitizer.isObject(user)) {
10+
if (!user || !isPlainObject(user)) {
1211
log('validateUser: User must be an object', 'warn');
1312

1413
return false;
@@ -30,7 +29,7 @@ export function validateUser(user: AffectedUser): boolean {
3029
* @param context - context data to validate
3130
*/
3231
export function validateContext(context: EventContext | undefined): boolean {
33-
if (context && !Sanitizer.isObject(context)) {
32+
if (context && !isPlainObject(context)) {
3433
log('validateContext: Context must be an object', 'warn');
3534

3635
return false;
@@ -40,22 +39,23 @@ export function validateContext(context: EventContext | undefined): boolean {
4039
}
4140

4241
/**
43-
* Checks if value is a plain object (not array, Date, etc.)
42+
* Checks if value is a plain object (not null, array, Date, Map, etc.)
4443
*
4544
* @param value - value to check
45+
* @returns `true` if value is a plain object, otherwise `false`
4646
*/
47-
function isPlainObject(value: unknown): value is Record<string, unknown> {
47+
export function isPlainObject(value: unknown): value is Record<string, unknown> {
4848
return Object.prototype.toString.call(value) === '[object Object]';
4949
}
5050

5151
/**
5252
* Runtime check for required EventData fields.
5353
* Per @hawk.so/types EventData, `title` is the only non-optional field.
54-
* Additionally validates `backtrace` shape if present (must be an array).
54+
* Additionally, validates `backtrace` shape if present (must be an array).
5555
*
5656
* @param payload - value to validate
5757
*/
58-
export function isValidEventPayload(payload: unknown): payload is EventData<JavaScriptAddons> {
58+
export function isValidEventPayload(payload: unknown): payload is EventData<EventAddons> {
5959
if (!isPlainObject(payload)) {
6060
return false;
6161
}
@@ -64,11 +64,7 @@ export function isValidEventPayload(payload: unknown): payload is EventData<Java
6464
return false;
6565
}
6666

67-
if (payload.backtrace !== undefined && !Array.isArray(payload.backtrace)) {
68-
return false;
69-
}
70-
71-
return true;
67+
return !(payload.backtrace !== undefined && !Array.isArray(payload.backtrace));
7268
}
7369

7470
/**
@@ -86,9 +82,5 @@ export function isValidBreadcrumb(breadcrumb: unknown): breadcrumb is Breadcrumb
8682
return false;
8783
}
8884

89-
if (breadcrumb.timestamp !== undefined && typeof breadcrumb.timestamp !== 'number') {
90-
return false;
91-
}
92-
93-
return true;
85+
return !(breadcrumb.timestamp !== undefined && typeof breadcrumb.timestamp !== 'number');
9486
}

packages/javascript/tests/utils/validation.test.ts renamed to packages/core/tests/utils/validation.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { describe, it, expect, vi } from 'vitest';
2-
import { validateUser, validateContext, isValidEventPayload, isValidBreadcrumb } from '../../src/utils/validation';
1+
import { describe, expect, it, vi } from 'vitest';
2+
import { isValidBreadcrumb, isValidEventPayload, validateContext, validateUser } from '../../src';
33

44
// Suppress log output produced by log() calls inside validation failures.
5-
vi.mock('@hawk.so/core', () => ({ log: vi.fn(), isLoggerSet: vi.fn(() => true), setLogger: vi.fn() }));
5+
vi.mock('../../src/logger/logger', () => ({ log: vi.fn(), isLoggerSet: vi.fn(() => true), setLogger: vi.fn() }));
66

77
describe('validateUser', () => {
88
it('should return false when user is null', () => {

packages/javascript/src/addons/breadcrumbs.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import type { Breadcrumb, BreadcrumbLevel, BreadcrumbType, Json, JsonNode } from '@hawk.so/types';
55
import Sanitizer from '../modules/sanitizer';
66
import { buildElementSelector } from '../utils/selector';
7-
import { log } from '@hawk.so/core';
8-
import { isValidBreadcrumb } from '../utils/validation';
7+
import { isValidBreadcrumb, log } from '@hawk.so/core';
98

109
/**
1110
* Default maximum number of breadcrumbs to store

packages/javascript/src/catcher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { isErrorProcessed, markErrorAsProcessed } from './utils/event';
1818
import { BrowserRandomGenerator } from './utils/random';
1919
import { ConsoleCatcher } from './addons/consoleCatcher';
2020
import { BreadcrumbManager } from './addons/breadcrumbs';
21-
import { isValidEventPayload, validateContext, validateUser } from './utils/validation';
21+
import { isValidEventPayload, validateContext, validateUser } from '@hawk.so/core';
2222
import { HawkUserManager, isLoggerSet, log, setLogger } from '@hawk.so/core';
2323
import { HawkLocalStorage } from './storages/hawk-local-storage';
2424
import { createBrowserLogger } from './logger/logger';

0 commit comments

Comments
 (0)