@formily-design/formily-antd 1.0.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 (584) hide show
  1. package/.umirc.js +44 -0
  2. package/LICENSE.md +20 -0
  3. package/README.md +106 -0
  4. package/copy.ts +6 -0
  5. package/esm/common/Container/index.d.ts +6 -0
  6. package/esm/common/Container/index.js +13 -0
  7. package/esm/common/Container/styles.less +5 -0
  8. package/esm/common/FormItemSwitcher/index.d.ts +6 -0
  9. package/esm/common/FormItemSwitcher/index.js +7 -0
  10. package/esm/common/LoadTemplate/index.d.ts +13 -0
  11. package/esm/common/LoadTemplate/index.js +8 -0
  12. package/esm/components/ArrayBase/index.d.ts +1 -0
  13. package/esm/components/ArrayBase/index.js +71 -0
  14. package/esm/components/ArrayCards/index.d.ts +1 -0
  15. package/esm/components/ArrayCards/index.js +1 -0
  16. package/esm/components/ArrayCards/preview.d.ts +4 -0
  17. package/esm/components/ArrayCards/preview.js +206 -0
  18. package/esm/components/ArrayCards/styles.less +2 -0
  19. package/esm/components/ArrayTable/index.d.ts +1 -0
  20. package/esm/components/ArrayTable/index.js +1 -0
  21. package/esm/components/ArrayTable/preview.d.ts +4 -0
  22. package/esm/components/ArrayTable/preview.js +384 -0
  23. package/esm/components/ArrayTable/styles.less +2 -0
  24. package/esm/components/Card/index.d.ts +1 -0
  25. package/esm/components/Card/index.js +1 -0
  26. package/esm/components/Card/preview.d.ts +4 -0
  27. package/esm/components/Card/preview.js +34 -0
  28. package/esm/components/Cascader/index.d.ts +1 -0
  29. package/esm/components/Cascader/index.js +1 -0
  30. package/esm/components/Cascader/preview.d.ts +4 -0
  31. package/esm/components/Cascader/preview.js +28 -0
  32. package/esm/components/Checkbox/index.d.ts +1 -0
  33. package/esm/components/Checkbox/index.js +1 -0
  34. package/esm/components/Checkbox/preview.d.ts +4 -0
  35. package/esm/components/Checkbox/preview.js +33 -0
  36. package/esm/components/DatePicker/index.d.ts +1 -0
  37. package/esm/components/DatePicker/index.js +1 -0
  38. package/esm/components/DatePicker/preview.d.ts +4 -0
  39. package/esm/components/DatePicker/preview.js +50 -0
  40. package/esm/components/Field/index.d.ts +2 -0
  41. package/esm/components/Field/index.js +2 -0
  42. package/esm/components/Field/preview.d.ts +3 -0
  43. package/esm/components/Field/preview.js +127 -0
  44. package/esm/components/Field/shared.d.ts +649 -0
  45. package/esm/components/Field/shared.js +242 -0
  46. package/esm/components/Form/index.d.ts +1 -0
  47. package/esm/components/Form/index.js +1 -0
  48. package/esm/components/Form/preview.d.ts +5 -0
  49. package/esm/components/Form/preview.js +81 -0
  50. package/esm/components/Form/styles.less +32 -0
  51. package/esm/components/FormCollapse/index.d.ts +1 -0
  52. package/esm/components/FormCollapse/index.js +1 -0
  53. package/esm/components/FormCollapse/preview.d.ts +6 -0
  54. package/esm/components/FormCollapse/preview.js +116 -0
  55. package/esm/components/FormGrid/index.d.ts +1 -0
  56. package/esm/components/FormGrid/index.js +1 -0
  57. package/esm/components/FormGrid/preview.d.ts +9 -0
  58. package/esm/components/FormGrid/preview.js +131 -0
  59. package/esm/components/FormGrid/styles.less +5 -0
  60. package/esm/components/FormLayout/index.d.ts +1 -0
  61. package/esm/components/FormLayout/index.js +1 -0
  62. package/esm/components/FormLayout/preview.d.ts +4 -0
  63. package/esm/components/FormLayout/preview.js +29 -0
  64. package/esm/components/FormTab/index.d.ts +1 -0
  65. package/esm/components/FormTab/index.js +1 -0
  66. package/esm/components/FormTab/preview.d.ts +6 -0
  67. package/esm/components/FormTab/preview.js +123 -0
  68. package/esm/components/Input/index.d.ts +1 -0
  69. package/esm/components/Input/index.js +1 -0
  70. package/esm/components/Input/preview.d.ts +4 -0
  71. package/esm/components/Input/preview.js +50 -0
  72. package/esm/components/NumberPicker/index.d.ts +1 -0
  73. package/esm/components/NumberPicker/index.js +1 -0
  74. package/esm/components/NumberPicker/preview.d.ts +4 -0
  75. package/esm/components/NumberPicker/preview.js +29 -0
  76. package/esm/components/Object/index.d.ts +1 -0
  77. package/esm/components/Object/index.js +1 -0
  78. package/esm/components/Object/preview.d.ts +4 -0
  79. package/esm/components/Object/preview.js +26 -0
  80. package/esm/components/Password/index.d.ts +1 -0
  81. package/esm/components/Password/index.js +1 -0
  82. package/esm/components/Password/preview.d.ts +4 -0
  83. package/esm/components/Password/preview.js +28 -0
  84. package/esm/components/Radio/index.d.ts +1 -0
  85. package/esm/components/Radio/index.js +1 -0
  86. package/esm/components/Radio/preview.d.ts +4 -0
  87. package/esm/components/Radio/preview.js +33 -0
  88. package/esm/components/Rate/index.d.ts +1 -0
  89. package/esm/components/Rate/index.js +1 -0
  90. package/esm/components/Rate/preview.d.ts +4 -0
  91. package/esm/components/Rate/preview.js +29 -0
  92. package/esm/components/Select/index.d.ts +1 -0
  93. package/esm/components/Select/index.js +1 -0
  94. package/esm/components/Select/preview.d.ts +4 -0
  95. package/esm/components/Select/preview.js +28 -0
  96. package/esm/components/Slider/index.d.ts +1 -0
  97. package/esm/components/Slider/index.js +1 -0
  98. package/esm/components/Slider/preview.d.ts +4 -0
  99. package/esm/components/Slider/preview.js +29 -0
  100. package/esm/components/Space/index.d.ts +1 -0
  101. package/esm/components/Space/index.js +1 -0
  102. package/esm/components/Space/preview.d.ts +4 -0
  103. package/esm/components/Space/preview.js +30 -0
  104. package/esm/components/Switch/index.d.ts +1 -0
  105. package/esm/components/Switch/index.js +1 -0
  106. package/esm/components/Switch/preview.d.ts +4 -0
  107. package/esm/components/Switch/preview.js +29 -0
  108. package/esm/components/Text/index.d.ts +1 -0
  109. package/esm/components/Text/index.js +1 -0
  110. package/esm/components/Text/preview.d.ts +11 -0
  111. package/esm/components/Text/preview.js +32 -0
  112. package/esm/components/Text/styles.less +10 -0
  113. package/esm/components/TimePicker/index.d.ts +1 -0
  114. package/esm/components/TimePicker/index.js +1 -0
  115. package/esm/components/TimePicker/preview.d.ts +4 -0
  116. package/esm/components/TimePicker/preview.js +50 -0
  117. package/esm/components/Transfer/index.d.ts +1 -0
  118. package/esm/components/Transfer/index.js +1 -0
  119. package/esm/components/Transfer/preview.d.ts +4 -0
  120. package/esm/components/Transfer/preview.js +28 -0
  121. package/esm/components/TreeSelect/index.d.ts +1 -0
  122. package/esm/components/TreeSelect/index.js +1 -0
  123. package/esm/components/TreeSelect/preview.d.ts +4 -0
  124. package/esm/components/TreeSelect/preview.js +28 -0
  125. package/esm/components/Upload/index.d.ts +1 -0
  126. package/esm/components/Upload/index.js +1 -0
  127. package/esm/components/Upload/preview.d.ts +4 -0
  128. package/esm/components/Upload/preview.js +56 -0
  129. package/esm/components/index.d.ts +27 -0
  130. package/esm/components/index.js +27 -0
  131. package/esm/hooks/index.d.ts +1 -0
  132. package/esm/hooks/index.js +1 -0
  133. package/esm/hooks/useDropTemplate.d.ts +2 -0
  134. package/esm/hooks/useDropTemplate.js +20 -0
  135. package/esm/index.d.ts +3 -0
  136. package/esm/index.js +3 -0
  137. package/esm/locales/ArrayBase.d.ts +77 -0
  138. package/esm/locales/ArrayBase.js +91 -0
  139. package/esm/locales/ArrayCards.d.ts +1 -0
  140. package/esm/locales/ArrayCards.js +19 -0
  141. package/esm/locales/ArrayTable.d.ts +138 -0
  142. package/esm/locales/ArrayTable.js +129 -0
  143. package/esm/locales/Card.d.ts +44 -0
  144. package/esm/locales/Card.js +44 -0
  145. package/esm/locales/Cascader.d.ts +59 -0
  146. package/esm/locales/Cascader.js +59 -0
  147. package/esm/locales/Checkbox.d.ts +11 -0
  148. package/esm/locales/Checkbox.js +11 -0
  149. package/esm/locales/Component.d.ts +53 -0
  150. package/esm/locales/Component.js +53 -0
  151. package/esm/locales/DatePicker.d.ts +75 -0
  152. package/esm/locales/DatePicker.js +86 -0
  153. package/esm/locales/Field.d.ts +341 -0
  154. package/esm/locales/Field.js +338 -0
  155. package/esm/locales/Form.d.ts +1 -0
  156. package/esm/locales/Form.js +133 -0
  157. package/esm/locales/FormCollapse.d.ts +88 -0
  158. package/esm/locales/FormCollapse.js +82 -0
  159. package/esm/locales/FormGrid.d.ts +76 -0
  160. package/esm/locales/FormGrid.js +76 -0
  161. package/esm/locales/FormLayout.d.ts +128 -0
  162. package/esm/locales/FormLayout.js +122 -0
  163. package/esm/locales/FormTab.d.ts +82 -0
  164. package/esm/locales/FormTab.js +82 -0
  165. package/esm/locales/Input.d.ts +50 -0
  166. package/esm/locales/Input.js +50 -0
  167. package/esm/locales/NumberPicker.d.ts +77 -0
  168. package/esm/locales/NumberPicker.js +77 -0
  169. package/esm/locales/Object.d.ts +11 -0
  170. package/esm/locales/Object.js +11 -0
  171. package/esm/locales/Password.d.ts +1 -0
  172. package/esm/locales/Password.js +13 -0
  173. package/esm/locales/Radio.d.ts +47 -0
  174. package/esm/locales/Radio.js +29 -0
  175. package/esm/locales/Rate.d.ts +41 -0
  176. package/esm/locales/Rate.js +32 -0
  177. package/esm/locales/Select.d.ts +125 -0
  178. package/esm/locales/Select.js +125 -0
  179. package/esm/locales/Slider.d.ts +71 -0
  180. package/esm/locales/Slider.js +71 -0
  181. package/esm/locales/Space.d.ts +53 -0
  182. package/esm/locales/Space.js +50 -0
  183. package/esm/locales/Switch.d.ts +11 -0
  184. package/esm/locales/Switch.js +11 -0
  185. package/esm/locales/Text.d.ts +38 -0
  186. package/esm/locales/Text.js +38 -0
  187. package/esm/locales/TextArea.d.ts +35 -0
  188. package/esm/locales/TextArea.js +35 -0
  189. package/esm/locales/TimePicker.d.ts +2 -0
  190. package/esm/locales/TimePicker.js +72 -0
  191. package/esm/locales/Transfer.d.ts +56 -0
  192. package/esm/locales/Transfer.js +38 -0
  193. package/esm/locales/TreeSelect.d.ts +181 -0
  194. package/esm/locales/TreeSelect.js +178 -0
  195. package/esm/locales/Upload.d.ts +78 -0
  196. package/esm/locales/Upload.js +92 -0
  197. package/esm/locales/Void.d.ts +11 -0
  198. package/esm/locales/Void.js +11 -0
  199. package/esm/locales/all.d.ts +31 -0
  200. package/esm/locales/all.js +31 -0
  201. package/esm/locales/index.d.ts +2 -0
  202. package/esm/locales/index.js +2 -0
  203. package/esm/schemas/ArrayCards.d.ts +59 -0
  204. package/esm/schemas/ArrayCards.js +4 -0
  205. package/esm/schemas/ArrayTable.d.ts +5 -0
  206. package/esm/schemas/ArrayTable.js +111 -0
  207. package/esm/schemas/CSSStyle.d.ts +2 -0
  208. package/esm/schemas/CSSStyle.js +49 -0
  209. package/esm/schemas/Card.d.ts +4 -0
  210. package/esm/schemas/Card.js +45 -0
  211. package/esm/schemas/Cascader.d.ts +2 -0
  212. package/esm/schemas/Cascader.js +74 -0
  213. package/esm/schemas/Checkbox.d.ts +4 -0
  214. package/esm/schemas/Checkbox.js +10 -0
  215. package/esm/schemas/DatePicker.d.ts +4 -0
  216. package/esm/schemas/DatePicker.js +104 -0
  217. package/esm/schemas/Form.d.ts +2 -0
  218. package/esm/schemas/Form.js +6 -0
  219. package/esm/schemas/FormCollapse.d.ts +4 -0
  220. package/esm/schemas/FormCollapse.js +58 -0
  221. package/esm/schemas/FormGrid.d.ts +4 -0
  222. package/esm/schemas/FormGrid.js +76 -0
  223. package/esm/schemas/FormItem.d.ts +2 -0
  224. package/esm/schemas/FormItem.js +138 -0
  225. package/esm/schemas/FormLayout.d.ts +2 -0
  226. package/esm/schemas/FormLayout.js +121 -0
  227. package/esm/schemas/FormTab.d.ts +4 -0
  228. package/esm/schemas/FormTab.js +43 -0
  229. package/esm/schemas/Input.d.ts +4 -0
  230. package/esm/schemas/Input.js +89 -0
  231. package/esm/schemas/NumberPicker.d.ts +2 -0
  232. package/esm/schemas/NumberPicker.js +79 -0
  233. package/esm/schemas/Password.d.ts +2 -0
  234. package/esm/schemas/Password.js +9 -0
  235. package/esm/schemas/Radio.d.ts +4 -0
  236. package/esm/schemas/Radio.js +35 -0
  237. package/esm/schemas/Rate.d.ts +2 -0
  238. package/esm/schemas/Rate.js +38 -0
  239. package/esm/schemas/Select.d.ts +2 -0
  240. package/esm/schemas/Select.js +159 -0
  241. package/esm/schemas/Slider.d.ts +2 -0
  242. package/esm/schemas/Slider.js +77 -0
  243. package/esm/schemas/Space.d.ts +2 -0
  244. package/esm/schemas/Space.js +39 -0
  245. package/esm/schemas/Switch.d.ts +2 -0
  246. package/esm/schemas/Switch.js +19 -0
  247. package/esm/schemas/Text.d.ts +2 -0
  248. package/esm/schemas/Text.js +19 -0
  249. package/esm/schemas/TimePicker.d.ts +116 -0
  250. package/esm/schemas/TimePicker.js +120 -0
  251. package/esm/schemas/Transfer.d.ts +2 -0
  252. package/esm/schemas/Transfer.js +44 -0
  253. package/esm/schemas/TreeSelect.d.ts +2 -0
  254. package/esm/schemas/TreeSelect.js +137 -0
  255. package/esm/schemas/Upload.d.ts +4 -0
  256. package/esm/schemas/Upload.js +99 -0
  257. package/esm/schemas/all.d.ts +27 -0
  258. package/esm/schemas/all.js +27 -0
  259. package/esm/schemas/index.d.ts +2 -0
  260. package/esm/schemas/index.js +2 -0
  261. package/esm/shared.d.ts +13 -0
  262. package/esm/shared.js +86 -0
  263. package/lib/common/Container/index.d.ts +6 -0
  264. package/lib/common/Container/index.js +20 -0
  265. package/lib/common/Container/styles.less +5 -0
  266. package/lib/common/FormItemSwitcher/index.d.ts +6 -0
  267. package/lib/common/FormItemSwitcher/index.js +14 -0
  268. package/lib/common/LoadTemplate/index.d.ts +13 -0
  269. package/lib/common/LoadTemplate/index.js +15 -0
  270. package/lib/components/ArrayBase/index.d.ts +1 -0
  271. package/lib/components/ArrayBase/index.js +75 -0
  272. package/lib/components/ArrayCards/index.d.ts +1 -0
  273. package/lib/components/ArrayCards/index.js +17 -0
  274. package/lib/components/ArrayCards/preview.d.ts +4 -0
  275. package/lib/components/ArrayCards/preview.js +245 -0
  276. package/lib/components/ArrayCards/styles.less +2 -0
  277. package/lib/components/ArrayTable/index.d.ts +1 -0
  278. package/lib/components/ArrayTable/index.js +17 -0
  279. package/lib/components/ArrayTable/preview.d.ts +4 -0
  280. package/lib/components/ArrayTable/preview.js +390 -0
  281. package/lib/components/ArrayTable/styles.less +2 -0
  282. package/lib/components/Card/index.d.ts +1 -0
  283. package/lib/components/Card/index.js +17 -0
  284. package/lib/components/Card/preview.d.ts +4 -0
  285. package/lib/components/Card/preview.js +41 -0
  286. package/lib/components/Cascader/index.d.ts +1 -0
  287. package/lib/components/Cascader/index.js +17 -0
  288. package/lib/components/Cascader/preview.d.ts +4 -0
  289. package/lib/components/Cascader/preview.js +31 -0
  290. package/lib/components/Checkbox/index.d.ts +1 -0
  291. package/lib/components/Checkbox/index.js +17 -0
  292. package/lib/components/Checkbox/preview.d.ts +4 -0
  293. package/lib/components/Checkbox/preview.js +36 -0
  294. package/lib/components/DatePicker/index.d.ts +1 -0
  295. package/lib/components/DatePicker/index.js +17 -0
  296. package/lib/components/DatePicker/preview.d.ts +4 -0
  297. package/lib/components/DatePicker/preview.js +53 -0
  298. package/lib/components/Field/index.d.ts +2 -0
  299. package/lib/components/Field/index.js +18 -0
  300. package/lib/components/Field/preview.d.ts +3 -0
  301. package/lib/components/Field/preview.js +133 -0
  302. package/lib/components/Field/shared.d.ts +649 -0
  303. package/lib/components/Field/shared.js +248 -0
  304. package/lib/components/Form/index.d.ts +1 -0
  305. package/lib/components/Form/index.js +17 -0
  306. package/lib/components/Form/preview.d.ts +5 -0
  307. package/lib/components/Form/preview.js +117 -0
  308. package/lib/components/Form/styles.less +32 -0
  309. package/lib/components/FormCollapse/index.d.ts +1 -0
  310. package/lib/components/FormCollapse/index.js +17 -0
  311. package/lib/components/FormCollapse/preview.d.ts +6 -0
  312. package/lib/components/FormCollapse/preview.js +152 -0
  313. package/lib/components/FormGrid/index.d.ts +1 -0
  314. package/lib/components/FormGrid/index.js +17 -0
  315. package/lib/components/FormGrid/preview.d.ts +9 -0
  316. package/lib/components/FormGrid/preview.js +137 -0
  317. package/lib/components/FormGrid/styles.less +5 -0
  318. package/lib/components/FormLayout/index.d.ts +1 -0
  319. package/lib/components/FormLayout/index.js +17 -0
  320. package/lib/components/FormLayout/preview.d.ts +4 -0
  321. package/lib/components/FormLayout/preview.js +32 -0
  322. package/lib/components/FormTab/index.d.ts +1 -0
  323. package/lib/components/FormTab/index.js +17 -0
  324. package/lib/components/FormTab/preview.d.ts +6 -0
  325. package/lib/components/FormTab/preview.js +159 -0
  326. package/lib/components/Input/index.d.ts +1 -0
  327. package/lib/components/Input/index.js +17 -0
  328. package/lib/components/Input/preview.d.ts +4 -0
  329. package/lib/components/Input/preview.js +53 -0
  330. package/lib/components/NumberPicker/index.d.ts +1 -0
  331. package/lib/components/NumberPicker/index.js +17 -0
  332. package/lib/components/NumberPicker/preview.d.ts +4 -0
  333. package/lib/components/NumberPicker/preview.js +32 -0
  334. package/lib/components/Object/index.d.ts +1 -0
  335. package/lib/components/Object/index.js +17 -0
  336. package/lib/components/Object/preview.d.ts +4 -0
  337. package/lib/components/Object/preview.js +29 -0
  338. package/lib/components/Password/index.d.ts +1 -0
  339. package/lib/components/Password/index.js +17 -0
  340. package/lib/components/Password/preview.d.ts +4 -0
  341. package/lib/components/Password/preview.js +31 -0
  342. package/lib/components/Radio/index.d.ts +1 -0
  343. package/lib/components/Radio/index.js +17 -0
  344. package/lib/components/Radio/preview.d.ts +4 -0
  345. package/lib/components/Radio/preview.js +36 -0
  346. package/lib/components/Rate/index.d.ts +1 -0
  347. package/lib/components/Rate/index.js +17 -0
  348. package/lib/components/Rate/preview.d.ts +4 -0
  349. package/lib/components/Rate/preview.js +32 -0
  350. package/lib/components/Select/index.d.ts +1 -0
  351. package/lib/components/Select/index.js +17 -0
  352. package/lib/components/Select/preview.d.ts +4 -0
  353. package/lib/components/Select/preview.js +31 -0
  354. package/lib/components/Slider/index.d.ts +1 -0
  355. package/lib/components/Slider/index.js +17 -0
  356. package/lib/components/Slider/preview.d.ts +4 -0
  357. package/lib/components/Slider/preview.js +32 -0
  358. package/lib/components/Space/index.d.ts +1 -0
  359. package/lib/components/Space/index.js +17 -0
  360. package/lib/components/Space/preview.d.ts +4 -0
  361. package/lib/components/Space/preview.js +33 -0
  362. package/lib/components/Switch/index.d.ts +1 -0
  363. package/lib/components/Switch/index.js +17 -0
  364. package/lib/components/Switch/preview.d.ts +4 -0
  365. package/lib/components/Switch/preview.js +32 -0
  366. package/lib/components/Text/index.d.ts +1 -0
  367. package/lib/components/Text/index.js +17 -0
  368. package/lib/components/Text/preview.d.ts +11 -0
  369. package/lib/components/Text/preview.js +39 -0
  370. package/lib/components/Text/styles.less +10 -0
  371. package/lib/components/TimePicker/index.d.ts +1 -0
  372. package/lib/components/TimePicker/index.js +17 -0
  373. package/lib/components/TimePicker/preview.d.ts +4 -0
  374. package/lib/components/TimePicker/preview.js +53 -0
  375. package/lib/components/Transfer/index.d.ts +1 -0
  376. package/lib/components/Transfer/index.js +17 -0
  377. package/lib/components/Transfer/preview.d.ts +4 -0
  378. package/lib/components/Transfer/preview.js +31 -0
  379. package/lib/components/TreeSelect/index.d.ts +1 -0
  380. package/lib/components/TreeSelect/index.js +17 -0
  381. package/lib/components/TreeSelect/preview.d.ts +4 -0
  382. package/lib/components/TreeSelect/preview.js +31 -0
  383. package/lib/components/Upload/index.d.ts +1 -0
  384. package/lib/components/Upload/index.js +17 -0
  385. package/lib/components/Upload/preview.d.ts +4 -0
  386. package/lib/components/Upload/preview.js +59 -0
  387. package/lib/components/index.d.ts +27 -0
  388. package/lib/components/index.js +43 -0
  389. package/lib/hooks/index.d.ts +1 -0
  390. package/lib/hooks/index.js +17 -0
  391. package/lib/hooks/useDropTemplate.d.ts +2 -0
  392. package/lib/hooks/useDropTemplate.js +24 -0
  393. package/lib/index.d.ts +3 -0
  394. package/lib/index.js +19 -0
  395. package/lib/locales/ArrayBase.d.ts +77 -0
  396. package/lib/locales/ArrayBase.js +94 -0
  397. package/lib/locales/ArrayCards.d.ts +1 -0
  398. package/lib/locales/ArrayCards.js +22 -0
  399. package/lib/locales/ArrayTable.d.ts +138 -0
  400. package/lib/locales/ArrayTable.js +132 -0
  401. package/lib/locales/Card.d.ts +44 -0
  402. package/lib/locales/Card.js +47 -0
  403. package/lib/locales/Cascader.d.ts +59 -0
  404. package/lib/locales/Cascader.js +62 -0
  405. package/lib/locales/Checkbox.d.ts +11 -0
  406. package/lib/locales/Checkbox.js +14 -0
  407. package/lib/locales/Component.d.ts +53 -0
  408. package/lib/locales/Component.js +56 -0
  409. package/lib/locales/DatePicker.d.ts +75 -0
  410. package/lib/locales/DatePicker.js +89 -0
  411. package/lib/locales/Field.d.ts +341 -0
  412. package/lib/locales/Field.js +341 -0
  413. package/lib/locales/Form.d.ts +1 -0
  414. package/lib/locales/Form.js +136 -0
  415. package/lib/locales/FormCollapse.d.ts +88 -0
  416. package/lib/locales/FormCollapse.js +85 -0
  417. package/lib/locales/FormGrid.d.ts +76 -0
  418. package/lib/locales/FormGrid.js +79 -0
  419. package/lib/locales/FormLayout.d.ts +128 -0
  420. package/lib/locales/FormLayout.js +125 -0
  421. package/lib/locales/FormTab.d.ts +82 -0
  422. package/lib/locales/FormTab.js +85 -0
  423. package/lib/locales/Input.d.ts +50 -0
  424. package/lib/locales/Input.js +53 -0
  425. package/lib/locales/NumberPicker.d.ts +77 -0
  426. package/lib/locales/NumberPicker.js +80 -0
  427. package/lib/locales/Object.d.ts +11 -0
  428. package/lib/locales/Object.js +14 -0
  429. package/lib/locales/Password.d.ts +1 -0
  430. package/lib/locales/Password.js +16 -0
  431. package/lib/locales/Radio.d.ts +47 -0
  432. package/lib/locales/Radio.js +32 -0
  433. package/lib/locales/Rate.d.ts +41 -0
  434. package/lib/locales/Rate.js +35 -0
  435. package/lib/locales/Select.d.ts +125 -0
  436. package/lib/locales/Select.js +128 -0
  437. package/lib/locales/Slider.d.ts +71 -0
  438. package/lib/locales/Slider.js +74 -0
  439. package/lib/locales/Space.d.ts +53 -0
  440. package/lib/locales/Space.js +53 -0
  441. package/lib/locales/Switch.d.ts +11 -0
  442. package/lib/locales/Switch.js +14 -0
  443. package/lib/locales/Text.d.ts +38 -0
  444. package/lib/locales/Text.js +41 -0
  445. package/lib/locales/TextArea.d.ts +35 -0
  446. package/lib/locales/TextArea.js +38 -0
  447. package/lib/locales/TimePicker.d.ts +2 -0
  448. package/lib/locales/TimePicker.js +75 -0
  449. package/lib/locales/Transfer.d.ts +56 -0
  450. package/lib/locales/Transfer.js +41 -0
  451. package/lib/locales/TreeSelect.d.ts +181 -0
  452. package/lib/locales/TreeSelect.js +181 -0
  453. package/lib/locales/Upload.d.ts +78 -0
  454. package/lib/locales/Upload.js +95 -0
  455. package/lib/locales/Void.d.ts +11 -0
  456. package/lib/locales/Void.js +14 -0
  457. package/lib/locales/all.d.ts +31 -0
  458. package/lib/locales/all.js +47 -0
  459. package/lib/locales/index.d.ts +2 -0
  460. package/lib/locales/index.js +38 -0
  461. package/lib/schemas/ArrayCards.d.ts +59 -0
  462. package/lib/schemas/ArrayCards.js +7 -0
  463. package/lib/schemas/ArrayTable.d.ts +5 -0
  464. package/lib/schemas/ArrayTable.js +114 -0
  465. package/lib/schemas/CSSStyle.d.ts +2 -0
  466. package/lib/schemas/CSSStyle.js +52 -0
  467. package/lib/schemas/Card.d.ts +4 -0
  468. package/lib/schemas/Card.js +48 -0
  469. package/lib/schemas/Cascader.d.ts +2 -0
  470. package/lib/schemas/Cascader.js +77 -0
  471. package/lib/schemas/Checkbox.d.ts +4 -0
  472. package/lib/schemas/Checkbox.js +13 -0
  473. package/lib/schemas/DatePicker.d.ts +4 -0
  474. package/lib/schemas/DatePicker.js +107 -0
  475. package/lib/schemas/Form.d.ts +2 -0
  476. package/lib/schemas/Form.js +9 -0
  477. package/lib/schemas/FormCollapse.d.ts +4 -0
  478. package/lib/schemas/FormCollapse.js +61 -0
  479. package/lib/schemas/FormGrid.d.ts +4 -0
  480. package/lib/schemas/FormGrid.js +79 -0
  481. package/lib/schemas/FormItem.d.ts +2 -0
  482. package/lib/schemas/FormItem.js +141 -0
  483. package/lib/schemas/FormLayout.d.ts +2 -0
  484. package/lib/schemas/FormLayout.js +124 -0
  485. package/lib/schemas/FormTab.d.ts +4 -0
  486. package/lib/schemas/FormTab.js +46 -0
  487. package/lib/schemas/Input.d.ts +4 -0
  488. package/lib/schemas/Input.js +92 -0
  489. package/lib/schemas/NumberPicker.d.ts +2 -0
  490. package/lib/schemas/NumberPicker.js +82 -0
  491. package/lib/schemas/Password.d.ts +2 -0
  492. package/lib/schemas/Password.js +12 -0
  493. package/lib/schemas/Radio.d.ts +4 -0
  494. package/lib/schemas/Radio.js +38 -0
  495. package/lib/schemas/Rate.d.ts +2 -0
  496. package/lib/schemas/Rate.js +41 -0
  497. package/lib/schemas/Select.d.ts +2 -0
  498. package/lib/schemas/Select.js +162 -0
  499. package/lib/schemas/Slider.d.ts +2 -0
  500. package/lib/schemas/Slider.js +80 -0
  501. package/lib/schemas/Space.d.ts +2 -0
  502. package/lib/schemas/Space.js +42 -0
  503. package/lib/schemas/Switch.d.ts +2 -0
  504. package/lib/schemas/Switch.js +22 -0
  505. package/lib/schemas/Text.d.ts +2 -0
  506. package/lib/schemas/Text.js +22 -0
  507. package/lib/schemas/TimePicker.d.ts +116 -0
  508. package/lib/schemas/TimePicker.js +123 -0
  509. package/lib/schemas/Transfer.d.ts +2 -0
  510. package/lib/schemas/Transfer.js +47 -0
  511. package/lib/schemas/TreeSelect.d.ts +2 -0
  512. package/lib/schemas/TreeSelect.js +140 -0
  513. package/lib/schemas/Upload.d.ts +4 -0
  514. package/lib/schemas/Upload.js +102 -0
  515. package/lib/schemas/all.d.ts +27 -0
  516. package/lib/schemas/all.js +43 -0
  517. package/lib/schemas/index.d.ts +2 -0
  518. package/lib/schemas/index.js +38 -0
  519. package/lib/shared.d.ts +13 -0
  520. package/lib/shared.js +98 -0
  521. package/package.json +75 -0
  522. package/playground/components/AsyncSelect/AsyncSelect.tsx +38 -0
  523. package/playground/components/AsyncSelect/index.tsx +1 -0
  524. package/playground/components/AsyncSelect/preview.tsx +36 -0
  525. package/playground/components/ClickEventSetter/ActionConfigModal.tsx +173 -0
  526. package/playground/components/ClickEventSetter/ActionList.tsx +67 -0
  527. package/playground/components/ClickEventSetter/DownloadPanel.tsx +24 -0
  528. package/playground/components/ClickEventSetter/NavigationPanel.tsx +42 -0
  529. package/playground/components/ClickEventSetter/RequestPanel.tsx +190 -0
  530. package/playground/components/ClickEventSetter/index.tsx +90 -0
  531. package/playground/components/ClickEventSetter/styles.less +89 -0
  532. package/playground/components/ClickEventSetter/types.ts +43 -0
  533. package/playground/components/FormButton/FormButton.tsx +189 -0
  534. package/playground/components/FormButton/hooks/useEventActionExecutor.ts +65 -0
  535. package/playground/components/FormButton/index.ts +1 -0
  536. package/playground/components/FormButton/preview.tsx +60 -0
  537. package/playground/components/FormButton/utils/actionExecutors.ts +96 -0
  538. package/playground/components/FormButtonGroup/FormButtonGroup.tsx +21 -0
  539. package/playground/components/FormButtonGroup/index.ts +1 -0
  540. package/playground/components/FormButtonGroup/preview.tsx +66 -0
  541. package/playground/components/FormList/FormList.tsx +164 -0
  542. package/playground/components/FormList/index.tsx +1 -0
  543. package/playground/components/FormList/preview.tsx +429 -0
  544. package/playground/components/LocationPicker/LocationModal.tsx +328 -0
  545. package/playground/components/LocationPicker/LocationPicker.tsx +163 -0
  546. package/playground/components/LocationPicker/SearchBox.tsx +122 -0
  547. package/playground/components/LocationPicker/api.ts +77 -0
  548. package/playground/components/LocationPicker/constants.ts +2 -0
  549. package/playground/components/LocationPicker/index.tsx +44 -0
  550. package/playground/components/LocationPicker/types.ts +160 -0
  551. package/playground/components/LocationPicker/utils.ts +46 -0
  552. package/playground/components/ResourceIcon/index.module.less +10 -0
  553. package/playground/components/ResourceIcon/index.tsx +10 -0
  554. package/playground/designerLocales/en-US.ts +38 -0
  555. package/playground/designerLocales/index.ts +6 -0
  556. package/playground/designerLocales/ko-KR.ts +10 -0
  557. package/playground/designerLocales/zh-CN.ts +38 -0
  558. package/playground/locales/FormButton.ts +38 -0
  559. package/playground/locales/FormButtonGroup.ts +29 -0
  560. package/playground/locales/LocationPicker.ts +30 -0
  561. package/playground/locales/all.ts +3 -0
  562. package/playground/locales/index.ts +3 -0
  563. package/playground/main.tsx +222 -0
  564. package/playground/react-app-env.d.ts +4 -0
  565. package/playground/request.ts +123 -0
  566. package/playground/schemas/FormButton.ts +42 -0
  567. package/playground/schemas/FormButtonGroup.ts +24 -0
  568. package/playground/schemas/LocationPicker.ts +14 -0
  569. package/playground/schemas/all.ts +3 -0
  570. package/playground/schemas/index.ts +3 -0
  571. package/playground/service/index.ts +1 -0
  572. package/playground/service/schema.ts +22 -0
  573. package/playground/template.ejs +20 -0
  574. package/playground/utils.ts +744 -0
  575. package/playground/webpack.base.ts +123 -0
  576. package/playground/webpack.dev.ts +64 -0
  577. package/playground/webpack.prod.ts +46 -0
  578. package/playground/widgets/ActionsWidget.tsx +58 -0
  579. package/playground/widgets/LogoWidget.tsx +20 -0
  580. package/playground/widgets/MarkupSchemaWidget.tsx +164 -0
  581. package/playground/widgets/PreviewWidget.tsx +188 -0
  582. package/playground/widgets/SchemaEditorWidget.tsx +27 -0
  583. package/playground/widgets/index.ts +5 -0
  584. package/tsconfig.build.json +12 -0
@@ -0,0 +1,744 @@
1
+ import { Field, GeneralField } from '@formily/core'
2
+ import { ISchema } from '@formily/react'
3
+ import { get, post, ResponseResult } from './request'
4
+ import { action } from '@formily/reactive'
5
+ import { isStr } from '@formily/shared'
6
+
7
+ /** 表单变量字段路径正则 */
8
+ const FORM_VARIABLE_PATH_REG = /^\{\{\$values\.([\w\.]+)\}\}$/
9
+ /** */
10
+ /** 判断是否是表单变量 {{$values.xxx}} 或 {{$values.xxx.yyy}} */
11
+ const isFormVariable = (str: string) => {
12
+ return FORM_VARIABLE_PATH_REG.test(str)
13
+ }
14
+
15
+ /** 获取变量字符串里的表单字段路径 */
16
+ const getFormVariableFieldPath = (str: string) => {
17
+ const match = FORM_VARIABLE_PATH_REG.exec(str)
18
+ return match ? match[1] : ''
19
+ }
20
+
21
+ /**
22
+ * 检测并捕获整个字符串是否完全是形如 {{ ... }} 的表达式(两端允许空白)。
23
+ * 捕获组 ([\s\S]*) 会得到 {{ 和 }} 中间的内容(包括换行)。
24
+ * 注意:如果字符串是 "hi {{name}}"(不是整个字符串由 {{...}} 包裹),则不会匹配
25
+ */
26
+ const ExpRE = /^\s*\{\{([\s\S]*)\}\}\s*$/
27
+ const Registry = {
28
+ /**
29
+ * 是否静默执行表达式(开/关错误吞噬)。
30
+ * 当 silent = true 时,如果表达式执行抛错,会被 catch 吞掉,并且函数返回 undefined(因为 catch 里没有 return)。
31
+ * 当 silent = false 时,出错会把异常抛出来。
32
+ */
33
+ silent: false,
34
+ /**
35
+ * 使用 new Function('$root', ...) 动态创建函数,并用 with($root) { ... } 把 scope 对象的属性当作变量直接可访问。
36
+ * 最终等价于在传入的 scope 上下文中执行 return ( expression );,然后返回这个值
37
+ */
38
+ compile(expression: string, scope: Record<string, any> = {}) {
39
+ if (Registry.silent) {
40
+ try {
41
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-implied-eval
42
+ return new Function('$root', `with($root) { return (${expression}); }`)(
43
+ scope
44
+ )
45
+ } catch (e) {
46
+ console.error('compile error:', e)
47
+ }
48
+ } else {
49
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-implied-eval
50
+ return new Function('$root', `with($root) { return (${expression}); }`)(
51
+ scope
52
+ )
53
+ }
54
+ },
55
+ }
56
+
57
+ /**
58
+ * 浅解析字符串模板 {{ xxx }},返回解析结果
59
+ * @example
60
+ * 简单算术 shallowCompile("{{ 1 + 2 }}") // => 3
61
+ * 读取 scope 中的变量 shallowCompile("{{ a + b }}", { a: 10, b: 5 }) // => 15
62
+ * 调用 scope 中的函数 shallowCompile("{{ add(a, b) }}", { a: 10, b: 5, add: (x, y) => x + y }) // => 15
63
+ * 访问对象属性 shallowCompile("{{ user.name }}", { user: { name: "小明", age: 20 } }) // => "小明"
64
+ * 访问对象属性 shallowCompile("{{ user.age > 18 ? '成人' : '未成年' }}", { user: { name: "小明", age: 20 } }) // => "成人"
65
+ * 调用函数 shallowCompile(`{{function(){${runner}}}}`,{ user: { name: "小明", age: 20 } })()
66
+ * 不包含模板,原样返回 shallowCompile("Hello World") // => "Hello World"
67
+ */
68
+ export const shallowCompile = <
69
+ Source = any,
70
+ Scope extends Record<string, any> = {}
71
+ >(
72
+ source: Source,
73
+ scope?: Scope
74
+ ) => {
75
+ if (isStr(source)) {
76
+ const matched = ExpRE.exec(source)
77
+ if (!matched) return source
78
+ return Registry.compile(matched[1], scope)
79
+ }
80
+ return source
81
+ }
82
+
83
+ /** 解析字符串函数,返回可调用函数--忽略参数名 */
84
+ // function parseFunction<T extends (...args: any[]) => any>(code: string): T | null {
85
+ // if (!code?.trim()) return null
86
+ // try {
87
+ // // 统一使用 arguments 传递参数,忽略参数名
88
+ // return new Function(`return (${code})(...arguments)`) as T
89
+ // } catch (e) {
90
+ // console.error('Failed to parse function:', e)
91
+ // return null
92
+ // }
93
+ // }
94
+
95
+ /** 解析字符串函数,返回可调用函数 */
96
+ function parseFunction<T extends (...args: any[]) => any>(
97
+ code: string,
98
+ params: string[]
99
+ ): T | null {
100
+ if (!code?.trim()) return null
101
+ try {
102
+ // 尝试从函数声明中提取函数名
103
+ const namedFnMatch = /function\s+(\w+)\s*\(/.exec(code)
104
+ if (namedFnMatch) {
105
+ const fnName = namedFnMatch[1]
106
+ // 创建函数并自动调用命名的函数
107
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
108
+ return new Function(
109
+ ...params,
110
+ `${code}\nreturn ${fnName}(${params.join(',')})`
111
+ ) as T
112
+ }
113
+ // 没有命名函数声明,直接创建
114
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
115
+ return new Function(...params, code) as T
116
+ } catch (e) {
117
+ console.error('Failed to parse function:', e)
118
+ return null
119
+ }
120
+ }
121
+
122
+ /** 替换 {{$values.xxx}} 变量占位符 */
123
+ function replaceVariables(str: string, field: GeneralField): string {
124
+ // return str.replace(/\{\{(\w+)\}\}/g, (_, key) => {
125
+ return str.replace(/\{\{\$values\.(\w+)\}\}/g, (_, key) => {
126
+ return field.form?.getValuesIn(key) ?? ''
127
+ })
128
+ }
129
+
130
+ /** 解析对象里的变量值,返回处理后的对象 */
131
+ function parseObjectVariables(
132
+ params: Record<string, any>,
133
+ scope: Record<string, any>
134
+ ): Record<string, any> {
135
+ return Object.keys(params).reduce((acc, key) => {
136
+ if (key) {
137
+ const value = params[key]
138
+ acc[key] = /\{\{[\s\S]*\}\}/.test(value)
139
+ ? shallowCompile(value, scope)
140
+ : value
141
+ }
142
+ return acc
143
+ }, {} as Record<string, any>)
144
+ }
145
+
146
+ interface IRemoteDataSource {
147
+ url: string
148
+ method: string
149
+ headers: Record<string, string>
150
+ params: Record<string, string>
151
+ /** "function (config, data){\nconsole.log(config,data)\n}" */
152
+ beforeRequest: string
153
+ /** "function (res){\nreturn res.map(s => ({label: s.username, value: s.id}))\n}" */
154
+ dataHandler: string
155
+ }
156
+
157
+ /**
158
+ {
159
+ "form": {
160
+ "labelCol": 6,
161
+ "wrapperCol": 12
162
+ },
163
+ "schema": {
164
+ "type": "object",
165
+ "properties": {
166
+ "w6v1auut5m3": {
167
+ "title": "AsyncSelect",
168
+ "x-decorator": "FormItem",
169
+ "x-component": "AsyncSelect",
170
+ "x-validator": [],
171
+ "x-component-props": {},
172
+ "x-decorator-props": {},
173
+ "x-datasource-type": "remote",
174
+ "x-datasource-effect": {
175
+ "url": "https://jsonplaceholder.typicode.com/users",
176
+ "method": "GET",
177
+ "beforeRequest": "function beforeRequest(arg) {\n console.log('before', arg)\n}",
178
+ "dataHandler": "function dataHandler(arg) {\n console.log('after', arg)\n}"
179
+ },
180
+ "x-designable-id": "w6v1auut5m3",
181
+ "x-index": 0
182
+ },
183
+ "2co13fwl7tf": {
184
+ "type": "array",
185
+ "x-decorator": "FormItem",
186
+ "x-component": "ArrayCards",
187
+ "x-component-props": {
188
+ "title": "Title"
189
+ },
190
+ "x-validator": [],
191
+ "x-decorator-props": {},
192
+ "x-designable-id": "2co13fwl7tf",
193
+ "x-index": 0,
194
+ "items": {
195
+ "type": "object",
196
+ "x-designable-id": "xioweoptn2h",
197
+ "properties": {
198
+ "pjwa85a289y": {
199
+ "type": "void",
200
+ "x-component": "ArrayCards.Index",
201
+ "x-designable-id": "pjwa85a289y",
202
+ "x-index": 0
203
+ },
204
+ "w6v1auut5m3": {
205
+ "title": "AsyncSelect",
206
+ "x-decorator": "FormItem",
207
+ "x-component": "AsyncSelect",
208
+ "x-validator": [],
209
+ "x-component-props": {
210
+ "showSearch": true
211
+ },
212
+ "x-decorator-props": {},
213
+ "x-datasource-type": "remote",
214
+ "x-datasource-effect": {
215
+ "url": "https://jsonplaceholder.typicode.com/users",
216
+ "method": "GET",
217
+ "params": [
218
+ {
219
+ "key": "size",
220
+ "value": "10"
221
+ }
222
+ ],
223
+ "beforeRequest": "function beforeRequest(config) {\n console.log('before', config)\n}",
224
+ "dataHandler": "function dataHandler(data) {\n console.log('after', data)\n return data.map(item => ({label: item.name, value: item.name}))\n}"
225
+ },
226
+ "x-designable-id": "w6v1auut5m3",
227
+ "x-index": 1,
228
+ "x-fetchdata-onsearch": true
229
+ }
230
+ }
231
+ },
232
+ "properties": {
233
+ "lo4hqxkhchf": {
234
+ "type": "void",
235
+ "title": "Addition",
236
+ "x-component": "ArrayCards.Addition",
237
+ "x-designable-id": "lo4hqxkhchf",
238
+ "x-index": 0
239
+ }
240
+ }
241
+ }
242
+ },
243
+ "x-designable-id": "5r1fpvewvwq"
244
+ }
245
+ }
246
+ */
247
+
248
+ /**
249
+ * 遍历 schema
250
+ * 判断存在 x-datasource-effect 的节点 x-reactions 配置是否是数组,不是数组的话,转换为数组,并创建 '{{useAsyncDataSource(loadData_[xxx])}}' 添加在 x-reactions 的第1个元素,其中 xxx 是 properties 下子对象的属性名,将原来的 x-reactions 设置为 x-reactions 的第2个元素
251
+ * 返回新的 schema
252
+ */
253
+ export function transformSchema(
254
+ schema: ISchema,
255
+ scope: Record<string, any>,
256
+ nodeKey?: string
257
+ ): ISchema {
258
+ if (!schema || typeof schema !== 'object') {
259
+ return schema
260
+ }
261
+
262
+ // 深拷贝 schema
263
+ const newSchema = Array.isArray(schema) ? [] : Object.create(null)
264
+
265
+ for (const key in schema) {
266
+ if (Object.prototype.hasOwnProperty.call(schema, key)) {
267
+ const value = schema[key as keyof ISchema]
268
+ if (key === 'properties' && value && typeof value === 'object') {
269
+ // 递归处理 properties,传递子对象的 key
270
+ newSchema.properties = {}
271
+ for (const propKey in value) {
272
+ if (Object.prototype.hasOwnProperty.call(value, propKey)) {
273
+ ;(newSchema.properties as Record<string, ISchema>)[propKey] =
274
+ transformSchema(value[propKey] as ISchema, scope, propKey)
275
+ }
276
+ }
277
+ } else if (key === 'x-datasource-effect' && value) {
278
+ // 节点存在 x-datasource-effect,处理 x-reactions
279
+ const reactions = (schema as Record<string, unknown>)['x-reactions']
280
+ const fetchOnSearch = (schema as Record<string, unknown>)[
281
+ 'x-fetchdata-onsearch'
282
+ ]
283
+
284
+ // 将 x-datasource-effect 配置转换请求函数,并添加到 x-reactions
285
+ const loadDataReaction = asyncLoadDataSource(
286
+ transformSourceEffect(value, {
287
+ scope,
288
+ searchKey: schema['x-fetchdata-searchkey'],
289
+ }),
290
+ {
291
+ fetchOnSearch: !!fetchOnSearch,
292
+ }
293
+ )
294
+
295
+ /**
296
+ * 标识 x-datasource-effect 属性存在
297
+ * TODO: 为什么不保留原来的 x-datasource-effect 配置数据?
298
+ * 因为 x-datasource-effect 里的配置会使用 FormPathPattern,如{{$values.0.productName}},这种配置在 Formily SchemaField 解析时内部会报错:
299
+ * Uncaught SyntaxError: Unexpected token '.',因为内部识别到了变量标识 {{xxx}} 执行了 shallowCompile, FormPathPattern 的一些格式在 shallowCompile 这里会报错。
300
+ */
301
+ ;(newSchema as Record<string, unknown>)[key] = true
302
+
303
+ if (reactions !== undefined) {
304
+ if (Array.isArray(reactions)) {
305
+ // 已经是数组,插入到第1个位置
306
+ newSchema['x-reactions'] = [loadDataReaction, ...reactions]
307
+ } else {
308
+ // 不是数组,转换为数组
309
+ newSchema['x-reactions'] = [loadDataReaction, reactions]
310
+ }
311
+ } else {
312
+ // x-reactions 不存在,创建新数组
313
+ newSchema['x-reactions'] = [loadDataReaction]
314
+ }
315
+ } else if (key === 'x-reactions' && value) {
316
+ // 如果 x-reactions 已经被上面的 x-datasource-effect 处理过了,跳过
317
+ if ((schema as Record<string, unknown>)['x-datasource-effect']) {
318
+ // 已处理,跳过
319
+ continue
320
+ } else if (Array.isArray(value)) {
321
+ ;(newSchema as Record<string, unknown>)[key] = value.map((item) =>
322
+ transformSchema(item as ISchema, scope, nodeKey)
323
+ )
324
+ } else {
325
+ ;(newSchema as Record<string, unknown>)[key] = transformSchema(
326
+ value as ISchema,
327
+ scope,
328
+ nodeKey
329
+ )
330
+ }
331
+ } else if (key === 'items' && value && typeof value === 'object') {
332
+ // 处理 type: array 的 items 属性,传递 items 前缀作为 fieldName 的一部分
333
+ ;(newSchema as Record<string, unknown>)[key] = transformSchema(
334
+ value as ISchema,
335
+ scope,
336
+ `${nodeKey ? nodeKey + '_' : ''}items`
337
+ )
338
+ } else if (value && typeof value === 'object') {
339
+ ;(newSchema as Record<string, unknown>)[key] = transformSchema(
340
+ value as ISchema,
341
+ scope,
342
+ nodeKey
343
+ )
344
+ } else {
345
+ // 复制基本类型值
346
+ Object.defineProperty(newSchema, key, {
347
+ value,
348
+ writable: true,
349
+ enumerable: true,
350
+ configurable: true,
351
+ })
352
+ }
353
+ }
354
+ }
355
+
356
+ return newSchema as ISchema
357
+ }
358
+
359
+ /** 将 params 存在表单依赖的字段处理为新对象返回 */
360
+ function getDepsFormFieldParams(params: Record<string, any>) {
361
+ return Object.fromEntries(
362
+ Object.entries(params).filter(([, value]) => value && isFormVariable(value))
363
+ )
364
+ }
365
+
366
+ /** 收集表单依赖的字段数据,返回参数对象 */
367
+ function getDepsFormFieldData(depsFieldObj: Record<string, any>, field: Field) {
368
+ return Object.entries(depsFieldObj).reduce<Record<string, any>>(
369
+ (acc, [key, value]) => {
370
+ // 获取表单字段的值作为参数字段值
371
+ acc[key] = field.query(getFormVariableFieldPath(value)).get('value')
372
+ return acc
373
+ },
374
+ {}
375
+ )
376
+ }
377
+
378
+ /** 将 x-datasource-effect 配置转换为执行真实请求的函数 */
379
+ function transformSourceEffect(
380
+ dataConfig: IRemoteDataSource,
381
+ options?: {
382
+ /** 变量作用域 */
383
+ scope: Record<string, any>
384
+ /** 配置的搜索字段名 */
385
+ searchKey?: string
386
+ }
387
+ ) {
388
+ const { scope, searchKey = 'keyword' } = options ?? {}
389
+ const params = dataConfig?.params
390
+ // 请求参数依赖的表单字段集合
391
+ const depsFieldsObj = params ? getDepsFormFieldParams(params) : {}
392
+ return async (field: Field, searchValue?: string) => {
393
+ // localStorage 对象数据
394
+ const $localStorage = getLocalStorageData() ?? {}
395
+ // 表单数据
396
+ // TODO: 这里的 field.form.values 得到的是一个 Proxy 对象,看能否转换为普通对象
397
+ const $values = field.form.values ?? {}
398
+ /** 变量局部作用域 */
399
+ const variablesScope = { ...scope, $values, $localStorage }
400
+ // 构建联动参数
401
+ const linkageParams = getDepsFormFieldData(depsFieldsObj, field)
402
+ const headers = dataConfig.headers
403
+ ? parseObjectVariables(dataConfig.headers, variablesScope)
404
+ : {}
405
+ // 移除依赖表单字段的请求参数(将depsFieldsObj的属性从dataConfig.params中移除)
406
+ const configParams = Object.fromEntries(
407
+ Object.entries(dataConfig.params ?? {}).filter(
408
+ ([key]) => !depsFieldsObj[key]
409
+ )
410
+ )
411
+ const paramsObj = parseObjectVariables(
412
+ Object.assign({}, configParams ?? {}, linkageParams ?? {}),
413
+ variablesScope
414
+ )
415
+ // TODO: 这里搜索的请求参数 key 需要优化,应该是配置的搜索字段名
416
+ // 如果有搜索值,添加到请求参数中
417
+ if (searchValue !== undefined) {
418
+ paramsObj[replaceVariables(searchKey, field) || 'keyword'] = searchValue
419
+ }
420
+
421
+ // 处理 URL:GET 请求将参数附加到 URL,其他请求放在 body
422
+ let url = parseStringVariables(dataConfig.url, variablesScope)
423
+ const isGet = dataConfig.method?.toUpperCase() === 'GET'
424
+ let body: string | undefined
425
+
426
+ if (isGet) {
427
+ if (Object.keys(paramsObj).length > 0) {
428
+ const searchParams = new URLSearchParams(paramsObj)
429
+ url = `${url}${url.includes('?') ? '&' : '?'}${searchParams.toString()}`
430
+ }
431
+ } else {
432
+ body = JSON.stringify(paramsObj)
433
+ }
434
+
435
+ const config = {
436
+ url,
437
+ method: dataConfig.method,
438
+ headers: {
439
+ 'Content-Type': 'application/json',
440
+ Authorization: $localStorage?.token as string,
441
+ ...headers,
442
+ },
443
+ body,
444
+ }
445
+
446
+ const beforeFn = parseFunction<(config: any) => any>(
447
+ dataConfig.beforeRequest,
448
+ ['config']
449
+ )
450
+ if (beforeFn) {
451
+ beforeFn(config)
452
+ }
453
+
454
+ return fetch(config.url, {
455
+ method: config.method,
456
+ headers: config.headers,
457
+ body: config.body,
458
+ })
459
+ .then((res) => res.json())
460
+ .then((res) => {
461
+ const handlerFn = parseFunction<(result: typeof res) => any>(
462
+ dataConfig.dataHandler,
463
+ ['res']
464
+ )
465
+ return handlerFn ? handlerFn(res) : res
466
+ })
467
+ }
468
+ }
469
+
470
+ /** 内部递归函数,接收父级的 fieldName */
471
+ function transformScopeRecursive(
472
+ schema: ISchema,
473
+ fieldName: string
474
+ ): Record<string, ReturnType<typeof transformSourceEffect>> {
475
+ const scope: Record<string, ReturnType<typeof transformSourceEffect>> = {}
476
+
477
+ /**
478
+ * 处理当前层级的 x-datasource-effect 配置
479
+ * x-datasource-type: 'static' | 'remote'
480
+ */
481
+ if (
482
+ schema['x-datasource-type'] === 'remote' &&
483
+ schema['x-datasource-effect']
484
+ ) {
485
+ const sourceEffect = schema['x-datasource-effect'] as IRemoteDataSource
486
+ scope[`loadData_${fieldName}`] = transformSourceEffect(sourceEffect)
487
+ }
488
+
489
+ // 递归处理子属性
490
+ if (schema.properties) {
491
+ Object.entries(schema.properties).forEach(([key, childSchema]) => {
492
+ const childScope = transformScopeRecursive(childSchema as ISchema, key)
493
+ Object.assign(scope, childScope)
494
+ })
495
+ }
496
+
497
+ // 处理 type: array 的 items 属性下的 x-datasource-effect
498
+ if (schema.items && typeof schema.items === 'object') {
499
+ const itemsScope = transformScopeRecursive(
500
+ schema.items as ISchema,
501
+ `${fieldName}__items`
502
+ )
503
+ Object.assign(scope, itemsScope)
504
+ }
505
+
506
+ return scope
507
+ }
508
+
509
+ /** 处理 schema 中远端数据获取的配置,添加到 scope 中 */
510
+ export function transformScope(
511
+ schema: ISchema
512
+ ): Record<string, () => ReturnType<typeof transformSourceEffect>> {
513
+ /**
514
+ * x-datasource-type: 'static' | 'remote'
515
+ */
516
+ if (!schema || typeof schema !== 'object') {
517
+ return {}
518
+ }
519
+
520
+ const scope: Record<string, () => ReturnType<typeof transformSourceEffect>> =
521
+ {}
522
+
523
+ // 递归处理子属性,使用 properties 的 key 作为 fieldName
524
+ if (schema.properties) {
525
+ Object.entries(schema.properties).forEach(([fieldName, childSchema]) => {
526
+ const childScope = transformScopeRecursive(
527
+ childSchema as ISchema,
528
+ fieldName
529
+ )
530
+ Object.assign(scope, childScope)
531
+ })
532
+ }
533
+
534
+ return scope
535
+ }
536
+
537
+ /** 防抖定时器 Map,用于存储每个 field 的定时器 */
538
+ const searchDebounceTimer = new Map<string, ReturnType<typeof setTimeout>>()
539
+
540
+ /**
541
+ * TODO: 异步加载数据逻辑可以考虑换到 x-reactions 里通过方法直接传入,不使用 scope 的方式。
542
+ * 如: x-reactions=[function loadData(field) { ... }, otherReactions]
543
+ * 因为使用 scope 的方式需要去维护调用的名称和创建的名称一致。
544
+ */
545
+ /** 异步加载数据 */
546
+ export const asyncLoadDataSource =
547
+ (
548
+ service: (field: Field, searchValue?: string) => Promise<any>,
549
+ options?: { fetchOnSearch?: boolean }
550
+ ) =>
551
+ (field: Field) => {
552
+ // console.log('field.path', field.path?.toString())
553
+ // console.log('field.address', field.address?.toString())
554
+ field.loading = true
555
+ service(field).then(
556
+ // action.bound 用于批量动作,保证更新多次数据,只触发 1 次 Reaction 执行
557
+ action.bound?.((data) => {
558
+ // TODO: 判断是依赖的表单字段变化触发的请求,考虑清空 field.value 旧值
559
+ // field.value = undefined
560
+ field.dataSource = data?.data || data
561
+ field.loading = false
562
+ })
563
+ )
564
+
565
+ // 如果启用了 fetchOnSearch,通过 setComponentProps 设置 onSearch
566
+ if (options?.fetchOnSearch) {
567
+ // 先保存原有的 onSearch 引用,避免闭包中循环调用
568
+ const originalOnSearch = field.componentProps?.onSearch
569
+ // 使用 field.path 作为唯一标识
570
+ const fieldKey = field.path?.toString() || field.address?.toString()
571
+ field.setComponentProps({
572
+ ...field.componentProps,
573
+ onSearch: (value: string) => {
574
+ // 先调用原有的 onSearch
575
+ originalOnSearch?.(value)
576
+
577
+ // 清除之前的定时器
578
+ const existingTimer = searchDebounceTimer.get(fieldKey)
579
+ if (existingTimer) {
580
+ clearTimeout(existingTimer)
581
+ }
582
+
583
+ // 设置新的定时器,使用闭包捕获当前的 value
584
+ const timer = setTimeout(() => {
585
+ searchDebounceTimer.delete(fieldKey)
586
+ // 重新请求
587
+ field.loading = true
588
+ service(field, value).then(
589
+ action.bound?.((data) => {
590
+ field.dataSource = data?.data || data
591
+ field.loading = false
592
+ })
593
+ )
594
+ }, 300)
595
+ searchDebounceTimer.set(fieldKey, timer)
596
+ },
597
+ })
598
+ }
599
+ }
600
+
601
+ /** API 配置接口 */
602
+ export interface IFormApiConfig {
603
+ url: string
604
+ method: string
605
+ headers?: Record<string, string>
606
+ params?: Record<string, string>
607
+ beforeRequest?: string
608
+ dataHandler?: string
609
+ /**
610
+ * 承载表单数据的请求参数key和详情数据里获取表单数据的key
611
+ * 如果不配置,默认使用整个表单数据作为请求参数
612
+ */
613
+ dataKey?: string
614
+ }
615
+
616
+ /** 获取所有 localStorage 数据,返回一个对象 */
617
+ export function getLocalStorageData() {
618
+ const data: Record<string, any> = {}
619
+ for (let i = 0; i < localStorage.length; i++) {
620
+ const key = localStorage.key(i)
621
+ if (key) {
622
+ const value = localStorage.getItem(key)
623
+ try {
624
+ data[key] = value ? JSON.parse(value) : null
625
+ } catch {
626
+ data[key] = value
627
+ }
628
+ }
629
+ }
630
+ return data
631
+ }
632
+
633
+ /**
634
+ * 处理字符串里的变量,返回替换后的字符串
635
+ * 方法内部使用 shallowCompile 进行解析
636
+ * @example
637
+ * parseStringVariables('https://example.com/api?name={{$values.name}}&userid={{$localStorage.userid}}', {$values: { name: '123' }, $localStorage: { userid: 'USER_1' }}) // => 'https://example.com/api?name=123&userid=USER_1'
638
+ */
639
+ export function parseStringVariables(str: string, scope: Record<string, any>) {
640
+ // 存在变量数据
641
+ if (str && /\{\{[\s\S]*\}\}/.test(str)) {
642
+ // 将字符串按变量格式拆分成数组,元素包含变量字符串和普通字符串
643
+ const parts = str.split(/(\{\{[\s\S]*?\}\})/g)
644
+ return parts.reduce((result, part) => {
645
+ // 拼接解析后的字符串
646
+ return result + shallowCompile(part, scope)
647
+ }, '')
648
+ }
649
+ return str
650
+ }
651
+
652
+ /**
653
+ * 执行表单 API 请求
654
+ * TODO: 传入的 apiConfig 里 params 配置中如果存在变量,会被提前解析,所以这里目前只能获取到具体值,而不是变量字符串。
655
+ * 应该是传入 schema 配置时,formily 内部就把所有变量解析(包括自定义属性里的变量),所以该方法里所有处理变量的逻辑都没有实际生效(除了url里的变量,业务url不是直接{{开头的)
656
+ */
657
+ export async function executeFormApi<T = any>(
658
+ apiConfig: IFormApiConfig,
659
+ formValues?: Record<string, any>,
660
+ options?: {
661
+ apiParams?: Record<string, any>
662
+ /** 变量作用域 */
663
+ scope?: Record<string, any>
664
+ }
665
+ ): Promise<ResponseResult<T> | undefined> {
666
+ const {
667
+ url,
668
+ method,
669
+ headers = {},
670
+ params = {},
671
+ beforeRequest,
672
+ dataHandler,
673
+ dataKey,
674
+ } = apiConfig
675
+ const { apiParams = {}, scope } = options ?? {}
676
+ const $localStorage = getLocalStorageData() ?? {}
677
+ // 变量作用域
678
+ const variablesScope = { ...scope, $values: formValues ?? {}, $localStorage }
679
+ // 构建请求头
680
+ const requestHeaders: Record<string, string> = parseObjectVariables(
681
+ { Authorization: $localStorage?.token, ...headers },
682
+ variablesScope
683
+ )
684
+
685
+ // 构建请求参数
686
+ const queryParams: Record<string, any> = {
687
+ ...apiParams,
688
+ ...formValues,
689
+ ...parseObjectVariables(params, variablesScope),
690
+ }
691
+
692
+ // 构建完整 URL
693
+ const fullUrl = parseStringVariables(url, variablesScope)
694
+ const config = {
695
+ url: fullUrl,
696
+ method,
697
+ headers: requestHeaders,
698
+ params: queryParams,
699
+ }
700
+
701
+ // 执行 beforeRequest 钩子
702
+ if (beforeRequest) {
703
+ try {
704
+ const beforeFn = parseFunction(beforeRequest, ['config'])
705
+ beforeFn?.(config)
706
+ } catch (e) {
707
+ console.error('beforeRequest 执行失败:', e)
708
+ }
709
+ }
710
+
711
+ // 处理参数到配置的 dataKey 字段
712
+ if (dataKey) {
713
+ config.params = {
714
+ ...apiParams,
715
+ [dataKey]: config.params,
716
+ }
717
+ }
718
+ // 发起请求
719
+ let result: ResponseResult<T>
720
+ switch (method) {
721
+ case 'GET':
722
+ result = await get<T>(config.url, config.params, {
723
+ headers: config.headers,
724
+ })
725
+ break
726
+ default:
727
+ result = await post<T>(config.url, config.params, {
728
+ headers: config.headers,
729
+ method: method || 'POST',
730
+ })
731
+ break
732
+ }
733
+ // 执行 dataHandler 钩子
734
+ if (dataHandler) {
735
+ try {
736
+ const handlerFn = parseFunction(dataHandler, ['data'])
737
+ return handlerFn?.(result)
738
+ } catch (e) {
739
+ console.error('dataHandler 执行失败:', e)
740
+ }
741
+ } else {
742
+ return result
743
+ }
744
+ }