@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,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model 路径解析模块
|
|
3
|
+
*
|
|
4
|
+
* 负责处理 model 路径的解析、拼接和转换
|
|
5
|
+
*/
|
|
6
|
+
import { parsePath } from '@variojs/core';
|
|
7
|
+
/**
|
|
8
|
+
* Model 路径解析器
|
|
9
|
+
*/
|
|
10
|
+
export class ModelPathResolver {
|
|
11
|
+
evaluateExpr;
|
|
12
|
+
constructor(evaluateExpr) {
|
|
13
|
+
this.evaluateExpr = evaluateExpr;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 从 model(string | { path, scope? })中取出路径字符串
|
|
17
|
+
*/
|
|
18
|
+
getModelPath(model) {
|
|
19
|
+
if (model == null)
|
|
20
|
+
return undefined;
|
|
21
|
+
if (typeof model === 'string')
|
|
22
|
+
return model;
|
|
23
|
+
if (typeof model === 'object' && model !== null && typeof model.path === 'string') {
|
|
24
|
+
return model.path;
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 返回应压栈的路径:string 返回 path;object 且 scope 时返回 path;否则 undefined
|
|
30
|
+
*/
|
|
31
|
+
getScopePath(model) {
|
|
32
|
+
const path = this.getModelPath(model);
|
|
33
|
+
if (!path)
|
|
34
|
+
return undefined;
|
|
35
|
+
if (typeof model === 'string')
|
|
36
|
+
return path;
|
|
37
|
+
return model.scope ? path : undefined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 更新 model 路径栈
|
|
41
|
+
*
|
|
42
|
+
* 根据当前节点的 model 属性更新路径栈,供子级使用。
|
|
43
|
+
* 支持 [] 语法明确数组访问。
|
|
44
|
+
*/
|
|
45
|
+
updateModelPathStack(modelPath, parentStack, ctx, schema) {
|
|
46
|
+
if (!modelPath) {
|
|
47
|
+
return [...parentStack];
|
|
48
|
+
}
|
|
49
|
+
// 提取路径(去除 {{ }})
|
|
50
|
+
const rawPath = this.extractModelPath(modelPath);
|
|
51
|
+
// 解析路径段(支持 [] 语法)
|
|
52
|
+
const segments = parsePath(rawPath);
|
|
53
|
+
if (segments.length === 0) {
|
|
54
|
+
return [...parentStack];
|
|
55
|
+
}
|
|
56
|
+
// 判断是否为单段路径(扁平路径)
|
|
57
|
+
const isFlatPath = segments.length === 1 && typeof segments[0] === 'string';
|
|
58
|
+
if (isFlatPath) {
|
|
59
|
+
// 扁平路径:拼接到父级路径栈
|
|
60
|
+
return [...parentStack, segments[0]];
|
|
61
|
+
}
|
|
62
|
+
// 多段路径(明确路径)
|
|
63
|
+
// 检查是否在循环上下文中引用了循环变量
|
|
64
|
+
const firstSegment = segments[0];
|
|
65
|
+
if (ctx.$index !== undefined && typeof firstSegment === 'string') {
|
|
66
|
+
// 检查是否是循环变量($item 或 itemKey)
|
|
67
|
+
if (firstSegment === '$item' || (firstSegment in ctx && ctx[firstSegment] === ctx.$item)) {
|
|
68
|
+
// 获取循环的 items 路径
|
|
69
|
+
const loopItems = schema.__loopItems;
|
|
70
|
+
if (loopItems) {
|
|
71
|
+
const itemsPath = this.extractModelPath(loopItems);
|
|
72
|
+
const itemsSegments = parsePath(itemsPath);
|
|
73
|
+
const restSegments = segments.slice(1); // 移除 item/$item
|
|
74
|
+
// 构建完整路径:itemsPath + 索引 + 剩余路径
|
|
75
|
+
return [...itemsSegments, ctx.$index, ...restSegments];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 处理动态索引(-1 表示需要在循环上下文中填充)
|
|
80
|
+
const resolvedSegments = segments.map(seg => {
|
|
81
|
+
if (seg === -1 && ctx.$index !== undefined) {
|
|
82
|
+
return ctx.$index;
|
|
83
|
+
}
|
|
84
|
+
return seg;
|
|
85
|
+
});
|
|
86
|
+
// 明确路径:作为新的路径栈基础
|
|
87
|
+
return resolvedSegments;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 提取 model 路径(去除 {{ }} 包裹)
|
|
91
|
+
*/
|
|
92
|
+
extractModelPath(modelPath) {
|
|
93
|
+
if (typeof modelPath !== 'string') {
|
|
94
|
+
return String(modelPath);
|
|
95
|
+
}
|
|
96
|
+
return modelPath.includes('{{')
|
|
97
|
+
? modelPath.replace(/^\{\{\s*|\s*\}\}$/g, '').trim()
|
|
98
|
+
: modelPath;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 解析 model 路径为最终的状态路径
|
|
102
|
+
*
|
|
103
|
+
* 支持:
|
|
104
|
+
* - 当前栈路径:`model: "."` 且路径栈非空时 → 返回栈对应路径(用于循环中绑定 items[0]、items[1] 等数组元素本身)
|
|
105
|
+
* - 扁平路径:`name` → 拼接路径栈 → `form.user.name`
|
|
106
|
+
* - 明确路径:`form.user.name` → 直接使用
|
|
107
|
+
* - 数组访问:`users[0].name` → 解析为 `users.0.name`
|
|
108
|
+
* - 循环变量:`item.name` → 解析为 `items.0.name`
|
|
109
|
+
*/
|
|
110
|
+
resolveModelPath(modelPath, schema, ctx, modelPathStack = []) {
|
|
111
|
+
if (typeof modelPath !== 'string') {
|
|
112
|
+
return String(modelPath);
|
|
113
|
+
}
|
|
114
|
+
// 提取路径
|
|
115
|
+
const rawPath = this.extractModelPath(modelPath);
|
|
116
|
+
// 如果是表达式,先求值
|
|
117
|
+
if (modelPath.includes('{{')) {
|
|
118
|
+
const evaluated = this.evaluateExpr(rawPath, ctx);
|
|
119
|
+
if (typeof evaluated === 'string' && evaluated !== rawPath) {
|
|
120
|
+
// 递归处理求值后的路径
|
|
121
|
+
return this.resolveModelPath(evaluated, schema, ctx, modelPathStack);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// model 为 "." 表示绑定到「当前路径栈」对应路径(循环中即当前项 items[i],数组元素本身)
|
|
125
|
+
if ((rawPath === '.' || rawPath === '') && modelPathStack.length > 0) {
|
|
126
|
+
return this.segmentsToPath(modelPathStack);
|
|
127
|
+
}
|
|
128
|
+
// 解析路径段
|
|
129
|
+
const segments = parsePath(rawPath);
|
|
130
|
+
if (segments.length === 0) {
|
|
131
|
+
return rawPath;
|
|
132
|
+
}
|
|
133
|
+
// 处理循环上下文中的变量引用
|
|
134
|
+
const firstSegment = segments[0];
|
|
135
|
+
if (ctx.$index !== undefined && typeof firstSegment === 'string') {
|
|
136
|
+
// 检查是否是循环变量
|
|
137
|
+
if (firstSegment === '$item' || (firstSegment in ctx && ctx[firstSegment] === ctx.$item)) {
|
|
138
|
+
const loopItems = schema.__loopItems;
|
|
139
|
+
if (loopItems) {
|
|
140
|
+
const itemsPath = this.extractModelPath(loopItems);
|
|
141
|
+
const itemsSegments = parsePath(itemsPath);
|
|
142
|
+
const restSegments = segments.slice(1);
|
|
143
|
+
const fullSegments = [...itemsSegments, ctx.$index, ...restSegments];
|
|
144
|
+
return this.segmentsToPath(fullSegments);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// 判断是否为扁平路径(单段且为字符串)
|
|
149
|
+
const isFlatPath = segments.length === 1 && typeof segments[0] === 'string';
|
|
150
|
+
if (isFlatPath && modelPathStack.length > 0) {
|
|
151
|
+
// 扁平路径:拼接路径栈
|
|
152
|
+
const fullSegments = [...modelPathStack, segments[0]];
|
|
153
|
+
return this.segmentsToPath(fullSegments);
|
|
154
|
+
}
|
|
155
|
+
// 处理动态索引
|
|
156
|
+
const resolvedSegments = segments.map(seg => {
|
|
157
|
+
if (seg === -1 && ctx.$index !== undefined) {
|
|
158
|
+
return ctx.$index;
|
|
159
|
+
}
|
|
160
|
+
return seg;
|
|
161
|
+
});
|
|
162
|
+
return this.segmentsToPath(resolvedSegments);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 将路径段数组转换为路径字符串
|
|
166
|
+
*/
|
|
167
|
+
segmentsToPath(segments) {
|
|
168
|
+
return segments.map(String).join('.');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../src/features/path-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provide/Inject 支持
|
|
3
|
+
*
|
|
4
|
+
* 在 Schema 节点上支持 Vue 的依赖注入系统
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - provide: 向下传递数据给子组件
|
|
8
|
+
* - inject: 从父组件获取数据
|
|
9
|
+
* - 支持表达式求值:provide 的值可以是表达式
|
|
10
|
+
* - 支持默认值:inject 可以指定默认值
|
|
11
|
+
*/
|
|
12
|
+
import type { RuntimeContext } from '@variojs/core';
|
|
13
|
+
import type { VueSchemaNode } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* 处理 provide 配置
|
|
16
|
+
* 在组件 setup 中调用,向下传递数据
|
|
17
|
+
*
|
|
18
|
+
* @param schema Schema 节点
|
|
19
|
+
* @param ctx 运行时上下文
|
|
20
|
+
*/
|
|
21
|
+
export declare function setupProvide(schema: VueSchemaNode, ctx: RuntimeContext): void;
|
|
22
|
+
/**
|
|
23
|
+
* 处理 inject 配置
|
|
24
|
+
* 在组件 setup 中调用,从父组件获取数据
|
|
25
|
+
*
|
|
26
|
+
* @param schema Schema 节点
|
|
27
|
+
* @returns inject 的值对象,可合并到 props 或 attrs
|
|
28
|
+
*/
|
|
29
|
+
export declare function setupInject(schema: VueSchemaNode): Record<string, any>;
|
|
30
|
+
/**
|
|
31
|
+
* 在 setup 中同时处理 provide 和 inject
|
|
32
|
+
*
|
|
33
|
+
* @param schema Schema 节点
|
|
34
|
+
* @param ctx 运行时上下文
|
|
35
|
+
* @returns inject 的值对象
|
|
36
|
+
*/
|
|
37
|
+
export declare function setupProvideInject(schema: VueSchemaNode, ctx: RuntimeContext): Record<string, any>;
|
|
38
|
+
//# sourceMappingURL=provide-inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provide-inject.d.ts","sourceRoot":"","sources":["../../src/features/provide-inject.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAgChD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,cAAc,GAClB,IAAI,CAwBN;AA8CD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,GACpB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoBrB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,cAAc,GAClB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAGrB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provide/Inject 支持
|
|
3
|
+
*
|
|
4
|
+
* 在 Schema 节点上支持 Vue 的依赖注入系统
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - provide: 向下传递数据给子组件
|
|
8
|
+
* - inject: 从父组件获取数据
|
|
9
|
+
* - 支持表达式求值:provide 的值可以是表达式
|
|
10
|
+
* - 支持默认值:inject 可以指定默认值
|
|
11
|
+
*/
|
|
12
|
+
import { provide, inject } from 'vue';
|
|
13
|
+
import { evaluate } from '@variojs/core';
|
|
14
|
+
/**
|
|
15
|
+
* 判断字符串是否看起来像一个表达式
|
|
16
|
+
* 表达式通常包含:变量名(无空格/引号)、点号访问、运算符等
|
|
17
|
+
*/
|
|
18
|
+
function looksLikeExpression(str) {
|
|
19
|
+
// 纯字母数字下划线的简单标识符可能是状态引用
|
|
20
|
+
if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// 包含点号访问:user.name
|
|
24
|
+
if (/^[a-zA-Z_$][a-zA-Z0-9_$.]*$/.test(str)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// 包含运算符的表达式
|
|
28
|
+
if (/[+\-*/%<>=!&|?:]/.test(str)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 处理 provide 配置
|
|
35
|
+
* 在组件 setup 中调用,向下传递数据
|
|
36
|
+
*
|
|
37
|
+
* @param schema Schema 节点
|
|
38
|
+
* @param ctx 运行时上下文
|
|
39
|
+
*/
|
|
40
|
+
export function setupProvide(schema, ctx) {
|
|
41
|
+
if (!schema.provide || Object.keys(schema.provide).length === 0) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
for (const [key, value] of Object.entries(schema.provide)) {
|
|
45
|
+
let resolvedValue;
|
|
46
|
+
// 如果值是字符串且看起来像表达式,尝试求值
|
|
47
|
+
if (typeof value === 'string' && looksLikeExpression(value)) {
|
|
48
|
+
try {
|
|
49
|
+
const result = evaluate(value, ctx);
|
|
50
|
+
// 只有当结果不是 undefined 时才使用求值结果
|
|
51
|
+
resolvedValue = result !== undefined ? result : value;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// 表达式求值失败,使用原始字符串
|
|
55
|
+
resolvedValue = value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
resolvedValue = value;
|
|
60
|
+
}
|
|
61
|
+
provide(key, resolvedValue);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 规范化 inject 配置
|
|
66
|
+
*/
|
|
67
|
+
function normalizeInjectConfig(injectDef) {
|
|
68
|
+
if (!injectDef)
|
|
69
|
+
return [];
|
|
70
|
+
const configs = [];
|
|
71
|
+
if (Array.isArray(injectDef)) {
|
|
72
|
+
// 数组形式: ['theme', 'locale']
|
|
73
|
+
for (const key of injectDef) {
|
|
74
|
+
configs.push({
|
|
75
|
+
localKey: key,
|
|
76
|
+
from: key,
|
|
77
|
+
hasDefault: false
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// 对象形式
|
|
83
|
+
for (const [localKey, config] of Object.entries(injectDef)) {
|
|
84
|
+
if (typeof config === 'string') {
|
|
85
|
+
// 简单映射: { myTheme: 'theme' }
|
|
86
|
+
configs.push({
|
|
87
|
+
localKey,
|
|
88
|
+
from: config,
|
|
89
|
+
hasDefault: false
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// 完整配置: { myTheme: { from: 'theme', default: 'light' } }
|
|
94
|
+
configs.push({
|
|
95
|
+
localKey,
|
|
96
|
+
from: config.from || localKey,
|
|
97
|
+
defaultValue: config.default,
|
|
98
|
+
hasDefault: 'default' in config
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return configs;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 处理 inject 配置
|
|
107
|
+
* 在组件 setup 中调用,从父组件获取数据
|
|
108
|
+
*
|
|
109
|
+
* @param schema Schema 节点
|
|
110
|
+
* @returns inject 的值对象,可合并到 props 或 attrs
|
|
111
|
+
*/
|
|
112
|
+
export function setupInject(schema) {
|
|
113
|
+
const configs = normalizeInjectConfig(schema.inject);
|
|
114
|
+
if (configs.length === 0) {
|
|
115
|
+
return {};
|
|
116
|
+
}
|
|
117
|
+
const result = {};
|
|
118
|
+
for (const config of configs) {
|
|
119
|
+
const { localKey, from, defaultValue, hasDefault } = config;
|
|
120
|
+
// 使用 Vue 的 inject 获取值
|
|
121
|
+
const value = hasDefault
|
|
122
|
+
? inject(from, defaultValue)
|
|
123
|
+
: inject(from);
|
|
124
|
+
result[localKey] = value;
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 在 setup 中同时处理 provide 和 inject
|
|
130
|
+
*
|
|
131
|
+
* @param schema Schema 节点
|
|
132
|
+
* @param ctx 运行时上下文
|
|
133
|
+
* @returns inject 的值对象
|
|
134
|
+
*/
|
|
135
|
+
export function setupProvideInject(schema, ctx) {
|
|
136
|
+
setupProvide(schema, ctx);
|
|
137
|
+
return setupInject(schema);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=provide-inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provide-inject.js","sourceRoot":"","sources":["../../src/features/provide-inject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ref 支持
|
|
3
|
+
*
|
|
4
|
+
* 实现 Vue 的模板引用功能,允许在 Schema 中声明 ref,
|
|
5
|
+
* 并通过 useVario 返回的 refs 对象访问组件实例
|
|
6
|
+
*/
|
|
7
|
+
import { type Ref } from 'vue';
|
|
8
|
+
import type { VNode } from 'vue';
|
|
9
|
+
import type { VueSchemaNode } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Refs 注册表
|
|
12
|
+
* 存储所有通过 ref 属性声明的组件引用
|
|
13
|
+
*
|
|
14
|
+
* 使用 Proxy 实现动态访问:用户可以通过 refs.xxx 访问任何 ref,
|
|
15
|
+
* 如果 ref 不存在会自动创建(懒加载)
|
|
16
|
+
*/
|
|
17
|
+
export declare class RefsRegistry {
|
|
18
|
+
private refs;
|
|
19
|
+
private _proxy;
|
|
20
|
+
/**
|
|
21
|
+
* 注册一个 ref
|
|
22
|
+
*/
|
|
23
|
+
register(name: string): Ref<any>;
|
|
24
|
+
/**
|
|
25
|
+
* 获取所有 refs(返回动态 Proxy,可以访问后续添加的 ref)
|
|
26
|
+
*/
|
|
27
|
+
getAll(): Record<string, Ref<any>>;
|
|
28
|
+
/**
|
|
29
|
+
* 获取指定的 ref
|
|
30
|
+
*/
|
|
31
|
+
get(name: string): Ref<any> | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* 清除所有 refs(组件卸载时调用)
|
|
34
|
+
*/
|
|
35
|
+
clear(): void;
|
|
36
|
+
/**
|
|
37
|
+
* 移除指定的 ref
|
|
38
|
+
*/
|
|
39
|
+
remove(name: string): boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 为 VNode 添加 ref 处理
|
|
43
|
+
*/
|
|
44
|
+
export declare function attachRef(vnode: VNode, schema: VueSchemaNode, refsRegistry: RefsRegistry): VNode;
|
|
45
|
+
//# sourceMappingURL=refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/features/refs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,CAAA;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,MAAM,CAAwC;IAEtD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;IAOhC;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAwBlC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS;IAIvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG9B;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,YAAY,GACzB,KAAK,CAqCP"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ref 支持
|
|
3
|
+
*
|
|
4
|
+
* 实现 Vue 的模板引用功能,允许在 Schema 中声明 ref,
|
|
5
|
+
* 并通过 useVario 返回的 refs 对象访问组件实例
|
|
6
|
+
*/
|
|
7
|
+
import { ref } from 'vue';
|
|
8
|
+
/**
|
|
9
|
+
* Refs 注册表
|
|
10
|
+
* 存储所有通过 ref 属性声明的组件引用
|
|
11
|
+
*
|
|
12
|
+
* 使用 Proxy 实现动态访问:用户可以通过 refs.xxx 访问任何 ref,
|
|
13
|
+
* 如果 ref 不存在会自动创建(懒加载)
|
|
14
|
+
*/
|
|
15
|
+
export class RefsRegistry {
|
|
16
|
+
refs = new Map();
|
|
17
|
+
_proxy = null;
|
|
18
|
+
/**
|
|
19
|
+
* 注册一个 ref
|
|
20
|
+
*/
|
|
21
|
+
register(name) {
|
|
22
|
+
if (!this.refs.has(name)) {
|
|
23
|
+
this.refs.set(name, ref(null));
|
|
24
|
+
}
|
|
25
|
+
return this.refs.get(name);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 获取所有 refs(返回动态 Proxy,可以访问后续添加的 ref)
|
|
29
|
+
*/
|
|
30
|
+
getAll() {
|
|
31
|
+
if (!this._proxy) {
|
|
32
|
+
this._proxy = new Proxy({}, {
|
|
33
|
+
get: (_, prop) => {
|
|
34
|
+
// 自动注册并返回 ref
|
|
35
|
+
return this.register(prop);
|
|
36
|
+
},
|
|
37
|
+
ownKeys: () => {
|
|
38
|
+
return Array.from(this.refs.keys());
|
|
39
|
+
},
|
|
40
|
+
getOwnPropertyDescriptor: (_, prop) => {
|
|
41
|
+
if (this.refs.has(prop)) {
|
|
42
|
+
return { enumerable: true, configurable: true, value: this.refs.get(prop) };
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
},
|
|
46
|
+
has: (_, prop) => {
|
|
47
|
+
return this.refs.has(prop);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return this._proxy;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 获取指定的 ref
|
|
55
|
+
*/
|
|
56
|
+
get(name) {
|
|
57
|
+
return this.refs.get(name);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 清除所有 refs(组件卸载时调用)
|
|
61
|
+
*/
|
|
62
|
+
clear() {
|
|
63
|
+
this.refs.clear();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 移除指定的 ref
|
|
67
|
+
*/
|
|
68
|
+
remove(name) {
|
|
69
|
+
return this.refs.delete(name);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 为 VNode 添加 ref 处理
|
|
74
|
+
*/
|
|
75
|
+
export function attachRef(vnode, schema, refsRegistry) {
|
|
76
|
+
if (!schema.ref) {
|
|
77
|
+
return vnode;
|
|
78
|
+
}
|
|
79
|
+
const refValue = refsRegistry.register(schema.ref);
|
|
80
|
+
// 使用类型断言处理 ref(Vue 的 ref 类型比较复杂)
|
|
81
|
+
const vnodeAny = vnode;
|
|
82
|
+
// 如果 vnode 已经有 ref,需要合并处理
|
|
83
|
+
if (vnodeAny.ref) {
|
|
84
|
+
const existingRef = vnodeAny.ref;
|
|
85
|
+
const refCallback = (el) => {
|
|
86
|
+
// 调用原有的 ref
|
|
87
|
+
if (typeof existingRef === 'function') {
|
|
88
|
+
try {
|
|
89
|
+
existingRef(el);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
// 忽略错误
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (existingRef && typeof existingRef === 'object' && 'value' in existingRef) {
|
|
96
|
+
try {
|
|
97
|
+
existingRef.value = el;
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
// 忽略错误
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 设置到我们的 ref
|
|
104
|
+
refValue.value = el;
|
|
105
|
+
};
|
|
106
|
+
vnodeAny.ref = refCallback;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
vnodeAny.ref = refValue;
|
|
110
|
+
}
|
|
111
|
+
return vnode;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/features/refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Teleport 支持
|
|
3
|
+
*
|
|
4
|
+
* 将组件传送到指定的 DOM 节点
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - 支持 CSS 选择器目标
|
|
8
|
+
* - 支持 boolean(true = body)
|
|
9
|
+
* - 优雅地处理空 children
|
|
10
|
+
*/
|
|
11
|
+
import { type VNode } from 'vue';
|
|
12
|
+
/**
|
|
13
|
+
* 创建 Teleport VNode
|
|
14
|
+
*
|
|
15
|
+
* @param target 传送目标(CSS 选择器或 true 表示 body)
|
|
16
|
+
* @param children 子节点
|
|
17
|
+
*/
|
|
18
|
+
export declare function createTeleport(target: string | boolean, children: VNode | VNode[] | null): VNode;
|
|
19
|
+
/**
|
|
20
|
+
* 检查是否需要 teleport
|
|
21
|
+
*/
|
|
22
|
+
export declare function shouldTeleport(target: string | boolean | undefined): target is string | boolean;
|
|
23
|
+
//# sourceMappingURL=teleport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teleport.d.ts","sourceRoot":"","sources":["../../src/features/teleport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,KAAK,CAAA;AAE7C;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,GAAG,OAAO,EACxB,QAAQ,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI,GAC/B,KAAK,CAQP;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM,GAAG,OAAO,CAE/F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Teleport 支持
|
|
3
|
+
*
|
|
4
|
+
* 将组件传送到指定的 DOM 节点
|
|
5
|
+
*
|
|
6
|
+
* 特性:
|
|
7
|
+
* - 支持 CSS 选择器目标
|
|
8
|
+
* - 支持 boolean(true = body)
|
|
9
|
+
* - 优雅地处理空 children
|
|
10
|
+
*/
|
|
11
|
+
import { h, Teleport } from 'vue';
|
|
12
|
+
/**
|
|
13
|
+
* 创建 Teleport VNode
|
|
14
|
+
*
|
|
15
|
+
* @param target 传送目标(CSS 选择器或 true 表示 body)
|
|
16
|
+
* @param children 子节点
|
|
17
|
+
*/
|
|
18
|
+
export function createTeleport(target, children) {
|
|
19
|
+
const to = target === true ? 'body' : target;
|
|
20
|
+
const normalizedChildren = children
|
|
21
|
+
? (Array.isArray(children) ? children : [children])
|
|
22
|
+
: [];
|
|
23
|
+
// Teleport 需要使用 as any 来绑定类型
|
|
24
|
+
return h(Teleport, { to }, normalizedChildren);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 检查是否需要 teleport
|
|
28
|
+
*/
|
|
29
|
+
export function shouldTeleport(target) {
|
|
30
|
+
return target !== undefined && target !== false;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=teleport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teleport.js","sourceRoot":"","sources":["../../src/features/teleport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAc,MAAM,KAAK,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAwB,EACxB,QAAgC;IAEhC,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,MAAM,kBAAkB,GAAG,QAAQ;QACjC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC,EAAE,CAAA;IAEN,6BAA6B;IAC7B,OAAO,CAAC,CAAC,QAAe,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAA;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoC;IACjE,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内置验证器模块
|
|
3
|
+
*
|
|
4
|
+
* 提供常用的表单验证规则:
|
|
5
|
+
* - 必填验证
|
|
6
|
+
* - 格式验证(邮箱、URL、手机号等)
|
|
7
|
+
* - 长度验证
|
|
8
|
+
* - 数值范围验证
|
|
9
|
+
* - 正则匹配
|
|
10
|
+
* - 自定义验证
|
|
11
|
+
*/
|
|
12
|
+
import type { ValidateConfig, ValidateRule } from '@vario/schema';
|
|
13
|
+
/**
|
|
14
|
+
* 验证结果
|
|
15
|
+
*/
|
|
16
|
+
export interface ValidationResult {
|
|
17
|
+
/** 是否通过验证 */
|
|
18
|
+
valid: boolean;
|
|
19
|
+
/** 错误消息(验证失败时) */
|
|
20
|
+
message?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 执行单个验证规则
|
|
24
|
+
*/
|
|
25
|
+
export declare const executeRule: (value: unknown, rule: ValidateRule, ctx?: unknown) => Promise<ValidationResult>;
|
|
26
|
+
/**
|
|
27
|
+
* 规范化验证配置
|
|
28
|
+
*/
|
|
29
|
+
export declare const normalizeValidateConfig: (config: ValidateConfig) => {
|
|
30
|
+
rules: ValidateRule[];
|
|
31
|
+
trigger: ("change" | "blur" | "submit")[];
|
|
32
|
+
message?: string;
|
|
33
|
+
errorPath?: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* 执行完整验证
|
|
37
|
+
*/
|
|
38
|
+
export declare const validate: (value: unknown, config: ValidateConfig, ctx?: unknown) => Promise<ValidationResult>;
|
|
39
|
+
/**
|
|
40
|
+
* 创建验证处理器(用于绑定到事件)
|
|
41
|
+
*/
|
|
42
|
+
export declare const createValidationHandler: (modelPath: string, config: ValidateConfig, setError: (path: string, message: string | null) => void, ctx?: unknown) => (value: unknown) => Promise<boolean>;
|
|
43
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/features/validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EAIb,MAAM,eAAe,CAAA;AAEtB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,KAAK,EAAE,OAAO,CAAA;IACd,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAyKD;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,OAAO,EACd,MAAM,YAAY,EAClB,MAAM,OAAO,KACZ,OAAO,CAAC,gBAAgB,CAoD1B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,cAAc,KAAG;IAC/D,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,OAAO,EAAE,CAAC,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CA2CnB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GACnB,OAAO,OAAO,EACd,QAAQ,cAAc,EACtB,MAAM,OAAO,KACZ,OAAO,CAAC,gBAAgB,CAc1B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,WAAW,MAAM,EACjB,QAAQ,cAAc,EACtB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,EACxD,MAAM,OAAO,MAKC,OAAO,OAAO,qBAW7B,CAAA"}
|