@lytjs/middleware 6.7.0 → 6.8.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/index.cjs +7 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +132 -0
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var commonIs = require('@lytjs/common-is');
|
|
4
4
|
|
|
5
|
-
var __defProp = Object.defineProperty;
|
|
6
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
-
|
|
9
5
|
// src/middleware.ts
|
|
10
6
|
function createMiddleware(fn) {
|
|
11
7
|
return fn;
|
|
@@ -18,7 +14,11 @@ function combineMiddlewares(...middlewares) {
|
|
|
18
14
|
return next();
|
|
19
15
|
}
|
|
20
16
|
const middleware = middlewares[i];
|
|
21
|
-
|
|
17
|
+
if (middleware) {
|
|
18
|
+
await middleware(ctx, () => dispatch(i + 1));
|
|
19
|
+
} else {
|
|
20
|
+
await dispatch(i + 1);
|
|
21
|
+
}
|
|
22
22
|
};
|
|
23
23
|
await dispatch(index);
|
|
24
24
|
};
|
|
@@ -48,8 +48,7 @@ function mergeContext(ctx, data) {
|
|
|
48
48
|
// src/composer.ts
|
|
49
49
|
var MiddlewareComposer = class {
|
|
50
50
|
constructor(config) {
|
|
51
|
-
|
|
52
|
-
__publicField(this, "config");
|
|
51
|
+
this.middlewares = [];
|
|
53
52
|
this.config = {
|
|
54
53
|
errorHandler: (err) => new Response(`\u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF: ${err.message}`, {
|
|
55
54
|
status: 500
|
|
@@ -115,7 +114,7 @@ function createComposer(config) {
|
|
|
115
114
|
}
|
|
116
115
|
var MiddlewareChain = class {
|
|
117
116
|
constructor() {
|
|
118
|
-
|
|
117
|
+
this.middlewares = [];
|
|
119
118
|
}
|
|
120
119
|
use(middlewareOrMiddlewares) {
|
|
121
120
|
if (commonIs.isArray(middlewareOrMiddlewares)) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":["isArray"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":["isArray"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 中间件工具函数\n */\n\nimport type { MiddlewareFn, MiddlewareContext } from './types';\n\n/**\n * 创建中间件函数\n */\nexport function createMiddleware(fn: MiddlewareFn): MiddlewareFn {\n return fn;\n}\n\n/**\n * 将多个中间件合并为一个\n */\nexport function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n const index = 0;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i >= middlewares.length) {\n return next();\n }\n\n const middleware = middlewares[i];\n if (middleware) {\n await middleware(ctx, () => dispatch(i + 1));\n } else {\n await dispatch(i + 1);\n }\n };\n\n await dispatch(index);\n };\n}\n\n/**\n * 条件中间件执行\n */\nexport function conditionalMiddleware(\n condition: (ctx: MiddlewareContext) => boolean,\n middleware: MiddlewareFn,\n fallback?: MiddlewareFn,\n): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n if (condition(ctx)) {\n return middleware(ctx, next);\n } else if (fallback) {\n return fallback(ctx, next);\n }\n return next();\n };\n}\n","/**\n * 中间件上下文实现\n */\n\nimport type { MiddlewareContext } from './types';\n\n/**\n * 创建新的中间件上下文\n */\nexport function createContext(\n request: Request,\n extra?: Record<string, unknown>,\n): MiddlewareContext {\n return {\n request,\n ...extra,\n };\n}\n\n/**\n * 将额外数据合并到上下文中\n */\nexport function mergeContext(\n ctx: MiddlewareContext,\n data: Record<string, unknown>,\n): MiddlewareContext {\n return { ...ctx, ...data };\n}\n","/**\n * 中间件组合器 - 洋葱模型实现\n */\n\nimport type { MiddlewareFn, MiddlewareComposerConfig, HandlerFn } from './types';\nimport { createContext } from './context';\nimport { combineMiddlewares } from './middleware';\n\nexport class MiddlewareComposer {\n private middlewares: MiddlewareFn[] = [];\n private config: Required<MiddlewareComposerConfig>;\n\n constructor(config?: MiddlewareComposerConfig) {\n this.config = {\n errorHandler: (err: Error) =>\n new Response(`内部服务器错误: ${err.message}`, {\n status: 500,\n }),\n throwOnError: false,\n ...config,\n };\n }\n\n /**\n * 向链中添加中间件\n */\n use(middleware: MiddlewareFn): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /**\n * 添加多个中间件\n */\n useMany(...middlewares: MiddlewareFn[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n /**\n * 使用最终处理器组合中间件链\n */\n compose(\n handler: HandlerFn,\n ): (request: Request, extra?: Record<string, unknown>) => Promise<Response> {\n const combined = combineMiddlewares(...this.middlewares);\n\n return async (request: Request, extra?: Record<string, unknown>): Promise<Response> => {\n const ctx = createContext(request, extra);\n\n try {\n await combined(ctx, async () => {\n ctx.response = await handler(request, ctx);\n });\n\n return ctx.response || new Response('未找到', { status: 404 });\n } catch (error) {\n if (this.config.throwOnError) {\n throw error;\n }\n\n ctx.response = await this.config.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n\n return ctx.response;\n }\n };\n }\n\n /**\n * 清除所有中间件\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n\n /**\n * 获取中间件数量\n */\n get count(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 创建新的中间件组合器\n */\nexport function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer {\n return new MiddlewareComposer(config);\n}\n","/**\n * 中间件链实现 - 洋葱圈模型\n */\nimport { isArray } from '@lytjs/common-is';\nimport type { Middleware, MiddlewareContext, FinalHandler } from './types';\n\n/**\n * 中间件链类\n */\nexport class MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n /**\n * 添加中间件\n */\n use(middleware: Middleware): this;\n use(middlewares: Middleware[]): this;\n use(middlewareOrMiddlewares: Middleware | Middleware[]): this {\n if (isArray(middlewareOrMiddlewares)) {\n this.middlewares.push(...middlewareOrMiddlewares);\n } else {\n this.middlewares.push(middlewareOrMiddlewares);\n }\n return this;\n }\n\n /**\n * 执行中间件链\n */\n async execute(\n request: Request,\n context: MiddlewareContext,\n finalHandler: FinalHandler,\n ): Promise<Response> {\n const index = 0;\n const middlewares = this.middlewares;\n\n const dispatch = async (i: number): Promise<Response> => {\n if (i >= middlewares.length) {\n return finalHandler(request, context);\n }\n\n const middleware = middlewares[i];\n const result = await middleware(request, context, () => dispatch(i + 1));\n\n if (result instanceof Response) {\n return result;\n }\n\n return dispatch(i + 1);\n };\n\n return dispatch(index);\n }\n\n /**\n * 获取中间件数量\n */\n get size(): number {\n return this.middlewares.length;\n }\n\n /**\n * 清空中间件链\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n}\n\n/**\n * 创建中间件链\n */\nexport function createMiddlewareChain(): MiddlewareChain {\n return new MiddlewareChain();\n}\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @lytjs/middleware - 中间件系统类型声明
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { HttpRequest as Request, HttpResponse as Response } from '@lytjs/shared-types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 中间件链中传递的请求上下文
|
|
9
|
+
*/
|
|
10
|
+
export interface MiddlewareContext {
|
|
11
|
+
/** 请求对象 */
|
|
12
|
+
request: Request;
|
|
13
|
+
/** 响应对象(初始为 undefined,由处理器设置) */
|
|
14
|
+
response?: Response;
|
|
15
|
+
/** 额外的上下文属性 */
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 中间件函数类型 - 传统的 (request, context, next) 签名
|
|
21
|
+
*/
|
|
22
|
+
export type Middleware = (
|
|
23
|
+
request: Request,
|
|
24
|
+
context: MiddlewareContext,
|
|
25
|
+
next: () => Promise<void>,
|
|
26
|
+
) => Promise<Response | void | undefined>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 中间件函数类型 - 洋葱圈模型签名
|
|
30
|
+
*/
|
|
31
|
+
export type MiddlewareFn = (ctx: MiddlewareContext, next: () => Promise<void>) => Promise<void>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 最终处理器函数
|
|
35
|
+
*/
|
|
36
|
+
export type FinalHandler = (request: Request, context: MiddlewareContext) => Promise<Response>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 中间件处理器函数
|
|
40
|
+
*/
|
|
41
|
+
export type HandlerFn = (
|
|
42
|
+
request: Request,
|
|
43
|
+
ctx: Record<string, unknown>,
|
|
44
|
+
) => Promise<Response> | Response;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 错误处理函数
|
|
48
|
+
*/
|
|
49
|
+
export type ErrorHandlerFn = (error: Error, ctx: MiddlewareContext) => Promise<Response> | Response;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 中间件组合器配置
|
|
53
|
+
*/
|
|
54
|
+
export interface MiddlewareComposerConfig {
|
|
55
|
+
errorHandler?: ErrorHandlerFn;
|
|
56
|
+
throwOnError?: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 创建中间件函数
|
|
61
|
+
*/
|
|
62
|
+
export function createMiddleware(fn: MiddlewareFn): MiddlewareFn;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 将多个中间件合并为一个
|
|
66
|
+
*/
|
|
67
|
+
export function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 条件中间件执行
|
|
71
|
+
*/
|
|
72
|
+
export function conditionalMiddleware(
|
|
73
|
+
condition: (ctx: MiddlewareContext) => boolean,
|
|
74
|
+
middleware: MiddlewareFn,
|
|
75
|
+
fallback?: MiddlewareFn,
|
|
76
|
+
): MiddlewareFn;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 创建新的中间件上下文
|
|
80
|
+
*/
|
|
81
|
+
export function createContext(request: Request, extra?: Record<string, unknown>): MiddlewareContext;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 将额外数据合并到上下文中
|
|
85
|
+
*/
|
|
86
|
+
export function mergeContext(
|
|
87
|
+
ctx: MiddlewareContext,
|
|
88
|
+
data: Record<string, unknown>,
|
|
89
|
+
): MiddlewareContext;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 中间件组合器
|
|
93
|
+
*/
|
|
94
|
+
export class MiddlewareComposer {
|
|
95
|
+
constructor(config?: MiddlewareComposerConfig);
|
|
96
|
+
use(middleware: MiddlewareFn): this;
|
|
97
|
+
useMany(...middlewares: MiddlewareFn[]): this;
|
|
98
|
+
compose(handler: HandlerFn): (request: Request, extra?: Record<string, unknown>) => Promise<Response>;
|
|
99
|
+
clear(): this;
|
|
100
|
+
get count(): number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 创建中间件组合器
|
|
105
|
+
*/
|
|
106
|
+
export function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 中间件链类
|
|
110
|
+
*/
|
|
111
|
+
export class MiddlewareChain {
|
|
112
|
+
use(middleware: Middleware): this;
|
|
113
|
+
use(middlewares: Middleware[]): this;
|
|
114
|
+
async execute(request: Request, context: MiddlewareContext, finalHandler: FinalHandler): Promise<Response>;
|
|
115
|
+
get size(): number;
|
|
116
|
+
clear(): this;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 创建中间件链
|
|
121
|
+
*/
|
|
122
|
+
export function createMiddlewareChain(): MiddlewareChain;
|
|
123
|
+
|
|
124
|
+
export {
|
|
125
|
+
Middleware,
|
|
126
|
+
MiddlewareFn,
|
|
127
|
+
MiddlewareContext,
|
|
128
|
+
FinalHandler,
|
|
129
|
+
HandlerFn,
|
|
130
|
+
ErrorHandlerFn,
|
|
131
|
+
MiddlewareComposerConfig,
|
|
132
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { isArray } from '@lytjs/common-is';
|
|
2
2
|
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
-
|
|
7
3
|
// src/middleware.ts
|
|
8
4
|
function createMiddleware(fn) {
|
|
9
5
|
return fn;
|
|
@@ -16,7 +12,11 @@ function combineMiddlewares(...middlewares) {
|
|
|
16
12
|
return next();
|
|
17
13
|
}
|
|
18
14
|
const middleware = middlewares[i];
|
|
19
|
-
|
|
15
|
+
if (middleware) {
|
|
16
|
+
await middleware(ctx, () => dispatch(i + 1));
|
|
17
|
+
} else {
|
|
18
|
+
await dispatch(i + 1);
|
|
19
|
+
}
|
|
20
20
|
};
|
|
21
21
|
await dispatch(index);
|
|
22
22
|
};
|
|
@@ -46,8 +46,7 @@ function mergeContext(ctx, data) {
|
|
|
46
46
|
// src/composer.ts
|
|
47
47
|
var MiddlewareComposer = class {
|
|
48
48
|
constructor(config) {
|
|
49
|
-
|
|
50
|
-
__publicField(this, "config");
|
|
49
|
+
this.middlewares = [];
|
|
51
50
|
this.config = {
|
|
52
51
|
errorHandler: (err) => new Response(`\u5185\u90E8\u670D\u52A1\u5668\u9519\u8BEF: ${err.message}`, {
|
|
53
52
|
status: 500
|
|
@@ -113,7 +112,7 @@ function createComposer(config) {
|
|
|
113
112
|
}
|
|
114
113
|
var MiddlewareChain = class {
|
|
115
114
|
constructor() {
|
|
116
|
-
|
|
115
|
+
this.middlewares = [];
|
|
117
116
|
}
|
|
118
117
|
use(middlewareOrMiddlewares) {
|
|
119
118
|
if (isArray(middlewareOrMiddlewares)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts","../src/context.ts","../src/composer.ts","../src/chain.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 中间件工具函数\n */\n\nimport type { MiddlewareFn, MiddlewareContext } from './types';\n\n/**\n * 创建中间件函数\n */\nexport function createMiddleware(fn: MiddlewareFn): MiddlewareFn {\n return fn;\n}\n\n/**\n * 将多个中间件合并为一个\n */\nexport function combineMiddlewares(...middlewares: MiddlewareFn[]): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n const index = 0;\n\n const dispatch = async (i: number): Promise<void> => {\n if (i >= middlewares.length) {\n return next();\n }\n\n const middleware = middlewares[i];\n if (middleware) {\n await middleware(ctx, () => dispatch(i + 1));\n } else {\n await dispatch(i + 1);\n }\n };\n\n await dispatch(index);\n };\n}\n\n/**\n * 条件中间件执行\n */\nexport function conditionalMiddleware(\n condition: (ctx: MiddlewareContext) => boolean,\n middleware: MiddlewareFn,\n fallback?: MiddlewareFn,\n): MiddlewareFn {\n return async (ctx: MiddlewareContext, next: () => Promise<void>) => {\n if (condition(ctx)) {\n return middleware(ctx, next);\n } else if (fallback) {\n return fallback(ctx, next);\n }\n return next();\n };\n}\n","/**\n * 中间件上下文实现\n */\n\nimport type { MiddlewareContext } from './types';\n\n/**\n * 创建新的中间件上下文\n */\nexport function createContext(\n request: Request,\n extra?: Record<string, unknown>,\n): MiddlewareContext {\n return {\n request,\n ...extra,\n };\n}\n\n/**\n * 将额外数据合并到上下文中\n */\nexport function mergeContext(\n ctx: MiddlewareContext,\n data: Record<string, unknown>,\n): MiddlewareContext {\n return { ...ctx, ...data };\n}\n","/**\n * 中间件组合器 - 洋葱模型实现\n */\n\nimport type { MiddlewareFn, MiddlewareComposerConfig, HandlerFn } from './types';\nimport { createContext } from './context';\nimport { combineMiddlewares } from './middleware';\n\nexport class MiddlewareComposer {\n private middlewares: MiddlewareFn[] = [];\n private config: Required<MiddlewareComposerConfig>;\n\n constructor(config?: MiddlewareComposerConfig) {\n this.config = {\n errorHandler: (err: Error) =>\n new Response(`内部服务器错误: ${err.message}`, {\n status: 500,\n }),\n throwOnError: false,\n ...config,\n };\n }\n\n /**\n * 向链中添加中间件\n */\n use(middleware: MiddlewareFn): this {\n this.middlewares.push(middleware);\n return this;\n }\n\n /**\n * 添加多个中间件\n */\n useMany(...middlewares: MiddlewareFn[]): this {\n this.middlewares.push(...middlewares);\n return this;\n }\n\n /**\n * 使用最终处理器组合中间件链\n */\n compose(\n handler: HandlerFn,\n ): (request: Request, extra?: Record<string, unknown>) => Promise<Response> {\n const combined = combineMiddlewares(...this.middlewares);\n\n return async (request: Request, extra?: Record<string, unknown>): Promise<Response> => {\n const ctx = createContext(request, extra);\n\n try {\n await combined(ctx, async () => {\n ctx.response = await handler(request, ctx);\n });\n\n return ctx.response || new Response('未找到', { status: 404 });\n } catch (error) {\n if (this.config.throwOnError) {\n throw error;\n }\n\n ctx.response = await this.config.errorHandler(\n error instanceof Error ? error : new Error(String(error)),\n ctx,\n );\n\n return ctx.response;\n }\n };\n }\n\n /**\n * 清除所有中间件\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n\n /**\n * 获取中间件数量\n */\n get count(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 创建新的中间件组合器\n */\nexport function createComposer(config?: MiddlewareComposerConfig): MiddlewareComposer {\n return new MiddlewareComposer(config);\n}\n","/**\n * 中间件链实现 - 洋葱圈模型\n */\nimport { isArray } from '@lytjs/common-is';\nimport type { Middleware, MiddlewareContext, FinalHandler } from './types';\n\n/**\n * 中间件链类\n */\nexport class MiddlewareChain {\n private middlewares: Middleware[] = [];\n\n /**\n * 添加中间件\n */\n use(middleware: Middleware): this;\n use(middlewares: Middleware[]): this;\n use(middlewareOrMiddlewares: Middleware | Middleware[]): this {\n if (isArray(middlewareOrMiddlewares)) {\n this.middlewares.push(...middlewareOrMiddlewares);\n } else {\n this.middlewares.push(middlewareOrMiddlewares);\n }\n return this;\n }\n\n /**\n * 执行中间件链\n */\n async execute(\n request: Request,\n context: MiddlewareContext,\n finalHandler: FinalHandler,\n ): Promise<Response> {\n const index = 0;\n const middlewares = this.middlewares;\n\n const dispatch = async (i: number): Promise<Response> => {\n if (i >= middlewares.length) {\n return finalHandler(request, context);\n }\n\n const middleware = middlewares[i];\n const result = await middleware(request, context, () => dispatch(i + 1));\n\n if (result instanceof Response) {\n return result;\n }\n\n return dispatch(i + 1);\n };\n\n return dispatch(index);\n }\n\n /**\n * 获取中间件数量\n */\n get size(): number {\n return this.middlewares.length;\n }\n\n /**\n * 清空中间件链\n */\n clear(): this {\n this.middlewares = [];\n return this;\n }\n}\n\n/**\n * 创建中间件链\n */\nexport function createMiddlewareChain(): MiddlewareChain {\n return new MiddlewareChain();\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lytjs/middleware",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.8.0",
|
|
4
4
|
"description": "LytJS Middleware Core System - Onion model middleware architecture",
|
|
5
5
|
"author": "lytjs",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
"clean": "rm -rf dist node_modules .turbo"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@lytjs/common-error": "^6.
|
|
36
|
-
"@lytjs/common-events": "^6.
|
|
37
|
-
"@lytjs/shared-types": "^6.
|
|
35
|
+
"@lytjs/common-error": "^6.8.0",
|
|
36
|
+
"@lytjs/common-events": "^6.8.0",
|
|
37
|
+
"@lytjs/shared-types": "^6.8.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^22.13.10",
|