@ryuzaki13/react-foundation-ui 1.12.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/storybook-static/assets/{Badge-D34jY6Gi.js → Badge-DTLs_n8R.js} +1 -1
- package/storybook-static/assets/{Badge.stories-BviYPkwq.js → Badge.stories-CovEhEDD.js} +1 -1
- package/storybook-static/assets/{BadgeList-D1opuTdU.js → BadgeList-DjTg_9cc.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-CGdzqa8a.js → BarcodeScannerDialog.stories-C5rK3W2F.js} +1 -1
- package/storybook-static/assets/{Button-TDS2LnG9.js → Button-DMPKoI7-.js} +1 -1
- package/storybook-static/assets/{Button-GlOmKXxP.js → Button-xWt087rv.js} +1 -1
- package/storybook-static/assets/{Button.stories-DZc3uOlJ.js → Button.stories-ClLOimQw.js} +1 -1
- package/storybook-static/assets/{CalendarView-BZUnLT-3.js → CalendarView-C8D421Nm.js} +1 -1
- package/storybook-static/assets/{CheckBox-CLBqWi7z.js → CheckBox-ByaB_AWI.js} +1 -1
- package/storybook-static/assets/{CheckBox-nJdvYZhM.js → CheckBox-CHNYWbr9.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CYOLxCPI.js → CheckBox.stories-DMFiXHJV.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-D18f6KeQ.js → Color-6AOWCN3U-CP9Nd4vj.js} +1 -1
- package/storybook-static/assets/{ContextMenu-sE3MNnCR.js → ContextMenu-68QC2EAu.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CQSxlBWi.js → ContextMenu-DSg2_txz.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-BLY5Ujpn.js → ContextMenu.stories-C8CldSPG.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-Dskg5LhM.js → CustomOptionButton-xAusSjnU.js} +1 -1
- package/storybook-static/assets/{DateInput-Bzodnz-9.js → DateInput-2ESK1wDg.js} +1 -1
- package/storybook-static/assets/{DateInput-C1ICOvMl.js → DateInput-DOuoBC8j.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-BzVMkjA3.js → DateInput.stories-D5t5QnTV.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-D4nDDXcv.js → DateRangePresetSelect-C8k5BN7p.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-Br2__e-_.js → DateRangePresetSelect-CD2n8zWv.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-BGjTzO7y.js → DateRangePresetSelect.stories-COktncMK.js} +1 -1
- package/storybook-static/assets/{Detail-0FlptHQe.js → Detail-oc_R1sEu.js} +1 -1
- package/storybook-static/assets/{Detail.stories-BxrUGFvI.js → Detail.stories-1XrWL_s3.js} +1 -1
- package/storybook-static/assets/{Dialog-DkLXNVzZ.js → Dialog-CLTQa6Kw.js} +1 -1
- package/storybook-static/assets/{Dialog-BfPgyIcU.js → Dialog-CfnOq258.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-D949y8s0.js → Dialog.stories-D5PPDse-.js} +1 -1
- package/storybook-static/assets/{Disclosure-Cyh5B4JR.js → Disclosure-ByNKoHvP.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-CvuTZlF_.js → Disclosure.stories-CBdZfYjY.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-Wae8qmS8.js → DisclosureGroup-D3XWBJXQ.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CGjmbQhP.js → DocsRenderer-JROSPFPF-gxuFq2Pd.js} +1 -1
- package/storybook-static/assets/{DropZone-fvEwB1kz.js → DropZone-BxLXKfqY.js} +1 -1
- package/storybook-static/assets/{DropZone-BFX_F_oU.js → DropZone-C6xiwfG-.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-BKXYN11y.js → DropZone.stories-BpRrpoAa.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-eld8h4zt.js → DropdownMenu-CmzYr9oI.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-CsulBc_X.js → ExpandableActionPanel-YeKyHEkM.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-DorKO7Y7.js → ExpandableActionPanel.stories-D2Kz4YaV.js} +1 -1
- package/storybook-static/assets/{Flex-Bos8Qsbf.js → Flex-QTek1QSS.js} +1 -1
- package/storybook-static/assets/{Flex.stories-uMO88BD-.js → Flex.stories-DbQJjxyG.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-Cc604wgC.js → FloatingPopover-Z_pT8RTr.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-BBvQf7q4.js → FormattedTableCell-sTTQO4a-.js} +3 -3
- package/storybook-static/assets/{Grid-DEWQZjLv.js → Grid-BplOAlTQ.js} +1 -1
- package/storybook-static/assets/{Grid.stories-BLE0L0zk.js → Grid.stories-3z3Ey-d3.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BW7Ozi0T.js → ImageCropper.stories-CRS_mYqv.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BejoR1lv.js → ImageRenderer-B-6CUiXT.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-DP10_K4c.js → ImageRenderer.stories-r1qsDpQo.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-Bw13WxSu.js → ImageView.stories-JTwPOvTV.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-B0crB6gM.js → ImageViewer.stories-EXX-1Tq3.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-B7phOl_8.js → ImageViewerRuntime-D9mEsiiW.js} +1 -1
- package/storybook-static/assets/{Input-B5POVG-l.js → Input-o_oY36pr.js} +1 -1
- package/storybook-static/assets/{Input-DiBxtZDI.js → Input-t9m3sVNs.js} +1 -1
- package/storybook-static/assets/{Input.stories-BBu0KoQ3.js → Input.stories-BWFSZL_N.js} +1 -1
- package/storybook-static/assets/{InputDateTime-CF1I9kaz.js → InputDateTime-lu3pzt-n.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-COzwJ_xA.js → InputDateTime.stories-DhWcuSxT.js} +1 -1
- package/storybook-static/assets/{InputFile-Czxpud9Y.js → InputFile-B5JzTYSK.js} +1 -1
- package/storybook-static/assets/{InputFile-DV4LbiGx.js → InputFile-DR6qGFRh.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-C4UrANxS.js → InputFile.stories-BDkbSn8C.js} +1 -1
- package/storybook-static/assets/{InputFiles-B93BMp0i.js → InputFiles-CQU1IgFq.js} +1 -1
- package/storybook-static/assets/{InputFiles-B_WMnvSr.js → InputFiles-D1flVl2f.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CTun1-En.js → InputFiles.stories-DyNBsbIL.js} +1 -1
- package/storybook-static/assets/{InputFilesList-ChdmhHw0.js → InputFilesList-DcnsEkjI.js} +1 -1
- package/storybook-static/assets/{InputImage-xpaTZ7wq.js → InputImage-DyS8prBK.js} +1 -1
- package/storybook-static/assets/{InputImage-DR7Ed0Vu.js → InputImage-trdfpmT-.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-DTvBlwrQ.js → InputImage.stories-DEk-50bc.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-BYjJFrHD.js → InteractiveComponents-CJQb2Kqe.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-CTbNtPbV.js → InteractiveComponents.stories-A25AcgXi.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CInTlBMe.js → LayoutPicker-Cyr59f6W.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BIB30zdc.js → LayoutPicker-DmMkNRCR.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-DQ_lYy0l.js → LayoutPicker.stories-BN6ES2FK.js} +1 -1
- package/storybook-static/assets/{Listbox-hDPss1Hf.js → Listbox-BL6exIiK.js} +1 -1
- package/storybook-static/assets/{Listbox-D4HihpJQ.js → Listbox-CpOkTSus.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CzP9_sD-.js → Listbox.stories-CuJAPNNF.js} +1 -1
- package/storybook-static/assets/{Modal-DUYVQZu5.js → Modal-0h4g26vg.js} +1 -1
- package/storybook-static/assets/{Modal-LmkJ7CHS.js → Modal-BDbbUiVP.js} +1 -1
- package/storybook-static/assets/{Modal.stories-BGui6fT5.js → Modal.stories-BJTQMX6r.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-DOLfRB2E.js → ModalManagerProvider-CKUlkLye.js} +1 -1
- package/storybook-static/assets/{MultiSelect-BuWgggHX.js → MultiSelect-DOFS5VMw.js} +1 -1
- package/storybook-static/assets/{MultiSelect-CWIM68HY.js → MultiSelect-jTomHycE.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-C45HfpYj.js → MultiSelect.stories-KUrIgYcH.js} +1 -1
- package/storybook-static/assets/{NoData-BFixErI8.js → NoData-Cg-72gvD.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-DSFid0wi.js → NotificationsHost-BGUy6Nwm.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BRb4w9We.js → NotificationsHost.stories-UqcdAxbV.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-BWAo87rZ.js → ODataMultiSelect-ogSmpbiq.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-9JY7dCz7.js → ODataMultiSelect.stories-CFSWPA1t.js} +1 -1
- package/storybook-static/assets/{ODataSelect-CNaZGImQ.js → ODataSelect-XrSMzI_c.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DmUKhDNz.js → ODataSelect.stories-DzQ8kx1B.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-C_qAbPca.js → ODataTreeMultiSelect-Bd6N1nUD.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CEfHC6t_.js → ODataTreeMultiSelect.stories-BL3LegRZ.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-BSFpOn9W.js → ODataTreeSelect-LP9MrILe.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-caU47o0f.js → ODataTreeSelect.stories-B1xaZzaX.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-Bs7JuMLb.js → OneStepScroller-Ccn3TcUI.js} +1 -1
- package/storybook-static/assets/{Option-CSnKA-Xd.js → Option-CdzPub1C.js} +1 -1
- package/storybook-static/assets/{OptionButton-DIGMZVy9.js → OptionButton-BmRyJTuO.js} +1 -1
- package/storybook-static/assets/PeriodSelect-BngzAU_C.js +5 -0
- package/storybook-static/assets/{PeriodSelect-Cd0ESjew.js → PeriodSelect-kQAjEWSH.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-Dir9DbtU.js → PeriodSelect.stories-BRvyn_JH.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-CJMxsesn.js → PickerTriggerActions-C0nuR9kw.js} +1 -1
- package/storybook-static/assets/{Popover-CRhHLoew.js → Popover-CsDztf-o.js} +1 -1
- package/storybook-static/assets/{Popover-D6-lu_yc.js → Popover-GYtSL_1f.js} +1 -1
- package/storybook-static/assets/{Popover.stories-BCMMP7px.js → Popover.stories-Bqt_2L3Y.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-BlRfDcUL.js → PresetRangeDateInput-BSssho5H.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-CrZgAMBR.js → PresetRangeDateInput-C9G9Gebd.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-Zl5sur2x.js → PresetRangeDateInput.stories-CwdMXBFw.js} +1 -1
- package/storybook-static/assets/{PresetSelect-wNDulYVW.js → PresetSelect-BPsCLuct.js} +1 -1
- package/storybook-static/assets/{README-CDaOPhz8.js → README-5RP00KZZ.js} +1 -1
- package/storybook-static/assets/{README-DP8Jhu4s.js → README-9XRn3-ED.js} +1 -1
- package/storybook-static/assets/{README-D93oAq59.js → README-BIqQ7jYg.js} +1 -1
- package/storybook-static/assets/{README-CN8Y6HC2.js → README-BLXGXOo5.js} +1 -1
- package/storybook-static/assets/{README-BEZWi2C2.js → README-BOBlSnDn.js} +1 -1
- package/storybook-static/assets/{README-DKMmI4G2.js → README-BRpdVUr9.js} +1 -1
- package/storybook-static/assets/{README-CsYG82LK.js → README-BXb7J1i8.js} +1 -1
- package/storybook-static/assets/{README-CRga2fgb.js → README-BYHSzLwv.js} +1 -1
- package/storybook-static/assets/{README-GIOQUZhr.js → README-Ba0tB6ZN.js} +1 -1
- package/storybook-static/assets/{README-8YjqwqnH.js → README-Bc8lHbXV.js} +1 -1
- package/storybook-static/assets/{README-Cf-es484.js → README-BhoxLtlr.js} +9 -2
- package/storybook-static/assets/{README-Des11J57.js → README-BmzSVH7U.js} +1 -1
- package/storybook-static/assets/{README-C9cYGWK6.js → README-BpmlhmtG.js} +1 -1
- package/storybook-static/assets/README-Bq38hDzk.js +37 -0
- package/storybook-static/assets/{README-B_NLFfpp.js → README-C07t0NIU.js} +1 -1
- package/storybook-static/assets/{README-z6dqmkvs.js → README-C53FAkdN.js} +1 -1
- package/storybook-static/assets/{README-BdNMeUCv.js → README-C7j7n7jq.js} +1 -1
- package/storybook-static/assets/{README-B7i5ChbN.js → README-CJtOh4Sd.js} +1 -1
- package/storybook-static/assets/{README-COQcoKT9.js → README-CV61J_JK.js} +1 -1
- package/storybook-static/assets/{README-C3jNJJpP.js → README-CVql_W36.js} +1 -1
- package/storybook-static/assets/{README-Cfj0BoXs.js → README-CXq89IOI.js} +1 -1
- package/storybook-static/assets/{README-D35QrmDs.js → README-Ckp4sw5f.js} +1 -1
- package/storybook-static/assets/{README-BRKMZAGf.js → README-CxDM046q.js} +107 -28
- package/storybook-static/assets/{README-DFlnpjEv.js → README-D-fVNtRb.js} +1 -1
- package/storybook-static/assets/{README-Ch7v2uGS.js → README-D43Puppu.js} +1 -1
- package/storybook-static/assets/README-D67Ndgh9.js +121 -0
- package/storybook-static/assets/{README-j3HSmhET.js → README-DFCutGv3.js} +1 -1
- package/storybook-static/assets/{README-B6h01Pmu.js → README-DQysVKmM.js} +1 -1
- package/storybook-static/assets/{README-DPYg_Acv.js → README-DS_nuTod.js} +1 -1
- package/storybook-static/assets/{README-iF0ok9Vi.js → README-DXBpQ2ho.js} +1 -1
- package/storybook-static/assets/{README-BZdQ6muO.js → README-DXRNhATk.js} +1 -1
- package/storybook-static/assets/{README-CR0j-jFh.js → README-D_a06RNK.js} +1 -1
- package/storybook-static/assets/{README-BRfBuhla.js → README-DcWifa4y.js} +1 -1
- package/storybook-static/assets/{README-LyF6lMIs.js → README-Del1wUfr.js} +1 -1
- package/storybook-static/assets/{README-DIgOgGI7.js → README-Do7nnQ_n.js} +1 -1
- package/storybook-static/assets/{README-BT0TE4lM.js → README-DoPWzeQH.js} +1 -1
- package/storybook-static/assets/{README-Rjv-h87w.js → README-DqbwD6RO.js} +4 -2
- package/storybook-static/assets/{README-Csisl067.js → README-DtQcSyrT.js} +37 -8
- package/storybook-static/assets/{README-BB-q729e.js → README-Dz8_KWoz.js} +1 -1
- package/storybook-static/assets/{README-CaQ_OfNG.js → README-GLir3V8b.js} +1 -1
- package/storybook-static/assets/{README-CcRUd05A.js → README-HY5c2Bbn.js} +1 -1
- package/storybook-static/assets/{README-CJy-3cCT.js → README-PcQNwv17.js} +1 -1
- package/storybook-static/assets/{README-DC6IHyBW.js → README-Tw0ZHHwr.js} +1 -1
- package/storybook-static/assets/{README-Bubi5gTJ.js → README-V9DD9H9z.js} +1 -1
- package/storybook-static/assets/{README-lN1Ljv0O.js → README-XW0y0mGh.js} +1 -1
- package/storybook-static/assets/{README-BWVWcDb4.js → README-Y1Smckdh.js} +1 -1
- package/storybook-static/assets/{README-D55OX9pN.js → README-ZguU3X5y.js} +1 -1
- package/storybook-static/assets/{README-D65oLCnS.js → README-e8EWTIws.js} +1 -1
- package/storybook-static/assets/{README-CCHc0Xyu.js → README-n1zI-vYE.js} +45 -1
- package/storybook-static/assets/{README-r-4LRVav.js → README-oKCgmTdw.js} +12 -4
- package/storybook-static/assets/{README-BJ7S9lBU.js → README-pexCW3yI.js} +1 -1
- package/storybook-static/assets/{README-Bdm71C27.js → README-vDg-39Yq.js} +1 -1
- package/storybook-static/assets/{README-CaM6cf-O.js → README-wKqwiHb4.js} +1 -1
- package/storybook-static/assets/{RadioButton-SDIHkMqE.js → RadioButton-DGT616TU.js} +1 -1
- package/storybook-static/assets/{RadioButton-CCR0zu3W.js → RadioButton-DvDDf9wn.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-CWlAzbso.js → RadioButton.stories-BSA2eNrW.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CvMAbZis.js → RadioGroup-C_ZapH6C.js} +1 -1
- package/storybook-static/assets/{RadioGroup-B8dC3Beb.js → RadioGroup-Cj-zQisA.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-B7g9iK7V.js → RadioGroup.stories-B6HK1X-8.js} +1 -1
- package/storybook-static/assets/{Scrollable-Duhb4hgF.js → Scrollable-DCvN6Jjw.js} +1 -1
- package/storybook-static/assets/{Select-B-zeXEgK.js → Select-DPdZSw3l.js} +1 -1
- package/storybook-static/assets/{Select-HfN2ur_G.js → Select-DY9-upm8.js} +1 -1
- package/storybook-static/assets/{Select.stories-B9ulZxEn.js → Select.stories-CZ_QR5HG.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-CnOm3Egr.js → SerializableSelect-11vTkd0H.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Ct4iR6JB.js → SerializableSelect.stories-BguIknSO.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CoW7Kbyn.js → SingleDateTimeInput-BoGhy8Ht.js} +1 -1
- package/storybook-static/assets/SingleDateTimeInput-DCsz6UCV.js +1 -0
- package/storybook-static/assets/{SingleDateTimeInput.stories-CSMgGAWO.js → SingleDateTimeInput.stories-DxuSYUFA.js} +1 -1
- package/storybook-static/assets/{Slider-N8mF8qmG.js → Slider-CysM6SsH.js} +1 -1
- package/storybook-static/assets/{Slider-B8CLVfcP.js → Slider-OjWEFAVX.js} +1 -1
- package/storybook-static/assets/{Slider.stories-KBmRK3s8.js → Slider.stories-D9yfMGAr.js} +1 -1
- package/storybook-static/assets/{SliderInput-BDJi-cgo.js → SliderInput-CI_NLQ0q.js} +1 -1
- package/storybook-static/assets/{SliderInput-BkiUt9jK.js → SliderInput-DBTFSE4e.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-BYJemRSZ.js → SliderInput.stories-D0oX3RFL.js} +1 -1
- package/storybook-static/assets/{Sortable-B9KSdQoM.js → Sortable-wMgs80Np.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-DkgQcmlF.js → Sortable.stories-CzLFp8Yi.js} +1 -1
- package/storybook-static/assets/{Splitter-RwtbhIP_.js → Splitter-BKw_fa4-.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-C7WMeiBU.js → Splitter.stories-BESoJ6o1.js} +1 -1
- package/storybook-static/assets/{StateSelect-Cu3-TJjY.js → StateSelect-BO-jFCLn.js} +1 -1
- package/storybook-static/assets/StateSelect-BwNBFERr.js +4 -0
- package/storybook-static/assets/{StateSelect.stories-C1SXNtZm.js → StateSelect.stories-BK7SyuXQ.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CSWTlbeH.js → StringToggle.stories-A6pkEO-O.js} +1 -1
- package/storybook-static/assets/{Switch-CMm26s02.js → Switch-8JotpfFf.js} +1 -1
- package/storybook-static/assets/{Switch-C0VQpcAN.js → Switch-Ca3gnf5f.js} +1 -1
- package/storybook-static/assets/{Switch.stories-BdeMw5vh.js → Switch.stories-o3vvp8L8.js} +1 -1
- package/storybook-static/assets/{Table-BdN7l9nU.js → Table-C_IPJbR2.js} +1 -1
- package/storybook-static/assets/{Table.stories-n1jzcEtU.js → Table.stories-DOFEu7Ua.js} +1 -1
- package/storybook-static/assets/{Tabs-3QRIKQu4.js → Tabs-BLBo4OAv.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-Br_vn86G.js → Tabs.stories-RBnCQrM-.js} +1 -1
- package/storybook-static/assets/{TabsBox-oUhSAA8j.js → TabsBox-apqD4XLH.js} +1 -1
- package/storybook-static/assets/{TagInput-CXLkDkGR.js → TagInput-CSYOG896.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-Oug-n_Cc.js → TagInput.stories-BnGuMi6T.js} +1 -1
- package/storybook-static/assets/{Text-EA5QyBz4.js → Text-mRhkARXu.js} +1 -1
- package/storybook-static/assets/{Textarea-JWCJNKsl.js → Textarea-Covk__BL.js} +1 -1
- package/storybook-static/assets/{Textarea-BhnGClU1.js → Textarea-DS1hM5rM.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-nyyWW7AG.js → Textarea.stories-BdpsMxDY.js} +1 -1
- package/storybook-static/assets/{TimePanel-CWnqPBjv.js → TimePanel-PDYyBCbF.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-C-iXXNjE.js → TimePanel.stories-BFS31y6L.js} +1 -1
- package/storybook-static/assets/{Toggle-DSSRTisC.js → Toggle-DTX4Q7y6.js} +1 -1
- package/storybook-static/assets/{Toggle-C_aM5aMQ.js → Toggle-zWHGLyKm.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-mFCOmo4Y.js → Toggle.stories-fZ7WRE_7.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CyW6oUN_.js → TreeMultiSelect-BSZO9xe1.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CxOnGdzT.js → TreeMultiSelect-C4y6p4PX.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-CC1X33-d.js → TreeMultiSelect.stories-DXKBBf5r.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B5pChx5i.js → TreePickerBase-CMHFqHVa.js} +1 -1
- package/storybook-static/assets/{TreeSelect-LtUUGYjX.js → TreeSelect-DGXveWx3.js} +1 -1
- package/storybook-static/assets/{TreeSelect-PjRafYC5.js → TreeSelect-Dh5uT4_T.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-kT556sYJ.js → TreeSelect.stories-Byy-mMTP.js} +1 -1
- package/storybook-static/assets/{TreeTable-MLb4c6PD.js → TreeTable-BN7J72I8.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-CAiwbwxz.js → TreeTable.stories-FYHTdBr3.js} +1 -1
- package/storybook-static/assets/{array-D-_yMMUK-BQ0uu1hZ.js → array-D-_yMMUK-DYqn1Ozn.js} +1 -1
- package/storybook-static/assets/{blocks-DxyL_jCu.js → blocks-o5-z1BZu.js} +3 -3
- package/storybook-static/assets/{check-BXD_Pkw4.js → check-C4AaNZYo.js} +1 -1
- package/storybook-static/assets/{chevron-down-PsXs4TLU.js → chevron-down-DvNqUDlQ.js} +1 -1
- package/storybook-static/assets/{chevron-left-C4gxRcJZ.js → chevron-left-DjMG1A8Y.js} +1 -1
- package/storybook-static/assets/{chevron-right-BoNNSE4i.js → chevron-right-Mitq9JQN.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-Bw8Gaqb1.js → chunk-W22LQPXL-DNwhYDee.js} +1 -1
- package/storybook-static/assets/{circle-alert-C0KskPN2.js → circle-alert-RsaUYk8p.js} +1 -1
- package/storybook-static/assets/{circle-check-BU7bRDDY.js → circle-check-Bf5GP89g.js} +1 -1
- package/storybook-static/assets/{components-BCyH0mtu.js → components-B4tZ3-vQ.js} +3 -3
- package/storybook-static/assets/{contextMenu-CI7IuUSN.js → contextMenu-Ftv13fjh.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-Dinv2uRZ.js → defaultRenderers-CyUQG_f-.js} +1 -1
- package/storybook-static/assets/{download-Ba6RrPW1.js → download-BmjzCCZo.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-CzenezcL.js → floating-ui.react-BY7cYh9B.js} +1 -1
- package/storybook-static/assets/formatters-DVE1YVNQ-CMsbb5-m.js +1 -0
- package/storybook-static/assets/{foundationApi-Cjni4JEg.js → foundationApi-C7zGaHuR.js} +4 -4
- package/storybook-static/assets/{foundationLib-C3-64Grv.js → foundationLib-CQpPkJlc.js} +1 -1
- package/storybook-static/assets/{hooks-DNb8U9od.js → hooks-DQXnNniA.js} +2 -2
- package/storybook-static/assets/iframe-B-sjM2X5.js +1 -0
- package/storybook-static/assets/{iframe-I7-gyNVJ.js → iframe-Cb11iJVP.js} +4 -4
- package/storybook-static/assets/{info-HJuo7Txr.js → info-BmiY6Ur5.js} +1 -1
- package/storybook-static/assets/odata-D-cQAIdp.js +1 -0
- package/storybook-static/assets/odata-service-CWkHASdw-DAt28ZWr.js +50 -0
- package/storybook-static/assets/{odataStoryFixtures-BlAGWLfC.js → odataStoryFixtures-BddSr1SB.js} +1 -1
- package/storybook-static/assets/{react-DOm5uwVv.js → react-wmXnhrTV.js} +1 -1
- package/storybook-static/assets/{refresh-cw-CgbYtCzg.js → refresh-cw-BoUt7cjC.js} +1 -1
- package/storybook-static/assets/{settings-2-B96G1M3R.js → settings-2-BnEmfu4n.js} +1 -1
- package/storybook-static/assets/{sortable-CsGAvVat.js → sortable-BG6M9j0E.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CJHmYDVV.js → syntaxhighlighter-QEQV7K2Y-DTU-Nj55.js} +1 -1
- package/storybook-static/assets/{trash-2-NFv7s58u.js → trash-2-CEuSrdHe.js} +1 -1
- package/storybook-static/assets/{triangle-alert-DVmi0Yoe.js → triangle-alert-BB6HrHL-.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-DRX6eayS.js → useODataSelectBase-DiMVVy-k.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-D7aS01Or.js → useODataTreeData-DiV_gN4z.js} +1 -1
- package/storybook-static/assets/{usePickerDefaultFilter-5Q1pAV4d.js → usePickerDefaultFilter-BMBLqfz8.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-D5WukLFG.js → usePickerQuery-Dc3Jdhg0.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-e8hbwGar.js → usePickerTriggerController-BjY_AiUm.js} +1 -1
- package/storybook-static/assets/validators-D82aYLRK.js +1 -0
- package/storybook-static/assets/{x-DlvQAqG5.js → x-CcdATVNL.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/PeriodSelect-DIIe0NfH.js +0 -5
- package/storybook-static/assets/README-C5s5K0h_.js +0 -324
- package/storybook-static/assets/SingleDateTimeInput-BmEpx1-W.js +0 -1
- package/storybook-static/assets/StateSelect-BrgGuYMY.js +0 -4
- package/storybook-static/assets/formatters-D33Uh3si-Df97arf9.js +0 -1
- package/storybook-static/assets/iframe-BHNt9Av8.js +0 -1
- package/storybook-static/assets/odata-6-rqoXfe.js +0 -1
- package/storybook-static/assets/odata-service-CWkHASdw-CXhFi03v.js +0 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Errors/Error Report`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`error-report`,children:`Error Report`}),`
|
|
3
|
-
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),` собирает клиентскую диагностику ошибки в
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),` собирает клиентскую диагностику ошибки в versioned bounded draft, временно хранит последние drafts в `,(0,c.jsx)(t.code,{children:`sessionStorage`}),` и предоставляет durable IndexedDB queue для отложенной доставки.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Он умеет объединить:`}),`
|
|
5
5
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
6
6
|
`,(0,c.jsx)(t.li,{children:`нормализованную ошибку и stack trace;`}),`
|
|
@@ -10,20 +10,24 @@ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-I
|
|
|
10
10
|
`,(0,c.jsx)(t.li,{children:`состояние TanStack Query без полного query data;`}),`
|
|
11
11
|
`,(0,c.jsx)(t.li,{children:`технические сведения о persisted queries;`}),`
|
|
12
12
|
`,(0,c.jsx)(t.li,{children:`контекст React/runtime/transport;`}),`
|
|
13
|
-
`,(0,c.jsxs)(t.li,{children:[
|
|
13
|
+
`,(0,c.jsxs)(t.li,{children:[`локальный draft lifecycle: `,(0,c.jsx)(t.code,{children:`pending`}),`, `,(0,c.jsx)(t.code,{children:`sending`}),`, `,(0,c.jsx)(t.code,{children:`sent`}),`, `,(0,c.jsx)(t.code,{children:`failed`}),`;`]}),`
|
|
14
|
+
`,(0,c.jsx)(t.li,{children:`durable queue с TTL, bounded capacity и атомарным межвкладочным lease.`}),`
|
|
14
15
|
`]}),`
|
|
15
|
-
`,(0,c.jsxs)(t.p,{children:[`Важная граница: `,(0,c.jsx)(t.strong,{children:`lib-пакет не отправляет отчёт на сервер`}),`. Он формирует draft и предоставляет
|
|
16
|
+
`,(0,c.jsxs)(t.p,{children:[`Важная граница: `,(0,c.jsx)(t.strong,{children:`lib-пакет не отправляет отчёт на сервер`}),`. Он формирует draft, хранит queue и предоставляет атомарные переходы. Авторизация, HTTP/API delivery, retry, пользовательское согласие и UI принадлежат приложению либо API-пакету.`]}),`
|
|
16
17
|
`,(0,c.jsx)(t.h2,{id:`установка`,children:`Установка`}),`
|
|
17
18
|
`,(0,c.jsx)(t.p,{children:`Модуль интегрируется с TanStack Query и query persistence.`}),`
|
|
18
19
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib \\
|
|
19
20
|
@tanstack/react-query \\
|
|
20
|
-
@tanstack/query-persist-client-core
|
|
21
|
+
@tanstack/query-persist-client-core \\
|
|
22
|
+
zod
|
|
21
23
|
`})}),`
|
|
22
24
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
23
25
|
captureRuntimeErrorReport,
|
|
26
|
+
createErrorReportQueue,
|
|
24
27
|
createErrorInfo,
|
|
25
28
|
installErrorReportBrowserBreadcrumbs,
|
|
26
29
|
setErrorReportRuntimeErrorReporter,
|
|
30
|
+
setErrorReportSanitizer,
|
|
27
31
|
type ErrorReportDraft
|
|
28
32
|
} from "@ryuzaki13/react-foundation-lib/error-report";
|
|
29
33
|
`})}),`
|
|
@@ -33,7 +37,8 @@ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-I
|
|
|
33
37
|
→ нормализация + diagnostics + breadcrumbs
|
|
34
38
|
→ ErrorReportDraft(status = pending)
|
|
35
39
|
→ sessionStorage, максимум 10 drafts
|
|
36
|
-
→
|
|
40
|
+
→ enqueue payload в IndexedDB, максимум 50 записей / 7 суток
|
|
41
|
+
→ app/API delivery через lease
|
|
37
42
|
→ updateErrorReportDraft(status = sending/sent/failed)
|
|
38
43
|
`})}),`
|
|
39
44
|
`,(0,c.jsx)(t.p,{children:`Сбор отчёта — дополнительный диагностический сценарий. Ошибка репортера не должна заменять исходную ошибку и ломать основной пользовательский поток.`}),`
|
|
@@ -55,12 +60,12 @@ isErrorReportingEnabled({ isDev: false });
|
|
|
55
60
|
declare const __APP_ID__: string;
|
|
56
61
|
declare const __APP_BUILD_ID__: string;
|
|
57
62
|
`})}),`
|
|
58
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`__APP_ID__`}),` входит в ключи `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`, а `,(0,c.jsx)(t.code,{children:`__APP_BUILD_ID__`}),` помогает связать ошибку с
|
|
63
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`__APP_ID__`}),` входит в payload как `,(0,c.jsx)(t.code,{children:`application`}),` и в ключи `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`, а `,(0,c.jsx)(t.code,{children:`__APP_BUILD_ID__`}),` помогает связать ошибку с деплоем. Приложение обязано использовать устойчивый deployment identifier, а не display name. Например, KTK-приложения используют `,(0,c.jsx)(t.code,{children:`ru.education-system`}),` и `,(0,c.jsx)(t.code,{children:`ru.ktk-website`}),`.`]}),`
|
|
59
64
|
`,(0,c.jsx)(t.p,{children:`Пример Vite:`}),`
|
|
60
65
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`define: {
|
|
61
66
|
__DEV__: JSON.stringify(mode !== "production"),
|
|
62
|
-
__APP_ID__: JSON.stringify("education-
|
|
63
|
-
__APP_BUILD_ID__: JSON.stringify(process.env.
|
|
67
|
+
__APP_ID__: JSON.stringify("ru.education-system"),
|
|
68
|
+
__APP_BUILD_ID__: JSON.stringify(process.env.GIT_COMMIT_SHA ?? "local"),
|
|
64
69
|
}
|
|
65
70
|
`})}),`
|
|
66
71
|
`,(0,c.jsxs)(t.p,{children:[`Модуль persisted diagnostics использует инфраструктуру `,(0,c.jsx)(t.code,{children:`/query-client`}),`; её compile-time persistence-константы тоже должны быть настроены, если приложение включает соответствующую часть query persistence.`]}),`
|
|
@@ -115,7 +120,7 @@ declare const __APP_BUILD_ID__: string;
|
|
|
115
120
|
httpStatus?: number;
|
|
116
121
|
};
|
|
117
122
|
`})}),`
|
|
118
|
-
`,(0,c.jsxs)(t.p,{children:[`Для обычного `,(0,c.jsx)(t.code,{children:`Error`}),` сохраняются `,(0,c.jsx)(t.code,{children:`name`}),`, непустой `,(0,c.jsx)(t.code,{children:`message`}),` и
|
|
123
|
+
`,(0,c.jsxs)(t.p,{children:[`Для обычного `,(0,c.jsx)(t.code,{children:`Error`}),` сохраняются `,(0,c.jsx)(t.code,{children:`name`}),`, непустой `,(0,c.jsx)(t.code,{children:`message`}),` и `,(0,c.jsx)(t.code,{children:`stack`}),` до 64 KiB.`]}),`
|
|
119
124
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createErrorInfo(new Error("Не удалось сохранить"));
|
|
120
125
|
// { name: "Error", message: "Не удалось сохранить", stackTrace: "..." }
|
|
121
126
|
`})}),`
|
|
@@ -130,14 +135,27 @@ declare const __APP_BUILD_ID__: string;
|
|
|
130
135
|
`,(0,c.jsx)(t.li,{children:`максимальная глубина — 4;`}),`
|
|
131
136
|
`,(0,c.jsx)(t.li,{children:`максимум 20 элементов массива;`}),`
|
|
132
137
|
`,(0,c.jsx)(t.li,{children:`максимум 40 ключей объекта;`}),`
|
|
138
|
+
`,(0,c.jsx)(t.li,{children:`строка — не более 4096 символов;`}),`
|
|
133
139
|
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`undefined`}),`, function, symbol и усечённая ветка получают специальные объекты `,(0,c.jsx)(t.code,{children:`{ type: ... }`}),`;`]}),`
|
|
140
|
+
`,(0,c.jsxs)(t.li,{children:[`циклическая ссылка получает `,(0,c.jsx)(t.code,{children:`{ type: "circular" }`}),`;`]}),`
|
|
134
141
|
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`bigint`}),` превращается в строку;`]}),`
|
|
135
142
|
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Date`}),` — в ISO-строку.`]}),`
|
|
143
|
+
`,(0,c.jsxs)(t.li,{children:[`известные secret-like keys (`,(0,c.jsx)(t.code,{children:`authorization`}),`, `,(0,c.jsx)(t.code,{children:`cookie`}),`, `,(0,c.jsx)(t.code,{children:`password`}),`, `,(0,c.jsx)(t.code,{children:`token`}),`, `,(0,c.jsx)(t.code,{children:`secret`}),`, CSRF/API keys) получают `,(0,c.jsx)(t.code,{children:`[REDACTED]`}),`;`]}),`
|
|
144
|
+
`,(0,c.jsxs)(t.li,{children:[`email в свободной строке заменяется на `,(0,c.jsx)(t.code,{children:`[REDACTED_EMAIL]`}),`;`]}),`
|
|
145
|
+
`,(0,c.jsxs)(t.li,{children:[`значения полей с именем `,(0,c.jsx)(t.code,{children:`*Url`}),` сохраняются без search/hash.`]}),`
|
|
136
146
|
`]}),`
|
|
137
147
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createDiagnosticValue({ retry: 2, handler: () => undefined });
|
|
138
148
|
// { retry: 2, handler: { type: "function" } }
|
|
139
149
|
`})}),`
|
|
140
|
-
`,(0,c.
|
|
150
|
+
`,(0,c.jsx)(t.p,{children:`Built-in redaction является страховочной сеткой и не распознаёт ФИО, телефоны и все предметные идентификаторы. Он не заменяет app-level allow-list.`}),`
|
|
151
|
+
`,(0,c.jsx)(t.h3,{id:`seterrorreportsanitizersanitizer`,children:(0,c.jsx)(t.code,{children:`setErrorReportSanitizer(sanitizer?)`})}),`
|
|
152
|
+
`,(0,c.jsxs)(t.p,{children:[`Регистрирует единственный sanitizer приложения для error message/stack, delivery failure reason, query/mutation keys, meta, context, data shape и breadcrumb detail. Callback получает уже bounded `,(0,c.jsx)(t.code,{children:`ErrorReportSafeValue`}),` и scope, возвращает разрешённое значение либо `,(0,c.jsx)(t.code,{children:`undefined`}),`, чтобы удалить секцию. Результат повторно нормализуется foundation-ограничителями.`]}),`
|
|
153
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`setErrorReportSanitizer((value, context) => {
|
|
154
|
+
if (context.scope !== "context" || !value || Array.isArray(value) || typeof value !== "object") return value;
|
|
155
|
+
return "operation" in value ? { operation: value.operation } : undefined;
|
|
156
|
+
});
|
|
157
|
+
`})}),`
|
|
158
|
+
`,(0,c.jsxs)(t.p,{children:[`Callback должен быть чистым и идемпотентным: capture может повторно применить его к уже подготовленной секции перед storage write. Если callback бросает исключение, рискованная секция удаляется. При teardown/hot reload вызовите `,(0,c.jsx)(t.code,{children:`setErrorReportSanitizer(undefined)`}),`.`]}),`
|
|
141
159
|
`,(0,c.jsx)(t.h3,{id:`sanitizedetaildetail`,children:(0,c.jsx)(t.code,{children:`sanitizeDetail(detail)`})}),`
|
|
142
160
|
`,(0,c.jsxs)(t.p,{children:[`Применяет `,(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),` к первым 40 полям объекта. Для `,(0,c.jsx)(t.code,{children:`undefined`}),` или пустого объекта возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
143
161
|
`,(0,c.jsx)(t.p,{children:`Передавайте только заранее отобранные технические данные:`}),`
|
|
@@ -177,7 +195,7 @@ declare const __APP_BUILD_ID__: string;
|
|
|
177
195
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`getErrorReportBreadcrumbs();
|
|
178
196
|
clearErrorReportBreadcrumbs();
|
|
179
197
|
`})}),`
|
|
180
|
-
`,(0,c.jsx)(t.p,{children:`Возвращаемый массив является
|
|
198
|
+
`,(0,c.jsx)(t.p,{children:`Возвращаемый массив является shallow copy. Вложенные элементы считайте readonly и не меняйте вручную.`}),`
|
|
181
199
|
`,(0,c.jsx)(t.h3,{id:`автоматические-browser-breadcrumbs`,children:`Автоматические browser breadcrumbs`}),`
|
|
182
200
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const uninstallBreadcrumbs = installErrorReportBrowserBreadcrumbs();
|
|
183
201
|
|
|
@@ -189,14 +207,14 @@ uninstallBreadcrumbs();
|
|
|
189
207
|
`,(0,c.jsx)(t.li,{children:`click в capture phase;`}),`
|
|
190
208
|
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`document.visibilitychange`}),`.`]}),`
|
|
191
209
|
`]}),`
|
|
192
|
-
`,(0,c.
|
|
193
|
-
`,(0,c.jsxs)(t.p,{children:[`Код не читает `,(0,c.jsx)(t.code,{children:`input.value`})
|
|
210
|
+
`,(0,c.jsxs)(t.p,{children:[`Для click сохраняются координаты/модификаторы и ограниченное техническое описание meaningful target: tag, role, input type и цепочка родителей. Приложение может явно добавить slug-like `,(0,c.jsx)(t.code,{children:`data-error-report-target`}),`, например `,(0,c.jsx)(t.code,{children:`student-save`}),`. Глубина DOM-цепочки ограничена 20, атрибут — 120 символами.`]}),`
|
|
211
|
+
`,(0,c.jsxs)(t.p,{children:[`Код не читает `,(0,c.jsx)(t.code,{children:`input.value`}),`, DOM text, `,(0,c.jsx)(t.code,{children:`id`}),`, `,(0,c.jsx)(t.code,{children:`title`}),`, `,(0,c.jsx)(t.code,{children:`aria-*`}),`, CSS classes, `,(0,c.jsx)(t.code,{children:`data-ui`}),`, `,(0,c.jsx)(t.code,{children:`data-action`}),` и произвольные `,(0,c.jsx)(t.code,{children:`data-*`}),`. Значение `,(0,c.jsx)(t.code,{children:`data-error-report-target`}),` принимается только из латинских букв, цифр и символов `,(0,c.jsx)(t.code,{children:`._:/-`}),`; свободный текст в него помещать нельзя.`]}),`
|
|
194
212
|
`,(0,c.jsx)(t.p,{children:`На сервере установщик возвращает пустую cleanup-функцию.`}),`
|
|
195
213
|
`,(0,c.jsx)(t.h2,{id:`диагностика-tanstack-query`,children:`Диагностика TanStack Query`}),`
|
|
196
214
|
`,(0,c.jsx)(t.h3,{id:`collectquerydiagnosticsquery`,children:(0,c.jsx)(t.code,{children:`collectQueryDiagnostics(query)`})}),`
|
|
197
215
|
`,(0,c.jsx)(t.p,{children:`Собирает:`}),`
|
|
198
216
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
199
|
-
`,(0,c.
|
|
217
|
+
`,(0,c.jsx)(t.li,{children:`безопасный hash уже очищенного query key и его диагностическое представление;`}),`
|
|
200
218
|
`,(0,c.jsx)(t.li,{children:`status/fetchStatus;`}),`
|
|
201
219
|
`,(0,c.jsx)(t.li,{children:`timestamps обновления data/error;`}),`
|
|
202
220
|
`,(0,c.jsx)(t.li,{children:`failure count, invalidation и observer count;`}),`
|
|
@@ -204,14 +222,14 @@ uninstallBreadcrumbs();
|
|
|
204
222
|
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`dataShape`}),` вместо data;`]}),`
|
|
205
223
|
`,(0,c.jsx)(t.li,{children:`нормализованную query error.`}),`
|
|
206
224
|
`]}),`
|
|
207
|
-
`,(0,c.jsxs)(t.p,{children:[`Значения `,(0,c.jsx)(t.code,{children:`queryKey`}),` и `,(0,c.jsx)(t.code,{children:`meta`}),`
|
|
225
|
+
`,(0,c.jsxs)(t.p,{children:[`Значения `,(0,c.jsx)(t.code,{children:`queryKey`}),` и `,(0,c.jsx)(t.code,{children:`meta`}),` проходят built-in redaction и app sanitizer. Предметные персональные идентификаторы всё равно должны удаляться policy приложения.`]}),`
|
|
208
226
|
`,(0,c.jsx)(t.h3,{id:`collectmutationdiagnosticsmutation`,children:(0,c.jsx)(t.code,{children:`collectMutationDiagnostics(mutation)`})}),`
|
|
209
227
|
`,(0,c.jsx)(t.p,{children:`Собирает mutation key, status, failure count, submitted timestamp, meta и error. Mutation variables/data не копируются.`}),`
|
|
210
228
|
`,(0,c.jsx)(t.h3,{id:`collectqueryclientdiagnosticsqueryclient`,children:(0,c.jsx)(t.code,{children:`collectQueryClientDiagnostics(queryClient)`})}),`
|
|
211
229
|
`,(0,c.jsx)(t.p,{children:`Возвращает последние 40 query и последние 40 mutations из соответствующих cache. Это синхронный snapshot текущего QueryClient.`}),`
|
|
212
230
|
`,(0,c.jsx)(t.h3,{id:`collectpersistedquerydiagnostics`,children:(0,c.jsx)(t.code,{children:`collectPersistedQueryDiagnostics()`})}),`
|
|
213
231
|
`,(0,c.jsxs)(t.p,{children:[`Асинхронно читает IndexedDB persistence из `,(0,c.jsx)(t.code,{children:`/query-client`}),` и возвращает максимум 40 записей.`]}),`
|
|
214
|
-
`,(0,c.jsxs)(t.p,{children:[`Сохраняются
|
|
232
|
+
`,(0,c.jsxs)(t.p,{children:[`Сохраняются buster, безопасный hash/key, statuses, timestamps, failure count и error. IndexedDB storage key и `,(0,c.jsx)(t.code,{children:`state.data`}),` намеренно исключены полностью.`]}),`
|
|
215
233
|
`,(0,c.jsx)(t.p,{children:`Если IndexedDB/persistence недоступны или чтение бросает ошибку, возвращается пустой массив — сбор отчёта не падает.`}),`
|
|
216
234
|
`,(0,c.jsx)(t.h2,{id:`capture-query-ошибки`,children:`Capture query-ошибки`}),`
|
|
217
235
|
`,(0,c.jsx)(t.h3,{id:`capturequeryerrorreporterror-query-queryclient-context`,children:(0,c.jsx)(t.code,{children:`captureQueryErrorReport(error, query, queryClient, context?)`})}),`
|
|
@@ -236,7 +254,7 @@ uninstallBreadcrumbs();
|
|
|
236
254
|
`,(0,c.jsx)(t.p,{children:`Работает аналогично query capture: подавляет дублирующий transport-report, добавляет mutation breadcrumb и собирает QueryClient/persistence snapshot.`}),`
|
|
237
255
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft = await captureMutationErrorReport(error, mutation, queryClient, { source: "save-order", detail: { form: "order-edit" } });
|
|
238
256
|
`})}),`
|
|
239
|
-
`,(0,c.jsxs)(t.p,{children:[`Текущая реализация включает `,(0,c.jsx)(t.code,{children:`detail`}),` в breadcrumb,
|
|
257
|
+
`,(0,c.jsxs)(t.p,{children:[`Текущая реализация включает очищенный `,(0,c.jsx)(t.code,{children:`detail`}),` и в breadcrumb, и в `,(0,c.jsx)(t.code,{children:`payload.context`}),` mutation draft.`]}),`
|
|
240
258
|
`,(0,c.jsx)(t.h2,{id:`capture-runtimereact-ошибки`,children:`Capture runtime/React-ошибки`}),`
|
|
241
259
|
`,(0,c.jsx)(t.h3,{id:`captureruntimeerrorreporterror-context-queryclient`,children:(0,c.jsx)(t.code,{children:`captureRuntimeErrorReport(error, context?, queryClient?)`})}),`
|
|
242
260
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft = await captureRuntimeErrorReport(
|
|
@@ -269,10 +287,72 @@ type ErrorReportDraft = {
|
|
|
269
287
|
`})}),`
|
|
270
288
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`reportId`}),` — UUID отдельного отчёта. `,(0,c.jsx)(t.code,{children:`sessionId`}),` стабилен в текущем `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`. `,(0,c.jsx)(t.code,{children:`createdUtc`}),` формируется как OData datetime UTC.`]}),`
|
|
271
289
|
`,(0,c.jsx)(t.p,{children:`Payload содержит category/source/error, build environment, client, location, viewport, breadcrumbs и optional секции query/mutation/react/context.`}),`
|
|
290
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ErrorReportPayload`}),` содержит обязательные `,(0,c.jsx)(t.code,{children:`payloadVersion: 1`}),` и `,(0,c.jsx)(t.code,{children:`application`}),`. Runtime parser принимает только текущую версию; unversioned и будущие формы не интерпретируются эвристически.`]}),`
|
|
291
|
+
`,(0,c.jsx)(t.h3,{id:`runtime-parsing`,children:`Runtime parsing`}),`
|
|
292
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`parseErrorReportPayload(value);
|
|
293
|
+
parseErrorReportDraft(value);
|
|
294
|
+
parseErrorReportDrafts(value);
|
|
295
|
+
`})}),`
|
|
296
|
+
`,(0,c.jsxs)(t.p,{children:[`Первые две функции возвращают текущий typed contract либо `,(0,c.jsx)(t.code,{children:`undefined`}),`. Parser массива независимо отбрасывает повреждённые элементы, сохраняя соседние валидные drafts. Дополнительно проверяется совпадение identity полей draft и payload и фактический размер payload.`]}),`
|
|
297
|
+
`,(0,c.jsx)(t.h3,{id:`bounded-payload`,children:`Bounded payload`}),`
|
|
298
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`limitErrorReportPayload(payload)`}),` сначала повторно применяет sanitization, затем проверяет UTF-8 размер `,(0,c.jsx)(t.code,{children:`JSON.stringify`}),`. Предел — `,(0,c.jsx)(t.code,{children:`ERROR_REPORT_PAYLOAD_MAX_BYTES`}),` (256 KiB). При превышении optional diagnostics удаляются в фиксированном порядке, а `,(0,c.jsx)(t.code,{children:`payload.truncation`}),` фиксирует исходный размер, limit и список удалённых секций. `,(0,c.jsx)(t.code,{children:`getErrorReportPayloadSize(payload)`}),` возвращает фактический сериализованный размер в байтах.`]}),`
|
|
272
299
|
`,(0,c.jsx)(t.h3,{id:`хранение`,children:`Хранение`}),`
|
|
273
|
-
`,(0,c.jsxs)(t.p,{children:[`
|
|
300
|
+
`,(0,c.jsxs)(t.p,{children:[`Versioned drafts сохраняются под ключом `,(0,c.jsx)(t.code,{children:"${__APP_ID__}.errorReport.drafts.v2"}),`. В одной вкладке остаются последние 10 элементов. Старые удаляются с начала массива. Предыдущая unversioned storage-форма не загружается.`]}),`
|
|
274
301
|
`,(0,c.jsx)(t.p,{children:`Storage errors и некорректный JSON подавляются. При переполнении sessionStorage текущее in-memory состояние обновится, но запись на диск может не сохраниться.`}),`
|
|
275
302
|
`,(0,c.jsx)(t.p,{children:`Модуль загружает drafts при первом импорте. Это модульное состояние, общее для всех consumers одного bundle.`}),`
|
|
303
|
+
`,(0,c.jsx)(t.h2,{id:`durable-indexeddb-queue`,children:`Durable IndexedDB queue`}),`
|
|
304
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`sessionStorage`}),` draft остаётся кратким диагностическим lifecycle текущей вкладки. Надёжную отложенную доставку обеспечивает отдельная queue:`]}),`
|
|
305
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const queue = createErrorReportQueue();
|
|
306
|
+
if (!queue) {
|
|
307
|
+
// IndexedDB отсутствует: app фиксирует безопасную деградацию без рекурсии report flow.
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const draft = await captureRuntimeErrorReport(error, context, queryClient);
|
|
312
|
+
if (draft) {
|
|
313
|
+
await queue.enqueue(draft.payload);
|
|
314
|
+
}
|
|
315
|
+
`})}),`
|
|
316
|
+
`,(0,c.jsxs)(t.p,{children:[`Создание возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, когда IndexedDB недоступен. Ошибки открывания, quota и транзакций не поглощаются: coordinator обязан отделить storage failure от исходной пользовательской ошибки и применить безопасную recovery policy.`]}),`
|
|
317
|
+
`,(0,c.jsx)(t.h3,{id:`storage-schema-и-limits`,children:`Storage schema и limits`}),`
|
|
318
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
319
|
+
`,(0,c.jsxs)(t.li,{children:[`база: `,(0,c.jsx)(t.code,{children:"${__APP_ID__}.error-report.queue.v1"}),`;`]}),`
|
|
320
|
+
`,(0,c.jsxs)(t.li,{children:[`object store: `,(0,c.jsx)(t.code,{children:`records`}),`;`]}),`
|
|
321
|
+
`,(0,c.jsxs)(t.li,{children:[`атомарная envelope-запись: `,(0,c.jsx)(t.code,{children:`queue.v1`}),`;`]}),`
|
|
322
|
+
`,(0,c.jsxs)(t.li,{children:[`queue schema: `,(0,c.jsx)(t.code,{children:`queueVersion: 1`}),`;`]}),`
|
|
323
|
+
`,(0,c.jsx)(t.li,{children:`максимум: 50 записей;`}),`
|
|
324
|
+
`,(0,c.jsxs)(t.li,{children:[`TTL каждой записи: 7 суток от `,(0,c.jsx)(t.code,{children:`enqueue`}),`, независимо от client `,(0,c.jsx)(t.code,{children:`createdUtc`}),`;`]}),`
|
|
325
|
+
`,(0,c.jsx)(t.li,{children:`lease по умолчанию: 30 секунд.`}),`
|
|
326
|
+
`]}),`
|
|
327
|
+
`,(0,c.jsxs)(t.p,{children:[`Одна bounded envelope используется намеренно: `,(0,c.jsx)(t.code,{children:`createIndexedDbQueryStorage.updateItem`}),` изменяет её в одной `,(0,c.jsx)(t.code,{children:`readwrite`}),` транзакции, поэтому две вкладки не могут одновременно получить один report. Payload уже ограничен 256 KiB, а число записей — 50; отдельная база не смешивается с persisted Query cache.`]}),`
|
|
328
|
+
`,(0,c.jsxs)(t.p,{children:[`При заполнении удаляется самый старый отчёт без активного lease, чтобы сохранить более свежую диагностику. Активные leases не вытесняются; если все 50 записей leased, `,(0,c.jsx)(t.code,{children:`enqueue`}),` возвращает `,(0,c.jsx)(t.code,{children:`capacity-exceeded`}),`. Повторный `,(0,c.jsx)(t.code,{children:`reportId`}),` возвращает `,(0,c.jsx)(t.code,{children:`duplicate`}),` и не заменяет сохранённый payload.`]}),`
|
|
329
|
+
`,(0,c.jsx)(t.h3,{id:`lease-flow`,children:`Lease flow`}),`
|
|
330
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const lease = await queue.leaseNext({ ownerId: tabId });
|
|
331
|
+
if (!lease) return;
|
|
332
|
+
|
|
333
|
+
try {
|
|
334
|
+
await deliver(lease.payload);
|
|
335
|
+
await queue.acknowledge(lease.reportId, tabId);
|
|
336
|
+
} catch {
|
|
337
|
+
await queue.reschedule(lease.reportId, tabId, {
|
|
338
|
+
nextAttemptUtc,
|
|
339
|
+
failure: { utc: new Date().toISOString(), kind: "network" }
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
`})}),`
|
|
343
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`acknowledge`}),`, `,(0,c.jsx)(t.code,{children:`reschedule`}),` и `,(0,c.jsx)(t.code,{children:`discard`}),` изменяют запись только при совпадении `,(0,c.jsx)(t.code,{children:`ownerId`}),`. После crash/закрытия вкладки lease автоматически снова становится доступным по `,(0,c.jsx)(t.code,{children:`expiresUtc`}),`. Если server принял отчёт, а acknowledgement потерялся, клиент повторит тот же `,(0,c.jsx)(t.code,{children:`reportId`}),`; backend обязан быть идемпотентным.`]}),`
|
|
344
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`lastFailure`}),` хранит только технический класс, UTC и optional HTTP status. Текст transport error не попадает в durable storage.`]}),`
|
|
345
|
+
`,(0,c.jsx)(t.h3,{id:`queue-api`,children:`Queue API`}),`
|
|
346
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
347
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`enqueue(payload, now?)`}),` — runtime-валидирует payload, удаляет expired и добавляет запись;`]}),`
|
|
348
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`leaseNext({ ownerId, now?, leaseDurationMs? })`}),` — атомарно выбирает ближайшую due-запись;`]}),`
|
|
349
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`acknowledge(reportId, ownerId)`}),` — удаляет подтверждённую запись;`]}),`
|
|
350
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`reschedule(reportId, ownerId, retry)`}),` — снимает lease и задаёт следующую попытку;`]}),`
|
|
351
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`discard(reportId, ownerId)`}),` — удаляет terminal-запись;`]}),`
|
|
352
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`getRecords(now?)`}),` — bounded диагностический snapshot;`]}),`
|
|
353
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`getNextWakeUtc(now?)`}),` — ближайшее due/lease-expiry время для scheduler-а.`]}),`
|
|
354
|
+
`]}),`
|
|
355
|
+
`,(0,c.jsxs)(t.p,{children:[`Queue не использует `,(0,c.jsx)(t.code,{children:`navigator.onLine`}),` как источник истины и не владеет timer/event lifecycle. Этим занимается delivery coordinator из `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/error-report`}),`.`]}),`
|
|
276
356
|
`,(0,c.jsxs)(t.h2,{id:`низкоуровневый-captureerrorreportdraftargs`,children:[`Низкоуровневый `,(0,c.jsx)(t.code,{children:`captureErrorReportDraft(args)`})]}),`
|
|
277
357
|
`,(0,c.jsx)(t.p,{children:`Используйте, когда все diagnostic sections уже подготовлены вручную:`}),`
|
|
278
358
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft = captureErrorReportDraft({
|
|
@@ -304,7 +384,7 @@ try {
|
|
|
304
384
|
});
|
|
305
385
|
}
|
|
306
386
|
`})}),`
|
|
307
|
-
`,(0,c.jsxs)(t.p,{children:[`Для неизвестного ID update возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.
|
|
387
|
+
`,(0,c.jsxs)(t.p,{children:[`Для неизвестного ID update возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`. Функция принимает только lifecycle-поля `,(0,c.jsx)(t.code,{children:`status`}),`, `,(0,c.jsx)(t.code,{children:`sentUtc`}),`, `,(0,c.jsx)(t.code,{children:`failedReason`}),`; identity и payload изменить через неё нельзя. Runtime parser повторно проверяет draft, а свободный текст причины ограничивается и очищается перед storage write. Семантику разрешённых переходов статусов задаст delivery coordinator.`]}),`
|
|
308
388
|
`,(0,c.jsx)(t.h2,{id:`environment-api`,children:`Environment API`}),`
|
|
309
389
|
`,(0,c.jsx)(t.h3,{id:`geterrorreportenvironment`,children:(0,c.jsx)(t.code,{children:`getErrorReportEnvironment()`})}),`
|
|
310
390
|
`,(0,c.jsxs)(t.p,{children:[`Возвращает mode из `,(0,c.jsx)(t.code,{children:`__DEV__`}),` и build ID.`]}),`
|
|
@@ -331,7 +411,7 @@ try {
|
|
|
331
411
|
`})}),`
|
|
332
412
|
`,(0,c.jsxs)(t.p,{children:[`Для отключения передайте `,(0,c.jsx)(t.code,{children:`undefined`}),`. Регистрация очищает недавние transport keys.`]}),`
|
|
333
413
|
`,(0,c.jsx)(t.h3,{id:`reporttransporterrorerror-context`,children:(0,c.jsx)(t.code,{children:`reportTransportError(error, context)`})}),`
|
|
334
|
-
`,(0,c.jsxs)(t.p,{children:[`Context имеет source `,(0,c.jsx)(t.code,{children:`fetch.parseResponse`}),` или `,(0,c.jsx)(t.code,{children:`fetch.buildHttpError`}),` и может содержать URL, method, SAP client, status/content type, redirect/response type и
|
|
414
|
+
`,(0,c.jsxs)(t.p,{children:[`Context имеет source `,(0,c.jsx)(t.code,{children:`fetch.parseResponse`}),` или `,(0,c.jsx)(t.code,{children:`fetch.buildHttpError`}),` и может содержать URL, method, SAP client, status/content type, redirect/response type и только техническое summary HTML-response. HTML title и text preview больше не входят в контракт, потому что являются содержимым response body.`]}),`
|
|
335
415
|
`,(0,c.jsxs)(t.p,{children:[`Вызов планирует reporter через 250 мс. Задержка позволяет TanStack Query перехватить тот же `,(0,c.jsx)(t.code,{children:`Error`}),` и создать более полезный query/mutation report.`]}),`
|
|
336
416
|
`,(0,c.jsx)(t.h3,{id:`подавление-дубля`,children:`Подавление дубля`}),`
|
|
337
417
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isTransportErrorReportScheduled(error);
|
|
@@ -381,11 +461,10 @@ suppressTransportErrorReport(error);
|
|
|
381
461
|
`,(0,c.jsx)(t.li,{children:`queryKey и mutationKey;`}),`
|
|
382
462
|
`,(0,c.jsx)(t.li,{children:`query/mutation meta;`}),`
|
|
383
463
|
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`context.detail`}),`;`]}),`
|
|
384
|
-
`,(0,c.jsx)(t.li,{children:`
|
|
464
|
+
`,(0,c.jsx)(t.li,{children:`pathname без search/hash;`}),`
|
|
385
465
|
`,(0,c.jsx)(t.li,{children:`error message/stack;`}),`
|
|
386
|
-
`,(0,c.jsx)(t.li,{children:`
|
|
466
|
+
`,(0,c.jsx)(t.li,{children:`app-provided context, если policy ошибочно разрешила предметные данные;`}),`
|
|
387
467
|
`,(0,c.jsx)(t.li,{children:`user agent, language, timezone;`}),`
|
|
388
|
-
`,(0,c.jsx)(t.li,{children:`имена persisted storage keys.`}),`
|
|
389
468
|
`]}),`
|
|
390
469
|
`,(0,c.jsx)(t.p,{children:`Поэтому:`}),`
|
|
391
470
|
`,(0,c.jsxs)(t.ol,{children:[`
|
|
@@ -399,9 +478,9 @@ suppressTransportErrorReport(error);
|
|
|
399
478
|
`]}),`
|
|
400
479
|
`,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
|
|
401
480
|
`,(0,c.jsx)(t.h3,{id:`ожидать-автоматическую-отправку`,children:`Ожидать автоматическую отправку`}),`
|
|
402
|
-
`,(0,c.jsx)(t.p,{children:`Capture только создаёт draft.
|
|
403
|
-
`,(0,c.
|
|
404
|
-
`,(0,c.jsx)(t.p,{children
|
|
481
|
+
`,(0,c.jsx)(t.p,{children:`Capture только создаёт draft. Приложение должно enqueue-ить его payload и один раз запустить API coordinator в client lifecycle.`}),`
|
|
482
|
+
`,(0,c.jsx)(t.h3,{id:`считать-built-in-redaction-полной-privacy-policy`,children:`Считать built-in redaction полной privacy policy`}),`
|
|
483
|
+
`,(0,c.jsx)(t.p,{children:`Foundation удаляет известные secret-like keys и email, но не умеет надёжно распознавать ФИО, телефоны и предметные IDs. Настройте app sanitizer по allow-list.`}),`
|
|
405
484
|
`,(0,c.jsx)(t.h3,{id:`вызывать-production-capture-в-development-и-ждать-draft`,children:`Вызывать production capture в development и ждать draft`}),`
|
|
406
485
|
`,(0,c.jsxs)(t.p,{children:[`По контракту вернётся `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
|
|
407
486
|
`,(0,c.jsx)(t.h3,{id:`не-очищать-глобальные-reporters`,children:`Не очищать глобальные reporters`}),`
|
|
@@ -413,4 +492,4 @@ suppressTransportErrorReport(error);
|
|
|
413
492
|
`,(0,c.jsx)(t.h3,{id:`создать-цикл-отчётов`,children:`Создать цикл отчётов`}),`
|
|
414
493
|
`,(0,c.jsx)(t.p,{children:`Ошибка endpoint доставки не должна снова проходить через тот же автоматический transport reporter. Пометьте/исключите delivery transport или используйте отдельный канал.`}),`
|
|
415
494
|
`,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
|
|
416
|
-
`,(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:`Capture`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`captureQueryErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureMutationErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureRuntimeErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Errors`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorInfo`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Safe values`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),`, `,(0,c.jsx)(t.code,{children:`createDataShape`}),`, `,(0,c.jsx)(t.code,{children:`sanitizeDetail`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Breadcrumbs`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`addErrorReportBreadcrumb`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`clearErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`installErrorReportBrowserBreadcrumbs`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Diagnostics`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`collectQueryDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectMutationDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectQueryClientDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectPersistedQueryDiagnostics`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Drafts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportDrafts`}),`, `,(0,c.jsx)(t.code,{children:`updateErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Environment`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isErrorReportingEnabled`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportEnvironment`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportClientEnvironment`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Runtime facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportRuntimeErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportRuntimeError`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Transport facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportTransportErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportTransportError`}),`, `,(0,c.jsx)(t.code,{children:`isTransportErrorReportScheduled`}),`, `,(0,c.jsx)(t.code,{children:`suppressTransportErrorReport`})]})]}),(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:`ErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`ErrorReportPayload`}),`, contexts, diagnostics и transport types`]})]})]})]})]})}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};
|
|
495
|
+
`,(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:`Capture`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`captureQueryErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureMutationErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureRuntimeErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Errors`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorInfo`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Safe values`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),`, `,(0,c.jsx)(t.code,{children:`createDataShape`}),`, `,(0,c.jsx)(t.code,{children:`sanitizeDetail`}),`, `,(0,c.jsx)(t.code,{children:`sanitizeErrorReportValue`}),`, `,(0,c.jsx)(t.code,{children:`setErrorReportSanitizer`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Payload contract`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ERROR_REPORT_PAYLOAD_VERSION`}),`, `,(0,c.jsx)(t.code,{children:`ERROR_REPORT_PAYLOAD_MAX_BYTES`}),`, `,(0,c.jsx)(t.code,{children:`limitErrorReportPayload`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportPayloadSize`}),`, parsers`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Durable queue`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createErrorReportQueue`}),`, queue limits, record/parser и atomic lease transitions`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Breadcrumbs`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`addErrorReportBreadcrumb`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`clearErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`installErrorReportBrowserBreadcrumbs`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Diagnostics`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`collectQueryDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectMutationDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectQueryClientDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectPersistedQueryDiagnostics`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Drafts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportDrafts`}),`, `,(0,c.jsx)(t.code,{children:`updateErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Environment`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isErrorReportingEnabled`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportEnvironment`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportClientEnvironment`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Runtime facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportRuntimeErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportRuntimeError`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Transport facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportTransportErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportTransportError`}),`, `,(0,c.jsx)(t.code,{children:`isTransportErrorReportScheduled`}),`, `,(0,c.jsx)(t.code,{children:`suppressTransportErrorReport`})]})]}),(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:`ErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`ErrorReportPayload`}),`, contexts, diagnostics и transport types`]})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/OData/OData V2 and SAP Gateway`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`odata-v2-и-sap-gateway`,children:`OData V2 и SAP Gateway`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Entrypoint `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/odata`}),` — основной API-модуль для browser-приложений, работающих с SAP Gateway и OData V2.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Он объединяет:`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Table and Tree Table`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`table-и-tree-table`,children:`Table и Tree Table`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Эта страница описывает два связанных публичных модуля:`}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/Errors/Error Report Delivery`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`durable-delivery-через-ryuzaki13react-foundation-apierror-report`,children:[`Durable delivery через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/error-report`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль доставляет versioned payload из IndexedDB queue `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),`. Он владеет lease processing, timeout, retry/terminal policy и browser lifecycle, но не знает endpoint, auth и DB contract приложения.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`foundation-lib/error-report foundation-api/error-report app adapter/backend
|
|
5
|
+
capture + sanitize + IndexedDB ─────► lease + retry coordinator ─────────► serverFn / HTTP
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
8
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-api \\
|
|
9
|
+
@ryuzaki13/react-foundation-lib
|
|
10
|
+
`})}),`
|
|
11
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { captureRuntimeErrorReport, createErrorReportQueue } from "@ryuzaki13/react-foundation-lib/error-report";
|
|
12
|
+
import {
|
|
13
|
+
createErrorReportDeliveryCoordinator,
|
|
14
|
+
ErrorReportDeliveryHttpError,
|
|
15
|
+
type ErrorReportDeliveryAdapter
|
|
16
|
+
} from "@ryuzaki13/react-foundation-api/error-report";
|
|
17
|
+
`})}),`
|
|
18
|
+
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
19
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const queue = createErrorReportQueue();
|
|
20
|
+
if (!queue) {
|
|
21
|
+
// IndexedDB недоступен: app фиксирует bounded fallback без рекурсивного report.
|
|
22
|
+
return () => undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const adapter: ErrorReportDeliveryAdapter = async (body, { signal }) => {
|
|
26
|
+
const response = await fetch("/api/error-reports", {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "Content-Type": "application/json" },
|
|
29
|
+
body: JSON.stringify(body),
|
|
30
|
+
signal
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const retryAfterSeconds = Number(response.headers.get("Retry-After"));
|
|
35
|
+
throw new ErrorReportDeliveryHttpError(response.status, Number.isFinite(retryAfterSeconds) ? retryAfterSeconds * 1_000 : undefined);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const coordinator = createErrorReportDeliveryCoordinator({ queue, adapter });
|
|
40
|
+
const stop = coordinator.start();
|
|
41
|
+
|
|
42
|
+
const draft = await captureRuntimeErrorReport(error, context, queryClient);
|
|
43
|
+
if (draft) {
|
|
44
|
+
await coordinator.enqueue(draft.payload);
|
|
45
|
+
}
|
|
46
|
+
`})}),`
|
|
47
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`coordinator.enqueue`}),` будит delivery в текущей вкладке. Другие вкладки обнаружат запись через bounded poll; correctness не зависит от `,(0,c.jsx)(t.code,{children:`BroadcastChannel`}),`.`]}),`
|
|
48
|
+
`,(0,c.jsx)(t.h2,{id:`delivery-body`,children:`Delivery body`}),`
|
|
49
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`createErrorReportDeliveryBody(payload)`}),` повторно runtime-валидирует payload и возвращает:`]}),`
|
|
50
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ErrorReportDeliveryBody = {
|
|
51
|
+
payloadVersion: number;
|
|
52
|
+
application: string;
|
|
53
|
+
buildId?: string;
|
|
54
|
+
reportId: string;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
createdUtc: string;
|
|
57
|
+
category: ErrorReportCategory;
|
|
58
|
+
errorClass: string;
|
|
59
|
+
errorMessage: string;
|
|
60
|
+
stackTrace?: string;
|
|
61
|
+
payload: string;
|
|
62
|
+
};
|
|
63
|
+
`})}),`
|
|
64
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`application`}),`, `,(0,c.jsx)(t.code,{children:`buildId`}),` и `,(0,c.jsx)(t.code,{children:`payloadVersion`}),` дублируются с JSON для bounded DB columns и поиска. `,(0,c.jsx)(t.code,{children:`payload`}),` уже является JSON string; при сериализации внешнего HTTP body его не нужно stringify-ить отдельно второй раз.`]}),`
|
|
65
|
+
`,(0,c.jsxs)(t.p,{children:[`Пустой `,(0,c.jsx)(t.code,{children:`error.message`}),` получает fallback `,(0,c.jsx)(t.code,{children:`Неизвестная ошибка`}),` одновременно в `,(0,c.jsx)(t.code,{children:`errorMessage`}),` и сериализованном payload. Future/unversioned payload отклоняется до adapter-а.`]}),`
|
|
66
|
+
`,(0,c.jsx)(t.h2,{id:`retry-и-terminal-policy`,children:`Retry и terminal policy`}),`
|
|
67
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Failure`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`network `,(0,c.jsx)(t.code,{children:`TypeError`}),`, timeout/abort, неизвестная ошибка`]}),(0,c.jsx)(t.td,{children:`retry`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`408`}),`, `,(0,c.jsx)(t.code,{children:`425`}),`, `,(0,c.jsx)(t.code,{children:`429`})]}),(0,c.jsx)(t.td,{children:`retry`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`5xx`})]}),(0,c.jsx)(t.td,{children:`retry`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`остальные HTTP `,(0,c.jsx)(t.code,{children:`4xx`})]}),(0,c.jsx)(t.td,{children:`terminal discard`})]})]})]}),`
|
|
68
|
+
`,(0,c.jsxs)(t.p,{children:[`Для status-aware результата adapter бросает `,(0,c.jsx)(t.code,{children:`ErrorReportDeliveryHttpError(status, retryAfterMs?)`}),`. Произвольный server response body и текст exception не сохраняются в IndexedDB.`]}),`
|
|
69
|
+
`,(0,c.jsx)(t.p,{children:`Retry использует exponential backoff:`}),`
|
|
70
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
71
|
+
`,(0,c.jsx)(t.li,{children:`база 5 секунд;`}),`
|
|
72
|
+
`,(0,c.jsxs)(t.li,{children:[`multiplicative jitter `,(0,c.jsx)(t.code,{children:`0.5–1.5`}),`;`]}),`
|
|
73
|
+
`,(0,c.jsx)(t.li,{children:`максимум 15 минут;`}),`
|
|
74
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Retry-After`}),` может увеличить задержку, но тоже ограничен 15 минутами.`]}),`
|
|
75
|
+
`]}),`
|
|
76
|
+
`,(0,c.jsxs)(t.p,{children:[`Неизвестная transport-ошибка считается retryable: временный сбой не должен необратимо уничтожить отчёт. Невалидный запрос server должен отвечать `,(0,c.jsx)(t.code,{children:`4xx`}),`, чтобы запись была удалена как terminal.`]}),`
|
|
77
|
+
`,(0,c.jsx)(t.h2,{id:`lease-timeout-и-idempotency`,children:`Lease, timeout и idempotency`}),`
|
|
78
|
+
`,(0,c.jsx)(t.p,{children:`Coordinator по умолчанию использует:`}),`
|
|
79
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
80
|
+
`,(0,c.jsx)(t.li,{children:`lease 30 секунд;`}),`
|
|
81
|
+
`,(0,c.jsx)(t.li,{children:`timeout одной отправки 20 секунд;`}),`
|
|
82
|
+
`,(0,c.jsx)(t.li,{children:`последовательный batch максимум 10 записей;`}),`
|
|
83
|
+
`,(0,c.jsx)(t.li,{children:`fallback poll 30 секунд.`}),`
|
|
84
|
+
`]}),`
|
|
85
|
+
`,(0,c.jsxs)(t.p,{children:[`Timeout обязан быть меньше lease. При закрытии/crash вкладки запись снова доступна после истечения lease. `,(0,c.jsx)(t.code,{children:`acknowledge`}),`, `,(0,c.jsx)(t.code,{children:`reschedule`}),` и `,(0,c.jsx)(t.code,{children:`discard`}),` выполняются только владельцем текущего lease.`]}),`
|
|
86
|
+
`,(0,c.jsxs)(t.p,{children:[`Backend обязан быть идемпотентным по `,(0,c.jsx)(t.code,{children:`reportId`}),`. Если server сохранил отчёт, а network acknowledgement или IndexedDB delete потерялись, queue отправит тот же ID повторно. Успешный duplicate request должен считаться server success, а не terminal conflict.`]}),`
|
|
87
|
+
`,(0,c.jsx)(t.h2,{id:`browser-lifecycle`,children:`Browser lifecycle`}),`
|
|
88
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`start()`}),` устанавливает только client-side listeners:`]}),`
|
|
89
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
90
|
+
`,(0,c.jsx)(t.li,{children:`немедленный flush при старте;`}),`
|
|
91
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`online`}),` и `,(0,c.jsx)(t.code,{children:`pageshow`}),` ускоряют следующую попытку;`]}),`
|
|
92
|
+
`,(0,c.jsx)(t.li,{children:`возврат вкладки в visible state ускоряет попытку;`}),`
|
|
93
|
+
`,(0,c.jsx)(t.li,{children:`bounded timer гарантирует progress без browser events.`}),`
|
|
94
|
+
`]}),`
|
|
95
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`navigator.onLine`}),` не используется как запрет отправки: браузер может ошибочно сообщать offline/online. Единственный владелец конкретной попытки определяется IndexedDB lease.`]}),`
|
|
96
|
+
`,(0,c.jsxs)(t.p,{children:[`На SSR `,(0,c.jsx)(t.code,{children:`start()`}),` возвращает no-op cleanup и не устанавливает timer. При размонтировании/HMR нужно вызвать возвращённый `,(0,c.jsx)(t.code,{children:`stop`}),`; активный fetch получает abort signal.`]}),`
|
|
97
|
+
`,(0,c.jsx)(t.h2,{id:`coordinator-events-и-storage-failures`,children:`Coordinator events и storage failures`}),`
|
|
98
|
+
`,(0,c.jsxs)(t.p,{children:[`Optional `,(0,c.jsx)(t.code,{children:`onEvent`}),` получает только bounded технические события:`]}),`
|
|
99
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
100
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`delivered`}),`;`]}),`
|
|
101
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`retry-scheduled`}),`;`]}),`
|
|
102
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`discarded`}),` с optional HTTP status;`]}),`
|
|
103
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`lease-lost`}),` и стадия перехода;`]}),`
|
|
104
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`storage-failure`}),` и стадия операции.`]}),`
|
|
105
|
+
`]}),`
|
|
106
|
+
`,(0,c.jsx)(t.p,{children:`Raw error, response text и payload в события не входят. Исключение самого observer подавляется, чтобы observability не создавала рекурсивный error report.`}),`
|
|
107
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`coordinator.enqueue`}),` преобразует IndexedDB quota/open/write failure в `,(0,c.jsx)(t.code,{children:`{ status: "storage-error" }`}),`. Background `,(0,c.jsx)(t.code,{children:`flush`}),` не выбрасывает storage failure наружу, а увеличивает `,(0,c.jsx)(t.code,{children:`storageFailures`}),` в результате. После успешной server delivery и неуспешного local acknowledgement запись остаётся под lease и позже повторяется с тем же `,(0,c.jsx)(t.code,{children:`reportId`}),`.`]}),`
|
|
108
|
+
`,(0,c.jsx)(t.h2,{id:`тестирование-adapter-а-приложения`,children:`Тестирование adapter-а приложения`}),`
|
|
109
|
+
`,(0,c.jsx)(t.p,{children:`Обязательно проверить:`}),`
|
|
110
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
111
|
+
`,(0,c.jsx)(t.li,{children:`успешный ответ и server duplicate acknowledgement;`}),`
|
|
112
|
+
`,(0,c.jsxs)(t.li,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`400/401/403/422`}),` как terminal;`]}),`
|
|
113
|
+
`,(0,c.jsxs)(t.li,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`408/425/429/5xx`}),` как retryable;`]}),`
|
|
114
|
+
`,(0,c.jsxs)(t.li,{children:[`передачу `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` в фактический fetch/serverFn transport;`]}),`
|
|
115
|
+
`,(0,c.jsx)(t.li,{children:`потерю acknowledgement после server insert;`}),`
|
|
116
|
+
`,(0,c.jsx)(t.li,{children:`отсутствие report recursion при ошибке endpoint;`}),`
|
|
117
|
+
`,(0,c.jsx)(t.li,{children:`отсутствие raw response body в queue/events/logs.`}),`
|
|
118
|
+
`]}),`
|
|
119
|
+
`,(0,c.jsx)(t.p,{children:`Package tests дополнительно покрывают crash recovery, two-tab lease race, TTL, capacity, reopen, offline/online signal и quota failure.`}),`
|
|
120
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
121
|
+
`,(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:`Строит validated server body из payload`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorReportDeliveryCoordinator`})}),(0,c.jsx)(t.td,{children:`Управляет browser lifecycle, lease processing и delivery`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`classifyErrorReportDeliveryFailure`})}),(0,c.jsx)(t.td,{children:`Единая retry/terminal policy`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`calculateErrorReportRetryDelay`})}),(0,c.jsx)(t.td,{children:`Exponential backoff с jitter и cap`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryHttpError`})}),(0,c.jsx)(t.td,{children:`Status-aware ошибка app adapter-а`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryTimeoutError`})}),(0,c.jsx)(t.td,{children:`Технический timeout одной попытки`})]}),(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:`Узкий contract transport-а приложения`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryCoordinatorEvent`})}),(0,c.jsx)(t.td,{children:`Bounded observable lifecycle events`})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Boolean`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`boolean-и-abap-boolean`,children:`Boolean и ABAP boolean`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Подмодуль `,(0,c.jsx)(t.code,{children:`boolean`}),` преобразует значения между JavaScript `,(0,c.jsx)(t.code,{children:`boolean`}),` и двухсимвольным ABAP-контрактом:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/HTTP/Headers and Text Response`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`http-headers-и-текстовые-ответы`,children:`HTTP headers и текстовые ответы`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль создаёт стандартный набор HTTP-заголовков запрета кеширования и обычный `,(0,c.jsx)(t.code,{children:`Response`}),` с UTF-8 plain text.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Crypto`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`идентификаторы-и-строковые-hash`,children:`Идентификаторы и строковые hash`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`crypto`}),` предоставляет небольшие функции для двух разных задач:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Presets`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`общие-preset-helpers`,children:`Общие preset helpers`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль проверяет восстановленные preset ids, сопоставляет их с option objects и ищет одну option по id.`}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Date/Segments`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`сегменты-даты-и-времени`,children:`Сегменты даты и времени`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль разбирает строковую маску на редактируемые сегменты и литералы, преобразует `,(0,c.jsx)(t.code,{children:`Date`}),` в значения полей и строго собирает `,(0,c.jsx)(t.code,{children:`Date`}),` обратно. Он предназначен для segment-based date/time inputs.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Документ объясняет маски, индексы, local time, двухзначный год, неполный ввод и все публичные типы.`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Array`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`работа-с-массивами`,children:`Работа с массивами`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`array`}),` содержит небольшие типизированные функции для типовых операций с массивами:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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
2
|
`,(0,c.jsx)(t.h1,{id:`client-fingerprint`,children:`Client fingerprint`}),`
|
|
3
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
4
|
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/String Comparison`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`сравнение-строк`,children:`Сравнение строк`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`compareStrings`}),` задаёт единый порядок строк для русскоязычных UI-списков, смешанной кириллицы/латиницы и числовых суффиксов.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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 Lib/Data/Number Scale`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`number-scale`,children:`Number Scale`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/number-scale`}),` содержит чистую математику для slider, range, числовой шкалы и управления значением с клавиатуры. Модуль не содержит React-компонентов и не рисует ползунок.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Он решает четыре связанные задачи:`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/SAP/ADT Transports`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`sap-adt-transports-через-ryuzaki13react-foundation-apiadt`,children:[`SAP ADT transports через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/adt`})]}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль получает transport requests текущего пользователя из SAP ADT endpoint и преобразует XML в простой массив объектов.`}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|