@ryuzaki13/react-foundation-ui 1.8.12 → 1.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/ui.module-BsDio9A3.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
- package/storybook-static/assets/{Badge-CveIo2LZ.js → Badge-Sv6eRVzK.js} +1 -1
- package/storybook-static/assets/{Badge.stories-Bd8M64xJ.js → Badge.stories-DVmquAc-.js} +1 -1
- package/storybook-static/assets/{BadgeList-xT41a0VL.js → BadgeList-CDdjSFhA.js} +1 -1
- package/storybook-static/assets/{Button-DkDgfpHL.js → Button-CkXBOqtg.js} +1 -1
- package/storybook-static/assets/{Button-C5bBSb3k.js → Button-DLdmu_Qa.js} +1 -1
- package/storybook-static/assets/{Button.stories-CeKPeGK5.js → Button.stories-BhhPN3cO.js} +1 -1
- package/storybook-static/assets/{CalendarView-CEqcrblx.js → CalendarView-Cz74PFcU.js} +1 -1
- package/storybook-static/assets/{CheckBox-DKeFkdOt.js → CheckBox-8sW-kpX-.js} +1 -1
- package/storybook-static/assets/{CheckBox-OVvAarW-.js → CheckBox-DcH3qwbm.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CfZ0p1yo.js → CheckBox.stories-BA9MwVIi.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-BWW7zrfs.js → Color-6AOWCN3U-DW9_SixM.js} +1 -1
- package/storybook-static/assets/{ContextMenu-kia7is1N.js → ContextMenu-6XIB9-E_.js} +1 -1
- package/storybook-static/assets/{ContextMenu-xn2GtiLR.js → ContextMenu-oCfsHX5G.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-CYuy9uXF.js → ContextMenu.stories-DsRiGv-d.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-C4w-APws.js → CustomOptionButton-By6XsDCG.js} +1 -1
- package/storybook-static/assets/{DateInput-BiUFIihm.js → DateInput-CD_CDw8L.js} +1 -1
- package/storybook-static/assets/{DateInput-DAzE5mCE.js → DateInput-CMxzQRo_.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-BcowGCRD.js → DateInput.stories-BL0d4llb.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-RIyqNBk9.js → DateRangePresetSelect-393Izw7W.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CQm4dNLR.js → DateRangePresetSelect-BeEhwdah.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-ypGyuGfy.js → DateRangePresetSelect.stories-BKRFlABX.js} +1 -1
- package/storybook-static/assets/{Detail-CEypL2Nh.js → Detail-BbQSGgu7.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DNkT7B-u.js → Detail.stories-BMD_2zWN.js} +1 -1
- package/storybook-static/assets/{Dialog-BVFFQJDH.js → Dialog-CAM8VuM7.js} +1 -1
- package/storybook-static/assets/{Dialog-DD0grLG3.js → Dialog-Dw9rG9oU.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-DSCypHqR.js → Dialog.stories-C3NKTM84.js} +1 -1
- package/storybook-static/assets/{Disclosure-DauUgrev.js → Disclosure-CRP1Wrwg.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-B1qB8vQZ.js → Disclosure.stories-uOnVxNv4.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-D9oCCeHf.js → DisclosureGroup-CV9aHNnL.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CmSf6tXp.js → DocsRenderer-JROSPFPF-Dt6sU0Wy.js} +1 -1
- package/storybook-static/assets/{DropZone-D8hbPCAv.js → DropZone-1-qIEJTI.js} +1 -1
- package/storybook-static/assets/{DropZone-D42ueN1w.js → DropZone-UOOd3d_D.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-DO-T_Bh4.js → DropZone.stories-P0P8n3BX.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-CknJDoji.js → DropdownMenu-CIkQkHEe.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Dqi_bo3c.js → ExpandableActionPanel-BVxtZtja.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-BD9QZGZN.js → ExpandableActionPanel.stories-Bw-Nbxjl.js} +1 -1
- package/storybook-static/assets/{Flex-CaVn1IOP.js → Flex-v3qGyymY.js} +1 -1
- package/storybook-static/assets/{Flex.stories-Bp9Y6q6b.js → Flex.stories-BZWj9Yqq.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-U7tx-Jlw.js → FloatingPopover-CBzRVsZl.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-pmmhsAbN.js → FormattedTableCell-woQYObYH.js} +1 -1
- package/storybook-static/assets/{Grid-CEpMNurH.js → Grid-BuA8kbGl.js} +1 -1
- package/storybook-static/assets/{Grid.stories-BM-gO5DN.js → Grid.stories-DkQGjuPs.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BWz5XU6U.js → ImageCropper.stories-DWU8FP_b.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BTYZEX5t.js → ImageRenderer-BYrN4S_Z.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-Dz2STM95.js → ImageRenderer.stories-ChjsjhPh.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DBVe0an3.js → ImageView.stories-CWkyOzLP.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-C4Px97lD.js → ImageViewer.stories-BAJJBDHc.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-TJtlJVfa.js → ImageViewerRuntime-DGLE97-e.js} +1 -1
- package/storybook-static/assets/{Input-CIPgijvW.js → Input-B8ZadIiC.js} +1 -1
- package/storybook-static/assets/{Input-D8io9jVS.js → Input-BoKPLAe2.js} +1 -1
- package/storybook-static/assets/{Input.stories-SUk3aYaC.js → Input.stories-JHdz5Jsc.js} +1 -1
- package/storybook-static/assets/{InputDateTime-DA5pIDuE.js → InputDateTime-D0IxugsL.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-DeudzDSU.js → InputDateTime.stories-Ba0D7xF9.js} +1 -1
- package/storybook-static/assets/{InputFile-CGAC7ruP.js → InputFile--u_0dj3Y.js} +1 -1
- package/storybook-static/assets/{InputFile-C5mp5Y5I.js → InputFile-BTJBqn1m.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-Cx1xQ6PE.js → InputFile.stories-CwpNYB5J.js} +1 -1
- package/storybook-static/assets/{InputFiles-B7OBcPJN.js → InputFiles-B6vhWm7I.js} +1 -1
- package/storybook-static/assets/{InputFiles-Hzl89Ghf.js → InputFiles-DwMvXQb3.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CG6QjDZH.js → InputFiles.stories-5oCc9HHg.js} +1 -1
- package/storybook-static/assets/{InputFilesList-B6htWHF1.js → InputFilesList-D51n4iSR.js} +1 -1
- package/storybook-static/assets/{InputImage-CQnoblAE.js → InputImage-DPnitmQk.js} +1 -1
- package/storybook-static/assets/{InputImage-BTa4S4Wp.js → InputImage-bnYOQAkQ.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-CEI44Eyz.js → InputImage.stories-uf2LvY4r.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-B0ypWz1x.js → InteractiveComponents-CJn1YMhT.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-BadApta9.js → InteractiveComponents.stories-fFTx5yhl.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-C_Uz7Tnj.js → LayoutPicker-BPBdZChZ.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-COB9GlV_.js → LayoutPicker-C_NUvbsk.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-Btp0IcaL.js → LayoutPicker.stories-DBzM8rRy.js} +1 -1
- package/storybook-static/assets/{Listbox-CyfuZw7w.js → Listbox-Cqgq5Wny.js} +1 -1
- package/storybook-static/assets/{Listbox-AAaZGSAl.js → Listbox-D7jP8mCo.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-NDKQmjyQ.js → Listbox.stories-X2jhmC90.js} +1 -1
- package/storybook-static/assets/{Modal-BJDnJ4zv.js → Modal-QiGhxbkR.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D_X5lTLO.js → Modal.stories-CPLTAhHy.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-ShDjozpW.js → ModalManagerProvider-DpbTvfL4.js} +1 -1
- package/storybook-static/assets/{MultiSelect-B5CElQ3-.js → MultiSelect-CJN6yc1C.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DqXfrjcH.js → MultiSelect-DeAFY3RP.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-fB3mcFmx.js → MultiSelect.stories-DHrCaM8r.js} +1 -1
- package/storybook-static/assets/{NoData-DDb0G7T8.js → NoData-Cw6KaFFK.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-CIGL-pKX.js → NotificationsHost-BjEs_A2p.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-B_MRb3fs.js → NotificationsHost.stories-DUyWIJ9o.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-DQAitH4N.js → ODataMultiSelect-DsGVEtfr.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-DwW221S9.js → ODataMultiSelect.stories-CV8LD8fz.js} +1 -1
- package/storybook-static/assets/{ODataSelect-tiZhOIhE.js → ODataSelect-nPkCWP7P.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-BhaatPjK.js → ODataSelect.stories-BT5zNMAw.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-B9WqJ-Un.js → ODataTreeMultiSelect-BnA7iZbw.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CAfKuhfU.js → ODataTreeMultiSelect.stories-Ddu-3L1X.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Cel1phxZ.js → ODataTreeSelect-Df18JZjH.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-BpBCpBA9.js → ODataTreeSelect.stories-CnbN0_2o.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-BSeGbz02.js → OneStepScroller-pCI7NBLQ.js} +1 -1
- package/storybook-static/assets/{Option-BBtQ3GdK.js → Option-rYnCuHwV.js} +1 -1
- package/storybook-static/assets/{OptionButton-B9nZuqqW.js → OptionButton-dRTEtcWJ.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DA_zjcdA.js → PeriodSelect-BbxmKATg.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-BGvhR3to.js → PeriodSelect-QdYqbYVi.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-DDP1eXyM.js → PeriodSelect.stories-C_w6x_nb.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-BgvzqRBd.js → PickerTriggerActions-B9PzXuqb.js} +1 -1
- package/storybook-static/assets/{Popover-C0NebUMz.js → Popover-C7EBSl-A.js} +1 -1
- package/storybook-static/assets/{Popover-BQql18MF.js → Popover-DTIeV8sp.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CIyDUtlz.js → Popover.stories-DdK6opAj.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-htbxc3ni.js → PresetRangeDateInput-BuzCEA0N.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-BsgzPwCV.js → PresetRangeDateInput-wM7gI2RF.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-ClHM5Kah.js → PresetRangeDateInput.stories-BHzW7J5Y.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Dcx0BOTx.js → PresetSelect-qwyBKXya.js} +1 -1
- package/storybook-static/assets/{README-eHCINzP3.js → README-3kx1b1eN.js} +1 -1
- package/storybook-static/assets/{README-CHbo4O3Z.js → README-B1TFddGZ.js} +1 -1
- package/storybook-static/assets/{README-ByALXSEH.js → README-B6UdiKEB.js} +1 -1
- package/storybook-static/assets/README-BB1nn-L1.js +740 -0
- package/storybook-static/assets/{README-CWfPiPIB.js → README-BLliGbp2.js} +1 -1
- package/storybook-static/assets/{README-DV4fCpqN.js → README-BRAIrWZ5.js} +1 -1
- package/storybook-static/assets/README-BS_UTHKY.js +441 -0
- package/storybook-static/assets/README-BUwRENpH.js +448 -0
- package/storybook-static/assets/README-BZ5VcRb-.js +583 -0
- package/storybook-static/assets/{README-CNHemCS2.js → README-BbvZ3Kxp.js} +1 -1
- package/storybook-static/assets/{README-BSh5XUR9.js → README-BcQVOGWd.js} +1 -1
- package/storybook-static/assets/{README-ui-uanyg.js → README-Bdo7L8re.js} +1 -1
- package/storybook-static/assets/README-Bl5v6SbZ.js +325 -0
- package/storybook-static/assets/{README-C3UcjOGB.js → README-Bs5hFsTF.js} +1 -1
- package/storybook-static/assets/{README-C8E1O7DQ.js → README-Bt-vDWJK.js} +1 -1
- package/storybook-static/assets/{README-CsoHGRve.js → README-BxWQjG0l.js} +1 -1
- package/storybook-static/assets/{README-BIq-FXcN.js → README-C1-upl_v.js} +1 -1
- package/storybook-static/assets/{README-qHKxXU95.js → README-C3kroViK.js} +1 -1
- package/storybook-static/assets/{README-CH_6ZIO2.js → README-C5VbGqji.js} +1 -1
- package/storybook-static/assets/README-CAN_sUOj.js +400 -0
- package/storybook-static/assets/{README-BB_JPejH.js → README-CAu_o5w0.js} +1 -1
- package/storybook-static/assets/{README-Ss-3t1nX.js → README-CB8w2VUq.js} +1 -1
- package/storybook-static/assets/README-CJ5dluvT.js +3591 -0
- package/storybook-static/assets/{README-B3bFglqG.js → README-CMdJkXoj.js} +1 -1
- package/storybook-static/assets/{README-Dl92E69Z.js → README-CUjyWC3m.js} +1 -1
- package/storybook-static/assets/{README-B45Cwj2a.js → README-CV3k61OS.js} +1 -1
- package/storybook-static/assets/README-CYOVpnIy.js +324 -0
- package/storybook-static/assets/{README-CM-7E-Jf.js → README-CeyhIAvP.js} +1 -1
- package/storybook-static/assets/{README-Byo6DxIF.js → README-Ci8Dg8Od.js} +1 -1
- package/storybook-static/assets/{README-DJHVgrpj.js → README-CiQrgj9L.js} +1 -1
- package/storybook-static/assets/{README-BxjYCoYA.js → README-CjAvZYa8.js} +1 -1
- package/storybook-static/assets/{README-5NhzH8VL.js → README-Cjkxz5fF.js} +1 -1
- package/storybook-static/assets/{README-DE2wk9-v.js → README-Cl_7GagY.js} +1 -1
- package/storybook-static/assets/{README-CIGfHKKE.js → README-CnncCyVQ.js} +1 -1
- package/storybook-static/assets/{README-Bqnqu1bC.js → README-CqqJTDcO.js} +1 -1
- package/storybook-static/assets/{README-D9OypaFB.js → README-CrjrH7U6.js} +1 -1
- package/storybook-static/assets/{README-DvAlDsh9.js → README-D1mTncLb.js} +1 -1
- package/storybook-static/assets/{README-B6Nq7NCU.js → README-DFH1zDp2.js} +1 -1
- package/storybook-static/assets/README-DIqS0sM9.js +355 -0
- package/storybook-static/assets/{README-DjCArsA5.js → README-DLaJrEGM.js} +1 -1
- package/storybook-static/assets/{README-Am6Fa6-b.js → README-DO23FJAl.js} +1 -1
- package/storybook-static/assets/{README-CeK4kfFO.js → README-DeAPv0Mf.js} +1 -1
- package/storybook-static/assets/{README-CAGQnLsv.js → README-Dy9sTa_6.js} +1 -1
- package/storybook-static/assets/{README-5M8ajrJp.js → README-JtT-ZtO0.js} +1 -1
- package/storybook-static/assets/{README-B6ltJiw3.js → README-OYzQVQte.js} +1 -1
- package/storybook-static/assets/{README-C9eh0JLs.js → README-UoSNP7Tk.js} +1 -1
- package/storybook-static/assets/{README-DDBqoI-T.js → README-a5ZgliOG.js} +1 -1
- package/storybook-static/assets/{README-DEj2wSK0.js → README-dokGlpDu.js} +1 -1
- package/storybook-static/assets/{README-BmhhWWEk.js → README-kQRTlSA-.js} +1 -1
- package/storybook-static/assets/{README-DIbfpC-2.js → README-rDh9Q6yY.js} +1 -1
- package/storybook-static/assets/{README-BuMMG4_N.js → README-rhPk9fCo.js} +1 -1
- package/storybook-static/assets/{README-DnA-4W65.js → README-rzRXnvCP.js} +1 -1
- package/storybook-static/assets/{README-BYSgTTZt.js → README-twVQ7X9P.js} +1 -1
- package/storybook-static/assets/{RadioButton-CWtjclwT.js → RadioButton-B_oQ8Wlu.js} +1 -1
- package/storybook-static/assets/{RadioButton-YIQXt0wx.js → RadioButton-Baxj9d9s.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-Ah-CBpeC.js → RadioButton.stories-CsHPV3Wm.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CUS0etBD.js → RadioGroup-Dz0J0QJk.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BnO-GL7A.js → RadioGroup-PH_lOUuL.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-DGwCawtU.js → RadioGroup.stories-B3Nbh5ui.js} +1 -1
- package/storybook-static/assets/{Scrollable-D85fA6pO.js → Scrollable-BnVRtd7g.js} +1 -1
- package/storybook-static/assets/{Select-gRnfvfGh.js → Select-CqFdLQiM.js} +1 -1
- package/storybook-static/assets/{Select-CGCxJjL9.js → Select-DlCmYtXt.js} +1 -1
- package/storybook-static/assets/{Select.stories-CMwt4F9i.js → Select.stories-wUtNe9Ec.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-BLXfKJ38.js → SerializableSelect-Cxj4rBI9.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Bca1a9ZU.js → SerializableSelect.stories-D8S4jMFa.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CyeQN0Rd.js → SingleDateTimeInput-B00ILEN6.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-xrmZckzw.js → SingleDateTimeInput-Z6TGUUj6.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BYFTQM9z.js → SingleDateTimeInput.stories-CV6Nv9qi.js} +1 -1
- package/storybook-static/assets/{Slider-D8GtXVGI.js → Slider-B9FxWdEJ.js} +1 -1
- package/storybook-static/assets/{Slider-1yJ3uVeR.js → Slider-Dk01oltE.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CyQ3ns_C.js → Slider.stories-VNmcaz3A.js} +1 -1
- package/storybook-static/assets/{SliderInput-ISSx9vH_.js → SliderInput-E86RlSIn.js} +1 -1
- package/storybook-static/assets/{SliderInput-BOzHhEUA.js → SliderInput-V3uHOcZ2.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-7ooTghrS.js → SliderInput.stories-Bwl2rOaJ.js} +1 -1
- package/storybook-static/assets/{Sortable-CCLiMmfZ.js → Sortable-DaGz4_X2.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-B36szI6t.js → Sortable.stories-Ba8gP0xY.js} +1 -1
- package/storybook-static/assets/{Splitter-DQGhgRwx.js → Splitter-BIsxdfsl.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Hsq1wYaq.js → Splitter.stories-DlgVxAnv.js} +1 -1
- package/storybook-static/assets/{StateSelect-DieNn4VC.js → StateSelect-3pOCDdLu.js} +1 -1
- package/storybook-static/assets/{StateSelect-C6hldFgO.js → StateSelect-Q0-lss-x.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-CvAhDMix.js → StateSelect.stories-B2W4sd0y.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CUT1tvt-.js → StringToggle.stories-CwhsQCkG.js} +1 -1
- package/storybook-static/assets/{Switch-nEMRtcWe.js → Switch-8ZMASw90.js} +1 -1
- package/storybook-static/assets/{Switch-CX9p_uYU.js → Switch-CxoCcf-H.js} +1 -1
- package/storybook-static/assets/{Switch.stories-CPsHa2_m.js → Switch.stories-Ceo-Mw04.js} +1 -1
- package/storybook-static/assets/{Table-BhtITVtj.js → Table-nJgo4qpK.js} +1 -1
- package/storybook-static/assets/{Table.stories-nWNhSydG.js → Table.stories-CSCZ9sFd.js} +1 -1
- package/storybook-static/assets/{Tabs-DMQFh2BJ.js → Tabs-D-gRjKef.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-D23_xvom.js → Tabs.stories-EQ3VUnt-.js} +1 -1
- package/storybook-static/assets/{TabsBox-B5BsD_j_.js → TabsBox-NrlLIwhz.js} +1 -1
- package/storybook-static/assets/{TagInput-DO17z100.js → TagInput-Drf7SeTu.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-CMMFnIzb.js → TagInput.stories-BcM6J6I9.js} +1 -1
- package/storybook-static/assets/{Text-ClnbDqRk.js → Text-Ck_6UUKY.js} +1 -1
- package/storybook-static/assets/{Textarea-DkhohiNc.js → Textarea-C7SEoYQa.js} +1 -1
- package/storybook-static/assets/{Textarea-C2IO_zsP.js → Textarea-DFko4W6r.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-NL6Aq8Vc.js → Textarea.stories-BW5QBRXP.js} +1 -1
- package/storybook-static/assets/{TimePanel-DNEPDlSW.js → TimePanel-BcCaEcjP.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-DlfdPsz1.js → TimePanel.stories-OjUebxOe.js} +1 -1
- package/storybook-static/assets/{Toggle-3U5CceQN.js → Toggle-BN83AOrV.js} +1 -1
- package/storybook-static/assets/{Toggle-Cc6Ca-HI.js → Toggle-Cs5KD8Kd.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-BR-hVLDp.js → Toggle.stories-UtFKPdYx.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-D9hMQN2O.js → TreeMultiSelect-04RqLe9P.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-B0oBc-4y.js → TreeMultiSelect-CN_rnzFe.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-CslpbvPR.js → TreeMultiSelect.stories-BbYabVXc.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B_dMCe45.js → TreePickerBase-FDlZpaH2.js} +1 -1
- package/storybook-static/assets/{TreeSelect-2lj0Q8gm.js → TreeSelect-DGSc7Vg9.js} +1 -1
- package/storybook-static/assets/{TreeSelect-DEKNYF2b.js → TreeSelect-DT6WnSjM.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-CVDxn8Vm.js → TreeSelect.stories-C3jdjFQY.js} +1 -1
- package/storybook-static/assets/{TreeTable-CBIpzYRL.js → TreeTable-_ymCr62E.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-BMzrr2Kc.js → TreeTable.stories-DHShLIUZ.js} +1 -1
- package/storybook-static/assets/{blocks-B5YBxaaS.js → blocks-DcVVTXzf.js} +3 -3
- package/storybook-static/assets/{check-BjtdCRaW.js → check-5jIlw3QY.js} +1 -1
- package/storybook-static/assets/{chevron-down-B4u-y8Z1.js → chevron-down-CkkAjpRn.js} +1 -1
- package/storybook-static/assets/{chevron-left-BQfWs7Ah.js → chevron-left-DNKAotw1.js} +1 -1
- package/storybook-static/assets/{chevron-right-ChokKd-f.js → chevron-right-CYbSLSbL.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-meOkhzk4.js → chunk-W22LQPXL-CfJS6YKX.js} +1 -1
- package/storybook-static/assets/{circle-alert-B1AnDRf_.js → circle-alert-DXlaxNFD.js} +1 -1
- package/storybook-static/assets/{circle-check-JYnlcC1F.js → circle-check-BEKmaVgA.js} +1 -1
- package/storybook-static/assets/{components-C_wl1sL5.js → components-tbVBP-zS.js} +3 -3
- package/storybook-static/assets/{contextMenu-B-TUGs_1.js → contextMenu-DsufH6U8.js} +1 -1
- package/storybook-static/assets/{download-eR3X8I-h.js → download-C9jGmfx6.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-D95VPQ0b.js → floating-ui.react-YV96fWnb.js} +1 -1
- package/storybook-static/assets/{foundationApi-QhHXpYLB.js → foundationApi-DoAXLuxI.js} +1 -1
- package/storybook-static/assets/{foundationLib-CEAjnstw.js → foundationLib-C7xkVQAX.js} +1 -1
- package/storybook-static/assets/{hooks-awde7r2r.js → hooks-pjRWWXeZ.js} +1 -1
- package/storybook-static/assets/{iframe-FSp_AjJa.js → iframe--RU38UHO.js} +3 -3
- package/storybook-static/assets/iframe-BpGl-WdJ.js +1 -0
- package/storybook-static/assets/{info-12vmb1sT.js → info-CI9KvIum.js} +1 -1
- package/storybook-static/assets/{odata-C0Kpvttz.js → odata-bRglfPOU.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-BXZnk_C7.js → odataStoryFixtures-B8p8bkan.js} +1 -1
- package/storybook-static/assets/{react-BlCqWuXr.js → react-pQ8GL5b8.js} +1 -1
- package/storybook-static/assets/{refresh-cw-Bf5ufPte.js → refresh-cw-BJlS8-cO.js} +1 -1
- package/storybook-static/assets/{settings-2-DR-dTXIC.js → settings-2-CDqhDJH7.js} +1 -1
- package/storybook-static/assets/{sortable-B5e5yb_-.js → sortable-CPlbom2V.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-EVJARTec.js → syntaxhighlighter-QEQV7K2Y-Dh9tQsbp.js} +1 -1
- package/storybook-static/assets/{trash-2-QP7TS18H.js → trash-2-B3rSNw_b.js} +1 -1
- package/storybook-static/assets/{triangle-alert-qw19mxHr.js → triangle-alert-zaUE1fxx.js} +1 -1
- package/storybook-static/assets/{ui-CatTcSJL.css → ui-aDejsbZB.css} +1 -1
- package/storybook-static/assets/{uiClasses-B9c6dZuu.js → uiClasses-Cmg8Dx0X.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-Csu_Cct9.js → useODataSelectBase-DH9eFTxr.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-BAv-Twqf.js → useODataTreeData-BrcEV-bK.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-Da-XM_Y0.js → usePickerQuery-BbTJGOEV.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-C0TdC2Pz.js → usePickerTriggerController-DNei2G7n.js} +1 -1
- package/storybook-static/assets/{x-aCjYTirW.js → x-BiHHkto5.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/README--LCKbep-.js +0 -110
- package/storybook-static/assets/README-BXJneZAJ.js +0 -147
- package/storybook-static/assets/README-C6BOdXNV.js +0 -322
- package/storybook-static/assets/README-CC00hlZK.js +0 -527
- package/storybook-static/assets/README-Cj2e6HrF.js +0 -178
- package/storybook-static/assets/README-DN9HKtp_.js +0 -124
- package/storybook-static/assets/README-DNricOkt.js +0 -136
- package/storybook-static/assets/README-DoCA4JXf.js +0 -273
- package/storybook-static/assets/README-tm9QH9cF.js +0 -103
- package/storybook-static/assets/iframe-DzQq_POR.js +0 -1
- /package/storybook-static/assets/{ui.module-Cat84Nza.js → ui.module-BDnTp43_.js} +0 -0
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/Orchestration/Async Tasks`}),`
|
|
2
|
-
`,(0,c.jsxs)(t.h1,{id:`асинхронные-задачи-через-ryuzaki13react-foundation-apiasync`,children:[`Асинхронные задачи через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/async`})]}),`
|
|
3
|
-
`,(0,c.jsx)(t.p,{children:`Модуль запускает независимые Promise-задачи, сохраняет связь результата с исходным элементом и формирует удобную сводку для UI/логов.`}),`
|
|
4
|
-
`,(0,c.jsx)(t.h2,{id:`какой-runner-выбрать`,children:`Какой runner выбрать`}),`
|
|
5
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Сценарий`}),(0,c.jsx)(t.th,{children:`Функция`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Задач немного, можно начать все одновременно, любая ошибка должна завершить batch исключением`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`runAsyncTasks`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нужно ограничить число одновременных запросов, показать progress или поддержать abort`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`runConcurrentTasks`})})]})]})]}),`
|
|
6
|
-
`,(0,c.jsx)(t.p,{children:`Обе функции выполняют задачи параллельно. Они не создают web workers и не ускоряют CPU-bound JavaScript: Promise-concurrency полезна прежде всего для I/O — HTTP, чтения storage и других async операций.`}),`
|
|
7
|
-
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
8
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
9
|
-
AsyncTasksError,
|
|
10
|
-
ConcurrencyPartialError,
|
|
11
|
-
runAsyncTasks,
|
|
12
|
-
runConcurrentTasks
|
|
13
|
-
} from "@ryuzaki13/react-foundation-api/async";
|
|
14
|
-
|
|
15
|
-
import type {
|
|
16
|
-
AsyncTask,
|
|
17
|
-
RunAsyncTasksResult,
|
|
18
|
-
RunConcurrentTasksOptions,
|
|
19
|
-
RunConcurrentTasksResult
|
|
20
|
-
} from "@ryuzaki13/react-foundation-api/async";
|
|
21
|
-
`})}),`
|
|
22
|
-
`,(0,c.jsx)(t.p,{children:`Модуль не требует React или TanStack Query.`}),`
|
|
23
|
-
`,(0,c.jsxs)(t.h2,{id:`база-async-promise-и-await`,children:[`База: `,(0,c.jsx)(t.code,{children:`async`}),`, `,(0,c.jsx)(t.code,{children:`Promise`}),` и `,(0,c.jsx)(t.code,{children:`await`})]}),`
|
|
24
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`async`}),`-функция всегда возвращает `,(0,c.jsx)(t.code,{children:`Promise`}),`. `,(0,c.jsx)(t.code,{children:`await`}),` приостанавливает только текущую async-функцию, а не весь browser thread:`]}),`
|
|
25
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`async function loadName() {
|
|
26
|
-
const response = await fetch("/api/me");
|
|
27
|
-
return response.text();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const namePromise = loadName(); // Promise<string>.
|
|
31
|
-
const name = await namePromise; // string.
|
|
32
|
-
`})}),`
|
|
33
|
-
`,(0,c.jsxs)(t.p,{children:[`Ошибку Promise обрабатывают через `,(0,c.jsx)(t.code,{children:`try/catch`}),` вокруг `,(0,c.jsx)(t.code,{children:`await`}),`.`]}),`
|
|
34
|
-
`,(0,c.jsx)(t.h2,{id:`runasynctasks`,children:(0,c.jsx)(t.code,{children:`runAsyncTasks`})}),`
|
|
35
|
-
`,(0,c.jsx)(t.h3,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
36
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runAsyncTasks([
|
|
37
|
-
{ name: "profile", run: () => fetchProfile() },
|
|
38
|
-
{ name: "settings", run: () => fetchSettings() }
|
|
39
|
-
]);
|
|
40
|
-
|
|
41
|
-
console.log(result.summary);
|
|
42
|
-
// { total: 2, succeeded: 2, failed: 0 }
|
|
43
|
-
`})}),`
|
|
44
|
-
`,(0,c.jsxs)(t.p,{children:[`Все `,(0,c.jsx)(t.code,{children:`run`}),` запускаются сразу через `,(0,c.jsx)(t.code,{children:`Promise.all`}),`. Важное отличие от обычного `,(0,c.jsx)(t.code,{children:`Promise.all`}),`: ошибка одной задачи перехватывается внутри runner-а, поэтому остальные задачи успевают завершиться. После завершения всего batch функция либо возвращает полный результат, либо бросает `,(0,c.jsx)(t.code,{children:`AsyncTasksError`}),` с тем же полным результатом.`]}),`
|
|
45
|
-
`,(0,c.jsx)(t.h3,{id:`обработка-частичного-успеха`,children:`Обработка частичного успеха`}),`
|
|
46
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`try {
|
|
47
|
-
const result = await runAsyncTasks(tasks, {
|
|
48
|
-
errorMessage: "Не все стартовые данные загрузились"
|
|
49
|
-
});
|
|
50
|
-
useData(result.successes);
|
|
51
|
-
} catch (error) {
|
|
52
|
-
if (error instanceof AsyncTasksError) {
|
|
53
|
-
usePartialData(error.result.successes);
|
|
54
|
-
showErrors(error.result.errors);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
throw error;
|
|
59
|
-
}
|
|
60
|
-
`})}),`
|
|
61
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`AsyncTasksError.result`}),` содержит:`]}),`
|
|
62
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type RunAsyncTasksResult<TResult> = {
|
|
63
|
-
settled: readonly AsyncTaskSettled<TResult>[];
|
|
64
|
-
successes: readonly AsyncTaskSuccess<TResult>[];
|
|
65
|
-
errors: readonly AsyncTaskFailure[];
|
|
66
|
-
summary: {
|
|
67
|
-
total: number;
|
|
68
|
-
succeeded: number;
|
|
69
|
-
failed: number;
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
`})}),`
|
|
73
|
-
`,(0,c.jsxs)(t.p,{children:[`Элементы `,(0,c.jsx)(t.code,{children:`settled`}),`, `,(0,c.jsx)(t.code,{children:`successes`}),` и `,(0,c.jsx)(t.code,{children:`errors`}),` сохраняют порядок исходного массива. Каждый элемент содержит `,(0,c.jsx)(t.code,{children:`index`}),` и `,(0,c.jsx)(t.code,{children:`name`}),`.`]}),`
|
|
74
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`if (item.status === "fulfilled") {
|
|
75
|
-
console.log(item.data);
|
|
76
|
-
} else {
|
|
77
|
-
console.error(item.error);
|
|
78
|
-
}
|
|
79
|
-
`})}),`
|
|
80
|
-
`,(0,c.jsxs)(t.p,{children:[`TypeScript сужает union по `,(0,c.jsx)(t.code,{children:`status`}),`.`]}),`
|
|
81
|
-
`,(0,c.jsxs)(t.p,{children:[`Пустой список возвращает успешный пустой результат. `,(0,c.jsx)(t.code,{children:`runAsyncTasks`}),` не имеет встроенного concurrency limit и AbortSignal.`]}),`
|
|
82
|
-
`,(0,c.jsx)(t.h2,{id:`runconcurrenttasks`,children:(0,c.jsx)(t.code,{children:`runConcurrentTasks`})}),`
|
|
83
|
-
`,(0,c.jsx)(t.h3,{id:`ограничение-одновременных-запросов`,children:`Ограничение одновременных запросов`}),`
|
|
84
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runConcurrentTasks(
|
|
85
|
-
userIds,
|
|
86
|
-
async (userId, { signal }) => {
|
|
87
|
-
const response = await fetch(\`/api/users/\${userId}\`, { signal });
|
|
88
|
-
if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
|
|
89
|
-
return response.json();
|
|
90
|
-
},
|
|
91
|
-
{ concurrency: 4 }
|
|
92
|
-
);
|
|
93
|
-
`})}),`
|
|
94
|
-
`,(0,c.jsxs)(t.p,{children:[`Не более четырёх задач будут находиться в работе одновременно. Значение по умолчанию — `,(0,c.jsx)(t.code,{children:`4`}),`. Если элементов меньше, workers создаются только по числу элементов.`]}),`
|
|
95
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`concurrency`}),` обязан быть целым числом не меньше `,(0,c.jsx)(t.code,{children:`1`}),`:`]}),`
|
|
96
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Значение`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`4`})}),(0,c.jsx)(t.td,{children:`Работает`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`1`})}),(0,c.jsx)(t.td,{children:`Последовательное выполнение`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`0`}),`, `,(0,c.jsx)(t.code,{children:`-1`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`RangeError`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`1.5`}),`, `,(0,c.jsx)(t.code,{children:`NaN`})]}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`TypeError`})})]})]})]}),`
|
|
97
|
-
`,(0,c.jsx)(t.h3,{id:`ошибки-отдельных-элементов`,children:`Ошибки отдельных элементов`}),`
|
|
98
|
-
`,(0,c.jsxs)(t.p,{children:[`Runner не бросает ошибки отдельных задач. Он помещает их в `,(0,c.jsx)(t.code,{children:`result.errors`}),` и продолжает обработку:`]}),`
|
|
99
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runConcurrentTasks(inputs, task);
|
|
100
|
-
|
|
101
|
-
if (result.errors.length > 0) {
|
|
102
|
-
for (const failure of result.errors) {
|
|
103
|
-
console.error(failure.index, failure.input, failure.error);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
`})}),`
|
|
107
|
-
`,(0,c.jsxs)(t.p,{children:[`Исключение самой функции возможно при невалидном `,(0,c.jsx)(t.code,{children:`concurrency`}),` или если callback `,(0,c.jsx)(t.code,{children:`onProgress`}),`/`,(0,c.jsx)(t.code,{children:`onItemSuccess`}),`/`,(0,c.jsx)(t.code,{children:`onItemError`}),` сам бросил ошибку. Callbacks должны быть безопасными и быстрыми.`]}),`
|
|
108
|
-
`,(0,c.jsx)(t.h3,{id:`progress`,children:`Progress`}),`
|
|
109
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await runConcurrentTasks(files, uploadFile, {
|
|
110
|
-
concurrency: 3,
|
|
111
|
-
onProgress(progress) {
|
|
112
|
-
setProgress(progress.percentage);
|
|
113
|
-
},
|
|
114
|
-
onItemSuccess(item) {
|
|
115
|
-
console.log("Загружен", item.input.name);
|
|
116
|
-
},
|
|
117
|
-
onItemError(item) {
|
|
118
|
-
console.error("Ошибка", item.input.name, item.error);
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
`})}),`
|
|
122
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`onProgress`}),` вызывается после каждой завершённой задачи. В первом вызове процент уже больше нуля; отдельного начального события `,(0,c.jsx)(t.code,{children:`0%`}),` нет.`]}),`
|
|
123
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ConcurrentTaskProgress<TInput, TResult> = {
|
|
124
|
-
total: number;
|
|
125
|
-
completed: number;
|
|
126
|
-
succeeded: number;
|
|
127
|
-
failed: number;
|
|
128
|
-
running: number;
|
|
129
|
-
pending: number;
|
|
130
|
-
percentage: number;
|
|
131
|
-
aborted: boolean;
|
|
132
|
-
lastSettled?: ConcurrentTaskSettled<TInput, TResult>;
|
|
133
|
-
};
|
|
134
|
-
`})}),`
|
|
135
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`percentage`}),` округляется через `,(0,c.jsx)(t.code,{children:`Math.round`}),`.`]}),`
|
|
136
|
-
`,(0,c.jsx)(t.h3,{id:`abort`,children:`Abort`}),`
|
|
137
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const controller = new AbortController();
|
|
138
|
-
|
|
139
|
-
const promise = runConcurrentTasks(urls, async (url, { signal }) => {
|
|
140
|
-
const response = await fetch(url, { signal });
|
|
141
|
-
return response.text();
|
|
142
|
-
}, {
|
|
143
|
-
concurrency: 2,
|
|
144
|
-
signal: controller.signal
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
controller.abort();
|
|
148
|
-
const result = await promise;
|
|
149
|
-
`})}),`
|
|
150
|
-
`,(0,c.jsxs)(t.p,{children:[`После abort новые задачи не стартуют. Уже начатая операция прервётся только если сама использует переданный `,(0,c.jsx)(t.code,{children:`signal`}),`. Runner ждёт завершения начатых tasks и возвращает:`]}),`
|
|
151
|
-
`,(0,c.jsxs)(t.ul,{children:[`
|
|
152
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`aborted: true`}),`;`]}),`
|
|
153
|
-
`,(0,c.jsxs)(t.li,{children:[`обработанные элементы в `,(0,c.jsx)(t.code,{children:`settled`}),`;`]}),`
|
|
154
|
-
`,(0,c.jsxs)(t.li,{children:[`не начатые элементы в `,(0,c.jsx)(t.code,{children:`unprocessed`}),`.`]}),`
|
|
155
|
-
`]}),`
|
|
156
|
-
`,(0,c.jsxs)(t.p,{children:[`Abort не является ошибкой runner-а и сам по себе не приводит к `,(0,c.jsx)(t.code,{children:`throw`}),`.`]}),`
|
|
157
|
-
`,(0,c.jsx)(t.h3,{id:`порядок-результата`,children:`Порядок результата`}),`
|
|
158
|
-
`,(0,c.jsxs)(t.p,{children:[`Tasks могут завершаться в любом порядке, callbacks идут в порядке фактического завершения. Итоговые `,(0,c.jsx)(t.code,{children:`settled`}),`, `,(0,c.jsx)(t.code,{children:`successes`}),`, `,(0,c.jsx)(t.code,{children:`errors`}),` и `,(0,c.jsx)(t.code,{children:`unprocessed`}),` собираются по исходным индексам, поэтому результат детерминирован относительно input.`]}),`
|
|
159
|
-
`,(0,c.jsx)(t.h2,{id:`concurrencypartialerror`,children:(0,c.jsx)(t.code,{children:`ConcurrencyPartialError`})}),`
|
|
160
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`runConcurrentTasks`}),` сам не создаёт этот error. Класс нужен, если слой приложения хочет преобразовать частичный результат в исключение:`]}),`
|
|
161
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const result = await runConcurrentTasks(inputs, task);
|
|
162
|
-
|
|
163
|
-
if (result.errors.length > 0 || result.aborted) {
|
|
164
|
-
throw new ConcurrencyPartialError("Batch выполнен частично", result);
|
|
165
|
-
}
|
|
166
|
-
`})}),`
|
|
167
|
-
`,(0,c.jsxs)(t.p,{children:[`Не путайте его с `,(0,c.jsx)(t.code,{children:`AsyncTasksError`}),`: первый создаёт consumer по своей policy, второй автоматически бросает `,(0,c.jsx)(t.code,{children:`runAsyncTasks`}),`.`]}),`
|
|
168
|
-
`,(0,c.jsx)(t.h2,{id:`практические-рекомендации`,children:`Практические рекомендации`}),`
|
|
169
|
-
`,(0,c.jsxs)(t.ul,{children:[`
|
|
170
|
-
`,(0,c.jsx)(t.li,{children:`Не ставьте слишком большой concurrency: browser, proxy и backend имеют свои лимиты.`}),`
|
|
171
|
-
`,(0,c.jsx)(t.li,{children:`Для write-операций продумайте идемпотентность: retry может повторить уже выполненное действие.`}),`
|
|
172
|
-
`,(0,c.jsx)(t.li,{children:`Не меняйте input objects внутри task, если те же значения использует UI.`}),`
|
|
173
|
-
`,(0,c.jsxs)(t.li,{children:[`Обрабатывайте `,(0,c.jsx)(t.code,{children:`unknown`}),` error через безопасный normalizer.`]}),`
|
|
174
|
-
`,(0,c.jsx)(t.li,{children:`Не используйте runner вместо TanStack Query cache для одного и того же resource.`}),`
|
|
175
|
-
`,(0,c.jsx)(t.li,{children:`Если задача зависит от результата предыдущей, это не независимый batch: выполните зависимые шаги последовательно.`}),`
|
|
176
|
-
`]}),`
|
|
177
|
-
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
178
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Группа`}),(0,c.jsx)(t.th,{children:`Exports`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`All-at-once`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`runAsyncTasks`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTasksError`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTask`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTaskSuccess`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTaskFailure`}),`, `,(0,c.jsx)(t.code,{children:`AsyncTaskSettled`}),`, `,(0,c.jsx)(t.code,{children:`RunAsyncTasksResult`}),`, `,(0,c.jsx)(t.code,{children:`RunAsyncTasksOptions`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Bounded concurrency`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`runConcurrentTasks`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrencyPartialError`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskContext`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskFn`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskSuccess`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskError`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskSettled`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskUnprocessed`}),`, `,(0,c.jsx)(t.code,{children:`ConcurrentTaskProgress`}),`, `,(0,c.jsx)(t.code,{children:`RunConcurrentTasksOptions`}),`, `,(0,c.jsx)(t.code,{children:`RunConcurrentTasksResult`})]})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/SAP/Transport Requests`}),`
|
|
2
|
-
`,(0,c.jsxs)(t.h1,{id:`sap-transport-requests-через-ryuzaki13react-foundation-apitransport`,children:[`SAP transport requests через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/transport`})]}),`
|
|
3
|
-
`,(0,c.jsx)(t.p,{children:`Модуль получает transport requests текущего пользователя из SAP UI2 OData endpoints и нормализует workbench/customizing records.`}),`
|
|
4
|
-
`,(0,c.jsxs)(t.blockquote,{children:[`
|
|
5
|
-
`,(0,c.jsxs)(t.p,{children:[`Здесь слово `,(0,c.jsx)(t.code,{children:`transport`}),` означает SAP transport request. Это не generic HTTP transport. Для обычного HTTP используйте `,(0,c.jsx)(t.a,{href:`../http/README.mdx`,children:(0,c.jsx)(t.code,{children:`/http`})}),`, для SAP/OData transport infrastructure — `,(0,c.jsx)(t.a,{href:`../odata/README.mdx`,children:(0,c.jsx)(t.code,{children:`/odata`})}),`.`]}),`
|
|
6
|
-
`]}),`
|
|
7
|
-
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
8
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
9
|
-
fetchCustomizingTransportRequests,
|
|
10
|
-
fetchTransportRequests,
|
|
11
|
-
fetchUserTransportRequests,
|
|
12
|
-
fetchWorkbenchTransportRequests,
|
|
13
|
-
getTransportRequestKey,
|
|
14
|
-
normalizeTransportRequests,
|
|
15
|
-
transportRequestKeys
|
|
16
|
-
} from "@ryuzaki13/react-foundation-api/transport";
|
|
17
|
-
|
|
18
|
-
import type {
|
|
19
|
-
TransportRequest,
|
|
20
|
-
TransportRequestRaw,
|
|
21
|
-
TransportRequestScope,
|
|
22
|
-
TransportRequestType,
|
|
23
|
-
UserTransportRequests
|
|
24
|
-
} from "@ryuzaki13/react-foundation-api/transport";
|
|
25
|
-
`})}),`
|
|
26
|
-
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
27
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const requests = await fetchTransportRequests("workbench");
|
|
28
|
-
|
|
29
|
-
for (const request of requests) {
|
|
30
|
-
console.log(request.id, request.text);
|
|
31
|
-
}
|
|
32
|
-
`})}),`
|
|
33
|
-
`,(0,c.jsx)(t.p,{children:`Scopes:`}),`
|
|
34
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type TransportRequestType = "workbench" | "customizing";
|
|
35
|
-
type TransportRequestScope = TransportRequestType | "all";
|
|
36
|
-
`})}),`
|
|
37
|
-
`,(0,c.jsxs)(t.p,{children:[`Без аргумента загружается только `,(0,c.jsx)(t.code,{children:`workbench`}),`.`]}),`
|
|
38
|
-
`,(0,c.jsx)(t.h2,{id:`fetch-functions`,children:`Fetch functions`}),`
|
|
39
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Функция`}),(0,c.jsx)(t.th,{children:`Endpoint`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fetchWorkbenchTransportRequests`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`/TRANSPORT/WorkbenchRequests`})}),(0,c.jsx)(t.td,{children:`workbench array`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fetchCustomizingTransportRequests`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`/TRANSPORT/CustomizingRequests`})}),(0,c.jsx)(t.td,{children:`customizing array`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fetchUserTransportRequests`})}),(0,c.jsx)(t.td,{children:`Оба endpoint параллельно`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`{ workbench, customizing, all }`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fetchTransportRequests(scope)`})}),(0,c.jsx)(t.td,{children:`Endpoint по scope`}),(0,c.jsx)(t.td,{children:`единый array`})]})]})]}),`
|
|
40
|
-
`,(0,c.jsxs)(t.p,{children:[`Используется base URL `,(0,c.jsx)(t.code,{children:`odataUi2`}),`: в dev/preview он направлен через настроенный DP0/UI2 proxy, в production — `,(0,c.jsx)(t.code,{children:`/sap/opu/odata/UI2`}),`.`]}),`
|
|
41
|
-
`,(0,c.jsx)(t.p,{children:`Запросы наследуют policy OData transport:`}),`
|
|
42
|
-
`,(0,c.jsxs)(t.ul,{children:[`
|
|
43
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`credentials: include`}),`;`]}),`
|
|
44
|
-
`,(0,c.jsx)(t.li,{children:`SAP language/client headers;`}),`
|
|
45
|
-
`,(0,c.jsx)(t.li,{children:`SSO detection/recovery;`}),`
|
|
46
|
-
`,(0,c.jsx)(t.li,{children:`OData V2 envelope parsing;`}),`
|
|
47
|
-
`,(0,c.jsx)(t.li,{children:`HTTP error handling.`}),`
|
|
48
|
-
`]}),`
|
|
49
|
-
`,(0,c.jsxs)(t.p,{children:[`Если один из двух запросов `,(0,c.jsx)(t.code,{children:`fetchUserTransportRequests`}),` завершился ошибкой, `,(0,c.jsx)(t.code,{children:`Promise.all`}),` отклоняется и частичный object не возвращается.`]}),`
|
|
50
|
-
`,(0,c.jsx)(t.h2,{id:`результат`,children:`Результат`}),`
|
|
51
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface TransportRequest {
|
|
52
|
-
id: string;
|
|
53
|
-
type: "workbench" | "customizing";
|
|
54
|
-
text: string;
|
|
55
|
-
isDefaultRequest: boolean;
|
|
56
|
-
}
|
|
57
|
-
`})}),`
|
|
58
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`all`}),` формируется как workbench records, затем customizing records:`]}),`
|
|
59
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface UserTransportRequests {
|
|
60
|
-
workbench: TransportRequest[];
|
|
61
|
-
customizing: TransportRequest[];
|
|
62
|
-
all: TransportRequest[];
|
|
63
|
-
}
|
|
64
|
-
`})}),`
|
|
65
|
-
`,(0,c.jsx)(t.h2,{id:`normalizetransportrequests`,children:(0,c.jsx)(t.code,{children:`normalizeTransportRequests`})}),`
|
|
66
|
-
`,(0,c.jsx)(t.p,{children:`Функция полезна отдельно для тестов или custom transport:`}),`
|
|
67
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const normalized = normalizeTransportRequests(
|
|
68
|
-
[
|
|
69
|
-
{ id: " DEVK900001 ", description: " Исправление ", isDefaultRequest: true },
|
|
70
|
-
{ id: "", description: "Без номера" },
|
|
71
|
-
{ id: "DEVK900001", description: "Дубликат" }
|
|
72
|
-
],
|
|
73
|
-
"workbench"
|
|
74
|
-
);
|
|
75
|
-
`})}),`
|
|
76
|
-
`,(0,c.jsxs)(t.p,{children:[`Результат содержит одну запись `,(0,c.jsx)(t.code,{children:`DEVK900001`}),`.`]}),`
|
|
77
|
-
`,(0,c.jsx)(t.p,{children:`Алгоритм:`}),`
|
|
78
|
-
`,(0,c.jsxs)(t.ol,{children:[`
|
|
79
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`id`}),` нормализуется как text с trim.`]}),`
|
|
80
|
-
`,(0,c.jsxs)(t.li,{children:[`Запись без непустого `,(0,c.jsx)(t.code,{children:`id`}),` удаляется.`]}),`
|
|
81
|
-
`,(0,c.jsxs)(t.li,{children:[`Дубликаты `,(0,c.jsx)(t.code,{children:`id`}),` внутри одного input удаляются, сохраняется первый.`]}),`
|
|
82
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`description`}),` нормализуется с trim; отсутствие превращается в пустую строку.`]}),`
|
|
83
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`type`}),` берётся из второго аргумента для всех records.`]}),`
|
|
84
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`isDefaultRequest`}),` равен `,(0,c.jsx)(t.code,{children:`true`}),` только при входном значении `,(0,c.jsx)(t.code,{children:`true`}),`.`]}),`
|
|
85
|
-
`,(0,c.jsx)(t.li,{children:`Порядок первых уникальных records сохраняется.`}),`
|
|
86
|
-
`]}),`
|
|
87
|
-
`,(0,c.jsx)(t.p,{children:`Нормализация не изменяет исходный array/objects.`}),`
|
|
88
|
-
`,(0,c.jsx)(t.h2,{id:`query-keys`,children:`Query keys`}),`
|
|
89
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`transportRequestKeys.all;
|
|
90
|
-
// ["transportRequests"]
|
|
91
|
-
|
|
92
|
-
transportRequestKeys.list();
|
|
93
|
-
// ["transportRequests", "workbench"]
|
|
94
|
-
|
|
95
|
-
transportRequestKeys.list("all");
|
|
96
|
-
// ["transportRequests", "all"]
|
|
97
|
-
`})}),`
|
|
98
|
-
`,(0,c.jsx)(t.p,{children:`Пример с TanStack Query:`}),`
|
|
99
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const scope: TransportRequestScope = "all";
|
|
100
|
-
|
|
101
|
-
const query = useQuery({
|
|
102
|
-
queryKey: transportRequestKeys.list(scope),
|
|
103
|
-
queryFn: () => fetchTransportRequests(scope)
|
|
104
|
-
});
|
|
105
|
-
`})}),`
|
|
106
|
-
`,(0,c.jsx)(t.p,{children:`Factory ключей не создаёт query options и не передаёт AbortSignal; lifecycle запроса настраивает consumer.`}),`
|
|
107
|
-
`,(0,c.jsx)(t.h2,{id:`stable-key-отдельной-записи`,children:`Stable key отдельной записи`}),`
|
|
108
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`getTransportRequestKey({ type: "workbench", id: "DEVK900001" });
|
|
109
|
-
// "workbench:DEVK900001"
|
|
110
|
-
`})}),`
|
|
111
|
-
`,(0,c.jsxs)(t.p,{children:[`Включение `,(0,c.jsx)(t.code,{children:`type`}),` предотвращает collision одинаковых ID из разных списков. Функция не escaping-ит `,(0,c.jsx)(t.code,{children:`:`}),`; SAP transport ID обычно не содержит этот символ.`]}),`
|
|
112
|
-
`,(0,c.jsxs)(t.h2,{id:`отличие-от-adt`,children:[`Отличие от `,(0,c.jsx)(t.code,{children:`/adt`})]}),`
|
|
113
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Свойство`}),(0,c.jsx)(t.th,{children:(0,c.jsx)(t.code,{children:`/transport`})}),(0,c.jsx)(t.th,{children:(0,c.jsx)(t.code,{children:`/adt`})})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Backend`}),(0,c.jsx)(t.td,{children:`SAP UI2 OData`}),(0,c.jsx)(t.td,{children:`SAP ADT CTS`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Формат`}),(0,c.jsx)(t.td,{children:`JSON/OData envelope`}),(0,c.jsx)(t.td,{children:`XML`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Категории`}),(0,c.jsx)(t.td,{children:`workbench/customizing`}),(0,c.jsx)(t.td,{children:`Общие ADT headers`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Parser`}),(0,c.jsx)(t.td,{children:`OData transport`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`fast-xml-parser`})})]})]})]}),`
|
|
114
|
-
`,(0,c.jsx)(t.p,{children:`Не объединяйте records автоматически: контракты endpoint и значения полей различаются.`}),`
|
|
115
|
-
`,(0,c.jsx)(t.h2,{id:`ошибки-и-ограничения`,children:`Ошибки и ограничения`}),`
|
|
116
|
-
`,(0,c.jsxs)(t.ul,{children:[`
|
|
117
|
-
`,(0,c.jsx)(t.li,{children:`Модуль только читает requests; он не создаёт, не освобождает и не импортирует transport.`}),`
|
|
118
|
-
`,(0,c.jsx)(t.li,{children:`Authorization определяется SAP backend.`}),`
|
|
119
|
-
`,(0,c.jsxs)(t.li,{children:[`Пустой/falsy payload endpoint превращается в `,(0,c.jsx)(t.code,{children:`[]`}),`; HTTP/SSO errors пробрасываются.`]}),`
|
|
120
|
-
`,(0,c.jsx)(t.li,{children:`Нет автоматической TanStack Query cache policy — используйте экспортированные keys.`}),`
|
|
121
|
-
`,(0,c.jsx)(t.li,{children:`Runtime требует настроенного SAP proxy/base URLs и cookies.`}),`
|
|
122
|
-
`]}),`
|
|
123
|
-
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
124
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Группа`}),(0,c.jsx)(t.th,{children:`Exports`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Fetch`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`fetchWorkbenchTransportRequests`}),`, `,(0,c.jsx)(t.code,{children:`fetchCustomizingTransportRequests`}),`, `,(0,c.jsx)(t.code,{children:`fetchUserTransportRequests`}),`, `,(0,c.jsx)(t.code,{children:`fetchTransportRequests`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Normalize/key`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeTransportRequests`}),`, `,(0,c.jsx)(t.code,{children:`transportRequestKeys`}),`, `,(0,c.jsx)(t.code,{children:`getTransportRequestKey`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Types`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`TransportRequestType`}),`, `,(0,c.jsx)(t.code,{children:`TransportRequestScope`}),`, `,(0,c.jsx)(t.code,{children:`TransportRequest`}),`, `,(0,c.jsx)(t.code,{children:`TransportRequestRaw`}),`, `,(0,c.jsx)(t.code,{children:`UserTransportRequests`})]})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-FSp_AjJa.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B5YBxaaS.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/Adapters/Server Function`}),`
|
|
2
|
-
`,(0,c.jsxs)(t.h1,{id:`server-function-adapters-через-ryuzaki13react-foundation-apiserver-fn`,children:[`Server-function adapters через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/server-fn`})]}),`
|
|
3
|
-
`,(0,c.jsxs)(t.p,{children:[`Модуль адаптирует функцию с публичной формой `,(0,c.jsx)(t.code,{children:`serverFn({ data })`}),` к query/mutation operation из `,(0,c.jsx)(t.a,{href:`../resource/README.mdx`,children:(0,c.jsx)(t.code,{children:`/resource`})}),`. Сам пакет не импортирует TanStack Start и не запускает сервер.`]}),`
|
|
4
|
-
`,(0,c.jsx)(t.h2,{id:`модель`,children:`Модель`}),`
|
|
5
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`scope + args/input
|
|
6
|
-
│ buildData
|
|
7
|
-
▼
|
|
8
|
-
{ data }
|
|
9
|
-
│ serverFn или custom executor
|
|
10
|
-
▼
|
|
11
|
-
response
|
|
12
|
-
│ optional transform
|
|
13
|
-
▼
|
|
14
|
-
resource operation result
|
|
15
|
-
`})}),`
|
|
16
|
-
`,(0,c.jsx)(t.p,{children:`Подходит любая async-функция такого контракта:`}),`
|
|
17
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ServerFnTransport<TData, TResponse> = (
|
|
18
|
-
request: { data: TData }
|
|
19
|
-
) => Promise<TResponse>;
|
|
20
|
-
`})}),`
|
|
21
|
-
`,(0,c.jsxs)(t.p,{children:[`Название `,(0,c.jsx)(t.code,{children:`server-fn`}),` описывает типичный источник функции. Оно не гарантирует server-only выполнение и не создаёт security boundary.`]}),`
|
|
22
|
-
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
23
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
24
|
-
createServerFnMutationOperation,
|
|
25
|
-
createServerFnQueryOperation
|
|
26
|
-
} from "@ryuzaki13/react-foundation-api/server-fn";
|
|
27
|
-
|
|
28
|
-
import type {
|
|
29
|
-
ServerFnTransport,
|
|
30
|
-
ServerFnTransportExecutor,
|
|
31
|
-
ServerFnTransportExecutorContext,
|
|
32
|
-
ServerFnTransportRequest
|
|
33
|
-
} from "@ryuzaki13/react-foundation-api/server-fn";
|
|
34
|
-
`})}),`
|
|
35
|
-
`,(0,c.jsxs)(t.p,{children:[`Нужен `,(0,c.jsx)(t.code,{children:`@tanstack/react-query`}),`; созданные operations обычно подключаются через `,(0,c.jsx)(t.code,{children:`/resource`}),` или `,(0,c.jsx)(t.code,{children:`/persisted`}),` descriptor.`]}),`
|
|
36
|
-
`,(0,c.jsx)(t.h2,{id:`query-operation`,children:`Query operation`}),`
|
|
37
|
-
`,(0,c.jsx)(t.p,{children:`Предположим, сгенерированная framework-функция принимает:`}),`
|
|
38
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type LoadOrdersData = {
|
|
39
|
-
companyId: string;
|
|
40
|
-
search: string;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
declare const loadOrdersServerFn: ServerFnTransport<
|
|
44
|
-
LoadOrdersData,
|
|
45
|
-
{ items: OrderDto[] }
|
|
46
|
-
>;
|
|
47
|
-
`})}),`
|
|
48
|
-
`,(0,c.jsx)(t.p,{children:`Adapter:`}),`
|
|
49
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const searchOrdersOperation = createServerFnQueryOperation({
|
|
50
|
-
serverFn: loadOrdersServerFn,
|
|
51
|
-
buildData: (companyId: string, args: { search: string }) => ({
|
|
52
|
-
companyId,
|
|
53
|
-
search: args.search
|
|
54
|
-
}),
|
|
55
|
-
transform: (response) => response.items.map(mapOrderDto),
|
|
56
|
-
staleTime: 60_000,
|
|
57
|
-
gcTime: 5 * 60_000,
|
|
58
|
-
isEnabled: (companyId, args) => Boolean(companyId && args.search.trim())
|
|
59
|
-
});
|
|
60
|
-
`})}),`
|
|
61
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildData`}),` получает валидный scope и query args. `,(0,c.jsx)(t.code,{children:`transform`}),` получает response и `,(0,c.jsx)(t.code,{children:`{ scope, args }`}),`; без transform result равен response.`]}),`
|
|
62
|
-
`,(0,c.jsxs)(t.p,{children:[`Созданный объект соответствует `,(0,c.jsx)(t.code,{children:`ResourceQueryOperation`}),`:`]}),`
|
|
63
|
-
`,(0,c.jsxs)(t.ul,{children:[`
|
|
64
|
-
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`execute({ scope, args, client, signal })`}),`;`]}),`
|
|
65
|
-
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`isEnabled`}),`;`]}),`
|
|
66
|
-
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`staleTime`}),`;`]}),`
|
|
67
|
-
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`gcTime`}),`.`]}),`
|
|
68
|
-
`]}),`
|
|
69
|
-
`,(0,c.jsx)(t.h2,{id:`mutation-operation`,children:`Mutation operation`}),`
|
|
70
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`declare const saveOrderServerFn: ServerFnTransport<
|
|
71
|
-
{ companyId: string; order: SaveOrderDto },
|
|
72
|
-
{ order: OrderDto }
|
|
73
|
-
>;
|
|
74
|
-
|
|
75
|
-
const saveOrderOperation = createServerFnMutationOperation({
|
|
76
|
-
serverFn: saveOrderServerFn,
|
|
77
|
-
buildData: (companyId: string, input: SaveOrderInput) => ({
|
|
78
|
-
companyId,
|
|
79
|
-
order: mapSaveOrder(input)
|
|
80
|
-
}),
|
|
81
|
-
transform: (response) => mapOrderDto(response.order),
|
|
82
|
-
cacheStrategy: createInvalidateResourceScopeCacheStrategy()
|
|
83
|
-
});
|
|
84
|
-
`})}),`
|
|
85
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`transform`}),` получает `,(0,c.jsx)(t.code,{children:`{ scope, input }`}),`. `,(0,c.jsx)(t.code,{children:`cacheStrategy`}),` прикрепляется к operation и выполняется владельцем resource mutation после успешного ответа.`]}),`
|
|
86
|
-
`,(0,c.jsxs)(t.p,{children:[`Mutation operation не имеет `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` в generic resource contract. Custom executor получает `,(0,c.jsx)(t.code,{children:`{ client }`}),` без signal.`]}),`
|
|
87
|
-
`,(0,c.jsx)(t.h2,{id:`подключение-к-resource-descriptor`,children:`Подключение к resource descriptor`}),`
|
|
88
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const ordersResource = createResourceDescriptor({
|
|
89
|
-
namespace: "sales",
|
|
90
|
-
resource: "orders",
|
|
91
|
-
operations: {
|
|
92
|
-
queries: { search: searchOrdersOperation },
|
|
93
|
-
mutations: { save: saveOrderOperation }
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
const query = useResourceQuery(
|
|
98
|
-
ordersResource,
|
|
99
|
-
"search",
|
|
100
|
-
companyId,
|
|
101
|
-
{ search }
|
|
102
|
-
);
|
|
103
|
-
`})}),`
|
|
104
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`server-fn`}),` не экспортирует resource hooks повторно. Импортируйте их из `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/resource`}),`.`]}),`
|
|
105
|
-
`,(0,c.jsx)(t.h2,{id:`custom-executor`,children:`Custom executor`}),`
|
|
106
|
-
`,(0,c.jsx)(t.p,{children:`По умолчанию adapter вызывает только:`}),`
|
|
107
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`serverFn({ data })
|
|
108
|
-
`})}),`
|
|
109
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`QueryClient`}),` и `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` не передаются внутрь `,(0,c.jsx)(t.code,{children:`serverFn`}),`. Если transport/framework умеет использовать дополнительный context, задайте executor:`]}),`
|
|
110
|
-
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const executor: ServerFnTransportExecutor<Input, Output> = async (
|
|
111
|
-
serverFn,
|
|
112
|
-
request,
|
|
113
|
-
{ signal }
|
|
114
|
-
) => {
|
|
115
|
-
if (signal?.aborted) throw signal.reason;
|
|
116
|
-
return serverFn(request);
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const operation = createServerFnQueryOperation({
|
|
120
|
-
serverFn,
|
|
121
|
-
buildData,
|
|
122
|
-
executor
|
|
123
|
-
});
|
|
124
|
-
`})}),`
|
|
125
|
-
`,(0,c.jsxs)(t.p,{children:[`Executor получает саму функцию, нормализованный request `,(0,c.jsx)(t.code,{children:`{ data }`}),` и `,(0,c.jsx)(t.code,{children:`{ client, signal? }`}),`. Он полезен для tracing, тестов и framework adapter-а. Не используйте его для бизнес-логики конкретной entity.`]}),`
|
|
126
|
-
`,(0,c.jsx)(t.h2,{id:`типичные-ошибки`,children:`Типичные ошибки`}),`
|
|
127
|
-
`,(0,c.jsx)(t.h3,{id:`передавать-args-напрямую`,children:`Передавать args напрямую`}),`
|
|
128
|
-
`,(0,c.jsxs)(t.p,{children:[`Неверно предполагать, что query args автоматически становятся data. Их явно преобразует `,(0,c.jsx)(t.code,{children:`buildData`}),`, потому что scope/args и transport DTO — разные контракты.`]}),`
|
|
129
|
-
`,(0,c.jsx)(t.h3,{id:`ожидать-автоматическую-отмену`,children:`Ожидать автоматическую отмену`}),`
|
|
130
|
-
`,(0,c.jsxs)(t.p,{children:[`Default executor не передаёт signal в функцию, поскольку её публичный contract содержит только `,(0,c.jsx)(t.code,{children:`{ data }`}),`. Отмена TanStack Query остановит дальнейшее использование результата на уровне query, но transport должен поддерживать abort отдельно.`]}),`
|
|
131
|
-
`,(0,c.jsx)(t.h3,{id:`считать-функцию-доверенной`,children:`Считать функцию доверенной`}),`
|
|
132
|
-
`,(0,c.jsx)(t.p,{children:`Если функция вызывается из browser bundle, её input контролирует пользователь. Backend обязан повторно проверить authentication, authorization и payload schema.`}),`
|
|
133
|
-
`,(0,c.jsx)(t.h3,{id:`использовать-без-descriptor-а`,children:`Использовать без descriptor-а`}),`
|
|
134
|
-
`,(0,c.jsxs)(t.p,{children:[`Factory возвращает operation, а не готовый React hook. Подключите её к resource/persisted descriptor или вызовите `,(0,c.jsx)(t.code,{children:`execute`}),` через корректный orchestration layer.`]}),`
|
|
135
|
-
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
136
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createServerFnQueryOperation`})}),(0,c.jsx)(t.td,{children:`Создаёт read operation, optional transform/lifetime/isEnabled`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createServerFnMutationOperation`})}),(0,c.jsx)(t.td,{children:`Создаёт write operation, optional transform/cache strategy`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransport`})}),(0,c.jsxs)(t.td,{children:[`Контракт функции `,(0,c.jsx)(t.code,{children:`(request) => Promise`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransportRequest`})}),(0,c.jsxs)(t.td,{children:[`Обёртка `,(0,c.jsx)(t.code,{children:`{ data }`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransportExecutor`})}),(0,c.jsx)(t.td,{children:`Контракт custom execution`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransportExecutorContext`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`QueryClient`}),` и optional signal`]})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|