@ryuzaki13/react-foundation-ui 1.8.10 → 1.8.12

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 (288) hide show
  1. package/dist/advanced-search/index.js +1 -1
  2. package/dist/chunks/{defaultRenderers-Dbhg2hHc.js → defaultRenderers-u_Vep6Pj.js} +2 -2
  3. package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -0
  4. package/dist/chunks/{multi-select-CHZhWoq6.js → multi-select-DtmRtX6v.js} +2 -2
  5. package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -0
  6. package/dist/chunks/select-MN6zDPKM.js.map +1 -1
  7. package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
  8. package/dist/multi-select/index.js +1 -1
  9. package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
  10. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
  11. package/dist/multi-select/ui/MultiSelect.d.ts +2 -2
  12. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  13. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  14. package/dist/multi-select/ui/defaultRenderers.d.ts +2 -2
  15. package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
  16. package/dist/select/model/useODataSelect.d.ts +1 -1
  17. package/dist/select/model/useODataSelect.d.ts.map +1 -1
  18. package/dist/select/model/useODataSelectBase.d.ts +1 -1
  19. package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
  20. package/dist/tree-select/index.js +1 -1
  21. package/dist/tree-select/index.js.map +1 -1
  22. package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
  23. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  24. package/package.json +3 -3
  25. package/storybook-static/assets/{Badge-BqQpQw_L.js → Badge-CveIo2LZ.js} +1 -1
  26. package/storybook-static/assets/{Badge.stories-BLEc3pho.js → Badge.stories-Bd8M64xJ.js} +1 -1
  27. package/storybook-static/assets/{BadgeList-DfMo6yit.js → BadgeList-xT41a0VL.js} +1 -1
  28. package/storybook-static/assets/{Button-D1w_se49.js → Button-C5bBSb3k.js} +1 -1
  29. package/storybook-static/assets/{Button-D6MwkfU8.js → Button-DkDgfpHL.js} +1 -1
  30. package/storybook-static/assets/{Button.stories-DsEGxbz-.js → Button.stories-CeKPeGK5.js} +1 -1
  31. package/storybook-static/assets/{CalendarView-FWwbhHMn.js → CalendarView-CEqcrblx.js} +1 -1
  32. package/storybook-static/assets/{CheckBox-BIeKlLsQ.js → CheckBox-DKeFkdOt.js} +1 -1
  33. package/storybook-static/assets/{CheckBox-krtKLFK6.js → CheckBox-OVvAarW-.js} +1 -1
  34. package/storybook-static/assets/{CheckBox.stories-gV23d8F9.js → CheckBox.stories-CfZ0p1yo.js} +1 -1
  35. package/storybook-static/assets/{Color-6AOWCN3U-DF3lA8Cg.js → Color-6AOWCN3U-BWW7zrfs.js} +1 -1
  36. package/storybook-static/assets/{ContextMenu-Jid_pp7z.js → ContextMenu-kia7is1N.js} +1 -1
  37. package/storybook-static/assets/{ContextMenu-CvOaSUdS.js → ContextMenu-xn2GtiLR.js} +1 -1
  38. package/storybook-static/assets/{ContextMenu.stories-BMRQo225.js → ContextMenu.stories-CYuy9uXF.js} +1 -1
  39. package/storybook-static/assets/{CustomOptionButton-B_3l2oEp.js → CustomOptionButton-C4w-APws.js} +1 -1
  40. package/storybook-static/assets/DateInput-BiUFIihm.js +1 -0
  41. package/storybook-static/assets/{DateInput-Dmfu-QPI.js → DateInput-DAzE5mCE.js} +1 -1
  42. package/storybook-static/assets/{DateInput.stories-BcZKAAUH.js → DateInput.stories-BcowGCRD.js} +1 -1
  43. package/storybook-static/assets/{DateRangePresetSelect-Dpjei_qk.js → DateRangePresetSelect-CQm4dNLR.js} +1 -1
  44. package/storybook-static/assets/{DateRangePresetSelect-C4QK2uI5.js → DateRangePresetSelect-RIyqNBk9.js} +1 -1
  45. package/storybook-static/assets/{DateRangePresetSelect.stories-HuFMQCzg.js → DateRangePresetSelect.stories-ypGyuGfy.js} +1 -1
  46. package/storybook-static/assets/{Detail-mSGrPHPd.js → Detail-CEypL2Nh.js} +1 -1
  47. package/storybook-static/assets/{Detail.stories-CNmeyajk.js → Detail.stories-DNkT7B-u.js} +1 -1
  48. package/storybook-static/assets/{Dialog-CNPtztC5.js → Dialog-BVFFQJDH.js} +1 -1
  49. package/storybook-static/assets/{Dialog-C4lB95kT.js → Dialog-DD0grLG3.js} +1 -1
  50. package/storybook-static/assets/{Dialog.stories-DGC2CdmD.js → Dialog.stories-DSCypHqR.js} +1 -1
  51. package/storybook-static/assets/{Disclosure-Bg9Uurzq.js → Disclosure-DauUgrev.js} +1 -1
  52. package/storybook-static/assets/{Disclosure.stories-52zq3d3b.js → Disclosure.stories-B1qB8vQZ.js} +1 -1
  53. package/storybook-static/assets/{DisclosureGroup-htBmjuHs.js → DisclosureGroup-D9oCCeHf.js} +1 -1
  54. package/storybook-static/assets/{DocsRenderer-JROSPFPF-CfCr8YB1.js → DocsRenderer-JROSPFPF-CmSf6tXp.js} +1 -1
  55. package/storybook-static/assets/{DropZone-DHl97f8Y.js → DropZone-D42ueN1w.js} +1 -1
  56. package/storybook-static/assets/{DropZone-BsjXindv.js → DropZone-D8hbPCAv.js} +1 -1
  57. package/storybook-static/assets/{DropZone.stories-UxmcssH9.js → DropZone.stories-DO-T_Bh4.js} +1 -1
  58. package/storybook-static/assets/{DropdownMenu-Bq4Z7eyk.js → DropdownMenu-CknJDoji.js} +1 -1
  59. package/storybook-static/assets/{ExpandableActionPanel-Buvm-uo_.js → ExpandableActionPanel-Dqi_bo3c.js} +1 -1
  60. package/storybook-static/assets/{ExpandableActionPanel.stories-DHjq73og.js → ExpandableActionPanel.stories-BD9QZGZN.js} +1 -1
  61. package/storybook-static/assets/{Flex-B9W01d7p.js → Flex-CaVn1IOP.js} +1 -1
  62. package/storybook-static/assets/{Flex.stories-Y8vGrgl5.js → Flex.stories-Bp9Y6q6b.js} +1 -1
  63. package/storybook-static/assets/{FloatingPopover-C06XhNb8.js → FloatingPopover-U7tx-Jlw.js} +1 -1
  64. package/storybook-static/assets/{FormattedTableCell-DnBQJjql.js → FormattedTableCell-pmmhsAbN.js} +1 -1
  65. package/storybook-static/assets/{Grid-BNsdOQE3.js → Grid-CEpMNurH.js} +1 -1
  66. package/storybook-static/assets/{Grid.stories-hwxpk_k9.js → Grid.stories-BM-gO5DN.js} +1 -1
  67. package/storybook-static/assets/{ImageCropper.stories-L6AaNzcC.js → ImageCropper.stories-BWz5XU6U.js} +1 -1
  68. package/storybook-static/assets/{ImageRenderer-DA4vCb7C.js → ImageRenderer-BTYZEX5t.js} +1 -1
  69. package/storybook-static/assets/{ImageRenderer.stories-eWJHpmcc.js → ImageRenderer.stories-Dz2STM95.js} +1 -1
  70. package/storybook-static/assets/{ImageView.stories-CDZmePLC.js → ImageView.stories-DBVe0an3.js} +1 -1
  71. package/storybook-static/assets/{ImageViewer.stories-c1s8XOKG.js → ImageViewer.stories-C4Px97lD.js} +2 -2
  72. package/storybook-static/assets/{ImageViewerRuntime-CB58FU7X.js → ImageViewerRuntime-TJtlJVfa.js} +1 -1
  73. package/storybook-static/assets/{Input-k78uABnO.js → Input-CIPgijvW.js} +1 -1
  74. package/storybook-static/assets/{Input-CPh1-5MN.js → Input-D8io9jVS.js} +1 -1
  75. package/storybook-static/assets/{Input.stories-Bjo-quWE.js → Input.stories-SUk3aYaC.js} +1 -1
  76. package/storybook-static/assets/{InputDateTime-D6wx8NHg.js → InputDateTime-DA5pIDuE.js} +1 -1
  77. package/storybook-static/assets/{InputDateTime.stories-DKYu3IHZ.js → InputDateTime.stories-DeudzDSU.js} +1 -1
  78. package/storybook-static/assets/{InputFile-B_d9cuuZ.js → InputFile-C5mp5Y5I.js} +1 -1
  79. package/storybook-static/assets/{InputFile-jyLYajsV.js → InputFile-CGAC7ruP.js} +1 -1
  80. package/storybook-static/assets/{InputFile.stories-BdefvDig.js → InputFile.stories-Cx1xQ6PE.js} +1 -1
  81. package/storybook-static/assets/{InputFiles-Bk5cxV_q.js → InputFiles-B7OBcPJN.js} +1 -1
  82. package/storybook-static/assets/{InputFiles-8NO4ybbw.js → InputFiles-Hzl89Ghf.js} +1 -1
  83. package/storybook-static/assets/{InputFiles.stories-ByWo1zY4.js → InputFiles.stories-CG6QjDZH.js} +1 -1
  84. package/storybook-static/assets/{InputFilesList-D4SB2px7.js → InputFilesList-B6htWHF1.js} +1 -1
  85. package/storybook-static/assets/{InputImage-Zoi-dxR0.js → InputImage-BTa4S4Wp.js} +1 -1
  86. package/storybook-static/assets/{InputImage-DehD0dUv.js → InputImage-CQnoblAE.js} +1 -1
  87. package/storybook-static/assets/{InputImage.stories-Bm6vjE22.js → InputImage.stories-CEI44Eyz.js} +1 -1
  88. package/storybook-static/assets/{InteractiveComponents-B1kglKoK.js → InteractiveComponents-B0ypWz1x.js} +1 -1
  89. package/storybook-static/assets/{InteractiveComponents.stories-HmO6jYBZ.js → InteractiveComponents.stories-BadApta9.js} +1 -1
  90. package/storybook-static/assets/{LayoutPicker-BdaZMF1N.js → LayoutPicker-COB9GlV_.js} +1 -1
  91. package/storybook-static/assets/{LayoutPicker-C__JzlAL.js → LayoutPicker-C_Uz7Tnj.js} +1 -1
  92. package/storybook-static/assets/{LayoutPicker.stories-Q1MsCb_7.js → LayoutPicker.stories-Btp0IcaL.js} +1 -1
  93. package/storybook-static/assets/{Listbox-_2Lhh6GE.js → Listbox-AAaZGSAl.js} +1 -1
  94. package/storybook-static/assets/{Listbox-HDTB2yAv.js → Listbox-CyfuZw7w.js} +1 -1
  95. package/storybook-static/assets/{Listbox.stories-C5uX1wxr.js → Listbox.stories-NDKQmjyQ.js} +1 -1
  96. package/storybook-static/assets/{Modal-Blv9Namu.js → Modal-BJDnJ4zv.js} +1 -1
  97. package/storybook-static/assets/{Modal.stories-Bh5G9FLw.js → Modal.stories-D_X5lTLO.js} +1 -1
  98. package/storybook-static/assets/{ModalManagerProvider-DedM4XGI.js → ModalManagerProvider-ShDjozpW.js} +1 -1
  99. package/storybook-static/assets/{MultiSelect-B_2TcTLI.js → MultiSelect-B5CElQ3-.js} +1 -1
  100. package/storybook-static/assets/{MultiSelect-C9a9z0VK.js → MultiSelect-DqXfrjcH.js} +1 -1
  101. package/storybook-static/assets/{MultiSelect.stories-D5Ly4DPj.js → MultiSelect.stories-fB3mcFmx.js} +1 -1
  102. package/storybook-static/assets/{NoData-CD8_tH4f.js → NoData-DDb0G7T8.js} +1 -1
  103. package/storybook-static/assets/{NotificationsHost-MW4gDQQK.js → NotificationsHost-CIGL-pKX.js} +1 -1
  104. package/storybook-static/assets/NotificationsHost.stories-B_MRb3fs.js +29 -0
  105. package/storybook-static/assets/{ODataMultiSelect-DjVOp5BB.js → ODataMultiSelect-DQAitH4N.js} +1 -1
  106. package/storybook-static/assets/{ODataMultiSelect.stories-Cpxe83Z0.js → ODataMultiSelect.stories-DwW221S9.js} +2 -2
  107. package/storybook-static/assets/{ODataSelect-C_2GMQva.js → ODataSelect-tiZhOIhE.js} +1 -1
  108. package/storybook-static/assets/{ODataSelect.stories-C6Wo7X-M.js → ODataSelect.stories-BhaatPjK.js} +2 -2
  109. package/storybook-static/assets/{ODataTreeMultiSelect-1PxW1yEH.js → ODataTreeMultiSelect-B9WqJ-Un.js} +1 -1
  110. package/storybook-static/assets/{ODataTreeMultiSelect.stories-AetogHrA.js → ODataTreeMultiSelect.stories-CAfKuhfU.js} +1 -1
  111. package/storybook-static/assets/{ODataTreeSelect-vPvVKIRZ.js → ODataTreeSelect-Cel1phxZ.js} +1 -1
  112. package/storybook-static/assets/{ODataTreeSelect.stories-Cvyu6C2q.js → ODataTreeSelect.stories-BpBCpBA9.js} +1 -1
  113. package/storybook-static/assets/{OneStepScroller-BtSUY6R7.js → OneStepScroller-BSeGbz02.js} +1 -1
  114. package/storybook-static/assets/{Option-D5HVST0Y.js → Option-BBtQ3GdK.js} +1 -1
  115. package/storybook-static/assets/{OptionButton-DMZn3qex.js → OptionButton-B9nZuqqW.js} +1 -1
  116. package/storybook-static/assets/{PeriodSelect-ccgbEHCS.js → PeriodSelect-BGvhR3to.js} +1 -1
  117. package/storybook-static/assets/{PeriodSelect-BirdSdPT.js → PeriodSelect-DA_zjcdA.js} +1 -1
  118. package/storybook-static/assets/{PeriodSelect.stories-LnR8MJQQ.js → PeriodSelect.stories-DDP1eXyM.js} +1 -1
  119. package/storybook-static/assets/{PickerTriggerActions-DEXowtVB.js → PickerTriggerActions-BgvzqRBd.js} +1 -1
  120. package/storybook-static/assets/{Popover-CfT-5TUj.js → Popover-BQql18MF.js} +1 -1
  121. package/storybook-static/assets/{Popover-B9Pbbd8S.js → Popover-C0NebUMz.js} +1 -1
  122. package/storybook-static/assets/{Popover.stories-DkIh7SkO.js → Popover.stories-CIyDUtlz.js} +1 -1
  123. package/storybook-static/assets/{PresetRangeDateInput-BshHlO-z.js → PresetRangeDateInput-BsgzPwCV.js} +1 -1
  124. package/storybook-static/assets/{PresetRangeDateInput-rHxPNjnG.js → PresetRangeDateInput-htbxc3ni.js} +1 -1
  125. package/storybook-static/assets/{PresetRangeDateInput.stories-BToClw-C.js → PresetRangeDateInput.stories-ClHM5Kah.js} +1 -1
  126. package/storybook-static/assets/{PresetSelect-BND50bCx.js → PresetSelect-Dcx0BOTx.js} +1 -1
  127. package/storybook-static/assets/README--LCKbep-.js +110 -0
  128. package/storybook-static/assets/{README-Du53oOl4.js → README-5M8ajrJp.js} +1 -1
  129. package/storybook-static/assets/README-5NhzH8VL.js +95 -0
  130. package/storybook-static/assets/README-Am6Fa6-b.js +69 -0
  131. package/storybook-static/assets/README-B3bFglqG.js +82 -0
  132. package/storybook-static/assets/README-B45Cwj2a.js +95 -0
  133. package/storybook-static/assets/README-B6Nq7NCU.js +416 -0
  134. package/storybook-static/assets/{README-s-T48I9S.js → README-B6ltJiw3.js} +1 -1
  135. package/storybook-static/assets/{README-DUA1kfLE.js → README-BB_JPejH.js} +1 -1
  136. package/storybook-static/assets/README-BIq-FXcN.js +2124 -0
  137. package/storybook-static/assets/README-BSh5XUR9.js +110 -0
  138. package/storybook-static/assets/README-BXJneZAJ.js +147 -0
  139. package/storybook-static/assets/README-BYSgTTZt.js +296 -0
  140. package/storybook-static/assets/{README-BRNFl9WV.js → README-BmhhWWEk.js} +1 -1
  141. package/storybook-static/assets/README-Bqnqu1bC.js +118 -0
  142. package/storybook-static/assets/README-BuMMG4_N.js +192 -0
  143. package/storybook-static/assets/README-BxjYCoYA.js +186 -0
  144. package/storybook-static/assets/{README-BsxKAG_a.js → README-ByALXSEH.js} +1 -1
  145. package/storybook-static/assets/README-Byo6DxIF.js +101 -0
  146. package/storybook-static/assets/README-C3UcjOGB.js +208 -0
  147. package/storybook-static/assets/README-C6BOdXNV.js +322 -0
  148. package/storybook-static/assets/README-C8E1O7DQ.js +230 -0
  149. package/storybook-static/assets/README-C9eh0JLs.js +64 -0
  150. package/storybook-static/assets/README-CAGQnLsv.js +90 -0
  151. package/storybook-static/assets/README-CC00hlZK.js +527 -0
  152. package/storybook-static/assets/README-CH_6ZIO2.js +64 -0
  153. package/storybook-static/assets/README-CHbo4O3Z.js +75 -0
  154. package/storybook-static/assets/{README-Y0nGf_0E.js → README-CIGfHKKE.js} +1 -1
  155. package/storybook-static/assets/{README-B7XIrdXq.js → README-CM-7E-Jf.js} +1 -1
  156. package/storybook-static/assets/{README-8Lm1JpdJ.js → README-CNHemCS2.js} +1 -1
  157. package/storybook-static/assets/{README-fxPT-NzI.js → README-CWfPiPIB.js} +1 -1
  158. package/storybook-static/assets/{README-Dw1C16bT.js → README-CeK4kfFO.js} +1 -1
  159. package/storybook-static/assets/README-Cj2e6HrF.js +178 -0
  160. package/storybook-static/assets/README-CsoHGRve.js +1844 -0
  161. package/storybook-static/assets/README-D9OypaFB.js +208 -0
  162. package/storybook-static/assets/{README-zAGDQqES.js → README-DDBqoI-T.js} +1 -1
  163. package/storybook-static/assets/README-DE2wk9-v.js +1282 -0
  164. package/storybook-static/assets/README-DEj2wSK0.js +264 -0
  165. package/storybook-static/assets/{README-DJlxGqOL.js → README-DIbfpC-2.js} +1 -1
  166. package/storybook-static/assets/{README-D5VR4x0m.js → README-DJHVgrpj.js} +1 -1
  167. package/storybook-static/assets/README-DN9HKtp_.js +124 -0
  168. package/storybook-static/assets/README-DNricOkt.js +136 -0
  169. package/storybook-static/assets/README-DV4fCpqN.js +1146 -0
  170. package/storybook-static/assets/{README-BMmR1B7a.js → README-DjCArsA5.js} +1 -1
  171. package/storybook-static/assets/README-Dl92E69Z.js +1704 -0
  172. package/storybook-static/assets/README-DnA-4W65.js +226 -0
  173. package/storybook-static/assets/README-DoCA4JXf.js +273 -0
  174. package/storybook-static/assets/{README-DUxV9GhP.js → README-DvAlDsh9.js} +1 -1
  175. package/storybook-static/assets/README-Ss-3t1nX.js +158 -0
  176. package/storybook-static/assets/README-eHCINzP3.js +154 -0
  177. package/storybook-static/assets/README-qHKxXU95.js +98 -0
  178. package/storybook-static/assets/README-tm9QH9cF.js +103 -0
  179. package/storybook-static/assets/README-ui-uanyg.js +672 -0
  180. package/storybook-static/assets/{RadioButton-BKvo6LIi.js → RadioButton-CWtjclwT.js} +1 -1
  181. package/storybook-static/assets/{RadioButton-D8KuponB.js → RadioButton-YIQXt0wx.js} +1 -1
  182. package/storybook-static/assets/{RadioButton.stories-BabeLrwX.js → RadioButton.stories-Ah-CBpeC.js} +1 -1
  183. package/storybook-static/assets/{RadioGroup-CsWjbEp2.js → RadioGroup-BnO-GL7A.js} +1 -1
  184. package/storybook-static/assets/{RadioGroup-jl5PxZpJ.js → RadioGroup-CUS0etBD.js} +1 -1
  185. package/storybook-static/assets/{RadioGroup.stories-BGoWy9-B.js → RadioGroup.stories-DGwCawtU.js} +1 -1
  186. package/storybook-static/assets/{Scrollable-CmPEHdW8.js → Scrollable-D85fA6pO.js} +1 -1
  187. package/storybook-static/assets/{Select-DiN4WVRM.js → Select-CGCxJjL9.js} +1 -1
  188. package/storybook-static/assets/{Select-BGM16rM6.js → Select-gRnfvfGh.js} +1 -1
  189. package/storybook-static/assets/{Select.stories-BEO6vXD_.js → Select.stories-CMwt4F9i.js} +1 -1
  190. package/storybook-static/assets/{SerializableSelect-B0DuNSqT.js → SerializableSelect-BLXfKJ38.js} +1 -1
  191. package/storybook-static/assets/{SerializableSelect.stories-DcI6UQCk.js → SerializableSelect.stories-Bca1a9ZU.js} +1 -1
  192. package/storybook-static/assets/{SingleDateTimeInput-C_Itd_An.js → SingleDateTimeInput-CyeQN0Rd.js} +1 -1
  193. package/storybook-static/assets/{SingleDateTimeInput-CwYhFl03.js → SingleDateTimeInput-xrmZckzw.js} +1 -1
  194. package/storybook-static/assets/SingleDateTimeInput.stories-BYFTQM9z.js +48 -0
  195. package/storybook-static/assets/{Slider-DCEQ39ar.js → Slider-1yJ3uVeR.js} +1 -1
  196. package/storybook-static/assets/{Slider-r4NefX-L.js → Slider-D8GtXVGI.js} +1 -1
  197. package/storybook-static/assets/{Slider.stories-B3M87sif.js → Slider.stories-CyQ3ns_C.js} +1 -1
  198. package/storybook-static/assets/{SliderInput-BmLucI1O.js → SliderInput-BOzHhEUA.js} +1 -1
  199. package/storybook-static/assets/{SliderInput-2ThnJzQ4.js → SliderInput-ISSx9vH_.js} +1 -1
  200. package/storybook-static/assets/{SliderInput.stories-B64rkErN.js → SliderInput.stories-7ooTghrS.js} +1 -1
  201. package/storybook-static/assets/{Sortable-Bx0rDd7W.js → Sortable-CCLiMmfZ.js} +1 -1
  202. package/storybook-static/assets/{Sortable.stories-BizbKIHw.js → Sortable.stories-B36szI6t.js} +1 -1
  203. package/storybook-static/assets/{Splitter-DGCB2owx.js → Splitter-DQGhgRwx.js} +1 -1
  204. package/storybook-static/assets/{Splitter.stories-8Oh14fbm.js → Splitter.stories-Hsq1wYaq.js} +1 -1
  205. package/storybook-static/assets/{StateSelect-Dw0Qm14-.js → StateSelect-C6hldFgO.js} +1 -1
  206. package/storybook-static/assets/{StateSelect-BSQUSTgI.js → StateSelect-DieNn4VC.js} +1 -1
  207. package/storybook-static/assets/{StateSelect.stories-C8WPRJNx.js → StateSelect.stories-CvAhDMix.js} +1 -1
  208. package/storybook-static/assets/{StringToggle.stories-K9u9rdE8.js → StringToggle.stories-CUT1tvt-.js} +1 -1
  209. package/storybook-static/assets/{Switch-BBuNsdNx.js → Switch-CX9p_uYU.js} +1 -1
  210. package/storybook-static/assets/{Switch-CtpvrECR.js → Switch-nEMRtcWe.js} +1 -1
  211. package/storybook-static/assets/{Switch.stories-Bcr4zA7L.js → Switch.stories-CPsHa2_m.js} +1 -1
  212. package/storybook-static/assets/{Table-iYeIie6s.js → Table-BhtITVtj.js} +1 -1
  213. package/storybook-static/assets/{Table.stories-BESdXqZx.js → Table.stories-nWNhSydG.js} +2 -2
  214. package/storybook-static/assets/{Tabs-aqWeCgs4.js → Tabs-DMQFh2BJ.js} +1 -1
  215. package/storybook-static/assets/{Tabs.stories-BSnrKg5G.js → Tabs.stories-D23_xvom.js} +1 -1
  216. package/storybook-static/assets/{TabsBox-CvRq3QA7.js → TabsBox-B5BsD_j_.js} +1 -1
  217. package/storybook-static/assets/{TagInput-CfKrOpJJ.js → TagInput-DO17z100.js} +1 -1
  218. package/storybook-static/assets/{TagInput.stories-CvXZl_qX.js → TagInput.stories-CMMFnIzb.js} +1 -1
  219. package/storybook-static/assets/{Text-_hP7L82D.js → Text-ClnbDqRk.js} +1 -1
  220. package/storybook-static/assets/{Textarea-Ujw8jml9.js → Textarea-C2IO_zsP.js} +1 -1
  221. package/storybook-static/assets/{Textarea-C6X20K4X.js → Textarea-DkhohiNc.js} +1 -1
  222. package/storybook-static/assets/{Textarea.stories-Bi4BQMxQ.js → Textarea.stories-NL6Aq8Vc.js} +1 -1
  223. package/storybook-static/assets/{TimePanel-B3eqkZj8.js → TimePanel-DNEPDlSW.js} +1 -1
  224. package/storybook-static/assets/{TimePanel.stories-BHXkDSMy.js → TimePanel.stories-DlfdPsz1.js} +1 -1
  225. package/storybook-static/assets/{Toggle-DS-Q4jwI.js → Toggle-3U5CceQN.js} +1 -1
  226. package/storybook-static/assets/{Toggle-6sjykxYk.js → Toggle-Cc6Ca-HI.js} +1 -1
  227. package/storybook-static/assets/{Toggle.stories-BhM1so-Z.js → Toggle.stories-BR-hVLDp.js} +1 -1
  228. package/storybook-static/assets/{TreeMultiSelect-D2lWYAa2.js → TreeMultiSelect-B0oBc-4y.js} +1 -1
  229. package/storybook-static/assets/{TreeMultiSelect-BudM77CT.js → TreeMultiSelect-D9hMQN2O.js} +1 -1
  230. package/storybook-static/assets/{TreeMultiSelect.stories-Bhh1zaAQ.js → TreeMultiSelect.stories-CslpbvPR.js} +1 -1
  231. package/storybook-static/assets/{TreePickerBase-CJfbJ6Ap.js → TreePickerBase-B_dMCe45.js} +1 -1
  232. package/storybook-static/assets/{TreeSelect-BFD6AKMu.js → TreeSelect-2lj0Q8gm.js} +1 -1
  233. package/storybook-static/assets/{TreeSelect-B7SG9PV7.js → TreeSelect-DEKNYF2b.js} +1 -1
  234. package/storybook-static/assets/{TreeSelect.stories-C-bHnrPH.js → TreeSelect.stories-CVDxn8Vm.js} +1 -1
  235. package/storybook-static/assets/{TreeTable-D-z37qlF.js → TreeTable-CBIpzYRL.js} +1 -1
  236. package/storybook-static/assets/{TreeTable.stories-CF_mH9Zz.js → TreeTable.stories-BMzrr2Kc.js} +2 -2
  237. package/storybook-static/assets/{blocks-Ddv0ZNIG.js → blocks-B5YBxaaS.js} +3 -3
  238. package/storybook-static/assets/{check-CgNbDbzr.js → check-BjtdCRaW.js} +1 -1
  239. package/storybook-static/assets/{chevron-down-0EnY_Ds_.js → chevron-down-B4u-y8Z1.js} +1 -1
  240. package/storybook-static/assets/{chevron-left-D5M5fFYk.js → chevron-left-BQfWs7Ah.js} +1 -1
  241. package/storybook-static/assets/{chevron-right-Uz5Iy_m-.js → chevron-right-ChokKd-f.js} +1 -1
  242. package/storybook-static/assets/{chunk-W22LQPXL-THpLoWLV.js → chunk-W22LQPXL-meOkhzk4.js} +1 -1
  243. package/storybook-static/assets/{circle-alert-B6Z--uoZ.js → circle-alert-B1AnDRf_.js} +1 -1
  244. package/storybook-static/assets/{circle-check-DMzkBUqN.js → circle-check-JYnlcC1F.js} +1 -1
  245. package/storybook-static/assets/{components-BmKs7c49.js → components-C_wl1sL5.js} +3 -3
  246. package/storybook-static/assets/{contextMenu-Dct-XhfD.js → contextMenu-B-TUGs_1.js} +1 -1
  247. package/storybook-static/assets/{defaultRenderers-BHXboKuy.js → defaultRenderers-DfmnIuod.js} +1 -1
  248. package/storybook-static/assets/{download-wey0TOZ0.js → download-eR3X8I-h.js} +1 -1
  249. package/storybook-static/assets/{floating-ui.react-COVT_I6r.js → floating-ui.react-D95VPQ0b.js} +1 -1
  250. package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
  251. package/storybook-static/assets/foundationApi-QhHXpYLB.js +59 -0
  252. package/storybook-static/assets/foundationLib-CEAjnstw.js +30 -0
  253. package/storybook-static/assets/{hooks-Baxp-XYz.js → hooks-awde7r2r.js} +1 -1
  254. package/storybook-static/assets/iframe-DzQq_POR.js +1 -0
  255. package/storybook-static/assets/{iframe-BOu-P2xF.js → iframe-FSp_AjJa.js} +4 -4
  256. package/storybook-static/assets/{info-gF0pk8a1.js → info-12vmb1sT.js} +1 -1
  257. package/storybook-static/assets/odata-C0Kpvttz.js +1 -0
  258. package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
  259. package/storybook-static/assets/{odataStoryFixtures-BUio-7WG.js → odataStoryFixtures-BXZnk_C7.js} +1 -1
  260. package/storybook-static/assets/{react-CN73PS7L.js → react-BlCqWuXr.js} +1 -1
  261. package/storybook-static/assets/{refresh-cw-BZ2qxodL.js → refresh-cw-Bf5ufPte.js} +1 -1
  262. package/storybook-static/assets/{settings-2-B33BG8wi.js → settings-2-DR-dTXIC.js} +1 -1
  263. package/storybook-static/assets/{sortable-CmC4atFR.js → sortable-B5e5yb_-.js} +1 -1
  264. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-Di0K55k7.js → syntaxhighlighter-QEQV7K2Y-EVJARTec.js} +1 -1
  265. package/storybook-static/assets/{trash-2-TnhWnKGO.js → trash-2-QP7TS18H.js} +1 -1
  266. package/storybook-static/assets/{triangle-alert-hZRwHRWu.js → triangle-alert-qw19mxHr.js} +1 -1
  267. package/storybook-static/assets/{useODataSelectBase-bTXYj3rC.js → useODataSelectBase-Csu_Cct9.js} +1 -1
  268. package/storybook-static/assets/useODataTreeData-BAv-Twqf.js +1 -0
  269. package/storybook-static/assets/{usePickerQuery-BMGBq6pi.js → usePickerQuery-Da-XM_Y0.js} +1 -1
  270. package/storybook-static/assets/{usePickerTriggerController-CB_TIrYx.js → usePickerTriggerController-C0TdC2Pz.js} +1 -1
  271. package/storybook-static/assets/{x-D86ykZGt.js → x-aCjYTirW.js} +1 -1
  272. package/storybook-static/iframe.html +2 -2
  273. package/storybook-static/index.json +1 -1
  274. package/storybook-static/project.json +1 -1
  275. package/dist/chunks/defaultRenderers-Dbhg2hHc.js.map +0 -1
  276. package/dist/chunks/multi-select-CHZhWoq6.js.map +0 -1
  277. package/storybook-static/assets/DateInput-DSwx7eI6.js +0 -1
  278. package/storybook-static/assets/NotificationsHost.stories-BZJG9Nvq.js +0 -29
  279. package/storybook-static/assets/SingleDateTimeInput.stories-kdKdW6al.js +0 -48
  280. package/storybook-static/assets/async-D1NpMm55.js +0 -625
  281. package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
  282. package/storybook-static/assets/foundationLib-CRTVZVS8.js +0 -25
  283. package/storybook-static/assets/iframe-CDj936Ul.js +0 -1
  284. package/storybook-static/assets/odata-D9Wmxqmj.js +0 -1
  285. package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
  286. package/storybook-static/assets/odataFetchFn-DfJwHTw8.js +0 -763
  287. package/storybook-static/assets/persisted-4qmfJLE0.js +0 -600
  288. package/storybook-static/assets/useODataTreeData-ZcX73Wdh.js +0 -1
@@ -0,0 +1,264 @@
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`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,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 Lib/Infrastructure/PWA`}),`
2
+ `,(0,c.jsx)(t.h1,{id:`pwa`,children:`PWA`}),`
3
+ `,(0,c.jsx)(t.p,{children:`Модуль PWA состоит из двух публичных входов с разной ответственностью:`}),`
4
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Import path`}),(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:`@ryuzaki13/react-foundation-lib/pwa`})}),(0,c.jsx)(t.td,{children:`React-hook обновления Service Worker и все функции cache policy`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/pwa/sw-cache-policy`})}),(0,c.jsxs)(t.td,{children:[`Только чистый parser/builder политики `,(0,c.jsx)(t.code,{children:`x-sw-cache`}),`, без React update-flow`]})]})]})]}),`
5
+ `,(0,c.jsxs)(t.p,{children:[`Используйте точный subpath. Внутренний файл `,(0,c.jsx)(t.code,{children:`serviceWorker`}),` не является самостоятельным публичным export, даже если отдельные функции используются самим hook.`]}),`
6
+ `,(0,c.jsx)(t.h2,{id:`установка`,children:`Установка`}),`
7
+ `,(0,c.jsxs)(t.p,{children:[`Для `,(0,c.jsx)(t.code,{children:`useServiceWorkerUpdate`}),` нужен React. Cache policy не имеет React-зависимости.`]}),`
8
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib react
9
+ `})}),`
10
+ `,(0,c.jsx)(t.h2,{id:`часть-1-обновление-service-worker`,children:`Часть 1. Обновление Service Worker`}),`
11
+ `,(0,c.jsx)(t.h3,{id:`задача-hook`,children:`Задача hook`}),`
12
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { useServiceWorkerUpdate } from "@ryuzaki13/react-foundation-lib/pwa";
13
+ `})}),`
14
+ `,(0,c.jsx)(t.p,{children:`Hook:`}),`
15
+ `,(0,c.jsxs)(t.ul,{children:[`
16
+ `,(0,c.jsx)(t.li,{children:`регистрирует Service Worker в production;`}),`
17
+ `,(0,c.jsx)(t.li,{children:`проверяет обновление сразу после запуска;`}),`
18
+ `,(0,c.jsx)(t.li,{children:`затем повторяет проверку каждые 5 минут;`}),`
19
+ `,(0,c.jsx)(t.li,{children:`автоматически применяет накопившееся обновление вскоре после обычного открытия или reload;`}),`
20
+ `,(0,c.jsx)(t.li,{children:`для обновления, найденного во время активной сессии, сообщает UI о доступной версии;`}),`
21
+ `,(0,c.jsx)(t.li,{children:`очищает interval, startup timeout и подписку при размонтировании.`}),`
22
+ `]}),`
23
+ `,(0,c.jsx)(t.h3,{id:`быстрый-старт`,children:`Быстрый старт`}),`
24
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useServiceWorkerUpdate } from "@ryuzaki13/react-foundation-lib/pwa";
25
+
26
+ export function ServiceWorkerUpdateBanner() {
27
+ const { hasUpdate, applyUpdate, dismiss } = useServiceWorkerUpdate();
28
+
29
+ if (!hasUpdate) {
30
+ return null;
31
+ }
32
+
33
+ return (
34
+ <aside role="status" aria-live="polite">
35
+ <p>Доступна новая версия приложения.</p>
36
+ <button type="button" onClick={applyUpdate}>
37
+ Обновить
38
+ </button>
39
+ <button type="button" onClick={dismiss}>
40
+ Позже
41
+ </button>
42
+ </aside>
43
+ );
44
+ }
45
+ `})}),`
46
+ `,(0,c.jsx)(t.p,{children:`Разместите этот компонент один раз в корневом client shell приложения. Несколько экземпляров создадут несколько периодических проверок.`}),`
47
+ `,(0,c.jsx)(t.h3,{id:`возвращаемое-значение`,children:`Возвращаемое значение`}),`
48
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const {
49
+ hasUpdate, // boolean
50
+ applyUpdate, // () => boolean
51
+ dismiss // () => void
52
+ } = useServiceWorkerUpdate();
53
+ `})}),`
54
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`hasUpdate`}),` становится `,(0,c.jsx)(t.code,{children:`true`}),`, когда найден registration с `,(0,c.jsx)(t.code,{children:`waiting`}),` worker.`]}),`
55
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`applyUpdate()`}),`:`]}),`
56
+ `,(0,c.jsxs)(t.ol,{children:[`
57
+ `,(0,c.jsxs)(t.li,{children:[`отправляет waiting worker сообщение `,(0,c.jsx)(t.code,{children:`{ type: "SKIP_WAITING" }`}),`;`]}),`
58
+ `,(0,c.jsxs)(t.li,{children:[`запоминает reload в `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`;`]}),`
59
+ `,(0,c.jsx)(t.li,{children:`ожидает смену controller и перезагружает страницу;`}),`
60
+ `,(0,c.jsxs)(t.li,{children:[`если другой клиент уже активировал worker и `,(0,c.jsx)(t.code,{children:`waiting`}),` исчез, выполняет fallback reload.`]}),`
61
+ `]}),`
62
+ `,(0,c.jsxs)(t.p,{children:[`Возвращается `,(0,c.jsx)(t.code,{children:`true`}),`, если применение или fallback reload запущены, иначе `,(0,c.jsx)(t.code,{children:`false`}),`.`]}),`
63
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`dismiss()`}),` только скрывает текущий баннер. Он не удаляет waiting worker, не отменяет обновление и не запрещает следующей проверке снова показать баннер.`]}),`
64
+ `,(0,c.jsx)(t.h2,{id:`требования-к-service-worker-приложения`,children:`Требования к Service Worker приложения`}),`
65
+ `,(0,c.jsx)(t.p,{children:`Библиотека управляет клиентской стороной, но сам файл worker принадлежит приложению. Для полного update-flow он должен выполнять два контракта.`}),`
66
+ `,(0,c.jsxs)(t.h3,{id:`обработать-skip_waiting`,children:[`Обработать `,(0,c.jsx)(t.code,{children:`SKIP_WAITING`})]}),`
67
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`self.addEventListener("message", (event) => {
68
+ if (event.data?.type === "SKIP_WAITING") {
69
+ void self.skipWaiting();
70
+ }
71
+ });
72
+ `})}),`
73
+ `,(0,c.jsx)(t.p,{children:`Без этого нажатие «Обновить» не активирует ожидающий worker немедленно.`}),`
74
+ `,(0,c.jsx)(t.h3,{id:`сообщить-вкладкам-об-активации`,children:`Сообщить вкладкам об активации`}),`
75
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`self.addEventListener("activate", (event) => {
76
+ event.waitUntil(
77
+ (async () => {
78
+ await self.clients.claim();
79
+ const clients = await self.clients.matchAll({ type: "window" });
80
+
81
+ for (const client of clients) {
82
+ client.postMessage({ type: "SW_ACTIVATED_BY_CLIENT" });
83
+ }
84
+ })()
85
+ );
86
+ });
87
+ `})}),`
88
+ `,(0,c.jsxs)(t.p,{children:[`Это сообщение помогает синхронно перезагрузить другие открытые вкладки. Конкретная стратегия `,(0,c.jsx)(t.code,{children:`claim`}),` и рассылки должна соответствовать архитектуре worker приложения.`]}),`
89
+ `,(0,c.jsx)(t.h2,{id:`compile-time-конфигурация`,children:`Compile-time конфигурация`}),`
90
+ `,(0,c.jsx)(t.p,{children:`Потребитель обязан определить при сборке:`}),`
91
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`declare const __DEV__: boolean;
92
+ declare const __SERVICE_WORKER_SCOPE__: string;
93
+ declare const __SERVICE_WORKER_URL__: string;
94
+ declare const __SERVICE_WORKER_UPDATE_RELOAD_COUNT_KEY__: string;
95
+ declare const __SERVICE_WORKER_MAX_AUTO_UPDATE_RELOADS__: number;
96
+ `})}),`
97
+ `,(0,c.jsx)(t.p,{children:`Пример для Vite:`}),`
98
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { defineConfig } from "vite";
99
+
100
+ export default defineConfig(({ mode }) => ({
101
+ define: {
102
+ __DEV__: JSON.stringify(mode !== "production"),
103
+ __SERVICE_WORKER_SCOPE__: JSON.stringify("/app/"),
104
+ __SERVICE_WORKER_URL__: JSON.stringify("/app/sw.js"),
105
+ __SERVICE_WORKER_UPDATE_RELOAD_COUNT_KEY__: JSON.stringify("my-app:sw-update-reload-count"),
106
+ __SERVICE_WORKER_MAX_AUTO_UPDATE_RELOADS__: JSON.stringify(3)
107
+ }
108
+ }));
109
+ `})}),`
110
+ `,(0,c.jsxs)(t.p,{children:[`Значения должны быть литералами в собранном клиентском коде. Если сборщик не заменит идентификаторы, приложение получит `,(0,c.jsx)(t.code,{children:`ReferenceError`}),`.`]}),`
111
+ `,(0,c.jsx)(t.h3,{id:`для-чего-нужен-предел-auto-reload`,children:`Для чего нужен предел auto reload`}),`
112
+ `,(0,c.jsxs)(t.p,{children:[`После открытия/reload hook даёт обновлениям 30 секунд на автоматическое применение. Счётчик в sessionStorage ограничивает цепочку перезагрузок значением `,(0,c.jsx)(t.code,{children:`__SERVICE_WORKER_MAX_AUTO_UPDATE_RELOADS__`}),`.`]}),`
113
+ `,(0,c.jsx)(t.p,{children:`Это защищает от бесконечного reload-loop при проблемном деплое. После 30-секундного startup-окна счётчик очищается, а дальнейшие обновления показываются через UI.`}),`
114
+ `,(0,c.jsx)(t.h2,{id:`development-ssr-и-browser-boundary`,children:`Development, SSR и browser boundary`}),`
115
+ `,(0,c.jsxs)(t.p,{children:[`В режиме `,(0,c.jsx)(t.code,{children:`__DEV__ === true`}),` effect сразу завершается: Service Worker не регистрируется и интервал не запускается.`]}),`
116
+ `,(0,c.jsxs)(t.p,{children:[`Hook использует `,(0,c.jsx)(t.code,{children:`window`}),`, `,(0,c.jsx)(t.code,{children:`navigator`}),`, `,(0,c.jsx)(t.code,{children:`performance`}),`, `,(0,c.jsx)(t.code,{children:`sessionStorage`}),` и API Service Worker. Подключайте его только в браузерном React-дереве. Сам effect не выполняется при SSR, но compile-time константы всё равно должны быть доступны в bundle.`]}),`
117
+ `,(0,c.jsxs)(t.p,{children:[`Ошибки регистрации и проверки логируются, а наружу не выбрасываются. Отсутствие поддержки `,(0,c.jsx)(t.code,{children:`navigator.serviceWorker`}),` приводит к спокойному `,(0,c.jsx)(t.code,{children:`hasUpdate: false`}),`.`]}),`
118
+ `,(0,c.jsx)(t.h2,{id:`жизненный-цикл-обновления`,children:`Жизненный цикл обновления`}),`
119
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`mount
120
+ → register URL + scope
121
+ → проверить existing waiting worker
122
+ → вызвать registration.update()
123
+ → если update найден в первые 30 секунд после navigate/reload:
124
+ автоматически отправить SKIP_WAITING, пока не исчерпан лимит
125
+ → иначе установить hasUpdate = true
126
+ → пользователь выбирает applyUpdate или dismiss
127
+ → каждые 5 минут новая проверка
128
+ `})}),`
129
+ `,(0,c.jsxs)(t.p,{children:[`Навигация считается startup-кандидатом только для `,(0,c.jsx)(t.code,{children:`PerformanceNavigationTiming.type`}),` со значением `,(0,c.jsx)(t.code,{children:`"navigate"`}),` или `,(0,c.jsx)(t.code,{children:`"reload"`}),`.`]}),`
130
+ `,(0,c.jsx)(t.h2,{id:`часть-2-политика-sw-кэша`,children:`Часть 2. Политика SW-кэша`}),`
131
+ `,(0,c.jsx)(t.p,{children:`Эта часть описывает компактное текстовое значение, которое transport и Service Worker могут использовать как согласованный cache profile.`}),`
132
+ `,(0,c.jsx)(t.p,{children:`Для кода без React импортируйте узкий subpath:`}),`
133
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
134
+ buildSwCachePolicyValue,
135
+ normalizeSwCacheName,
136
+ parseSwCachePolicy,
137
+ resolveSwCacheCacheNameByPolicy,
138
+ type SwCachePolicyDraft
139
+ } from "@ryuzaki13/react-foundation-lib/pwa/sw-cache-policy";
140
+ `})}),`
141
+ `,(0,c.jsx)(t.h2,{id:`формат-политики`,children:`Формат политики`}),`
142
+ `,(0,c.jsx)(t.p,{children:`Поддерживаются три режима:`}),`
143
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`off
144
+ ttl=<duration>[;max=<count>][;name=<name>]
145
+ bust=<duration>[;max=<count>][;name=<name>]
146
+ `})}),`
147
+ `,(0,c.jsx)(t.p,{children:`Примеры:`}),`
148
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`off
149
+ ttl=10m
150
+ ttl=24h;max=200;name=references
151
+ bust=7d;name=metadata
152
+ ttl=forever;max=50
153
+ `})}),`
154
+ `,(0,c.jsxs)(t.p,{children:[`Опции разрешено разделять `,(0,c.jsx)(t.code,{children:`;`}),` или `,(0,c.jsx)(t.code,{children:`,`}),`. Имена ключей и режимы разбираются без учёта регистра.`]}),`
155
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ttl`}),` и `,(0,c.jsx)(t.code,{children:`bust`}),` — метки профиля. Конкретное отличие их runtime-поведения реализует Service Worker/transport потребителя; parser только возвращает разобранный `,(0,c.jsx)(t.code,{children:`mode`}),`.`]}),`
156
+ `,(0,c.jsx)(t.h2,{id:`единицы-времени`,children:`Единицы времени`}),`
157
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type SwCacheDurationUnit = "ms" | "s" | "m" | "h" | "d";
158
+ `})}),`
159
+ `,(0,c.jsxs)(t.p,{children:[`Поддерживаются положительные целые и десятичные значения, например `,(0,c.jsx)(t.code,{children:`500ms`}),`, `,(0,c.jsx)(t.code,{children:`1.5h`}),`, `,(0,c.jsx)(t.code,{children:`7d`}),`. Максимальный конечный TTL — 365 дней. Специальное значение `,(0,c.jsx)(t.code,{children:`forever`}),` превращается в `,(0,c.jsx)(t.code,{children:`Infinity`}),`.`]}),`
160
+ `,(0,c.jsx)(t.p,{children:`Ноль, отрицательное число, запись без единицы, scientific notation и срок больше 365 дней считаются неверными.`}),`
161
+ `,(0,c.jsx)(t.h2,{id:`parseswcachepolicyvalue`,children:(0,c.jsx)(t.code,{children:`parseSwCachePolicy(value)`})}),`
162
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const policy = parseSwCachePolicy("ttl=10m;max=200;name=UI Data");
163
+
164
+ // {
165
+ // mode: "ttl",
166
+ // amount: 10,
167
+ // unit: "m",
168
+ // name: "ui-data",
169
+ // maxEntries: 200,
170
+ // resolvedMaxEntries: 200,
171
+ // ttlMs: 600000,
172
+ // cacheName: "odata-ui-data-10m-max200"
173
+ // }
174
+ `})}),`
175
+ `,(0,c.jsxs)(t.p,{children:[`Пустое или полностью неверное значение возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`. Строка `,(0,c.jsx)(t.code,{children:`off`}),` возвращает `,(0,c.jsx)(t.code,{children:`{ mode: "off" }`}),`.`]}),`
176
+ `,(0,c.jsx)(t.p,{children:`Для опций поддерживаются алиасы:`}),`
177
+ `,(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.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`maxEntries`}),`, `,(0,c.jsx)(t.code,{children:`max`}),`, `,(0,c.jsx)(t.code,{children:`entries`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Имя профиля`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`cacheName`}),`, `,(0,c.jsx)(t.code,{children:`cache`}),`, `,(0,c.jsx)(t.code,{children:`name`})]})]})]})]}),`
178
+ `,(0,c.jsxs)(t.p,{children:[`Неизвестные опции игнорируются. Если одна опция повторяется, используется последнее значение из-за семантики `,(0,c.jsx)(t.code,{children:`Map`}),`.`]}),`
179
+ `,(0,c.jsx)(t.h3,{id:`maxentries`,children:(0,c.jsx)(t.code,{children:`maxEntries`})}),`
180
+ `,(0,c.jsxs)(t.p,{children:[`Допустимо положительное целое число. Значение ограничивается максимумом `,(0,c.jsx)(t.code,{children:`5000`}),`. Неверное значение не делает всю политику неверной: оно просто отбрасывается.`]}),`
181
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`resolvedMaxEntries`}),` всегда содержит фактический лимит для `,(0,c.jsx)(t.code,{children:`ttl`}),`/`,(0,c.jsx)(t.code,{children:`bust`}),`: переданный либо значение по умолчанию `,(0,c.jsx)(t.code,{children:`100`}),`.`]}),`
182
+ `,(0,c.jsxs)(t.p,{children:[`При этом cache name включает суффикс `,(0,c.jsx)(t.code,{children:`-maxN`}),` только для явно переданного валидного лимита. Дефолтные `,(0,c.jsx)(t.code,{children:`100`}),` в имени не записываются.`]}),`
183
+ `,(0,c.jsx)(t.h2,{id:`normalizeswcachenamevalue`,children:(0,c.jsx)(t.code,{children:`normalizeSwCacheName(value)`})}),`
184
+ `,(0,c.jsx)(t.p,{children:`Нормализует имя профиля:`}),`
185
+ `,(0,c.jsxs)(t.ol,{children:[`
186
+ `,(0,c.jsx)(t.li,{children:`удаляет пробелы по краям;`}),`
187
+ `,(0,c.jsx)(t.li,{children:`переводит в нижний регистр;`}),`
188
+ `,(0,c.jsxs)(t.li,{children:[`заменяет группы недопустимых символов на `,(0,c.jsx)(t.code,{children:`-`}),`;`]}),`
189
+ `,(0,c.jsx)(t.li,{children:`удаляет крайние дефисы;`}),`
190
+ `,(0,c.jsxs)(t.li,{children:[`возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, если ничего не осталось.`]}),`
191
+ `]}),`
192
+ `,(0,c.jsxs)(t.p,{children:[`Разрешены латинские буквы, цифры, `,(0,c.jsx)(t.code,{children:`_`}),` и `,(0,c.jsx)(t.code,{children:`-`}),`.`]}),`
193
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`normalizeSwCacheName(" UI Data / Main "); // "ui-data-main"
194
+ normalizeSwCacheName("---"); // undefined
195
+ `})}),`
196
+ `,(0,c.jsx)(t.h2,{id:`resolveswcachecachenamebypolicyvalue`,children:(0,c.jsx)(t.code,{children:`resolveSwCacheCacheNameByPolicy(value)`})}),`
197
+ `,(0,c.jsxs)(t.p,{children:[`Возвращает вычисленное имя cache только для валидных режимов `,(0,c.jsx)(t.code,{children:`ttl`}),` и `,(0,c.jsx)(t.code,{children:`bust`}),`.`]}),`
198
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`resolveSwCacheCacheNameByPolicy("ttl=24h;name=ref");
199
+ // "odata-ref-24h"
200
+
201
+ resolveSwCacheCacheNameByPolicy("off"); // undefined
202
+ resolveSwCacheCacheNameByPolicy("ttl=wrong"); // undefined
203
+ `})}),`
204
+ `,(0,c.jsx)(t.p,{children:`Имя — устойчивый технический профиль, но формат может быть частью cache-versioning. Не собирайте его вручную.`}),`
205
+ `,(0,c.jsx)(t.h2,{id:`buildswcachepolicyvaluedraft`,children:(0,c.jsx)(t.code,{children:`buildSwCachePolicyValue(draft)`})}),`
206
+ `,(0,c.jsx)(t.p,{children:`Собирает каноническую строку из данных формы.`}),`
207
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft: SwCachePolicyDraft = {
208
+ mode: "ttl",
209
+ amount: 10,
210
+ unit: "m",
211
+ name: "UI Data",
212
+ maxEntries: 200
213
+ };
214
+
215
+ buildSwCachePolicyValue(draft);
216
+ // "ttl=10m;max=200;name=ui-data"
217
+ `})}),`
218
+ `,(0,c.jsx)(t.p,{children:`Правила builder:`}),`
219
+ `,(0,c.jsxs)(t.ul,{children:[`
220
+ `,(0,c.jsxs)(t.li,{children:[`для `,(0,c.jsx)(t.code,{children:`off`}),` всегда возвращает `,(0,c.jsx)(t.code,{children:`"off"`}),`;`]}),`
221
+ `,(0,c.jsxs)(t.li,{children:[`неверный `,(0,c.jsx)(t.code,{children:`amount`}),` заменяет на `,(0,c.jsx)(t.code,{children:`24`}),`;`]}),`
222
+ `,(0,c.jsxs)(t.li,{children:[`отсутствующую `,(0,c.jsx)(t.code,{children:`unit`}),` заменяет на `,(0,c.jsx)(t.code,{children:`h`}),`;`]}),`
223
+ `,(0,c.jsxs)(t.li,{children:[`неверный `,(0,c.jsx)(t.code,{children:`maxEntries`}),` отбрасывает, больше `,(0,c.jsx)(t.code,{children:`5000`}),` ограничивает;`]}),`
224
+ `,(0,c.jsxs)(t.li,{children:[`имя нормализует через `,(0,c.jsx)(t.code,{children:`normalizeSwCacheName`}),`;`]}),`
225
+ `,(0,c.jsxs)(t.li,{children:[`порядок опций всегда `,(0,c.jsx)(t.code,{children:`max`}),`, затем `,(0,c.jsx)(t.code,{children:`name`}),`.`]}),`
226
+ `]}),`
227
+ `,(0,c.jsxs)(t.p,{children:[`Builder не ограничивает вычисленный срок 365 днями. Например, draft `,(0,c.jsx)(t.code,{children:`400d`}),` будет собран в строку, но parser затем вернёт `,(0,c.jsx)(t.code,{children:`undefined`}),`. Если данные приходят из свободной формы, проверьте результат повторным `,(0,c.jsx)(t.code,{children:`parseSwCachePolicy`}),` перед сохранением.`]}),`
228
+ `,(0,c.jsx)(t.h2,{id:`пример-формы-настройки`,children:`Пример формы настройки`}),`
229
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function savePolicy(draft: SwCachePolicyDraft) {
230
+ const value = buildSwCachePolicyValue(draft);
231
+ const parsed = parseSwCachePolicy(value);
232
+
233
+ if (!parsed) {
234
+ throw new Error("Не удалось собрать допустимую cache policy");
235
+ }
236
+
237
+ return value;
238
+ }
239
+ `})}),`
240
+ `,(0,c.jsx)(t.h2,{id:`безопасность-кэша`,children:`Безопасность кэша`}),`
241
+ `,(0,c.jsxs)(t.p,{children:[`Политика только описывает срок и профиль. Она не определяет, `,(0,c.jsx)(t.strong,{children:`что разрешено кэшировать`}),`.`]}),`
242
+ `,(0,c.jsx)(t.p,{children:`Service Worker приложения обязан отдельно учитывать:`}),`
243
+ `,(0,c.jsxs)(t.ul,{children:[`
244
+ `,(0,c.jsx)(t.li,{children:`пользователя, tenant и authorization context;`}),`
245
+ `,(0,c.jsx)(t.li,{children:`HTTP-метод: mutation-запросы обычно не кэшируются;`}),`
246
+ `,(0,c.jsx)(t.li,{children:`чувствительные персональные данные;`}),`
247
+ `,(0,c.jsx)(t.li,{children:`response status и content type;`}),`
248
+ `,(0,c.jsx)(t.li,{children:`очистку cache при logout;`}),`
249
+ `,(0,c.jsx)(t.li,{children:`версионирование схемы ответа.`}),`
250
+ `]}),`
251
+ `,(0,c.jsx)(t.p,{children:`Не используйте общий cache name для ответов разных пользователей, если ключ cache не содержит безопасно разделяющий контекст.`}),`
252
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
253
+ `,(0,c.jsxs)(t.h3,{id:`импорт-внутреннего-serviceworkerts`,children:[`Импорт внутреннего `,(0,c.jsx)(t.code,{children:`serviceWorker.ts`})]}),`
254
+ `,(0,c.jsxs)(t.p,{children:[`Он не объявлен в `,(0,c.jsx)(t.code,{children:`package.json#exports`}),`. Публичный update API — `,(0,c.jsx)(t.code,{children:`useServiceWorkerUpdate`}),` из `,(0,c.jsx)(t.code,{children:`/pwa`}),`.`]}),`
255
+ `,(0,c.jsxs)(t.h3,{id:`ожидать-что-dismiss-отменит-update`,children:[`Ожидать, что `,(0,c.jsx)(t.code,{children:`dismiss()`}),` отменит update`]}),`
256
+ `,(0,c.jsx)(t.p,{children:`Waiting worker остаётся установленным. Следующая проверка может снова показать UI.`}),`
257
+ `,(0,c.jsxs)(t.h3,{id:`не-обработать-skip_waiting-в-worker`,children:[`Не обработать `,(0,c.jsx)(t.code,{children:`SKIP_WAITING`}),` в worker`]}),`
258
+ `,(0,c.jsx)(t.p,{children:`Кнопка применения отправит сообщение, но worker не активируется до обычного lifecycle браузера.`}),`
259
+ `,(0,c.jsx)(t.h3,{id:`путать-ttl-parser-с-cache-implementation`,children:`Путать TTL parser с cache implementation`}),`
260
+ `,(0,c.jsx)(t.p,{children:`Функции policy не читают Cache Storage, не перехватывают fetch и не удаляют записи. Это обязанность Service Worker.`}),`
261
+ `,(0,c.jsxs)(t.h3,{id:`считать-forever-безопасным-default`,children:[`Считать `,(0,c.jsx)(t.code,{children:`forever`}),` безопасным default`]}),`
262
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ttlMs: Infinity`}),` требует явной стратегии bust/invalidation. Без неё клиент может долго видеть устаревшие данные.`]}),`
263
+ `,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
264
+ `,(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:`Публичный path`}),(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:`useServiceWorkerUpdate()`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`/pwa`})}),(0,c.jsx)(t.td,{children:`Регистрация, проверка и UI-состояние обновления SW`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`parseSwCachePolicy()`})}),(0,c.jsx)(t.td,{children:`оба`}),(0,c.jsx)(t.td,{children:`Разобрать текстовую политику`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`buildSwCachePolicyValue()`})}),(0,c.jsx)(t.td,{children:`оба`}),(0,c.jsx)(t.td,{children:`Собрать каноническую строку из draft`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeSwCacheName()`})}),(0,c.jsx)(t.td,{children:`оба`}),(0,c.jsx)(t.td,{children:`Подготовить безопасную часть cache name`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resolveSwCacheCacheNameByPolicy()`})}),(0,c.jsx)(t.td,{children:`оба`}),(0,c.jsx)(t.td,{children:`Получить имя cache из валидной политики`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ParsedSwCachePolicy`})}),(0,c.jsx)(t.td,{children:`оба`}),(0,c.jsx)(t.td,{children:`Тип разобранного результата`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SwCachePolicyDraft`})}),(0,c.jsx)(t.td,{children:`оба`}),(0,c.jsx)(t.td,{children:`Тип данных формы/builder`})]})]})]})]})}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,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-BOu-P2xF.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-Ddv0ZNIG.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,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 Lib/API/Copy`}),`
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`,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 Lib/API/Copy`}),`
2
2
  `,(0,c.jsxs)(t.h1,{id:`копирование-текста-через-ryuzaki13react-foundation-libcopy`,children:[`Копирование текста через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/copy`})]}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`copy`}),` содержит React hooks для копирования текста в системный буфер обмена, чтения текста из DOM-элемента и показа короткого состояния «скопировано».`]}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Основные сценарии:`}),`
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-BOu-P2xF.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-Ddv0ZNIG.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,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 Lib/API/Formatters/Pipeline`}),`
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`,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 Lib/API/Formatters/Pipeline`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`formatter-pipeline`,children:`Formatter pipeline`}),`
3
3
  `,(0,c.jsx)(t.p,{children:`Formatter pipeline — конфигурируемая последовательность преобразований значения ячейки. Она умеет:`}),`
4
4
  `,(0,c.jsxs)(t.ul,{children:[`
@@ -0,0 +1,124 @@
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};
@@ -0,0 +1,136 @@
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};