@ryuzaki13/react-foundation-ui 1.8.11 → 1.8.13

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 (281) hide show
  1. package/dist/chunks/defaultRenderers-u_Vep6Pj.js.map +1 -1
  2. package/dist/chunks/multi-select-DtmRtX6v.js.map +1 -1
  3. package/dist/chunks/select-MN6zDPKM.js.map +1 -1
  4. package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -1
  5. package/dist/multi-select/model/useODataMultiSelect.d.ts +1 -1
  6. package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -1
  7. package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
  8. package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
  9. package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
  10. package/dist/multi-select/ui/defaultRenderers.d.ts +1 -1
  11. package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
  12. package/dist/select/model/useODataSelect.d.ts +1 -1
  13. package/dist/select/model/useODataSelect.d.ts.map +1 -1
  14. package/dist/select/model/useODataSelectBase.d.ts +1 -1
  15. package/dist/select/model/useODataSelectBase.d.ts.map +1 -1
  16. package/dist/tree-select/index.js.map +1 -1
  17. package/dist/tree-select/model/buildODataTreeNodes.d.ts +1 -1
  18. package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -1
  19. package/package.json +3 -3
  20. package/storybook-static/assets/{Badge-BojMuOws.js → Badge-BFhBl7yM.js} +1 -1
  21. package/storybook-static/assets/{Badge.stories-C9gJRuIO.js → Badge.stories-BEu55X4s.js} +1 -1
  22. package/storybook-static/assets/{BadgeList-dNEWI7-O.js → BadgeList-mqmnGtRR.js} +1 -1
  23. package/storybook-static/assets/{Button-Bbt3JzIY.js → Button-CESdnWrO.js} +1 -1
  24. package/storybook-static/assets/{Button-CrTHXWYk.js → Button-_YPAu9sd.js} +1 -1
  25. package/storybook-static/assets/{Button.stories-BaYXOBeF.js → Button.stories-B0Y_T17B.js} +1 -1
  26. package/storybook-static/assets/{CalendarView-Dp0zus1o.js → CalendarView-DLuO2Ywz.js} +1 -1
  27. package/storybook-static/assets/{CheckBox-BiK9yWNt.js → CheckBox-CGiNmAPT.js} +1 -1
  28. package/storybook-static/assets/{CheckBox-UzYHaD6S.js → CheckBox-l0pbBm9z.js} +1 -1
  29. package/storybook-static/assets/{CheckBox.stories-C2BOiWZj.js → CheckBox.stories-ROPAnqh8.js} +1 -1
  30. package/storybook-static/assets/{Color-6AOWCN3U-C5S4wUlD.js → Color-6AOWCN3U-kPaRN0HS.js} +1 -1
  31. package/storybook-static/assets/{ContextMenu-D9EZxb7d.js → ContextMenu-Bob4DtRn.js} +1 -1
  32. package/storybook-static/assets/{ContextMenu-BWQln_tb.js → ContextMenu-DxfUAeJS.js} +1 -1
  33. package/storybook-static/assets/{ContextMenu.stories-U38zPh9_.js → ContextMenu.stories-DCJmWy5n.js} +1 -1
  34. package/storybook-static/assets/{CustomOptionButton-COIOrxQn.js → CustomOptionButton-DuEz9CXt.js} +1 -1
  35. package/storybook-static/assets/DateInput-BQ8SoeLE.js +1 -0
  36. package/storybook-static/assets/{DateInput-C-entb-r.js → DateInput-DmNLD4Dz.js} +1 -1
  37. package/storybook-static/assets/{DateInput.stories-NmUXQLDU.js → DateInput.stories-sTpYf7Ob.js} +1 -1
  38. package/storybook-static/assets/{DateRangePresetSelect-BM1L1KOo.js → DateRangePresetSelect-DRq4eJ2n.js} +1 -1
  39. package/storybook-static/assets/{DateRangePresetSelect-CAJzxaq0.js → DateRangePresetSelect-fgJfLaLO.js} +1 -1
  40. package/storybook-static/assets/{DateRangePresetSelect.stories-CC47XLnD.js → DateRangePresetSelect.stories-ib7Qh_BB.js} +1 -1
  41. package/storybook-static/assets/{Detail-CDluXtts.js → Detail-CJniLn1R.js} +1 -1
  42. package/storybook-static/assets/{Detail.stories-DjniLC4n.js → Detail.stories-BXjdNaL-.js} +1 -1
  43. package/storybook-static/assets/{Dialog-bzRSgGU7.js → Dialog-D6a_qzr3.js} +1 -1
  44. package/storybook-static/assets/{Dialog-bw6cHUsz.js → Dialog-DOYnnXlU.js} +1 -1
  45. package/storybook-static/assets/{Dialog.stories-C6Rs6s_p.js → Dialog.stories-B1cZLRK3.js} +1 -1
  46. package/storybook-static/assets/{Disclosure-DelA6FsQ.js → Disclosure-Chh5o_0s.js} +1 -1
  47. package/storybook-static/assets/{Disclosure.stories-D7yUinyb.js → Disclosure.stories-Cvdvf7V8.js} +1 -1
  48. package/storybook-static/assets/{DisclosureGroup-DbK7mU_Q.js → DisclosureGroup-CRnQOgVj.js} +1 -1
  49. package/storybook-static/assets/{DocsRenderer-JROSPFPF-v3z0zVN1.js → DocsRenderer-JROSPFPF-BBiErkeC.js} +1 -1
  50. package/storybook-static/assets/{DropZone-CI3NW4AC.js → DropZone-Bm5gqdi9.js} +1 -1
  51. package/storybook-static/assets/{DropZone-Cyy-ttEO.js → DropZone-C4L7JAlq.js} +1 -1
  52. package/storybook-static/assets/{DropZone.stories-S0HSpGTB.js → DropZone.stories-BhA9q8Qv.js} +1 -1
  53. package/storybook-static/assets/{DropdownMenu-Ct1bSZsE.js → DropdownMenu-DtZNSUHF.js} +1 -1
  54. package/storybook-static/assets/{ExpandableActionPanel-Oj3xlasj.js → ExpandableActionPanel-0ugXlJy_.js} +1 -1
  55. package/storybook-static/assets/{ExpandableActionPanel.stories-Ch7CLkpR.js → ExpandableActionPanel.stories-CLgMlA9k.js} +1 -1
  56. package/storybook-static/assets/{Flex-UiFm8Tkc.js → Flex-CJlia-8f.js} +1 -1
  57. package/storybook-static/assets/{Flex.stories-CaDiVlBD.js → Flex.stories-DCvfi1EY.js} +1 -1
  58. package/storybook-static/assets/{FloatingPopover-CTYV9W7T.js → FloatingPopover-CsnfPiwV.js} +1 -1
  59. package/storybook-static/assets/{FormattedTableCell-D-ysSR3p.js → FormattedTableCell-Dz5xWVYO.js} +1 -1
  60. package/storybook-static/assets/{Grid-CigBXPe2.js → Grid-C-KwTRAM.js} +1 -1
  61. package/storybook-static/assets/{Grid.stories-ay3z9DQZ.js → Grid.stories-CzbqknNR.js} +1 -1
  62. package/storybook-static/assets/{ImageCropper.stories-Dkce_ugb.js → ImageCropper.stories-DaE-gm-b.js} +1 -1
  63. package/storybook-static/assets/{ImageRenderer-C9_EmGBW.js → ImageRenderer-IsNCXCrZ.js} +1 -1
  64. package/storybook-static/assets/{ImageRenderer.stories-C7bXaNBI.js → ImageRenderer.stories-BbsjUEfJ.js} +1 -1
  65. package/storybook-static/assets/{ImageView.stories-D-ZzGlk8.js → ImageView.stories-DY0UITYz.js} +1 -1
  66. package/storybook-static/assets/{ImageViewer.stories-ItcRfxyy.js → ImageViewer.stories--9q9b9nv.js} +2 -2
  67. package/storybook-static/assets/{ImageViewerRuntime-eaupID36.js → ImageViewerRuntime-CNEH3XGN.js} +1 -1
  68. package/storybook-static/assets/{Input-op4j7Beh.js → Input-DLubbE7P.js} +1 -1
  69. package/storybook-static/assets/{Input-BUDNR96c.js → Input-Dw2JblYt.js} +1 -1
  70. package/storybook-static/assets/{Input.stories-DwulvJIg.js → Input.stories-DQeyDULG.js} +1 -1
  71. package/storybook-static/assets/{InputDateTime-B_cxOp6k.js → InputDateTime-BRzl8Vrt.js} +1 -1
  72. package/storybook-static/assets/{InputDateTime.stories-BueLF4HC.js → InputDateTime.stories-BJTj5v8J.js} +1 -1
  73. package/storybook-static/assets/{InputFile-DSg7sugm.js → InputFile-B8UroZji.js} +1 -1
  74. package/storybook-static/assets/{InputFile-C8z6TPc1.js → InputFile-DPftxjGw.js} +1 -1
  75. package/storybook-static/assets/{InputFile.stories-C6XSbIua.js → InputFile.stories-C7yyqHqc.js} +1 -1
  76. package/storybook-static/assets/{InputFiles-DoatLq3q.js → InputFiles-BQVXHVLy.js} +1 -1
  77. package/storybook-static/assets/{InputFiles-DeZ84Uu_.js → InputFiles-UD_9S7-N.js} +1 -1
  78. package/storybook-static/assets/{InputFiles.stories-BMbE8SJU.js → InputFiles.stories-DjjJS5pZ.js} +1 -1
  79. package/storybook-static/assets/{InputFilesList-CsfDDqaJ.js → InputFilesList-BNjijD3Y.js} +1 -1
  80. package/storybook-static/assets/{InputImage-yJSq98EH.js → InputImage-C-pHr-Sx.js} +1 -1
  81. package/storybook-static/assets/{InputImage-D_YnB2Tw.js → InputImage-DbcbqIhY.js} +1 -1
  82. package/storybook-static/assets/{InputImage.stories-nivUG307.js → InputImage.stories-D-TC9r9t.js} +1 -1
  83. package/storybook-static/assets/{InteractiveComponents-IPkC_Rkg.js → InteractiveComponents-DbhWgM9y.js} +1 -1
  84. package/storybook-static/assets/{InteractiveComponents.stories-D4VzVKZJ.js → InteractiveComponents.stories-B4mkVSea.js} +1 -1
  85. package/storybook-static/assets/{LayoutPicker-ZHkMi-LM.js → LayoutPicker-BoV_E3qt.js} +1 -1
  86. package/storybook-static/assets/{LayoutPicker-aMzPN5Do.js → LayoutPicker-w1EsRpYP.js} +1 -1
  87. package/storybook-static/assets/{LayoutPicker.stories-DAzpzxn5.js → LayoutPicker.stories--ChGnGxf.js} +1 -1
  88. package/storybook-static/assets/{Listbox-CR5nXC9J.js → Listbox-CzZRsr6a.js} +1 -1
  89. package/storybook-static/assets/{Listbox-BmfQOnrb.js → Listbox-qZdTi11b.js} +1 -1
  90. package/storybook-static/assets/{Listbox.stories-CeOpsKxB.js → Listbox.stories-C9k_1850.js} +1 -1
  91. package/storybook-static/assets/{Modal-BStp52Zo.js → Modal-DCpul8QM.js} +1 -1
  92. package/storybook-static/assets/{Modal.stories-CwGm5GYE.js → Modal.stories-Cy0Xd4LF.js} +1 -1
  93. package/storybook-static/assets/{ModalManagerProvider-B5uUXWF9.js → ModalManagerProvider-BrPVMcHV.js} +1 -1
  94. package/storybook-static/assets/{MultiSelect-308npb27.js → MultiSelect-BEQdl-F4.js} +1 -1
  95. package/storybook-static/assets/{MultiSelect-BDs02MZh.js → MultiSelect-Dy4X94E2.js} +1 -1
  96. package/storybook-static/assets/{MultiSelect.stories-DRi_iTp4.js → MultiSelect.stories-FuzejJmz.js} +1 -1
  97. package/storybook-static/assets/{NoData-ovaQEE9W.js → NoData-BsQ9EfkA.js} +1 -1
  98. package/storybook-static/assets/{NotificationsHost-BpeMWhLY.js → NotificationsHost-BSrODvw7.js} +1 -1
  99. package/storybook-static/assets/NotificationsHost.stories-DeiWspcY.js +29 -0
  100. package/storybook-static/assets/{ODataMultiSelect-qlft9L9L.js → ODataMultiSelect-BEz9gcd2.js} +1 -1
  101. package/storybook-static/assets/{ODataMultiSelect.stories-CMPIoPiy.js → ODataMultiSelect.stories-BwMgAkbE.js} +2 -2
  102. package/storybook-static/assets/{ODataSelect-DKBQArAK.js → ODataSelect-BgC7GHOv.js} +1 -1
  103. package/storybook-static/assets/{ODataSelect.stories-DxYIhtwe.js → ODataSelect.stories-DEIRAB-s.js} +2 -2
  104. package/storybook-static/assets/{ODataTreeMultiSelect-DAt6THP3.js → ODataTreeMultiSelect-WyZZuX0_.js} +1 -1
  105. package/storybook-static/assets/{ODataTreeMultiSelect.stories-CBNJP0mP.js → ODataTreeMultiSelect.stories-B6cxuagy.js} +1 -1
  106. package/storybook-static/assets/{ODataTreeSelect-Bzzt4CQC.js → ODataTreeSelect-OJGi3-S7.js} +1 -1
  107. package/storybook-static/assets/{ODataTreeSelect.stories-CWVvuqOt.js → ODataTreeSelect.stories-wGRGErCH.js} +1 -1
  108. package/storybook-static/assets/{OneStepScroller-BY5lz8qi.js → OneStepScroller-DycQ3RuL.js} +1 -1
  109. package/storybook-static/assets/{Option-Rw8xwrPg.js → Option-taxbFfjo.js} +1 -1
  110. package/storybook-static/assets/{OptionButton-Br48w_Zg.js → OptionButton-Q0QaPCII.js} +1 -1
  111. package/storybook-static/assets/{PeriodSelect-8-wpXz6w.js → PeriodSelect-DUJ2nF3F.js} +1 -1
  112. package/storybook-static/assets/{PeriodSelect-DxSRwKw-.js → PeriodSelect-DnM7x-uC.js} +1 -1
  113. package/storybook-static/assets/{PeriodSelect.stories-B-qgUzlS.js → PeriodSelect.stories-Db0bqe3J.js} +1 -1
  114. package/storybook-static/assets/{PickerTriggerActions-C5xmysFh.js → PickerTriggerActions-CGJd7xmR.js} +1 -1
  115. package/storybook-static/assets/{Popover-NJwt_vZZ.js → Popover-B6oidz5p.js} +1 -1
  116. package/storybook-static/assets/{Popover-Ds8PUigp.js → Popover-Tbhf8T81.js} +1 -1
  117. package/storybook-static/assets/{Popover.stories-CUOFA_Xf.js → Popover.stories-DE1LxZvv.js} +1 -1
  118. package/storybook-static/assets/{PresetRangeDateInput-DyOpbkON.js → PresetRangeDateInput-CQ5FfmrL.js} +1 -1
  119. package/storybook-static/assets/{PresetRangeDateInput-Xk0bOy3S.js → PresetRangeDateInput-DfgoR0My.js} +1 -1
  120. package/storybook-static/assets/{PresetRangeDateInput.stories-CwjUlXj0.js → PresetRangeDateInput.stories-CgoYAYBG.js} +1 -1
  121. package/storybook-static/assets/{PresetSelect-Ddmr0niY.js → PresetSelect-BPtAknAr.js} +1 -1
  122. package/storybook-static/assets/README--TpGcM95.js +110 -0
  123. package/storybook-static/assets/{README-MzcO5Z_P.js → README-4iBHWAP5.js} +1 -1
  124. package/storybook-static/assets/README-98KIgy5G.js +75 -0
  125. package/storybook-static/assets/README-B6II8p0W.js +154 -0
  126. package/storybook-static/assets/{README-CkWglKbS.js → README-B6vU5_7I.js} +1 -1
  127. package/storybook-static/assets/README-BFJVjjZR.js +325 -0
  128. package/storybook-static/assets/README-BIT4HlFP.js +441 -0
  129. package/storybook-static/assets/{README-DqQDgJN-.js → README-BK6Epio1.js} +1 -1
  130. package/storybook-static/assets/{README-DRnlD7y8.js → README-BRlPB5_k.js} +1 -1
  131. package/storybook-static/assets/README-BTFpEaXG.js +64 -0
  132. package/storybook-static/assets/README-BWhXgC_o.js +226 -0
  133. package/storybook-static/assets/README-BbNHvOoR.js +101 -0
  134. package/storybook-static/assets/README-BbunUo8b.js +118 -0
  135. package/storybook-static/assets/README-BmYpfZKr.js +1844 -0
  136. package/storybook-static/assets/README-Bu5uvhAT.js +230 -0
  137. package/storybook-static/assets/README-Bx6fvSBE.js +1282 -0
  138. package/storybook-static/assets/README-Bx6gIGiA.js +69 -0
  139. package/storybook-static/assets/README-ByhxsX44.js +324 -0
  140. package/storybook-static/assets/README-Byi1FFpw.js +98 -0
  141. package/storybook-static/assets/README-C3Is3a3B.js +208 -0
  142. package/storybook-static/assets/{README-C0BwTe5N.js → README-C6prwAXw.js} +1 -1
  143. package/storybook-static/assets/{README-BzVni2ve.js → README-C9S83J_G.js} +1 -1
  144. package/storybook-static/assets/{README-BHw6MVjD.js → README-CGgxP5Zo.js} +1 -1
  145. package/storybook-static/assets/README-CJ2ZVG2U.js +2124 -0
  146. package/storybook-static/assets/README-CNGCAm5d.js +95 -0
  147. package/storybook-static/assets/README-Cb_q420B.js +90 -0
  148. package/storybook-static/assets/README-CtIDPNJ3.js +186 -0
  149. package/storybook-static/assets/README-CzO3Dchr.js +64 -0
  150. package/storybook-static/assets/README-D0rzQthv.js +264 -0
  151. package/storybook-static/assets/README-DEQu7djz.js +1704 -0
  152. package/storybook-static/assets/README-DFihT_sm.js +296 -0
  153. package/storybook-static/assets/{README-CTIBG4zH.js → README-DMiWsyv_.js} +1 -1
  154. package/storybook-static/assets/README-DOx8lXXk.js +82 -0
  155. package/storybook-static/assets/{README-DzTc6XmY.js → README-DPhDjr43.js} +1 -1
  156. package/storybook-static/assets/{README-Dki94Nf2.js → README-D_NqWPa9.js} +1 -1
  157. package/storybook-static/assets/README-DhJ5Rb1w.js +355 -0
  158. package/storybook-static/assets/README-DlwhWCvQ.js +1146 -0
  159. package/storybook-static/assets/README-Dxi73a2Q.js +740 -0
  160. package/storybook-static/assets/README-Dycov6NP.js +583 -0
  161. package/storybook-static/assets/README-GTBkSG4_.js +3591 -0
  162. package/storybook-static/assets/README-Gfd9tLTw.js +672 -0
  163. package/storybook-static/assets/{README-B4zYJg6u.js → README-Kfawetke.js} +1 -1
  164. package/storybook-static/assets/{README-BzVHwvgo.js → README-UDBM7ZMT.js} +1 -1
  165. package/storybook-static/assets/{README-D-XjRtAE.js → README-VTWQxLm_.js} +1 -1
  166. package/storybook-static/assets/README-YHNWrTZv.js +400 -0
  167. package/storybook-static/assets/README-_0Otw0eD.js +448 -0
  168. package/storybook-static/assets/README-aw2Xu9xu.js +158 -0
  169. package/storybook-static/assets/README-eg1emlll.js +192 -0
  170. package/storybook-static/assets/README-iqQHdhZ4.js +416 -0
  171. package/storybook-static/assets/{README-BdPlV5nA.js → README-llxZAtCj.js} +1 -1
  172. package/storybook-static/assets/README-wFnEIGl4.js +95 -0
  173. package/storybook-static/assets/{README-Dx3cpFMr.js → README-webB1yH0.js} +1 -1
  174. package/storybook-static/assets/README-wtreGRCe.js +208 -0
  175. package/storybook-static/assets/{RadioButton-DWbkCY8u.js → RadioButton-CNOLDk_o.js} +1 -1
  176. package/storybook-static/assets/{RadioButton-oSvQ-gQh.js → RadioButton-Ce05_q7s.js} +1 -1
  177. package/storybook-static/assets/{RadioButton.stories-GNQ9XJZT.js → RadioButton.stories-CPd4lTl0.js} +1 -1
  178. package/storybook-static/assets/{RadioGroup-CvXjGXcV.js → RadioGroup-BtfD5Szd.js} +1 -1
  179. package/storybook-static/assets/{RadioGroup-eBYggurL.js → RadioGroup-Ccm7G-dv.js} +1 -1
  180. package/storybook-static/assets/{RadioGroup.stories-C77j_cPv.js → RadioGroup.stories-D-RRPHwi.js} +1 -1
  181. package/storybook-static/assets/{Scrollable-De6SdhI3.js → Scrollable-DvdBIeig.js} +1 -1
  182. package/storybook-static/assets/{Select-DQMoVjn4.js → Select-8PV9PBKF.js} +1 -1
  183. package/storybook-static/assets/{Select-Bwc0bEpt.js → Select-G04B41FM.js} +1 -1
  184. package/storybook-static/assets/{Select.stories-BSIJKJnM.js → Select.stories-Cf6CBhV8.js} +1 -1
  185. package/storybook-static/assets/{SerializableSelect-B73irNFR.js → SerializableSelect-CdQdHIVp.js} +1 -1
  186. package/storybook-static/assets/{SerializableSelect.stories-Z9q6g5v2.js → SerializableSelect.stories-0AKUGpbS.js} +1 -1
  187. package/storybook-static/assets/{SingleDateTimeInput-Dq9LcjnS.js → SingleDateTimeInput-DWT1ORhL.js} +1 -1
  188. package/storybook-static/assets/{SingleDateTimeInput-BHl6srqA.js → SingleDateTimeInput-DattLt6w.js} +1 -1
  189. package/storybook-static/assets/SingleDateTimeInput.stories-BLJV3jzV.js +48 -0
  190. package/storybook-static/assets/{Slider-CvM0N_kc.js → Slider-DKEI4cDd.js} +1 -1
  191. package/storybook-static/assets/{Slider-BiyKexKa.js → Slider-Dci-mJt_.js} +1 -1
  192. package/storybook-static/assets/{Slider.stories-CdHAMDmY.js → Slider.stories-Dp7oQueF.js} +1 -1
  193. package/storybook-static/assets/{SliderInput-DqHotbhB.js → SliderInput-BGPQmlgY.js} +1 -1
  194. package/storybook-static/assets/{SliderInput-Bx_oHUCV.js → SliderInput-BhjqGOKt.js} +1 -1
  195. package/storybook-static/assets/{SliderInput.stories-R5yDhghM.js → SliderInput.stories-DXNhRU3X.js} +1 -1
  196. package/storybook-static/assets/{Sortable-D7pjTHO0.js → Sortable-CMd9l1Gd.js} +1 -1
  197. package/storybook-static/assets/{Sortable.stories-CVLG6pSH.js → Sortable.stories-BN1cFEFJ.js} +1 -1
  198. package/storybook-static/assets/{Splitter-B1Du6XI2.js → Splitter-GL65TlI9.js} +1 -1
  199. package/storybook-static/assets/{Splitter.stories-D-FRLMCc.js → Splitter.stories-q5PlI6rB.js} +1 -1
  200. package/storybook-static/assets/{StateSelect-zl-yZibY.js → StateSelect-Byik5-iZ.js} +1 -1
  201. package/storybook-static/assets/{StateSelect-BJdUEUBc.js → StateSelect-CT0JF2V6.js} +1 -1
  202. package/storybook-static/assets/{StateSelect.stories-DgidR5zR.js → StateSelect.stories-pPEPmgnN.js} +1 -1
  203. package/storybook-static/assets/{StringToggle.stories-IucGrtIi.js → StringToggle.stories-BQlFmCE7.js} +1 -1
  204. package/storybook-static/assets/{Switch-BJrn2lIN.js → Switch--xGPiYk-.js} +1 -1
  205. package/storybook-static/assets/{Switch-5dCshvVo.js → Switch-DhaLI9CG.js} +1 -1
  206. package/storybook-static/assets/{Switch.stories-Dp_l3_JL.js → Switch.stories-5DisgIyj.js} +1 -1
  207. package/storybook-static/assets/{Table-BFAEcUde.js → Table-Bf6MicdG.js} +1 -1
  208. package/storybook-static/assets/{Table.stories-CohejRQv.js → Table.stories-CS7rQgj9.js} +2 -2
  209. package/storybook-static/assets/{Tabs-CI32QiHf.js → Tabs-B4y4y8Ap.js} +1 -1
  210. package/storybook-static/assets/{Tabs.stories-Cr9d9ipA.js → Tabs.stories-C0SpdGkh.js} +1 -1
  211. package/storybook-static/assets/{TabsBox-BlDOUDMF.js → TabsBox-C5LLLhnj.js} +1 -1
  212. package/storybook-static/assets/{TagInput-YZ7eSv8W.js → TagInput-D4BpuCoH.js} +1 -1
  213. package/storybook-static/assets/{TagInput.stories-DrOvsiI5.js → TagInput.stories-rn2wtZP_.js} +1 -1
  214. package/storybook-static/assets/{Text-DK4jN26J.js → Text-BhBt9e7C.js} +1 -1
  215. package/storybook-static/assets/{Textarea-CFh5f_lC.js → Textarea-B-Hz7ujq.js} +1 -1
  216. package/storybook-static/assets/{Textarea-DxPuWBZj.js → Textarea-BHHxY5sd.js} +1 -1
  217. package/storybook-static/assets/{Textarea.stories-CUeOGKYc.js → Textarea.stories-CZ2kWz20.js} +1 -1
  218. package/storybook-static/assets/{TimePanel-BUhFtwlb.js → TimePanel-Cg8fgFsn.js} +1 -1
  219. package/storybook-static/assets/{TimePanel.stories-CpXpMBDN.js → TimePanel.stories-BxdwtK2e.js} +1 -1
  220. package/storybook-static/assets/{Toggle-l2AvDbRn.js → Toggle-BWwfk9fi.js} +1 -1
  221. package/storybook-static/assets/{Toggle-BtApzBNH.js → Toggle-Ce9rbjBc.js} +1 -1
  222. package/storybook-static/assets/{Toggle.stories-Ca8otmAa.js → Toggle.stories-0fzcmzKy.js} +1 -1
  223. package/storybook-static/assets/{TreeMultiSelect-C9QDV63L.js → TreeMultiSelect-B06Y0lIc.js} +1 -1
  224. package/storybook-static/assets/{TreeMultiSelect-nXC4ZB5b.js → TreeMultiSelect-CrAdR_jM.js} +1 -1
  225. package/storybook-static/assets/{TreeMultiSelect.stories-6STRGJbF.js → TreeMultiSelect.stories-CAVoj56E.js} +1 -1
  226. package/storybook-static/assets/{TreePickerBase-Cq7fSw3x.js → TreePickerBase-qU2xPlar.js} +1 -1
  227. package/storybook-static/assets/{TreeSelect-CITef9rp.js → TreeSelect-BIHydJFy.js} +1 -1
  228. package/storybook-static/assets/{TreeSelect-rMNyu_KT.js → TreeSelect-BKnWu0C7.js} +1 -1
  229. package/storybook-static/assets/{TreeSelect.stories-B-Emz9yW.js → TreeSelect.stories-Dp_8ybAf.js} +1 -1
  230. package/storybook-static/assets/{TreeTable-CLiP0td3.js → TreeTable-pVXjU9dG.js} +1 -1
  231. package/storybook-static/assets/{TreeTable.stories-DJb9qt8k.js → TreeTable.stories-CV_8Ui6R.js} +2 -2
  232. package/storybook-static/assets/{blocks-DndFRxxW.js → blocks-BY40djCc.js} +3 -3
  233. package/storybook-static/assets/{check-CLkTJVXe.js → check-CVkPTDzp.js} +1 -1
  234. package/storybook-static/assets/{chevron-down-miCejSEn.js → chevron-down-BtNO4Vhe.js} +1 -1
  235. package/storybook-static/assets/{chevron-left-DhQIPej2.js → chevron-left-kceSK3sZ.js} +1 -1
  236. package/storybook-static/assets/{chevron-right-DfBBx-fr.js → chevron-right-BA_LO2El.js} +1 -1
  237. package/storybook-static/assets/{chunk-W22LQPXL-IdwKKJUw.js → chunk-W22LQPXL-yJiFPv6e.js} +1 -1
  238. package/storybook-static/assets/{circle-alert-DOmVf8am.js → circle-alert-B2m4a1zz.js} +1 -1
  239. package/storybook-static/assets/{circle-check-e7eSQ2VD.js → circle-check-Cfjhotlm.js} +1 -1
  240. package/storybook-static/assets/{components-Bm4Cw8Ap.js → components-D6yV8PLX.js} +3 -3
  241. package/storybook-static/assets/{contextMenu-DpIKeJju.js → contextMenu-B0pQBIW0.js} +1 -1
  242. package/storybook-static/assets/{defaultRenderers-m21aWJXz.js → defaultRenderers-DfmnIuod.js} +1 -1
  243. package/storybook-static/assets/{download-eAKjms6q.js → download-Lba8elK9.js} +1 -1
  244. package/storybook-static/assets/{floating-ui.react-DmilONq6.js → floating-ui.react-BFNvfMpU.js} +1 -1
  245. package/storybook-static/assets/formatters-D33Uh3si-CxrG0jsB.js +1 -0
  246. package/storybook-static/assets/foundationApi-DZhnQ2cC.js +59 -0
  247. package/storybook-static/assets/foundationLib-CoVTo22U.js +30 -0
  248. package/storybook-static/assets/{hooks-RI5_2AXI.js → hooks-Cc6eXN6U.js} +1 -1
  249. package/storybook-static/assets/iframe-BXM-JBuH.js +1 -0
  250. package/storybook-static/assets/{iframe-Sr0umHM6.js → iframe-o7sH2IXC.js} +4 -4
  251. package/storybook-static/assets/{info-DhJTzwcL.js → info-BpsVP_dM.js} +1 -1
  252. package/storybook-static/assets/odata-CXsbxsRY.js +1 -0
  253. package/storybook-static/assets/odata-service-CWkHASdw-DlmSiioz.js +3 -0
  254. package/storybook-static/assets/{odataStoryFixtures-lgnWIUp7.js → odataStoryFixtures-Dj_bzRqh.js} +1 -1
  255. package/storybook-static/assets/{react-YFbUKK0m.js → react-DeJ0JTHb.js} +1 -1
  256. package/storybook-static/assets/{refresh-cw-C7WnxX9M.js → refresh-cw-BvGyjEXe.js} +1 -1
  257. package/storybook-static/assets/{settings-2-0NVvyKQl.js → settings-2-BdXxnHos.js} +1 -1
  258. package/storybook-static/assets/{sortable-DDGG-Zfs.js → sortable-XkyN-9r5.js} +1 -1
  259. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CxWm8nc8.js → syntaxhighlighter-QEQV7K2Y-Cafn3LV1.js} +1 -1
  260. package/storybook-static/assets/{trash-2-BnceCuhg.js → trash-2-uPH9-fND.js} +1 -1
  261. package/storybook-static/assets/{triangle-alert-MPi3GVgt.js → triangle-alert-tT01vSMw.js} +1 -1
  262. package/storybook-static/assets/{useODataSelectBase-hmjK6chS.js → useODataSelectBase-B2LlOwPZ.js} +1 -1
  263. package/storybook-static/assets/useODataTreeData-CU7Rqcb9.js +1 -0
  264. package/storybook-static/assets/{usePickerQuery-CtsGhieD.js → usePickerQuery-D8GHQ6KR.js} +1 -1
  265. package/storybook-static/assets/{usePickerTriggerController-EaI8W2G0.js → usePickerTriggerController-CcK1jmDy.js} +1 -1
  266. package/storybook-static/assets/{x-CqPSvWfo.js → x-BlAURbAH.js} +1 -1
  267. package/storybook-static/iframe.html +2 -2
  268. package/storybook-static/index.json +1 -1
  269. package/storybook-static/project.json +1 -1
  270. package/storybook-static/assets/DateInput-05Iy69_a.js +0 -1
  271. package/storybook-static/assets/NotificationsHost.stories-CgbFboVD.js +0 -29
  272. package/storybook-static/assets/SingleDateTimeInput.stories-C2RuBRAF.js +0 -48
  273. package/storybook-static/assets/async-SjiCjIjO.js +0 -625
  274. package/storybook-static/assets/formatters-CBgrBeSA-CqB1pZxS.js +0 -1
  275. package/storybook-static/assets/foundationLib-DRrox3tN.js +0 -25
  276. package/storybook-static/assets/iframe-DQo-3eW2.js +0 -1
  277. package/storybook-static/assets/odata-DhISMZkE.js +0 -1
  278. package/storybook-static/assets/odata-service-B6TxBSLm-Bq8Ya67E.js +0 -3
  279. package/storybook-static/assets/odataFetchFn-Dv6Xi5CI.js +0 -763
  280. package/storybook-static/assets/persisted-CUFiw53N.js +0 -600
  281. package/storybook-static/assets/useODataTreeData-CKuavbWc.js +0 -1
@@ -0,0 +1,69 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Browser/Client Fingerprint`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`client-fingerprint-через-ryuzaki13react-foundation-libfingerprint`,children:[`Client fingerprint через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/fingerprint`})]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`getClientFingerprint`}),` лениво загружает FingerprintJS, получает `,(0,c.jsx)(t.code,{children:`visitorId`}),` и кеширует Promise на всё время жизни JavaScript-модуля.`]}),`
4
+ `,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
5
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib @fingerprintjs/fingerprintjs
6
+ `})}),`
7
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { getClientFingerprint } from "@ryuzaki13/react-foundation-lib/fingerprint";
8
+ `})}),`
9
+ `,(0,c.jsxs)(t.p,{children:[`Host должен разрешить peer dependency `,(0,c.jsx)(t.code,{children:`@fingerprintjs/fingerprintjs >=5 <6`}),`.`]}),`
10
+ `,(0,c.jsx)(t.h2,{id:`использование`,children:`Использование`}),`
11
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const fingerprint = await getClientFingerprint();
12
+
13
+ if (fingerprint) {
14
+ attachAnonymousDiagnosticId(fingerprint);
15
+ }
16
+ `})}),`
17
+ `,(0,c.jsxs)(t.p,{children:[`Результат `,(0,c.jsx)(t.code,{children:`Promise<string | null>`}),`:`]}),`
18
+ `,(0,c.jsxs)(t.ul,{children:[`
19
+ `,(0,c.jsxs)(t.li,{children:[`непустой trimmed `,(0,c.jsx)(t.code,{children:`visitorId`}),`, если библиотека успешно отработала;`]}),`
20
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),` вне browser;`]}),`
21
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),`, если load/get завершились ошибкой;`]}),`
22
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),`, если visitorId пустой после trim.`]}),`
23
+ `]}),`
24
+ `,(0,c.jsx)(t.h2,{id:`кеширование`,children:`Кеширование`}),`
25
+ `,(0,c.jsx)(t.p,{children:`Первый browser-вызов создаёт одну Promise:`}),`
26
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`первый вызов ──► load FingerprintJS ──► fp.get() ──► string/null
27
+
28
+ следующие вызовы ─────────────────────► та же Promise
29
+ `})}),`
30
+ `,(0,c.jsx)(t.p,{children:`Преимущества:`}),`
31
+ `,(0,c.jsxs)(t.ul,{children:[`
32
+ `,(0,c.jsx)(t.li,{children:`параллельные consumers не запускают повторное вычисление;`}),`
33
+ `,(0,c.jsx)(t.li,{children:`после успеха возвращается то же значение;`}),`
34
+ `,(0,c.jsxs)(t.li,{children:[`после ошибки `,(0,c.jsx)(t.code,{children:`null`}),` также кешируется и автоматического retry нет.`]}),`
35
+ `]}),`
36
+ `,(0,c.jsx)(t.p,{children:`Публичного reset/retry API нет. Reload страницы создаёт новый module runtime.`}),`
37
+ `,(0,c.jsxs)(t.p,{children:[`SSR-вызов возвращает `,(0,c.jsx)(t.code,{children:`null`}),` сразу и не заполняет browser promise cache. Поэтому последующий client runtime может выполнить настоящее вычисление.`]}),`
38
+ `,(0,c.jsx)(t.h2,{id:`правильная-react-boundary`,children:`Правильная React boundary`}),`
39
+ `,(0,c.jsx)(t.p,{children:`Не вызывайте async функцию во время render:`}),`
40
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`useEffect(() => {
41
+ let active = true;
42
+
43
+ void getClientFingerprint().then((value) => {
44
+ if (active) setFingerprint(value);
45
+ });
46
+
47
+ return () => {
48
+ active = false;
49
+ };
50
+ }, []);
51
+ `})}),`
52
+ `,(0,c.jsx)(t.p,{children:`Если fingerprint нужен backend request, предпочтительнее интегрировать его в app/API boundary, а не дублировать state по компонентам.`}),`
53
+ `,(0,c.jsx)(t.h2,{id:`privacy-и-security`,children:`Privacy и security`}),`
54
+ `,(0,c.jsx)(t.p,{children:`Fingerprint:`}),`
55
+ `,(0,c.jsxs)(t.ul,{children:[`
56
+ `,(0,c.jsx)(t.li,{children:`не является authentication token;`}),`
57
+ `,(0,c.jsx)(t.li,{children:`не доказывает личность пользователя;`}),`
58
+ `,(0,c.jsx)(t.li,{children:`может меняться после обновления browser/device/settings;`}),`
59
+ `,(0,c.jsx)(t.li,{children:`может совпасть у разных клиентов;`}),`
60
+ `,(0,c.jsx)(t.li,{children:`не заменяет server session;`}),`
61
+ `,(0,c.jsx)(t.li,{children:`требует правового/продуктового решения о consent и retention;`}),`
62
+ `,(0,c.jsx)(t.li,{children:`не должен использоваться для скрытого tracking вопреки пользовательской политике.`}),`
63
+ `]}),`
64
+ `,(0,c.jsx)(t.p,{children:`Не помещайте fingerprint в публичный URL, DOM или logs без необходимости. При передаче на backend используйте HTTPS и установленную privacy policy.`}),`
65
+ `,(0,c.jsx)(t.h2,{id:`ошибки-и-тестирование`,children:`Ошибки и тестирование`}),`
66
+ `,(0,c.jsxs)(t.p,{children:[`Функция намеренно поглощает ошибки FingerprintJS и возвращает `,(0,c.jsx)(t.code,{children:`null`}),`. Это graceful optional capability; если fingerprint обязателен для business flow, host должен явно обработать `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
67
+ `,(0,c.jsxs)(t.p,{children:[`Module-level cache усложняет повторные тесты. Используйте module reset (`,(0,c.jsx)(t.code,{children:`vi.resetModules`}),`) перед сценарием, которому нужен чистый первый вызов.`]}),`
68
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`function getClientFingerprint(): Promise<string | null>;
69
+ `})})]})}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,324 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={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 API/Errors/Error Report Delivery`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`доставка-error-reports-через-ryuzaki13react-foundation-apierror-report`,children:[`Доставка error reports через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/error-report`})]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль превращает сохранённый черновик отчёта из `,(0,c.jsx)(t.code,{children:`foundation-lib`}),` в delivery body, вызывает adapter приложения и обновляет статус черновика.`]}),`
4
+ `,(0,c.jsx)(t.h2,{id:`граница-ответственности`,children:`Граница ответственности`}),`
5
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`foundation-lib/error-report foundation-api/error-report host backend adapter
6
+ collect + sanitize + draft store ──► lifecycle + delivery body ─────► HTTP/OData/serverFn
7
+ `})}),`
8
+ `,(0,c.jsxs)(t.p,{children:[`Модуль не собирает browser diagnostics, не выбирает endpoint и не отправляет запрос самостоятельно. Transport явно передаёт приложение через `,(0,c.jsx)(t.code,{children:`adapter`}),`.`]}),`
9
+ `,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
10
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
11
+ createErrorReportDeliveryBody,
12
+ sendErrorReport
13
+ } from "@ryuzaki13/react-foundation-api/error-report";
14
+
15
+ import type {
16
+ ErrorReportDeliveryAdapter,
17
+ ErrorReportDeliveryBody,
18
+ ErrorReportDeliveryContext,
19
+ SendErrorReportOptions
20
+ } from "@ryuzaki13/react-foundation-api/error-report";
21
+ `})}),`
22
+ `,(0,c.jsxs)(t.p,{children:[`Нужны `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib`}),` и `,(0,c.jsx)(t.code,{children:`@tanstack/react-query`}),`.`]}),`
23
+ `,(0,c.jsx)(t.h2,{id:`полный-сценарий`,children:`Полный сценарий`}),`
24
+ `,(0,c.jsxs)(t.p,{children:[`Сначала другой слой создаёт и сохраняет draft средствами `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),`. Затем API-слой получает только его `,(0,c.jsx)(t.code,{children:`reportId`}),`:`]}),`
25
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { httpFetchPayload } from "@ryuzaki13/react-foundation-api/http";
26
+ import { sendErrorReport } from "@ryuzaki13/react-foundation-api/error-report";
27
+ import type { ErrorReportDeliveryAdapter } from "@ryuzaki13/react-foundation-api/error-report";
28
+
29
+ const deliveryAdapter: ErrorReportDeliveryAdapter = async (body) => {
30
+ await httpFetchPayload("/api/error-reports", {
31
+ init: {
32
+ method: "POST",
33
+ headers: { "Content-Type": "application/json" },
34
+ body: JSON.stringify(body)
35
+ }
36
+ });
37
+ };
38
+
39
+ await sendErrorReport(reportId, {
40
+ adapter: deliveryAdapter,
41
+ queryClient
42
+ });
43
+ `})}),`
44
+ `,(0,c.jsx)(t.h2,{id:`createerrorreportdeliverybody`,children:(0,c.jsx)(t.code,{children:`createErrorReportDeliveryBody`})}),`
45
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const body = createErrorReportDeliveryBody(draft);
46
+ `})}),`
47
+ `,(0,c.jsx)(t.p,{children:`Результат:`}),`
48
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ErrorReportDeliveryBody = {
49
+ reportId: string;
50
+ sessionId: string;
51
+ createdUtc: string;
52
+ category: ErrorReportCategory;
53
+ errorClass: string;
54
+ errorMessage: string;
55
+ stackTrace?: string;
56
+ payload: string;
57
+ };
58
+ `})}),`
59
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`payload`}),` — JSON string всего payload черновика, а не вложенный object. Это важно для backend contract.`]}),`
60
+ `,(0,c.jsxs)(t.p,{children:[`Если `,(0,c.jsx)(t.code,{children:`draft.payload.error.message`}),` пуст, обязательные `,(0,c.jsx)(t.code,{children:`errorMessage`}),` и message внутри сериализованного payload получают значение `,(0,c.jsx)(t.code,{children:`"Неизвестная ошибка"`}),`. Остальной draft не нормализуется.`]}),`
61
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`JSON.stringify`}),` может выбросить ошибку при циклических или неподдерживаемых данных. Draft должен соответствовать сериализуемому контракту `,(0,c.jsx)(t.code,{children:`foundation-lib`}),`.`]}),`
62
+ `,(0,c.jsx)(t.h3,{id:`что-такое-draft-и-delivery-body`,children:`Что такое draft и delivery body`}),`
63
+ `,(0,c.jsx)(t.p,{children:`Для начинающего разработчика важно не смешивать две формы:`}),`
64
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`ErrorReportDraft
65
+ ├── локальный lifecycle status
66
+ ├── retry information
67
+ ├── collected/sanitized payload
68
+ └── identifiers
69
+
70
+ ErrorReportDeliveryBody
71
+ ├── плоские обязательные backend fields
72
+ └── payload: JSON string
73
+ `})}),`
74
+ `,(0,c.jsxs)(t.p,{children:[`Draft принадлежит локальному хранилищу `,(0,c.jsx)(t.code,{children:`foundation-lib`}),`. Delivery body — одноразовый snapshot для transport adapter-а.`]}),`
75
+ `,(0,c.jsx)(t.p,{children:`Нельзя отправлять draft целиком только потому, что он уже похож на body: backend contract намеренно отделён от local store contract.`}),`
76
+ `,(0,c.jsx)(t.h3,{id:`соответствие-полей`,children:`Соответствие полей`}),`
77
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Delivery field`}),(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:`reportId`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`draft.reportId`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`sessionId`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`draft.sessionId`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createdUtc`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`draft.createdUtc`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`category`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`draft.category`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`errorClass`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`draft.payload.error.name`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`errorMessage`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`draft.payload.error.message`}),` или fallback`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`stackTrace`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`draft.payload.error.stackTrace`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`payload`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`JSON.stringify(normalized payload)`})})]})]})]}),`
78
+ `,(0,c.jsx)(t.p,{children:`Если message содержит непустой текст с пробелами по краям, проверка считает его валидным, но в delivery сохраняется исходная строка. Функция не выполняет общий trim draft-а.`}),`
79
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`draft.payload.error.message = " Ошибка сохранения ";
80
+
81
+ const body = createErrorReportDeliveryBody(draft);
82
+ body.errorMessage;
83
+ // " Ошибка сохранения "
84
+ `})}),`
85
+ `,(0,c.jsx)(t.p,{children:`Если message пустой или whitespace-only:`}),`
86
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`draft.payload.error.message = " ";
87
+
88
+ const body = createErrorReportDeliveryBody(draft);
89
+ body.errorMessage;
90
+ // "Неизвестная ошибка"
91
+
92
+ JSON.parse(body.payload).error.message;
93
+ // "Неизвестная ошибка"
94
+ `})}),`
95
+ `,(0,c.jsx)(t.p,{children:`Функция создаёт новые wrapper objects и не записывает fallback обратно в draft.`}),`
96
+ `,(0,c.jsx)(t.h2,{id:`senderrorreport`,children:(0,c.jsx)(t.code,{children:`sendErrorReport`})}),`
97
+ `,(0,c.jsx)(t.p,{children:`Lifecycle:`}),`
98
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`draft отсутствует ─────────► undefined
99
+ status sent/sending ───────► текущий draft, adapter не вызывается
100
+ остальной draft ───────────► sending
101
+
102
+ adapter success / error
103
+ │ │
104
+ ▼ ▼
105
+ sent failed + failedReason
106
+ `})}),`
107
+ `,(0,c.jsx)(t.p,{children:`Пошагово функция:`}),`
108
+ `,(0,c.jsxs)(t.ol,{children:[`
109
+ `,(0,c.jsxs)(t.li,{children:[`Ищет draft по `,(0,c.jsx)(t.code,{children:`reportId`}),` в store из `,(0,c.jsx)(t.code,{children:`foundation-lib`}),`.`]}),`
110
+ `,(0,c.jsxs)(t.li,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, если draft не найден.`]}),`
111
+ `,(0,c.jsxs)(t.li,{children:[`Не отправляет повторно draft со статусом `,(0,c.jsx)(t.code,{children:`sent`}),` или `,(0,c.jsx)(t.code,{children:`sending`}),`.`]}),`
112
+ `,(0,c.jsxs)(t.li,{children:[`Устанавливает `,(0,c.jsx)(t.code,{children:`status: "sending"`}),` и очищает `,(0,c.jsx)(t.code,{children:`failedReason`}),`.`]}),`
113
+ `,(0,c.jsx)(t.li,{children:`Создаёт delivery body.`}),`
114
+ `,(0,c.jsxs)(t.li,{children:[`Вызывает `,(0,c.jsx)(t.code,{children:`adapter(body, { draft, queryClient })`}),`.`]}),`
115
+ `,(0,c.jsxs)(t.li,{children:[`При успехе устанавливает `,(0,c.jsx)(t.code,{children:`status: "sent"`}),` и `,(0,c.jsx)(t.code,{children:`sentUtc`}),`.`]}),`
116
+ `,(0,c.jsxs)(t.li,{children:[`При ошибке устанавливает `,(0,c.jsx)(t.code,{children:`status: "failed"`}),`, сохраняет нормализованное сообщение и повторно бросает исходную ошибку.`]}),`
117
+ `]}),`
118
+ `,(0,c.jsxs)(t.p,{children:[`Adapter получает исходный snapshot `,(0,c.jsx)(t.code,{children:`draft`}),`, прочитанный до перевода store в `,(0,c.jsx)(t.code,{children:`sending`}),`. Используйте `,(0,c.jsx)(t.code,{children:`body`}),` как delivery payload, а context — для query invalidation или transport, которому нужен `,(0,c.jsx)(t.code,{children:`QueryClient`}),`.`]}),`
119
+ `,(0,c.jsx)(t.h3,{id:`status-table`,children:`Status table`}),`
120
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Status draft до вызова`}),(0,c.jsx)(t.th,{children:`Вызывается adapter`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`draft отсутствует`}),(0,c.jsx)(t.td,{children:`нет`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`undefined`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`sent`})}),(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:`sending`})}),(0,c.jsx)(t.td,{children:`нет`}),(0,c.jsx)(t.td,{children:`текущий draft`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`pending`}),` или эквивалентный начальный`]}),(0,c.jsx)(t.td,{children:`да`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`sent`}),` либо exception + `,(0,c.jsx)(t.code,{children:`failed`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`failed`})}),(0,c.jsx)(t.td,{children:`да`}),(0,c.jsx)(t.td,{children:`повторная попытка`})]})]})]}),`
121
+ `,(0,c.jsxs)(t.p,{children:[`Функция не создаёт draft. Если `,(0,c.jsx)(t.code,{children:`reportId`}),` ошибочный, это не exception: result равен `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
122
+ `,(0,c.jsx)(t.h3,{id:`время-отправки`,children:`Время отправки`}),`
123
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`sentUtc`}),` создаётся на client после успешного завершения adapter-а:`]}),`
124
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`new Date().toISOString()
125
+ `})}),`
126
+ `,(0,c.jsx)(t.p,{children:`Это client timestamp, а не server acknowledgement time. Для аудита используйте server time из backend record.`}),`
127
+ `,(0,c.jsx)(t.h3,{id:`ошибка-построения-body`,children:`Ошибка построения body`}),`
128
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`createErrorReportDeliveryBody`}),` вызывается внутри `,(0,c.jsx)(t.code,{children:`try`}),`. Если `,(0,c.jsx)(t.code,{children:`JSON.stringify`}),` выбросил error:`]}),`
129
+ `,(0,c.jsxs)(t.ul,{children:[`
130
+ `,(0,c.jsx)(t.li,{children:`adapter не вызывается;`}),`
131
+ `,(0,c.jsxs)(t.li,{children:[`draft становится `,(0,c.jsx)(t.code,{children:`failed`}),`;`]}),`
132
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`failedReason`}),` формируется через `,(0,c.jsx)(t.code,{children:`createErrorInfo`}),`;`]}),`
133
+ `,(0,c.jsx)(t.li,{children:`исходный error снова выбрасывается caller-у.`}),`
134
+ `]}),`
135
+ `,(0,c.jsx)(t.h3,{id:`ui-flow`,children:`UI flow`}),`
136
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { useState } from "react";
137
+ import { useQueryClient } from "@tanstack/react-query";
138
+ import { sendErrorReport } from "@ryuzaki13/react-foundation-api/error-report";
139
+
140
+ function SendReportButton({ reportId }: { reportId: string }) {
141
+ const queryClient = useQueryClient();
142
+ const [isSending, setIsSending] = useState(false);
143
+ const [errorMessage, setErrorMessage] = useState<string>();
144
+
145
+ const handleSend = async () => {
146
+ setIsSending(true);
147
+ setErrorMessage(undefined);
148
+
149
+ try {
150
+ const result = await sendErrorReport(reportId, {
151
+ adapter: deliveryAdapter,
152
+ queryClient
153
+ });
154
+
155
+ if (!result) {
156
+ setErrorMessage("Черновик отчёта не найден");
157
+ }
158
+ } catch (error) {
159
+ setErrorMessage(
160
+ error instanceof Error ? error.message : "Не удалось отправить отчёт"
161
+ );
162
+ } finally {
163
+ setIsSending(false);
164
+ }
165
+ };
166
+
167
+ return (
168
+ <>
169
+ <button type="button" disabled={isSending} onClick={handleSend}>
170
+ {isSending ? "Отправка…" : "Отправить отчёт"}
171
+ </button>
172
+ {errorMessage ? <p role="alert">{errorMessage}</p> : null}
173
+ </>
174
+ );
175
+ }
176
+ `})}),`
177
+ `,(0,c.jsxs)(t.p,{children:[`Local `,(0,c.jsx)(t.code,{children:`isSending`}),` нужен UI для немедленной блокировки повторного click. Draft status остаётся источником долгоживущего lifecycle, но component может не быть подписан на store.`]}),`
178
+ `,(0,c.jsx)(t.h2,{id:`варианты-delivery-adapter-а`,children:`Варианты delivery adapter-а`}),`
179
+ `,(0,c.jsx)(t.h3,{id:`обычный-http`,children:`Обычный HTTP`}),`
180
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { httpFetchPayload } from "@ryuzaki13/react-foundation-api/http";
181
+ import type { ErrorReportDeliveryAdapter } from "@ryuzaki13/react-foundation-api/error-report";
182
+
183
+ export const deliveryAdapter: ErrorReportDeliveryAdapter = async (body) => {
184
+ await httpFetchPayload("/api/error-reports", {
185
+ init: {
186
+ method: "POST",
187
+ headers: { "Content-Type": "application/json" },
188
+ body: JSON.stringify(body)
189
+ }
190
+ });
191
+ };
192
+ `})}),`
193
+ `,(0,c.jsx)(t.h3,{id:`odata-functionimport`,children:`OData FunctionImport`}),`
194
+ `,(0,c.jsx)(t.p,{children:`Если backend contract опубликован как FunctionImport, operation определяется metadata:`}),`
195
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { odataFunctionImportFn } from "@ryuzaki13/react-foundation-api/odata";
196
+ import { wrapODataParams } from "@ryuzaki13/react-foundation-lib/odata-service";
197
+
198
+ const deliveryAdapter: ErrorReportDeliveryAdapter = async (body, { queryClient }) => {
199
+ await odataFunctionImportFn({
200
+ odata: {
201
+ service: "ZERROR_REPORT_SRV",
202
+ target: "SendErrorReport"
203
+ },
204
+ params: wrapODataParams({
205
+ ReportId: body.reportId,
206
+ Payload: body.payload
207
+ })
208
+ })({ client: queryClient });
209
+ };
210
+ `})}),`
211
+ `,(0,c.jsx)(t.p,{children:`Это только пример mapping: точные parameter names должны соответствовать metadata вашего сервиса.`}),`
212
+ `,(0,c.jsx)(t.h3,{id:`server-function`,children:`Server function`}),`
213
+ `,(0,c.jsxs)(t.p,{children:[`Adapter может вызвать client-safe serverFn operation. Модуль error-report не знает о transport и не ограничивает его, пока adapter возвращает `,(0,c.jsx)(t.code,{children:`Promise<void>`}),`.`]}),`
214
+ `,(0,c.jsx)(t.h3,{id:`почему-adapter-ничего-не-возвращает`,children:`Почему adapter ничего не возвращает`}),`
215
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`sendErrorReport`}),` управляет local draft lifecycle, а не server entity. Если backend вернул receipt, adapter может обработать его внутри: сохранить в отдельный Query cache, telemetry или domain store. Public delivery contract считает успехом fulfilled promise.`]}),`
216
+ `,(0,c.jsx)(t.h2,{id:`adapter-с-cache-invalidation`,children:`Adapter с cache invalidation`}),`
217
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const adapter: ErrorReportDeliveryAdapter = async (body, { queryClient }) => {
218
+ await postReport(body);
219
+ await queryClient.invalidateQueries({ queryKey: ["error-reports"] });
220
+ };
221
+ `})}),`
222
+ `,(0,c.jsxs)(t.p,{children:[`Если invalidation бросит ошибку, вся доставка считается неуспешной и draft станет `,(0,c.jsx)(t.code,{children:`failed`}),`, даже если backend уже принял отчёт. Для non-critical cache update обработайте ошибку внутри adapter-а.`]}),`
223
+ `,(0,c.jsx)(t.p,{children:`Безопасный вариант для необязательного refresh:`}),`
224
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const adapter: ErrorReportDeliveryAdapter = async (body, { queryClient }) => {
225
+ await postReport(body);
226
+
227
+ try {
228
+ await queryClient.invalidateQueries({ queryKey: ["error-reports"] });
229
+ } catch (error) {
230
+ console.warn("Отчёт отправлен, но cache не обновлён", error);
231
+ }
232
+ };
233
+ `})}),`
234
+ `,(0,c.jsx)(t.p,{children:`Решение зависит от contract: если fresh cache является частью успешной операции, не поглощайте ошибку.`}),`
235
+ `,(0,c.jsx)(t.h2,{id:`повторная-отправка-и-concurrency`,children:`Повторная отправка и concurrency`}),`
236
+ `,(0,c.jsxs)(t.p,{children:[`После `,(0,c.jsx)(t.code,{children:`failed`}),` функцию можно вызвать повторно. Проверка `,(0,c.jsx)(t.code,{children:`sending`}),` защищает от обычного повторного нажатия, но это не распределённая блокировка: два практически одновременных вызова могут успеть прочитать старый статус до его обновления. Backend желательно сделать идемпотентным по `,(0,c.jsx)(t.code,{children:`reportId`}),`.`]}),`
237
+ `,(0,c.jsx)(t.h3,{id:`idempotency-backend-а`,children:`Idempotency backend-а`}),`
238
+ `,(0,c.jsx)(t.p,{children:`Рекомендуемый server contract:`}),`
239
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`UNIQUE(reportId)
240
+ `})}),`
241
+ `,(0,c.jsxs)(t.p,{children:[`Повтор с тем же `,(0,c.jsx)(t.code,{children:`reportId`}),` должен либо вернуть прежний успешный result, либо завершиться предсказуемым «already accepted», которое adapter считает успехом.`]}),`
242
+ `,(0,c.jsx)(t.p,{children:`Это защищает сценарий:`}),`
243
+ `,(0,c.jsxs)(t.ol,{children:[`
244
+ `,(0,c.jsx)(t.li,{children:`Backend принял report.`}),`
245
+ `,(0,c.jsx)(t.li,{children:`Network response потерялся.`}),`
246
+ `,(0,c.jsxs)(t.li,{children:[`Client пометил draft как `,(0,c.jsx)(t.code,{children:`failed`}),`.`]}),`
247
+ `,(0,c.jsx)(t.li,{children:`Пользователь повторил отправку.`}),`
248
+ `]}),`
249
+ `,(0,c.jsx)(t.p,{children:`Без idempotency server создаст duplicate.`}),`
250
+ `,(0,c.jsx)(t.h3,{id:`несколько-tabs`,children:`Несколько tabs`}),`
251
+ `,(0,c.jsxs)(t.p,{children:[`Status `,(0,c.jsx)(t.code,{children:`sending`}),` в local store не является cross-tab distributed lock, если storage implementation явно не гарантирует это. Idempotency по `,(0,c.jsx)(t.code,{children:`reportId`}),` остаётся обязательной защитой.`]}),`
252
+ `,(0,c.jsx)(t.h2,{id:`тестирование`,children:`Тестирование`}),`
253
+ `,(0,c.jsx)(t.h3,{id:`body-builder`,children:`Body builder`}),`
254
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { expect, it } from "vitest";
255
+
256
+ it("подставляет fallback message в оба места", () => {
257
+ const body = createErrorReportDeliveryBody({
258
+ ...draftFixture,
259
+ payload: {
260
+ ...draftFixture.payload,
261
+ error: {
262
+ ...draftFixture.payload.error,
263
+ message: " "
264
+ }
265
+ }
266
+ });
267
+
268
+ expect(body.errorMessage).toBe("Неизвестная ошибка");
269
+ expect(JSON.parse(body.payload).error.message).toBe("Неизвестная ошибка");
270
+ });
271
+ `})}),`
272
+ `,(0,c.jsx)(t.h3,{id:`delivery-lifecycle`,children:`Delivery lifecycle`}),`
273
+ `,(0,c.jsx)(t.p,{children:`В package/feature test проверяйте:`}),`
274
+ `,(0,c.jsxs)(t.ul,{children:[`
275
+ `,(0,c.jsx)(t.li,{children:`отсутствующий id не вызывает adapter;`}),`
276
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`sent`}),` не отправляется повторно;`]}),`
277
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`sending`}),` не отправляется повторно;`]}),`
278
+ `,(0,c.jsxs)(t.li,{children:[`success переводит status в `,(0,c.jsx)(t.code,{children:`sent`}),` и задаёт ISO `,(0,c.jsx)(t.code,{children:`sentUtc`}),`;`]}),`
279
+ `,(0,c.jsxs)(t.li,{children:[`adapter error переводит status в `,(0,c.jsx)(t.code,{children:`failed`}),`;`]}),`
280
+ `,(0,c.jsx)(t.li,{children:`исходный error сохраняет identity и выбрасывается повторно;`}),`
281
+ `,(0,c.jsxs)(t.li,{children:[`retry после `,(0,c.jsx)(t.code,{children:`failed`}),` снова вызывает adapter.`]}),`
282
+ `]}),`
283
+ `,(0,c.jsx)(t.p,{children:`Adapter удобно делать mock-функцией:`}),`
284
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const adapter = vi.fn<ErrorReportDeliveryAdapter>().mockResolvedValue(undefined);
285
+ `})}),`
286
+ `,(0,c.jsx)(t.p,{children:`Не помещайте реальные stack traces, cookies, tokens или пользовательские данные в test snapshots.`}),`
287
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
288
+ `,(0,c.jsx)(t.h3,{id:`передавать-draft-вместо-body`,children:`Передавать draft вместо body`}),`
289
+ `,(0,c.jsxs)(t.p,{children:[`Adapter contract уже получает подготовленный `,(0,c.jsx)(t.code,{children:`body`}),`. Не сериализуйте `,(0,c.jsx)(t.code,{children:`context.draft`}),` вместо него.`]}),`
290
+ `,(0,c.jsxs)(t.h3,{id:`дважды-сериализовать-payload`,children:[`Дважды сериализовать `,(0,c.jsx)(t.code,{children:`payload`})]}),`
291
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`body.payload`}),` уже string:`]}),`
292
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`JSON.stringify(body)
293
+ `})}),`
294
+ `,(0,c.jsxs)(t.p,{children:[`правильно сериализует outer HTTP body. Не делайте `,(0,c.jsx)(t.code,{children:`body.payload = JSON.stringify(body.payload)`}),`.`]}),`
295
+ `,(0,c.jsxs)(t.h3,{id:`считать-sending-надёжной-блокировкой`,children:[`Считать `,(0,c.jsx)(t.code,{children:`sending`}),` надёжной блокировкой`]}),`
296
+ `,(0,c.jsx)(t.p,{children:`Это local lifecycle guard. Server idempotency всё равно нужна.`}),`
297
+ `,(0,c.jsx)(t.h3,{id:`поглощать-adapter-error-в-ui`,children:`Поглощать adapter error в UI`}),`
298
+ `,(0,c.jsx)(t.p,{children:`Функция намеренно rethrow-ит error. Покажите feedback и оставьте возможность retry.`}),`
299
+ `,(0,c.jsx)(t.h3,{id:`добавлять-transport-в-shared-delivery-module`,children:`Добавлять transport в shared delivery module`}),`
300
+ `,(0,c.jsx)(t.p,{children:`Endpoint и auth policy специфичны проекту. Они должны оставаться adapter-ом host application.`}),`
301
+ `,(0,c.jsx)(t.h2,{id:`ошибки-и-безопасность`,children:`Ошибки и безопасность`}),`
302
+ `,(0,c.jsxs)(t.ul,{children:[`
303
+ `,(0,c.jsx)(t.li,{children:`Ошибка adapter-а не поглощается: вызывающий код обязан её обработать.`}),`
304
+ `,(0,c.jsx)(t.li,{children:`Не добавляйте secrets в draft. Delivery layer не выполняет дополнительную redaction всего payload.`}),`
305
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`queryClient`}),` передаётся adapter-у, но модуль сам не инвалидирует queries.`]}),`
306
+ `,(0,c.jsx)(t.li,{children:`Функция управляет локальным draft store; не вызывайте её в среде без подходящего storage/runtime, если draft store там недоступен.`}),`
307
+ `,(0,c.jsxs)(t.li,{children:[`Статус `,(0,c.jsx)(t.code,{children:`sent`}),` означает успешное завершение adapter-а, а не обязательное подтверждение бизнес-обработки backend-ом.`]}),`
308
+ `,(0,c.jsx)(t.li,{children:`Delivery body содержит stack trace и diagnostic payload: передавайте его только по защищённому каналу авторизованному endpoint.`}),`
309
+ `,(0,c.jsxs)(t.li,{children:[`Не логируйте `,(0,c.jsx)(t.code,{children:`body.payload`}),` целиком в production.`]}),`
310
+ `,(0,c.jsxs)(t.li,{children:[`Redaction должна происходить при сборе draft в `,(0,c.jsx)(t.code,{children:`foundation-lib`}),`; delivery boundary не может безопасно угадать все domain secrets.`]}),`
311
+ `]}),`
312
+ `,(0,c.jsx)(t.h2,{id:`faq`,children:`FAQ`}),`
313
+ `,(0,c.jsxs)(t.h3,{id:`почему-функции-нужен-queryclient-даже-если-adapter-его-не-использует`,children:[`Почему функции нужен `,(0,c.jsx)(t.code,{children:`QueryClient`}),`, даже если adapter его не использует?`]}),`
314
+ `,(0,c.jsx)(t.p,{children:`Это единый adapter context. Он позволяет OData operations и cache synchronization без глобального QueryClient.`}),`
315
+ `,(0,c.jsx)(t.h3,{id:`можно-ли-отправить-report-которого-нет-в-store`,children:`Можно ли отправить report, которого нет в store?`}),`
316
+ `,(0,c.jsxs)(t.p,{children:[`Нет. `,(0,c.jsx)(t.code,{children:`sendErrorReport`}),` принимает id существующего draft и вернёт `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
317
+ `,(0,c.jsx)(t.h3,{id:`можно-ли-изменить-body-перед-отправкой`,children:`Можно ли изменить body перед отправкой?`}),`
318
+ `,(0,c.jsx)(t.p,{children:`Да, внутри project adapter можно построить backend-specific envelope. Не мутируйте входной body; создайте новый object.`}),`
319
+ `,(0,c.jsx)(t.h3,{id:`когда-разрешён-retry`,children:`Когда разрешён retry?`}),`
320
+ `,(0,c.jsxs)(t.p,{children:[`После status `,(0,c.jsx)(t.code,{children:`failed`}),`. `,(0,c.jsx)(t.code,{children:`sent`}),` и `,(0,c.jsx)(t.code,{children:`sending`}),` являются no-op states.`]}),`
321
+ `,(0,c.jsx)(t.h3,{id:`кто-отвечает-за-offline-queue`,children:`Кто отвечает за offline queue?`}),`
322
+ `,(0,c.jsx)(t.p,{children:`Не этот модуль. Он хранит lifecycle одного draft и вызывает adapter. Background sync/retry scheduler должен быть отдельной явно спроектированной инфраструктурой.`}),`
323
+ `,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
324
+ `,(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:`createErrorReportDeliveryBody`})}),(0,c.jsx)(t.td,{children:`Строит сериализуемый backend body`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`sendErrorReport`})}),(0,c.jsx)(t.td,{children:`Управляет status и вызывает adapter`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryBody`})}),(0,c.jsx)(t.td,{children:`Поля delivery payload`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryContext`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`draft`}),` и `,(0,c.jsx)(t.code,{children:`queryClient`}),` для adapter-а`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryAdapter`})}),(0,c.jsx)(t.td,{children:`Контракт функции доставки`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SendErrorReportOptions`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`adapter`}),` и `,(0,c.jsx)(t.code,{children:`queryClient`})]})]})]})]})]})}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,98 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.js";function o(e){let t={a:`a`,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 Lib/Data/XML`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`простые-xml-helpers-через-ryuzaki13react-foundation-libxml`,children:[`Простые XML helpers через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/xml`})]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль экранирует XML-текст, строит последовательность простых полей и читает текст первого тега через `,(0,c.jsx)(t.code,{children:`DOMParser`}),`.`]}),`
4
+ `,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
5
+ `,(0,c.jsxs)(t.ul,{children:[`
6
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B`,children:`Назначение и границы`})}),`
7
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8-%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82`,children:`Установка и импорт`})}),`
8
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#escapexmlvalue`,children:(0,c.jsx)(t.code,{children:`escapeXmlValue`})})}),`
9
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#buildxmlfields`,children:(0,c.jsx)(t.code,{children:`buildXmlFields`})})}),`
10
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#getxmltagtext`,children:(0,c.jsx)(t.code,{children:`getXmlTagText`})})}),`
11
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B8-%D0%BE%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F`,children:`Безопасность и ограничения`})}),`
12
+ `,(0,c.jsx)(t.li,{children:(0,c.jsx)(t.a,{href:`#api`,children:`API`})}),`
13
+ `]}),`
14
+ `,(0,c.jsx)(t.h2,{id:`назначение-и-границы`,children:`Назначение и границы`}),`
15
+ `,(0,c.jsx)(t.p,{children:`Подходит для небольших flat XML fragments:`}),`
16
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-xml`,children:`<ORDER_ID>42</ORDER_ID><COMMENT>A&amp;B</COMMENT>
17
+ `})}),`
18
+ `,(0,c.jsx)(t.p,{children:`Модуль не является полноценным XML builder/parser:`}),`
19
+ `,(0,c.jsxs)(t.ul,{children:[`
20
+ `,(0,c.jsx)(t.li,{children:`не строит document/envelope;`}),`
21
+ `,(0,c.jsx)(t.li,{children:`не управляет namespaces и attributes;`}),`
22
+ `,(0,c.jsx)(t.li,{children:`не валидирует XSD;`}),`
23
+ `,(0,c.jsx)(t.li,{children:`не обрабатывает коллекции/вложенные объекты;`}),`
24
+ `,(0,c.jsx)(t.li,{children:`не проверяет parser errors;`}),`
25
+ `,(0,c.jsx)(t.li,{children:`не выполняет network request.`}),`
26
+ `]}),`
27
+ `,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
28
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { buildXmlFields, escapeXmlValue, getXmlTagText } from "@ryuzaki13/react-foundation-lib/xml";
29
+
30
+ import type { XmlPrimitive } from "@ryuzaki13/react-foundation-lib/xml";
31
+ `})}),`
32
+ `,(0,c.jsxs)(t.p,{children:[`Builder-функции не требуют DOM. `,(0,c.jsx)(t.code,{children:`getXmlTagText`}),` требует global `,(0,c.jsx)(t.code,{children:`DOMParser`}),`, доступный в браузере/jsdom, но обычно отсутствующий в чистом Node.js.`]}),`
33
+ `,(0,c.jsx)(t.h2,{id:`escapexmlvalue`,children:(0,c.jsx)(t.code,{children:`escapeXmlValue`})}),`
34
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`escapeXmlValue(\`a&b<c>d"e'f\`);
35
+ // "a&amp;b&lt;c&gt;d&quot;e&apos;f"
36
+ `})}),`
37
+ `,(0,c.jsx)(t.p,{children:`Тип входа:`}),`
38
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type XmlPrimitive = string | number | null | undefined;
39
+ `})}),`
40
+ `,(0,c.jsx)(t.p,{children:`Правила:`}),`
41
+ `,(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:`XML entity`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`&`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`&amp;`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`<`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`&lt;`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`>`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`&gt;`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`"`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`&quot;`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`'`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`&apos;`})})]})]})]}),`
42
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`null`}),` и `,(0,c.jsx)(t.code,{children:`undefined`}),` превращаются в пустую строку. Number сначала преобразуется через `,(0,c.jsx)(t.code,{children:`String`}),`.`]}),`
43
+ `,(0,c.jsx)(t.p,{children:`Функция предназначена для текстового содержимого. Для attribute value она экранирует основные символы, но сам attribute builder модуль не предоставляет.`}),`
44
+ `,(0,c.jsx)(t.p,{children:`Не передавайте уже экранированную строку повторно:`}),`
45
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`escapeXmlValue("A&amp;B"); // "A&amp;amp;B".
46
+ `})}),`
47
+ `,(0,c.jsx)(t.h2,{id:`buildxmlfields`,children:(0,c.jsx)(t.code,{children:`buildXmlFields`})}),`
48
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const xml = buildXmlFields({
49
+ ORDER_ID: 42,
50
+ COMMENT: "A&B",
51
+ OPTIONAL: null
52
+ });
53
+
54
+ // <ORDER_ID>42</ORDER_ID><COMMENT>A&amp;B</COMMENT><OPTIONAL></OPTIONAL>
55
+ `})}),`
56
+ `,(0,c.jsx)(t.p,{children:`Функция:`}),`
57
+ `,(0,c.jsxs)(t.ul,{children:[`
58
+ `,(0,c.jsxs)(t.li,{children:[`обходит `,(0,c.jsx)(t.code,{children:`Object.entries`}),` в стандартном порядке ключей;`]}),`
59
+ `,(0,c.jsxs)(t.li,{children:[`строит для каждого поля `,(0,c.jsx)(t.code,{children:`<NAME>escaped value</NAME>`}),`;`]}),`
60
+ `,(0,c.jsx)(t.li,{children:`не добавляет переносы строк;`}),`
61
+ `,(0,c.jsxs)(t.li,{children:[`сохраняет поля с `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),` как пустые теги;`]}),`
62
+ `,(0,c.jsx)(t.li,{children:`не изменяет исходный объект.`}),`
63
+ `]}),`
64
+ `,(0,c.jsx)(t.p,{children:`Имя тега вставляется без валидации и escaping. Ключи должны быть доверенными валидными XML names из программного contract:`}),`
65
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Нельзя строить key из пользовательского ввода.
66
+ buildXmlFields({ [userProvidedTagName]: value });
67
+ `})}),`
68
+ `,(0,c.jsxs)(t.p,{children:[`Для вложенной структуры передайте уже собранный fragment как часть внешнего builder-а; `,(0,c.jsx)(t.code,{children:`buildXmlFields`}),` сам воспринимает строку как текст и экранирует markup.`]}),`
69
+ `,(0,c.jsx)(t.h2,{id:`getxmltagtext`,children:(0,c.jsx)(t.code,{children:`getXmlTagText`})}),`
70
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const message = getXmlTagText("<root><EX_MESSAGE> Ошибка </EX_MESSAGE></root>", "EX_MESSAGE");
71
+
72
+ console.log(message); // "Ошибка".
73
+ `})}),`
74
+ `,(0,c.jsx)(t.p,{children:`Алгоритм:`}),`
75
+ `,(0,c.jsxs)(t.ol,{children:[`
76
+ `,(0,c.jsxs)(t.li,{children:[`Парсит всю строку как `,(0,c.jsx)(t.code,{children:`application/xml`}),`.`]}),`
77
+ `,(0,c.jsxs)(t.li,{children:[`Вызывает `,(0,c.jsx)(t.code,{children:`getElementsByTagName(tagName)`}),`.`]}),`
78
+ `,(0,c.jsx)(t.li,{children:`Берёт только первый найденный element.`}),`
79
+ `,(0,c.jsxs)(t.li,{children:[`Читает объединённый `,(0,c.jsx)(t.code,{children:`textContent`}),`.`]}),`
80
+ `,(0,c.jsx)(t.li,{children:`Обрезает пробелы.`}),`
81
+ `,(0,c.jsxs)(t.li,{children:[`Возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, если элемента/непустого текста нет.`]}),`
82
+ `]}),`
83
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`getXmlTagText("<root />", "MESSAGE"); // undefined.
84
+ getXmlTagText("<root><MESSAGE> </MESSAGE></root>", "MESSAGE"); // undefined.
85
+ `})}),`
86
+ `,(0,c.jsxs)(t.p,{children:[`Для namespace-sensitive XML точное поведение `,(0,c.jsx)(t.code,{children:`getElementsByTagName`}),` зависит от переданного имени. Модуль не предоставляет `,(0,c.jsx)(t.code,{children:`getElementsByTagNameNS`}),`.`]}),`
87
+ `,(0,c.jsx)(t.h2,{id:`безопасность-и-ограничения`,children:`Безопасность и ограничения`}),`
88
+ `,(0,c.jsxs)(t.ul,{children:[`
89
+ `,(0,c.jsxs)(t.li,{children:[`Не вставляйте результат XML в HTML DOM через `,(0,c.jsx)(t.code,{children:`innerHTML`}),`.`]}),`
90
+ `,(0,c.jsx)(t.li,{children:`Не используйте dynamic tag names из недоверенного ввода.`}),`
91
+ `,(0,c.jsxs)(t.li,{children:[`Parser не проверяется на `,(0,c.jsx)(t.code,{children:`<parsererror>`}),`; malformed XML обычно даёт `,(0,c.jsx)(t.code,{children:`undefined`}),` или parser-specific tree, а не явное исключение этого helper.`]}),`
92
+ `,(0,c.jsx)(t.li,{children:`Читается только первое совпадение.`}),`
93
+ `,(0,c.jsx)(t.li,{children:`Большие documents лучше разбирать специализированным parser/streaming boundary.`}),`
94
+ `,(0,c.jsx)(t.li,{children:`Модуль не предотвращает XML signature wrapping и не предназначен для security validation.`}),`
95
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`XmlPrimitive`}),` number допускает `,(0,c.jsx)(t.code,{children:`NaN`}),`/`,(0,c.jsx)(t.code,{children:`Infinity`}),` на уровне TypeScript; они станут строками `,(0,c.jsx)(t.code,{children:`"NaN"`}),`/`,(0,c.jsx)(t.code,{children:`"Infinity"`}),`.`]}),`
96
+ `]}),`
97
+ `,(0,c.jsx)(t.h2,{id:`api`,children:`API`}),`
98
+ `,(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:`escapeXmlValue`})}),(0,c.jsx)(t.td,{children:`Экранированная строка`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`buildXmlFields`})}),(0,c.jsx)(t.td,{children:`Компактный XML fragment`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getXmlTagText`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`string | undefined`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`XmlPrimitive`})}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`string | number | null | undefined`})})]})]})]})]})}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};