@zerodep-dev/vue-tsx-pro-ui 0.2.0 → 0.3.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 (416) hide show
  1. package/dist/base/Badge.js +3 -3
  2. package/dist/base/Badge.js.map +1 -1
  3. package/dist/base/Can.d.ts +12 -0
  4. package/dist/base/Can.js +20 -0
  5. package/dist/base/Can.js.map +1 -0
  6. package/dist/base/ClientOnly.d.ts +10 -0
  7. package/dist/base/ClientOnly.js +18 -0
  8. package/dist/base/ClientOnly.js.map +1 -0
  9. package/dist/base/CloseButton.js +3 -3
  10. package/dist/base/CloseButton.js.map +1 -1
  11. package/dist/base/CodeBlock.js +5 -5
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.js +3 -3
  14. package/dist/base/CopyButton.js.map +1 -1
  15. package/dist/base/Icon.js +3 -3
  16. package/dist/base/Icon.js.map +1 -1
  17. package/dist/base/Indicator.js +3 -3
  18. package/dist/base/Indicator.js.map +1 -1
  19. package/dist/base/StatusDot.js +3 -3
  20. package/dist/base/StatusDot.js.map +1 -1
  21. package/dist/base/Tag.js +5 -5
  22. package/dist/base/Tag.js.map +1 -1
  23. package/dist/base/button-core.js +4 -4
  24. package/dist/base/button-core.js.map +1 -1
  25. package/dist/charts/AreaChart.js +3 -3
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.js +3 -3
  28. package/dist/charts/BarChart.js.map +1 -1
  29. package/dist/charts/ChordChart.js +3 -3
  30. package/dist/charts/ChordChart.js.map +1 -1
  31. package/dist/charts/ComboChart.js +3 -3
  32. package/dist/charts/ComboChart.js.map +1 -1
  33. package/dist/charts/DonutChart.js +3 -3
  34. package/dist/charts/DonutChart.js.map +1 -1
  35. package/dist/charts/FunnelChart.js +5 -5
  36. package/dist/charts/FunnelChart.js.map +1 -1
  37. package/dist/charts/GraphChart.js +3 -3
  38. package/dist/charts/GraphChart.js.map +1 -1
  39. package/dist/charts/LineChart.js +3 -3
  40. package/dist/charts/LineChart.js.map +1 -1
  41. package/dist/charts/MapChart.js +7 -7
  42. package/dist/charts/MapChart.js.map +1 -1
  43. package/dist/charts/RadarChart.js +16 -15
  44. package/dist/charts/RadarChart.js.map +1 -1
  45. package/dist/charts/SankeyChart.js +3 -3
  46. package/dist/charts/SankeyChart.js.map +1 -1
  47. package/dist/charts/ScatterChart.js +3 -3
  48. package/dist/charts/ScatterChart.js.map +1 -1
  49. package/dist/charts/TimelineChart.js +6 -5
  50. package/dist/charts/TimelineChart.js.map +1 -1
  51. package/dist/charts/TreemapChart.js +3 -3
  52. package/dist/charts/TreemapChart.js.map +1 -1
  53. package/dist/charts/WaterfallChart.js +3 -3
  54. package/dist/charts/WaterfallChart.js.map +1 -1
  55. package/dist/charts/XYChart.js +9 -7
  56. package/dist/charts/XYChart.js.map +1 -1
  57. package/dist/charts/frame.js +10 -8
  58. package/dist/charts/frame.js.map +1 -1
  59. package/dist/charts/single.js +4 -3
  60. package/dist/charts/single.js.map +1 -1
  61. package/dist/config/Provider.d.ts +3 -1
  62. package/dist/config/Provider.js +9 -4
  63. package/dist/config/Provider.js.map +1 -1
  64. package/dist/config/context.d.ts +18 -0
  65. package/dist/config/context.js +16 -1
  66. package/dist/config/context.js.map +1 -1
  67. package/dist/config/createUi.d.ts +20 -3
  68. package/dist/config/createUi.js +80 -49
  69. package/dist/config/createUi.js.map +1 -1
  70. package/dist/config/layout/preference.d.ts +43 -0
  71. package/dist/config/layout/preference.js +108 -0
  72. package/dist/config/layout/preference.js.map +1 -0
  73. package/dist/date/Calendar.js +3 -3
  74. package/dist/date/Calendar.js.map +1 -1
  75. package/dist/date/CalendarBoard.js +9 -9
  76. package/dist/date/CalendarBoard.js.map +1 -1
  77. package/dist/date/CalendarView.js +7 -7
  78. package/dist/date/CalendarView.js.map +1 -1
  79. package/dist/date/DateField.js +3 -3
  80. package/dist/date/DateField.js.map +1 -1
  81. package/dist/date/DatePicker.js +5 -5
  82. package/dist/date/DatePicker.js.map +1 -1
  83. package/dist/date/DateRangePicker.js +5 -5
  84. package/dist/date/DateRangePicker.js.map +1 -1
  85. package/dist/date/DateSegmentGroup.js +5 -5
  86. package/dist/date/DateSegmentGroup.js.map +1 -1
  87. package/dist/date/QuarterCalendar.js +6 -6
  88. package/dist/date/QuarterCalendar.js.map +1 -1
  89. package/dist/date/RangeCalendar.js +3 -3
  90. package/dist/date/RangeCalendar.js.map +1 -1
  91. package/dist/date/SegmentedField.js +3 -3
  92. package/dist/date/SegmentedField.js.map +1 -1
  93. package/dist/date/TimeField.js +3 -3
  94. package/dist/date/TimeField.js.map +1 -1
  95. package/dist/date/TimePicker.js +4 -4
  96. package/dist/date/TimePicker.js.map +1 -1
  97. package/dist/date/date-segments.js +1 -1
  98. package/dist/date/date-segments.js.map +1 -1
  99. package/dist/date/picker-popover.js +3 -2
  100. package/dist/date/picker-popover.js.map +1 -1
  101. package/dist/diagram/Diagram.js +12 -12
  102. package/dist/diagram/Diagram.js.map +1 -1
  103. package/dist/diagram/DiagramLanes.js +3 -3
  104. package/dist/diagram/DiagramLanes.js.map +1 -1
  105. package/dist/diagram/DiagramMinimap.js +4 -4
  106. package/dist/diagram/DiagramMinimap.js.map +1 -1
  107. package/dist/display/Accordion.js +6 -6
  108. package/dist/display/Accordion.js.map +1 -1
  109. package/dist/display/AnimatedNumber.js +4 -4
  110. package/dist/display/AnimatedNumber.js.map +1 -1
  111. package/dist/display/Avatar.js +4 -4
  112. package/dist/display/Avatar.js.map +1 -1
  113. package/dist/display/Checklist.js +7 -7
  114. package/dist/display/Checklist.js.map +1 -1
  115. package/dist/display/Collapse.js +8 -5
  116. package/dist/display/Collapse.js.map +1 -1
  117. package/dist/display/Collapsible.js +3 -3
  118. package/dist/display/Collapsible.js.map +1 -1
  119. package/dist/display/Descriptions.js +5 -5
  120. package/dist/display/Descriptions.js.map +1 -1
  121. package/dist/display/Ellipsis.js +3 -3
  122. package/dist/display/Ellipsis.js.map +1 -1
  123. package/dist/display/FieldCompare.js +4 -4
  124. package/dist/display/FieldCompare.js.map +1 -1
  125. package/dist/display/Gauge.js +11 -11
  126. package/dist/display/Gauge.js.map +1 -1
  127. package/dist/display/Image.js +4 -4
  128. package/dist/display/Image.js.map +1 -1
  129. package/dist/display/Marquee.js +3 -3
  130. package/dist/display/Marquee.js.map +1 -1
  131. package/dist/display/ProportionBar.js +4 -4
  132. package/dist/display/ProportionBar.js.map +1 -1
  133. package/dist/display/Sortable.js +4 -4
  134. package/dist/display/Sortable.js.map +1 -1
  135. package/dist/display/Sparkline.js +6 -6
  136. package/dist/display/Sparkline.js.map +1 -1
  137. package/dist/display/Stat.js +3 -3
  138. package/dist/display/Stat.js.map +1 -1
  139. package/dist/display/Timeline.js +7 -7
  140. package/dist/display/Timeline.js.map +1 -1
  141. package/dist/display/Tree.js +10 -10
  142. package/dist/display/Tree.js.map +1 -1
  143. package/dist/display/VirtualList.js +7 -7
  144. package/dist/display/VirtualList.js.map +1 -1
  145. package/dist/display/Watermark.js +3 -3
  146. package/dist/display/Watermark.js.map +1 -1
  147. package/dist/docs-kit/CodeGroup.js +5 -5
  148. package/dist/docs-kit/CodeGroup.js.map +1 -1
  149. package/dist/docs-kit/CodePreview.js +6 -6
  150. package/dist/docs-kit/CodePreview.js.map +1 -1
  151. package/dist/docs-kit/PropsTable.js +4 -4
  152. package/dist/docs-kit/PropsTable.js.map +1 -1
  153. package/dist/feedback/Alert.js +5 -5
  154. package/dist/feedback/Alert.js.map +1 -1
  155. package/dist/feedback/Banner.js +5 -5
  156. package/dist/feedback/Banner.js.map +1 -1
  157. package/dist/feedback/Empty.js +4 -4
  158. package/dist/feedback/Empty.js.map +1 -1
  159. package/dist/feedback/LoadingBar.js +20 -13
  160. package/dist/feedback/LoadingBar.js.map +1 -1
  161. package/dist/feedback/LoadingOverlay.js +3 -3
  162. package/dist/feedback/LoadingOverlay.js.map +1 -1
  163. package/dist/feedback/Progress.js +14 -14
  164. package/dist/feedback/Progress.js.map +1 -1
  165. package/dist/feedback/Result.js +4 -4
  166. package/dist/feedback/Result.js.map +1 -1
  167. package/dist/feedback/SkeletonText.js +3 -3
  168. package/dist/feedback/SkeletonText.js.map +1 -1
  169. package/dist/feedback/Toast.js +6 -6
  170. package/dist/feedback/Toast.js.map +1 -1
  171. package/dist/form/Field.js +7 -7
  172. package/dist/form/Field.js.map +1 -1
  173. package/dist/form/Form.js +3 -3
  174. package/dist/form/Form.js.map +1 -1
  175. package/dist/form/FormErrorSummary.js +3 -3
  176. package/dist/form/FormErrorSummary.js.map +1 -1
  177. package/dist/form/FormSection.js +6 -6
  178. package/dist/form/FormSection.js.map +1 -1
  179. package/dist/index.d.ts +11 -6
  180. package/dist/index.js +10 -5
  181. package/dist/input/Autocomplete.js +3 -3
  182. package/dist/input/Autocomplete.js.map +1 -1
  183. package/dist/input/Cascader.js +7 -7
  184. package/dist/input/Cascader.js.map +1 -1
  185. package/dist/input/CharacterCount.js +3 -3
  186. package/dist/input/CharacterCount.js.map +1 -1
  187. package/dist/input/Checkbox.js +5 -5
  188. package/dist/input/Checkbox.js.map +1 -1
  189. package/dist/input/ColorField.js +4 -4
  190. package/dist/input/ColorField.js.map +1 -1
  191. package/dist/input/Combobox.js +4 -4
  192. package/dist/input/Combobox.js.map +1 -1
  193. package/dist/input/ConditionBuilder.js +15 -14
  194. package/dist/input/ConditionBuilder.js.map +1 -1
  195. package/dist/input/FileDrop.js +3 -3
  196. package/dist/input/FileDrop.js.map +1 -1
  197. package/dist/input/Listbox.js +9 -9
  198. package/dist/input/Listbox.js.map +1 -1
  199. package/dist/input/Mentions.js +3 -3
  200. package/dist/input/Mentions.js.map +1 -1
  201. package/dist/input/NumberField.js +3 -3
  202. package/dist/input/NumberField.js.map +1 -1
  203. package/dist/input/NumberRangeField.js +5 -5
  204. package/dist/input/NumberRangeField.js.map +1 -1
  205. package/dist/input/OtpField.js +5 -5
  206. package/dist/input/OtpField.js.map +1 -1
  207. package/dist/input/PeoplePicker.js +6 -6
  208. package/dist/input/PeoplePicker.js.map +1 -1
  209. package/dist/input/PeoplePickerPanel.js +4 -4
  210. package/dist/input/PeoplePickerPanel.js.map +1 -1
  211. package/dist/input/Radio.js +4 -4
  212. package/dist/input/Radio.js.map +1 -1
  213. package/dist/input/Rating.js +5 -5
  214. package/dist/input/Rating.js.map +1 -1
  215. package/dist/input/Select.js +4 -4
  216. package/dist/input/Select.js.map +1 -1
  217. package/dist/input/SelectedTags.js +4 -4
  218. package/dist/input/SelectedTags.js.map +1 -1
  219. package/dist/input/Slider.js +6 -6
  220. package/dist/input/Slider.js.map +1 -1
  221. package/dist/input/Switch.js +3 -3
  222. package/dist/input/Switch.js.map +1 -1
  223. package/dist/input/TagsInput.js +5 -5
  224. package/dist/input/TagsInput.js.map +1 -1
  225. package/dist/input/TextField.js +5 -5
  226. package/dist/input/TextField.js.map +1 -1
  227. package/dist/input/Textarea.js +4 -4
  228. package/dist/input/Textarea.js.map +1 -1
  229. package/dist/input/ToggleGroup.js +4 -4
  230. package/dist/input/ToggleGroup.js.map +1 -1
  231. package/dist/input/Transfer.js +8 -8
  232. package/dist/input/Transfer.js.map +1 -1
  233. package/dist/input/TreeSelect.js +6 -6
  234. package/dist/input/TreeSelect.js.map +1 -1
  235. package/dist/input/Upload.js +8 -8
  236. package/dist/input/Upload.js.map +1 -1
  237. package/dist/layout/Affix.js +4 -4
  238. package/dist/layout/Affix.js.map +1 -1
  239. package/dist/layout/ResizeHandle.d.ts +6 -2
  240. package/dist/layout/ResizeHandle.js +32 -9
  241. package/dist/layout/ResizeHandle.js.map +1 -1
  242. package/dist/layout/ScrollArea.js +3 -3
  243. package/dist/layout/ScrollArea.js.map +1 -1
  244. package/dist/layout/Separator.js +3 -3
  245. package/dist/layout/Separator.js.map +1 -1
  246. package/dist/layout/Splitter.js +3 -3
  247. package/dist/layout/Splitter.js.map +1 -1
  248. package/dist/layout/ViewportFill.d.ts +2 -2
  249. package/dist/layout/ViewportFill.js +4 -4
  250. package/dist/layout/ViewportFill.js.map +1 -1
  251. package/dist/navigation/Breadcrumbs.js +4 -4
  252. package/dist/navigation/Breadcrumbs.js.map +1 -1
  253. package/dist/navigation/NavBar.js +6 -6
  254. package/dist/navigation/NavBar.js.map +1 -1
  255. package/dist/navigation/NavList.d.ts +1 -0
  256. package/dist/navigation/NavList.js +20 -12
  257. package/dist/navigation/NavList.js.map +1 -1
  258. package/dist/navigation/NavMenu.d.ts +27 -0
  259. package/dist/navigation/NavMenu.js +54 -0
  260. package/dist/navigation/NavMenu.js.map +1 -0
  261. package/dist/navigation/PageJump.js +3 -3
  262. package/dist/navigation/PageJump.js.map +1 -1
  263. package/dist/navigation/PageSizeSelect.js +4 -4
  264. package/dist/navigation/PageSizeSelect.js.map +1 -1
  265. package/dist/navigation/Pagination.js +6 -6
  266. package/dist/navigation/Pagination.js.map +1 -1
  267. package/dist/navigation/PaginationBar.js +5 -5
  268. package/dist/navigation/PaginationBar.js.map +1 -1
  269. package/dist/navigation/Steps.js +4 -4
  270. package/dist/navigation/Steps.js.map +1 -1
  271. package/dist/navigation/TableOfContents.js +5 -5
  272. package/dist/navigation/TableOfContents.js.map +1 -1
  273. package/dist/navigation/Tabs.js +7 -7
  274. package/dist/navigation/Tabs.js.map +1 -1
  275. package/dist/navigation/Toolbar.js +3 -3
  276. package/dist/navigation/Toolbar.js.map +1 -1
  277. package/dist/overlay/AlertDialog.js +4 -4
  278. package/dist/overlay/AlertDialog.js.map +1 -1
  279. package/dist/overlay/CommandPalette.js +4 -4
  280. package/dist/overlay/CommandPalette.js.map +1 -1
  281. package/dist/overlay/ContextMenu.js +3 -3
  282. package/dist/overlay/ContextMenu.js.map +1 -1
  283. package/dist/overlay/Dialog.js +4 -4
  284. package/dist/overlay/Dialog.js.map +1 -1
  285. package/dist/overlay/Drawer.js +5 -5
  286. package/dist/overlay/Drawer.js.map +1 -1
  287. package/dist/overlay/HoverCard.js +5 -3
  288. package/dist/overlay/HoverCard.js.map +1 -1
  289. package/dist/overlay/Lightbox.js +5 -5
  290. package/dist/overlay/Lightbox.js.map +1 -1
  291. package/dist/overlay/Menu.js +7 -7
  292. package/dist/overlay/Menu.js.map +1 -1
  293. package/dist/overlay/ModalCore.js +9 -9
  294. package/dist/overlay/ModalCore.js.map +1 -1
  295. package/dist/overlay/Popconfirm.js +6 -6
  296. package/dist/overlay/Popconfirm.js.map +1 -1
  297. package/dist/overlay/Popover.js +5 -3
  298. package/dist/overlay/Popover.js.map +1 -1
  299. package/dist/overlay/Tooltip.js +5 -3
  300. package/dist/overlay/Tooltip.js.map +1 -1
  301. package/dist/overlay/Tour.js +8 -8
  302. package/dist/overlay/Tour.js.map +1 -1
  303. package/dist/overlay/detached.d.ts +2 -0
  304. package/dist/overlay/detached.js +73 -42
  305. package/dist/overlay/detached.js.map +1 -1
  306. package/dist/patterns/ActionBar.js +3 -3
  307. package/dist/patterns/ActionBar.js.map +1 -1
  308. package/dist/patterns/AppShell.d.ts +28 -1
  309. package/dist/patterns/AppShell.js +158 -52
  310. package/dist/patterns/AppShell.js.map +1 -1
  311. package/dist/patterns/AuthLayout.d.ts +28 -0
  312. package/dist/patterns/AuthLayout.js +77 -0
  313. package/dist/patterns/AuthLayout.js.map +1 -0
  314. package/dist/patterns/CommentThread.js +9 -9
  315. package/dist/patterns/CommentThread.js.map +1 -1
  316. package/dist/patterns/DataImport.js +4 -4
  317. package/dist/patterns/DataImport.js.map +1 -1
  318. package/dist/patterns/DeadlineBadge.js +3 -3
  319. package/dist/patterns/DeadlineBadge.js.map +1 -1
  320. package/dist/patterns/FilterBar.d.ts +11 -1
  321. package/dist/patterns/FilterBar.js +39 -10
  322. package/dist/patterns/FilterBar.js.map +1 -1
  323. package/dist/patterns/FormDialog.d.ts +18 -0
  324. package/dist/patterns/FormDialog.js +46 -0
  325. package/dist/patterns/FormDialog.js.map +1 -0
  326. package/dist/patterns/KanbanBoard.js +8 -8
  327. package/dist/patterns/KanbanBoard.js.map +1 -1
  328. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  329. package/dist/patterns/LayoutSwitcher.js +79 -0
  330. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  331. package/dist/patterns/NotificationCenter.js +8 -8
  332. package/dist/patterns/NotificationCenter.js.map +1 -1
  333. package/dist/patterns/PageTabs.d.ts +12 -7
  334. package/dist/patterns/PageTabs.js +41 -29
  335. package/dist/patterns/PageTabs.js.map +1 -1
  336. package/dist/patterns/QueryTable.d.ts +7 -1
  337. package/dist/patterns/QueryTable.js +116 -81
  338. package/dist/patterns/QueryTable.js.map +1 -1
  339. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  340. package/dist/patterns/SlideCaptcha.js +354 -0
  341. package/dist/patterns/SlideCaptcha.js.map +1 -0
  342. package/dist/patterns/StepsForm.js +7 -7
  343. package/dist/patterns/StepsForm.js.map +1 -1
  344. package/dist/patterns/ThemeSwitcher.js +3 -3
  345. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  346. package/dist/patterns/index.d.ts +7 -3
  347. package/dist/patterns/index.js +5 -1
  348. package/dist/patterns/messages.d.ts +37 -1
  349. package/dist/patterns/messages.js +38 -2
  350. package/dist/patterns/messages.js.map +1 -1
  351. package/dist/table/ColumnHeaderActions.js +3 -3
  352. package/dist/table/ColumnHeaderActions.js.map +1 -1
  353. package/dist/table/ColumnResizer.js +3 -3
  354. package/dist/table/ColumnResizer.js.map +1 -1
  355. package/dist/table/ColumnSettings.js +5 -5
  356. package/dist/table/ColumnSettings.js.map +1 -1
  357. package/dist/table/ColumnTable.js +8 -8
  358. package/dist/table/ColumnTable.js.map +1 -1
  359. package/dist/table/DataTable.js +8 -8
  360. package/dist/table/DataTable.js.map +1 -1
  361. package/dist/table/DataTableView.js +21 -21
  362. package/dist/table/DataTableView.js.map +1 -1
  363. package/dist/table/PivotTable.js +3 -3
  364. package/dist/table/PivotTable.js.map +1 -1
  365. package/dist/table/SelectionBar.js +4 -4
  366. package/dist/table/SelectionBar.js.map +1 -1
  367. package/dist/table/TreeDataTable.js +5 -5
  368. package/dist/table/TreeDataTable.js.map +1 -1
  369. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  370. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  371. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  372. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  373. package/dist/three/background/AuroraBackground.js +3 -3
  374. package/dist/three/background/AuroraBackground.js.map +1 -1
  375. package/dist/three/background/MeshGradient.js +3 -3
  376. package/dist/three/background/MeshGradient.js.map +1 -1
  377. package/dist/three/background/ShaderBackground.js +3 -3
  378. package/dist/three/background/ShaderBackground.js.map +1 -1
  379. package/dist/three/core/EffectSurface.js +3 -3
  380. package/dist/three/core/EffectSurface.js.map +1 -1
  381. package/dist/three/core/ThreeCanvas.js +4 -4
  382. package/dist/three/core/ThreeCanvas.js.map +1 -1
  383. package/dist/three/effects/Confetti.js +3 -3
  384. package/dist/three/effects/Confetti.js.map +1 -1
  385. package/dist/three/effects/ParticleField.js +3 -3
  386. package/dist/three/effects/ParticleField.js.map +1 -1
  387. package/dist/three/effects/WaveGrid.js +3 -3
  388. package/dist/three/effects/WaveGrid.js.map +1 -1
  389. package/dist/three/globe/Globe.js +3 -3
  390. package/dist/three/globe/Globe.js.map +1 -1
  391. package/dist/three/model/ModelViewer.js +3 -3
  392. package/dist/three/model/ModelViewer.js.map +1 -1
  393. package/dist/utils/data/number.d.ts +5 -0
  394. package/dist/utils/data/number.js +8 -1
  395. package/dist/utils/data/number.js.map +1 -1
  396. package/dist/utils/dom/element.d.ts +3 -1
  397. package/dist/utils/dom/element.js +8 -4
  398. package/dist/utils/dom/element.js.map +1 -1
  399. package/dist/utils/dom/fullscreen.d.ts +1 -1
  400. package/dist/utils/dom/fullscreen.js +12 -8
  401. package/dist/utils/dom/fullscreen.js.map +1 -1
  402. package/dist/utils/dom/mounted.d.ts +7 -0
  403. package/dist/utils/dom/mounted.js +16 -0
  404. package/dist/utils/dom/mounted.js.map +1 -0
  405. package/dist/utils/dom/overflow.js +2 -1
  406. package/dist/utils/dom/overflow.js.map +1 -1
  407. package/dist/utils/dom/pan-zoom.js +2 -1
  408. package/dist/utils/dom/pan-zoom.js.map +1 -1
  409. package/dist/utils/props.js +3 -13
  410. package/dist/utils/props.js.map +1 -1
  411. package/dist/utils/request/http.d.ts +12 -0
  412. package/dist/utils/request/http.js +6 -2
  413. package/dist/utils/request/http.js.map +1 -1
  414. package/dist/utils/request/use-request.js +4 -2
  415. package/dist/utils/request/use-request.js.map +1 -1
  416. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":[],"sources":["../../../src/utils/request/http.ts"],"sourcesContent":["/**\n * 请求层:组件(远程选项、上传、列表查询)只依赖 HttpClient 接口,应用经 createUi / Provider 的 http 给出实现。\n * 默认实现 createHttpClient 是原生 fetch 的薄封装(参考 ky、ofetch):baseURL、query、JSON 请求体、超时与取消、\n * 拆响应体、带码的错误(HttpError)、请求与响应钩子。用 axios、ky 时只要写一个 request:\n *\n * createUi({ http: { request: (r) => axios.request({ ...r, params: r.query, data: r.body }).then((res) => res.data) } })\n *\n * 值按线上的 typed JSON 传(见 wire.ts):请求体里的 bigint、Decimal、CalendarDate 写成文字并附上 `$types`,\n * 地址栏参数写成同样的文字,带 `$types` 的响应先还原再交给 onResponse;`wire: false` 时按普通 JSON。\n *\n * 响应体按业务错误码的约定拆开(flow 仓库 docs/decisions/0008,query、flow 的后端都这样回):HTTP 一律 200,\n * `{ code: 'ok', data }` 交出 data,`{ code: 'flow.work-item-not-open', message, params, errors }` 抛带这个码的 HttpError;\n * 请求层自己出的错也带码:`http.network`、`http.timeout`、`http.status`(网关回了非 2xx)、`http.parse`(响应读不懂)。\n * 组件按码从语言包取文案(见 error-message.ts)。后端用别的包装(`{ code: 0, data }`)时关掉 envelope,在 onResponse 里拆:\n *\n * const http = createHttpClient({\n * baseURL: '/api',\n * envelope: false,\n * onRequest: (request) => request.headers.set('Authorization', `Bearer ${token()}`),\n * onResponse: (body: Envelope, context) => {\n * if (body.code !== 0) throw new HttpError(body.message, { ...context, code: `app.${body.code}`, data: body });\n * return body.data;\n * },\n * });\n */\nimport { useConfig } from '../../config/context';\nimport { fromWire, toWire, wireText, type WireReviveOptions, type WireScalar } from './wire';\n\n/** 请求方法 */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD';\n\n/**\n * query 里的一个值:null、undefined 不写进地址,数组写成重复的键(a=1&a=2,数组里的 null 是空字符串);\n * bigint、Decimal、日期等按线上的文字写(wireText:Decimal 不用科学计数法,日期是 ISO)\n */\nexport type QueryValue = WireScalar | readonly WireScalar[];\n\n/** 一次请求 */\nexport interface HttpRequest {\n /** 请求方法,默认 GET */\n method?: HttpMethod;\n /** 地址:相对地址拼在 baseURL 后面,完整地址(https://…)原样使用 */\n url: string;\n /** 查询参数 */\n query?: Readonly<Record<string, QueryValue>>;\n /** 请求体:普通对象与数组按 JSON 发送;FormData、Blob、URLSearchParams、字符串原样发送 */\n body?: unknown;\n /** 请求头,盖过客户端的默认请求头 */\n headers?: Readonly<Record<string, string>>;\n /** 取消:abort 后请求中止,Promise 以 AbortError 拒绝 */\n signal?: AbortSignal;\n /** 超时(毫秒),盖过客户端的设置;0 表示不限 */\n timeout?: number;\n /** 怎样读响应体,默认按 content-type:JSON 解析,text/* 读成文字,其余读成 Blob */\n responseType?: 'json' | 'text' | 'blob';\n}\n\n/** 组件依赖的请求接口:发出请求,返回解析(拆包)后的数据;失败时拒绝 */\nexport interface HttpClient {\n /** 发出一次请求,返回解析(拆包)后的数据;失败时以 HttpError 拒绝,取消时以 AbortError 拒绝 */\n request<T = unknown>(request: HttpRequest): Promise<T>;\n}\n\n/** 成功的码 */\nexport const OK_CODE = 'ok';\n\n/**\n * 请求层自己出的错的码(0008 的 `http.` 命名空间,只在前端产生)。取消不当作错误,仍以 AbortError 拒绝,\n * errorCodeOf 把它认作 `http.aborted`\n */\nexport const HTTP_ERROR_CODES = [\n 'http.network',\n 'http.timeout',\n 'http.aborted',\n 'http.status',\n 'http.parse',\n] as const;\n\n/** 请求层的错误码 */\nexport type HttpErrorCode = (typeof HTTP_ERROR_CODES)[number];\n\n/**\n * 错误明细的一项(0008):按字段的(表单校验:field、code),或按位置的(流程定义的问题:node、edge);没有的部分省掉。\n * 后端只给说明、不给代号时有 message\n */\nexport interface ApiErrorDetail {\n /** 问题的代号(required、max……) */\n readonly code?: string;\n /** 字段路径(`email`、`lines[0].price`) */\n readonly field?: string;\n /** 后端给的说明,只作兜底 */\n readonly message?: string;\n /** 文案里要填的参数 */\n readonly params?: Readonly<Record<string, unknown>>;\n /** 别的位置信息(节点、连线……) */\n readonly [key: string]: unknown;\n}\n\n/** 后端回的响应体(0008 第 1 节):成功的 code 是 `ok`,失败是业务错误码 */\nexport interface ApiEnvelope<T = unknown> {\n /** `ok` 或业务错误码 */\n readonly code: string;\n /** 后端给的说明,只作兜底:界面按 code 取文案 */\n readonly message?: string;\n /** 文案里要填的参数 */\n readonly params?: Readonly<Record<string, unknown>>;\n /** 按字段、按问题的明细(表单校验) */\n readonly errors?: readonly ApiErrorDetail[];\n /** 成功时的数据 */\n readonly data?: T;\n}\n\n/** 请求失败时的上下文:业务错误码、发生在哪个请求、拿到的响应 */\nexport interface HttpErrorContext {\n /** 业务错误码:后端回的(`flow.`、`query.`、应用自己的)或请求层的(`http.`) */\n code: string;\n /** 文案里要填的参数 */\n params?: Readonly<Record<string, unknown>>;\n /** 按字段、按问题的明细 */\n errors?: readonly ApiErrorDetail[];\n /** 出错的请求 */\n request: HttpRequest;\n /** 响应;网络错误、超时时没有 */\n response?: Response;\n /** 响应体(错误详情),读得到时带上 */\n data?: unknown;\n /** 底层的错误(网络错误、超时) */\n cause?: unknown;\n}\n\n/** 请求失败:后端回了业务错误码、状态码不是 2xx、网络错误、超时、响应读不懂,或 onResponse 判定的业务错误 */\nexport class HttpError extends Error {\n /** 错误名,同类名:日志与 instanceof 之外的判断用 */\n override readonly name = 'HttpError';\n /** 业务错误码(见 HttpErrorContext.code);界面按它取文案 */\n readonly code: string;\n /** 文案里要填的参数 */\n readonly params: Readonly<Record<string, unknown>>;\n /** 按字段、按问题的明细;useForm 的 submit 据此标到字段上 */\n readonly errors: readonly ApiErrorDetail[];\n /** 出错的请求 */\n readonly request: HttpRequest;\n /** 响应;网络错误、超时时没有 */\n readonly response?: Response;\n /** HTTP 状态码;网络错误、超时为 0 */\n readonly status: number;\n /** 响应体(错误详情) */\n readonly data?: unknown;\n\n constructor(\n message: string,\n { code, params, errors, request, response, data, cause }: HttpErrorContext,\n ) {\n super(message, { cause });\n this.code = code;\n this.params = params ?? {};\n this.errors = errors ?? [];\n this.request = request;\n this.response = response;\n this.status = response?.status ?? 0;\n this.data = data;\n }\n}\n\n/** 是不是主动取消(abort)造成的拒绝:界面上不当作错误 */\nexport const isAbortError = (error: unknown) =>\n error instanceof DOMException && error.name === 'AbortError';\n\n/** createHttpClient 的选项 */\nexport interface HttpClientOptions {\n /** 相对地址的前缀,如 '/api' */\n baseURL?: string;\n /** 每个请求都带的请求头 */\n headers?: Readonly<Record<string, string>>;\n /** 超时(毫秒),默认 30000;0 表示不限 */\n timeout?: number;\n /** 发出之前改请求(加令牌、追踪编号);可以返回一个新的 Request */\n onRequest?: (request: Request) => Request | void | Promise<Request | void>;\n /**\n * 按 0008 的约定拆响应体(见文件开头),默认 true:键都在 code、message、params、errors、data 里、code 是文字的对象\n * 才当作包装,其余原样交出。后端用别的包装时给 false,在 onResponse 里拆\n */\n envelope?: boolean;\n /** 成功的响应(拆包之后)的数据交给它:再加工、判定别的业务错误(抛 HttpError),返回值就是请求的结果 */\n onResponse?: (data: unknown, context: { request: HttpRequest; response: Response }) => unknown;\n /**\n * 线上的 typed JSON 怎样还原(见 wire.ts):给 `{ decimal: Decimal }` 时 decimal 还原成 Decimal,`dates: 'objects'`\n * 时日期还原成 CalendarDate 等;默认 `{}`(bigint 还原成 bigint,decimal 与日期留作文字)。false 时请求体按普通 JSON 发、响应不还原\n */\n wire?: WireReviveOptions | false;\n /** 换掉 fetch(测试、SSR、注入公共处理) */\n fetch?: typeof fetch;\n}\n\n/** createHttpClient 的结果:request 之外,再给常用方法的简写 */\nexport interface FetchClient extends HttpClient {\n /** GET:参数写在 options.query 里 */\n get<T = unknown>(url: string, options?: Omit<HttpRequest, 'url' | 'method'>): Promise<T>;\n /** DELETE */\n delete<T = unknown>(url: string, options?: Omit<HttpRequest, 'url' | 'method'>): Promise<T>;\n /** POST:普通对象的 body 按 JSON 发送 */\n post<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<HttpRequest, 'url' | 'method' | 'body'>,\n ): Promise<T>;\n /** PUT:普通对象的 body 按 JSON 发送 */\n put<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<HttpRequest, 'url' | 'method' | 'body'>,\n ): Promise<T>;\n /** PATCH:普通对象的 body 按 JSON 发送 */\n patch<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<HttpRequest, 'url' | 'method' | 'body'>,\n ): Promise<T>;\n}\n\n/** 原生 fetch 的薄封装(见文件开头) */\nexport function createHttpClient(options: HttpClientOptions = {}): FetchClient {\n const {\n baseURL = '',\n timeout: defaultTimeout = 30_000,\n onRequest,\n onResponse,\n wire = {},\n envelope: unwrap = true,\n } = options;\n const revive = (value: unknown) => (wire === false ? value : fromWire(value, wire));\n\n async function request<T>(spec: HttpRequest): Promise<T> {\n const { method = 'GET', body, signal, timeout = defaultTimeout } = spec;\n const headers = new Headers({ ...options.headers, ...spec.headers });\n const json = isJsonBody(body);\n if (json && !headers.has('content-type')) headers.set('content-type', 'application/json');\n const signals = [signal, timeout > 0 ? AbortSignal.timeout(timeout) : undefined].filter(\n (item): item is AbortSignal => item != null,\n );\n let prepared = new Request(buildUrl(baseURL, spec.url, spec.query), {\n method,\n headers,\n body: json\n ? JSON.stringify(wire === false ? body : toWire(body))\n : (body as BodyInit | undefined),\n signal: signals.length > 1 ? AbortSignal.any(signals) : signals[0],\n });\n prepared = (await onRequest?.(prepared)) ?? prepared;\n\n let response: Response;\n try {\n response = await (options.fetch ?? fetch)(prepared);\n } catch (cause) {\n // 调用方取消的:原样交出(AbortError),界面据此不当作错误\n if (signal?.aborted) throw cause;\n const timedOut = cause instanceof DOMException && cause.name === 'TimeoutError';\n const message = timedOut\n ? `请求超时(${timeout / 1000} 秒):${method} ${spec.url}`\n : `网络错误:${method} ${spec.url}`;\n throw new HttpError(message, {\n code: timedOut ? 'http.timeout' : 'http.network',\n params: timedOut ? { seconds: timeout / 1000 } : undefined,\n request: spec,\n cause,\n });\n }\n const context = { request: spec, response };\n const { body: raw, malformed } = await readBody(response, spec.responseType);\n let data: unknown;\n try {\n data = malformed ? raw : revive(raw);\n } catch (cause) {\n throw new HttpError(`响应读不懂:${method} ${spec.url}`, {\n ...context,\n code: 'http.parse',\n data: raw,\n cause,\n });\n }\n const envelope = unwrap && isEnvelope(data) ? data : undefined;\n // 业务错误以响应体的码为准:网关原样转发非 2xx 的业务响应时也认得出\n if (envelope && envelope.code !== OK_CODE) {\n throw new HttpError(envelope.message || envelope.code, {\n ...context,\n code: envelope.code,\n params: envelope.params,\n errors: envelope.errors,\n data,\n });\n }\n if (!response.ok) {\n const status = `${response.status}${response.statusText ? ` ${response.statusText}` : ''}`;\n throw new HttpError(`请求失败(${status}):${method} ${spec.url}`, {\n ...context,\n code: 'http.status',\n params: { status: response.status },\n data,\n });\n }\n if (malformed) {\n throw new HttpError(`响应不是 JSON:${method} ${spec.url}`, {\n ...context,\n code: 'http.parse',\n data,\n });\n }\n // 包装里的 data 自己带 $types 时(后端先 toWire 数据再包),再还原一次;已还原过的不再有 $types\n const result = envelope ? revive(envelope.data) : data;\n return (onResponse ? onResponse(result, context) : result) as T;\n }\n\n return scopeHttp({ request });\n}\n\n/**\n * 在任意请求客户端上加常用方法的简写,相对地址前面拼上 prefix(斜杠不重复;完整地址原样)。\n * 一个模块的接口都在同一个前缀下时用它,不必每次写全地址;useHttp() 拿到的客户端也能这样包:\n *\n * const api = scopeHttp(useHttp(), '/flow');\n * api.get('/queries/todo', { query: { page: 1 }, signal }); // GET /flow/queries/todo?page=1\n * api.post('/commands/claim', { workItemId });\n */\nexport function scopeHttp(client: HttpClient, prefix = ''): FetchClient {\n const at = (url: string) => (!prefix || isAbsolute(url) ? url : joinPath(prefix, url));\n const request = <T>(spec: HttpRequest) => client.request<T>({ ...spec, url: at(spec.url) });\n const withBody =\n (method: HttpMethod) =>\n <T>(url: string, body?: unknown, rest?: Omit<HttpRequest, 'url' | 'method' | 'body'>) =>\n request<T>({ ...rest, method, url, body });\n return {\n request,\n get: (url, rest) => request({ ...rest, method: 'GET', url }),\n delete: (url, rest) => request({ ...rest, method: 'DELETE', url }),\n post: withBody('POST'),\n put: withBody('PUT'),\n patch: withBody('PATCH'),\n };\n}\n\n/** 完整地址(https://…、//host/…):不拼 baseURL、前缀 */\nconst isAbsolute = (url: string) => /^[a-z][a-z\\d+.-]*:/i.test(url) || url.startsWith('//');\n\n/** 两段路径接起来,中间只留一个斜杠 */\nconst joinPath = (base: string, path: string) =>\n `${base.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n\nlet fallback: FetchClient | undefined;\n\n/**\n * 当前配置的请求客户端(在 setup 里调用):createUi / Provider 的 http;都没给时是一个默认的 createHttpClient()\n */\nexport function useHttp(): HttpClient {\n return useConfig().http ?? (fallback ??= createHttpClient());\n}\n\n/** 地址 + query:相对地址拼在 baseURL 后面(斜杠不重复),null、undefined 的参数跳过 */\nfunction buildUrl(baseURL: string, url: string, query: HttpRequest['query']): string {\n let full = isAbsolute(url) || !baseURL ? url : joinPath(baseURL, url);\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value == null) continue;\n const items: readonly WireScalar[] = Array.isArray(value) ? value : [value as WireScalar];\n for (const item of items) params.append(key, wireText(item));\n }\n const search = params.toString();\n if (search) full += `${full.includes('?') ? '&' : '?'}${search}`;\n return full;\n}\n\nconst ENVELOPE_KEYS = new Set(['code', 'message', 'params', 'errors', 'data']);\n\n/** 是不是 0008 的响应体:code 是文字、没有别的键(不把恰好有 code 字段的业务对象当成包装) */\nfunction isEnvelope(value: unknown): value is ApiEnvelope {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.code === 'string' && Object.keys(record).every((key) => ENVELOPE_KEYS.has(key))\n );\n}\n\n/** 普通对象与数组按 JSON 发送 */\nfunction isJsonBody(body: unknown): boolean {\n if (body == null || typeof body !== 'object') return false;\n const prototype = Object.getPrototypeOf(body) as unknown;\n return Array.isArray(body) || prototype === Object.prototype || prototype === null;\n}\n\n/** 读响应体;声明是 JSON 却解析不了(网关的 HTML 错误页)时交出原文并标上 malformed */\nasync function readBody(\n response: Response,\n type: HttpRequest['responseType'],\n): Promise<{ body: unknown; malformed?: boolean }> {\n if (\n response.status === 204 ||\n response.status === 205 ||\n response.headers.get('content-length') === '0'\n ) {\n return { body: undefined };\n }\n const contentType = response.headers.get('content-type') ?? '';\n const kind =\n type ??\n (/[/+]json\\b/.test(contentType) ? 'json' : contentType.startsWith('text/') ? 'text' : 'blob');\n if (kind === 'blob') return { body: await response.blob() };\n const text = await response.text();\n if (kind === 'text') return { body: text };\n if (text === '') return { body: undefined };\n try {\n return { body: JSON.parse(text) };\n } catch {\n return { body: text, malformed: true };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http.js","names":[],"sources":["../../../src/utils/request/http.ts"],"sourcesContent":["/**\n * 请求层:组件(远程选项、上传、列表查询)只依赖 HttpClient 接口,应用经 createUi / Provider 的 http 给出实现。\n * 默认实现 createHttpClient 是原生 fetch 的薄封装(参考 ky、ofetch):baseURL、query、JSON 请求体、超时与取消、\n * 拆响应体、带码的错误(HttpError)、请求与响应钩子。用 axios、ky 时只要写一个 request:\n *\n * createUi({ http: { request: (r) => axios.request({ ...r, params: r.query, data: r.body }).then((res) => res.data) } })\n *\n * 值按线上的 typed JSON 传(见 wire.ts):请求体里的 bigint、Decimal、CalendarDate 写成文字并附上 `$types`,\n * 地址栏参数写成同样的文字,带 `$types` 的响应先还原再交给 onResponse;`wire: false` 时按普通 JSON。\n * 单个接口不一样时(对接只认普通 JSON 的外部系统)在这次请求上给 `wire: { request: false }`、`{ response: false }`,两头分开定。\n *\n * 响应体按业务错误码的约定拆开(flow 仓库 docs/decisions/0008,query、flow 的后端都这样回):HTTP 一律 200,\n * `{ code: 'ok', data }` 交出 data,`{ code: 'flow.work-item-not-open', message, params, errors }` 抛带这个码的 HttpError;\n * 请求层自己出的错也带码:`http.network`、`http.timeout`、`http.status`(网关回了非 2xx)、`http.parse`(响应读不懂)。\n * 组件按码从语言包取文案(见 error-message.ts)。后端用别的包装(`{ code: 0, data }`)时关掉 envelope,在 onResponse 里拆:\n *\n * const http = createHttpClient({\n * baseURL: '/api',\n * envelope: false,\n * onRequest: (request) => request.headers.set('Authorization', `Bearer ${token()}`),\n * onResponse: (body: Envelope, context) => {\n * if (body.code !== 0) throw new HttpError(body.message, { ...context, code: `app.${body.code}`, data: body });\n * return body.data;\n * },\n * });\n */\nimport { useConfig } from '../../config/context';\nimport { fromWire, toWire, wireText, type WireReviveOptions, type WireScalar } from './wire';\n\n/** 请求方法 */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD';\n\n/**\n * query 里的一个值:null、undefined 不写进地址,数组写成重复的键(a=1&a=2,数组里的 null 是空字符串);\n * bigint、Decimal、日期等按线上的文字写(wireText:Decimal 不用科学计数法,日期是 ISO)\n */\nexport type QueryValue = WireScalar | readonly WireScalar[];\n\n/** 一次请求 */\nexport interface HttpRequest {\n /** 请求方法,默认 GET */\n method?: HttpMethod;\n /** 地址:相对地址拼在 baseURL 后面,完整地址(https://…)原样使用 */\n url: string;\n /** 查询参数 */\n query?: Readonly<Record<string, QueryValue>>;\n /** 请求体:普通对象与数组按 JSON 发送;FormData、Blob、URLSearchParams、字符串原样发送 */\n body?: unknown;\n /** 请求头,盖过客户端的默认请求头 */\n headers?: Readonly<Record<string, string>>;\n /** 取消:abort 后请求中止,Promise 以 AbortError 拒绝 */\n signal?: AbortSignal;\n /** 超时(毫秒),盖过客户端的设置;0 表示不限 */\n timeout?: number;\n /** 怎样读响应体,默认按 content-type:JSON 解析,text/* 读成文字,其余读成 Blob */\n responseType?: 'json' | 'text' | 'blob';\n /**\n * 这一次的请求体、响应按不按线上的 typed JSON,盖过客户端的 wire:false 时请求体按普通 JSON 发(里面不能有 bigint)、\n * 响应不还原;true 时按 typed JSON(客户端 wire: false 时还原选项是默认的 `{}`)。没给的一头跟着客户端\n */\n wire?: HttpWire;\n}\n\n/** 一次请求的请求体(request)、响应(response)各自按不按 typed JSON */\nexport interface HttpWire {\n /** 请求体写成 typed JSON */\n request?: boolean;\n /** 响应按 `$types` 还原 */\n response?: boolean;\n}\n\n/** 组件依赖的请求接口:发出请求,返回解析(拆包)后的数据;失败时拒绝 */\nexport interface HttpClient {\n /** 发出一次请求,返回解析(拆包)后的数据;失败时以 HttpError 拒绝,取消时以 AbortError 拒绝 */\n request<T = unknown>(request: HttpRequest): Promise<T>;\n}\n\n/** 成功的码 */\nexport const OK_CODE = 'ok';\n\n/**\n * 请求层自己出的错的码(0008 的 `http.` 命名空间,只在前端产生)。取消不当作错误,仍以 AbortError 拒绝,\n * errorCodeOf 把它认作 `http.aborted`\n */\nexport const HTTP_ERROR_CODES = [\n 'http.network',\n 'http.timeout',\n 'http.aborted',\n 'http.status',\n 'http.parse',\n] as const;\n\n/** 请求层的错误码 */\nexport type HttpErrorCode = (typeof HTTP_ERROR_CODES)[number];\n\n/**\n * 错误明细的一项(0008):按字段的(表单校验:field、code),或按位置的(流程定义的问题:node、edge);没有的部分省掉。\n * 后端只给说明、不给代号时有 message\n */\nexport interface ApiErrorDetail {\n /** 问题的代号(required、max……) */\n readonly code?: string;\n /** 字段路径(`email`、`lines[0].price`) */\n readonly field?: string;\n /** 后端给的说明,只作兜底 */\n readonly message?: string;\n /** 文案里要填的参数 */\n readonly params?: Readonly<Record<string, unknown>>;\n /** 别的位置信息(节点、连线……) */\n readonly [key: string]: unknown;\n}\n\n/** 后端回的响应体(0008 第 1 节):成功的 code 是 `ok`,失败是业务错误码 */\nexport interface ApiEnvelope<T = unknown> {\n /** `ok` 或业务错误码 */\n readonly code: string;\n /** 后端给的说明,只作兜底:界面按 code 取文案 */\n readonly message?: string;\n /** 文案里要填的参数 */\n readonly params?: Readonly<Record<string, unknown>>;\n /** 按字段、按问题的明细(表单校验) */\n readonly errors?: readonly ApiErrorDetail[];\n /** 成功时的数据 */\n readonly data?: T;\n}\n\n/** 请求失败时的上下文:业务错误码、发生在哪个请求、拿到的响应 */\nexport interface HttpErrorContext {\n /** 业务错误码:后端回的(`flow.`、`query.`、应用自己的)或请求层的(`http.`) */\n code: string;\n /** 文案里要填的参数 */\n params?: Readonly<Record<string, unknown>>;\n /** 按字段、按问题的明细 */\n errors?: readonly ApiErrorDetail[];\n /** 出错的请求 */\n request: HttpRequest;\n /** 响应;网络错误、超时时没有 */\n response?: Response;\n /** 响应体(错误详情),读得到时带上 */\n data?: unknown;\n /** 底层的错误(网络错误、超时) */\n cause?: unknown;\n}\n\n/** 请求失败:后端回了业务错误码、状态码不是 2xx、网络错误、超时、响应读不懂,或 onResponse 判定的业务错误 */\nexport class HttpError extends Error {\n /** 错误名,同类名:日志与 instanceof 之外的判断用 */\n override readonly name = 'HttpError';\n /** 业务错误码(见 HttpErrorContext.code);界面按它取文案 */\n readonly code: string;\n /** 文案里要填的参数 */\n readonly params: Readonly<Record<string, unknown>>;\n /** 按字段、按问题的明细;useForm 的 submit 据此标到字段上 */\n readonly errors: readonly ApiErrorDetail[];\n /** 出错的请求 */\n readonly request: HttpRequest;\n /** 响应;网络错误、超时时没有 */\n readonly response?: Response;\n /** HTTP 状态码;网络错误、超时为 0 */\n readonly status: number;\n /** 响应体(错误详情) */\n readonly data?: unknown;\n\n constructor(\n message: string,\n { code, params, errors, request, response, data, cause }: HttpErrorContext,\n ) {\n super(message, { cause });\n this.code = code;\n this.params = params ?? {};\n this.errors = errors ?? [];\n this.request = request;\n this.response = response;\n this.status = response?.status ?? 0;\n this.data = data;\n }\n}\n\n/** 是不是主动取消(abort)造成的拒绝:界面上不当作错误 */\nexport const isAbortError = (error: unknown) =>\n error instanceof DOMException && error.name === 'AbortError';\n\n/** createHttpClient 的选项 */\nexport interface HttpClientOptions {\n /** 相对地址的前缀,如 '/api' */\n baseURL?: string;\n /** 每个请求都带的请求头 */\n headers?: Readonly<Record<string, string>>;\n /** 超时(毫秒),默认 30000;0 表示不限 */\n timeout?: number;\n /** 发出之前改请求(加令牌、追踪编号);可以返回一个新的 Request */\n onRequest?: (request: Request) => Request | void | Promise<Request | void>;\n /**\n * 按 0008 的约定拆响应体(见文件开头),默认 true:键都在 code、message、params、errors、data 里、code 是文字的对象\n * 才当作包装,其余原样交出。后端用别的包装时给 false,在 onResponse 里拆\n */\n envelope?: boolean;\n /** 成功的响应(拆包之后)的数据交给它:再加工、判定别的业务错误(抛 HttpError),返回值就是请求的结果 */\n onResponse?: (data: unknown, context: { request: HttpRequest; response: Response }) => unknown;\n /**\n * 线上的 typed JSON 怎样还原(见 wire.ts):给 `{ decimal: Decimal }` 时 decimal 还原成 Decimal,`dates: 'objects'`\n * 时日期还原成 CalendarDate 等;默认 `{}`(bigint 还原成 bigint,decimal 与日期留作文字)。false 时请求体按普通 JSON 发、响应不还原\n */\n wire?: WireReviveOptions | false;\n /** 换掉 fetch(测试、SSR、注入公共处理) */\n fetch?: typeof fetch;\n}\n\n/** createHttpClient 的结果:request 之外,再给常用方法的简写 */\nexport interface FetchClient extends HttpClient {\n /** GET:参数写在 options.query 里 */\n get<T = unknown>(url: string, options?: Omit<HttpRequest, 'url' | 'method'>): Promise<T>;\n /** DELETE */\n delete<T = unknown>(url: string, options?: Omit<HttpRequest, 'url' | 'method'>): Promise<T>;\n /** POST:普通对象的 body 按 JSON 发送 */\n post<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<HttpRequest, 'url' | 'method' | 'body'>,\n ): Promise<T>;\n /** PUT:普通对象的 body 按 JSON 发送 */\n put<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<HttpRequest, 'url' | 'method' | 'body'>,\n ): Promise<T>;\n /** PATCH:普通对象的 body 按 JSON 发送 */\n patch<T = unknown>(\n url: string,\n body?: unknown,\n options?: Omit<HttpRequest, 'url' | 'method' | 'body'>,\n ): Promise<T>;\n}\n\n/** 原生 fetch 的薄封装(见文件开头) */\nexport function createHttpClient(options: HttpClientOptions = {}): FetchClient {\n const {\n baseURL = '',\n timeout: defaultTimeout = 30_000,\n onRequest,\n onResponse,\n wire = {},\n envelope: unwrap = true,\n } = options;\n const reviveOptions = wire === false ? {} : wire;\n\n async function request<T>(spec: HttpRequest): Promise<T> {\n const { method = 'GET', body, signal, timeout = defaultTimeout } = spec;\n const sendWire = spec.wire?.request ?? wire !== false;\n const readWire = spec.wire?.response ?? wire !== false;\n const revive = (value: unknown) => (readWire ? fromWire(value, reviveOptions) : value);\n const headers = new Headers({ ...options.headers, ...spec.headers });\n const json = isJsonBody(body);\n if (json && !headers.has('content-type')) headers.set('content-type', 'application/json');\n const signals = [signal, timeout > 0 ? AbortSignal.timeout(timeout) : undefined].filter(\n (item): item is AbortSignal => item != null,\n );\n let prepared = new Request(buildUrl(baseURL, spec.url, spec.query), {\n method,\n headers,\n body: json ? JSON.stringify(sendWire ? toWire(body) : body) : (body as BodyInit | undefined),\n signal: signals.length > 1 ? AbortSignal.any(signals) : signals[0],\n });\n prepared = (await onRequest?.(prepared)) ?? prepared;\n\n let response: Response;\n try {\n response = await (options.fetch ?? fetch)(prepared);\n } catch (cause) {\n // 调用方取消的:原样交出(AbortError),界面据此不当作错误\n if (signal?.aborted) throw cause;\n const timedOut = cause instanceof DOMException && cause.name === 'TimeoutError';\n const message = timedOut\n ? `请求超时(${timeout / 1000} 秒):${method} ${spec.url}`\n : `网络错误:${method} ${spec.url}`;\n throw new HttpError(message, {\n code: timedOut ? 'http.timeout' : 'http.network',\n params: timedOut ? { seconds: timeout / 1000 } : undefined,\n request: spec,\n cause,\n });\n }\n const context = { request: spec, response };\n const { body: raw, malformed } = await readBody(response, spec.responseType);\n let data: unknown;\n try {\n data = malformed ? raw : revive(raw);\n } catch (cause) {\n throw new HttpError(`响应读不懂:${method} ${spec.url}`, {\n ...context,\n code: 'http.parse',\n data: raw,\n cause,\n });\n }\n const envelope = unwrap && isEnvelope(data) ? data : undefined;\n // 业务错误以响应体的码为准:网关原样转发非 2xx 的业务响应时也认得出\n if (envelope && envelope.code !== OK_CODE) {\n throw new HttpError(envelope.message || envelope.code, {\n ...context,\n code: envelope.code,\n params: envelope.params,\n errors: envelope.errors,\n data,\n });\n }\n if (!response.ok) {\n const status = `${response.status}${response.statusText ? ` ${response.statusText}` : ''}`;\n throw new HttpError(`请求失败(${status}):${method} ${spec.url}`, {\n ...context,\n code: 'http.status',\n params: { status: response.status },\n data,\n });\n }\n if (malformed) {\n throw new HttpError(`响应不是 JSON:${method} ${spec.url}`, {\n ...context,\n code: 'http.parse',\n data,\n });\n }\n // 包装里的 data 自己带 $types 时(后端先 toWire 数据再包),再还原一次;已还原过的不再有 $types\n const result = envelope ? revive(envelope.data) : data;\n return (onResponse ? onResponse(result, context) : result) as T;\n }\n\n return scopeHttp({ request });\n}\n\n/**\n * 在任意请求客户端上加常用方法的简写,相对地址前面拼上 prefix(斜杠不重复;完整地址原样)。\n * 一个模块的接口都在同一个前缀下时用它,不必每次写全地址;useHttp() 拿到的客户端也能这样包:\n *\n * const api = scopeHttp(useHttp(), '/flow');\n * api.get('/queries/todo', { query: { page: 1 }, signal }); // GET /flow/queries/todo?page=1\n * api.post('/commands/claim', { workItemId });\n */\nexport function scopeHttp(client: HttpClient, prefix = ''): FetchClient {\n const at = (url: string) => (!prefix || isAbsolute(url) ? url : joinPath(prefix, url));\n const request = <T>(spec: HttpRequest) => client.request<T>({ ...spec, url: at(spec.url) });\n const withBody =\n (method: HttpMethod) =>\n <T>(url: string, body?: unknown, rest?: Omit<HttpRequest, 'url' | 'method' | 'body'>) =>\n request<T>({ ...rest, method, url, body });\n return {\n request,\n get: (url, rest) => request({ ...rest, method: 'GET', url }),\n delete: (url, rest) => request({ ...rest, method: 'DELETE', url }),\n post: withBody('POST'),\n put: withBody('PUT'),\n patch: withBody('PATCH'),\n };\n}\n\n/** 完整地址(https://…、//host/…):不拼 baseURL、前缀 */\nconst isAbsolute = (url: string) => /^[a-z][a-z\\d+.-]*:/i.test(url) || url.startsWith('//');\n\n/** 两段路径接起来,中间只留一个斜杠 */\nconst joinPath = (base: string, path: string) =>\n `${base.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n\nlet fallback: FetchClient | undefined;\n\n/**\n * 当前配置的请求客户端(在 setup 里调用):createUi / Provider 的 http;都没给时是一个默认的 createHttpClient()\n */\nexport function useHttp(): HttpClient {\n return useConfig().http ?? (fallback ??= createHttpClient());\n}\n\n/** 地址 + query:相对地址拼在 baseURL 后面(斜杠不重复),null、undefined 的参数跳过 */\nfunction buildUrl(baseURL: string, url: string, query: HttpRequest['query']): string {\n let full = isAbsolute(url) || !baseURL ? url : joinPath(baseURL, url);\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value == null) continue;\n const items: readonly WireScalar[] = Array.isArray(value) ? value : [value as WireScalar];\n for (const item of items) params.append(key, wireText(item));\n }\n const search = params.toString();\n if (search) full += `${full.includes('?') ? '&' : '?'}${search}`;\n return full;\n}\n\nconst ENVELOPE_KEYS = new Set(['code', 'message', 'params', 'errors', 'data']);\n\n/** 是不是 0008 的响应体:code 是文字、没有别的键(不把恰好有 code 字段的业务对象当成包装) */\nfunction isEnvelope(value: unknown): value is ApiEnvelope {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.code === 'string' && Object.keys(record).every((key) => ENVELOPE_KEYS.has(key))\n );\n}\n\n/** 普通对象与数组按 JSON 发送 */\nfunction isJsonBody(body: unknown): boolean {\n if (body == null || typeof body !== 'object') return false;\n const prototype = Object.getPrototypeOf(body) as unknown;\n return Array.isArray(body) || prototype === Object.prototype || prototype === null;\n}\n\n/** 读响应体;声明是 JSON 却解析不了(网关的 HTML 错误页)时交出原文并标上 malformed */\nasync function readBody(\n response: Response,\n type: HttpRequest['responseType'],\n): Promise<{ body: unknown; malformed?: boolean }> {\n if (\n response.status === 204 ||\n response.status === 205 ||\n response.headers.get('content-length') === '0'\n ) {\n return { body: undefined };\n }\n const contentType = response.headers.get('content-type') ?? '';\n const kind =\n type ??\n (/[/+]json\\b/.test(contentType) ? 'json' : contentType.startsWith('text/') ? 'text' : 'blob');\n if (kind === 'blob') return { body: await response.blob() };\n const text = await response.text();\n if (kind === 'text') return { body: text };\n if (text === '') return { body: undefined };\n try {\n return { body: JSON.parse(text) };\n } catch {\n return { body: text, malformed: true };\n }\n}\n"],"mappings":"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"}
@@ -14,13 +14,15 @@ import { onScopeDispose, shallowRef, watch } from "vue";
14
14
  * users.data?.rows; users.loading; users.error; users.refresh();
15
15
  *
16
16
  * 只在浏览器里自动请求:服务端渲染时 data 留空,等页面在浏览器里接管后再请求。
17
+ * 一开始就请求时 loading 从 true 开始,服务端也按“加载中”渲染:水合时两边一致,浏览器接着发请求。
17
18
  */
18
19
  /** 请求的状态(在 setup 里调用;见文件开头) */
19
20
  function useRequest(fetcher, options = {}) {
20
21
  const { params, debounce = 0, immediate = true, keepPrevious = true } = options;
21
22
  const data = shallowRef();
22
23
  const error = shallowRef();
23
- const loading = shallowRef(false);
24
+ const starts = immediate && options.enabled?.() !== false;
25
+ const loading = shallowRef(starts);
24
26
  let controller;
25
27
  let timer;
26
28
  let latest = 0;
@@ -67,7 +69,7 @@ function useRequest(fetcher, options = {}) {
67
69
  if (debounce > 0) timer = setTimeout(() => void run(next), debounce);
68
70
  else run(next);
69
71
  });
70
- if (immediate && options.enabled?.() !== false && typeof window !== "undefined") run(readParams());
72
+ if (starts && typeof window !== "undefined") run(readParams());
71
73
  onScopeDispose(cancel);
72
74
  return {
73
75
  get data() {
@@ -1 +1 @@
1
- {"version":3,"file":"use-request.js","names":[],"sources":["../../../src/utils/request/use-request.ts"],"sourcesContent":["/**\n * 一个请求的状态(参考 TanStack Query、alova 的 useWatcher):只采用最后一次的结果,发新请求时取消上一次,\n * 参数变化防抖,重新请求时保留旧数据(表格不闪成空的)。\n *\n * const http = useHttp();\n * const users = useRequest(\n * ({ keyword, page }, signal) => http.request<Page<User>>({ url: '/users', query: { keyword, page }, signal }),\n * { params: () => ({ keyword, page }), debounce: 300 },\n * );\n * users.data?.rows; users.loading; users.error; users.refresh();\n *\n * 只在浏览器里自动请求:服务端渲染时 data 留空,等页面在浏览器里接管后再请求。\n */\nimport { onScopeDispose, shallowRef, watch } from 'vue';\nimport { sameValue } from '../data/equality';\nimport { isAbortError } from './http';\n\n/** useRequest 的选项 */\nexport interface RequestOptions<P, T> {\n /** 请求参数:读到的响应式值变了、且内容确实不同时重新请求;不写时只在开始与 refresh 时请求 */\n params?: () => P;\n /** 参数变了以后等多久再请求(毫秒),默认 0;refresh 不等 */\n debounce?: number;\n /** 一开始就请求,默认 true;false 时等调用 refresh(或参数变化) */\n immediate?: boolean;\n /** 重新请求时保留上一次的数据,默认 true;false 时请求一开始就清空 */\n keepPrevious?: boolean;\n /**\n * 自动请求的开关(弹层打开时才请求这类):为 false 时 immediate 与参数变化都不请求,refresh 照常。\n * 变回 true 时不自动补一次,需要时调用 refresh\n */\n enabled?: () => boolean;\n /** 成功后调用 */\n onSuccess?: (data: T, params: P) => void;\n /** 失败后调用(取消的不算) */\n onError?: (error: unknown, params: P) => void;\n}\n\n/** useRequest 的返回值 */\nexport interface RequestState<T> {\n /** 最后一次成功的结果 */\n readonly data: T | undefined;\n /** 最后一次失败的原因;成功后清空 */\n readonly error: unknown;\n /** 正在请求(防抖等待时还不算) */\n readonly loading: boolean;\n /** 按当前参数立即请求,取消进行中的;返回结果,失败或被后来的请求顶掉时为 undefined */\n refresh(): Promise<T | undefined>;\n /** 取消进行中的请求与等着的防抖 */\n cancel(): void;\n /** 直接改数据(乐观更新、本地删掉一行),不发请求 */\n mutate(data: T | undefined): void;\n}\n\n/** 请求的状态(在 setup 里调用;见文件开头) */\nexport function useRequest<T, P = undefined>(\n fetcher: (params: P, signal: AbortSignal) => Promise<T>,\n options: RequestOptions<P, T> = {},\n): RequestState<T> {\n const { params, debounce = 0, immediate = true, keepPrevious = true } = options;\n const data = shallowRef<T>();\n const error = shallowRef<unknown>();\n const loading = shallowRef(false);\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // 每次请求一个编号:结果回来时不是最后一次的就丢掉(fetcher 没理会 signal 时也不会覆盖)\n let latest = 0;\n const readParams = () => params?.() as P;\n // 上一次请求(或开始时)的参数:参数变了但与它相同时不再请求(refresh 之后侦听器又看到同一组参数)\n let last = params ? readParams() : undefined;\n\n function cancel() {\n clearTimeout(timer);\n latest++;\n controller?.abort();\n controller = undefined;\n loading.value = false;\n }\n\n async function run(current: P): Promise<T | undefined> {\n cancel();\n last = current;\n const id = latest;\n const own = (controller = new AbortController());\n loading.value = true;\n if (!keepPrevious) data.value = undefined;\n try {\n const result = await fetcher(current, own.signal);\n if (id !== latest) return undefined;\n data.value = result;\n error.value = undefined;\n options.onSuccess?.(result, current);\n return result;\n } catch (reason) {\n if (id !== latest || isAbortError(reason)) return undefined;\n error.value = reason;\n options.onError?.(reason, current);\n return undefined;\n } finally {\n if (id === latest) {\n loading.value = false;\n controller = undefined;\n }\n }\n }\n\n if (params) {\n watch(readParams, (next) => {\n if (options.enabled?.() === false) return;\n if (sameValue(next, last)) return;\n last = next;\n clearTimeout(timer);\n if (debounce > 0) timer = setTimeout(() => void run(next), debounce);\n else void run(next);\n });\n }\n if (immediate && options.enabled?.() !== false && typeof window !== 'undefined') {\n void run(readParams());\n }\n onScopeDispose(cancel);\n\n return {\n get data() {\n return data.value;\n },\n get error() {\n return error.value;\n },\n get loading() {\n return loading.value;\n },\n refresh: () => run(readParams()),\n cancel,\n mutate: (value) => (data.value = value),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuDA,SAAgB,WACd,SACA,UAAgC,CAAC,GAChB;CACjB,MAAM,EAAE,QAAQ,WAAW,GAAG,YAAY,MAAM,eAAe,SAAS;CACxE,MAAM,OAAO,WAAc;CAC3B,MAAM,QAAQ,WAAoB;CAClC,MAAM,UAAU,WAAW,KAAK;CAChC,IAAI;CACJ,IAAI;CAEJ,IAAI,SAAS;CACb,MAAM,mBAAmB,SAAS;CAElC,IAAI,OAAO,SAAS,WAAW,IAAI,KAAA;CAEnC,SAAS,SAAS;EAChB,aAAa,KAAK;EAClB;EACA,YAAY,MAAM;EAClB,aAAa,KAAA;EACb,QAAQ,QAAQ;CAClB;CAEA,eAAe,IAAI,SAAoC;EACrD,OAAO;EACP,OAAO;EACP,MAAM,KAAK;EACX,MAAM,MAAO,aAAa,IAAI,gBAAgB;EAC9C,QAAQ,QAAQ;EAChB,IAAI,CAAC,cAAc,KAAK,QAAQ,KAAA;EAChC,IAAI;GACF,MAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,MAAM;GAChD,IAAI,OAAO,QAAQ,OAAO,KAAA;GAC1B,KAAK,QAAQ;GACb,MAAM,QAAQ,KAAA;GACd,QAAQ,YAAY,QAAQ,OAAO;GACnC,OAAO;EACT,SAAS,QAAQ;GACf,IAAI,OAAO,UAAU,aAAa,MAAM,GAAG,OAAO,KAAA;GAClD,MAAM,QAAQ;GACd,QAAQ,UAAU,QAAQ,OAAO;GACjC;EACF,UAAU;GACR,IAAI,OAAO,QAAQ;IACjB,QAAQ,QAAQ;IAChB,aAAa,KAAA;GACf;EACF;CACF;CAEA,IAAI,QACF,MAAM,aAAa,SAAS;EAC1B,IAAI,QAAQ,UAAU,MAAM,OAAO;EACnC,IAAI,UAAU,MAAM,IAAI,GAAG;EAC3B,OAAO;EACP,aAAa,KAAK;EAClB,IAAI,WAAW,GAAG,QAAQ,iBAAiB,KAAK,IAAI,IAAI,GAAG,QAAQ;OAC9D,IAAS,IAAI;CACpB,CAAC;CAEH,IAAI,aAAa,QAAQ,UAAU,MAAM,SAAS,OAAO,WAAW,aAClE,IAAS,WAAW,CAAC;CAEvB,eAAe,MAAM;CAErB,OAAO;EACL,IAAI,OAAO;GACT,OAAO,KAAK;EACd;EACA,IAAI,QAAQ;GACV,OAAO,MAAM;EACf;EACA,IAAI,UAAU;GACZ,OAAO,QAAQ;EACjB;EACA,eAAe,IAAI,WAAW,CAAC;EAC/B;EACA,SAAS,UAAW,KAAK,QAAQ;CACnC;AACF"}
1
+ {"version":3,"file":"use-request.js","names":[],"sources":["../../../src/utils/request/use-request.ts"],"sourcesContent":["/**\n * 一个请求的状态(参考 TanStack Query、alova 的 useWatcher):只采用最后一次的结果,发新请求时取消上一次,\n * 参数变化防抖,重新请求时保留旧数据(表格不闪成空的)。\n *\n * const http = useHttp();\n * const users = useRequest(\n * ({ keyword, page }, signal) => http.request<Page<User>>({ url: '/users', query: { keyword, page }, signal }),\n * { params: () => ({ keyword, page }), debounce: 300 },\n * );\n * users.data?.rows; users.loading; users.error; users.refresh();\n *\n * 只在浏览器里自动请求:服务端渲染时 data 留空,等页面在浏览器里接管后再请求。\n * 一开始就请求时 loading 从 true 开始,服务端也按“加载中”渲染:水合时两边一致,浏览器接着发请求。\n */\nimport { onScopeDispose, shallowRef, watch } from 'vue';\nimport { sameValue } from '../data/equality';\nimport { isAbortError } from './http';\n\n/** useRequest 的选项 */\nexport interface RequestOptions<P, T> {\n /** 请求参数:读到的响应式值变了、且内容确实不同时重新请求;不写时只在开始与 refresh 时请求 */\n params?: () => P;\n /** 参数变了以后等多久再请求(毫秒),默认 0;refresh 不等 */\n debounce?: number;\n /** 一开始就请求,默认 true;false 时等调用 refresh(或参数变化) */\n immediate?: boolean;\n /** 重新请求时保留上一次的数据,默认 true;false 时请求一开始就清空 */\n keepPrevious?: boolean;\n /**\n * 自动请求的开关(弹层打开时才请求这类):为 false 时 immediate 与参数变化都不请求,refresh 照常。\n * 变回 true 时不自动补一次,需要时调用 refresh\n */\n enabled?: () => boolean;\n /** 成功后调用 */\n onSuccess?: (data: T, params: P) => void;\n /** 失败后调用(取消的不算) */\n onError?: (error: unknown, params: P) => void;\n}\n\n/** useRequest 的返回值 */\nexport interface RequestState<T> {\n /** 最后一次成功的结果 */\n readonly data: T | undefined;\n /** 最后一次失败的原因;成功后清空 */\n readonly error: unknown;\n /** 正在请求(防抖等待时还不算) */\n readonly loading: boolean;\n /** 按当前参数立即请求,取消进行中的;返回结果,失败或被后来的请求顶掉时为 undefined */\n refresh(): Promise<T | undefined>;\n /** 取消进行中的请求与等着的防抖 */\n cancel(): void;\n /** 直接改数据(乐观更新、本地删掉一行),不发请求 */\n mutate(data: T | undefined): void;\n}\n\n/** 请求的状态(在 setup 里调用;见文件开头) */\nexport function useRequest<T, P = undefined>(\n fetcher: (params: P, signal: AbortSignal) => Promise<T>,\n options: RequestOptions<P, T> = {},\n): RequestState<T> {\n const { params, debounce = 0, immediate = true, keepPrevious = true } = options;\n const data = shallowRef<T>();\n const error = shallowRef<unknown>();\n const starts = immediate && options.enabled?.() !== false;\n const loading = shallowRef(starts);\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // 每次请求一个编号:结果回来时不是最后一次的就丢掉(fetcher 没理会 signal 时也不会覆盖)\n let latest = 0;\n const readParams = () => params?.() as P;\n // 上一次请求(或开始时)的参数:参数变了但与它相同时不再请求(refresh 之后侦听器又看到同一组参数)\n let last = params ? readParams() : undefined;\n\n function cancel() {\n clearTimeout(timer);\n latest++;\n controller?.abort();\n controller = undefined;\n loading.value = false;\n }\n\n async function run(current: P): Promise<T | undefined> {\n cancel();\n last = current;\n const id = latest;\n const own = (controller = new AbortController());\n loading.value = true;\n if (!keepPrevious) data.value = undefined;\n try {\n const result = await fetcher(current, own.signal);\n if (id !== latest) return undefined;\n data.value = result;\n error.value = undefined;\n options.onSuccess?.(result, current);\n return result;\n } catch (reason) {\n if (id !== latest || isAbortError(reason)) return undefined;\n error.value = reason;\n options.onError?.(reason, current);\n return undefined;\n } finally {\n if (id === latest) {\n loading.value = false;\n controller = undefined;\n }\n }\n }\n\n if (params) {\n watch(readParams, (next) => {\n if (options.enabled?.() === false) return;\n if (sameValue(next, last)) return;\n last = next;\n clearTimeout(timer);\n if (debounce > 0) timer = setTimeout(() => void run(next), debounce);\n else void run(next);\n });\n }\n if (starts && typeof window !== 'undefined') {\n void run(readParams());\n }\n onScopeDispose(cancel);\n\n return {\n get data() {\n return data.value;\n },\n get error() {\n return error.value;\n },\n get loading() {\n return loading.value;\n },\n refresh: () => run(readParams()),\n cancel,\n mutate: (value) => (data.value = value),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwDA,SAAgB,WACd,SACA,UAAgC,CAAC,GAChB;CACjB,MAAM,EAAE,QAAQ,WAAW,GAAG,YAAY,MAAM,eAAe,SAAS;CACxE,MAAM,OAAO,WAAc;CAC3B,MAAM,QAAQ,WAAoB;CAClC,MAAM,SAAS,aAAa,QAAQ,UAAU,MAAM;CACpD,MAAM,UAAU,WAAW,MAAM;CACjC,IAAI;CACJ,IAAI;CAEJ,IAAI,SAAS;CACb,MAAM,mBAAmB,SAAS;CAElC,IAAI,OAAO,SAAS,WAAW,IAAI,KAAA;CAEnC,SAAS,SAAS;EAChB,aAAa,KAAK;EAClB;EACA,YAAY,MAAM;EAClB,aAAa,KAAA;EACb,QAAQ,QAAQ;CAClB;CAEA,eAAe,IAAI,SAAoC;EACrD,OAAO;EACP,OAAO;EACP,MAAM,KAAK;EACX,MAAM,MAAO,aAAa,IAAI,gBAAgB;EAC9C,QAAQ,QAAQ;EAChB,IAAI,CAAC,cAAc,KAAK,QAAQ,KAAA;EAChC,IAAI;GACF,MAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,MAAM;GAChD,IAAI,OAAO,QAAQ,OAAO,KAAA;GAC1B,KAAK,QAAQ;GACb,MAAM,QAAQ,KAAA;GACd,QAAQ,YAAY,QAAQ,OAAO;GACnC,OAAO;EACT,SAAS,QAAQ;GACf,IAAI,OAAO,UAAU,aAAa,MAAM,GAAG,OAAO,KAAA;GAClD,MAAM,QAAQ;GACd,QAAQ,UAAU,QAAQ,OAAO;GACjC;EACF,UAAU;GACR,IAAI,OAAO,QAAQ;IACjB,QAAQ,QAAQ;IAChB,aAAa,KAAA;GACf;EACF;CACF;CAEA,IAAI,QACF,MAAM,aAAa,SAAS;EAC1B,IAAI,QAAQ,UAAU,MAAM,OAAO;EACnC,IAAI,UAAU,MAAM,IAAI,GAAG;EAC3B,OAAO;EACP,aAAa,KAAK;EAClB,IAAI,WAAW,GAAG,QAAQ,iBAAiB,KAAK,IAAI,IAAI,GAAG,QAAQ;OAC9D,IAAS,IAAI;CACpB,CAAC;CAEH,IAAI,UAAU,OAAO,WAAW,aAC9B,IAAS,WAAW,CAAC;CAEvB,eAAe,MAAM;CAErB,OAAO;EACL,IAAI,OAAO;GACT,OAAO,KAAK;EACd;EACA,IAAI,QAAQ;GACV,OAAO,MAAM;EACf;EACA,IAAI,UAAU;GACZ,OAAO,QAAQ;EACjB;EACA,eAAe,IAAI,WAAW,CAAC;EAC/B;EACA,SAAS,UAAW,KAAK,QAAQ;CACnC;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerodep-dev/vue-tsx-pro-ui",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "vue-tsx-pro 组件库",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -112,7 +112,7 @@
112
112
  "@floating-ui/dom": "1.8.0",
113
113
  "@internationalized/date": "3.12.4",
114
114
  "@radix-ui/colors": "3.0.0",
115
- "@zerodep-dev/vue-tsx-pro-tsx": "^0.2.0",
115
+ "@zerodep-dev/vue-tsx-pro-tsx": "^0.3.0",
116
116
  "animejs": "4.5.0",
117
117
  "culori": "4.0.2",
118
118
  "decimal.js": "10.6.0",