@variojs/vue 0.0.1
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/README.md +916 -0
- package/dist/bindings.d.ts +48 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +199 -0
- package/dist/bindings.js.map +1 -0
- package/dist/composable.d.ts +84 -0
- package/dist/composable.d.ts.map +1 -0
- package/dist/composable.js +386 -0
- package/dist/composable.js.map +1 -0
- package/dist/features/attrs-builder.d.ts +38 -0
- package/dist/features/attrs-builder.d.ts.map +1 -0
- package/dist/features/attrs-builder.js +143 -0
- package/dist/features/attrs-builder.js.map +1 -0
- package/dist/features/children-resolver.d.ts +36 -0
- package/dist/features/children-resolver.d.ts.map +1 -0
- package/dist/features/children-resolver.js +171 -0
- package/dist/features/children-resolver.js.map +1 -0
- package/dist/features/component-resolver.d.ts +31 -0
- package/dist/features/component-resolver.d.ts.map +1 -0
- package/dist/features/component-resolver.js +110 -0
- package/dist/features/component-resolver.js.map +1 -0
- package/dist/features/computed.d.ts +35 -0
- package/dist/features/computed.d.ts.map +1 -0
- package/dist/features/computed.js +161 -0
- package/dist/features/computed.js.map +1 -0
- package/dist/features/event-handler.d.ts +34 -0
- package/dist/features/event-handler.d.ts.map +1 -0
- package/dist/features/event-handler.js +103 -0
- package/dist/features/event-handler.js.map +1 -0
- package/dist/features/expression-evaluator.d.ts +18 -0
- package/dist/features/expression-evaluator.d.ts.map +1 -0
- package/dist/features/expression-evaluator.js +28 -0
- package/dist/features/expression-evaluator.js.map +1 -0
- package/dist/features/lifecycle-wrapper.d.ts +19 -0
- package/dist/features/lifecycle-wrapper.d.ts.map +1 -0
- package/dist/features/lifecycle-wrapper.js +102 -0
- package/dist/features/lifecycle-wrapper.js.map +1 -0
- package/dist/features/loop-handler.d.ts +38 -0
- package/dist/features/loop-handler.d.ts.map +1 -0
- package/dist/features/loop-handler.js +168 -0
- package/dist/features/loop-handler.js.map +1 -0
- package/dist/features/path-resolver.d.ts +50 -0
- package/dist/features/path-resolver.d.ts.map +1 -0
- package/dist/features/path-resolver.js +171 -0
- package/dist/features/path-resolver.js.map +1 -0
- package/dist/features/provide-inject.d.ts +38 -0
- package/dist/features/provide-inject.d.ts.map +1 -0
- package/dist/features/provide-inject.js +139 -0
- package/dist/features/provide-inject.js.map +1 -0
- package/dist/features/refs.d.ts +45 -0
- package/dist/features/refs.d.ts.map +1 -0
- package/dist/features/refs.js +113 -0
- package/dist/features/refs.js.map +1 -0
- package/dist/features/teleport.d.ts +23 -0
- package/dist/features/teleport.d.ts.map +1 -0
- package/dist/features/teleport.js +32 -0
- package/dist/features/teleport.js.map +1 -0
- package/dist/features/validators.d.ts +43 -0
- package/dist/features/validators.d.ts.map +1 -0
- package/dist/features/validators.js +297 -0
- package/dist/features/validators.js.map +1 -0
- package/dist/features/watch.d.ts +26 -0
- package/dist/features/watch.d.ts.map +1 -0
- package/dist/features/watch.js +154 -0
- package/dist/features/watch.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/renderer.d.ts +72 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +244 -0
- package/dist/renderer.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内置验证器模块
|
|
3
|
+
*
|
|
4
|
+
* 提供常用的表单验证规则:
|
|
5
|
+
* - 必填验证
|
|
6
|
+
* - 格式验证(邮箱、URL、手机号等)
|
|
7
|
+
* - 长度验证
|
|
8
|
+
* - 数值范围验证
|
|
9
|
+
* - 正则匹配
|
|
10
|
+
* - 自定义验证
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* 默认错误消息
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_MESSAGES = {
|
|
16
|
+
required: '此字段为必填项',
|
|
17
|
+
email: '请输入有效的邮箱地址',
|
|
18
|
+
url: '请输入有效的 URL',
|
|
19
|
+
phone: '请输入有效的手机号',
|
|
20
|
+
number: '请输入数字',
|
|
21
|
+
integer: '请输入整数',
|
|
22
|
+
alpha: '只能包含字母',
|
|
23
|
+
alphanumeric: '只能包含字母和数字',
|
|
24
|
+
min: '值不能小于 {value}',
|
|
25
|
+
max: '值不能大于 {value}',
|
|
26
|
+
minLength: '长度不能少于 {value} 个字符',
|
|
27
|
+
maxLength: '长度不能超过 {value} 个字符',
|
|
28
|
+
pattern: '格式不正确'
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* 验证正则表达式
|
|
32
|
+
*/
|
|
33
|
+
const PATTERNS = {
|
|
34
|
+
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
|
|
35
|
+
url: /^https?:\/\/[^\s]+$/,
|
|
36
|
+
phone: /^1[3-9]\d{9}$/,
|
|
37
|
+
number: /^-?\d*\.?\d+$/,
|
|
38
|
+
integer: /^-?\d+$/,
|
|
39
|
+
alpha: /^[a-zA-Z]+$/,
|
|
40
|
+
alphanumeric: /^[a-zA-Z0-9]+$/
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 检查值是否为空
|
|
44
|
+
*/
|
|
45
|
+
const isEmpty = (value) => {
|
|
46
|
+
if (value === null || value === undefined)
|
|
47
|
+
return true;
|
|
48
|
+
if (typeof value === 'string')
|
|
49
|
+
return value.trim() === '';
|
|
50
|
+
if (Array.isArray(value))
|
|
51
|
+
return value.length === 0;
|
|
52
|
+
return false;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* 内置验证器
|
|
56
|
+
*/
|
|
57
|
+
const builtinValidators = {
|
|
58
|
+
required: (value) => ({
|
|
59
|
+
valid: !isEmpty(value),
|
|
60
|
+
message: DEFAULT_MESSAGES.required
|
|
61
|
+
}),
|
|
62
|
+
email: (value) => {
|
|
63
|
+
if (isEmpty(value))
|
|
64
|
+
return { valid: true };
|
|
65
|
+
return {
|
|
66
|
+
valid: PATTERNS.email.test(String(value)),
|
|
67
|
+
message: DEFAULT_MESSAGES.email
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
url: (value) => {
|
|
71
|
+
if (isEmpty(value))
|
|
72
|
+
return { valid: true };
|
|
73
|
+
return {
|
|
74
|
+
valid: PATTERNS.url.test(String(value)),
|
|
75
|
+
message: DEFAULT_MESSAGES.url
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
phone: (value) => {
|
|
79
|
+
if (isEmpty(value))
|
|
80
|
+
return { valid: true };
|
|
81
|
+
return {
|
|
82
|
+
valid: PATTERNS.phone.test(String(value)),
|
|
83
|
+
message: DEFAULT_MESSAGES.phone
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
number: (value) => {
|
|
87
|
+
if (isEmpty(value))
|
|
88
|
+
return { valid: true };
|
|
89
|
+
return {
|
|
90
|
+
valid: PATTERNS.number.test(String(value)),
|
|
91
|
+
message: DEFAULT_MESSAGES.number
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
integer: (value) => {
|
|
95
|
+
if (isEmpty(value))
|
|
96
|
+
return { valid: true };
|
|
97
|
+
return {
|
|
98
|
+
valid: PATTERNS.integer.test(String(value)),
|
|
99
|
+
message: DEFAULT_MESSAGES.integer
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
alpha: (value) => {
|
|
103
|
+
if (isEmpty(value))
|
|
104
|
+
return { valid: true };
|
|
105
|
+
return {
|
|
106
|
+
valid: PATTERNS.alpha.test(String(value)),
|
|
107
|
+
message: DEFAULT_MESSAGES.alpha
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
alphanumeric: (value) => {
|
|
111
|
+
if (isEmpty(value))
|
|
112
|
+
return { valid: true };
|
|
113
|
+
return {
|
|
114
|
+
valid: PATTERNS.alphanumeric.test(String(value)),
|
|
115
|
+
message: DEFAULT_MESSAGES.alphanumeric
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* 参数化验证器
|
|
121
|
+
*/
|
|
122
|
+
const parameterizedValidators = {
|
|
123
|
+
min: (value, param) => {
|
|
124
|
+
if (isEmpty(value))
|
|
125
|
+
return { valid: true };
|
|
126
|
+
const num = Number(value);
|
|
127
|
+
const min = Number(param);
|
|
128
|
+
return {
|
|
129
|
+
valid: !isNaN(num) && num >= min,
|
|
130
|
+
message: DEFAULT_MESSAGES.min.replace('{value}', String(param))
|
|
131
|
+
};
|
|
132
|
+
},
|
|
133
|
+
max: (value, param) => {
|
|
134
|
+
if (isEmpty(value))
|
|
135
|
+
return { valid: true };
|
|
136
|
+
const num = Number(value);
|
|
137
|
+
const max = Number(param);
|
|
138
|
+
return {
|
|
139
|
+
valid: !isNaN(num) && num <= max,
|
|
140
|
+
message: DEFAULT_MESSAGES.max.replace('{value}', String(param))
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
minLength: (value, param) => {
|
|
144
|
+
if (isEmpty(value))
|
|
145
|
+
return { valid: true };
|
|
146
|
+
const len = String(value).length;
|
|
147
|
+
const minLen = Number(param);
|
|
148
|
+
return {
|
|
149
|
+
valid: len >= minLen,
|
|
150
|
+
message: DEFAULT_MESSAGES.minLength.replace('{value}', String(param))
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
maxLength: (value, param) => {
|
|
154
|
+
if (isEmpty(value))
|
|
155
|
+
return { valid: true };
|
|
156
|
+
const len = String(value).length;
|
|
157
|
+
const maxLen = Number(param);
|
|
158
|
+
return {
|
|
159
|
+
valid: len <= maxLen,
|
|
160
|
+
message: DEFAULT_MESSAGES.maxLength.replace('{value}', String(param))
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
pattern: (value, param) => {
|
|
164
|
+
if (isEmpty(value))
|
|
165
|
+
return { valid: true };
|
|
166
|
+
const regex = param instanceof RegExp ? param : new RegExp(String(param));
|
|
167
|
+
return {
|
|
168
|
+
valid: regex.test(String(value)),
|
|
169
|
+
message: DEFAULT_MESSAGES.pattern
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* 执行单个验证规则
|
|
175
|
+
*/
|
|
176
|
+
export const executeRule = async (value, rule, ctx) => {
|
|
177
|
+
// 字符串规则(内置规则简写)
|
|
178
|
+
if (typeof rule === 'string') {
|
|
179
|
+
const validator = builtinValidators[rule];
|
|
180
|
+
if (validator) {
|
|
181
|
+
return validator(value);
|
|
182
|
+
}
|
|
183
|
+
return { valid: true };
|
|
184
|
+
}
|
|
185
|
+
// 函数规则(自定义验证器)
|
|
186
|
+
if (typeof rule === 'function') {
|
|
187
|
+
try {
|
|
188
|
+
const result = await rule(value, ctx);
|
|
189
|
+
if (typeof result === 'boolean') {
|
|
190
|
+
return { valid: result, message: result ? undefined : '验证失败' };
|
|
191
|
+
}
|
|
192
|
+
return { valid: false, message: result };
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return { valid: false, message: error instanceof Error ? error.message : '验证出错' };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// 参数化规则
|
|
199
|
+
if (typeof rule === 'object' && 'type' in rule) {
|
|
200
|
+
const paramRule = rule;
|
|
201
|
+
// 自定义规则
|
|
202
|
+
if (paramRule.type === 'custom' && typeof paramRule.value === 'function') {
|
|
203
|
+
try {
|
|
204
|
+
const result = await paramRule.value(value, ctx);
|
|
205
|
+
if (typeof result === 'boolean') {
|
|
206
|
+
return { valid: result, message: result ? undefined : paramRule.message || '验证失败' };
|
|
207
|
+
}
|
|
208
|
+
return { valid: false, message: result };
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return { valid: false, message: error instanceof Error ? error.message : '验证出错' };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// 其他参数化规则
|
|
215
|
+
const validator = parameterizedValidators[paramRule.type];
|
|
216
|
+
if (validator) {
|
|
217
|
+
const result = validator(value, paramRule.value);
|
|
218
|
+
return {
|
|
219
|
+
valid: result.valid,
|
|
220
|
+
message: paramRule.message || result.message
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return { valid: true };
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* 规范化验证配置
|
|
228
|
+
*/
|
|
229
|
+
export const normalizeValidateConfig = (config) => {
|
|
230
|
+
// 单个规则
|
|
231
|
+
if (typeof config === 'string' || typeof config === 'function') {
|
|
232
|
+
return {
|
|
233
|
+
rules: [config],
|
|
234
|
+
trigger: ['change']
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// 规则数组
|
|
238
|
+
if (Array.isArray(config)) {
|
|
239
|
+
return {
|
|
240
|
+
rules: config,
|
|
241
|
+
trigger: ['change']
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// 完整配置对象
|
|
245
|
+
if (typeof config === 'object' && 'type' in config) {
|
|
246
|
+
// ParameterizedValidateRule
|
|
247
|
+
return {
|
|
248
|
+
rules: [config],
|
|
249
|
+
trigger: ['change']
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// 配置对象
|
|
253
|
+
const fullConfig = config;
|
|
254
|
+
return {
|
|
255
|
+
rules: fullConfig.rules,
|
|
256
|
+
trigger: Array.isArray(fullConfig.trigger)
|
|
257
|
+
? fullConfig.trigger
|
|
258
|
+
: [fullConfig.trigger || 'change'],
|
|
259
|
+
message: fullConfig.message,
|
|
260
|
+
errorPath: fullConfig.errorPath
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* 执行完整验证
|
|
265
|
+
*/
|
|
266
|
+
export const validate = async (value, config, ctx) => {
|
|
267
|
+
const { rules, message: globalMessage } = normalizeValidateConfig(config);
|
|
268
|
+
for (const rule of rules) {
|
|
269
|
+
const result = await executeRule(value, rule, ctx);
|
|
270
|
+
if (!result.valid) {
|
|
271
|
+
return {
|
|
272
|
+
valid: false,
|
|
273
|
+
message: globalMessage || result.message
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return { valid: true };
|
|
278
|
+
};
|
|
279
|
+
/**
|
|
280
|
+
* 创建验证处理器(用于绑定到事件)
|
|
281
|
+
*/
|
|
282
|
+
export const createValidationHandler = (modelPath, config, setError, ctx) => {
|
|
283
|
+
const { rules, message: globalMessage, errorPath } = normalizeValidateConfig(config);
|
|
284
|
+
const errPath = errorPath || `${modelPath}Error`;
|
|
285
|
+
return async (value) => {
|
|
286
|
+
for (const rule of rules) {
|
|
287
|
+
const result = await executeRule(value, rule, ctx);
|
|
288
|
+
if (!result.valid) {
|
|
289
|
+
setError(errPath, globalMessage || result.message || '验证失败');
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
setError(errPath, null);
|
|
294
|
+
return true;
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/features/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch 支持
|
|
3
|
+
*
|
|
4
|
+
* 在 Schema 节点上支持监听器,监听表达式变化并调用 methods
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - 精细化依赖追踪:只追踪表达式中使用的状态路径
|
|
8
|
+
* - 支持 immediate 和 deep 选项
|
|
9
|
+
* - 自动清理:组件卸载时停止所有 watcher
|
|
10
|
+
*/
|
|
11
|
+
import type { RuntimeContext } from '@vario/core';
|
|
12
|
+
import type { VueSchemaNode } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* 为 Schema 节点创建监听器
|
|
15
|
+
* 返回停止监听的函数数组
|
|
16
|
+
*
|
|
17
|
+
* @param schema Schema 节点
|
|
18
|
+
* @param ctx 运行时上下文
|
|
19
|
+
* @param getState 获取响应式状态的函数
|
|
20
|
+
*/
|
|
21
|
+
export declare function createWatchers(schema: VueSchemaNode, ctx: RuntimeContext, getState?: () => any): (() => void)[];
|
|
22
|
+
/**
|
|
23
|
+
* 批量停止所有 watcher
|
|
24
|
+
*/
|
|
25
|
+
export declare function stopAllWatchers(stopHandles: (() => void)[]): void;
|
|
26
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/features/watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AA0FhD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,cAAc,EACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,GACnB,CAAC,MAAM,IAAI,CAAC,EAAE,CAsDhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,IAAI,CAQjE"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch 支持
|
|
3
|
+
*
|
|
4
|
+
* 在 Schema 节点上支持监听器,监听表达式变化并调用 methods
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - 精细化依赖追踪:只追踪表达式中使用的状态路径
|
|
8
|
+
* - 支持 immediate 和 deep 选项
|
|
9
|
+
* - 自动清理:组件卸载时停止所有 watcher
|
|
10
|
+
*/
|
|
11
|
+
import { watch } from 'vue';
|
|
12
|
+
import { evaluate, parseExpression, extractDependencies } from '@vario/core';
|
|
13
|
+
/**
|
|
14
|
+
* 从表达式中提取依赖的状态路径
|
|
15
|
+
*/
|
|
16
|
+
function extractExprDependencies(expr) {
|
|
17
|
+
try {
|
|
18
|
+
const ast = parseExpression(expr);
|
|
19
|
+
return extractDependencies(ast);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 根据依赖路径从响应式状态中读取值(触发依赖追踪)
|
|
27
|
+
*/
|
|
28
|
+
function trackDependencies(state, deps) {
|
|
29
|
+
if (!state || deps.length === 0)
|
|
30
|
+
return;
|
|
31
|
+
for (const dep of deps) {
|
|
32
|
+
if (dep.endsWith('.*')) {
|
|
33
|
+
const basePath = dep.slice(0, -2);
|
|
34
|
+
const value = getNestedValue(state, basePath);
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
void value.length;
|
|
37
|
+
}
|
|
38
|
+
else if (value && typeof value === 'object') {
|
|
39
|
+
void Object.keys(value);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (dep.includes('.')) {
|
|
43
|
+
void getNestedValue(state, dep);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
void state[dep];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 获取嵌套路径的值
|
|
52
|
+
*/
|
|
53
|
+
function getNestedValue(obj, path) {
|
|
54
|
+
const parts = path.split('.');
|
|
55
|
+
let current = obj;
|
|
56
|
+
for (const part of parts) {
|
|
57
|
+
if (current == null)
|
|
58
|
+
return undefined;
|
|
59
|
+
current = current[part];
|
|
60
|
+
}
|
|
61
|
+
return current;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 规范化 watch 配置
|
|
65
|
+
*/
|
|
66
|
+
function normalizeWatchConfigs(watchDef) {
|
|
67
|
+
if (!watchDef)
|
|
68
|
+
return [];
|
|
69
|
+
const configs = [];
|
|
70
|
+
for (const [source, config] of Object.entries(watchDef)) {
|
|
71
|
+
const handlerName = typeof config === 'string' ? config : config.handler;
|
|
72
|
+
const options = typeof config === 'string'
|
|
73
|
+
? {}
|
|
74
|
+
: {
|
|
75
|
+
immediate: config.immediate,
|
|
76
|
+
deep: config.deep
|
|
77
|
+
};
|
|
78
|
+
configs.push({
|
|
79
|
+
source,
|
|
80
|
+
handler: handlerName,
|
|
81
|
+
options,
|
|
82
|
+
deps: extractExprDependencies(source)
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return configs;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 为 Schema 节点创建监听器
|
|
89
|
+
* 返回停止监听的函数数组
|
|
90
|
+
*
|
|
91
|
+
* @param schema Schema 节点
|
|
92
|
+
* @param ctx 运行时上下文
|
|
93
|
+
* @param getState 获取响应式状态的函数
|
|
94
|
+
*/
|
|
95
|
+
export function createWatchers(schema, ctx, getState) {
|
|
96
|
+
const configs = normalizeWatchConfigs(schema.watch);
|
|
97
|
+
if (configs.length === 0) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
const stopHandles = [];
|
|
101
|
+
for (const config of configs) {
|
|
102
|
+
const { source, handler: handlerName, options, deps } = config;
|
|
103
|
+
const handler = ctx.$methods?.[handlerName];
|
|
104
|
+
if (!handler) {
|
|
105
|
+
console.warn(`[Vario] Watch handler "${handlerName}" not found in methods`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// 创建 getter 函数(精细化依赖追踪)
|
|
109
|
+
const getter = () => {
|
|
110
|
+
try {
|
|
111
|
+
if (getState) {
|
|
112
|
+
trackDependencies(getState(), deps);
|
|
113
|
+
}
|
|
114
|
+
return evaluate(source, ctx);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.warn(`[Vario] Watch source "${source}" evaluation error:`, error);
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// 注册监听器
|
|
122
|
+
const stopHandle = watch(getter, (newValue, oldValue) => {
|
|
123
|
+
try {
|
|
124
|
+
const result = handler(ctx, { newValue, oldValue, source });
|
|
125
|
+
// 处理异步 handler
|
|
126
|
+
if (result && typeof result === 'object' && 'catch' in result) {
|
|
127
|
+
result.catch((err) => {
|
|
128
|
+
console.warn(`[Vario] Watch handler "${handlerName}" error:`, err);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
console.warn(`[Vario] Watch handler "${handlerName}" error:`, err);
|
|
134
|
+
}
|
|
135
|
+
}, options);
|
|
136
|
+
stopHandles.push(stopHandle);
|
|
137
|
+
}
|
|
138
|
+
// 返回停止函数
|
|
139
|
+
return stopHandles.map(handle => () => handle());
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 批量停止所有 watcher
|
|
143
|
+
*/
|
|
144
|
+
export function stopAllWatchers(stopHandles) {
|
|
145
|
+
stopHandles.forEach(stop => {
|
|
146
|
+
try {
|
|
147
|
+
stop();
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// 忽略停止时的错误
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/features/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vario Vue Renderer
|
|
3
|
+
*
|
|
4
|
+
* Vue 3 integration backend for rendering Vario Schemas.
|
|
5
|
+
*
|
|
6
|
+
* 深度集成 Vue 3 特性:
|
|
7
|
+
* - ref: 模板引用(声明映射到 Vue ref)
|
|
8
|
+
* - 生命周期钩子(声明映射到 Vue 钩子)
|
|
9
|
+
* - provide/inject: 依赖注入(声明映射到 Vue API)
|
|
10
|
+
* - teleport: 传送
|
|
11
|
+
* - transition: 过渡动画
|
|
12
|
+
* - keep-alive: 缓存
|
|
13
|
+
*
|
|
14
|
+
* 注意:computed 和 watch 应该在 Vue 组件中使用原生 API 定义,
|
|
15
|
+
* 然后通过 useVario 的 computed 选项传入
|
|
16
|
+
*/
|
|
17
|
+
export * from './renderer.js';
|
|
18
|
+
export * from './composable.js';
|
|
19
|
+
export * from './bindings.js';
|
|
20
|
+
export * from './types.js';
|
|
21
|
+
export * from './features/refs.js';
|
|
22
|
+
export * from './features/teleport.js';
|
|
23
|
+
export * from './features/provide-inject.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vario Vue Renderer
|
|
3
|
+
*
|
|
4
|
+
* Vue 3 integration backend for rendering Vario Schemas.
|
|
5
|
+
*
|
|
6
|
+
* 深度集成 Vue 3 特性:
|
|
7
|
+
* - ref: 模板引用(声明映射到 Vue ref)
|
|
8
|
+
* - 生命周期钩子(声明映射到 Vue 钩子)
|
|
9
|
+
* - provide/inject: 依赖注入(声明映射到 Vue API)
|
|
10
|
+
* - teleport: 传送
|
|
11
|
+
* - transition: 过渡动画
|
|
12
|
+
* - keep-alive: 缓存
|
|
13
|
+
*
|
|
14
|
+
* 注意:computed 和 watch 应该在 Vue 组件中使用原生 API 定义,
|
|
15
|
+
* 然后通过 useVario 的 computed 选项传入
|
|
16
|
+
*/
|
|
17
|
+
export * from './renderer.js';
|
|
18
|
+
export * from './composable.js';
|
|
19
|
+
export * from './bindings.js';
|
|
20
|
+
export * from './types.js';
|
|
21
|
+
export * from './features/refs.js';
|
|
22
|
+
export * from './features/teleport.js';
|
|
23
|
+
export * from './features/provide-inject.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue renderer implementation
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - Schema → VNode 转换
|
|
6
|
+
* - 通用组件解析(支持全局注册的组件)
|
|
7
|
+
* - 双向绑定处理
|
|
8
|
+
* - 控制流转换(cond/show/loop)
|
|
9
|
+
* - 事件处理
|
|
10
|
+
* - 表达式求值
|
|
11
|
+
*/
|
|
12
|
+
import { type VNode, ComponentInternalInstance, type App } from 'vue';
|
|
13
|
+
import type { SchemaNode } from '@variojs/schema';
|
|
14
|
+
import type { RuntimeContext } from '@variojs/core';
|
|
15
|
+
import { RefsRegistry } from './features/refs.js';
|
|
16
|
+
/**
|
|
17
|
+
* Model 路径解析配置(仅保留与格式相关的选项)
|
|
18
|
+
*/
|
|
19
|
+
export interface ModelPathConfig {
|
|
20
|
+
separator?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Vue 渲染器配置
|
|
24
|
+
*/
|
|
25
|
+
export interface VueRendererOptions {
|
|
26
|
+
instance?: ComponentInternalInstance | null;
|
|
27
|
+
/** Vue 应用实例(用于获取全局组件,优先级高于 instance) */
|
|
28
|
+
app?: App | null;
|
|
29
|
+
/** 全局组件映射(用于获取全局组件,优先级最高) */
|
|
30
|
+
components?: Record<string, any>;
|
|
31
|
+
getState?: () => any;
|
|
32
|
+
refsRegistry?: RefsRegistry;
|
|
33
|
+
modelPath?: ModelPathConfig;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Vue 渲染器
|
|
37
|
+
* 将 Vario Schema 转换为 Vue VNode
|
|
38
|
+
*/
|
|
39
|
+
export declare class VueRenderer {
|
|
40
|
+
refsRegistry: RefsRegistry;
|
|
41
|
+
private getState?;
|
|
42
|
+
private pathResolver;
|
|
43
|
+
private componentResolver;
|
|
44
|
+
private expressionEvaluator;
|
|
45
|
+
private eventHandler;
|
|
46
|
+
private attrsBuilder;
|
|
47
|
+
private loopHandler;
|
|
48
|
+
private childrenResolver;
|
|
49
|
+
private lifecycleWrapper;
|
|
50
|
+
constructor(options?: VueRendererOptions);
|
|
51
|
+
/**
|
|
52
|
+
* 渲染 Schema 为 VNode
|
|
53
|
+
*/
|
|
54
|
+
render(schema: SchemaNode, ctx: RuntimeContext): VNode | null;
|
|
55
|
+
/**
|
|
56
|
+
* 创建 VNode
|
|
57
|
+
* @param schema Schema 节点
|
|
58
|
+
* @param ctx 运行时上下文
|
|
59
|
+
* @param modelPathStack 当前 model 路径栈(用于自动路径拼接)
|
|
60
|
+
*/
|
|
61
|
+
private createVNode;
|
|
62
|
+
/**
|
|
63
|
+
* 清除组件解析缓存
|
|
64
|
+
* 用于组件注册变更后的缓存失效
|
|
65
|
+
*/
|
|
66
|
+
clearComponentCache(): void;
|
|
67
|
+
/**
|
|
68
|
+
* 使特定组件的缓存失效
|
|
69
|
+
*/
|
|
70
|
+
invalidateComponentCache(type: string): void;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAK,KAAK,KAAK,EAAY,yBAAyB,EAAyB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AACzG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAa,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAY5D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAA;IAC3C,wCAAwC;IACxC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAA;IACpB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAA;CAC5B;AAED;;;GAGG;AACH,qBAAa,WAAW;IACf,YAAY,EAAE,YAAY,CAAA;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAW;IAG5B,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAkB;gBAE9B,OAAO,GAAE,kBAAuB;IAoC5C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,GAAG,KAAK,GAAG,IAAI;IAU7D;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAsLnB;;;OAGG;IACI,mBAAmB,IAAI,IAAI;IAIlC;;OAEG;IACI,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAGpD"}
|