@prysm-ai/utils 0.1.0 → 0.3.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/CHANGELOG.md ADDED
@@ -0,0 +1,35 @@
1
+ # @prysm-ai/utils
2
+
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 发布 0.2.0 版本
8
+
9
+ 核心变更:
10
+ - 重构 @prysm-ai/core 为统一入口包,导出所有子包
11
+ - @prysm-ai/agent 新增 types.ts 定义核心类型
12
+ - 删除 core 包自有类型定义,改为纯 re-export
13
+ - 新增 createModel 工厂函数
14
+ - 支持流式输出 chatStream
15
+
16
+ ## 0.2.0
17
+
18
+ ### Minor Changes
19
+
20
+ - 发布第一个版本,包含核心功能:
21
+ - core: 核心抽象类(Agent、Context、Storage 等)
22
+ - llm: LLM 抽象层,支持 OpenAI/Anthropic 提供商,新增 createModel 工厂函数
23
+ - agent: Agent 框架核心实现
24
+ - tools: 工具系统
25
+ - memory: 记忆系统
26
+ - prompts: 提示词模板管理
27
+ - logger: 日志系统
28
+ - metrics: 指标系统
29
+ - tracing: 链路追踪
30
+ - enterprise: 企业级功能
31
+ - mcp: Model Context Protocol
32
+ - skills: 技能系统
33
+ - multiagent: 多 Agent 协作
34
+ - rag: 检索增强生成
35
+ - utils: 工具函数库
@@ -16,3 +16,4 @@ export declare class AsyncQueue<T> {
16
16
  private process;
17
17
  get size(): number;
18
18
  }
19
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,KAAK,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9C,GACL,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,CAAC,EAAE,CAAC,CAuBd;AAED,qBAAa,UAAU,CAAC,CAAC;IAIX,OAAO,CAAC,WAAW;IAH/B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAK;gBAEA,WAAW,SAAI;IAE7B,GAAG,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAgB/B,OAAO;IAerB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -97,3 +97,4 @@ export class AsyncQueue {
97
97
  return this.queue.length;
98
98
  }
99
99
  }
100
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from './async.js';
2
2
  export * from './validation.js';
3
3
  export * from './time.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from './async.js';
2
2
  export * from './validation.js';
3
3
  export * from './time.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -19,3 +19,4 @@ export interface TimeContextMessage {
19
19
  content: string;
20
20
  }
21
21
  export declare function injectTimeContext(messages: TimeContextMessage[], options?: TimeContextOptions): TimeContextMessage[];
22
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB1E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAoBpF;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,OAAO,GAAE,kBAAuB,GAC/B,kBAAkB,EAAE,CAiCtB"}
@@ -68,3 +68,4 @@ export function injectTimeContext(messages, options = {}) {
68
68
  content: formattedContext,
69
69
  }, ...messages];
70
70
  }
71
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAOA,MAAM,oBAAoB,GAAG,wEAAwE,CAAC;AAEtG,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE,QAAgB;IAChE,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACtC,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,OAAO,qBAAqB,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AASD,MAAM,UAAU,gBAAgB,CAAC,UAA8B,EAAE;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEvD,IAAI,gBAAgB,GAAG,oBAAoB;SACxC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,gBAAgB,IAAI,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACvD,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS;QACT,QAAQ;QACR,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,iBAAiB,CAC/B,QAA8B,EAC9B,UAA8B,EAAE;IAEhC,MAAM,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEjE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACrE,MAAM,oBAAoB,GAAG;YAC3B,GAAG,iBAAiB;YACpB,OAAO,EAAE,iBAAiB,CAAC,OAAO,GAAG,MAAM,GAAG,gBAAgB;SAC/D,CAAC;QAEF,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACvC,IAAI,CAAC,KAAK,iBAAiB,EAAE,CAAC;gBAC5B,OAAO,oBAAoB,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO,CAAC;YACN,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,gBAAgB;SAC1B,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClB,CAAC"}
@@ -12,3 +12,4 @@ export declare function safeValidate<T>(schema: ZodType<T>, data: unknown): {
12
12
  export declare function requireFields(obj: Record<string, unknown>, fields: string[]): string[];
13
13
  export declare function isValidUUID(str: string): boolean;
14
14
  export declare function isValidEmail(email: string): boolean;
15
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAG7C,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CA0BnG;AAGD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAY3E;AAGD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAEhE;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAMnI;AAGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAKtF;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGhD;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnD"}
@@ -66,3 +66,4 @@ export function isValidEmail(email) {
66
66
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
67
67
  return emailRegex.test(email);
68
68
  }
69
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prysm-ai/utils",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Shared utilities",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,16 +11,17 @@
11
11
  "default": "./dist/index.js"
12
12
  }
13
13
  },
14
- "scripts": {
15
- "build": "tsc",
16
- "build:watch": "tsc --watch",
17
- "typecheck": "tsc --noEmit",
18
- "clean": "rm -rf dist"
19
- },
20
14
  "dependencies": {
21
15
  "zod": "^3.23.0"
22
16
  },
23
17
  "devDependencies": {
24
18
  "typescript": "^5.4.0"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "build:prod": "tsc --project tsconfig.build.json",
23
+ "build:watch": "tsc --watch",
24
+ "typecheck": "tsc --noEmit",
25
+ "clean": "rm -rf dist"
25
26
  }
26
27
  }
package/src/async.ts ADDED
@@ -0,0 +1,133 @@
1
+ // Async utilities
2
+
3
+ export async function withTimeout<T>(
4
+ promise: Promise<T>,
5
+ timeoutMs: number,
6
+ timeoutError?: Error
7
+ ): Promise<T> {
8
+ let timeoutId: ReturnType<typeof setTimeout>;
9
+
10
+ const timeoutPromise = new Promise<never>((_, reject) => {
11
+ timeoutId = setTimeout(() => {
12
+ reject(timeoutError ?? new Error(`Operation timed out after ${timeoutMs}ms`));
13
+ }, timeoutMs);
14
+ });
15
+
16
+ try {
17
+ return await Promise.race([promise, timeoutPromise]);
18
+ } finally {
19
+ clearTimeout(timeoutId!);
20
+ }
21
+ }
22
+
23
+ export async function retry<T>(
24
+ fn: () => Promise<T>,
25
+ options: {
26
+ maxAttempts?: number;
27
+ delayMs?: number;
28
+ backoff?: 'linear' | 'exponential';
29
+ onRetry?: (attempt: number, error: Error) => void;
30
+ } = {}
31
+ ): Promise<T> {
32
+ const {
33
+ maxAttempts = 3,
34
+ delayMs = 1000,
35
+ backoff = 'linear',
36
+ onRetry
37
+ } = options;
38
+
39
+ let lastError: Error;
40
+
41
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
42
+ try {
43
+ return await fn();
44
+ } catch (error) {
45
+ lastError = error as Error;
46
+
47
+ if (attempt < maxAttempts) {
48
+ const delay = backoff === 'exponential'
49
+ ? delayMs * Math.pow(2, attempt - 1)
50
+ : delayMs * attempt;
51
+
52
+ onRetry?.(attempt, lastError);
53
+ await sleep(delay);
54
+ }
55
+ }
56
+ }
57
+
58
+ throw lastError!;
59
+ }
60
+
61
+ export function sleep(ms: number): Promise<void> {
62
+ return new Promise(resolve => setTimeout(resolve, ms));
63
+ }
64
+
65
+ export async function parallel<T>(
66
+ tasks: (() => Promise<T>)[],
67
+ maxConcurrency?: number
68
+ ): Promise<T[]> {
69
+ if (!maxConcurrency) {
70
+ return Promise.all(tasks.map(fn => fn()));
71
+ }
72
+
73
+ const results: T[] = [];
74
+ const executing: Promise<void>[] = [];
75
+
76
+ for (const task of tasks) {
77
+ const p = task().then(result => {
78
+ results.push(result);
79
+ });
80
+
81
+ executing.push(p);
82
+
83
+ if (executing.length >= maxConcurrency) {
84
+ await Promise.race(executing);
85
+ executing.splice(executing.findIndex(e => e === p), 1);
86
+ }
87
+ }
88
+
89
+ await Promise.all(executing);
90
+ return results;
91
+ }
92
+
93
+ export class AsyncQueue<T> {
94
+ private queue: Array<() => Promise<T>> = [];
95
+ private running = 0;
96
+
97
+ constructor(private concurrency = 1) {}
98
+
99
+ async add(task: () => Promise<T>): Promise<T> {
100
+ return new Promise((resolve, reject) => {
101
+ this.queue.push(async () => {
102
+ try {
103
+ const result = await task();
104
+ resolve(result);
105
+ return result;
106
+ } catch (error) {
107
+ reject(error);
108
+ throw error;
109
+ }
110
+ });
111
+ this.process();
112
+ });
113
+ }
114
+
115
+ private async process(): Promise<void> {
116
+ if (this.running >= this.concurrency) return;
117
+ if (this.queue.length === 0) return;
118
+
119
+ this.running++;
120
+ const task = this.queue.shift()!;
121
+
122
+ try {
123
+ await task();
124
+ } finally {
125
+ this.running--;
126
+ this.process();
127
+ }
128
+ }
129
+
130
+ get size(): number {
131
+ return this.queue.length;
132
+ }
133
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './async.js';
2
+ export * from './validation.js';
3
+ export * from './time.js';
package/src/time.ts ADDED
@@ -0,0 +1,106 @@
1
+ export interface TimeContextOptions {
2
+ /** Timezone for display (e.g., 'UTC', 'America/New_York', 'Asia/Shanghai') */
3
+ timezone?: string;
4
+ /** Additional context to inject */
5
+ additionalContext?: string;
6
+ }
7
+
8
+ const DEFAULT_TIME_CONTEXT = `Current UTC time: {{utcTime}}. For other timezones, use the time tool.`;
9
+
10
+ export function formatTimeForTimezone(date: Date, timezone: string): string {
11
+ try {
12
+ return new Intl.DateTimeFormat('en-US', {
13
+ timeZone: timezone,
14
+ year: 'numeric',
15
+ month: '2-digit',
16
+ day: '2-digit',
17
+ hour: '2-digit',
18
+ minute: '2-digit',
19
+ second: '2-digit',
20
+ hour12: false,
21
+ timeZoneName: 'short',
22
+ }).format(date);
23
+ } catch {
24
+ return date.toISOString();
25
+ }
26
+ }
27
+
28
+ export function getCurrentTimeISO(): string {
29
+ return new Date().toISOString();
30
+ }
31
+
32
+ export function getCurrentTimeForTimezone(timezone: string): string {
33
+ return formatTimeForTimezone(new Date(), timezone);
34
+ }
35
+
36
+ export interface TimeContextResult {
37
+ utcTime: string;
38
+ localTime: string;
39
+ timezone: string;
40
+ formattedContext: string;
41
+ }
42
+
43
+ export function buildTimeContext(options: TimeContextOptions = {}): TimeContextResult {
44
+ const timezone = options.timezone ?? 'UTC';
45
+ const now = new Date();
46
+
47
+ const utcTime = now.toISOString();
48
+ const localTime = formatTimeForTimezone(now, timezone);
49
+
50
+ let formattedContext = DEFAULT_TIME_CONTEXT
51
+ .replace('{{utcTime}}', utcTime);
52
+
53
+ if (options.additionalContext) {
54
+ formattedContext += '\n' + options.additionalContext;
55
+ }
56
+
57
+ return {
58
+ utcTime,
59
+ localTime,
60
+ timezone,
61
+ formattedContext,
62
+ };
63
+ }
64
+
65
+ export interface TimeContextMessage {
66
+ role: string;
67
+ content: string;
68
+ }
69
+
70
+ export function injectTimeContext(
71
+ messages: TimeContextMessage[],
72
+ options: TimeContextOptions = {}
73
+ ): TimeContextMessage[] {
74
+ const { formattedContext } = buildTimeContext(options);
75
+
76
+ if (messages.length === 0) {
77
+ return [{
78
+ role: 'system',
79
+ content: formattedContext,
80
+ }];
81
+ }
82
+
83
+ const systemMessages = messages.filter(m => m.role === 'system');
84
+
85
+ if (systemMessages.length > 0) {
86
+ const lastSystemMessage = systemMessages[systemMessages.length - 1]!;
87
+ const updatedSystemMessage = {
88
+ ...lastSystemMessage,
89
+ content: lastSystemMessage.content + '\n\n' + formattedContext,
90
+ };
91
+
92
+ const updatedMessages = messages.map(m => {
93
+ if (m === lastSystemMessage) {
94
+ return updatedSystemMessage;
95
+ }
96
+ return m;
97
+ });
98
+
99
+ return updatedMessages;
100
+ }
101
+
102
+ return [{
103
+ role: 'system',
104
+ content: formattedContext,
105
+ }, ...messages];
106
+ }
@@ -0,0 +1,79 @@
1
+ import type { ZodError, ZodType } from 'zod';
2
+
3
+ // Deep merge utility
4
+ export function deepMerge<T extends Record<string, unknown>>(target: T, ...sources: Partial<T>[]): T {
5
+ const result = { ...target };
6
+
7
+ for (const source of sources) {
8
+ for (const key of Object.keys(source) as (keyof T)[]) {
9
+ const sourceValue = source[key];
10
+ const targetValue = result[key];
11
+
12
+ if (
13
+ sourceValue !== null &&
14
+ typeof sourceValue === 'object' &&
15
+ !Array.isArray(sourceValue) &&
16
+ targetValue !== null &&
17
+ typeof targetValue === 'object' &&
18
+ !Array.isArray(targetValue) &&
19
+ !(sourceValue instanceof Date) &&
20
+ !(targetValue instanceof Date)
21
+ ) {
22
+ result[key] = deepMerge(targetValue as Record<string, unknown>, sourceValue as Record<string, unknown>) as T[ keyof T];
23
+ } else {
24
+ result[key] = sourceValue as T[keyof T];
25
+ }
26
+ }
27
+ }
28
+
29
+ return result;
30
+ }
31
+
32
+ // Object sort for cache key generation
33
+ export function sortObjectKeys<T extends Record<string, unknown>>(obj: T): T {
34
+ return Object.keys(obj)
35
+ .sort()
36
+ .reduce((acc, key) => {
37
+ const value = obj[key];
38
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
39
+ (acc as Record<string, unknown>)[key] = sortObjectKeys(value as Record<string, unknown>);
40
+ } else {
41
+ (acc as Record<string, unknown>)[key] = value;
42
+ }
43
+ return acc;
44
+ }, {} as T);
45
+ }
46
+
47
+ // Validate with Zod schema
48
+ export function validate<T>(schema: ZodType<T>, data: unknown): T {
49
+ return schema.parse(data);
50
+ }
51
+
52
+ // Safe validate (returns result instead of throwing)
53
+ export function safeValidate<T>(schema: ZodType<T>, data: unknown): { success: true; data: T } | { success: false; error: ZodError } {
54
+ const result = schema.safeParse(data);
55
+ if (result.success) {
56
+ return { success: true, data: result.data };
57
+ }
58
+ return { success: false, error: result.error };
59
+ }
60
+
61
+ // Required fields check
62
+ export function requireFields(obj: Record<string, unknown>, fields: string[]): string[] {
63
+ return fields.filter(field => {
64
+ const value = obj[field];
65
+ return value === undefined || value === null;
66
+ });
67
+ }
68
+
69
+ // isValidUUID
70
+ export function isValidUUID(str: string): boolean {
71
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
72
+ return uuidRegex.test(str);
73
+ }
74
+
75
+ // isValidEmail
76
+ export function isValidEmail(email: string): boolean {
77
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
78
+ return emailRegex.test(email);
79
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src"
6
+ },
7
+ "include": ["src/**/*"],
8
+ "exclude": ["node_modules", "dist"]
9
+ }