@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,583 @@
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`,h3:`h3`,li:`li`,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 API/Query/Generic Resource`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`generic-resources-через-ryuzaki13react-foundation-apiresource`,children:[`Generic resources через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/resource`})]}),`
3
+ `,(0,c.jsx)(t.p,{children:`Модуль описывает transport-agnostic ресурс поверх TanStack Query: стабильные query keys, проверку scope, произвольные read/write operations и cache strategies после mutation.`}),`
4
+ `,(0,c.jsx)(t.h2,{id:`для-кого-этот-документ`,children:`Для кого этот документ`}),`
5
+ `,(0,c.jsx)(t.p,{children:`Здесь термины используются так:`}),`
6
+ `,(0,c.jsxs)(t.ul,{children:[`
7
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`resource`}),` — технически связанная группа данных, например `,(0,c.jsx)(t.code,{children:`orders`}),`;`]}),`
8
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`scope`}),` — контекст, внутри которого данные уникальны, например `,(0,c.jsx)(t.code,{children:`{ companyId }`}),`;`]}),`
9
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`query/read operation`}),` — чтение без изменения server state;`]}),`
10
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`mutation/write operation`}),` — создание/изменение/удаление;`]}),`
11
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`descriptor`}),` — объект, объединяющий identity, operations и правила доступности;`]}),`
12
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.strong,{children:`query key`}),` — сериализуемый identity записи в TanStack Query cache.`]}),`
13
+ `]}),`
14
+ `,(0,c.jsxs)(t.p,{children:[`Модуль не выполняет HTTP/OData сам. Transport находится внутри `,(0,c.jsx)(t.code,{children:`operation.execute`}),` или создаётся adapter-ом `,(0,c.jsx)(t.code,{children:`/server-fn`}),`.`]}),`
15
+ `,(0,c.jsx)(t.h2,{id:`когда-использовать`,children:`Когда использовать`}),`
16
+ `,(0,c.jsxs)(t.p,{children:[`Используйте `,(0,c.jsx)(t.code,{children:`/resource`}),`, когда названия операций произвольны: `,(0,c.jsx)(t.code,{children:`search`}),`, `,(0,c.jsx)(t.code,{children:`detail`}),`, `,(0,c.jsx)(t.code,{children:`archive`}),`, `,(0,c.jsx)(t.code,{children:`recalculate`}),`.`]}),`
17
+ `,(0,c.jsxs)(t.p,{children:[`Для стандартной модели сохранённых записей `,(0,c.jsx)(t.code,{children:`list/latest/history/save/create/delete`}),` удобнее `,(0,c.jsx)(t.a,{href:`../persisted/README.mdx`,children:(0,c.jsx)(t.code,{children:`/persisted`})}),`.`]}),`
18
+ `,(0,c.jsxs)(t.p,{children:[`Не используйте `,(0,c.jsx)(t.code,{children:`/resource`}),`, если нужен один приватный request в одной feature и descriptor не даёт повторного использования. Абстракция полезна, когда resource имеет устойчивое имя, несколько consumers/operations и общую cache policy.`]}),`
19
+ `,(0,c.jsx)(t.h2,{id:`ментальная-модель`,children:`Ментальная модель`}),`
20
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`Descriptor
21
+ ├── namespace + resource ───────────────► base query key
22
+ ├── scope policy ───────────────────────► можно ли выполнять operation
23
+ ├── query operations
24
+ │ ├── search(args) ───────────────────► Promise<SearchResult>
25
+ │ └── detail(args) ───────────────────► Promise<Order>
26
+ └── mutation operations
27
+ ├── save(input) ────────────────────► Promise<Order>
28
+ └── archive(input) ─────────────────► Promise<void>
29
+
30
+
31
+ cache strategy
32
+ `})}),`
33
+ `,(0,c.jsx)(t.p,{children:`Descriptor не хранит данные. Данные хранятся в QueryClient по keys descriptor-а.`}),`
34
+ `,(0,c.jsx)(t.h3,{id:`что-является-identity`,children:`Что является identity`}),`
35
+ `,(0,c.jsx)(t.p,{children:`Для query:`}),`
36
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`namespace + resource + normalized scope + operation name + normalized args
37
+ `})}),`
38
+ `,(0,c.jsx)(t.p,{children:`Для mutation key:`}),`
39
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`namespace + resource + normalized scope + operation name
40
+ `})}),`
41
+ `,(0,c.jsxs)(t.p,{children:[`Mutation input в key не входит. Он передаётся `,(0,c.jsx)(t.code,{children:`mutationFn`}),` в момент `,(0,c.jsx)(t.code,{children:`mutate(input)`}),`.`]}),`
42
+ `,(0,c.jsx)(t.h3,{id:`query-cache--server-snapshot`,children:`Query cache — server snapshot`}),`
43
+ `,(0,c.jsx)(t.p,{children:`Query data — копия последнего известного server state. Не редактируйте её как form draft:`}),`
44
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Нельзя: in-place mutation cache object.
45
+ query.data.title = draftTitle;
46
+ `})}),`
47
+ `,(0,c.jsx)(t.p,{children:`Draft формы должен быть отдельным state. После save cache synchronizes через strategy.`}),`
48
+ `,(0,c.jsx)(t.h2,{id:`установка-и-provider`,children:`Установка и provider`}),`
49
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-api @ryuzaki13/react-foundation-lib @tanstack/react-query react
50
+ `})}),`
51
+ `,(0,c.jsxs)(t.p,{children:[`React hooks работают только внутри `,(0,c.jsx)(t.code,{children:`QueryClientProvider`}),`:`]}),`
52
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
53
+
54
+ const queryClient = new QueryClient();
55
+
56
+ export function App() {
57
+ return <QueryClientProvider client={queryClient}>{/* routes */}</QueryClientProvider>;
58
+ }
59
+ `})}),`
60
+ `,(0,c.jsx)(t.p,{children:`Создайте client один раз, а не внутри render.`}),`
61
+ `,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
62
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
63
+ applyResourceCacheStrategy,
64
+ buildResourceQueryOptions,
65
+ composeResourceCacheStrategies,
66
+ createInvalidateResourceScopeCacheStrategy,
67
+ createResourceDescriptor,
68
+ createResourceKeys,
69
+ createResourceMutationOperation,
70
+ createResourceQueryOperation,
71
+ createSetResourceQueryDataCacheStrategy,
72
+ getResourceQueryData,
73
+ normalizeResourceKeyValue,
74
+ useResourceMutation,
75
+ useResourceQuery
76
+ } from "@ryuzaki13/react-foundation-api/resource";
77
+ `})}),`
78
+ `,(0,c.jsx)(t.p,{children:`Типы экспортируются из того же subpath.`}),`
79
+ `,(0,c.jsx)(t.h2,{id:`пошаговый-пример`,children:`Пошаговый пример`}),`
80
+ `,(0,c.jsx)(t.h3,{id:`1-описать-scope-и-данные`,children:`1. Описать scope и данные`}),`
81
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type OrdersScope = {
82
+ companyId: string;
83
+ };
84
+
85
+ type SearchOrdersArgs = {
86
+ search: string;
87
+ limit: number;
88
+ };
89
+
90
+ type Order = {
91
+ id: string;
92
+ title: string;
93
+ };
94
+
95
+ type SaveOrderInput = {
96
+ id: string;
97
+ title: string;
98
+ };
99
+ `})}),`
100
+ `,(0,c.jsx)(t.h3,{id:`2-создать-operations`,children:`2. Создать operations`}),`
101
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const searchOperation = createResourceQueryOperation<
102
+ OrdersScope,
103
+ SearchOrdersArgs,
104
+ Order[]
105
+ >({
106
+ async execute({ scope, args, signal }) {
107
+ const query = new URLSearchParams({
108
+ companyId: scope.companyId,
109
+ search: args.search,
110
+ limit: String(args.limit)
111
+ });
112
+
113
+ const response = await fetch(\`/api/orders?\${query}\`, { signal });
114
+ if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
115
+ return response.json() as Promise<Order[]>;
116
+ },
117
+ isEnabled: (scope, args) => Boolean(scope?.companyId && args.limit > 0),
118
+ staleTime: 60_000,
119
+ gcTime: 5 * 60_000
120
+ });
121
+
122
+ const saveOperation = createResourceMutationOperation<
123
+ OrdersScope,
124
+ SaveOrderInput,
125
+ Order,
126
+ unknown
127
+ >({
128
+ async execute({ scope, input }) {
129
+ const response = await fetch(\`/api/companies/\${scope.companyId}/orders/\${input.id}\`, {
130
+ method: "PUT",
131
+ headers: { "Content-Type": "application/json" },
132
+ body: JSON.stringify(input)
133
+ });
134
+
135
+ if (!response.ok) throw new Error(\`HTTP \${response.status}\`);
136
+ return response.json() as Promise<Order>;
137
+ }
138
+ });
139
+ `})}),`
140
+ `,(0,c.jsxs)(t.p,{children:[`Factories `,(0,c.jsx)(t.code,{children:`createResourceQueryOperation`}),` и `,(0,c.jsx)(t.code,{children:`createResourceMutationOperation`}),` не изменяют объект. Они помогают TypeScript сохранить generic types.`]}),`
141
+ `,(0,c.jsx)(t.p,{children:`Они также не добавляют retry, validation, transport headers или cache behavior. Всё перечисленное должно быть явно в operation/adapter/QueryClient policy.`}),`
142
+ `,(0,c.jsx)(t.h3,{id:`query-operation-contract`,children:`Query operation contract`}),`
143
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface ResourceQueryOperation<TScope, TArgs, TResult> {
144
+ execute(context: {
145
+ scope: TScope;
146
+ args: TArgs;
147
+ client: QueryClient;
148
+ signal?: AbortSignal;
149
+ }): Promise<TResult>;
150
+ isEnabled?(scope: TScope | null | undefined, args: TArgs): boolean;
151
+ readonly staleTime?: number;
152
+ readonly gcTime?: number;
153
+ }
154
+ `})}),`
155
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`client`}),` позволяет operation переиспользовать другие query snapshots или metadata. Не создавайте новый QueryClient внутри execute.`]}),`
156
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`signal`}),` нужно передавать transport-у:`]}),`
157
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const response = await fetch(url, { signal });
158
+ `})}),`
159
+ `,(0,c.jsx)(t.h3,{id:`mutation-operation-contract`,children:`Mutation operation contract`}),`
160
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface ResourceMutationOperation<TScope, TInput, TResult, TDescriptor> {
161
+ execute(context: {
162
+ scope: TScope;
163
+ input: TInput;
164
+ client: QueryClient;
165
+ }): Promise<TResult>;
166
+ readonly cacheStrategy?: ResourceCacheStrategy<
167
+ TScope,
168
+ TInput,
169
+ TResult,
170
+ TDescriptor
171
+ >;
172
+ }
173
+ `})}),`
174
+ `,(0,c.jsx)(t.p,{children:`Generic mutation contract не содержит AbortSignal. Не обещайте automatic cancellation mutation.`}),`
175
+ `,(0,c.jsx)(t.h3,{id:`3-создать-descriptor`,children:`3. Создать descriptor`}),`
176
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const ordersResource = createResourceDescriptor({
177
+ namespace: "sales",
178
+ resource: "orders",
179
+ normalizeScope: (scope: OrdersScope | null | undefined) => ({
180
+ companyId: scope?.companyId.trim() ?? ""
181
+ }),
182
+ operations: {
183
+ queries: { search: searchOperation },
184
+ mutations: { save: saveOperation }
185
+ },
186
+ isEnabled: (scope) => Boolean(scope?.companyId),
187
+ getScopeError: () => "Не выбрана компания"
188
+ });
189
+ `})}),`
190
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`namespace + resource`}),` должны быть устойчивыми и уникальными. Не включайте локализованные labels или случайные значения.`]}),`
191
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`normalizeScope`}),` влияет только на query key. В `,(0,c.jsx)(t.code,{children:`execute`}),` приходит исходный literal scope. Например, key получит trimmed `,(0,c.jsx)(t.code,{children:`companyId`}),`, но operation увидит строку ровно в переданном object. Это позволяет нормализовать identity, не переписывая draft/input.`]}),`
192
+ `,(0,c.jsx)(t.h3,{id:`поля-descriptor-а`,children:`Поля descriptor-а`}),`
193
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Поле`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`namespace`})}),(0,c.jsxs)(t.td,{children:[`Верхний технический namespace keys, например `,(0,c.jsx)(t.code,{children:`sales`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`resource`})}),(0,c.jsxs)(t.td,{children:[`Устойчивое имя resource, например `,(0,c.jsx)(t.code,{children:`orders`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`operations.queries`})}),(0,c.jsx)(t.td,{children:`Record read operations с произвольными names`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`operations.mutations`})}),(0,c.jsx)(t.td,{children:`Record write operations`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`keys`})}),(0,c.jsx)(t.td,{children:`Custom key factory или generated factory`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`normalizeScope`})}),(0,c.jsx)(t.td,{children:`Настройка generated key factory`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`isEnabled`})}),(0,c.jsx)(t.td,{children:`Общая доступность resource scope`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getScopeError`})}),(0,c.jsx)(t.td,{children:`Error message для фактического execute invalid scope`})]})]})]}),`
194
+ `,(0,c.jsx)(t.p,{children:`Operations можно опустить с одной стороны:`}),`
195
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createResourceDescriptor({
196
+ namespace: "catalog",
197
+ resource: "countries",
198
+ operations: {
199
+ queries: { list: listCountriesOperation }
200
+ }
201
+ });
202
+ `})}),`
203
+ `,(0,c.jsx)(t.p,{children:`В runtime отсутствующая группа превращается в пустой object.`}),`
204
+ `,(0,c.jsx)(t.h3,{id:`descriptor-создаётся-один-раз`,children:`Descriptor создаётся один раз`}),`
205
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// На уровне module — правильно.
206
+ export const ordersResource = createResourceDescriptor(...);
207
+ `})}),`
208
+ `,(0,c.jsx)(t.p,{children:`Не создавайте его внутри component render: descriptor и callbacks должны иметь устойчивую identity, а module-level definition проще тестировать и переиспользовать.`}),`
209
+ `,(0,c.jsx)(t.h3,{id:`4-использовать-query-hook`,children:`4. Использовать query hook`}),`
210
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`function OrdersList({ companyId, search }: Props) {
211
+ const query = useResourceQuery(
212
+ ordersResource,
213
+ "search",
214
+ { companyId },
215
+ { search, limit: 50 }
216
+ );
217
+
218
+ if (query.isPending) return <p>Загрузка…</p>;
219
+ if (query.isError) return <p>Ошибка загрузки</p>;
220
+
221
+ return query.data.map((order) => <div key={order.id}>{order.title}</div>);
222
+ }
223
+ `})}),`
224
+ `,(0,c.jsx)(t.p,{children:`Rules of Hooks применяются полностью: hook нельзя вызывать условно или в callback.`}),`
225
+ `,(0,c.jsx)(t.h3,{id:`5-использовать-mutation-hook`,children:`5. Использовать mutation hook`}),`
226
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-tsx`,children:`const mutation = useResourceMutation(
227
+ ordersResource,
228
+ "save",
229
+ { companyId },
230
+ {
231
+ onSuccess(savedOrder) {
232
+ showSuccess(\`Сохранён \${savedOrder.title}\`);
233
+ }
234
+ }
235
+ );
236
+
237
+ mutation.mutate({ id: "42", title: "Новый заголовок" });
238
+ `})}),`
239
+ `,(0,c.jsxs)(t.p,{children:[`Mutation key содержит resource/scope/operation, но не input. Input передаётся только в `,(0,c.jsx)(t.code,{children:`mutationFn`}),`.`]}),`
240
+ `,(0,c.jsx)(t.h3,{id:`несколько-одновременных-mutations`,children:`Несколько одновременных mutations`}),`
241
+ `,(0,c.jsxs)(t.p,{children:[`Две `,(0,c.jsx)(t.code,{children:`save`}),` mutations одного scope имеют одинаковый mutation key, но разные inputs и отдельные mutation instances. Mutation key группирует operations для наблюдения/diagnostics; это не Query cache slot с data.`]}),`
242
+ `,(0,c.jsxs)(t.h3,{id:`scope-проверяется-при-mutate`,children:[`Scope проверяется при `,(0,c.jsx)(t.code,{children:`mutate`})]}),`
243
+ `,(0,c.jsxs)(t.p,{children:[`Hook можно создать с nullable scope, но actual mutation вызовет `,(0,c.jsx)(t.code,{children:`assertResourceScope`}),`. Если scope invalid, server execute не начнётся и mutation получит error.`]}),`
244
+ `,(0,c.jsx)(t.h2,{id:`query-lifecycle`,children:`Query lifecycle`}),`
245
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildResourceQueryOptions(descriptor, name, scope, args)`}),` создаёт TanStack `,(0,c.jsx)(t.code,{children:`queryOptions`}),`:`]}),`
246
+ `,(0,c.jsxs)(t.ul,{children:[`
247
+ `,(0,c.jsxs)(t.li,{children:[`key из `,(0,c.jsx)(t.code,{children:`descriptor.keys.operation`}),`;`]}),`
248
+ `,(0,c.jsxs)(t.li,{children:[`query function с `,(0,c.jsx)(t.code,{children:`{ scope, args, client, signal }`}),`;`]}),`
249
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`enabled`}),` из descriptor и operation;`]}),`
250
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`staleTime`}),`/`,(0,c.jsx)(t.code,{children:`gcTime`}),` из operation.`]}),`
251
+ `]}),`
252
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const options = buildResourceQueryOptions(
253
+ ordersResource,
254
+ "search",
255
+ { companyId: "1000" },
256
+ { search: "", limit: 50 }
257
+ );
258
+ `})}),`
259
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`enabled`}),` сначала проверяет `,(0,c.jsx)(t.code,{children:`descriptor.isEnabled(scope)`}),`, затем `,(0,c.jsx)(t.code,{children:`operation.isEnabled(scope, args)`}),`. Если одна проверка вернула `,(0,c.jsx)(t.code,{children:`false`}),`, React query не стартует автоматически.`]}),`
260
+ `,(0,c.jsxs)(t.p,{children:[`Перед фактическим `,(0,c.jsx)(t.code,{children:`execute`}),` scope обязан быть не `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),` и пройти descriptor policy. Иначе выбрасывается `,(0,c.jsx)(t.code,{children:`getScopeError`}),` или стандартная ошибка.`]}),`
261
+ `,(0,c.jsx)(t.h3,{id:`критическое-правило-nullable-scope`,children:`Критическое правило nullable scope`}),`
262
+ `,(0,c.jsxs)(t.p,{children:[`Если scope может быть `,(0,c.jsx)(t.code,{children:`null`}),`/`,(0,c.jsx)(t.code,{children:`undefined`}),`, descriptor обязан иметь `,(0,c.jsx)(t.code,{children:`isEnabled`}),`:`]}),`
263
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isEnabled: (scope) => Boolean(scope?.companyId)
264
+ `})}),`
265
+ `,(0,c.jsxs)(t.p,{children:[`Без него default enabled равен `,(0,c.jsx)(t.code,{children:`true`}),`, даже для `,(0,c.jsx)(t.code,{children:`undefined`}),`. TanStack Query попытается запустить query, а query function выбросит scope error.`]}),`
266
+ `,(0,c.jsxs)(t.p,{children:[`Operation-level `,(0,c.jsx)(t.code,{children:`isEnabled`}),` не заменяет общую scope policy, хотя тоже может проверить scope. Хорошая структура:`]}),`
267
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isEnabled: (scope) => Boolean(scope?.companyId),
268
+
269
+ // В operation:
270
+ isEnabled: (_scope, args) => args.limit > 0 && args.search.length >= 2
271
+ `})}),`
272
+ `,(0,c.jsx)(t.h3,{id:`стандартная-scope-error`,children:`Стандартная scope error`}),`
273
+ `,(0,c.jsxs)(t.p,{children:[`Если custom `,(0,c.jsx)(t.code,{children:`getScopeError`}),` отсутствует:`]}),`
274
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`Недостаточно данных scope для ресурса 'orders'.
275
+ `})}),`
276
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`getScopeError`}),` вызывается только при попытке actual execution invalid scope. Возвращаемое `,(0,c.jsx)(t.code,{children:`null`}),` приводит к standard fallback из-за `,(0,c.jsx)(t.code,{children:`??`}),`.`]}),`
277
+ `,(0,c.jsx)(t.h3,{id:`отсутствующая-operation`,children:`Отсутствующая operation`}),`
278
+ `,(0,c.jsx)(t.p,{children:`При неверном runtime descriptor-е error возникает до transport:`}),`
279
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`Ресурс 'orders' не поддерживает read-операцию 'detail'.
280
+ `})}),`
281
+ `,(0,c.jsxs)(t.p,{children:[`Runtime guard проверяет object и callable `,(0,c.jsx)(t.code,{children:`execute`}),`. TypeScript обычно ловит неверное name раньше, если descriptor types сохранены.`]}),`
282
+ `,(0,c.jsxs)(t.h3,{id:`staletime-и-gctime`,children:[(0,c.jsx)(t.code,{children:`staleTime`}),` и `,(0,c.jsx)(t.code,{children:`gcTime`})]}),`
283
+ `,(0,c.jsx)(t.p,{children:`Значения просто передаются TanStack Query:`}),`
284
+ `,(0,c.jsxs)(t.ul,{children:[`
285
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`staleTime`}),` не является HTTP TTL;`]}),`
286
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`gcTime`}),` отсчитывается для неактивного query;`]}),`
287
+ `,(0,c.jsx)(t.li,{children:`отсутствие значения означает default QueryClient policy;`}),`
288
+ `,(0,c.jsx)(t.li,{children:`они не влияют на mutation.`}),`
289
+ `]}),`
290
+ `,(0,c.jsx)(t.h2,{id:`императивная-загрузка`,children:`Императивная загрузка`}),`
291
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const orders = await getResourceQueryData(
292
+ ordersResource,
293
+ "search",
294
+ { companyId: "1000" },
295
+ { search: "", limit: 50 },
296
+ queryClient
297
+ );
298
+ `})}),`
299
+ `,(0,c.jsxs)(t.p,{children:[`Функция использует `,(0,c.jsx)(t.code,{children:`queryClient.fetchQuery`}),`, поэтому переиспользует query cache. Передавайте только валидный scope: imperative `,(0,c.jsx)(t.code,{children:`fetchQuery`}),` нельзя воспринимать как disabled React observer; query function всё равно защищает scope и может бросить ошибку.`]}),`
300
+ `,(0,c.jsx)(t.h3,{id:`loaderpreload`,children:`Loader/preload`}),`
301
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`export async function loadOrdersRoute({
302
+ companyId,
303
+ queryClient
304
+ }: {
305
+ companyId: string;
306
+ queryClient: QueryClient;
307
+ }) {
308
+ return getResourceQueryData(
309
+ ordersResource,
310
+ "search",
311
+ { companyId },
312
+ { search: "", limit: 50 },
313
+ queryClient
314
+ );
315
+ }
316
+ `})}),`
317
+ `,(0,c.jsx)(t.p,{children:`Component с теми же exact inputs получит тот же query key и переиспользует snapshot.`}),`
318
+ `,(0,c.jsx)(t.h2,{id:`query-keys`,children:`Query keys`}),`
319
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const keys = createResourceKeys<OrdersScope, "search" | "save">({
320
+ namespace: "sales",
321
+ resource: "orders",
322
+ normalizeScope: (scope) => ({ companyId: scope?.companyId ?? "" })
323
+ });
324
+
325
+ keys.all;
326
+ // ["sales", "orders"]
327
+
328
+ keys.scope({ companyId: "1000" });
329
+ // ["sales", "orders", { companyId: "1000" }]
330
+
331
+ keys.operation("search", { companyId: "1000" }, { limit: 50 });
332
+ // ["sales", "orders", { companyId: "1000" }, "search", { limit: 50 }]
333
+ `})}),`
334
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`args === undefined`}),` не добавляется в key. `,(0,c.jsx)(t.code,{children:`args === null`}),` добавляется как `,(0,c.jsx)(t.code,{children:`null`}),`.`]}),`
335
+ `,(0,c.jsx)(t.h3,{id:`normalizeresourcekeyvalue`,children:(0,c.jsx)(t.code,{children:`normalizeResourceKeyValue`})}),`
336
+ `,(0,c.jsx)(t.p,{children:`Нормализация рекурсивна:`}),`
337
+ `,(0,c.jsxs)(t.ul,{children:[`
338
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`null`}),` и `,(0,c.jsx)(t.code,{children:`undefined`}),` → `,(0,c.jsx)(t.code,{children:`null`}),`;`]}),`
339
+ `,(0,c.jsxs)(t.li,{children:[`string → `,(0,c.jsx)(t.code,{children:`trim()`}),`;`]}),`
340
+ `,(0,c.jsx)(t.li,{children:`number/boolean остаются без изменения;`}),`
341
+ `,(0,c.jsx)(t.li,{children:`array нормализуется по элементам, порядок сохраняется;`}),`
342
+ `,(0,c.jsx)(t.li,{children:`object keys сортируются, значения нормализуются;`}),`
343
+ `,(0,c.jsxs)(t.li,{children:[`другие значения превращаются через `,(0,c.jsx)(t.code,{children:`String(value)`}),`.`]}),`
344
+ `]}),`
345
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`normalizeResourceKeyValue({ b: " x ", a: undefined });
346
+ // { a: null, b: "x" }
347
+ `})}),`
348
+ `,(0,c.jsx)(t.p,{children:`Ограничения:`}),`
349
+ `,(0,c.jsxs)(t.ul,{children:[`
350
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Date`}),`, `,(0,c.jsx)(t.code,{children:`Map`}),`, `,(0,c.jsx)(t.code,{children:`Set`}),` и class instances не имеют специальной сериализации; обычный `,(0,c.jsx)(t.code,{children:`Date`}),` превратится в `,(0,c.jsx)(t.code,{children:`{}`}),`;`]}),`
351
+ `,(0,c.jsx)(t.li,{children:`cyclic object приведёт к рекурсивной ошибке;`}),`
352
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`NaN`}),`/`,(0,c.jsx)(t.code,{children:`Infinity`}),` остаются number, но их cache semantics могут быть неочевидны;`]}),`
353
+ `,(0,c.jsx)(t.li,{children:`function/symbol/bigint превращаются в строки и могут collision-иться.`}),`
354
+ `]}),`
355
+ `,(0,c.jsx)(t.p,{children:`Нормализуйте специальные значения сами, например Date → ISO string. Query key не должен содержать secrets, DOM nodes или огромные payload.`}),`
356
+ `,(0,c.jsx)(t.h3,{id:`дополнительные-примеры-normalization`,children:`Дополнительные примеры normalization`}),`
357
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`normalizeResourceKeyValue(undefined);
358
+ // null
359
+
360
+ normalizeResourceKeyValue([" a ", undefined, false]);
361
+ // ["a", null, false]
362
+
363
+ normalizeResourceKeyValue({ z: 1, a: { b: " x " } });
364
+ // { a: { b: "x" }, z: 1 }
365
+
366
+ normalizeResourceKeyValue(new Date("2026-08-21T00:00:00Z"));
367
+ // {} — Date не поддерживается специально
368
+ `})}),`
369
+ `,(0,c.jsx)(t.h3,{id:`object-key-order`,children:`Object key order`}),`
370
+ `,(0,c.jsx)(t.p,{children:`Эти scopes создадут одинаковую normalized identity:`}),`
371
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{ companyId: "1000", plant: "1100" }
372
+ { plant: "1100", companyId: "1000" }
373
+ `})}),`
374
+ `,(0,c.jsx)(t.p,{children:`Object keys сортируются рекурсивно. Array order при этом значим:`}),`
375
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`["1000", "2000"] !== ["2000", "1000"]
376
+ `})}),`
377
+ `,(0,c.jsxs)(t.p,{children:[`Если array представляет set, отсортируйте его в `,(0,c.jsx)(t.code,{children:`normalizeScope`}),`/до args.`]}),`
378
+ `,(0,c.jsx)(t.h3,{id:`custom-keys`,children:`Custom keys`}),`
379
+ `,(0,c.jsxs)(t.p,{children:[`Можно передать полностью свою `,(0,c.jsx)(t.code,{children:`ResourceKeys`}),`, например для совместимости с существующей cache taxonomy. Factory обязана сохранять prefix semantics:`]}),`
380
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const keys = createResourceKeys<OrdersScope, "search" | "save">({
381
+ namespace: "sales-v2",
382
+ resource: "orders"
383
+ });
384
+
385
+ createResourceDescriptor({
386
+ // ...
387
+ keys
388
+ });
389
+ `})}),`
390
+ `,(0,c.jsxs)(t.p,{children:[`Не собирайте key ad hoc в cache strategy: используйте `,(0,c.jsx)(t.code,{children:`descriptor.keys`}),`.`]}),`
391
+ `,(0,c.jsx)(t.h2,{id:`cache-strategies-после-mutation`,children:`Cache strategies после mutation`}),`
392
+ `,(0,c.jsx)(t.h3,{id:`инвалидация-scope`,children:`Инвалидация scope`}),`
393
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const invalidateScope = createInvalidateResourceScopeCacheStrategy();
394
+ `})}),`
395
+ `,(0,c.jsxs)(t.p,{children:[`Стратегия вызывает `,(0,c.jsx)(t.code,{children:`client.invalidateQueries`}),` по `,(0,c.jsx)(t.code,{children:`descriptor.keys.scope(scope)`}),`. Все query этого resource/scope становятся stale и активные observers могут refetch.`]}),`
396
+ `,(0,c.jsxs)(t.h3,{id:`точечный-setquerydata`,children:[`Точечный `,(0,c.jsx)(t.code,{children:`setQueryData`})]}),`
397
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const updateDetail = createSetResourceQueryDataCacheStrategy<
398
+ OrdersScope,
399
+ SaveOrderInput,
400
+ Order,
401
+ Order[],
402
+ typeof ordersResource
403
+ >({
404
+ getQueryKey: ({ descriptor, scope }) =>
405
+ descriptor.keys.operation("search", scope, { search: "", limit: 50 }),
406
+ update: (current = [], { result }) =>
407
+ current.map((order) => (order.id === result.id ? result : order))
408
+ });
409
+ `})}),`
410
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`update`}),` получает текущее cache data или `,(0,c.jsx)(t.code,{children:`undefined`}),`, а также descriptor/scope/input/result/client. Оно должно возвращать новое значение и не мутировать старое.`]}),`
411
+ `,(0,c.jsx)(t.h3,{id:`композиция`,children:`Композиция`}),`
412
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const strategy = composeResourceCacheStrategies(
413
+ updateDetail,
414
+ invalidateScope
415
+ );
416
+ `})}),`
417
+ `,(0,c.jsxs)(t.p,{children:[`Strategies выполняются последовательно в переданном порядке. Если одна бросила ошибку, следующие и custom `,(0,c.jsx)(t.code,{children:`onSuccess`}),` mutation hook не выполнятся; сама server mutation при этом уже могла успешно завершиться.`]}),`
418
+ `,(0,c.jsx)(t.h3,{id:`override-в-hook`,children:`Override в hook`}),`
419
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`useResourceMutation(descriptor, "save", scope, {
420
+ cacheStrategy: undefined // Использовать strategy операции.
421
+ });
422
+
423
+ useResourceMutation(descriptor, "save", scope, {
424
+ cacheStrategy: null // Полностью отключить strategy операции.
425
+ });
426
+ `})}),`
427
+ `,(0,c.jsxs)(t.p,{children:[`Переданная strategy заменяет operation strategy, а не дополняет её. Для объединения используйте `,(0,c.jsx)(t.code,{children:`composeResourceCacheStrategies`}),`.`]}),`
428
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`applyResourceCacheStrategy(strategy, context)`}),` — низкоуровневый helper для ручного применения optional strategy.`]}),`
429
+ `,(0,c.jsx)(t.h3,{id:`полный-cache-context`,children:`Полный cache context`}),`
430
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`interface ResourceCacheStrategyContext<TScope, TInput, TResult, TDescriptor> {
431
+ readonly client: QueryClient;
432
+ readonly descriptor: TDescriptor;
433
+ readonly scope: TScope;
434
+ readonly input: TInput;
435
+ readonly result: TResult;
436
+ }
437
+ `})}),`
438
+ `,(0,c.jsx)(t.p,{children:`Strategy имеет все данные для точного key/update, но не должна содержать domain network side effects. Server write уже завершён.`}),`
439
+ `,(0,c.jsx)(t.h3,{id:`порядок-mutation-success`,children:`Порядок mutation success`}),`
440
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`operation.execute success
441
+
442
+
443
+ resolved scope повторно проверяется
444
+
445
+
446
+ selected cache strategy
447
+ │ await
448
+
449
+ hook options.onSuccess(result, input)
450
+ `})}),`
451
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`options.cacheStrategy`}),` выбирается так:`]}),`
452
+ `,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Значение`}),(0,c.jsx)(t.th,{children:`Поведение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`undefined`})}),(0,c.jsx)(t.td,{children:`Использовать strategy operation`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`null`})}),(0,c.jsx)(t.td,{children:`Не выполнять strategy`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`object`}),(0,c.jsx)(t.td,{children:`Полностью заменить operation strategy`})]})]})]}),`
453
+ `,(0,c.jsx)(t.h3,{id:`invalidate-или-set-data`,children:`Invalidate или set data`}),`
454
+ `,(0,c.jsx)(t.p,{children:`Используйте invalidation, если server:`}),`
455
+ `,(0,c.jsxs)(t.ul,{children:[`
456
+ `,(0,c.jsx)(t.li,{children:`вычисляет дополнительные fields;`}),`
457
+ `,(0,c.jsx)(t.li,{children:`меняет сортировку/агрегации;`}),`
458
+ `,(0,c.jsx)(t.li,{children:`write затрагивает несколько неизвестных queries.`}),`
459
+ `]}),`
460
+ `,(0,c.jsxs)(t.p,{children:[`Используйте `,(0,c.jsx)(t.code,{children:`setQueryData`}),`, если response содержит authoritative готовую запись и точный key известен.`]}),`
461
+ `,(0,c.jsx)(t.p,{children:`Композиция полезна, когда detail можно обновить сразу, а lists безопаснее refetch-нуть.`}),`
462
+ `,(0,c.jsxs)(t.h3,{id:`current-data-может-быть-undefined`,children:[`Current data может быть `,(0,c.jsx)(t.code,{children:`undefined`})]}),`
463
+ `,(0,c.jsx)(t.p,{children:`Updater обязан это учесть:`}),`
464
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`update: (current, { result }) => {
465
+ if (!current) return [result];
466
+ return current.map((item) => item.id === result.id ? result : item);
467
+ }
468
+ `})}),`
469
+ `,(0,c.jsxs)(t.p,{children:[`Возвращайте новое значение. Не делайте `,(0,c.jsx)(t.code,{children:`current.push(...)`}),`.`]}),`
470
+ `,(0,c.jsx)(t.h3,{id:`ошибка-cache-strategy-после-server-success`,children:`Ошибка cache strategy после server success`}),`
471
+ `,(0,c.jsx)(t.p,{children:`Server mutation уже могла примениться. Если strategy бросила error:`}),`
472
+ `,(0,c.jsxs)(t.ul,{children:[`
473
+ `,(0,c.jsx)(t.li,{children:`следующие composed strategies не выполняются;`}),`
474
+ `,(0,c.jsxs)(t.li,{children:[`hook custom `,(0,c.jsx)(t.code,{children:`onSuccess`}),` не вызывается;`]}),`
475
+ `,(0,c.jsx)(t.li,{children:`caller может получить rejected async lifecycle.`}),`
476
+ `]}),`
477
+ `,(0,c.jsx)(t.p,{children:`Не повторяйте write автоматически только из-за cache error: это может создать duplicate. Разделяйте retry server operation и cache recovery.`}),`
478
+ `,(0,c.jsx)(t.h2,{id:`transport-adapters`,children:`Transport adapters`}),`
479
+ `,(0,c.jsx)(t.p,{children:`Generic operation может использовать:`}),`
480
+ `,(0,c.jsxs)(t.ul,{children:[`
481
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`/http`}),` для обычного REST;`]}),`
482
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`/odata`}),` для metadata-aware SAP operation;`]}),`
483
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`/server-fn`}),` для функций `,(0,c.jsx)(t.code,{children:`{ data }`}),`;`]}),`
484
+ `,(0,c.jsx)(t.li,{children:`тестовый in-memory executor.`}),`
485
+ `]}),`
486
+ `,(0,c.jsx)(t.p,{children:`Resource не должен знать бизнес transport автоматически. Это позволяет одному descriptor pattern работать с разными infrastructures без смешивания contracts.`}),`
487
+ `,(0,c.jsx)(t.h2,{id:`тестирование`,children:`Тестирование`}),`
488
+ `,(0,c.jsx)(t.h3,{id:`key-factory`,children:`Key factory`}),`
489
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`it("нормализует scope и args", () => {
490
+ const key = ordersResource.keys.operation(
491
+ "search",
492
+ { companyId: " 1000 " },
493
+ { limit: 50, search: " test " }
494
+ );
495
+
496
+ expect(key).toEqual([
497
+ "sales",
498
+ "orders",
499
+ { companyId: "1000" },
500
+ "search",
501
+ { limit: 50, search: "test" }
502
+ ]);
503
+ });
504
+ `})}),`
505
+ `,(0,c.jsx)(t.h3,{id:`query-operation-context`,children:`Query operation context`}),`
506
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`it("передаёт scope, args, client и signal", async () => {
507
+ const execute = vi.fn().mockResolvedValue([]);
508
+ const operation = createResourceQueryOperation({ execute });
509
+ const descriptor = createResourceDescriptor({
510
+ namespace: "test",
511
+ resource: "orders",
512
+ operations: { queries: { list: operation } },
513
+ isEnabled: (scope) => Boolean(scope)
514
+ });
515
+
516
+ await queryClient.fetchQuery(
517
+ buildResourceQueryOptions(descriptor, "list", "scope-1", {})
518
+ );
519
+
520
+ expect(execute).toHaveBeenCalledWith(
521
+ expect.objectContaining({
522
+ scope: "scope-1",
523
+ args: {},
524
+ client: queryClient,
525
+ signal: expect.any(AbortSignal)
526
+ })
527
+ );
528
+ });
529
+ `})}),`
530
+ `,(0,c.jsx)(t.p,{children:`Покройте:`}),`
531
+ `,(0,c.jsxs)(t.ul,{children:[`
532
+ `,(0,c.jsx)(t.li,{children:`nullable/invalid scope disabled;`}),`
533
+ `,(0,c.jsx)(t.li,{children:`custom scope error при imperative execution;`}),`
534
+ `,(0,c.jsx)(t.li,{children:`descriptor + operation enabled policies;`}),`
535
+ `,(0,c.jsx)(t.li,{children:`missing operation runtime error;`}),`
536
+ `,(0,c.jsx)(t.li,{children:`same normalized inputs → same key;`}),`
537
+ `,(0,c.jsx)(t.li,{children:`meaningful inputs → different keys;`}),`
538
+ `,(0,c.jsx)(t.li,{children:`signal передаётся query transport;`}),`
539
+ `,(0,c.jsx)(t.li,{children:`mutation success strategy order;`}),`
540
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`undefined`}),`/`,(0,c.jsx)(t.code,{children:`null`}),`/override strategy semantics;`]}),`
541
+ `,(0,c.jsx)(t.li,{children:`setQueryData не мутирует old snapshot;`}),`
542
+ `,(0,c.jsx)(t.li,{children:`composed strategy прекращается на error.`}),`
543
+ `]}),`
544
+ `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
545
+ `,(0,c.jsxs)(t.h3,{id:`descriptor-без-isenabled-при-nullable-scope`,children:[`Descriptor без `,(0,c.jsx)(t.code,{children:`isEnabled`}),` при nullable scope`]}),`
546
+ `,(0,c.jsx)(t.p,{children:`Query будет enabled и затем упадёт на scope assertion.`}),`
547
+ `,(0,c.jsx)(t.h3,{id:`date-прямо-в-args`,children:`Date прямо в args`}),`
548
+ `,(0,c.jsxs)(t.p,{children:[`Default normalizer превратит Date в `,(0,c.jsx)(t.code,{children:`{}`}),`. Передавайте ISO string.`]}),`
549
+ `,(0,c.jsx)(t.h3,{id:`нормализовать-scope-и-ожидать-изменённый-execute-input`,children:`Нормализовать scope и ожидать изменённый execute input`}),`
550
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`normalizeScope`}),` меняет только key identity.`]}),`
551
+ `,(0,c.jsx)(t.h3,{id:`не-включить-args-влияющие-на-response`,children:`Не включить args, влияющие на response`}),`
552
+ `,(0,c.jsx)(t.p,{children:`Factory включает переданный args целиком. Не прячьте server filter во внешнем closure, отсутствующем в args/key.`}),`
553
+ `,(0,c.jsx)(t.h3,{id:`создавать-descriptor-в-render`,children:`Создавать descriptor в render`}),`
554
+ `,(0,c.jsx)(t.p,{children:`Держите его на module boundary.`}),`
555
+ `,(0,c.jsx)(t.h3,{id:`повторить-mutation-после-cache-error`,children:`Повторить mutation после cache error`}),`
556
+ `,(0,c.jsx)(t.p,{children:`Server write уже мог завершиться. Восстановите cache отдельно.`}),`
557
+ `,(0,c.jsx)(t.h3,{id:`deep-import-operation-type`,children:`Deep import operation type`}),`
558
+ `,(0,c.jsxs)(t.p,{children:[`Используйте public subpath `,(0,c.jsx)(t.code,{children:`/resource`}),`.`]}),`
559
+ `,(0,c.jsx)(t.h2,{id:`ошибки-и-границы`,children:`Ошибки и границы`}),`
560
+ `,(0,c.jsxs)(t.ul,{children:[`
561
+ `,(0,c.jsx)(t.li,{children:`Отсутствующая operation даёт раннюю ошибку с именем resource/operation.`}),`
562
+ `,(0,c.jsxs)(t.li,{children:[`Невалидный scope блокирует hook через `,(0,c.jsx)(t.code,{children:`enabled`}),`, но ручное выполнение бросает ошибку.`]}),`
563
+ `,(0,c.jsx)(t.li,{children:`Error transport-а сохраняется TanStack Query без автоматического преобразования.`}),`
564
+ `,(0,c.jsx)(t.li,{children:`Descriptor лучше создавать на уровне module, чтобы ссылка не менялась на каждом render.`}),`
565
+ `,(0,c.jsx)(t.li,{children:`Args/scope должны быть сериализуемыми и описывать все данные, влияющие на query result.`}),`
566
+ `,(0,c.jsx)(t.li,{children:`Не используйте query cache как authoritative persistent storage.`}),`
567
+ `,(0,c.jsx)(t.li,{children:`Cache strategy выполняется только после успешной mutation.`}),`
568
+ `]}),`
569
+ `,(0,c.jsx)(t.h2,{id:`faq`,children:`FAQ`}),`
570
+ `,(0,c.jsx)(t.h3,{id:`resource-сам-выполняет-http`,children:`Resource сам выполняет HTTP?`}),`
571
+ `,(0,c.jsxs)(t.p,{children:[`Нет. Transport находится в `,(0,c.jsx)(t.code,{children:`operation.execute`}),` или adapter factory.`]}),`
572
+ `,(0,c.jsx)(t.h3,{id:`может-ли-scope-быть-primitive`,children:`Может ли scope быть primitive?`}),`
573
+ `,(0,c.jsx)(t.p,{children:`Да: string/number и другие типы разрешены generic-ом. Он должен устойчиво описывать tenant/user/entity boundary.`}),`
574
+ `,(0,c.jsx)(t.h3,{id:`почему-args-входят-в-query-key-автоматически`,children:`Почему args входят в query key автоматически?`}),`
575
+ `,(0,c.jsx)(t.p,{children:`Потому что разные args обычно означают разные server snapshots.`}),`
576
+ `,(0,c.jsx)(t.h3,{id:`почему-mutation-input-не-входит-в-mutation-key`,children:`Почему mutation input не входит в mutation key?`}),`
577
+ `,(0,c.jsx)(t.p,{children:`Mutation key описывает семейство operation, а конкретный input хранится в mutation instance execution state.`}),`
578
+ `,(0,c.jsx)(t.h3,{id:`как-отключить-operation-cache-strategy-для-одного-hook`,children:`Как отключить operation cache strategy для одного hook?`}),`
579
+ `,(0,c.jsxs)(t.p,{children:[`Передать `,(0,c.jsx)(t.code,{children:`cacheStrategy: null`}),`.`]}),`
580
+ `,(0,c.jsx)(t.h3,{id:`можно-ли-использовать-без-react-hook`,children:`Можно ли использовать без React hook?`}),`
581
+ `,(0,c.jsxs)(t.p,{children:[`Queries — через `,(0,c.jsx)(t.code,{children:`getResourceQueryData`}),`/`,(0,c.jsx)(t.code,{children:`buildResourceQueryOptions`}),`. Для mutations public convenience API сейчас hook-oriented; operation можно orchestrate на корректной owner boundary.`]}),`
582
+ `,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
583
+ `,(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:`Descriptor/operations`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createResourceDescriptor`}),`, `,(0,c.jsx)(t.code,{children:`createResourceQueryOperation`}),`, `,(0,c.jsx)(t.code,{children:`createResourceMutationOperation`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Query/mutation`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`buildResourceQueryOptions`}),`, `,(0,c.jsx)(t.code,{children:`useResourceQuery`}),`, `,(0,c.jsx)(t.code,{children:`getResourceQueryData`}),`, `,(0,c.jsx)(t.code,{children:`useResourceMutation`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Keys`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeResourceKeyValue`}),`, `,(0,c.jsx)(t.code,{children:`createResourceKeys`}),`, `,(0,c.jsx)(t.code,{children:`ResourceKeyValue`}),`, `,(0,c.jsx)(t.code,{children:`ResourceKeys`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Cache`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`applyResourceCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`createInvalidateResourceScopeCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`createSetResourceQueryDataCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`composeResourceCacheStrategies`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Contracts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ResourceQueryOperationContext`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationOperationContext`}),`, `,(0,c.jsx)(t.code,{children:`ResourceQueryOperation`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationOperation`}),`, `,(0,c.jsx)(t.code,{children:`ResourceDescriptor`}),`, `,(0,c.jsx)(t.code,{children:`CreateResourceDescriptorOptions`}),`, `,(0,c.jsx)(t.code,{children:`ResourceCacheStrategyContext`}),`, `,(0,c.jsx)(t.code,{children:`ResourceCacheStrategy`}),`, `,(0,c.jsx)(t.code,{children:`UseResourceMutationOptions`}),`, `,(0,c.jsx)(t.code,{children:`ResourceSetQueryDataStrategyOptions`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Type extraction`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ResourceQueryArgs`}),`, `,(0,c.jsx)(t.code,{children:`ResourceQueryResult`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationInput`}),`, `,(0,c.jsx)(t.code,{children:`ResourceMutationResult`})]})]})]})]})]})}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};