@variojs/core 0.1.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/__tests__/README.md +101 -0
- package/__tests__/errors.test.ts +139 -0
- package/__tests__/expression/cache.test.ts +118 -0
- package/__tests__/expression/compiler.test.ts +111 -0
- package/__tests__/expression/evaluate.test.ts +95 -0
- package/__tests__/expression/parser.test.ts +57 -0
- package/__tests__/expression/whitelist.test.ts +59 -0
- package/__tests__/performance.test.ts +379 -0
- package/__tests__/runtime/create-context.test.ts +78 -0
- package/__tests__/runtime/loop-context-pool.test.ts +74 -0
- package/__tests__/runtime/path.test.ts +128 -0
- package/__tests__/vm/executor-timeout.test.ts +117 -0
- package/__tests__/vm/executor.test.ts +173 -0
- package/__tests__/vm/handlers/array.test.ts +113 -0
- package/__tests__/vm/handlers/call.test.ts +93 -0
- package/dist/errors.d.ts +100 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +132 -0
- package/dist/errors.js.map +1 -0
- package/dist/expression/cache.d.ts +53 -0
- package/dist/expression/cache.d.ts.map +1 -0
- package/dist/expression/cache.js +158 -0
- package/dist/expression/cache.js.map +1 -0
- package/dist/expression/compiler.d.ts +34 -0
- package/dist/expression/compiler.d.ts.map +1 -0
- package/dist/expression/compiler.js +123 -0
- package/dist/expression/compiler.js.map +1 -0
- package/dist/expression/dependencies.d.ts +17 -0
- package/dist/expression/dependencies.d.ts.map +1 -0
- package/dist/expression/dependencies.js +106 -0
- package/dist/expression/dependencies.js.map +1 -0
- package/dist/expression/evaluate.d.ts +22 -0
- package/dist/expression/evaluate.d.ts.map +1 -0
- package/dist/expression/evaluate.js +75 -0
- package/dist/expression/evaluate.js.map +1 -0
- package/dist/expression/evaluator.d.ts +22 -0
- package/dist/expression/evaluator.d.ts.map +1 -0
- package/dist/expression/evaluator.js +506 -0
- package/dist/expression/evaluator.js.map +1 -0
- package/dist/expression/index.d.ts +12 -0
- package/dist/expression/index.d.ts.map +1 -0
- package/dist/expression/index.js +12 -0
- package/dist/expression/index.js.map +1 -0
- package/dist/expression/parser.d.ts +15 -0
- package/dist/expression/parser.d.ts.map +1 -0
- package/dist/expression/parser.js +42 -0
- package/dist/expression/parser.js.map +1 -0
- package/dist/expression/utils.d.ts +46 -0
- package/dist/expression/utils.d.ts.map +1 -0
- package/dist/expression/utils.js +78 -0
- package/dist/expression/utils.js.map +1 -0
- package/dist/expression/whitelist.d.ts +24 -0
- package/dist/expression/whitelist.d.ts.map +1 -0
- package/dist/expression/whitelist.js +198 -0
- package/dist/expression/whitelist.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/context.d.ts +8 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +7 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/create-context.d.ts +50 -0
- package/dist/runtime/create-context.d.ts.map +1 -0
- package/dist/runtime/create-context.js +73 -0
- package/dist/runtime/create-context.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/loop-context-pool.d.ts +58 -0
- package/dist/runtime/loop-context-pool.d.ts.map +1 -0
- package/dist/runtime/loop-context-pool.js +114 -0
- package/dist/runtime/loop-context-pool.js.map +1 -0
- package/dist/runtime/path.d.ts +114 -0
- package/dist/runtime/path.d.ts.map +1 -0
- package/dist/runtime/path.js +302 -0
- package/dist/runtime/path.js.map +1 -0
- package/dist/runtime/proxy.d.ts +18 -0
- package/dist/runtime/proxy.d.ts.map +1 -0
- package/dist/runtime/proxy.js +53 -0
- package/dist/runtime/proxy.js.map +1 -0
- package/dist/runtime/sandbox.d.ts +20 -0
- package/dist/runtime/sandbox.d.ts.map +1 -0
- package/dist/runtime/sandbox.js +32 -0
- package/dist/runtime/sandbox.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/vm/action.d.ts +11 -0
- package/dist/vm/action.d.ts.map +1 -0
- package/dist/vm/action.js +10 -0
- package/dist/vm/action.js.map +1 -0
- package/dist/vm/errors.d.ts +5 -0
- package/dist/vm/errors.d.ts.map +1 -0
- package/dist/vm/errors.js +5 -0
- package/dist/vm/errors.js.map +1 -0
- package/dist/vm/executor.d.ts +35 -0
- package/dist/vm/executor.d.ts.map +1 -0
- package/dist/vm/executor.js +137 -0
- package/dist/vm/executor.js.map +1 -0
- package/dist/vm/handlers/array/pop.d.ts +12 -0
- package/dist/vm/handlers/array/pop.d.ts.map +1 -0
- package/dist/vm/handlers/array/pop.js +28 -0
- package/dist/vm/handlers/array/pop.js.map +1 -0
- package/dist/vm/handlers/array/push.d.ts +13 -0
- package/dist/vm/handlers/array/push.d.ts.map +1 -0
- package/dist/vm/handlers/array/push.js +42 -0
- package/dist/vm/handlers/array/push.js.map +1 -0
- package/dist/vm/handlers/array/shift.d.ts +12 -0
- package/dist/vm/handlers/array/shift.d.ts.map +1 -0
- package/dist/vm/handlers/array/shift.js +28 -0
- package/dist/vm/handlers/array/shift.js.map +1 -0
- package/dist/vm/handlers/array/splice.d.ts +12 -0
- package/dist/vm/handlers/array/splice.d.ts.map +1 -0
- package/dist/vm/handlers/array/splice.js +59 -0
- package/dist/vm/handlers/array/splice.js.map +1 -0
- package/dist/vm/handlers/array/unshift.d.ts +13 -0
- package/dist/vm/handlers/array/unshift.d.ts.map +1 -0
- package/dist/vm/handlers/array/unshift.js +42 -0
- package/dist/vm/handlers/array/unshift.js.map +1 -0
- package/dist/vm/handlers/array/utils.d.ts +10 -0
- package/dist/vm/handlers/array/utils.d.ts.map +1 -0
- package/dist/vm/handlers/array/utils.js +33 -0
- package/dist/vm/handlers/array/utils.js.map +1 -0
- package/dist/vm/handlers/batch.d.ts +12 -0
- package/dist/vm/handlers/batch.d.ts.map +1 -0
- package/dist/vm/handlers/batch.js +40 -0
- package/dist/vm/handlers/batch.js.map +1 -0
- package/dist/vm/handlers/call.d.ts +14 -0
- package/dist/vm/handlers/call.d.ts.map +1 -0
- package/dist/vm/handlers/call.js +65 -0
- package/dist/vm/handlers/call.js.map +1 -0
- package/dist/vm/handlers/emit.d.ts +12 -0
- package/dist/vm/handlers/emit.d.ts.map +1 -0
- package/dist/vm/handlers/emit.js +26 -0
- package/dist/vm/handlers/emit.js.map +1 -0
- package/dist/vm/handlers/if.d.ts +13 -0
- package/dist/vm/handlers/if.d.ts.map +1 -0
- package/dist/vm/handlers/if.js +35 -0
- package/dist/vm/handlers/if.js.map +1 -0
- package/dist/vm/handlers/index.d.ts +11 -0
- package/dist/vm/handlers/index.d.ts.map +1 -0
- package/dist/vm/handlers/index.js +46 -0
- package/dist/vm/handlers/index.js.map +1 -0
- package/dist/vm/handlers/log.d.ts +12 -0
- package/dist/vm/handlers/log.d.ts.map +1 -0
- package/dist/vm/handlers/log.js +41 -0
- package/dist/vm/handlers/log.js.map +1 -0
- package/dist/vm/handlers/loop.d.ts +12 -0
- package/dist/vm/handlers/loop.d.ts.map +1 -0
- package/dist/vm/handlers/loop.js +71 -0
- package/dist/vm/handlers/loop.js.map +1 -0
- package/dist/vm/handlers/navigate.d.ts +12 -0
- package/dist/vm/handlers/navigate.d.ts.map +1 -0
- package/dist/vm/handlers/navigate.js +43 -0
- package/dist/vm/handlers/navigate.js.map +1 -0
- package/dist/vm/handlers/set.d.ts +15 -0
- package/dist/vm/handlers/set.d.ts.map +1 -0
- package/dist/vm/handlers/set.js +30 -0
- package/dist/vm/handlers/set.js.map +1 -0
- package/dist/vm/index.d.ts +8 -0
- package/dist/vm/index.d.ts.map +1 -0
- package/dist/vm/index.js +7 -0
- package/dist/vm/index.js.map +1 -0
- package/package.json +34 -0
- package/src/errors.ts +194 -0
- package/src/expression/README.md +192 -0
- package/src/expression/cache.ts +199 -0
- package/src/expression/compiler.ts +144 -0
- package/src/expression/dependencies.ts +116 -0
- package/src/expression/evaluate.ts +95 -0
- package/src/expression/evaluator.ts +640 -0
- package/src/expression/index.ts +27 -0
- package/src/expression/parser.ts +54 -0
- package/src/expression/utils.ts +89 -0
- package/src/expression/whitelist.ts +224 -0
- package/src/globals.d.ts +10 -0
- package/src/index.ts +72 -0
- package/src/runtime/context.ts +8 -0
- package/src/runtime/create-context.ts +133 -0
- package/src/runtime/index.ts +28 -0
- package/src/runtime/loop-context-pool.ts +134 -0
- package/src/runtime/path.ts +372 -0
- package/src/runtime/proxy.ts +66 -0
- package/src/runtime/sandbox.ts +43 -0
- package/src/types.ts +177 -0
- package/src/vm/errors.ts +10 -0
- package/src/vm/executor.ts +210 -0
- package/src/vm/handlers/array/pop.ts +47 -0
- package/src/vm/handlers/array/push.ts +68 -0
- package/src/vm/handlers/array/shift.ts +47 -0
- package/src/vm/handlers/array/splice.ts +78 -0
- package/src/vm/handlers/array/unshift.ts +68 -0
- package/src/vm/handlers/array/utils.ts +41 -0
- package/src/vm/handlers/batch.ts +57 -0
- package/src/vm/handlers/call.ts +92 -0
- package/src/vm/handlers/emit.ts +39 -0
- package/src/vm/handlers/if.ts +48 -0
- package/src/vm/handlers/index.ts +52 -0
- package/src/vm/handlers/log.ts +54 -0
- package/src/vm/handlers/loop.ts +102 -0
- package/src/vm/handlers/navigate.ts +64 -0
- package/src/vm/handlers/set.ts +43 -0
- package/src/vm/index.ts +8 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +30 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路径解析工具模块
|
|
3
|
+
*
|
|
4
|
+
* 统一的路径解析逻辑,供 vario-core 和框架集成层使用
|
|
5
|
+
*
|
|
6
|
+
* 设计原则:
|
|
7
|
+
* - 单一职责:只处理路径解析,不涉及响应式
|
|
8
|
+
* - 可组合:提供原子操作,框架集成层可自由组合
|
|
9
|
+
* - 类型安全:尽可能提供类型推导
|
|
10
|
+
*/
|
|
11
|
+
const pathCache = {
|
|
12
|
+
parsed: new Map()
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* 解析路径字符串为段数组
|
|
16
|
+
*
|
|
17
|
+
* 支持两种语法:
|
|
18
|
+
* - 点语法:`user.name` → ['user', 'name']
|
|
19
|
+
* - 括号语法:`users[0].name` → ['users', 0, 'name']
|
|
20
|
+
* - 混合语法:`data.users[0].profile.tags[1]` → ['data', 'users', 0, 'profile', 'tags', 1]
|
|
21
|
+
* - 空括号:`users[].name` → ['users', -1, 'name'](-1 表示动态索引,由循环上下文填充)
|
|
22
|
+
*
|
|
23
|
+
* @param path 路径字符串
|
|
24
|
+
* @returns 路径段数组
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* parsePath('user.name') // ['user', 'name']
|
|
28
|
+
* parsePath('items.0.text') // ['items', 0, 'text']
|
|
29
|
+
* parsePath('users[0].name') // ['users', 0, 'name']
|
|
30
|
+
* parsePath('users[].name') // ['users', -1, 'name']
|
|
31
|
+
*/
|
|
32
|
+
export function parsePath(path) {
|
|
33
|
+
if (!path || path.length === 0) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const segments = [];
|
|
37
|
+
let current = '';
|
|
38
|
+
let i = 0;
|
|
39
|
+
while (i < path.length) {
|
|
40
|
+
const char = path[i];
|
|
41
|
+
if (char === '.') {
|
|
42
|
+
// 点分隔符:保存当前段
|
|
43
|
+
if (current) {
|
|
44
|
+
segments.push(parseSegment(current));
|
|
45
|
+
current = '';
|
|
46
|
+
}
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
else if (char === '[') {
|
|
50
|
+
// 括号开始:保存当前段(如果有),然后解析括号内容
|
|
51
|
+
if (current) {
|
|
52
|
+
segments.push(parseSegment(current));
|
|
53
|
+
current = '';
|
|
54
|
+
}
|
|
55
|
+
// 找到匹配的 ]
|
|
56
|
+
const closeIndex = path.indexOf(']', i);
|
|
57
|
+
if (closeIndex === -1) {
|
|
58
|
+
// 没有匹配的 ],当作普通字符处理
|
|
59
|
+
current += char;
|
|
60
|
+
i++;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const indexStr = path.slice(i + 1, closeIndex);
|
|
64
|
+
if (indexStr === '') {
|
|
65
|
+
// 空括号 [] 表示动态索引
|
|
66
|
+
segments.push(-1);
|
|
67
|
+
}
|
|
68
|
+
else if (/^\d+$/.test(indexStr)) {
|
|
69
|
+
// 数字索引
|
|
70
|
+
segments.push(parseInt(indexStr, 10));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// 非数字,当作字符串键
|
|
74
|
+
segments.push(indexStr);
|
|
75
|
+
}
|
|
76
|
+
i = closeIndex + 1;
|
|
77
|
+
// 跳过紧跟的点
|
|
78
|
+
if (path[i] === '.') {
|
|
79
|
+
i++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
current += char;
|
|
85
|
+
i++;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 处理最后一段
|
|
89
|
+
if (current) {
|
|
90
|
+
segments.push(parseSegment(current));
|
|
91
|
+
}
|
|
92
|
+
return segments;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 解析单个路径段
|
|
96
|
+
*/
|
|
97
|
+
function parseSegment(segment) {
|
|
98
|
+
// 纯数字视为数组索引(保持向后兼容 items.0.text 语法)
|
|
99
|
+
if (/^\d+$/.test(segment)) {
|
|
100
|
+
return parseInt(segment, 10);
|
|
101
|
+
}
|
|
102
|
+
return segment;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 解析路径(带缓存)
|
|
106
|
+
*
|
|
107
|
+
* @param path 点分隔的路径字符串
|
|
108
|
+
* @returns 路径段数组
|
|
109
|
+
*/
|
|
110
|
+
export function parsePathCached(path) {
|
|
111
|
+
if (!path || path.length === 0) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const cached = pathCache.parsed.get(path);
|
|
115
|
+
if (cached) {
|
|
116
|
+
return cached;
|
|
117
|
+
}
|
|
118
|
+
const segments = parsePath(path);
|
|
119
|
+
pathCache.parsed.set(path, segments);
|
|
120
|
+
return segments;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 清理路径缓存
|
|
124
|
+
*/
|
|
125
|
+
export function clearPathCache() {
|
|
126
|
+
pathCache.parsed.clear();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 将路径段数组转换为路径字符串
|
|
130
|
+
*
|
|
131
|
+
* @param segments 路径段数组
|
|
132
|
+
* @returns 点分隔的路径字符串
|
|
133
|
+
*/
|
|
134
|
+
export function stringifyPath(segments) {
|
|
135
|
+
return segments.map(String).join('.');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 获取嵌套路径的值
|
|
139
|
+
*
|
|
140
|
+
* @param obj 目标对象
|
|
141
|
+
* @param path 路径字符串或路径段数组
|
|
142
|
+
* @returns 路径对应的值,不存在返回 undefined
|
|
143
|
+
*/
|
|
144
|
+
export function getPathValue(obj, path) {
|
|
145
|
+
const segments = typeof path === 'string' ? parsePathCached(path) : path;
|
|
146
|
+
if (segments.length === 0) {
|
|
147
|
+
return obj;
|
|
148
|
+
}
|
|
149
|
+
let value = obj;
|
|
150
|
+
for (const segment of segments) {
|
|
151
|
+
if (value == null) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
if (typeof segment === 'number') {
|
|
155
|
+
// 数组索引
|
|
156
|
+
if (!Array.isArray(value)) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
value = value[segment];
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// 对象属性
|
|
163
|
+
if (typeof value !== 'object') {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
value = value[segment];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 设置嵌套路径的值
|
|
173
|
+
*
|
|
174
|
+
* @param obj 目标对象
|
|
175
|
+
* @param path 路径字符串或路径段数组
|
|
176
|
+
* @param value 要设置的值
|
|
177
|
+
* @param options 配置选项
|
|
178
|
+
* @returns 是否设置成功
|
|
179
|
+
*/
|
|
180
|
+
export function setPathValue(obj, path, value, options = {}) {
|
|
181
|
+
const { createIntermediate = true, createObject = () => ({}), createArray = () => [] } = options;
|
|
182
|
+
const segments = typeof path === 'string' ? parsePathCached(path) : path;
|
|
183
|
+
if (segments.length === 0) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
const lastSegment = segments[segments.length - 1];
|
|
187
|
+
const parentSegments = segments.slice(0, -1);
|
|
188
|
+
// 找到或创建父对象
|
|
189
|
+
let target = obj;
|
|
190
|
+
for (let i = 0; i < parentSegments.length; i++) {
|
|
191
|
+
const segment = parentSegments[i];
|
|
192
|
+
const nextSegment = parentSegments[i + 1] ?? lastSegment;
|
|
193
|
+
const nextIsArrayIndex = typeof nextSegment === 'number';
|
|
194
|
+
if (typeof segment === 'number') {
|
|
195
|
+
// 当前段是数组索引
|
|
196
|
+
if (!Array.isArray(target)) {
|
|
197
|
+
if (!createIntermediate)
|
|
198
|
+
return false;
|
|
199
|
+
// 无法将非数组转换为数组
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
// 确保数组足够长
|
|
203
|
+
while (target.length <= segment) {
|
|
204
|
+
target.push(undefined);
|
|
205
|
+
}
|
|
206
|
+
// 确保目标位置是对象或数组
|
|
207
|
+
if (target[segment] == null || typeof target[segment] !== 'object') {
|
|
208
|
+
if (!createIntermediate)
|
|
209
|
+
return false;
|
|
210
|
+
target[segment] = nextIsArrayIndex ? createArray() : createObject();
|
|
211
|
+
}
|
|
212
|
+
target = target[segment];
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// 当前段是对象属性
|
|
216
|
+
if (typeof target !== 'object' || target === null) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
const targetObj = target;
|
|
220
|
+
if (targetObj[segment] == null || typeof targetObj[segment] !== 'object') {
|
|
221
|
+
if (!createIntermediate)
|
|
222
|
+
return false;
|
|
223
|
+
targetObj[segment] = nextIsArrayIndex ? createArray() : createObject();
|
|
224
|
+
}
|
|
225
|
+
target = targetObj[segment];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// 设置最终值
|
|
229
|
+
if (typeof lastSegment === 'number') {
|
|
230
|
+
if (!Array.isArray(target)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
while (target.length <= lastSegment) {
|
|
234
|
+
target.push(undefined);
|
|
235
|
+
}
|
|
236
|
+
target[lastSegment] = value;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
if (typeof target !== 'object' || target === null) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
target[lastSegment] = value;
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 检查路径是否匹配(支持通配符)
|
|
248
|
+
*
|
|
249
|
+
* @param pattern 模式路径(支持 * 通配符)
|
|
250
|
+
* @param path 目标路径
|
|
251
|
+
* @returns 是否匹配
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* matchPath('items.*', 'items.0') // true
|
|
255
|
+
* matchPath('items.*.name', 'items.0.name') // true
|
|
256
|
+
* matchPath('user.name', 'user.name') // true
|
|
257
|
+
* matchPath('user.name', 'user.age') // false
|
|
258
|
+
*/
|
|
259
|
+
export function matchPath(pattern, path) {
|
|
260
|
+
// 精确匹配
|
|
261
|
+
if (pattern === path) {
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
// 检查是否为父路径
|
|
265
|
+
if (path.startsWith(pattern + '.')) {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
// 通配符匹配
|
|
269
|
+
if (pattern.includes('*')) {
|
|
270
|
+
const parentPath = pattern.split('.*')[0];
|
|
271
|
+
return path.startsWith(parentPath + '.') || path === parentPath;
|
|
272
|
+
}
|
|
273
|
+
// 检查是否路径影响模式
|
|
274
|
+
if (pattern.startsWith(path + '.')) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* 提取路径的父路径
|
|
281
|
+
*
|
|
282
|
+
* @param path 路径字符串
|
|
283
|
+
* @returns 父路径,顶层路径返回空字符串
|
|
284
|
+
*/
|
|
285
|
+
export function getParentPath(path) {
|
|
286
|
+
const segments = parsePathCached(path);
|
|
287
|
+
if (segments.length <= 1) {
|
|
288
|
+
return '';
|
|
289
|
+
}
|
|
290
|
+
return stringifyPath(segments.slice(0, -1));
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 获取路径的最后一段
|
|
294
|
+
*
|
|
295
|
+
* @param path 路径字符串
|
|
296
|
+
* @returns 最后一段
|
|
297
|
+
*/
|
|
298
|
+
export function getLastSegment(path) {
|
|
299
|
+
const segments = parsePathCached(path);
|
|
300
|
+
return segments[segments.length - 1];
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/runtime/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy 沙箱实现
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 防止覆盖系统 API($ 和 _ 前缀保护)
|
|
6
|
+
* - 拦截属性设置操作
|
|
7
|
+
*/
|
|
8
|
+
import type { RuntimeContext } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* 创建受保护的 Proxy 上下文
|
|
11
|
+
* 禁止设置以 $ 或 _ 开头的属性
|
|
12
|
+
*
|
|
13
|
+
* @template T 上下文类型,必须是 RuntimeContext 的子类型
|
|
14
|
+
* @param ctx 运行时上下文对象
|
|
15
|
+
* @returns 受保护的 Proxy 包装的上下文
|
|
16
|
+
*/
|
|
17
|
+
export declare function createProxy<T extends RuntimeContext>(ctx: T): T;
|
|
18
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/runtime/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,cAAc,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CA+C/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy 沙箱实现
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 防止覆盖系统 API($ 和 _ 前缀保护)
|
|
6
|
+
* - 拦截属性设置操作
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 创建受保护的 Proxy 上下文
|
|
10
|
+
* 禁止设置以 $ 或 _ 开头的属性
|
|
11
|
+
*
|
|
12
|
+
* @template T 上下文类型,必须是 RuntimeContext 的子类型
|
|
13
|
+
* @param ctx 运行时上下文对象
|
|
14
|
+
* @returns 受保护的 Proxy 包装的上下文
|
|
15
|
+
*/
|
|
16
|
+
export function createProxy(ctx) {
|
|
17
|
+
// 允许设置和删除的特殊变量
|
|
18
|
+
const allowedSpecialVars = ['$event', '$item', '$index', '$methods'];
|
|
19
|
+
return new Proxy(ctx, {
|
|
20
|
+
set(target, prop, value) {
|
|
21
|
+
const propName = String(prop);
|
|
22
|
+
// 禁止覆盖系统 API
|
|
23
|
+
if (propName.startsWith('$') || propName.startsWith('_')) {
|
|
24
|
+
// 允许设置特殊变量
|
|
25
|
+
if (allowedSpecialVars.includes(propName)) {
|
|
26
|
+
return Reflect.set(target, prop, value);
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`Cannot override system API: ${propName}. ` +
|
|
29
|
+
`Properties starting with "$" or "_" are protected.`);
|
|
30
|
+
}
|
|
31
|
+
return Reflect.set(target, prop, value);
|
|
32
|
+
},
|
|
33
|
+
get(target, prop) {
|
|
34
|
+
return Reflect.get(target, prop);
|
|
35
|
+
},
|
|
36
|
+
has(target, prop) {
|
|
37
|
+
return Reflect.has(target, prop);
|
|
38
|
+
},
|
|
39
|
+
deleteProperty(target, prop) {
|
|
40
|
+
const propName = String(prop);
|
|
41
|
+
// 禁止删除系统 API
|
|
42
|
+
if (propName.startsWith('$') || propName.startsWith('_')) {
|
|
43
|
+
// 允许删除特殊变量
|
|
44
|
+
if (allowedSpecialVars.includes(propName)) {
|
|
45
|
+
return Reflect.deleteProperty(target, prop);
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Cannot delete system API: ${propName}`);
|
|
48
|
+
}
|
|
49
|
+
return Reflect.deleteProperty(target, prop);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/runtime/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAA2B,GAAM;IAC1D,eAAe;IACf,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IAEpE,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE;QACpB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;YACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAE7B,aAAa;YACb,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,WAAW;gBACX,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;gBACzC,CAAC;gBAED,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,IAAI;oBAC3C,oDAAoD,CACrD,CAAA;YACH,CAAC;YAED,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;QAED,cAAc,CAAC,MAAM,EAAE,IAAI;YACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YAE7B,aAAa;YACb,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,WAAW;gBACX,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC7C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAA;YAC1D,CAAC;YAED,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 沙箱边界控制
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 表达式层:严格沙箱,无法访问全局对象
|
|
6
|
+
* - 方法层:白名单控制,可访问全局对象
|
|
7
|
+
*/
|
|
8
|
+
import type { RuntimeContext } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* 创建表达式沙箱上下文
|
|
11
|
+
* 移除全局对象访问能力
|
|
12
|
+
*/
|
|
13
|
+
export declare function createExpressionSandbox(ctx: RuntimeContext): RuntimeContext;
|
|
14
|
+
/**
|
|
15
|
+
* 检查属性访问是否安全(用于表达式求值)
|
|
16
|
+
*/
|
|
17
|
+
export declare function isSafePropertyAccess(prop: string, ctx: RuntimeContext, options?: {
|
|
18
|
+
allowGlobals?: boolean;
|
|
19
|
+
}): boolean;
|
|
20
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAQ3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAWT"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 沙箱边界控制
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 表达式层:严格沙箱,无法访问全局对象
|
|
6
|
+
* - 方法层:白名单控制,可访问全局对象
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 创建表达式沙箱上下文
|
|
10
|
+
* 移除全局对象访问能力
|
|
11
|
+
*/
|
|
12
|
+
export function createExpressionSandbox(ctx) {
|
|
13
|
+
// 创建受限的上下文副本,移除全局对象
|
|
14
|
+
const sandbox = { ...ctx };
|
|
15
|
+
// 移除可能的全局对象引用
|
|
16
|
+
// 表达式求值时,只能访问状态属性和白名单函数
|
|
17
|
+
return sandbox;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 检查属性访问是否安全(用于表达式求值)
|
|
21
|
+
*/
|
|
22
|
+
export function isSafePropertyAccess(prop, ctx, options = {}) {
|
|
23
|
+
const allowGlobals = options.allowGlobals ?? ctx.$exprOptions?.allowGlobals ?? false;
|
|
24
|
+
// 禁止访问全局对象(可通过 allowGlobals 开关控制)
|
|
25
|
+
const globalProps = ['window', 'document', 'global', 'globalThis', 'self'];
|
|
26
|
+
if (!allowGlobals && globalProps.includes(prop)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
// 允许访问状态属性和系统 API
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/runtime/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAmB;IACzD,oBAAoB;IACpB,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;IAE1B,cAAc;IACd,wBAAwB;IAExB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,GAAmB,EACnB,UAAsC,EAAE;IAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,EAAE,YAAY,IAAI,KAAK,CAAA;IAEpF,kCAAkC;IAClC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;IAC1E,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,kBAAkB;IAClB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vario Core Types
|
|
3
|
+
*
|
|
4
|
+
* 核心类型定义,遵循架构图设计:
|
|
5
|
+
* - RuntimeContext: 扁平化状态 + $ 前缀系统 API
|
|
6
|
+
* - Action: 动作接口
|
|
7
|
+
* - ExpressionCache: 表达式缓存
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 方法处理器类型
|
|
11
|
+
* 所有注册到 $methods 的方法必须符合此签名
|
|
12
|
+
*
|
|
13
|
+
* 注意:动作处理器也通过 $methods 注册,但它们的参数是 Action
|
|
14
|
+
*/
|
|
15
|
+
export type MethodHandler<TParams = unknown, TResult = unknown> = (ctx: RuntimeContext, params: TParams) => Promise<TResult> | TResult;
|
|
16
|
+
/**
|
|
17
|
+
* 动作处理器类型(特殊的方法处理器)
|
|
18
|
+
*/
|
|
19
|
+
export type ActionHandler = MethodHandler<Action, void>;
|
|
20
|
+
/**
|
|
21
|
+
* 方法注册表类型
|
|
22
|
+
* 支持普通方法和指令处理器
|
|
23
|
+
*/
|
|
24
|
+
export type MethodsRegistry = Record<string, MethodHandler>;
|
|
25
|
+
/**
|
|
26
|
+
* 表达式求值选项
|
|
27
|
+
*/
|
|
28
|
+
export interface ExpressionOptions {
|
|
29
|
+
/**
|
|
30
|
+
* 是否允许访问全局对象(默认 false)
|
|
31
|
+
*/
|
|
32
|
+
allowGlobals?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 最大求值步数
|
|
35
|
+
*/
|
|
36
|
+
maxSteps?: number;
|
|
37
|
+
/**
|
|
38
|
+
* 求值超时(毫秒)
|
|
39
|
+
*/
|
|
40
|
+
timeout?: number;
|
|
41
|
+
/**
|
|
42
|
+
* 最大嵌套深度(防止 DoS 攻击,默认 50)
|
|
43
|
+
*/
|
|
44
|
+
maxNestingDepth?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 运行时上下文接口
|
|
48
|
+
* 扁平化状态设计:直接属性访问,无 models. 前缀
|
|
49
|
+
*
|
|
50
|
+
* @template TState 状态类型,用于类型推导和约束
|
|
51
|
+
*
|
|
52
|
+
* 设计说明:
|
|
53
|
+
* - 使用接口 + 索引签名,既支持类型推导又支持动态属性
|
|
54
|
+
* - 状态属性通过 TState 泛型约束
|
|
55
|
+
* - 系统 API 使用具体类型定义,确保类型安全
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* 运行时上下文类型
|
|
59
|
+
* 使用交叉类型结合接口,既支持状态类型推导又支持动态属性
|
|
60
|
+
*/
|
|
61
|
+
export type RuntimeContext<TState extends Record<string, unknown> = Record<string, unknown>> = TState & {
|
|
62
|
+
$emit: (event: string, data?: unknown) => void;
|
|
63
|
+
$methods: MethodsRegistry;
|
|
64
|
+
$exprOptions?: ExpressionOptions;
|
|
65
|
+
$event?: Event;
|
|
66
|
+
$item?: TState[keyof TState];
|
|
67
|
+
$index?: number;
|
|
68
|
+
_get: <TPath extends string>(path: TPath) => GetPathValue<TState, TPath>;
|
|
69
|
+
_set: <TPath extends string>(path: TPath, value: SetPathValue<TState, TPath>, options?: {
|
|
70
|
+
skipCallback?: boolean;
|
|
71
|
+
}) => void;
|
|
72
|
+
} & Record<string, unknown>;
|
|
73
|
+
/**
|
|
74
|
+
* 路径值类型推导工具
|
|
75
|
+
* 根据路径字符串推导对应的值类型
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* GetPathValue<{ user: { name: string } }, 'user.name'> // string
|
|
79
|
+
* GetPathValue<{ items: number[] }, 'items.0'> // number
|
|
80
|
+
*/
|
|
81
|
+
export type GetPathValue<T, TPath extends string> = TPath extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? T[Key] extends Record<string, unknown> ? GetPathValue<T[Key], Rest> : unknown : unknown : TPath extends keyof T ? T[TPath] : unknown;
|
|
82
|
+
/**
|
|
83
|
+
* 路径设置值类型推导工具
|
|
84
|
+
* 根据路径字符串推导可以设置的值类型
|
|
85
|
+
*/
|
|
86
|
+
export type SetPathValue<T, TPath extends string> = GetPathValue<T, TPath>;
|
|
87
|
+
/**
|
|
88
|
+
* 动作接口
|
|
89
|
+
* 使用泛型约束,根据 type 类型推导参数结构
|
|
90
|
+
*/
|
|
91
|
+
export interface Action {
|
|
92
|
+
type: string;
|
|
93
|
+
[key: string]: unknown;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 动作类型映射
|
|
97
|
+
* 根据 type 值推导对应的动作参数类型
|
|
98
|
+
*/
|
|
99
|
+
export type ActionMap = {
|
|
100
|
+
set: {
|
|
101
|
+
path: string;
|
|
102
|
+
value: string | unknown;
|
|
103
|
+
};
|
|
104
|
+
emit: {
|
|
105
|
+
event: string;
|
|
106
|
+
data?: string | unknown;
|
|
107
|
+
};
|
|
108
|
+
navigate: {
|
|
109
|
+
to: string;
|
|
110
|
+
};
|
|
111
|
+
log: {
|
|
112
|
+
level?: 'info' | 'warn' | 'error';
|
|
113
|
+
message: string;
|
|
114
|
+
};
|
|
115
|
+
if: {
|
|
116
|
+
cond: string;
|
|
117
|
+
then?: Action[];
|
|
118
|
+
else?: Action[];
|
|
119
|
+
};
|
|
120
|
+
loop: {
|
|
121
|
+
var: string;
|
|
122
|
+
in: string;
|
|
123
|
+
body: Action[];
|
|
124
|
+
};
|
|
125
|
+
call: {
|
|
126
|
+
method: string;
|
|
127
|
+
params?: Record<string, unknown>;
|
|
128
|
+
resultTo?: string;
|
|
129
|
+
};
|
|
130
|
+
batch: {
|
|
131
|
+
actions: Action[];
|
|
132
|
+
};
|
|
133
|
+
push: {
|
|
134
|
+
path: string;
|
|
135
|
+
value: string | unknown;
|
|
136
|
+
};
|
|
137
|
+
pop: {
|
|
138
|
+
path: string;
|
|
139
|
+
};
|
|
140
|
+
shift: {
|
|
141
|
+
path: string;
|
|
142
|
+
};
|
|
143
|
+
unshift: {
|
|
144
|
+
path: string;
|
|
145
|
+
value: string | unknown;
|
|
146
|
+
};
|
|
147
|
+
splice: {
|
|
148
|
+
path: string;
|
|
149
|
+
start: number | string;
|
|
150
|
+
deleteCount?: number | string;
|
|
151
|
+
items?: string | unknown[];
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* 类型守卫:检查动作是否符合特定类型
|
|
156
|
+
*/
|
|
157
|
+
export declare function isActionOfType<T extends keyof ActionMap>(action: Action, actionType: T): action is Action & ActionMap[T];
|
|
158
|
+
/**
|
|
159
|
+
* 表达式缓存接口
|
|
160
|
+
* 结果类型使用 unknown,因为表达式求值结果类型无法静态推导
|
|
161
|
+
*/
|
|
162
|
+
export interface ExpressionCache {
|
|
163
|
+
expr: string;
|
|
164
|
+
result: unknown;
|
|
165
|
+
dependencies: string[];
|
|
166
|
+
timestamp: number;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 错误类型定义
|
|
170
|
+
*
|
|
171
|
+
* @deprecated 使用 @vario/core/errors 中的错误类
|
|
172
|
+
* 保留这些导出以保持向后兼容,但建议使用新的错误体系
|
|
173
|
+
*/
|
|
174
|
+
export { ActionError, ExpressionError, ServiceError, BatchError, VarioError, ErrorCodes, type ErrorContext, type ErrorCode } from './errors.js';
|
|
175
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vario Core Types
|
|
3
|
+
*
|
|
4
|
+
* 核心类型定义,遵循架构图设计:
|
|
5
|
+
* - RuntimeContext: 扁平化状态 + $ 前缀系统 API
|
|
6
|
+
* - Action: 动作接口
|
|
7
|
+
* - ExpressionCache: 表达式缓存
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 类型守卫:检查动作是否符合特定类型
|
|
11
|
+
*/
|
|
12
|
+
export function isActionOfType(action, actionType) {
|
|
13
|
+
return action.type === actionType;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 错误类型定义
|
|
17
|
+
*
|
|
18
|
+
* @deprecated 使用 @vario/core/errors 中的错误类
|
|
19
|
+
* 保留这些导出以保持向后兼容,但建议使用新的错误体系
|
|
20
|
+
*/
|
|
21
|
+
export { ActionError, ExpressionError, ServiceError, BatchError, VarioError, ErrorCodes } from './errors.js';
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqIH;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,UAAa;IAEb,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,CAAA;AACnC,CAAC;AAaD;;;;;GAKG;AACH,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,UAAU,EACV,UAAU,EAGX,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 动作注册与分发
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 内置动作注册到 $methods
|
|
6
|
+
* - 动作处理器管理
|
|
7
|
+
*/
|
|
8
|
+
import type { ActionHandler } from '../types.js';
|
|
9
|
+
export type { ActionHandler };
|
|
10
|
+
export { registerBuiltinMethods } from './handlers/index.js';
|
|
11
|
+
//# sourceMappingURL=action.d.ts.map
|