@qin-ui/vant-pro 1.0.4 → 1.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.
Files changed (88) hide show
  1. package/AI-CONTEXT.md +165 -23
  2. package/LICENSE +9 -0
  3. package/README.md +1 -1
  4. package/api.json +27 -22
  5. package/bin/init-ai.mjs +242 -52
  6. package/es/component-provider/{index-DC_k4_R3.js → index-cldbPMDQ.js} +5 -4
  7. package/es/component-provider/index-cldbPMDQ.js.map +1 -0
  8. package/es/component-provider/index.js +2 -1
  9. package/es/component-provider/index.js.map +1 -0
  10. package/es/components/component-provider/components/index.vue.d.ts +27 -0
  11. package/es/components/component-provider/components/index.vue.d.ts.map +1 -0
  12. package/es/components/component-provider/constants/index.d.ts +16 -0
  13. package/es/components/component-provider/constants/index.d.ts.map +1 -0
  14. package/es/components/component-provider/index.d.ts +4 -0
  15. package/es/components/component-provider/index.d.ts.map +1 -0
  16. package/es/components/component-provider/types/index.d.ts +16 -0
  17. package/es/components/component-provider/types/index.d.ts.map +1 -0
  18. package/es/components/form/components/BaseField/index.vue.d.ts +1323 -0
  19. package/es/components/form/components/BaseField/index.vue.d.ts.map +1 -0
  20. package/es/components/form/components/BaseField/utils/index.d.ts +3 -0
  21. package/es/components/form/components/BaseField/utils/index.d.ts.map +1 -0
  22. package/es/components/form/components/BaseFormItem/index.vue.d.ts +7 -0
  23. package/es/components/form/components/BaseFormItem/index.vue.d.ts.map +1 -0
  24. package/es/components/form/components/ContainerFragment/index.vue.d.ts +23 -0
  25. package/es/components/form/components/ContainerFragment/index.vue.d.ts.map +1 -0
  26. package/es/components/form/components/GroupedFieldAttrs/index.vue.d.ts +24 -0
  27. package/es/components/form/components/GroupedFieldAttrs/index.vue.d.ts.map +1 -0
  28. package/es/components/form/components/PathProvider/index.vue.d.ts +23 -0
  29. package/es/components/form/components/PathProvider/index.vue.d.ts.map +1 -0
  30. package/es/components/form/components/ProForm/index.vue.d.ts +34 -0
  31. package/es/components/form/components/ProForm/index.vue.d.ts.map +1 -0
  32. package/es/components/form/components/SlotComponent/index.vue.d.ts +7 -0
  33. package/es/components/form/components/SlotComponent/index.vue.d.ts.map +1 -0
  34. package/es/components/form/components/index.d.ts +12 -0
  35. package/es/components/form/components/index.d.ts.map +1 -0
  36. package/es/components/form/constants/index.d.ts +62 -0
  37. package/es/components/form/constants/index.d.ts.map +1 -0
  38. package/es/components/form/hooks/index.d.ts +6 -0
  39. package/es/components/form/hooks/index.d.ts.map +1 -0
  40. package/es/components/form/hooks/useFields.d.ts +57 -0
  41. package/es/components/form/hooks/useFields.d.ts.map +1 -0
  42. package/es/components/form/hooks/useForm.d.ts +101 -0
  43. package/es/components/form/hooks/useForm.d.ts.map +1 -0
  44. package/es/components/form/hooks/useFormPopup.d.ts +57 -0
  45. package/es/components/form/hooks/useFormPopup.d.ts.map +1 -0
  46. package/es/components/form/hooks/useFormRef.d.ts +30 -0
  47. package/es/components/form/hooks/useFormRef.d.ts.map +1 -0
  48. package/es/components/form/index.d.ts +7 -0
  49. package/es/components/form/index.d.ts.map +1 -0
  50. package/es/components/form/types/index.d.ts +152 -0
  51. package/es/components/form/types/index.d.ts.map +1 -0
  52. package/es/form/index.js +11 -7
  53. package/es/form/index.js.map +1 -0
  54. package/es/index.d.ts +58 -954
  55. package/es/index.d.ts.map +1 -0
  56. package/es/index.js +10 -21
  57. package/es/index.js.map +1 -0
  58. package/es/shared/core/index.d.ts +6 -0
  59. package/es/shared/core/index.d.ts.map +1 -0
  60. package/es/shared/ui/index.d.ts +2 -0
  61. package/es/shared/ui/index.d.ts.map +1 -0
  62. package/package.json +11 -12
  63. package/src/components/component-provider/components/index.vue +67 -0
  64. package/src/components/component-provider/constants/index.ts +110 -0
  65. package/src/components/component-provider/index.ts +6 -0
  66. package/src/components/component-provider/types/index.ts +31 -0
  67. package/src/components/form/components/BaseField/index.vue +340 -0
  68. package/src/components/form/components/BaseField/utils/index.ts +14 -0
  69. package/src/components/form/components/BaseFormItem/index.vue +77 -0
  70. package/src/components/form/components/ContainerFragment/index.vue +24 -0
  71. package/src/components/form/components/GroupedFieldAttrs/index.vue +51 -0
  72. package/src/components/form/components/PathProvider/index.vue +18 -0
  73. package/src/components/form/components/ProForm/index.vue +114 -0
  74. package/src/components/form/components/SlotComponent/index.vue +26 -0
  75. package/src/components/form/components/index.ts +15 -0
  76. package/src/components/form/constants/index.ts +109 -0
  77. package/src/components/form/hooks/index.ts +6 -0
  78. package/src/components/form/hooks/useFields.ts +67 -0
  79. package/src/components/form/hooks/useForm.ts +126 -0
  80. package/src/components/form/hooks/useFormPopup.ts +111 -0
  81. package/src/components/form/hooks/useFormRef.ts +35 -0
  82. package/src/components/form/index.ts +27 -0
  83. package/src/components/form/types/index.ts +220 -0
  84. package/src/index.ts +62 -0
  85. package/src/shared/core/index.ts +37 -0
  86. package/src/shared/ui/index.ts +26 -0
  87. package/es/core/index-B5vvm4Fj.js +0 -236
  88. package/es/vendor/utils/lodash-es-DN4QDiDm.js +0 -1079
package/bin/init-ai.mjs CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @qin-ui/* AI 上下文初始化 CLI 工具
4
+ * @qin-ui/vant-pro AI 上下文初始化 CLI 工具
5
5
  *
6
- * 遵循 Agentic Collaboration Standard (ACS),
7
- * 在消费方项目中自动生成统一的 .agents 规范配置文件。
6
+ * 在消费方项目中生成分层 AI 上下文文件,使 AI 工具能够:
7
+ * 1. 理解 @qin-ui/vant-pro 的 Schema 驱动架构
8
+ * 2. 掌握属性透传规则(van-field 作为表单项容器,属性分流到 Field 层 vs 输入控件层)
9
+ * 3. 快速获取完整 API 参考和 vant 官方文档查阅指南
8
10
  *
9
11
  * 用法:
10
12
  * npx @qin-ui/vant-pro init-ai
@@ -28,46 +30,202 @@ const PKG_SHORT = PKG_NAME.replace(/^@qin-ui\//, '');
28
30
 
29
31
  // ==================== 终端颜色 ====================
30
32
 
31
- const green = (s) => `\x1b[32m${s}\x1b[0m`;
32
- const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
33
- const bold = (s) => `\x1b[1m${s}\x1b[0m`;
34
- const red = (s) => `\x1b[31m${s}\x1b[0m`;
33
+ const green = s => `\x1b[32m${s}\x1b[0m`;
34
+ const cyan = s => `\x1b[36m${s}\x1b[0m`;
35
+ const bold = s => `\x1b[1m${s}\x1b[0m`;
36
+ const yellow = s => `\x1b[33m${s}\x1b[0m`;
37
+ const dim = s => `\x1b[2m${s}\x1b[0m`;
35
38
 
36
- // ==================== 内容生成 ====================
39
+ // ==================== 内容读取 ====================
37
40
 
38
- function getAiContextContent() {
39
- const filePath = path.join(PKG_ROOT, 'AI-CONTEXT.md');
41
+ function readPackageFile(filename) {
42
+ const filePath = path.join(PKG_ROOT, filename);
40
43
  if (fs.existsSync(filePath)) {
41
44
  return fs.readFileSync(filePath, 'utf-8').trim();
42
45
  }
43
- return `# ${PKG_NAME}\n\n> 基于 Vue 3 的配置驱动组件库。`;
46
+ return null;
47
+ }
48
+
49
+ function getAiContextContent() {
50
+ return readPackageFile('AI-CONTEXT.md') || `# ${PKG_NAME}\n\n> 基于 Vue 3 的配置驱动组件库。`;
51
+ }
52
+
53
+ function getReadmeContent() {
54
+ return readPackageFile('README.md') || '';
44
55
  }
45
56
 
46
- function getUnifiedAgentContent() {
57
+ function getApiJsonContent() {
58
+ try {
59
+ const raw = readPackageFile('api.json');
60
+ if (!raw) return null;
61
+ return JSON.parse(raw);
62
+ } catch {
63
+ return null;
64
+ }
65
+ }
66
+
67
+ // ==================== 内容生成 ====================
68
+
69
+ /**
70
+ * 生成 rules 文件内容(Instructions 层)
71
+ * 包含:架构关系、透传规则、反模式、Popup 模式、vant 参考链接
72
+ */
73
+ function getRulesContent() {
47
74
  const aiContext = getAiContextContent();
48
- const core = [
49
- aiContext,
50
- '',
51
- '## 完整 API 参考',
52
- '',
53
- `使用 \`${PKG_NAME}\` 时,请阅读以下文件获取完整的 API 定义、类型签名和使用示例:`,
54
- `- \`node_modules/${PKG_NAME}/README.md\` — 详细使用文档和代码示例`,
55
- `- \`node_modules/${PKG_NAME}/api.json\` — 结构化 API 元数据(组件、Hook、类型的签名和 JSDoc 示例)`,
56
- '',
57
- ].join('\n');
58
75
 
59
- // 包含兼容性的 Frontmatter(如 Cursor 支持的 globs 等)
60
76
  return [
61
77
  '---',
62
- `description: "${PKG_NAME} 组件库使用规范"`,
78
+ `description: "${PKG_NAME} 组件库使用规范 — Schema 驱动、van-field 属性分层"`,
63
79
  'globs: ["**/*.vue", "**/*.ts", "**/*.tsx"]',
64
80
  'alwaysApply: false',
65
81
  '---',
66
82
  '',
67
- core,
83
+ aiContext,
84
+ '',
85
+ '---',
86
+ '',
87
+ '## 📌 本地参考文件',
88
+ '',
89
+ '本规则文件提供了核心架构和用法指南。需要完整 API 参考时,请阅读以下文件:',
90
+ '',
91
+ `- **\`.agents/docs/${PKG_SHORT}-api.md\`** — 完整 API 文档(组件、Hooks、类型、Field 配置参考)`,
92
+ `- **\`node_modules/${PKG_NAME}/api.json\`** — 结构化 API 元数据(函数签名、类型定义)`,
93
+ '',
94
+ '## 🌐 外部参考',
95
+ '',
96
+ '- **[vant v4 官方文档](https://vant-ui.com/)** — vant 全部组件 API 文档(编写 Field 配置中透传属性前必查)',
97
+ '',
68
98
  ].join('\n');
69
99
  }
70
100
 
101
+ /**
102
+ * 生成 API 文档内容(Resources 层)
103
+ * 从 README.md + api.json 合并提取完整 API 参考
104
+ */
105
+ function getApiDocContent() {
106
+ const readme = getReadmeContent();
107
+ const apiJson = getApiJsonContent();
108
+
109
+ const sections = [];
110
+
111
+ sections.push(`# ${PKG_NAME} — 完整 API 参考`, '');
112
+ sections.push(`> 自动生成自 README.md 和 api.json。版本: ${PKG_JSON.version}`, '');
113
+
114
+ // README 内容(已包含完整的使用文档)
115
+ if (readme) {
116
+ sections.push(readme);
117
+ sections.push('');
118
+ }
119
+
120
+ // 结构化 API 元数据
121
+ if (apiJson && apiJson.api && apiJson.api.length > 0) {
122
+ sections.push('---');
123
+ sections.push('');
124
+ sections.push('## 📊 结构化 API 元数据(自动提取自源码 JSDoc)');
125
+ sections.push('');
126
+
127
+ for (const item of apiJson.api) {
128
+ const typeLabel = {
129
+ component: '🧩 组件',
130
+ function: '🔧 函数/Hook',
131
+ type: '📐 类型',
132
+ interface: '📋 接口',
133
+ constant: '📌 常量',
134
+ }[item.type] || '📄';
135
+
136
+ sections.push(`### ${typeLabel} \`${item.name}\``);
137
+ sections.push('');
138
+ sections.push(`**类型:** ${item.type}`);
139
+ if (item.signature) {
140
+ sections.push('');
141
+ sections.push('```typescript');
142
+ sections.push(item.signature);
143
+ sections.push('```');
144
+ }
145
+ if (item.description) {
146
+ sections.push('');
147
+ sections.push(item.description);
148
+ }
149
+
150
+ if (item.typeParams && item.typeParams.length > 0) {
151
+ sections.push('');
152
+ sections.push('**泛型参数:**');
153
+ for (const tp of item.typeParams) {
154
+ const extras = [];
155
+ if (tp.extends) extras.push(`extends ${tp.extends}`);
156
+ if (tp.default) extras.push(`默认 ${tp.default}`);
157
+ const extra = extras.length ? ` (${extras.join(', ')})` : '';
158
+ sections.push(`- \`${tp.name}\`${extra}`);
159
+ }
160
+ }
161
+
162
+ if (item.params && item.params.length > 0) {
163
+ sections.push('');
164
+ sections.push('**参数:**');
165
+ sections.push('');
166
+ sections.push('| 参数名 | 类型 | 可选 | 描述 |');
167
+ sections.push('| :--- | :--- | :--- | :--- |');
168
+ for (const p of item.params) {
169
+ sections.push(`| \`${p.name}\` | \`${p.type}\` | ${p.optional ? '是' : '否'} | ${p.description} |`);
170
+ }
171
+ }
172
+
173
+ if (item.returns) {
174
+ sections.push('');
175
+ sections.push(`**返回值:** ${item.returns}`);
176
+ }
177
+
178
+ if (item.examples && item.examples.length > 0) {
179
+ sections.push('');
180
+ sections.push('**示例:**');
181
+ for (const ex of item.examples) {
182
+ sections.push('');
183
+ sections.push(ex);
184
+ }
185
+ }
186
+
187
+ sections.push('');
188
+ sections.push('---');
189
+ sections.push('');
190
+ }
191
+ }
192
+
193
+ // vant 官方文档参考
194
+ sections.push('---');
195
+ sections.push('');
196
+ sections.push('## 🔗 vant v4 组件 API 参考');
197
+ sections.push('');
198
+ sections.push(`${PKG_NAME} 基于 vant v4 移动端组件库封装。所有 Field 配置中的透传属性最终绑定到 vant 组件。`);
199
+ sections.push('');
200
+ sections.push('编写 Field 配置中的输入控件属性前,务必查阅 vant 官方文档确认属性名和类型:');
201
+ sections.push('');
202
+ sections.push('- **[vant v4 官方文档](https://vant-ui.com/)** — 全部组件 Demo + API 文档');
203
+ sections.push('');
204
+ sections.push('### vant-pro 与 vant 的关键对应关系');
205
+ sections.push('');
206
+ sections.push('| Field `component` | vant 组件 | 文档链接 |');
207
+ sections.push('|:--|:--|:--|');
208
+ sections.push('| `field` | Field | https://vant-ui.com/#/field |');
209
+ sections.push('| `switch` | Switch | https://vant-ui.com/#/switch |');
210
+ sections.push('| `stepper` | Stepper | https://vant-ui.com/#/stepper |');
211
+ sections.push('| `rate` | Rate | https://vant-ui.com/#/rate |');
212
+ sections.push('| `slider` | Slider | https://vant-ui.com/#/slider |');
213
+ sections.push('| `uploader` | Uploader | https://vant-ui.com/#/uploader |');
214
+ sections.push('| `checkbox-group` | CheckboxGroup | https://vant-ui.com/#/checkbox |');
215
+ sections.push('| `radio-group` | RadioGroup | https://vant-ui.com/#/radio |');
216
+ sections.push('| `picker` | Picker | https://vant-ui.com/#/picker |');
217
+ sections.push('| `date-picker` | DatePicker | https://vant-ui.com/#/date-picker |');
218
+ sections.push('| `time-picker` | TimePicker | https://vant-ui.com/#/time-picker |');
219
+ sections.push('| `cascader` | Cascader | https://vant-ui.com/#/cascader |');
220
+ sections.push('| `area` | Area | https://vant-ui.com/#/area |');
221
+ sections.push('| `signature` | Signature | https://vant-ui.com/#/signature |');
222
+ sections.push('| `button` | Button | https://vant-ui.com/#/button |');
223
+ sections.push('');
224
+ sections.push('> 注意:vant 使用 `modelValue` 作为 v-model 绑定属性名,使用 `clearable` 而非 `allowClear`。');
225
+
226
+ return sections.join('\n');
227
+ }
228
+
71
229
  // ==================== 文件写入 ====================
72
230
 
73
231
  function ensureDir(dirPath) {
@@ -76,31 +234,43 @@ function ensureDir(dirPath) {
76
234
  }
77
235
  }
78
236
 
237
+ function writeFileWithLog(filePath, content, label) {
238
+ const dir = path.dirname(filePath);
239
+ ensureDir(dir);
240
+ const existed = fs.existsSync(filePath);
241
+ fs.writeFileSync(filePath, content, 'utf-8');
242
+ const status = existed ? yellow('[更新]') : green('[创建]');
243
+ console.log(` ${status} ${cyan(label)}`);
244
+ }
245
+
79
246
  // ==================== CLI 入口 ====================
80
247
 
81
248
  function printHelp() {
82
249
  console.log(`
83
- ${bold(`${PKG_NAME} CLI`)}
250
+ ${bold(`${PKG_NAME} CLI — AI 上下文初始化`)}
84
251
 
85
252
  ${bold('用法:')}
86
253
  npx ${PKG_NAME} init-ai
87
254
 
88
- ${bold('命令:')}
89
- init-ai 在当前项目中生成统一的 .agents 规范配置文件
255
+ ${bold('说明:')}
256
+ 在项目中生成分层 AI 上下文文件,使 AI 工具能够深度理解和规范使用 ${PKG_NAME}。
257
+
258
+ 生成的文件结构:
259
+ .agents/
260
+ rules/
261
+ ${PKG_SHORT}.md 规则文件(架构、透传规则、反模式、Popup 模式)
262
+ docs/
263
+ ${PKG_SHORT}-api.md API 参考(完整文档 + 结构化元数据 + vant 组件对照)
90
264
 
91
265
  ${bold('选项:')}
92
266
  --help 显示帮助信息
93
-
94
- ${bold('说明:')}
95
- 该命令将采用统一的 Agentic 标准,在项目的 .agents/rules/ 目录下
96
- 生成上下文文件。兼容支持读取 .agents 的主流 AI IDE 和 CLI 工具。
97
267
  `);
98
268
  }
99
269
 
100
270
  function main() {
101
271
  const args = process.argv.slice(2);
102
- const subcommand = args.find((a) => !a.startsWith('-'));
103
- const flags = args.filter((a) => a.startsWith('-'));
272
+ const subcommand = args.find(a => !a.startsWith('-'));
273
+ const flags = args.filter(a => a.startsWith('-'));
104
274
 
105
275
  if (!subcommand || flags.includes('--help') || flags.includes('-h')) {
106
276
  printHelp();
@@ -108,35 +278,55 @@ function main() {
108
278
  }
109
279
 
110
280
  if (subcommand !== 'init-ai') {
111
- console.error(red(`\n 未知命令: ${subcommand}\n`));
281
+ console.error(`\n 未知命令: ${subcommand}\n`);
112
282
  printHelp();
113
283
  process.exit(1);
114
284
  }
115
285
 
116
286
  console.log('');
117
- console.log(bold(`📦 ${PKG_NAME} — AI 上下文初始化 (ACS 标准)`));
287
+ console.log(bold(`📦 ${PKG_NAME} — AI 上下文初始化 v${PKG_JSON.version}`));
288
+ console.log(dim(` 基于 vant v4 的 Schema 驱动移动端表单组件库`));
118
289
  console.log('');
119
-
120
- const content = getUnifiedAgentContent();
121
- const dirPath = '.agents/rules';
122
- const fileName = `${PKG_SHORT}.md`;
123
-
124
- const fullDir = path.join(process.cwd(), dirPath);
125
- const fullPath = path.join(fullDir, fileName);
126
290
 
127
- ensureDir(fullDir);
128
- fs.writeFileSync(fullPath, content, 'utf-8');
291
+ // 1. 生成 Rules 文件
292
+ console.log(bold('📋 规则层 (Rules)'));
293
+ const rulesContent = getRulesContent();
294
+ writeFileWithLog(
295
+ path.join(process.cwd(), '.agents/rules', `${PKG_SHORT}.md`),
296
+ rulesContent,
297
+ `.agents/rules/${PKG_SHORT}.md`
298
+ );
299
+ console.log(dim(' → 架构概览、属性分层(Field 容器 / 输入控件)、渐进用法、反模式、Popup 弹窗模式'));
300
+ console.log('');
129
301
 
130
- const relPath = path.join(dirPath, fileName);
131
- console.log(` ${green('✔')} ${cyan(relPath)} ${green('[created/updated]')}`);
302
+ // 2. 生成 API 文档
303
+ console.log(bold('📖 参考层 (Docs)'));
304
+ const apiDocContent = getApiDocContent();
305
+ writeFileWithLog(
306
+ path.join(process.cwd(), '.agents/docs', `${PKG_SHORT}-api.md`),
307
+ apiDocContent,
308
+ `.agents/docs/${PKG_SHORT}-api.md`
309
+ );
310
+ console.log(dim(' → 完整 README 文档 + 结构化 API 元数据 + vant v4 组件对照表'));
311
+ console.log('');
132
312
 
313
+ // 3. 完成提示
314
+ console.log(green('✅ 完成!已生成分层 AI 上下文文件。'));
133
315
  console.log('');
134
- console.log(green(' 完成!已生成统一标准规则文件。'));
316
+ console.log(`${bold('📂 生成的文件:')}`);
317
+ console.log(` ${cyan('.agents/')}`);
318
+ console.log(` ├── ${cyan('rules/')}`);
319
+ console.log(` │ └── ${cyan(PKG_SHORT + '.md')} ${dim('← 核心规则(AI 优先读取)')}`);
320
+ console.log(` └── ${cyan('docs/')}`);
321
+ console.log(` └── ${cyan(PKG_SHORT + '-api.md')} ${dim('← 完整 API 参考')}`);
322
+ console.log('');
323
+
324
+ console.log(`${bold('🔄 建议的下一步:')}`);
325
+ console.log(` 1. 提交 ${cyan('.agents/')} 目录到 Git 仓库,团队共享`);
326
+ console.log(` 2. 查阅 ${bold('vant v4 官方文档')}:`);
327
+ console.log(` ${cyan('https://vant-ui.com/')}`);
328
+ console.log(` 3. ${dim('(可选)了解 vant-pro 独有的 Popup 弹窗表单模式,移动端表单利器')}`);
135
329
  console.log('');
136
- console.log(`${bold('下一步:')}`);
137
- console.log(
138
- ` 将 ${cyan(dirPath)} 目录提交到 Git,团队即可自动享受 AI 增强\n`
139
- );
140
330
  }
141
331
 
142
332
  main();
@@ -1,5 +1,5 @@
1
+ import { getObject } from "@qin-ui/pro-components-core";
1
2
  import { defineComponent, provide, renderSlot } from "vue";
2
- import { g as getObject } from "../core/index-B5vvm4Fj.js";
3
3
  const INJECT_CONFIG = {
4
4
  "pro-form": {
5
5
  injectionKey: Symbol(""),
@@ -99,15 +99,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
99
99
  },
100
100
  setup(__props) {
101
101
  const props = __props;
102
- if (props.componentMap) {
103
- provide(INJECT_COMPONENTS, props.componentMap);
104
- }
105
102
  if (props.componentVars) {
106
103
  Object.entries(props.componentVars).forEach(([key, val]) => {
107
104
  const config = ensureInjectConfig(key);
108
105
  provide(config.injectionKey, { ...config.default, ...getObject(val) });
109
106
  });
110
107
  }
108
+ if (props.componentMap) {
109
+ provide(INJECT_COMPONENTS, props.componentMap);
110
+ }
111
111
  return (_ctx, _cache) => {
112
112
  return renderSlot(_ctx.$slots, "default");
113
113
  };
@@ -119,3 +119,4 @@ export {
119
119
  INJECT_CONFIG as a,
120
120
  getInjectConfig as g
121
121
  };
122
+ //# sourceMappingURL=index-cldbPMDQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cldbPMDQ.js","sources":["../../src/components/component-provider/constants/index.ts","../../src/components/component-provider/components/index.vue"],"sourcesContent":["import { RequiredComponentVars } from '../types';\nimport { InjectionKey, Component } from 'vue';\n\nexport type InjectConfigEntry<T = any> = {\n injectionKey: InjectionKey<T>;\n default: T;\n};\n\nexport const INJECT_CONFIG: {\n [key in keyof RequiredComponentVars]: {\n injectionKey: InjectionKey<RequiredComponentVars[key]>;\n default: RequiredComponentVars[key];\n };\n} = {\n 'pro-form': {\n injectionKey: Symbol(''),\n default: {\n inputAlign: 'right',\n errorMessageAlign: 'right',\n required: 'auto',\n scrollToError: true,\n scrollToErrorPosition: 'nearest',\n },\n },\n field: {\n injectionKey: Symbol(''),\n default: { clearable: true, placeholder: '请输入' },\n },\n switch: {\n injectionKey: Symbol(''),\n default: {},\n },\n stepper: {\n injectionKey: Symbol(''),\n default: {},\n },\n rate: {\n injectionKey: Symbol(''),\n default: {},\n },\n slider: {\n injectionKey: Symbol(''),\n default: {},\n },\n uploader: {\n injectionKey: Symbol(''),\n default: {},\n },\n 'checkbox-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n 'radio-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n picker: {\n injectionKey: Symbol(''),\n default: {},\n },\n 'date-picker': {\n injectionKey: Symbol(''),\n default: {},\n },\n 'time-picker': {\n injectionKey: Symbol(''),\n default: {},\n },\n cascader: {\n injectionKey: Symbol(''),\n default: {},\n },\n area: {\n injectionKey: Symbol(''),\n default: {},\n },\n signature: {\n injectionKey: Symbol(''),\n default: {},\n },\n button: {\n injectionKey: Symbol(''),\n default: {},\n },\n};\n\nexport const INJECT_COMPONENTS: InjectionKey<\n Partial<Record<string, Component>>\n> = Symbol('INJECT_COMPONENTS');\n\nconst DYNAMIC_INJECT_CONFIG: Record<string, InjectConfigEntry> =\n Object.create(null);\n\nexport const getInjectConfig = (key: string): InjectConfigEntry | undefined => {\n return (\n (INJECT_CONFIG as Record<string, InjectConfigEntry>)[key] ||\n DYNAMIC_INJECT_CONFIG[key]\n );\n};\n\nexport const ensureInjectConfig = (key: string): InjectConfigEntry => {\n const existing = getInjectConfig(key);\n if (existing) return existing;\n const created: InjectConfigEntry = {\n injectionKey: Symbol(`dynamic:${key}`),\n default: {},\n };\n DYNAMIC_INJECT_CONFIG[key] = created;\n return created;\n};\n","<script lang=\"ts\" setup>\n/**\n * @component ProComponentProvider\n * @description @qin-ui/vant-pro 全局配置提供者组件\n *\n * 用于在组件树的顶层配置所有子组件的全局默认属性。\n *\n * @param {ComponentVars} [componentVars] - 组件全局配置变量\n * @param {Record<ComponentName, any>} [componentMap] - 自定义组件映射\n *\n * @slot default - 子组件内容\n *\n * @example\n * ```vue\n * <ProComponentProvider\n * :componentVars=\"{ 'field': { placeholder: '请输入' } }\"\n * >\n * <ProForm :form=\"form\" :fields=\"fields\" />\n * </ProComponentProvider>\n * ```\n \n * @public\n */\nimport { ComponentVars } from '../types';\nimport { INJECT_COMPONENTS, ensureInjectConfig } from '../constants';\nimport { provide } from 'vue';\nimport { getObject } from '../../../shared/core';\nimport { ComponentName } from '../../form/constants';\n\ntype ComponentMap = Partial<Record<ComponentName, any>>;\n\ndefineOptions({\n name: 'ProComponentProvider',\n inheritAttrs: false,\n});\n\ntype Props = {\n /** 组件全局配置,可配置所有内置组件的默认属性 */\n componentVars?: ComponentVars;\n /** 自定义组件映射,用于替换或扩展内置组件 */\n componentMap?: ComponentMap;\n};\n\nconst props = defineProps<Props>();\n\n/*\n * 遍历 componentVars 的每个 key,获取或创建对应的 inject 配置\n * 将用户提供的值合并到默认值上,通过 provide 注入到子组件树\n * 子组件通过 inject(config.injectionKey) 获取合并后的配置\n */\nif (props.componentVars) {\n Object.entries(props.componentVars).forEach(([key, val]) => {\n const config = ensureInjectConfig(key);\n // 用户配置覆盖默认值\n provide(config.injectionKey, { ...config.default, ...getObject(val) });\n });\n}\n\n// 注入自定义组件映射,BaseField 在解析组件时会优先使用此映射\nif (props.componentMap) {\n provide(INJECT_COMPONENTS, props.componentMap);\n}\n</script>\n\n<template>\n <slot />\n</template>\n"],"names":["_renderSlot"],"mappings":";;AAQO,MAAM,gBAKT;AAAA,EACF,YAAY;AAAA,IACV,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,eAAe;AAAA,MACf,uBAAuB;AAAA,IAAA;AAAA,EACzB;AAAA,EAEF,OAAO;AAAA,IACL,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,MAAM,aAAa,MAAA;AAAA,EAAM;AAAA,EAEjD,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,SAAS;AAAA,IACP,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,MAAM;AAAA,IACJ,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,UAAU;AAAA,IACR,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,kBAAkB;AAAA,IAChB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,UAAU;AAAA,IACR,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,MAAM;AAAA,IACJ,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,WAAW;AAAA,IACT,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAEd;AAEO,MAAM,oBAET,OAAO,mBAAmB;AAE9B,MAAM,wBACJ,uBAAO,OAAO,IAAI;AAEb,MAAM,kBAAkB,CAAC,QAA+C;AAC7E,SACG,cAAoD,GAAG,KACxD,sBAAsB,GAAG;AAE7B;AAEO,MAAM,qBAAqB,CAAC,QAAmC;AACpE,QAAM,WAAW,gBAAgB,GAAG;AACpC,MAAI,SAAU,QAAO;AACrB,QAAM,UAA6B;AAAA,IACjC,cAAc,OAAO,WAAW,GAAG,EAAE;AAAA,IACrC,SAAS,CAAA;AAAA,EAAC;AAEZ,wBAAsB,GAAG,IAAI;AAC7B,SAAO;AACT;;;;;;;;;;;;AClEA,UAAM,QAAQ;AAOd,QAAI,MAAM,eAAe;AACvB,aAAO,QAAQ,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAC1D,cAAM,SAAS,mBAAmB,GAAG;AAErC,gBAAQ,OAAO,cAAc,EAAE,GAAG,OAAO,SAAS,GAAG,UAAU,GAAG,GAAG;AAAA,MACvE,CAAC;AAAA,IACH;AAGA,QAAI,MAAM,cAAc;AACtB,cAAQ,mBAAmB,MAAM,YAAY;AAAA,IAC/C;;aAIEA,WAAQ,KAAA,QAAA,SAAA;AAAA;;;"}
@@ -1,4 +1,5 @@
1
- import { _ } from "./index-DC_k4_R3.js";
1
+ import { _ } from "./index-cldbPMDQ.js";
2
2
  export {
3
3
  _ as default
4
4
  };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,27 @@
1
+ import { ComponentVars } from '../types';
2
+ import { ComponentName } from '../../form/constants';
3
+ type ComponentMap = Partial<Record<ComponentName, any>>;
4
+ type Props = {
5
+ /** 组件全局配置,可配置所有内置组件的默认属性 */
6
+ componentVars?: ComponentVars;
7
+ /** 自定义组件映射,用于替换或扩展内置组件 */
8
+ componentMap?: ComponentMap;
9
+ };
10
+ declare function __VLS_template(): {
11
+ attrs: Partial<{}>;
12
+ slots: {
13
+ default?(_: {}): any;
14
+ };
15
+ refs: {};
16
+ rootEl: any;
17
+ };
18
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
19
+ declare const __VLS_component: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
20
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
21
+ export default _default;
22
+ type __VLS_WithTemplateSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
27
+ //# sourceMappingURL=index.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/component-provider/components/index.vue"],"names":[],"mappings":"AAqEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;AAOxD,KAAK,KAAK,GAAG;IACX,4BAA4B;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,0BAA0B;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAyBF,iBAAS,cAAc;WAoBT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAQD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,sRAMnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { RequiredComponentVars } from '../types';
2
+ import { InjectionKey, Component } from 'vue';
3
+ export type InjectConfigEntry<T = any> = {
4
+ injectionKey: InjectionKey<T>;
5
+ default: T;
6
+ };
7
+ export declare const INJECT_CONFIG: {
8
+ [key in keyof RequiredComponentVars]: {
9
+ injectionKey: InjectionKey<RequiredComponentVars[key]>;
10
+ default: RequiredComponentVars[key];
11
+ };
12
+ };
13
+ export declare const INJECT_COMPONENTS: InjectionKey<Partial<Record<string, Component>>>;
14
+ export declare const getInjectConfig: (key: string) => InjectConfigEntry | undefined;
15
+ export declare const ensureInjectConfig: (key: string) => InjectConfigEntry;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/component-provider/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAE9C,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,GAAG,IAAI;IACvC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE;KACzB,GAAG,IAAI,MAAM,qBAAqB,GAAG;QACpC,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;KACrC;CAwEF,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CACL,CAAC;AAKhC,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,iBAAiB,GAAG,SAKjE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,KAAK,MAAM,KAAG,iBAShD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { default as ComponentProvider } from './components/index.vue';
2
+ export { type ComponentVars } from './types';
3
+ export default ComponentProvider;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/component-provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Base } from '../../form/types';
2
+ import { ProFormProps } from '../../form';
3
+ import { AllowedComponentProps } from 'vue';
4
+ import { GetComponentType, ComponentName } from '../../form/constants';
5
+ import { ComponentProps } from 'vue-component-type-helpers';
6
+ import { FormProps } from 'vant';
7
+ type PP<T extends Record<string, any>> = Partial<T & AllowedComponentProps>;
8
+ type FP<T extends Record<string, any>> = Partial<T & Pick<Base, 'valueFormatter' | 'displayFormatter' | 'componentContainer' | 'modelProp' | 'popup'> & AllowedComponentProps>;
9
+ export type RequiredComponentVars = {
10
+ 'pro-form': PP<Omit<ProFormProps & FormProps, 'form'>>;
11
+ } & {
12
+ [K in Exclude<ComponentName, 'custom'>]: FP<ComponentProps<GetComponentType<K>>>;
13
+ };
14
+ export type ComponentVars = Partial<RequiredComponentVars>;
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/component-provider/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEtC,KAAK,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC;AAE5E,KAAK,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,OAAO,CAC9C,CAAC,GACC,IAAI,CACF,IAAI,EACF,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,WAAW,GACX,OAAO,CACV,GACD,qBAAqB,CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,GAAG;KACD,CAAC,IAAI,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,EAAE,CACzC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CACpC;CACF,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC"}