@shapio/cms 0.5.5 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/assets/{AssetTile-CaYPqR_F.js → AssetTile-H0hABhB2.js} +2 -2
- package/dist/admin/assets/{AssetTile-CaYPqR_F.js.map → AssetTile-H0hABhB2.js.map} +1 -1
- package/dist/admin/assets/AssistError-1s3PuY0X.js +2 -0
- package/dist/admin/assets/{AssistError-drmpXSbS.js.map → AssistError-1s3PuY0X.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-D-jZ0oaU.js → BlockMenuItems-a8zXdfcF.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-D-jZ0oaU.js.map → BlockMenuItems-a8zXdfcF.js.map} +1 -1
- package/dist/admin/assets/Body-BzZD-TZT.js +2 -0
- package/dist/admin/assets/{Body-Gn_z2KPN.js.map → Body-BzZD-TZT.js.map} +1 -1
- package/dist/admin/assets/Builder-60jO_nbS.js +2 -0
- package/dist/admin/assets/Builder-60jO_nbS.js.map +1 -0
- package/dist/admin/assets/{CodeEditor-CzRU6och.js → CodeEditor-BLbJZE9v.js} +2 -2
- package/dist/admin/assets/{CodeEditor-CzRU6och.js.map → CodeEditor-BLbJZE9v.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-h4HYhnYp.js → CopyButton-BOtR_h1H.js} +2 -2
- package/dist/admin/assets/{CopyButton-h4HYhnYp.js.map → CopyButton-BOtR_h1H.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-H4SpVYw7.js → CursorPager-DwLW13ov.js} +2 -2
- package/dist/admin/assets/{CursorPager-H4SpVYw7.js.map → CursorPager-DwLW13ov.js.map} +1 -1
- package/dist/admin/assets/{ExternalLink-BNq7nAYL.js → ExternalLink-BITMgS1K.js} +2 -2
- package/dist/admin/assets/{ExternalLink-BNq7nAYL.js.map → ExternalLink-BITMgS1K.js.map} +1 -1
- package/dist/admin/assets/{FocalPoint-CSeKI4Iw.js → FocalPoint-n-a_AXKN.js} +2 -2
- package/dist/admin/assets/{FocalPoint-CSeKI4Iw.js.map → FocalPoint-n-a_AXKN.js.map} +1 -1
- package/dist/admin/assets/Form-D_4fhOy0.js +2 -0
- package/dist/admin/assets/Form-D_4fhOy0.js.map +1 -0
- package/dist/admin/assets/{FormCheckboxGroup-V3IKrvzc.js → FormCheckboxGroup-1fYisXrr.js} +2 -2
- package/dist/admin/assets/FormCheckboxGroup-1fYisXrr.js.map +1 -0
- package/dist/admin/assets/{FormRadioGroup-DIv-MYgn.js → FormRadioGroup-B0VZyb1t.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-DIv-MYgn.js.map → FormRadioGroup-B0VZyb1t.js.map} +1 -1
- package/dist/admin/assets/{FormSelectField-CUhaPIMY.js → FormSelectField-Br8bkwRF.js} +2 -2
- package/dist/admin/assets/{FormSelectField-CUhaPIMY.js.map → FormSelectField-Br8bkwRF.js.map} +1 -1
- package/dist/admin/assets/{FormSwitchField-DW8ysyk_.js → FormSwitchField-d8G-YCSX.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-DW8ysyk_.js.map → FormSwitchField-d8G-YCSX.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-DbqZ-MwI.js → FormTextareaField-BSKNeTPW.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-DbqZ-MwI.js.map → FormTextareaField-BSKNeTPW.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-BlLtqVVz.js → HintedLabel-CiTDE112.js} +2 -2
- package/dist/admin/assets/{HintedLabel-BlLtqVVz.js.map → HintedLabel-CiTDE112.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-bYMd_t0J.js → InfoHint-B3XcXtiN.js} +2 -2
- package/dist/admin/assets/{InfoHint-bYMd_t0J.js.map → InfoHint-B3XcXtiN.js.map} +1 -1
- package/dist/admin/assets/InlineConfirm-BfsNH5S_.js +2 -0
- package/dist/admin/assets/InlineConfirm-BfsNH5S_.js.map +1 -0
- package/dist/admin/assets/InsertMenuItem-BGwDW_Lu.js +2 -0
- package/dist/admin/assets/InsertMenuItem-BGwDW_Lu.js.map +1 -0
- package/dist/admin/assets/{LinkTabs-ByB2eCIr.js → LinkTabs-8SmS1vCd.js} +2 -2
- package/dist/admin/assets/{LinkTabs-ByB2eCIr.js.map → LinkTabs-8SmS1vCd.js.map} +1 -1
- package/dist/admin/assets/{Match-GDx_orOH.js → Match-Dc8bXsKo.js} +2 -2
- package/dist/admin/assets/{Match-GDx_orOH.js.map → Match-Dc8bXsKo.js.map} +1 -1
- package/dist/admin/assets/NoAccess-CKEKPmqD.js +2 -0
- package/dist/admin/assets/NoAccess-CKEKPmqD.js.map +1 -0
- package/dist/admin/assets/Panel-Bcl09TtM.js +2 -0
- package/dist/admin/assets/Panel-Bcl09TtM.js.map +1 -0
- package/dist/admin/assets/{QueryView-UBO-U5Wo.js → QueryView-KFtwko9F.js} +2 -2
- package/dist/admin/assets/{QueryView-UBO-U5Wo.js.map → QueryView-KFtwko9F.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-CJbIIV8t.js → RadioTile-CzfxWgHx.js} +2 -2
- package/dist/admin/assets/{RadioTile-CJbIIV8t.js.map → RadioTile-CzfxWgHx.js.map} +1 -1
- package/dist/admin/assets/{RichTextField-M7HyUhYF.js → RichTextField-BsBoOAP-.js} +5 -5
- package/dist/admin/assets/{RichTextField-M7HyUhYF.js.map → RichTextField-BsBoOAP-.js.map} +1 -1
- package/dist/admin/assets/{RowTitle-DoxDM1XL.js → RowTitle-Cn5mAU58.js} +2 -2
- package/dist/admin/assets/{RowTitle-DoxDM1XL.js.map → RowTitle-Cn5mAU58.js.map} +1 -1
- package/dist/admin/assets/SecretReveal-BCOJAisI.js +2 -0
- package/dist/admin/assets/SecretReveal-BCOJAisI.js.map +1 -0
- package/dist/admin/assets/{SharedGlyph-D1OMHXPf.js → SharedGlyph-CA8tb7UH.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-D1OMHXPf.js.map → SharedGlyph-CA8tb7UH.js.map} +1 -1
- package/dist/admin/assets/StepList-sriwGP1e.js +2 -0
- package/dist/admin/assets/StepList-sriwGP1e.js.map +1 -0
- package/dist/admin/assets/{Structure-CO4aJZVP.js → Structure-B2HZ9UZu.js} +2 -2
- package/dist/admin/assets/{Structure-CO4aJZVP.js.map → Structure-B2HZ9UZu.js.map} +1 -1
- package/dist/admin/assets/{SubNavLink-CPJFIt1j.js → SubNavLink-CiCaVV8U.js} +2 -2
- package/dist/admin/assets/{SubNavLink-CPJFIt1j.js.map → SubNavLink-CiCaVV8U.js.map} +1 -1
- package/dist/admin/assets/{SuggestAltButton-CbRUxD5s.js → SuggestAltButton-CqDLAuoa.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CbRUxD5s.js.map → SuggestAltButton-CqDLAuoa.js.map} +1 -1
- package/dist/admin/assets/{TextLink-DnrMaF2F.js → TextLink-HRn66VL1.js} +2 -2
- package/dist/admin/assets/{TextLink-DnrMaF2F.js.map → TextLink-HRn66VL1.js.map} +1 -1
- package/dist/admin/assets/Thumbnail-mFfESZiW.js +2 -0
- package/dist/admin/assets/Thumbnail-mFfESZiW.js.map +1 -0
- package/dist/admin/assets/UnsavedChangesGuard-C8cDQGEA.js +2 -0
- package/dist/admin/assets/UnsavedChangesGuard-C8cDQGEA.js.map +1 -0
- package/dist/admin/assets/{UserAvatar-Bl32IpG_.js → UserAvatar-BItYDTyH.js} +2 -2
- package/dist/admin/assets/{UserAvatar-Bl32IpG_.js.map → UserAvatar-BItYDTyH.js.map} +1 -1
- package/dist/admin/assets/auth-CQO4MBUj.js +2 -0
- package/dist/admin/assets/auth-CQO4MBUj.js.map +1 -0
- package/dist/admin/assets/badge-DNQwGXBl.js +2 -0
- package/dist/admin/assets/{badge-ydvfgE8a.js.map → badge-DNQwGXBl.js.map} +1 -1
- package/dist/admin/assets/{boxes-D6Y4Cenx.js → boxes-CAygw8zF.js} +2 -2
- package/dist/admin/assets/{boxes-D6Y4Cenx.js.map → boxes-CAygw8zF.js.map} +1 -1
- package/dist/admin/assets/{calendar-clock-DFUgXWXg.js → calendar-clock-BZGtAvWR.js} +2 -2
- package/dist/admin/assets/{calendar-clock-DFUgXWXg.js.map → calendar-clock-BZGtAvWR.js.map} +1 -1
- package/dist/admin/assets/changeSets-EMTUJT0M.js +2 -0
- package/dist/admin/assets/changeSets-EMTUJT0M.js.map +1 -0
- package/dist/admin/assets/chevron-left-DGU3HGYG.js +2 -0
- package/dist/admin/assets/{chevron-left-CZXrLV99.js.map → chevron-left-DGU3HGYG.js.map} +1 -1
- package/dist/admin/assets/{circle-check-De27poaB.js → circle-check-C37MSJqX.js} +2 -2
- package/dist/admin/assets/{circle-check-De27poaB.js.map → circle-check-C37MSJqX.js.map} +1 -1
- package/dist/admin/assets/{clock-BGAXsuo4.js → clock-2arjsgZ4.js} +2 -2
- package/dist/admin/assets/{clock-BGAXsuo4.js.map → clock-2arjsgZ4.js.map} +1 -1
- package/dist/admin/assets/{constants-esJAnNTh.js → constants-miV4q1ur.js} +2 -2
- package/dist/admin/assets/{constants-esJAnNTh.js.map → constants-miV4q1ur.js.map} +1 -1
- package/dist/admin/assets/content-CgZS_S7P.js +3 -0
- package/dist/admin/assets/content-CgZS_S7P.js.map +1 -0
- package/dist/admin/assets/contentCounts-DP7YYeZZ.js +2 -0
- package/dist/admin/assets/{contentCounts-DknqJ4kh.js.map → contentCounts-DP7YYeZZ.js.map} +1 -1
- package/dist/admin/assets/{contentTypes-C-AKiYu1.js → contentTypes-CQsHL657.js} +2 -2
- package/dist/admin/assets/{contentTypes-C-AKiYu1.js.map → contentTypes-CQsHL657.js.map} +1 -1
- package/dist/admin/assets/context-IKYdzQJ-.js +2 -0
- package/dist/admin/assets/{context-fImO9k99.js.map → context-IKYdzQJ-.js.map} +1 -1
- package/dist/admin/assets/{copy-B5owk67M.js → copy-CsSRHgKZ.js} +2 -2
- package/dist/admin/assets/{copy-B5owk67M.js.map → copy-CsSRHgKZ.js.map} +1 -1
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js +2 -0
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js.map +1 -0
- package/dist/admin/assets/develop-9ZeAjSIw.js +11 -0
- package/dist/admin/assets/develop-9ZeAjSIw.js.map +1 -0
- package/dist/admin/assets/{dropdown-menu-C53v9ioW.js → dropdown-menu-0dyAtBEd.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-C53v9ioW.js.map → dropdown-menu-0dyAtBEd.js.map} +1 -1
- package/dist/admin/assets/{ellipsis-BHtU4ov6.js → ellipsis-F91991on.js} +2 -2
- package/dist/admin/assets/{ellipsis-BHtU4ov6.js.map → ellipsis-F91991on.js.map} +1 -1
- package/dist/admin/assets/entryLink-CVB-TdIn.js +2 -0
- package/dist/admin/assets/entryLink-CVB-TdIn.js.map +1 -0
- package/dist/admin/assets/es2015-BJge4oQL.js +42 -0
- package/dist/admin/assets/es2015-BJge4oQL.js.map +1 -0
- package/dist/admin/assets/{external-link-nZp2VpKw.js → external-link-CdG6kHfA.js} +2 -2
- package/dist/admin/assets/{external-link-nZp2VpKw.js.map → external-link-CdG6kHfA.js.map} +1 -1
- package/dist/admin/assets/{field-W1dB_h6d.js → field-C6NmRYUN.js} +2 -2
- package/dist/admin/assets/{field-W1dB_h6d.js.map → field-C6NmRYUN.js.map} +1 -1
- package/dist/admin/assets/{file-stack-8rRouTJj.js → file-stack-28ZtO1xW.js} +2 -2
- package/dist/admin/assets/{file-stack-8rRouTJj.js.map → file-stack-28ZtO1xW.js.map} +1 -1
- package/dist/admin/assets/{fileRoute-DzWMBrRx.js → fileRoute-Bm90K4UY.js} +2 -2
- package/dist/admin/assets/{fileRoute-DzWMBrRx.js.map → fileRoute-Bm90K4UY.js.map} +1 -1
- package/dist/admin/assets/{folder-plus-B3L3b389.js → folder-plus-DIk0pWkP.js} +2 -2
- package/dist/admin/assets/{folder-plus-B3L3b389.js.map → folder-plus-DIk0pWkP.js.map} +1 -1
- package/dist/admin/assets/followPlural-DEr2kxEc.js +2 -0
- package/dist/admin/assets/followPlural-DEr2kxEc.js.map +1 -0
- package/dist/admin/assets/{globe-DKkjr9MZ.js → globe-DFr3Gd2w.js} +2 -2
- package/dist/admin/assets/{globe-DKkjr9MZ.js.map → globe-DFr3Gd2w.js.map} +1 -1
- package/dist/admin/assets/{image-B6aL7hP8.js → image-DT79QFa_.js} +2 -2
- package/dist/admin/assets/{image-B6aL7hP8.js.map → image-DT79QFa_.js.map} +1 -1
- package/dist/admin/assets/{image-off-TVxEyb74.js → image-off-DFs5upyX.js} +2 -2
- package/dist/admin/assets/{image-off-TVxEyb74.js.map → image-off-DFs5upyX.js.map} +1 -1
- package/dist/admin/assets/inbox-B8XZ8L6s.js +2 -0
- package/dist/admin/assets/inbox-B8XZ8L6s.js.map +1 -0
- package/dist/admin/assets/{inbox-BKqu1EfP.js → inbox-CySnQydm.js} +2 -2
- package/dist/admin/assets/{inbox-BKqu1EfP.js.map → inbox-CySnQydm.js.map} +1 -1
- package/dist/admin/assets/index-DoJsnLI1.js +4 -0
- package/dist/admin/assets/index-DoJsnLI1.js.map +1 -0
- package/dist/admin/assets/index-lxe7WimO.css +2 -0
- package/dist/admin/assets/{key-round-Dmdr1vP5.js → key-round-D36CePnN.js} +2 -2
- package/dist/admin/assets/{key-round-Dmdr1vP5.js.map → key-round-D36CePnN.js.map} +1 -1
- package/dist/admin/assets/{labels-CHE0gg1n.js → labels-B2HIVxXg.js} +2 -2
- package/dist/admin/assets/{labels-CHE0gg1n.js.map → labels-B2HIVxXg.js.map} +1 -1
- package/dist/admin/assets/{languages-BbfFIygP.js → languages-CzbTaQv9.js} +2 -2
- package/dist/admin/assets/{languages-BbfFIygP.js.map → languages-CzbTaQv9.js.map} +1 -1
- package/dist/admin/assets/{layers-B0jT4rc4.js → layers-BmcodiaH.js} +2 -2
- package/dist/admin/assets/{layers-B0jT4rc4.js.map → layers-BmcodiaH.js.map} +1 -1
- package/dist/admin/assets/{link-2-off-DC06jLDj.js → link-2-off-CoJNwrxm.js} +2 -2
- package/dist/admin/assets/{link-2-off-DC06jLDj.js.map → link-2-off-CoJNwrxm.js.map} +1 -1
- package/dist/admin/assets/{link-B3O0VUVT.js → link-Pyr2Y35S.js} +2 -2
- package/dist/admin/assets/{link-B3O0VUVT.js.map → link-Pyr2Y35S.js.map} +1 -1
- package/dist/admin/assets/locales-Bg3htKo8.js +2 -0
- package/dist/admin/assets/{locales-e7B5t6id.js.map → locales-Bg3htKo8.js.map} +1 -1
- package/dist/admin/assets/media-BCnVhaDH.js +2 -0
- package/dist/admin/assets/{media-VCJUbYzJ.js.map → media-BCnVhaDH.js.map} +1 -1
- package/dist/admin/assets/media-CtbfNgc-.js +2 -0
- package/dist/admin/assets/media-CtbfNgc-.js.map +1 -0
- package/dist/admin/assets/network--5X46kWN.js +2 -0
- package/dist/admin/assets/network--5X46kWN.js.map +1 -0
- package/dist/admin/assets/{plus-WfYKHW7G.js → plus-BoDtdLCo.js} +2 -2
- package/dist/admin/assets/{plus-WfYKHW7G.js.map → plus-BoDtdLCo.js.map} +1 -1
- package/dist/admin/assets/publishing-DdmWXRaM.js +2 -0
- package/dist/admin/assets/{publishing-ClNjPLQ9.js.map → publishing-DdmWXRaM.js.map} +1 -1
- package/dist/admin/assets/{radio-group-rFxn7cz2.js → radio-group-BoN9R_3K.js} +2 -2
- package/dist/admin/assets/{radio-group-rFxn7cz2.js.map → radio-group-BoN9R_3K.js.map} +1 -1
- package/dist/admin/assets/{rotate-ccw-Cvc_uA58.js → rotate-ccw-DL6TzcZh.js} +2 -2
- package/dist/admin/assets/{rotate-ccw-Cvc_uA58.js.map → rotate-ccw-DL6TzcZh.js.map} +1 -1
- package/dist/admin/assets/schedules-BmB9Y73z.js +2 -0
- package/dist/admin/assets/{schedules-CBGpjEg7.js.map → schedules-BmB9Y73z.js.map} +1 -1
- package/dist/admin/assets/schema-D-qo7XSF.js +2 -0
- package/dist/admin/assets/schema-D-qo7XSF.js.map +1 -0
- package/dist/admin/assets/{scroll-text-gKYBbibb.js → scroll-text-PqeZm472.js} +2 -2
- package/dist/admin/assets/{scroll-text-gKYBbibb.js.map → scroll-text-PqeZm472.js.map} +1 -1
- package/dist/admin/assets/{search-CW3iBC4k.js → search-BdwIwOzC.js} +2 -2
- package/dist/admin/assets/{search-CW3iBC4k.js.map → search-BdwIwOzC.js.map} +1 -1
- package/dist/admin/assets/searchSchemas-DNjfDxmj.js +2 -0
- package/dist/admin/assets/{searchSchemas-C4qp-vCa.js.map → searchSchemas-DNjfDxmj.js.map} +1 -1
- package/dist/admin/assets/{sections-CN5fIoAr.js → sections-BTS683ur.js} +2 -2
- package/dist/admin/assets/{sections-CN5fIoAr.js.map → sections-BTS683ur.js.map} +1 -1
- package/dist/admin/assets/sections-BfxPwK0u.js +2 -0
- package/dist/admin/assets/{sections-C7Z6Xd8r.js.map → sections-BfxPwK0u.js.map} +1 -1
- package/dist/admin/assets/{select-DUhL27UN.js → select-Bp8kO5Ko.js} +2 -2
- package/dist/admin/assets/{select-DUhL27UN.js.map → select-Bp8kO5Ko.js.map} +1 -1
- package/dist/admin/assets/{send-DRA-Pe46.js → send-XPWo3m4u.js} +2 -2
- package/dist/admin/assets/{send-DRA-Pe46.js.map → send-XPWo3m4u.js.map} +1 -1
- package/dist/admin/assets/seo-CceGYTIX.js +2 -0
- package/dist/admin/assets/{seo-l1ZORjtv.js.map → seo-CceGYTIX.js.map} +1 -1
- package/dist/admin/assets/settings-TEbLvC-v.js +2 -0
- package/dist/admin/assets/settings-TEbLvC-v.js.map +1 -0
- package/dist/admin/assets/settle-CFU6YpQ0.js +2 -0
- package/dist/admin/assets/settle-CFU6YpQ0.js.map +1 -0
- package/dist/admin/assets/shapes-WrYO9Spf.js +6 -0
- package/dist/admin/assets/shapes-WrYO9Spf.js.map +1 -0
- package/dist/admin/assets/{skeleton-Dyi_b1wq.js → skeleton-vXOCdnJv.js} +2 -2
- package/dist/admin/assets/{skeleton-Dyi_b1wq.js.map → skeleton-vXOCdnJv.js.map} +1 -1
- package/dist/admin/assets/slugify-rYFum3Sc.js +2 -0
- package/dist/admin/assets/slugify-rYFum3Sc.js.map +1 -0
- package/dist/admin/assets/snapshots-DUI2t-qF.js +2 -0
- package/dist/admin/assets/snapshots-DUI2t-qF.js.map +1 -0
- package/dist/admin/assets/{sparkles-DCRAqbqD.js → sparkles-CvT-jxrW.js} +2 -2
- package/dist/admin/assets/{sparkles-DCRAqbqD.js.map → sparkles-CvT-jxrW.js.map} +1 -1
- package/dist/admin/assets/src-ndgTSYLX.js +7 -0
- package/dist/admin/assets/src-ndgTSYLX.js.map +1 -0
- package/dist/admin/assets/{stableId-iRkUbVIP.js → stableId-BrtQedPy.js} +2 -2
- package/dist/admin/assets/{stableId-iRkUbVIP.js.map → stableId-BrtQedPy.js.map} +1 -1
- package/dist/admin/assets/store-CdIFG90N.js +2 -0
- package/dist/admin/assets/{store-DknnssoQ.js.map → store-CdIFG90N.js.map} +1 -1
- package/dist/admin/assets/{switch-C3dDDUIk.js → switch-B1xClhNG.js} +2 -2
- package/dist/admin/assets/{switch-C3dDDUIk.js.map → switch-B1xClhNG.js.map} +1 -1
- package/dist/admin/assets/theme-65PB8uAu.js +2 -0
- package/dist/admin/assets/{theme-DPe080iG.js.map → theme-65PB8uAu.js.map} +1 -1
- package/dist/admin/assets/titles-CQiqqDw-.js +2 -0
- package/dist/admin/assets/titles-CQiqqDw-.js.map +1 -0
- package/dist/admin/assets/tokens-ixHjAkDK.js +2 -0
- package/dist/admin/assets/{tokens-BlIDIMY9.js.map → tokens-ixHjAkDK.js.map} +1 -1
- package/dist/admin/assets/{tooltip-BEaZkRPK.js → tooltip-CS_8cJu2.js} +2 -2
- package/dist/admin/assets/{tooltip-BEaZkRPK.js.map → tooltip-CS_8cJu2.js.map} +1 -1
- package/dist/admin/assets/{undo-2-Zd1OT6qk.js → undo-2-BiTANHFz.js} +2 -2
- package/dist/admin/assets/{undo-2-Zd1OT6qk.js.map → undo-2-BiTANHFz.js.map} +1 -1
- package/dist/admin/assets/useContentSchema-DtYfhsd2.js +2 -0
- package/dist/admin/assets/{useContentSchema-wLDa2L3f.js.map → useContentSchema-DtYfhsd2.js.map} +1 -1
- package/dist/admin/assets/useCursorPager-0zHjlm-7.js +2 -0
- package/dist/admin/assets/{useCursorPager-Dc-9B67j.js.map → useCursorPager-0zHjlm-7.js.map} +1 -1
- package/dist/admin/assets/useDiscardGuard-CMMJgkI2.js +2 -0
- package/dist/admin/assets/useDiscardGuard-CMMJgkI2.js.map +1 -0
- package/dist/admin/assets/useMediaPickerDialog-xvQ8cofO.js +2 -0
- package/dist/admin/assets/{useMediaPickerDialog-CFN9ZKfe.js.map → useMediaPickerDialog-xvQ8cofO.js.map} +1 -1
- package/dist/admin/assets/useMediaUploader-BVNTeSAU.js +2 -0
- package/dist/admin/assets/{useMediaUploader-B42H_CMG.js.map → useMediaUploader-BVNTeSAU.js.map} +1 -1
- package/dist/admin/assets/useNetworkPermission-Cts98h9d.js +2 -0
- package/dist/admin/assets/{useNetworkPermission-CegwqQXR.js.map → useNetworkPermission-Cts98h9d.js.map} +1 -1
- package/dist/admin/assets/usePaletteItems-DtReWmkd.js +2 -0
- package/dist/admin/assets/{usePaletteItems-B3y2t7Ly.js.map → usePaletteItems-DtReWmkd.js.map} +1 -1
- package/dist/admin/assets/usePlaces-DC47wVeU.js +2 -0
- package/dist/admin/assets/{usePlaces-CAXr-IO9.js.map → usePlaces-DC47wVeU.js.map} +1 -1
- package/dist/admin/assets/useQueries-CirW3Mvp.js +2 -0
- package/dist/admin/assets/{useQueries-CX6eFr24.js.map → useQueries-CirW3Mvp.js.map} +1 -1
- package/dist/admin/assets/{useResolvedScheme-aV0QDPi3.js → useResolvedScheme-CScQpr-P.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-aV0QDPi3.js.map → useResolvedScheme-CScQpr-P.js.map} +1 -1
- package/dist/admin/assets/{useSchemaScopeAccess-DyfiZnzs.js → useSchemaScopeAccess-ByrxIdKM.js} +2 -2
- package/dist/admin/assets/{useSchemaScopeAccess-DyfiZnzs.js.map → useSchemaScopeAccess-ByrxIdKM.js.map} +1 -1
- package/dist/admin/assets/users-2iJYwlJb.js +2 -0
- package/dist/admin/assets/users-2iJYwlJb.js.map +1 -0
- package/dist/admin/assets/{users-ohHZnBJW.js → users-DM7CXUBJ.js} +2 -2
- package/dist/admin/assets/{users-ohHZnBJW.js.map → users-DM7CXUBJ.js.map} +1 -1
- package/dist/admin/assets/{zod-C-k48Hnc.js → zod-hUh5nXnX.js} +2 -2
- package/dist/admin/assets/{zod-C-k48Hnc.js.map → zod-hUh5nXnX.js.map} +1 -1
- package/dist/admin/index.html +59 -60
- package/dist/cli.js +10 -5689
- package/dist/cli.js.map +1 -1
- package/dist/cliMain-D08HeAd_.js +5771 -0
- package/dist/cliMain-D08HeAd_.js.map +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -38
- package/dist/contentDisposition-DOL2Xt0l.js +90 -0
- package/dist/contentDisposition-DOL2Xt0l.js.map +1 -0
- package/dist/index.d.ts +30 -8
- package/dist/index.js +2 -2
- package/dist/public-B57h4F7Y.js +39 -0
- package/dist/public-B57h4F7Y.js.map +1 -0
- package/dist/{public-BO_wneBL.d.ts → public-COKbHR-N.d.ts} +47 -3
- package/dist/{s3Adapter-sL1zP4Zl.js → s3Adapter-U01iEAcK.js} +2 -2
- package/dist/{s3Adapter-sL1zP4Zl.js.map → s3Adapter-U01iEAcK.js.map} +1 -1
- package/dist/{worker-DMES6pqh.js → worker-jspgh10V.js} +6384 -4527
- package/dist/worker-jspgh10V.js.map +1 -0
- package/package.json +5 -5
- package/dist/admin/assets/AssistError-drmpXSbS.js +0 -2
- package/dist/admin/assets/Body-Gn_z2KPN.js +0 -2
- package/dist/admin/assets/Builder-DyCcikfS.js +0 -2
- package/dist/admin/assets/Builder-DyCcikfS.js.map +0 -1
- package/dist/admin/assets/ConfirmDialog-DZRJfdvH.js +0 -2
- package/dist/admin/assets/ConfirmDialog-DZRJfdvH.js.map +0 -1
- package/dist/admin/assets/Form-DF_YmR1G.js +0 -2
- package/dist/admin/assets/Form-DF_YmR1G.js.map +0 -1
- package/dist/admin/assets/FormCheckboxGroup-V3IKrvzc.js.map +0 -1
- package/dist/admin/assets/InsertMenuItem-D2HGERzb.js +0 -2
- package/dist/admin/assets/InsertMenuItem-D2HGERzb.js.map +0 -1
- package/dist/admin/assets/Panel-B1TkcP8V.js +0 -2
- package/dist/admin/assets/Panel-B1TkcP8V.js.map +0 -1
- package/dist/admin/assets/SecretReveal-kCkLH5jg.js +0 -2
- package/dist/admin/assets/SecretReveal-kCkLH5jg.js.map +0 -1
- package/dist/admin/assets/StepList-BIQjDaWQ.js +0 -2
- package/dist/admin/assets/StepList-BIQjDaWQ.js.map +0 -1
- package/dist/admin/assets/Thumbnail-D1XuDElk.js +0 -2
- package/dist/admin/assets/Thumbnail-D1XuDElk.js.map +0 -1
- package/dist/admin/assets/UnsavedChangesGuard-C1n7egF6.js +0 -2
- package/dist/admin/assets/UnsavedChangesGuard-C1n7egF6.js.map +0 -1
- package/dist/admin/assets/auth-C4fHG9Iu.js +0 -2
- package/dist/admin/assets/auth-C4fHG9Iu.js.map +0 -1
- package/dist/admin/assets/badge-ydvfgE8a.js +0 -2
- package/dist/admin/assets/changeSets-DgfCKja3.js +0 -2
- package/dist/admin/assets/changeSets-DgfCKja3.js.map +0 -1
- package/dist/admin/assets/chevron-left-CZXrLV99.js +0 -2
- package/dist/admin/assets/content-DsMSB6Wb.js +0 -3
- package/dist/admin/assets/content-DsMSB6Wb.js.map +0 -1
- package/dist/admin/assets/contentCounts-DknqJ4kh.js +0 -2
- package/dist/admin/assets/context-fImO9k99.js +0 -2
- package/dist/admin/assets/createLucideIcon-CqygG5K6.js +0 -2
- package/dist/admin/assets/createLucideIcon-CqygG5K6.js.map +0 -1
- package/dist/admin/assets/develop-DL-2W9jv.js +0 -11
- package/dist/admin/assets/develop-DL-2W9jv.js.map +0 -1
- package/dist/admin/assets/es2015-DrAA1N2V.js +0 -42
- package/dist/admin/assets/es2015-DrAA1N2V.js.map +0 -1
- package/dist/admin/assets/followPlural-D-5ZJqJF.js +0 -2
- package/dist/admin/assets/followPlural-D-5ZJqJF.js.map +0 -1
- package/dist/admin/assets/inbox-DUqOrFEA.js +0 -2
- package/dist/admin/assets/inbox-DUqOrFEA.js.map +0 -1
- package/dist/admin/assets/index-BEM45u2w.css +0 -2
- package/dist/admin/assets/index-D03RZB7e.js +0 -4
- package/dist/admin/assets/index-D03RZB7e.js.map +0 -1
- package/dist/admin/assets/loader-circle-C-9trZPI.js +0 -2
- package/dist/admin/assets/loader-circle-C-9trZPI.js.map +0 -1
- package/dist/admin/assets/locales-e7B5t6id.js +0 -2
- package/dist/admin/assets/media-BUUEsWxd.js +0 -2
- package/dist/admin/assets/media-BUUEsWxd.js.map +0 -1
- package/dist/admin/assets/media-VCJUbYzJ.js +0 -2
- package/dist/admin/assets/network-Bolr2lmf.js +0 -2
- package/dist/admin/assets/network-Bolr2lmf.js.map +0 -1
- package/dist/admin/assets/pencil-BVSFlU14.js +0 -2
- package/dist/admin/assets/pencil-BVSFlU14.js.map +0 -1
- package/dist/admin/assets/publishing-ClNjPLQ9.js +0 -2
- package/dist/admin/assets/schedules-CBGpjEg7.js +0 -2
- package/dist/admin/assets/schema-D9BgCVzZ.js +0 -2
- package/dist/admin/assets/schema-D9BgCVzZ.js.map +0 -1
- package/dist/admin/assets/searchSchemas-C4qp-vCa.js +0 -2
- package/dist/admin/assets/sections-C7Z6Xd8r.js +0 -2
- package/dist/admin/assets/seo-l1ZORjtv.js +0 -2
- package/dist/admin/assets/settings-DgoG3H8C.js +0 -2
- package/dist/admin/assets/settings-DgoG3H8C.js.map +0 -1
- package/dist/admin/assets/settle-LRKtTN_e.js +0 -2
- package/dist/admin/assets/settle-LRKtTN_e.js.map +0 -1
- package/dist/admin/assets/shapes-BZ87ap5s.js +0 -6
- package/dist/admin/assets/shapes-BZ87ap5s.js.map +0 -1
- package/dist/admin/assets/snapshots-CT-zs6Up.js +0 -2
- package/dist/admin/assets/snapshots-CT-zs6Up.js.map +0 -1
- package/dist/admin/assets/src-BcLeD2-K.js +0 -7
- package/dist/admin/assets/src-BcLeD2-K.js.map +0 -1
- package/dist/admin/assets/store-DknnssoQ.js +0 -2
- package/dist/admin/assets/theme-DPe080iG.js +0 -2
- package/dist/admin/assets/titles-C5PaMgFJ.js +0 -2
- package/dist/admin/assets/titles-C5PaMgFJ.js.map +0 -1
- package/dist/admin/assets/tokens-BlIDIMY9.js +0 -2
- package/dist/admin/assets/useAuditLabels-DWBpLOTB.js +0 -2
- package/dist/admin/assets/useAuditLabels-DWBpLOTB.js.map +0 -1
- package/dist/admin/assets/useContentSchema-wLDa2L3f.js +0 -2
- package/dist/admin/assets/useCursorPager-Dc-9B67j.js +0 -2
- package/dist/admin/assets/useDiscardGuard-WTUINqD5.js +0 -2
- package/dist/admin/assets/useDiscardGuard-WTUINqD5.js.map +0 -1
- package/dist/admin/assets/useMediaPickerDialog-CFN9ZKfe.js +0 -2
- package/dist/admin/assets/useMediaUploader-B42H_CMG.js +0 -2
- package/dist/admin/assets/useNetworkPermission-CegwqQXR.js +0 -2
- package/dist/admin/assets/usePaletteItems-B3y2t7Ly.js +0 -2
- package/dist/admin/assets/usePlaces-CAXr-IO9.js +0 -2
- package/dist/admin/assets/useQueries-CX6eFr24.js +0 -2
- package/dist/admin/assets/users-CDoJRL24.js +0 -2
- package/dist/admin/assets/users-CDoJRL24.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/worker-DMES6pqh.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publishing-ClNjPLQ9.js","names":["__iconData","__iconData","useState","useEffectEvent","z.url","z.string","z.object","z.enum","z.array","z.boolean","useMemo","useState","_Fragment","_Fragment","zodResolver","CreateSheet","TableRoot","_Fragment","useState","CreateSheet","useState","zodResolver","EditForm","CheckCircle2","XCircle","View","_Fragment","Trash2","Loader2","EditForm","View","View","AlertCircle","View","z.string","z.enum","_Fragment","z.object","useMemo","zodResolver","CreateSheet","Table","TableRoot","useState","Table","CreateSheet","z.object","z.string","z.url","z.array","z.boolean","z.enum","_Fragment","zodResolver","TableRoot","useState","WebhookIcon","useState","_Fragment","_Fragment","useState","_Fragment","Table","zodResolver","_Fragment","Trash2","WebhookDetail","__toESM","require_jsx_runtime","queryKeys","useQueryClient","LoaderCircle","linkOptions","useNavigate","isConflict","useMe","Link","SubmitButton","Page","PageHeader","useParams","StatusChip","EmptyState","ErrorState","Badge","LoadingState","Outlet","useTranslation","createLucideIcon","formatRelativeTime","formatDateTime","useSearch","RowTitle","createLazyRoute","UnsavedChangesGuard","SCHEDULE_STATUSES","PUBLICATION_ACTIONS","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","FormCheckboxGroup","toast","Info","InfoHint","CalendarClock","Button","Input","ChevronRight","SelectValue","SelectTrigger","SelectContent","SelectItem","ChevronDown","Select","CursorPager","Alert","CircleAlert","FormError","Checkbox","AlertDescription","InlineConfirm","AlertTitle","CircleCheck","CircleX","Trash","FieldGroup","FieldSet","FieldLabel","FieldDescription","FieldLegend","Field","Inbox","KeyRound","Plus","useRetryDeploymentRun","useResetOnOpen","useUpdateDeploymentConnection","useDeploymentRuns","useTriggerDeployment","useCreateDeploymentConnection","useRotateWebhookSecret","useDeploymentConnections","useWebhook","useWebhooks","PROVIDER_LABELS","TRIGGER_POLICY_LABELS","TIMELINE_SOURCE_LABELS","useRedeliverWebhook","useWebhookDeliveries","RUN_TRIGGER_LABELS","useCreateWebhook","useTestWebhook","PUBLICATION_ACTION_LABELS","useDeleteWebhook","useUpdateWebhook","useCursorPager","useWebhookEvents","useDeleteDeploymentConnection","useTestDeploymentConnection","useDeploymentRun","useDeploymentConnection","RotateCcw","Send","permittedSections","Webhook","cn","useController","useWatch","FormTextField","requiredText","FormFieldError","u","useForm","describedBy","settle","TableHeader","url","boolean","object","TableHead","_enum","TableBody","TableRow","TableCell","TableCard","Table$2","array","string","HintedLabel","TextLink","canSeeNetwork","useDefinitions","QueryView","FormRadioGroup","useLocales","Panel","ACTIVE_RUN_STATUSES","useCreateSchedule","useSchedules","useCancelSchedule","dateTimeLocalToIso","defaultScheduleValue","dateTimeLocalField","ExternalLink","CopyButton","FormSwitchField","FormSheet","FormSelectField","useRoles","SecretReveal","LinkTabs","__iconData$2","CalendarPlus","__iconData$1","PlugZap","__iconData","Power","import_jsx_runtime","Publishing","import_react","require_react","usePublishingPermissions","permissions","Header","section","useSecretReveal","revealed","setRevealed","dismissedId","setDismissedId","afterDismiss","onDismissed","id","event","DetailList","className","items","item","EnabledChip","enabled","canDeployConnection","secretsUnreadable","useConnectionActions","navigate","test","trigger","remove","connection","run","SCHEDULE_STATUS_DISPLAY","DELIVERY_STATUS_DISPLAY","RUN_DISPLAY","runDisplay","RunStatus","display","t","SecretsUnreadableChip","unreadable","ConnectionCard","actions","canTriggerDeployments","Rocket","GITHUB_MODES","NO_DELIVERY_ROLE","SETTING_NAMES","SECRET_NAMES","OPTIONAL_SETTINGS","PROVIDER_FIELDS","providerSettingNames","provider","triggerOptionsFor","isWholeNumber","value","isHttpUrl","settingsShape","name","secretsShape","connectionSchema","fields","values","context","mode","secret","emptyRecord","names","EMPTY_CONNECTION","toConnectionValues","commonInput","secrets","toCreateConnectionInput","regenerableSecrets","requiredOnCreate","toUpdateConnectionInput","typed","rest","regenerable","useDeliveryRoleOptions","roles","role","SETTING_LABELS","SETTING_HINTS","SECRET_LABELS","SECRET_HINTS","PROVIDER_SECRET_HINTS","secretHintFor","GITHUB_MODE_LABELS","SecretField","replacing","setReplacing","hintId","errorId","fieldState","helperId","helper","fullHint","hint","stored","envVar","field","ProviderFields","storedSecrets","ConnectionForm","deliveryRoleOptions","createSchema","useCreateConnectionForm","createConnection","form","open","created","onCreated","CreateSheet$2","onSubmit","GeneratedSecretReveal","Runs","showConnection","runs","RunsList","cursor","onCursorChange","data","connectionId","pagerProps","Deployments","connections","creating","setCreating","openConnection","canManageDeployments","next","generated","generatedSecrets","useConflictReload","queryClient","conflicted","setConflicted","error","JsonBlock","label","SIGNATURE_HEADERS","SignatureHelp","description","header","CALLBACK_EXAMPLE","CallbackHelp","callbackUrl","editSchema","useEditConnectionForm","update","saved","onConflict","onSaved","EditForm$1","TestResult","result","check","stayOnPage","View$2","conflict","busy","snapshot","meta","Connection","safeExternalUrl","Timeline","index","View$1","retry","none","logUrl","siteUrl","active","details","Run","runId","ALL","StatusFilter","labelId","onChange","options","option","allLabel","DEFAULT_LOCALE","entryTargetShape","EMPTY_ENTRY_TARGET","toEntryTarget","entryId","locale","useEntryTargetOptions","models","locales","definition","action","EntryTargetFields","path","modelOptions","localeOptions","actionOptions","createScheduleSchema","useCreateScheduleForm","createSchedule","defaults","target","iso","runAt","CreateSheet$1","useScheduledSearch","search","go","previous","changes","resetPager","Table$1","schedules","status","schedule","onCancel","Scheduled","cancel","cancelSchedule","statusOptions","filters","setStatus","groupPattern","group","groupEvents","groups","events","type","types","toggleGroup","pattern","others","selected","checked","toggleEvent","EventsField","catalogue","groupSelected","groupId","MAX_ATTEMPTS_RANGE","DEFAULT_MAX_ATTEMPTS","webhookSchema","EMPTY_WEBHOOK","toWebhookValues","webhook","toWebhookInput","Fields","useCreateWebhookForm","createWebhook","CreateSheet","me","scopeOptions","SigningSecretReveal","SiteBadge","Table","webhooks","last","Webhooks","signingSecret","useWebhookActions","rotate","setSecret","rotated","HeaderList","headers","SUCCESS_MIN","REDIRECT_MIN","CLIENT_ERROR_MIN","toneOf","ResponseCode","Attempt","attempt","request","response","DELIVERY_COLUMNS","Delivery","delivery","detailsId","expanded","onToggle","redelivering","onRedeliver","Deliveries","deliveries","webhookId","redeliver","setExpanded","toggle","current","useEditWebhookForm","EditForm","View","publishingLazyRoutes"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/calendar-plus.mjs","../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/plug-zap.mjs","../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/power.mjs","../../src/features/Publishing/index.tsx","../../src/features/Publishing/hooks/usePublishingPermissions.ts","../../src/features/Publishing/Header/index.tsx","../../src/features/Publishing/hooks/useSecretReveal.ts","../../src/features/Publishing/DetailList/index.tsx","../../src/features/Publishing/EnabledChip/index.tsx","../../src/features/Publishing/Deployments/helpers/connectionState.ts","../../src/features/Publishing/Deployments/hooks/useConnectionActions.ts","../../src/features/Publishing/helpers/statusDisplay.ts","../../src/features/Publishing/Deployments/RunStatus/index.tsx","../../src/features/Publishing/Deployments/SecretsUnreadableChip/index.tsx","../../src/features/Publishing/Deployments/ConnectionCard/index.tsx","../../src/features/Publishing/Deployments/helpers/connectionForm.ts","../../src/features/Publishing/Deployments/hooks/useDeliveryRoleOptions.ts","../../src/features/Publishing/Deployments/helpers/labels.ts","../../src/features/Publishing/Deployments/SecretField/index.tsx","../../src/features/Publishing/Deployments/ProviderFields/index.tsx","../../src/features/Publishing/Deployments/ConnectionForm/index.tsx","../../src/features/Publishing/Deployments/hooks/useCreateConnectionForm.ts","../../src/features/Publishing/Deployments/CreateSheet/index.tsx","../../src/features/Publishing/Deployments/GeneratedSecretReveal/index.tsx","../../src/features/Publishing/Deployments/Runs/index.tsx","../../src/features/Publishing/Deployments/RunsList/index.tsx","../../src/features/Publishing/Deployments/index.tsx","../../src/features/Publishing/hooks/useConflictReload.ts","../../src/features/Publishing/JsonBlock/index.tsx","../../src/features/Publishing/SignatureHelp/index.tsx","../../src/features/Publishing/Deployments/CallbackHelp/index.tsx","../../src/features/Publishing/Deployments/hooks/useEditConnectionForm.ts","../../src/features/Publishing/Deployments/Connection/EditForm/index.tsx","../../src/features/Publishing/Deployments/Connection/TestResult/index.tsx","../../src/features/Publishing/Deployments/Connection/View/index.tsx","../../src/features/Publishing/Deployments/Connection/index.tsx","../../src/features/Publishing/helpers/safeExternalUrl.ts","../../src/features/Publishing/Deployments/Run/Timeline/index.tsx","../../src/features/Publishing/Deployments/Run/View/index.tsx","../../src/features/Publishing/Deployments/Run/index.tsx","../../src/features/Publishing/StatusFilter/index.tsx","../../src/features/Publishing/helpers/entryTarget.ts","../../src/features/Publishing/hooks/useEntryTargetOptions.ts","../../src/features/Publishing/EntryTargetFields/index.tsx","../../src/features/Publishing/Scheduled/hooks/useCreateScheduleForm.ts","../../src/features/Publishing/Scheduled/CreateSheet/index.tsx","../../src/features/Publishing/Scheduled/hooks/useScheduledSearch.ts","../../src/features/Publishing/Scheduled/Table/index.tsx","../../src/features/Publishing/Scheduled/index.tsx","../../src/features/Publishing/helpers/webhookEvents.ts","../../src/features/Publishing/Webhooks/EventsField/index.tsx","../../src/features/Publishing/Webhooks/helpers.ts","../../src/features/Publishing/Webhooks/Fields/index.tsx","../../src/features/Publishing/Webhooks/hooks/useCreateWebhookForm.ts","../../src/features/Publishing/Webhooks/CreateSheet/index.tsx","../../src/features/Publishing/Webhooks/SigningSecretReveal/index.tsx","../../src/features/Publishing/Webhooks/SiteBadge/index.tsx","../../src/features/Publishing/Webhooks/Table/index.tsx","../../src/features/Publishing/Webhooks/index.tsx","../../src/features/Publishing/Webhooks/hooks/useWebhookActions.ts","../../src/features/Publishing/Webhooks/Detail/HeaderList/index.tsx","../../src/features/Publishing/Webhooks/Detail/ResponseCode/index.tsx","../../src/features/Publishing/Webhooks/Detail/Attempt/index.tsx","../../src/features/Publishing/Webhooks/Detail/Delivery/index.tsx","../../src/features/Publishing/Webhooks/Detail/Deliveries/index.tsx","../../src/features/Publishing/Webhooks/hooks/useEditWebhookForm.ts","../../src/features/Publishing/Webhooks/Detail/EditForm/index.tsx","../../src/features/Publishing/Webhooks/Detail/View/index.tsx","../../src/features/Publishing/Webhooks/Detail/index.tsx","../../src/app/lazyRoutes/publishing.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"calendar-plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M16 18h6\", key: \"987eiv\" }],\n [\"path\", { d: \"M16 2v3\", key: \"otl347\" }],\n [\"path\", { d: \"M19 15v6\", key: \"10aioa\" }],\n [\"path\", { d: \"M21 11.5V5a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h8.3\", key: \"jgwkxf\" }],\n [\"path\", { d: \"M3 9h18\", key: \"1pudct\" }],\n [\"path\", { d: \"M8 2v3\", key: \"1ioesn\" }]\n ]\n};\n__iconData.node;\nconst CalendarPlus = createLucideIcon(__iconData);\n\nexport { __iconData, CalendarPlus as default };\n//# sourceMappingURL=calendar-plus.mjs.map\n","/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"plug-zap\",\n size: 24,\n node: [\n [\n \"path\",\n { d: \"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\", key: \"goz73y\" }\n ],\n [\"path\", { d: \"m2 22 3-3\", key: \"19mgm9\" }],\n [\"path\", { d: \"M7.5 13.5 10 11\", key: \"7xgeeb\" }],\n [\"path\", { d: \"M10.5 16.5 13 14\", key: \"10btkg\" }],\n [\"path\", { d: \"m18 3-4 4h6l-4 4\", key: \"16psg9\" }]\n ],\n aliases: [\"plug-zap-2\"]\n};\n__iconData.node;\nconst PlugZap = createLucideIcon(__iconData);\n\nexport { __iconData, PlugZap as default };\n//# sourceMappingURL=plug-zap.mjs.map\n","/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"power\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 2v10\", key: \"mnfbl\" }],\n [\"path\", { d: \"M18.4 6.6a9 9 0 1 1-12.77.04\", key: \"obofu9\" }]\n ]\n};\n__iconData.node;\nconst Power = createLucideIcon(__iconData);\n\nexport { __iconData, Power as default };\n//# sourceMappingURL=power.mjs.map\n","import { Outlet } from '@tanstack/react-router';\n\n/**\n * Scheduled publications, webhooks and deployments. Each tab renders its own\n * `Page` and header (the tabs live in the header, with the tab's actions).\n */\nexport const Publishing = () => <Outlet />;\n","import { useMe } from '@/api/auth';\n\n/** What the signed-in admin may change here. The UI hides what they can't; the server enforces it. */\nexport const usePublishingPermissions = () => {\n const permissions = useMe().data?.globalPermissions ?? [];\n return {\n permissions,\n canManageWebhooks: permissions.includes('webhooks.manage'),\n canManageDeployments: permissions.includes('deployments.manage'),\n canTriggerDeployments: permissions.includes('deployments.trigger'),\n canManagePublishing: permissions.includes('publishing.manage'),\n };\n};\n","import type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LinkTabs } from '@/components/LinkTabs';\nimport { PageHeader } from '@/components/PageHeader';\nimport { usePublishingPermissions } from '../hooks/usePublishingPermissions';\nimport { permittedSections } from '../sections';\n\ntype HeaderProps = {\n /** The current tab's actions (its \"New …\" button), primary last. */\n actions?: ReactNode;\n};\n\n/** The header of every Publishing list: \"Publishing\", the section tabs the admin may open, and actions. */\nexport const Header = ({ actions }: HeaderProps) => {\n const { t } = useTranslation();\n const { permissions } = usePublishingPermissions();\n return (\n <PageHeader\n title={t('nav.publishing')}\n actions={actions}\n tabs={\n <LinkTabs\n label={t('publishing.sections')}\n tabs={permittedSections(permissions).map((section) => ({\n to: section.to,\n label: t(section.labelKey),\n }))}\n />\n }\n />\n );\n};\n","import { useEffect, useEffectEvent, useState } from 'react';\n\ntype Revealed = { id: string; secret: string };\n\n/**\n * A secret created on this page (a webhook's or a connection's signing secret), shown once in a\n * `SecretReveal` at the top of the page, never through a URL. Dismissing it runs `onDismissed` with the\n * record's ID (to open it) only after the reveal, and its \"leave without saving the secret?\" guard, has\n * unmounted, so that navigation isn't stopped by the guard.\n */\nexport const useSecretReveal = (onDismissed: (id: string) => void) => {\n const [revealed, setRevealed] = useState<Revealed | undefined>(undefined);\n const [dismissedId, setDismissedId] = useState<string | undefined>(undefined);\n const afterDismiss = useEffectEvent((id: string) => onDismissed(id));\n useEffect(() => {\n if (dismissedId) {\n afterDismiss(dismissedId);\n }\n }, [dismissedId]);\n return {\n revealed,\n reveal: setRevealed,\n dismiss: () => {\n setDismissedId(revealed?.id);\n setRevealed(undefined);\n },\n /** For the create sheet's `onCloseAutoFocus`: focus stays on the reveal's copy button. */\n keepFocusOnReveal: (event: Event) => {\n if (revealed) {\n event.preventDefault();\n }\n },\n };\n};\n","import type { ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\n\nexport type DetailItem = { label: string; value: ReactNode };\n\ntype DetailListProps = { items: readonly DetailItem[]; className?: string };\n\n/** Label / value pairs (a description list), two columns on wide screens. */\nexport const DetailList = ({ items, className }: DetailListProps) => (\n <dl className={cn('grid gap-x-6 gap-y-3 text-sm sm:grid-cols-2', className)}>\n {items.map((item) => (\n <div key={item.label} className=\"min-w-0 space-y-0.5\">\n <dt className=\"text-xs font-medium text-muted-foreground\">{item.label}</dt>\n <dd className=\"break-words\">{item.value}</dd>\n </div>\n ))}\n </dl>\n);\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\n\ntype EnabledChipProps = { enabled: boolean };\n\n/** \"Enabled\" / \"Disabled\" for webhooks and deployment connections. */\nexport const EnabledChip = ({ enabled }: EnabledChipProps) => {\n const { t } = useTranslation();\n return enabled ? (\n <StatusChip tone=\"success\" label={t('publishing.enabled')} />\n ) : (\n <StatusChip tone=\"muted\" label={t('publishing.disabled')} />\n );\n};\n","import type { DeploymentConnection } from '@shapio/client';\n\n/** Deploy now needs an enabled connection whose stored secrets can be read (a run would fail otherwise). */\nexport const canDeployConnection = ({\n enabled,\n secretsUnreadable,\n}: Pick<DeploymentConnection, 'enabled' | 'secretsUnreadable'>) => enabled && !secretsUnreadable;\n","import type { DeploymentConnection } from '@shapio/client';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport {\n useDeleteDeploymentConnection,\n useTestDeploymentConnection,\n useTriggerDeployment,\n} from '@/api/deployments';\n\n/** Test the connection (result shown inline), trigger a manual run (opens it) and delete (a promise, for its confirmation). */\nexport const useConnectionActions = (connection: DeploymentConnection) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const test = useTestDeploymentConnection();\n const trigger = useTriggerDeployment();\n const remove = useDeleteDeploymentConnection();\n return {\n testResult: test.data,\n testing: test.isPending,\n triggering: trigger.isPending,\n deleting: remove.isPending,\n runTest: () => test.mutate(connection.id),\n triggerRun: () =>\n trigger.mutate(connection.id, {\n onSuccess: (run) => {\n toast.success(t('publishing.deployments.triggered'));\n void navigate({ to: '/publishing/deployments/runs/$runId', params: { runId: run.id } });\n },\n }),\n remove: () =>\n remove.mutateAsync(connection.id, {\n onSuccess: () => {\n toast.success(t('publishing.deployments.deleted', { name: connection.name }));\n void navigate({ to: '/publishing/deployments' });\n },\n }),\n };\n};\n","import type { DeploymentRun, ScheduleStatus, WebhookDeliveryStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\ntype Display = { labelKey: string; tone: StatusTone };\n\nexport const SCHEDULE_STATUS_DISPLAY = {\n scheduled: { labelKey: 'publishing.scheduled.statuses.scheduled', tone: 'scheduled' },\n done: { labelKey: 'publishing.scheduled.statuses.done', tone: 'success' },\n failed: { labelKey: 'publishing.scheduled.statuses.failed', tone: 'danger' },\n cancelled: { labelKey: 'publishing.scheduled.statuses.cancelled', tone: 'muted' },\n} as const satisfies Record<ScheduleStatus, Display>;\n\nexport const DELIVERY_STATUS_DISPLAY = {\n pending: { labelKey: 'publishing.webhooks.deliveryStatuses.pending', tone: 'progress' },\n retrying: { labelKey: 'publishing.webhooks.deliveryStatuses.retrying', tone: 'progress' },\n succeeded: { labelKey: 'publishing.webhooks.deliveryStatuses.succeeded', tone: 'success' },\n dead: { labelKey: 'publishing.webhooks.deliveryStatuses.dead', tone: 'danger' },\n} as const satisfies Record<WebhookDeliveryStatus, Display>;\n\nconst RUN_DISPLAY = {\n queued: { labelKey: 'publishing.deployments.statuses.queued', tone: 'neutral' },\n triggered: { labelKey: 'publishing.deployments.statuses.triggered', tone: 'progress' },\n triggeredUnknown: { labelKey: 'publishing.deployments.statuses.triggeredUnknown', tone: 'muted' },\n building: { labelKey: 'publishing.deployments.statuses.building', tone: 'progress' },\n deployed: { labelKey: 'publishing.deployments.statuses.deployed', tone: 'success' },\n committed: { labelKey: 'publishing.deployments.statuses.committed', tone: 'success' },\n failed: { labelKey: 'publishing.deployments.statuses.failed', tone: 'danger' },\n unknown: { labelKey: 'publishing.deployments.statuses.unknown', tone: 'muted' },\n} as const satisfies Record<string, Display>;\n\nexport type RunDisplay = (typeof RUN_DISPLAY)[keyof typeof RUN_DISPLAY];\n\n/**\n * A run's label, honest about what Shapio actually knows (brief §7: never show a success that didn't\n * happen). A trigger without a completion report reads \"Trigger sent · completion unknown\", not \"Deployed\";\n * GitHub \"deploys\" by committing, so its success reads \"Committed\".\n */\nexport const runDisplay = (\n run: Pick<DeploymentRun, 'status' | 'provider' | 'completionReported'>,\n): RunDisplay => {\n switch (run.status) {\n case 'triggered':\n return run.completionReported ? RUN_DISPLAY.triggered : RUN_DISPLAY.triggeredUnknown;\n case 'deployed':\n return run.provider === 'github' ? RUN_DISPLAY.committed : RUN_DISPLAY.deployed;\n default:\n return RUN_DISPLAY[run.status];\n }\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { runDisplay } from '../../helpers/statusDisplay';\n\ntype RunStatusProps = {\n run: Pick<DeploymentRun, 'status' | 'provider' | 'completionReported'>;\n /** False for a past state on the timeline. */\n live?: boolean;\n};\n\n/** A run's status, labelled honestly (see `runDisplay`). */\nexport const RunStatus = ({ run, live = true }: RunStatusProps) => {\n const { t } = useTranslation();\n const display = runDisplay(run);\n return <StatusChip tone={display.tone} label={t(display.labelKey)} live={live} />;\n};\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\n\ntype SecretsUnreadableChipProps = { unreadable: boolean };\n\n/** Warns that a connection's stored secret can't be decrypted (the server's key changed) until it is entered again. */\nexport const SecretsUnreadableChip = ({ unreadable }: SecretsUnreadableChipProps) => {\n const { t } = useTranslation();\n return unreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.deployments.secretsUnreadable')} />\n ) : null;\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { Rocket } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Panel } from '@/components/Panel';\nimport { Button } from '@/components/ui/button';\nimport { PROVIDER_LABELS } from '../../constants';\nimport { DetailList } from '../../DetailList';\nimport { EnabledChip } from '../../EnabledChip';\nimport { usePublishingPermissions } from '../../hooks/usePublishingPermissions';\nimport { canDeployConnection } from '../helpers/connectionState';\nimport { useConnectionActions } from '../hooks/useConnectionActions';\nimport { RunStatus } from '../RunStatus';\nimport { SecretsUnreadableChip } from '../SecretsUnreadableChip';\n\ntype ConnectionCardProps = { connection: DeploymentConnection };\n\n/**\n * One deployment connection: provider, state, latest run and live snapshot, with Open and Deploy now. A\n * connection whose secret can't be read says so and can't deploy until the secret is entered again.\n */\nexport const ConnectionCard = ({ connection }: ConnectionCardProps) => {\n const { t } = useTranslation();\n const { canTriggerDeployments } = usePublishingPermissions();\n const actions = useConnectionActions(connection);\n return (\n <Panel\n title={connection.name}\n titleAs=\"h3\"\n description={t(PROVIDER_LABELS[connection.provider])}\n actions={<EnabledChip enabled={connection.enabled} />}\n bodyClassName=\"space-y-4\"\n >\n <SecretsUnreadableChip unreadable={connection.secretsUnreadable} />\n <DetailList\n items={[\n {\n label: t('publishing.deployments.latestRun'),\n value: connection.latestRun ? <RunStatus run={connection.latestRun} /> : t('common.never'),\n },\n {\n label: t('publishing.deployments.currentSnapshot'),\n value:\n connection.currentRun?.snapshot != null\n ? t('publishing.snapshotNumber', { snapshot: connection.currentRun.snapshot })\n : t('common.none'),\n },\n ]}\n className=\"grid-cols-2\"\n />\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link to=\"/publishing/deployments/$connectionId\" params={{ connectionId: connection.id }}>\n {t('publishing.deployments.open')}\n </Link>\n </Button>\n {canTriggerDeployments ? (\n <Button\n size=\"sm\"\n disabled={actions.triggering || !canDeployConnection(connection)}\n onClick={actions.triggerRun}\n >\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </div>\n </Panel>\n );\n};\n","import {\n DEPLOYMENT_PROVIDERS,\n DEPLOYMENT_TRIGGERS,\n type CreateDeploymentConnectionInput,\n type DeploymentConnection,\n type DeploymentProvider,\n type UpdateDeploymentConnectionInput,\n} from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\nexport const GITHUB_MODES = ['commit', 'pull_request'] as const;\n\n/** Select value for \"previews show the public fields\" (Radix selects cannot use an empty value). */\nexport const NO_DELIVERY_ROLE = 'none';\n\nconst SETTING_NAMES = [\n 'url',\n 'accountId',\n 'projectName',\n 'projectId',\n 'teamId',\n 'siteId',\n 'owner',\n 'repo',\n 'branch',\n 'mode',\n 'directory',\n] as const;\nconst SECRET_NAMES = ['signingSecret', 'deployHookUrl', 'apiToken', 'token'] as const;\n\nexport type SettingName = (typeof SETTING_NAMES)[number];\nexport type SecretName = (typeof SECRET_NAMES)[number];\n\ntype SecretSpec = { name: SecretName; requiredOnCreate: boolean };\n\n/** Settings a provider shows but does not require (everything else listed in `settings` is required). */\nexport const OPTIONAL_SETTINGS: ReadonlySet<SettingName> = new Set(['teamId']);\n\n/** The settings (text inputs; GitHub's `mode` is a select) and write-only secrets of each provider. */\nexport const PROVIDER_FIELDS = {\n generic_webhook: {\n settings: ['url'],\n secrets: [{ name: 'signingSecret', requiredOnCreate: false }],\n },\n cloudflare_pages: {\n settings: ['accountId', 'projectName'],\n secrets: [\n { name: 'deployHookUrl', requiredOnCreate: true },\n { name: 'apiToken', requiredOnCreate: true },\n ],\n },\n vercel: {\n settings: ['projectId', 'teamId'],\n secrets: [\n { name: 'deployHookUrl', requiredOnCreate: true },\n { name: 'apiToken', requiredOnCreate: true },\n ],\n },\n netlify: {\n settings: ['siteId'],\n secrets: [{ name: 'apiToken', requiredOnCreate: true }],\n },\n github: {\n settings: ['owner', 'repo', 'branch', 'directory'],\n secrets: [{ name: 'token', requiredOnCreate: true }],\n },\n} as const satisfies Record<\n DeploymentProvider,\n { settings: readonly SettingName[]; secrets: readonly SecretSpec[] }\n>;\n\n/** Settings sent per provider (GitHub's `mode` included). */\nconst providerSettingNames = (provider: DeploymentProvider): readonly SettingName[] =>\n provider === 'github' ? [...PROVIDER_FIELDS.github.settings, 'mode'] : PROVIDER_FIELDS[provider].settings;\n\n/** \"Schema changes\" only applies to GitHub, which commits the schema files. */\nexport const triggerOptionsFor = (provider: DeploymentProvider) =>\n DEPLOYMENT_TRIGGERS.filter((trigger) => trigger !== 'schema' || provider === 'github');\n\nconst isWholeNumber = (value: string) => /^\\d+$/.test(value) && Number(value) <= 86_400;\n\nconst isHttpUrl = (value: string) => z.url({ protocol: /^https?$/ }).safeParse(value).success;\n\nexport type ConnectionFormMode = 'create' | 'edit';\n\nconst settingsShape = Object.fromEntries(SETTING_NAMES.map((name) => [name, z.string()])) as Record<\n SettingName,\n z.ZodString\n>;\nconst secretsShape = Object.fromEntries(SECRET_NAMES.map((name) => [name, z.string()])) as Record<\n SecretName,\n z.ZodString\n>;\n\n/** Required settings and secrets depend on the provider; secrets are only required when creating. */\nexport const connectionSchema = (mode: ConnectionFormMode) =>\n z\n .object({\n name: requiredText().max(200, 'validation.tooLong'),\n provider: z.enum(DEPLOYMENT_PROVIDERS),\n settings: z.object(settingsShape),\n secrets: z.object(secretsShape),\n previewUrlTemplate: z.string().trim().max(2000, 'validation.tooLong'),\n triggerPolicy: z.array(z.enum(DEPLOYMENT_TRIGGERS)),\n debounceSeconds: z.string().trim().refine(isWholeNumber, 'validation.debounceSeconds'),\n allowPrivateNetwork: z.boolean(),\n enabled: z.boolean(),\n /** A delivery role ID, or NO_DELIVERY_ROLE. */\n deliveryRoleId: z.string(),\n })\n .superRefine((values, context) => {\n const fields = PROVIDER_FIELDS[values.provider];\n for (const name of fields.settings) {\n if (!OPTIONAL_SETTINGS.has(name) && values.settings[name].trim() === '') {\n context.addIssue({ code: 'custom', path: ['settings', name], message: 'validation.required' });\n }\n }\n if (\n values.provider === 'generic_webhook' &&\n values.settings.url.trim() &&\n !isHttpUrl(values.settings.url.trim())\n ) {\n context.addIssue({ code: 'custom', path: ['settings', 'url'], message: 'validation.url' });\n }\n if (mode === 'create') {\n for (const secret of fields.secrets) {\n if (secret.requiredOnCreate && values.secrets[secret.name].trim() === '') {\n context.addIssue({\n code: 'custom',\n path: ['secrets', secret.name],\n message: 'validation.required',\n });\n }\n }\n }\n if (values.previewUrlTemplate && !isHttpUrl(values.previewUrlTemplate)) {\n context.addIssue({ code: 'custom', path: ['previewUrlTemplate'], message: 'validation.url' });\n }\n });\n\nexport type ConnectionFormValues = z.infer<ReturnType<typeof connectionSchema>>;\n\nconst emptyRecord = <TName extends string>(names: readonly TName[]) =>\n Object.fromEntries(names.map((name) => [name, ''])) as Record<TName, string>;\n\nexport const EMPTY_CONNECTION: ConnectionFormValues = {\n name: '',\n provider: 'generic_webhook',\n settings: { ...emptyRecord(SETTING_NAMES), branch: 'main', mode: 'commit', directory: 'schema' },\n secrets: emptyRecord(SECRET_NAMES),\n previewUrlTemplate: '',\n triggerPolicy: ['publish', 'change_set', 'manual'],\n debounceSeconds: '30',\n allowPrivateNetwork: false,\n enabled: true,\n deliveryRoleId: NO_DELIVERY_ROLE,\n};\n\nexport const toConnectionValues = (connection: DeploymentConnection): ConnectionFormValues => ({\n name: connection.name,\n provider: connection.provider,\n settings: {\n ...EMPTY_CONNECTION.settings,\n ...Object.fromEntries(\n SETTING_NAMES.flatMap((name) => (connection.settings[name] ? [[name, connection.settings[name]]] : [])),\n ),\n },\n // Secrets are write-only: never prefilled.\n secrets: emptyRecord(SECRET_NAMES),\n previewUrlTemplate: connection.previewUrlTemplate ?? '',\n triggerPolicy: connection.triggerPolicy,\n debounceSeconds: String(connection.debounceSeconds),\n allowPrivateNetwork: connection.allowPrivateNetwork,\n enabled: connection.enabled,\n deliveryRoleId: connection.deliveryRoleId ?? NO_DELIVERY_ROLE,\n});\n\nconst commonInput = (values: ConnectionFormValues) => {\n const secrets = Object.fromEntries(\n PROVIDER_FIELDS[values.provider].secrets.flatMap(({ name }) =>\n values.secrets[name].trim() ? [[name, values.secrets[name].trim()]] : [],\n ),\n );\n return {\n name: values.name.trim(),\n settings: Object.fromEntries(\n providerSettingNames(values.provider).map((name) => [name, values.settings[name].trim()]),\n ),\n secrets,\n previewUrlTemplate: values.previewUrlTemplate.trim() || null,\n triggerPolicy: values.triggerPolicy.filter((trigger) =>\n triggerOptionsFor(values.provider).includes(trigger),\n ),\n debounceSeconds: Number(values.debounceSeconds),\n allowPrivateNetwork: values.allowPrivateNetwork,\n enabled: values.enabled,\n deliveryRoleId: values.deliveryRoleId === NO_DELIVERY_ROLE ? null : values.deliveryRoleId,\n };\n};\n\nexport const toCreateConnectionInput = (values: ConnectionFormValues): CreateDeploymentConnectionInput => ({\n ...commonInput(values),\n provider: values.provider,\n});\n\n/**\n * Secrets Shapio generates when left empty (the generic signing secret) that the server can no longer read\n * and that don't come from the environment: saving one empty asks for a new one.\n */\nexport const regenerableSecrets = (\n connection: Pick<DeploymentConnection, 'provider' | 'secrets' | 'secretsUnreadable'>,\n): SecretName[] =>\n connection.secretsUnreadable\n ? PROVIDER_FIELDS[connection.provider].secrets\n .filter(({ name, requiredOnCreate }) => !requiredOnCreate && !connection.secrets[name]?.set)\n .map(({ name }) => name)\n : [];\n\n/**\n * Only secrets typed in are sent: an omitted secret keeps its stored value. A `regenerable` secret left\n * empty is sent as '' so the server generates a new one (and returns it once).\n */\nexport const toUpdateConnectionInput = (\n values: ConnectionFormValues,\n expectedVersion: number,\n regenerable: readonly SecretName[] = [],\n): UpdateDeploymentConnectionInput => {\n const { secrets: typed, ...rest } = commonInput(values);\n const secrets = {\n ...Object.fromEntries(regenerable.filter((name) => !(name in typed)).map((name) => [name, ''])),\n ...typed,\n };\n return { ...rest, ...(Object.keys(secrets).length > 0 ? { secrets } : {}), expectedVersion };\n};\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useRoles } from '@/api/roles';\nimport type { SelectOption } from '@/components/FormSelectField';\nimport { NO_DELIVERY_ROLE } from '../helpers/connectionForm';\n\n/** \"Public fields\" plus every delivery role: what a connection's previews read with. */\nexport const useDeliveryRoleOptions = (): SelectOption[] => {\n const { t } = useTranslation();\n const roles = useRoles().data;\n return useMemo(\n () => [\n { value: NO_DELIVERY_ROLE, label: t('publishing.deployments.deliveryRoleNone') },\n ...(roles ?? [])\n .filter((role) => role.kind === 'delivery')\n .map((role) => ({ value: role.id, label: role.name })),\n ],\n [roles, t],\n );\n};\n","import type { DeploymentProvider } from '@shapio/client';\nimport type { SecretName, SettingName } from './connectionForm';\n\nexport const SETTING_LABELS = {\n url: 'publishing.deployments.settingLabels.url',\n accountId: 'publishing.deployments.settingLabels.accountId',\n projectName: 'publishing.deployments.settingLabels.projectName',\n projectId: 'publishing.deployments.settingLabels.projectId',\n teamId: 'publishing.deployments.settingLabels.teamId',\n siteId: 'publishing.deployments.settingLabels.siteId',\n owner: 'publishing.deployments.settingLabels.owner',\n repo: 'publishing.deployments.settingLabels.repo',\n branch: 'publishing.deployments.settingLabels.branch',\n mode: 'publishing.deployments.settingLabels.mode',\n directory: 'publishing.deployments.settingLabels.directory',\n} as const satisfies Record<SettingName, string>;\n\nexport const SETTING_HINTS = {\n url: 'publishing.deployments.settingHints.url',\n directory: 'publishing.deployments.settingHints.directory',\n teamId: 'publishing.deployments.settingHints.teamId',\n} as const satisfies Partial<Record<SettingName, string>>;\n\nexport const SECRET_LABELS = {\n signingSecret: 'publishing.deployments.secretLabels.signingSecret',\n deployHookUrl: 'publishing.deployments.secretLabels.deployHookUrl',\n apiToken: 'publishing.deployments.secretLabels.apiToken',\n token: 'publishing.deployments.secretLabels.token',\n} as const satisfies Record<SecretName, string>;\n\nexport const SECRET_HINTS = {\n signingSecret: 'publishing.deployments.secretHints.signingSecret',\n deployHookUrl: 'publishing.deployments.secretHints.deployHookUrl',\n apiToken: 'publishing.deployments.secretHints.apiToken',\n token: 'publishing.deployments.secretHints.token',\n} as const satisfies Record<SecretName, string>;\n\ntype SecretHintKey =\n (typeof SECRET_HINTS)[SecretName] | 'publishing.deployments.providerSecretHints.netlify.apiToken';\n\n/** Where a secret means something different for one provider (Netlify's token also starts builds). */\nconst PROVIDER_SECRET_HINTS: Partial<Record<DeploymentProvider, Partial<Record<SecretName, SecretHintKey>>>> =\n {\n netlify: { apiToken: 'publishing.deployments.providerSecretHints.netlify.apiToken' },\n };\n\n/** The hint for a provider's secret: its provider-specific override, or the shared one. */\nexport const secretHintFor = (provider: DeploymentProvider, name: SecretName): SecretHintKey =>\n PROVIDER_SECRET_HINTS[provider]?.[name] ?? SECRET_HINTS[name];\n\nexport const GITHUB_MODE_LABELS = {\n commit: 'publishing.deployments.githubModes.commit',\n pull_request: 'publishing.deployments.githubModes.pull_request',\n} as const;\n","import { useState } from 'react';\nimport { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { HintedLabel } from '@/components/HintedLabel';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Button } from '@/components/ui/button';\nimport { Field, FieldDescription } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { describedBy } from '@/helpers/describedBy';\nimport type { ConnectionFormValues, SecretName } from '../helpers/connectionForm';\n\ntype SecretFieldProps = {\n control: Control<ConnectionFormValues>;\n name: SecretName;\n label: string;\n /** What the secret is; shown behind the label's info icon with how to keep it in the environment. */\n hint: string;\n /** A value is stored on the server: show \"Stored\" with a Replace action instead of an empty input. */\n stored: boolean;\n /** The secret is read from this server environment variable (`${ENV:NAME}`). */\n envVar: string | null;\n /** One visible line under the input when it changes what the person does (an unreadable secret). */\n helper?: string | undefined;\n};\n\n/** A write-only secret: never prefilled; an empty value keeps the stored one. */\nexport const SecretField = ({ control, name, label, hint, stored, envVar, helper }: SecretFieldProps) => {\n const { t } = useTranslation();\n const { field, fieldState } = useController({ control, name: `secrets.${name}` });\n const [replacing, setReplacing] = useState(false);\n const id = `field-secrets-${name}`;\n const hintId = `${id}-hint`;\n const errorId = fieldState.error ? `${id}-error` : undefined;\n const helperId = helper ? `${id}-helper` : undefined;\n const fullHint = `${hint} ${t('publishing.deployments.secretEnvHint')}`;\n if (stored && !replacing) {\n return (\n <Field>\n <HintedLabel htmlFor={`${id}-replace`} label={label} hint={fullHint} hintId={hintId} />\n <div className=\"flex flex-wrap items-center gap-2\">\n <StatusChip\n tone=\"success\"\n label={\n envVar\n ? t('publishing.deployments.secretFromEnv', { name: envVar })\n : t('publishing.deployments.secretStored')\n }\n />\n <Button\n id={`${id}-replace`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-describedby={hintId}\n onClick={() => setReplacing(true)}\n >\n {t('publishing.deployments.replaceSecret')}\n </Button>\n </div>\n </Field>\n );\n }\n return (\n <Field data-invalid={fieldState.invalid || undefined}>\n <HintedLabel htmlFor={id} label={label} hint={fullHint} hintId={hintId} />\n <div className=\"flex gap-2\">\n <Input\n {...field}\n id={id}\n type=\"password\"\n autoComplete=\"new-password\"\n spellCheck={false}\n autoFocus={replacing}\n aria-invalid={fieldState.invalid || undefined}\n aria-describedby={describedBy(hintId, helperId, errorId)}\n className=\"font-mono text-sm\"\n />\n {stored ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n field.onChange('');\n setReplacing(false);\n }}\n >\n {t('publishing.deployments.keepSecret')}\n </Button>\n ) : null}\n </div>\n {helper ? <FieldDescription id={helperId}>{helper}</FieldDescription> : null}\n <FormFieldError id={errorId} message={fieldState.error?.message} />\n </Field>\n );\n};\n","import type { DeploymentSecretState } from '@shapio/client';\nimport { useWatch, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { GITHUB_MODES, PROVIDER_FIELDS, type ConnectionFormValues } from '../helpers/connectionForm';\nimport {\n GITHUB_MODE_LABELS,\n secretHintFor,\n SECRET_LABELS,\n SETTING_HINTS,\n SETTING_LABELS,\n} from '../helpers/labels';\nimport { SecretField } from '../SecretField';\n\ntype ProviderFieldsProps = {\n control: Control<ConnectionFormValues>;\n /** Which secrets the server holds (edit); undefined when creating. */\n storedSecrets: DeploymentSecretState | undefined;\n /** The server can't read the stored secrets: a secret Shapio can generate says how to fill it. */\n secretsUnreadable?: boolean;\n};\n\n/** The chosen provider's settings and secrets. */\nexport const ProviderFields = ({\n control,\n storedSecrets,\n secretsUnreadable = false,\n}: ProviderFieldsProps) => {\n const { t } = useTranslation();\n const provider = useWatch({ control, name: 'provider' });\n const fields = PROVIDER_FIELDS[provider];\n return (\n <>\n {fields.settings.map((name) => (\n <FormTextField\n key={name}\n control={control}\n name={`settings.${name}`}\n label={t(SETTING_LABELS[name])}\n hint={name in SETTING_HINTS ? t(SETTING_HINTS[name as keyof typeof SETTING_HINTS]) : undefined}\n type={name === 'url' ? 'url' : 'text'}\n autoComplete=\"off\"\n spellCheck={false}\n />\n ))}\n {provider === 'github' ? (\n <FormSelectField\n control={control}\n name=\"settings.mode\"\n label={t(SETTING_LABELS.mode)}\n options={GITHUB_MODES.map((mode) => ({ value: mode, label: t(GITHUB_MODE_LABELS[mode]) }))}\n />\n ) : null}\n {fields.secrets.map((secret) => (\n <SecretField\n key={`${provider}-${secret.name}`}\n control={control}\n name={secret.name}\n label={t(SECRET_LABELS[secret.name])}\n hint={t(secretHintFor(provider, secret.name))}\n stored={storedSecrets?.[secret.name]?.set ?? false}\n envVar={storedSecrets?.[secret.name]?.envVar ?? null}\n helper={\n secretsUnreadable && !secret.requiredOnCreate\n ? t('publishing.deployments.secretUnreadableHelper')\n : undefined\n }\n />\n ))}\n </>\n );\n};\n","import { DEPLOYMENT_PROVIDERS, type DeploymentSecretState } from '@shapio/client';\nimport { useWatch, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormCheckboxGroup } from '@/components/FormCheckboxGroup';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { PROVIDER_LABELS, TRIGGER_POLICY_LABELS } from '../../constants';\nimport {\n triggerOptionsFor,\n type ConnectionFormMode,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\nimport { useDeliveryRoleOptions } from '../hooks/useDeliveryRoleOptions';\nimport { ProviderFields } from '../ProviderFields';\n\ntype ConnectionFormProps = {\n control: Control<ConnectionFormValues>;\n mode: ConnectionFormMode;\n storedSecrets?: DeploymentSecretState;\n /** The server can't read the stored secrets: they are entered again (or generated). */\n secretsUnreadable?: boolean;\n};\n\n/** A deployment connection's fields: provider (fixed once created), its settings and secrets, and policy. */\nexport const ConnectionForm = ({\n control,\n mode,\n storedSecrets,\n secretsUnreadable = false,\n}: ConnectionFormProps) => {\n const { t } = useTranslation();\n const provider = useWatch({ control, name: 'provider' });\n const deliveryRoleOptions = useDeliveryRoleOptions();\n return (\n <>\n <FormTextField\n control={control}\n name=\"name\"\n label={t('publishing.deployments.name')}\n autoComplete=\"off\"\n />\n {mode === 'create' ? (\n <FormSelectField\n control={control}\n name=\"provider\"\n label={t('publishing.deployments.provider')}\n options={DEPLOYMENT_PROVIDERS.map((value) => ({ value, label: t(PROVIDER_LABELS[value]) }))}\n />\n ) : null}\n <ProviderFields control={control} storedSecrets={storedSecrets} secretsUnreadable={secretsUnreadable} />\n <FormTextField\n control={control}\n name=\"previewUrlTemplate\"\n label={t('publishing.deployments.previewUrlTemplate')}\n hint={t('publishing.deployments.previewUrlTemplateHint')}\n placeholder={t('publishing.deployments.previewUrlTemplatePlaceholder')}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <FormSelectField\n control={control}\n name=\"deliveryRoleId\"\n label={t('publishing.deployments.deliveryRole')}\n hint={t('publishing.deployments.deliveryRoleHint')}\n options={deliveryRoleOptions}\n />\n <FormCheckboxGroup\n control={control}\n name=\"triggerPolicy\"\n legend={t('publishing.deployments.triggerPolicy')}\n options={triggerOptionsFor(provider).map((value) => ({\n value,\n label: t(TRIGGER_POLICY_LABELS[value]),\n }))}\n />\n <FormTextField\n control={control}\n name=\"debounceSeconds\"\n type=\"number\"\n inputMode=\"numeric\"\n min={0}\n label={t('publishing.deployments.debounceSeconds')}\n hint={t('publishing.deployments.debounceSecondsHint')}\n className=\"w-32\"\n />\n <FormSwitchField control={control} name=\"enabled\" label={t('publishing.deployments.enabled')} />\n <FormSwitchField\n control={control}\n name=\"allowPrivateNetwork\"\n label={t('publishing.fields.allowPrivateNetwork')}\n hint={t('publishing.fields.allowPrivateNetworkHint')}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DeploymentConnectionCreated } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useCreateDeploymentConnection } from '@/api/deployments';\nimport { settle } from '@/helpers/settle';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\nimport {\n connectionSchema,\n EMPTY_CONNECTION,\n toCreateConnectionInput,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\n\nconst createSchema = connectionSchema('create');\n\nexport const useCreateConnectionForm = (\n open: boolean,\n onCreated: (created: DeploymentConnectionCreated) => void,\n) => {\n const createConnection = useCreateDeploymentConnection();\n const form = useForm<ConnectionFormValues>({\n resolver: zodResolver(createSchema),\n defaultValues: EMPTY_CONNECTION,\n });\n useResetOnOpen(open, form.reset, EMPTY_CONNECTION, createConnection.reset);\n const onSubmit = form.handleSubmit(async (values) => {\n const created = await settle(createConnection.mutateAsync(toCreateConnectionInput(values)));\n if (created.ok) {\n form.reset(EMPTY_CONNECTION);\n onCreated(created.value);\n }\n });\n return { form, onSubmit, createConnection };\n};\n","import type { DeploymentConnectionCreated } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { FormSheet } from '@/components/FormSheet';\nimport { ConnectionForm } from '../ConnectionForm';\nimport { useCreateConnectionForm } from '../hooks/useCreateConnectionForm';\n\ntype CreateSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Lets the page keep focus on the secret it reveals when the sheet closes. */\n onCloseAutoFocus: (event: Event) => void;\n onCreated: (created: DeploymentConnectionCreated) => void;\n};\n\nexport const CreateSheet = ({ open, onOpenChange, onCloseAutoFocus, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createConnection } = useCreateConnectionForm(open, onCreated);\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n onCloseAutoFocus={onCloseAutoFocus}\n title={t('publishing.deployments.createTitle')}\n dirty={form.formState.isDirty}\n pending={createConnection.isPending}\n submitLabel={t('common.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <ConnectionForm control={form.control} mode=\"create\" />\n <FormError error={createConnection.error} />\n </FormSheet>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { SecretReveal } from '@/components/SecretReveal';\n\ntype GeneratedSecretRevealProps = { secret: string; onDismiss: () => void };\n\n/** A signing secret Shapio generated for a connection (on create, or replacing an unreadable one), shown once. */\nexport const GeneratedSecretReveal = ({ secret, onDismiss }: GeneratedSecretRevealProps) => {\n const { t } = useTranslation();\n return (\n <SecretReveal\n title={t('publishing.deployments.generatedSecretTitle')}\n description={t('publishing.deployments.generatedSecretDescription')}\n label={t('publishing.deployments.secretLabels.signingSecret')}\n secret={secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={onDismiss}\n />\n );\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { RUN_TRIGGER_LABELS } from '../../constants';\nimport { RunStatus } from '../RunStatus';\n\ntype RunsProps = { runs: DeploymentRun[]; showConnection: boolean };\n\n/** Deployment runs, newest first; each opens its detail page. */\nexport const Runs = ({ runs, showConnection }: RunsProps) => {\n const { t } = useTranslation();\n return (\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.deployments.run')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n {showConnection ? <TableHead>{t('publishing.deployments.connection')}</TableHead> : null}\n <TableHead>{t('publishing.deployments.trigger')}</TableHead>\n <TableHead>{t('publishing.fields.snapshot')}</TableHead>\n <TableHead>{t('publishing.deployments.finishedAt')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {runs.map((run) => (\n <TableRow key={run.id}>\n <TableCell className=\"whitespace-nowrap\">\n <RowTitle asChild>\n <Link\n to=\"/publishing/deployments/runs/$runId\"\n params={{ runId: run.id }}\n aria-label={t('publishing.deployments.openRun', {\n connection: run.connectionName,\n at: formatDateTime(run.createdAt),\n })}\n >\n {formatDateTime(run.createdAt)}\n </Link>\n </RowTitle>\n </TableCell>\n <TableCell>\n <RunStatus run={run} />\n </TableCell>\n {showConnection ? (\n <TableCell className=\"max-w-56 truncate\">{run.connectionName}</TableCell>\n ) : null}\n <TableCell>{t(RUN_TRIGGER_LABELS[run.trigger])}</TableCell>\n <TableCell className=\"tabular-nums\">\n {run.snapshot === null\n ? t('common.none')\n : t('publishing.snapshotNumber', { snapshot: run.snapshot })}\n </TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(run.finishedAt)}>\n {run.finishedAt ? formatRelativeTime(run.finishedAt) : t('common.none')}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </TableRoot>\n );\n};\n","import { Rocket } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDeploymentRuns } from '@/api/deployments';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { QueryView } from '@/components/QueryView';\nimport { PUBLISHING_PAGE_SIZE } from '@/constants/publishing';\nimport { useCursorPager } from '../../hooks/useCursorPager';\nimport { Runs } from '../Runs';\n\ntype RunsListProps = {\n /** Runs of one connection, or of every connection when undefined. */\n connectionId: string | undefined;\n cursor: string | undefined;\n onCursorChange: (cursor: string | undefined) => void;\n};\n\n/** A page of runs (polled while any is in progress) with paging, for the body of a flush `Panel`. */\nexport const RunsList = ({ connectionId, cursor, onCursorChange }: RunsListProps) => {\n const { t } = useTranslation();\n const { pagerProps } = useCursorPager(cursor, onCursorChange);\n const runs = useDeploymentRuns({ connectionId, cursor, limit: PUBLISHING_PAGE_SIZE });\n return (\n <QueryView\n query={runs}\n isEmpty={(data) => data.items.length === 0 && cursor === undefined}\n empty={<EmptyState icon={Rocket} size=\"panel\" title={t('publishing.deployments.noRuns')} />}\n >\n {(data) => (\n <>\n <Runs runs={data.items} showConnection={connectionId === undefined} />\n <CursorPager {...pagerProps(data.nextCursor)} className=\"border-t px-4 py-2.5\" />\n </>\n )}\n </QueryView>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport { Plus, Rocket } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useDeploymentConnections } from '@/api/deployments';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { Panel } from '@/components/Panel';\nimport { QueryView } from '@/components/QueryView';\nimport { Button } from '@/components/ui/button';\nimport { Header } from '../Header';\nimport { usePublishingPermissions } from '../hooks/usePublishingPermissions';\nimport { useSecretReveal } from '../hooks/useSecretReveal';\nimport { ConnectionCard } from './ConnectionCard';\nimport { CreateSheet } from './CreateSheet';\nimport { GeneratedSecretReveal } from './GeneratedSecretReveal';\nimport { RunsList } from './RunsList';\n\n/** Deployment connections as cards (managers) and the latest runs across all of them (everyone). */\nexport const Deployments = () => {\n const { t } = useTranslation();\n const navigate = useNavigate({ from: '/publishing/deployments' });\n const { cursor } = useSearch({ from: '/app/publishing/deployments' });\n const { canManageDeployments } = usePublishingPermissions();\n const connections = useDeploymentConnections();\n const [creating, setCreating] = useState(false);\n const openConnection = (connectionId: string) =>\n void navigate({ to: '/publishing/deployments/$connectionId', params: { connectionId } });\n // A generated signing secret is shown here, then the connection opens.\n const secret = useSecretReveal(openConnection);\n return (\n <Page>\n <Header\n actions={\n canManageDeployments ? (\n <Button onClick={() => setCreating(true)}>\n <Plus aria-hidden=\"true\" />\n {t('publishing.deployments.create')}\n </Button>\n ) : undefined\n }\n />\n {secret.revealed ? (\n <GeneratedSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n {canManageDeployments ? (\n <section aria-labelledby=\"deployment-connections\" className=\"space-y-3\">\n <h2 id=\"deployment-connections\" className=\"text-base font-semibold\">\n {t('publishing.deployments.connections')}\n </h2>\n <QueryView\n query={connections}\n isEmpty={(data) => data.length === 0}\n empty={<EmptyState icon={Rocket} title={t('publishing.deployments.empty')} />}\n >\n {(data) => (\n <ul className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {data.map((connection) => (\n <li key={connection.id} className=\"grid\">\n <ConnectionCard connection={connection} />\n </li>\n ))}\n </ul>\n )}\n </QueryView>\n </section>\n ) : null}\n <Panel title={t('publishing.deployments.recentRuns')} flush>\n <RunsList\n connectionId={undefined}\n cursor={cursor}\n onCursorChange={(next) => void navigate({ search: { cursor: next } })}\n />\n </Panel>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCloseAutoFocus={secret.keepFocusOnReveal}\n onCreated={({ connection, generatedSecrets }) => {\n setCreating(false);\n const generated = generatedSecrets.signingSecret;\n if (generated) {\n secret.reveal({ id: connection.id, secret: generated });\n } else {\n openConnection(connection.id);\n }\n }}\n />\n </Page>\n );\n};\n","import { useQueryClient, type QueryKey } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { isConflict } from '@/api/errors';\n\n/**\n * Optimistic concurrency on an edit page: when a save answers 409 (someone else saved first), the latest\n * version is reloaded and the page says so, instead of overwriting their change.\n */\nexport const useConflictReload = (queryKey: QueryKey) => {\n const queryClient = useQueryClient();\n const [conflicted, setConflicted] = useState(false);\n return {\n conflicted,\n clearConflict: () => setConflicted(false),\n /** Pass as a mutation's `onError`: other errors are left to the form. */\n onSaveError: (error: unknown) => {\n if (isConflict(error)) {\n setConflicted(true);\n void queryClient.invalidateQueries({ queryKey });\n }\n },\n };\n};\n","import { cn } from '@/helpers/cn';\n\ntype JsonBlockProps = { value: unknown; label: string; className?: string };\n\n/** Pretty-printed JSON (payloads, results), scrollable and focusable so keyboard users can scroll it. */\nexport const JsonBlock = ({ value, label, className }: JsonBlockProps) => (\n <pre\n tabIndex={0}\n aria-label={label}\n className={cn(\n 'max-h-72 overflow-auto rounded-md border bg-muted p-3 font-mono text-xs break-all whitespace-pre-wrap text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50',\n className,\n )}\n >\n {typeof value === 'string' ? value : JSON.stringify(value ?? null, null, 2)}\n </pre>\n);\n","import { useTranslation } from 'react-i18next';\n\n/** Header names are protocol, not prose: they are not translated. */\nconst SIGNATURE_HEADERS = [\n { name: 'X-Shapio-Signature', valueKey: 'publishing.webhooks.signatureFormat' },\n { name: 'X-Shapio-Timestamp', valueKey: 'publishing.webhooks.timestampFormat' },\n { name: 'X-Shapio-Event', valueKey: 'publishing.webhooks.eventFormat' },\n { name: 'X-Shapio-Delivery', valueKey: 'publishing.webhooks.deliveryFormat' },\n] as const;\n\ntype SignatureHelpProps = { description: string };\n\n/** How receivers verify a request: what the signature covers, and the headers Shapio sends. */\nexport const SignatureHelp = ({ description }: SignatureHelpProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"space-y-2\">\n <p className=\"text-meta text-muted-foreground\">{description}</p>\n <dl className=\"space-y-1 rounded-lg border bg-muted p-3 font-mono text-xs break-all\">\n {SIGNATURE_HEADERS.map((header) => (\n <div key={header.name}>\n <dt className=\"inline font-semibold\">{header.name}</dt>\n <dd className=\"inline before:content-[':_']\">{t(header.valueKey)}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { CopyButton } from '@/components/CopyButton';\nimport { Field, FieldLabel } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { JsonBlock } from '../../JsonBlock';\nimport { SignatureHelp } from '../../SignatureHelp';\n\ntype CallbackHelpProps = { callbackUrl: string };\n\n/** The body a build posts back; code, not prose, so it is not translated. */\nconst CALLBACK_EXAMPLE = {\n runId: '0b8f3c1e-…',\n status: 'deployed',\n logUrl: 'https://ci.example.com/builds/123',\n siteUrl: 'https://www.example.com',\n message: 'Build 123',\n};\n\n/** How a generic-webhook site reports build progress: where to post, what to send, how to sign it. */\nexport const CallbackHelp = ({ callbackUrl }: CallbackHelpProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"space-y-5\">\n <Field>\n <FieldLabel htmlFor=\"deployment-callback-url\">{t('publishing.deployments.callbackUrl')}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id=\"deployment-callback-url\"\n readOnly\n value={callbackUrl}\n className=\"font-mono text-xs\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <CopyButton value={callbackUrl} />\n </div>\n </Field>\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <div className=\"min-w-0 space-y-2\">\n <p className=\"text-sm font-semibold\">{t('publishing.deployments.callbackBody')}</p>\n <JsonBlock value={CALLBACK_EXAMPLE} label={t('publishing.deployments.callbackBody')} />\n <p className=\"text-meta text-muted-foreground\">{t('publishing.deployments.callbackFields')}</p>\n </div>\n <div className=\"min-w-0 space-y-2\">\n <p className=\"text-sm font-semibold\">{t('publishing.webhooks.signatureTitle')}</p>\n <SignatureHelp description={t('publishing.deployments.callbackSignature')} />\n </div>\n </div>\n </div>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DeploymentConnection } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useUpdateDeploymentConnection } from '@/api/deployments';\nimport { isConflict } from '@/api/errors';\nimport { settle } from '@/helpers/settle';\nimport {\n connectionSchema,\n regenerableSecrets,\n toConnectionValues,\n toUpdateConnectionInput,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\n\nconst editSchema = connectionSchema('edit');\n\n/**\n * Edits one version of a connection (the form is re-created when the version changes). Saves send the\n * version they started from; a 409 goes to `onConflict`. `onSaved` receives any secret the server generated\n * (replacing one it could no longer read), for the page to show once.\n */\nexport const useEditConnectionForm = (\n connection: DeploymentConnection,\n onSaved: (generatedSecrets: Record<string, string> | undefined) => void,\n onConflict: (error: unknown) => void,\n) => {\n const { t } = useTranslation();\n const update = useUpdateDeploymentConnection();\n const form = useForm<ConnectionFormValues>({\n resolver: zodResolver(editSchema),\n defaultValues: toConnectionValues(connection),\n });\n const onSubmit = form.handleSubmit(async (values) => {\n const saved = await settle(\n update.mutateAsync(\n {\n id: connection.id,\n input: toUpdateConnectionInput(values, connection.version, regenerableSecrets(connection)),\n },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.deployments.saved'));\n onSaved(saved.value.generatedSecrets);\n }\n });\n return { form, onSubmit, update, error: isConflict(update.error) ? undefined : update.error };\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { ConnectionForm } from '../../ConnectionForm';\nimport { useEditConnectionForm } from '../../hooks/useEditConnectionForm';\n\ntype EditFormProps = {\n connection: DeploymentConnection;\n /** Receives any secret the server generated on this save, to show once. */\n onSaved: (generatedSecrets: Record<string, string> | undefined) => void;\n onConflict: (error: unknown) => void;\n};\n\nexport const EditForm = ({ connection, onSaved, onConflict }: EditFormProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, update, error } = useEditConnectionForm(connection, onSaved, onConflict);\n return (\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <UnsavedChangesGuard when={form.formState.isDirty && !update.isPending} />\n <FieldGroup>\n <ConnectionForm\n control={form.control}\n mode=\"edit\"\n storedSecrets={connection.secrets}\n secretsUnreadable={connection.secretsUnreadable}\n />\n <FormError error={error} />\n <div>\n <SubmitButton pending={update.isPending} pendingLabel={t('common.saving')}>\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n );\n};\n","import type { ConnectionTestResult } from '@shapio/client';\nimport { CheckCircle2, XCircle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\n\ntype TestResultProps = { result: ConnectionTestResult };\n\n/** Each check of a connection test, passed or failed, with the provider's message. */\nexport const TestResult = ({ result }: TestResultProps) => {\n const { t } = useTranslation();\n return (\n <Alert variant={result.ok ? 'success' : 'destructive'}>\n {result.ok ? <CheckCircle2 aria-hidden=\"true\" /> : <XCircle aria-hidden=\"true\" />}\n <AlertTitle>\n {result.ok ? t('publishing.deployments.testPassed') : t('publishing.deployments.testFailed')}\n </AlertTitle>\n <AlertDescription>\n <ul className=\"space-y-1\">\n {result.checks.map((check) => (\n <li key={check.name}>\n <span className=\"font-medium\">\n {check.ok\n ? t('publishing.deployments.checkPassed', { name: check.name })\n : t('publishing.deployments.checkFailed', { name: check.name })}\n </span>\n {check.message ? <span className=\"block\">{check.message}</span> : null}\n </li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n );\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { linkOptions, useNavigate, useSearch } from '@tanstack/react-router';\nimport { Loader2, PlugZap, Rocket, Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { PROVIDER_LABELS } from '../../../constants';\nimport { EnabledChip } from '../../../EnabledChip';\nimport { useConflictReload } from '../../../hooks/useConflictReload';\nimport { usePublishingPermissions } from '../../../hooks/usePublishingPermissions';\nimport { useSecretReveal } from '../../../hooks/useSecretReveal';\nimport { CallbackHelp } from '../../CallbackHelp';\nimport { GeneratedSecretReveal } from '../../GeneratedSecretReveal';\nimport { canDeployConnection } from '../../helpers/connectionState';\nimport { useConnectionActions } from '../../hooks/useConnectionActions';\nimport { RunsList } from '../../RunsList';\nimport { SecretsUnreadableChip } from '../../SecretsUnreadableChip';\nimport { EditForm } from '../EditForm';\nimport { TestResult } from '../TestResult';\n\ntype ViewProps = { connection: DeploymentConnection };\n\n/** Nothing to open after the reveal: the connection is already on screen. */\nconst stayOnPage = () => undefined;\n\n/**\n * A loaded connection: test, trigger, its runs, the callback contract (generic) and its settings. A secret\n * the server can't read is flagged in the header (its field is empty, ready to fill); a secret the server\n * generated on save is shown once at the top.\n */\nexport const View = ({ connection }: ViewProps) => {\n const { t } = useTranslation();\n const { cursor } = useSearch({ from: '/app/publishing/deployments/$connectionId' });\n const navigate = useNavigate({ from: '/publishing/deployments/$connectionId' });\n const conflict = useConflictReload(queryKeys.publishing.deployments.connection(connection.id));\n const actions = useConnectionActions(connection);\n const { canTriggerDeployments } = usePublishingPermissions();\n const secret = useSecretReveal(stayOnPage);\n const onSaved = (generatedSecrets: Record<string, string> | undefined) => {\n conflict.clearConflict();\n const generated = generatedSecrets?.signingSecret;\n if (generated) {\n secret.reveal({ id: connection.id, secret: generated });\n }\n };\n const busy = actions.testing || actions.triggering || actions.deleting;\n const snapshot = connection.currentRun?.snapshot;\n const meta = [\n t(PROVIDER_LABELS[connection.provider]),\n snapshot != null\n ? t('publishing.deployments.liveSnapshot', { snapshot: t('publishing.snapshotNumber', { snapshot }) })\n : '',\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.deployments'), link: linkOptions({ to: '/publishing/deployments' }) },\n ]}\n title={connection.name}\n badge={\n <>\n <EnabledChip enabled={connection.enabled} />\n <SecretsUnreadableChip unreadable={connection.secretsUnreadable} />\n </>\n }\n meta={meta}\n actions={\n <>\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.deployments.deleteTitle', { name: connection.name })}\n description={t('publishing.deployments.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={actions.remove}\n trigger={\n <Button variant=\"destructive-ghost\" disabled={busy}>\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </Button>\n }\n />\n <Button variant=\"outline\" disabled={busy} onClick={actions.runTest}>\n {actions.testing ? (\n <Loader2 aria-hidden=\"true\" className=\"animate-spin motion-reduce:animate-none\" />\n ) : (\n <PlugZap aria-hidden=\"true\" />\n )}\n {t('publishing.deployments.test')}\n </Button>\n {canTriggerDeployments ? (\n <Button disabled={busy || !canDeployConnection(connection)} onClick={actions.triggerRun}>\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </>\n }\n />\n {secret.revealed ? (\n <GeneratedSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n {actions.testResult ? <TestResult result={actions.testResult} /> : null}\n <Panel title={t('publishing.deployments.runs')} flush>\n <RunsList\n connectionId={connection.id}\n cursor={cursor}\n onCursorChange={(next) => void navigate({ search: { cursor: next } })}\n />\n </Panel>\n {connection.provider === 'generic_webhook' ? (\n <Panel\n title={t('publishing.deployments.callbacks')}\n description={t('publishing.deployments.callbacksDescription')}\n >\n <CallbackHelp callbackUrl={connection.callbackUrl} />\n </Panel>\n ) : null}\n <Panel title={t('publishing.deployments.settings')} bodyClassName=\"space-y-4\">\n {conflict.conflicted ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{t('publishing.conflictReloaded')}</AlertDescription>\n </Alert>\n ) : null}\n <EditForm\n key={connection.version}\n connection={connection}\n onSaved={onSaved}\n onConflict={conflict.onSaveError}\n />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useDeploymentConnection } from '@/api/deployments';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One deployment connection. */\nexport const Connection = () => {\n const { connectionId } = useParams({ from: '/app/publishing/deployments/$connectionId' });\n const connection = useDeploymentConnection(connectionId);\n return (\n <QueryView query={connection} loadingRows={6}>\n {(data) => <View connection={data} />}\n </QueryView>\n );\n};\n","/**\n * Only http(s) links are rendered. Log and site URLs come from build callbacks and providers, so a\n * `javascript:` or `data:` URL must never become a clickable link in the admin.\n */\nexport const safeExternalUrl = (value: string | null | undefined): string | undefined => {\n if (!value) {\n return undefined;\n }\n try {\n const url = new URL(value);\n return url.protocol === 'https:' || url.protocol === 'http:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { TIMELINE_SOURCE_LABELS } from '../../../constants';\nimport { RunStatus } from '../../RunStatus';\n\ntype TimelineProps = { run: DeploymentRun };\n\n/** Every status the run went through, oldest first, with who reported it. */\nexport const Timeline = ({ run }: TimelineProps) => {\n const { t } = useTranslation();\n if (run.timeline.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">{t('publishing.deployments.timelineEmpty')}</p>;\n }\n return (\n <ol aria-label={t('publishing.deployments.timeline')} className=\"relative ml-1.5 space-y-4 border-l pl-6\">\n {run.timeline.map((event, index) => (\n <li key={`${event.at}-${index}`} className=\"relative\">\n <span\n aria-hidden=\"true\"\n className=\"absolute top-2 -left-7.5 size-2.5 rounded-full border-2 border-card bg-primary\"\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <RunStatus\n run={{\n status: event.status,\n provider: run.provider,\n completionReported: run.completionReported,\n }}\n live={false}\n />\n <time dateTime={event.at} className=\"text-sm\">\n {formatDateTime(event.at)}\n </time>\n <span className=\"text-meta text-muted-foreground\">\n {t('publishing.deployments.reportedBy', { source: t(TIMELINE_SOURCE_LABELS[event.source]) })}\n </span>\n </div>\n {event.message ? <p className=\"mt-1 text-sm break-words\">{event.message}</p> : null}\n </li>\n ))}\n </ol>\n );\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { linkOptions, useNavigate } from '@tanstack/react-router';\nimport { AlertCircle, Info, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useRetryDeploymentRun } from '@/api/deployments';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { TextLink } from '@/components/TextLink';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { ACTIVE_RUN_STATUSES } from '@/constants/publishing';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { PROVIDER_LABELS, RUN_TRIGGER_LABELS } from '../../../constants';\nimport { DetailList, type DetailItem } from '../../../DetailList';\nimport { ExternalLink } from '../../../ExternalLink';\nimport { safeExternalUrl } from '../../../helpers/safeExternalUrl';\nimport { usePublishingPermissions } from '../../../hooks/usePublishingPermissions';\nimport { RunStatus } from '../../RunStatus';\nimport { Timeline } from '../Timeline';\n\ntype ViewProps = { run: DeploymentRun };\n\n/** A loaded run: honest status, links, error, timeline and retry. */\nexport const View = ({ run }: ViewProps) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { canTriggerDeployments } = usePublishingPermissions();\n const retry = useRetryDeploymentRun();\n const none = t('common.none');\n const logUrl = safeExternalUrl(run.logUrl);\n const siteUrl = safeExternalUrl(run.siteUrl);\n const active = ACTIVE_RUN_STATUSES.has(run.status);\n const details: DetailItem[] = [\n { label: t('publishing.deployments.connection'), value: run.connectionName },\n { label: t('publishing.deployments.provider'), value: t(PROVIDER_LABELS[run.provider]) },\n { label: t('publishing.deployments.trigger'), value: t(RUN_TRIGGER_LABELS[run.trigger]) },\n {\n label: t('publishing.fields.snapshot'),\n value: run.snapshot === null ? none : t('publishing.snapshotNumber', { snapshot: run.snapshot }),\n },\n { label: t('publishing.deployments.schemaVersion'), value: run.schemaVersion ?? none },\n { label: t('publishing.deployments.providerRef'), value: run.providerRef ?? none },\n { label: t('publishing.deployments.triggeredAt'), value: formatDateTime(run.triggeredAt) || none },\n { label: t('publishing.deployments.finishedAt'), value: formatDateTime(run.finishedAt) || none },\n {\n label: t('publishing.deployments.logUrl'),\n value: logUrl ? <ExternalLink href={logUrl}>{logUrl}</ExternalLink> : none,\n },\n {\n label: t('publishing.deployments.siteUrl'),\n value: siteUrl ? <ExternalLink href={siteUrl}>{siteUrl}</ExternalLink> : none,\n },\n ];\n if (run.retryOf) {\n details.push({\n label: t('publishing.deployments.retryOf'),\n value: (\n <TextLink to=\"/publishing/deployments/runs/$runId\" params={{ runId: run.retryOf }}>\n {t('publishing.deployments.previousRun')}\n </TextLink>\n ),\n });\n }\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.deployments'), link: linkOptions({ to: '/publishing/deployments' }) },\n {\n label: run.connectionName,\n link: linkOptions({\n to: '/publishing/deployments/$connectionId',\n params: { connectionId: run.connectionId },\n }),\n },\n ]}\n title={t('publishing.deployments.runTitle', { connection: run.connectionName })}\n badge={\n <span aria-live=\"polite\">\n <RunStatus run={run} />\n </span>\n }\n meta={\n active\n ? `${formatDateTime(run.createdAt)} · ${t('publishing.deployments.watching')}`\n : formatDateTime(run.createdAt)\n }\n actions={\n canTriggerDeployments && !active ? (\n <Button\n variant=\"outline\"\n disabled={retry.isPending}\n onClick={() =>\n retry.mutate(run.id, {\n onSuccess: (next) => {\n toast.success(t('publishing.deployments.retried'));\n void navigate({ to: '/publishing/deployments/runs/$runId', params: { runId: next.id } });\n },\n })\n }\n >\n <RotateCcw aria-hidden=\"true\" />\n {t('publishing.deployments.retry')}\n </Button>\n ) : undefined\n }\n />\n {run.status === 'triggered' && !run.completionReported ? (\n <Alert variant=\"info\">\n <Info aria-hidden=\"true\" />\n <AlertDescription>{t('publishing.deployments.completionUnknown')}</AlertDescription>\n </Alert>\n ) : null}\n {run.error ? (\n <Alert variant=\"destructive\">\n <AlertCircle aria-hidden=\"true\" />\n <AlertDescription>{run.error}</AlertDescription>\n </Alert>\n ) : null}\n <Panel title={t('publishing.deployments.details')}>\n <DetailList items={details} />\n </Panel>\n <Panel title={t('publishing.deployments.timeline')}>\n <Timeline run={run} />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useDeploymentRun } from '@/api/deployments';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One deployment run, polled until it finishes. */\nexport const Run = () => {\n const { runId } = useParams({ from: '/app/publishing/deployments/runs/$runId' });\n const run = useDeploymentRun(runId);\n return (\n <QueryView query={run} loadingRows={6}>\n {(data) => <View run={data} />}\n </QueryView>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\n\ntype StatusFilterProps<TStatus extends string> = {\n id: string;\n label: string;\n value: TStatus | undefined;\n options: readonly { value: TStatus; label: string }[];\n onChange: (value: TStatus | undefined) => void;\n allLabel?: string;\n};\n\nconst ALL = '__all';\n\n/** A compact \"Status: All\" select for a table's toolbar; the label is part of the control and its name. */\nexport const StatusFilter = <TStatus extends string>({\n id,\n label,\n value,\n options,\n onChange,\n allLabel,\n}: StatusFilterProps<TStatus>) => {\n const { t } = useTranslation();\n const labelId = `${id}-label`;\n return (\n <Select\n value={value ?? ALL}\n onValueChange={(next) => onChange(options.find((option) => option.value === next)?.value)}\n >\n <SelectTrigger id={id} size=\"sm\" aria-labelledby={labelId} className=\"min-w-40\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span id={labelId} className=\"text-muted-foreground\">\n {label}\n </span>\n <SelectValue />\n </span>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>{allLabel ?? t('publishing.filters.all')}</SelectItem>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n};\n","import { PUBLICATION_ACTIONS, type PublicationAction } from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\n/** The locale select's \"no locale\" choice: non-localized models and the default locale. */\nexport const DEFAULT_LOCALE = '__default';\n\n/** Which entry (and locale) to publish or unpublish: scheduled publications. */\nexport const entryTargetShape = {\n modelKey: z.string().min(1, 'validation.selectModel'),\n entryId: requiredText(),\n locale: z.string(),\n action: z.enum(PUBLICATION_ACTIONS),\n};\n\nexport type EntryTargetValues = {\n modelKey: string;\n entryId: string;\n locale: string;\n action: PublicationAction;\n};\n\nexport const EMPTY_ENTRY_TARGET: EntryTargetValues = {\n modelKey: '',\n entryId: '',\n locale: DEFAULT_LOCALE,\n action: 'publish',\n};\n\nexport const toEntryTarget = ({ modelKey, entryId, locale, action }: EntryTargetValues) => ({\n modelKey,\n entryId: entryId.trim(),\n action,\n ...(locale === DEFAULT_LOCALE ? {} : { locale }),\n});\n","import { PUBLICATION_ACTIONS } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useLocales } from '@/api/locales';\nimport { useDefinitions } from '@/api/schema';\nimport { PUBLICATION_ACTION_LABELS } from '../constants';\nimport { DEFAULT_LOCALE } from '../helpers/entryTarget';\n\n/** Select options for the entry target fields: the models, the locales and the two actions. */\nexport const useEntryTargetOptions = () => {\n const { t } = useTranslation();\n const models = useDefinitions('model');\n const locales = useLocales();\n const modelOptions = (models.data ?? []).map(({ definition }) => ({\n value: definition.apiKey,\n label: `${definition.label} (${definition.apiKey})`,\n }));\n const localeOptions = [\n { value: DEFAULT_LOCALE, label: t('publishing.fields.defaultLocale') },\n ...(locales.data ?? []).map((locale) => ({\n value: locale.code,\n label: `${locale.label} (${locale.code})`,\n })),\n ];\n const actionOptions = PUBLICATION_ACTIONS.map((action) => ({\n value: action,\n label: t(PUBLICATION_ACTION_LABELS[action]),\n }));\n return { modelOptions, localeOptions, actionOptions };\n};\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormTextField } from '@/components/FormTextField';\nimport type { EntryTargetValues } from '../helpers/entryTarget';\nimport { useEntryTargetOptions } from '../hooks/useEntryTargetOptions';\n\ntype EntryTargetFieldsProps<TValues extends FieldValues & EntryTargetValues> = {\n control: Control<TValues>;\n};\n\n/** Model, entry ID, locale and action: the entry a scheduled publication acts on. */\nexport const EntryTargetFields = <TValues extends FieldValues & EntryTargetValues>({\n control,\n}: EntryTargetFieldsProps<TValues>) => {\n const { t } = useTranslation();\n const { modelOptions, localeOptions, actionOptions } = useEntryTargetOptions();\n const path = (name: keyof EntryTargetValues) => name as FieldPath<TValues>;\n return (\n <>\n <FormSelectField\n control={control}\n name={path('modelKey')}\n label={t('publishing.fields.model')}\n placeholder={t('publishing.fields.modelPlaceholder')}\n options={modelOptions}\n />\n <FormTextField\n control={control}\n name={path('entryId')}\n label={t('publishing.fields.entryId')}\n hint={t('publishing.fields.entryIdHint')}\n autoComplete=\"off\"\n className=\"font-mono text-sm\"\n />\n <FormSelectField\n control={control}\n name={path('locale')}\n label={t('publishing.fields.locale')}\n hint={t('publishing.fields.localeHint')}\n options={localeOptions}\n />\n <FormSelectField\n control={control}\n name={path('action')}\n label={t('publishing.fields.action')}\n options={actionOptions}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useCreateSchedule } from '@/api/schedules';\nimport { settle } from '@/helpers/settle';\nimport { dateTimeLocalField, dateTimeLocalToIso, defaultScheduleValue } from '../../helpers/dateTimeLocal';\nimport { EMPTY_ENTRY_TARGET, entryTargetShape, toEntryTarget } from '../../helpers/entryTarget';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\n\nconst createScheduleSchema = z.object({ ...entryTargetShape, runAt: dateTimeLocalField() });\n\ntype CreateScheduleValues = z.infer<typeof createScheduleSchema>;\n\nexport const useCreateScheduleForm = (open: boolean, onCreated: () => void) => {\n const createSchedule = useCreateSchedule();\n const defaults = useMemo<CreateScheduleValues>(\n () => ({ ...EMPTY_ENTRY_TARGET, runAt: open ? defaultScheduleValue() : '' }),\n [open],\n );\n const form = useForm<CreateScheduleValues>({\n resolver: zodResolver(createScheduleSchema),\n defaultValues: defaults,\n });\n useResetOnOpen(open, form.reset, defaults, createSchedule.reset);\n const onSubmit = form.handleSubmit(async ({ runAt, ...target }) => {\n const iso = dateTimeLocalToIso(runAt);\n if (!iso) {\n return;\n }\n const created = await settle(createSchedule.mutateAsync({ ...toEntryTarget(target), runAt: iso }));\n if (created.ok) {\n onCreated();\n }\n });\n return { form, onSubmit, createSchedule };\n};\n","import { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { FormSheet } from '@/components/FormSheet';\nimport { FormTextField } from '@/components/FormTextField';\nimport { EntryTargetFields } from '../../EntryTargetFields';\nimport { useCreateScheduleForm } from '../hooks/useCreateScheduleForm';\n\ntype CreateSheetProps = { open: boolean; onOpenChange: (open: boolean) => void; onCreated: () => void };\n\nexport const CreateSheet = ({ open, onOpenChange, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createSchedule } = useCreateScheduleForm(open, onCreated);\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n title={t('publishing.scheduled.createTitle')}\n dirty={form.formState.isDirty}\n pending={createSchedule.isPending}\n submitLabel={t('publishing.scheduled.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <EntryTargetFields control={form.control} />\n <FormTextField\n control={form.control}\n name=\"runAt\"\n type=\"datetime-local\"\n label={t('publishing.fields.runAt')}\n description={t('publishing.fields.localTimeHint', {\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n })}\n />\n <FormError error={createSchedule.error} />\n </FormSheet>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport type { SchedulesSearch } from '@/app/searchSchemas';\nimport { useCursorPager } from '../../hooks/useCursorPager';\n\n/** The status filter and page cursor live in the URL (bookmarkable, back-button friendly). */\nexport const useScheduledSearch = () => {\n const search = useSearch({ from: '/app/publishing/scheduled' });\n const navigate = useNavigate({ from: '/publishing/scheduled' });\n const go = (changes: Partial<SchedulesSearch>) =>\n void navigate({ search: (previous) => ({ ...previous, ...changes }) });\n const { pagerProps, resetPager } = useCursorPager(search.cursor, (cursor) => go({ cursor }));\n return {\n search,\n pagerProps,\n setStatus: (status: SchedulesSearch['status']) => {\n resetPager();\n go({ status, cursor: undefined });\n },\n };\n};\n","import type { ScheduledPublication } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Button } from '@/components/ui/button';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { PUBLICATION_ACTION_LABELS } from '../../constants';\nimport { SCHEDULE_STATUS_DISPLAY } from '../../helpers/statusDisplay';\n\ntype TableProps = {\n schedules: ScheduledPublication[];\n /** Cancels after an inline confirmation; the promise keeps it open until the request settles. */\n onCancel: (schedule: ScheduledPublication) => Promise<unknown>;\n};\n\nexport const Table = ({ schedules, onCancel }: TableProps) => {\n const { t } = useTranslation();\n return (\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.fields.entryId')}</TableHead>\n <TableHead>{t('publishing.fields.model')}</TableHead>\n <TableHead>{t('publishing.fields.locale')}</TableHead>\n <TableHead>{t('publishing.fields.action')}</TableHead>\n <TableHead>{t('publishing.fields.runAt')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n <TableHead>{t('publishing.fields.error')}</TableHead>\n <TableHead>\n <span className=\"sr-only\">{t('common.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {schedules.map((schedule) => {\n const status = SCHEDULE_STATUS_DISPLAY[schedule.status];\n return (\n <TableRow key={schedule.id}>\n <TableCell className=\"max-w-44\">\n <RowTitle className=\"block truncate font-mono text-xs\">\n <span title={schedule.entryId}>{schedule.entryId}</span>\n </RowTitle>\n </TableCell>\n <TableCell className=\"font-mono text-xs\">\n {schedule.modelKey ?? t('publishing.fields.deletedModel')}\n </TableCell>\n <TableCell className=\"font-mono text-xs\">{schedule.locale}</TableCell>\n <TableCell>{t(PUBLICATION_ACTION_LABELS[schedule.action])}</TableCell>\n <TableCell className=\"whitespace-nowrap\">{formatDateTime(schedule.runAt)}</TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n </TableCell>\n <TableCell className=\"max-w-64 whitespace-normal\">\n {schedule.error ? (\n <span className=\"text-destructive\">{schedule.error}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('common.none')}</span>\n )}\n </TableCell>\n <TableCell className=\"text-right\">\n {schedule.status === 'scheduled' ? (\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.scheduled.cancelTitle')}\n description={t('publishing.scheduled.cancelDescription', { entryId: schedule.entryId })}\n confirmLabel={t('publishing.scheduled.cancel')}\n cancelLabel={t('publishing.scheduled.keep')}\n onConfirm={() => onCancel(schedule)}\n trigger={\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={t('publishing.scheduled.cancelLabel', { entryId: schedule.entryId })}\n >\n {t('publishing.scheduled.cancel')}\n </Button>\n }\n />\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </TableRoot>\n );\n};\n","import { SCHEDULE_STATUSES, type ScheduledPublication } from '@shapio/client';\nimport { CalendarClock, CalendarPlus } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useCancelSchedule, useSchedules } from '@/api/schedules';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { QueryView } from '@/components/QueryView';\nimport { TableCard } from '@/components/TableCard';\nimport { Button } from '@/components/ui/button';\nimport { PUBLISHING_PAGE_SIZE } from '@/constants/publishing';\nimport { Header } from '../Header';\nimport { SCHEDULE_STATUS_DISPLAY } from '../helpers/statusDisplay';\nimport { StatusFilter } from '../StatusFilter';\nimport { CreateSheet } from './CreateSheet';\nimport { useScheduledSearch } from './hooks/useScheduledSearch';\nimport { Table } from './Table';\n\n/** Every scheduled publish and unpublish, with its outcome once it has run. */\nexport const Scheduled = () => {\n const { t } = useTranslation();\n const { search, pagerProps, setStatus } = useScheduledSearch();\n const schedules = useSchedules({\n status: search.status,\n cursor: search.cursor,\n limit: PUBLISHING_PAGE_SIZE,\n });\n const cancel = useCancelSchedule();\n const [creating, setCreating] = useState(false);\n const cancelSchedule = (schedule: ScheduledPublication) =>\n cancel.mutateAsync(schedule.id, {\n onSuccess: () => toast.success(t('publishing.scheduled.cancelled')),\n });\n const statusOptions = SCHEDULE_STATUSES.map((status) => ({\n value: status,\n label: t(SCHEDULE_STATUS_DISPLAY[status].labelKey),\n }));\n const filters = (\n <div role=\"search\" className=\"flex flex-wrap items-center gap-2\">\n <StatusFilter\n id=\"scheduled-status\"\n label={t('publishing.fields.status')}\n value={search.status}\n options={statusOptions}\n onChange={setStatus}\n />\n </div>\n );\n return (\n <Page>\n <Header\n actions={\n <Button onClick={() => setCreating(true)}>\n <CalendarPlus aria-hidden=\"true\" />\n {t('publishing.scheduled.create')}\n </Button>\n }\n />\n <QueryView\n query={schedules}\n loadingRows={6}\n isEmpty={(data) => data.items.length === 0 && search.cursor === undefined && !search.status}\n empty={<EmptyState icon={CalendarClock} title={t('publishing.scheduled.empty')} />}\n >\n {(data) => (\n <TableCard toolbar={filters} footer={<CursorPager {...pagerProps(data.nextCursor)} />}>\n {data.items.length === 0 ? (\n <EmptyState icon={CalendarClock} size=\"panel\" title={t('publishing.scheduled.noMatches')} />\n ) : (\n <Table schedules={data.items} onCancel={cancelSchedule} />\n )}\n </TableCard>\n )}\n </QueryView>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCreated={() => {\n setCreating(false);\n toast.success(t('publishing.scheduled.created'));\n }}\n />\n </Page>\n );\n};\n","import type { WebhookEventType } from '@shapio/client';\n\nexport type EventGroup = { group: string; types: string[] };\n\n/** `content.*`: every event of a group, including ones added in later Shapio versions. */\nexport const groupPattern = (group: string) => `${group}.*`;\n\n/** The catalogue grouped for display, in the server's order. */\nexport const groupEvents = (events: readonly WebhookEventType[]): EventGroup[] => {\n const groups = new Map<string, string[]>();\n for (const { type, group } of events) {\n groups.set(group, [...(groups.get(group) ?? []), type]);\n }\n return [...groups].map(([group, types]) => ({ group, types }));\n};\n\n/** Selecting a whole group replaces its individual types with the pattern (the server would match both). */\nexport const toggleGroup = (selected: readonly string[], { group, types }: EventGroup, checked: boolean) => {\n const pattern = groupPattern(group);\n const others = selected.filter((value) => value !== pattern && !types.includes(value));\n return checked ? [...others, pattern] : others;\n};\n\nexport const toggleEvent = (selected: readonly string[], type: string, checked: boolean) =>\n checked\n ? [...selected.filter((value) => value !== type), type]\n : selected.filter((value) => value !== type);\n","import { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useWebhookEvents } from '@/api/webhooks';\nimport { ErrorState } from '@/components/ErrorState';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { InfoHint } from '@/components/InfoHint';\nimport { LoadingState } from '@/components/LoadingState';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldLabel, FieldLegend, FieldSet } from '@/components/ui/field';\nimport { groupEvents, groupPattern, toggleEvent, toggleGroup } from '../../helpers/webhookEvents';\nimport type { WebhookFormValues } from '../helpers';\n\ntype EventsFieldProps = { control: Control<WebhookFormValues> };\n\n/** The events a webhook receives, grouped; \"all <group> events\" subscribes to future ones too. */\nexport const EventsField = ({ control }: EventsFieldProps) => {\n const { t } = useTranslation();\n const catalogue = useWebhookEvents();\n const { field, fieldState } = useController({ control, name: 'events' });\n const selected = field.value;\n if (catalogue.isPending) {\n return <LoadingState rows={2} />;\n }\n if (catalogue.isError) {\n return <ErrorState error={catalogue.error} onRetry={() => void catalogue.refetch()} />;\n }\n return (\n <FieldSet data-invalid={fieldState.invalid || undefined} aria-labelledby=\"webhook-events-title\">\n <FieldLegend variant=\"label\" className=\"flex items-center gap-1\">\n <span id=\"webhook-events-title\">{t('publishing.webhooks.events')}</span>\n <InfoHint about={t('publishing.webhooks.events')}>{t('publishing.webhooks.eventsHint')}</InfoHint>\n </FieldLegend>\n <div className=\"space-y-4\">\n {groupEvents(catalogue.data).map((group) => {\n const groupSelected = selected.includes(groupPattern(group.group));\n const groupId = `webhook-events-${group.group}`;\n return (\n <fieldset key={group.group} className=\"space-y-2 rounded-lg border p-3\">\n <legend className=\"px-1 font-mono text-xs font-semibold\">{group.group}</legend>\n <Field orientation=\"horizontal\">\n <Checkbox\n id={groupId}\n checked={groupSelected}\n onCheckedChange={(checked) =>\n field.onChange(toggleGroup(selected, group, checked === true))\n }\n onBlur={field.onBlur}\n />\n <FieldLabel htmlFor={groupId} className=\"font-medium\">\n {t('publishing.webhooks.allGroupEvents', { group: group.group })}\n </FieldLabel>\n </Field>\n <div className=\"grid gap-2 pl-6 sm:grid-cols-2\">\n {group.types.map((type) => {\n const id = `webhook-event-${type}`;\n return (\n <Field key={type} orientation=\"horizontal\">\n <Checkbox\n id={id}\n checked={groupSelected || selected.includes(type)}\n disabled={groupSelected}\n onCheckedChange={(checked) =>\n field.onChange(toggleEvent(selected, type, checked === true))\n }\n onBlur={field.onBlur}\n />\n <FieldLabel htmlFor={id} className=\"font-mono text-xs font-normal\">\n {type}\n </FieldLabel>\n </Field>\n );\n })}\n </div>\n </fieldset>\n );\n })}\n </div>\n <FormFieldError message={fieldState.error?.message} />\n </FieldSet>\n );\n};\n","import type { CreateWebhookInput, Webhook } from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\nexport const MAX_ATTEMPTS_RANGE = { min: 1, max: 20 } as const;\n\nconst DEFAULT_MAX_ATTEMPTS = 8;\n\nconst inRange = (value: string) =>\n /^\\d+$/.test(value) && Number(value) >= MAX_ATTEMPTS_RANGE.min && Number(value) <= MAX_ATTEMPTS_RANGE.max;\n\nexport const webhookSchema = z.object({\n name: requiredText().max(200, 'validation.tooLong'),\n url: z\n .string()\n .trim()\n .min(1, 'validation.required')\n .pipe(z.url({ protocol: /^https?$/, error: 'validation.url' })),\n events: z.array(z.string()).min(1, 'validation.selectEvents'),\n enabled: z.boolean(),\n allowPrivateNetwork: z.boolean(),\n maxAttempts: z.string().trim().refine(inRange, 'validation.maxAttempts'),\n /** Chosen on create only (fixed afterwards): `site` this site's events, `network` every site's. */\n scope: z.enum(['site', 'network']),\n});\n\nexport type WebhookFormValues = z.infer<typeof webhookSchema>;\n\nexport const EMPTY_WEBHOOK: WebhookFormValues = {\n name: '',\n url: '',\n events: [],\n enabled: true,\n allowPrivateNetwork: false,\n maxAttempts: String(DEFAULT_MAX_ATTEMPTS),\n scope: 'site',\n};\n\nexport const toWebhookValues = (webhook: Webhook): WebhookFormValues => ({\n name: webhook.name,\n url: webhook.url,\n events: webhook.events,\n enabled: webhook.enabled,\n allowPrivateNetwork: webhook.allowPrivateNetwork,\n maxAttempts: String(webhook.maxAttempts),\n scope: webhook.site === null ? 'network' : 'site',\n});\n\nexport const toWebhookInput = (values: WebhookFormValues): CreateWebhookInput => ({\n name: values.name.trim(),\n url: values.url.trim(),\n events: values.events,\n enabled: values.enabled,\n allowPrivateNetwork: values.allowPrivateNetwork,\n maxAttempts: Number(values.maxAttempts),\n});\n","import type { Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { EventsField } from '../EventsField';\nimport { MAX_ATTEMPTS_RANGE, type WebhookFormValues } from '../helpers';\n\ntype FieldsProps = { control: Control<WebhookFormValues> };\n\n/** A webhook's settings, shared by the create sheet and the edit form. */\nexport const Fields = ({ control }: FieldsProps) => {\n const { t } = useTranslation();\n return (\n <>\n <FormTextField control={control} name=\"name\" label={t('publishing.webhooks.name')} autoComplete=\"off\" />\n <FormTextField\n control={control}\n name=\"url\"\n type=\"url\"\n label={t('publishing.webhooks.url')}\n placeholder={t('publishing.webhooks.urlPlaceholder')}\n autoComplete=\"off\"\n />\n <EventsField control={control} />\n <FormTextField\n control={control}\n name=\"maxAttempts\"\n type=\"number\"\n inputMode=\"numeric\"\n min={MAX_ATTEMPTS_RANGE.min}\n max={MAX_ATTEMPTS_RANGE.max}\n label={t('publishing.webhooks.maxAttempts')}\n hint={t('publishing.webhooks.maxAttemptsHint')}\n className=\"w-32\"\n />\n <FormSwitchField control={control} name=\"enabled\" label={t('publishing.webhooks.enabled')} />\n <FormSwitchField\n control={control}\n name=\"allowPrivateNetwork\"\n label={t('publishing.fields.allowPrivateNetwork')}\n hint={t('publishing.fields.allowPrivateNetworkHint')}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { WebhookWithSecret } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useCreateWebhook } from '@/api/webhooks';\nimport { settle } from '@/helpers/settle';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\nimport { EMPTY_WEBHOOK, toWebhookInput, webhookSchema, type WebhookFormValues } from '../helpers';\n\nexport const useCreateWebhookForm = (open: boolean, onCreated: (created: WebhookWithSecret) => void) => {\n const createWebhook = useCreateWebhook();\n const form = useForm<WebhookFormValues>({\n resolver: zodResolver(webhookSchema),\n defaultValues: EMPTY_WEBHOOK,\n });\n useResetOnOpen(open, form.reset, EMPTY_WEBHOOK, createWebhook.reset);\n const onSubmit = form.handleSubmit(async (values) => {\n const created = await settle(\n createWebhook.mutateAsync({ ...toWebhookInput(values), network: values.scope === 'network' }),\n );\n if (created.ok) {\n form.reset(EMPTY_WEBHOOK);\n onCreated(created.value);\n }\n });\n return { form, onSubmit, createWebhook };\n};\n","import type { WebhookWithSecret } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useMe } from '@/api/auth';\nimport { FormError } from '@/components/FormError';\nimport { FormRadioGroup } from '@/components/FormRadioGroup';\nimport { FormSheet } from '@/components/FormSheet';\nimport { canSeeNetwork } from '@/helpers/sites';\nimport { Fields } from '../Fields';\nimport { useCreateWebhookForm } from '../hooks/useCreateWebhookForm';\n\ntype CreateSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Lets the page keep focus on the secret it reveals when the sheet closes. */\n onCloseAutoFocus: (event: Event) => void;\n onCreated: (created: WebhookWithSecret) => void;\n};\n\nexport const CreateSheet = ({ open, onOpenChange, onCloseAutoFocus, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createWebhook } = useCreateWebhookForm(open, onCreated);\n const { data: me } = useMe();\n // A network webhook needs `webhooks.manage` on every site; `me` can't say that exactly, so it is offered to\n // network admins and the server's answer (403) is shown if it refuses.\n const scopeOptions = [\n { value: 'site', label: t('publishing.webhooks.scopeSite', { name: me?.site.name ?? '' }) },\n { value: 'network', label: t('sites.everySite'), description: t('publishing.webhooks.scopeNetwork') },\n ];\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n onCloseAutoFocus={onCloseAutoFocus}\n title={t('publishing.webhooks.createTitle')}\n dirty={form.formState.isDirty}\n pending={createWebhook.isPending}\n submitLabel={t('common.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <Fields control={form.control} />\n {canSeeNetwork(me) ? (\n <FormRadioGroup\n control={form.control}\n name=\"scope\"\n legend={t('publishing.webhooks.scope')}\n options={scopeOptions}\n />\n ) : null}\n <FormError error={createWebhook.error} />\n </FormSheet>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { SecretReveal } from '@/components/SecretReveal';\nimport { SignatureHelp } from '../../SignatureHelp';\n\ntype SigningSecretRevealProps = { secret: string; onDismiss: () => void };\n\n/** A webhook's signing secret, shown once at the top of the page after creating it or rotating it. */\nexport const SigningSecretReveal = ({ secret, onDismiss }: SigningSecretRevealProps) => {\n const { t } = useTranslation();\n return (\n <SecretReveal\n title={t('publishing.webhooks.secretTitle')}\n description={t('publishing.webhooks.secretDescription')}\n label={t('publishing.webhooks.secretLabel')}\n secret={secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={onDismiss}\n hint={<SignatureHelp description={t('publishing.webhooks.signatureDescription')} />}\n />\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '@/components/ui/badge';\n\ntype SiteBadgeProps = { webhook: Pick<Webhook, 'site'> };\n\n/** \"Every site\" on a network webhook (it receives every site's events); nothing on this site's own. */\nexport const SiteBadge = ({ webhook }: SiteBadgeProps) => {\n const { t } = useTranslation();\n return webhook.site === null ? <Badge variant=\"secondary\">{t('sites.everySite')}</Badge> : null;\n};\n","import type { Webhook } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { TableCard } from '@/components/TableCard';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { EnabledChip } from '../../EnabledChip';\nimport { DELIVERY_STATUS_DISPLAY } from '../../helpers/statusDisplay';\nimport { SiteBadge } from '../SiteBadge';\n\ntype TableProps = { webhooks: Webhook[] };\n\nexport const Table = ({ webhooks }: TableProps) => {\n const { t } = useTranslation();\n return (\n <TableCard>\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.webhooks.name')}</TableHead>\n <TableHead>{t('publishing.webhooks.url')}</TableHead>\n <TableHead>{t('publishing.webhooks.state')}</TableHead>\n <TableHead>{t('publishing.webhooks.lastDelivery')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {webhooks.map((webhook) => {\n const last = webhook.lastDelivery\n ? DELIVERY_STATUS_DISPLAY[webhook.lastDelivery.status]\n : undefined;\n return (\n <TableRow key={webhook.id}>\n <TableCell className=\"max-w-64\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <RowTitle asChild className=\"block truncate\">\n <Link to=\"/publishing/webhooks/$webhookId\" params={{ webhookId: webhook.id }}>\n {webhook.name}\n </Link>\n </RowTitle>\n <SiteBadge webhook={webhook} />\n </span>\n </TableCell>\n <TableCell className=\"max-w-72\">\n <span\n className=\"block truncate font-mono text-xs text-muted-foreground\"\n title={webhook.url}\n >\n {webhook.url}\n </span>\n </TableCell>\n <TableCell>\n <EnabledChip enabled={webhook.enabled} />\n </TableCell>\n <TableCell>\n {webhook.lastDelivery && last ? (\n <span className=\"flex flex-wrap items-center gap-2\">\n <StatusChip tone={last.tone} label={t(last.labelKey)} />\n <span\n className=\"text-meta whitespace-nowrap text-muted-foreground\"\n title={formatDateTime(webhook.lastDelivery.at)}\n >\n {formatRelativeTime(webhook.lastDelivery.at)}\n </span>\n </span>\n ) : (\n <span className=\"text-muted-foreground\">{t('common.never')}</span>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </TableRoot>\n </TableCard>\n );\n};\n","import { useNavigate } from '@tanstack/react-router';\nimport { Plus, Webhook as WebhookIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useWebhooks } from '@/api/webhooks';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { QueryView } from '@/components/QueryView';\nimport { Button } from '@/components/ui/button';\nimport { Header } from '../Header';\nimport { useSecretReveal } from '../hooks/useSecretReveal';\nimport { CreateSheet } from './CreateSheet';\nimport { SigningSecretReveal } from './SigningSecretReveal';\nimport { Table } from './Table';\n\n/** Outgoing webhooks: signed HTTP notifications of content, change set and deployment events. */\nexport const Webhooks = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const webhooks = useWebhooks();\n const [creating, setCreating] = useState(false);\n // The new webhook's secret is shown here, then the webhook opens.\n const secret = useSecretReveal(\n (webhookId) => void navigate({ to: '/publishing/webhooks/$webhookId', params: { webhookId } }),\n );\n return (\n <Page>\n <Header\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus aria-hidden=\"true\" />\n {t('publishing.webhooks.create')}\n </Button>\n }\n />\n {secret.revealed ? (\n <SigningSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n <QueryView\n query={webhooks}\n isEmpty={(data) => data.length === 0}\n empty={<EmptyState icon={WebhookIcon} title={t('publishing.webhooks.empty')} />}\n >\n {(data) => <Table webhooks={data} />}\n </QueryView>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCloseAutoFocus={secret.keepFocusOnReveal}\n onCreated={({ webhook, secret: signingSecret }) => {\n setCreating(false);\n secret.reveal({ id: webhook.id, secret: signingSecret });\n }}\n />\n </Page>\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useDeleteWebhook, useRotateWebhookSecret, useTestWebhook, useUpdateWebhook } from '@/api/webhooks';\n\n/**\n * Send test, enable/disable, rotate the secret (shown once) and delete, each with its notification. Rotate\n * and delete return their promise, so their inline confirmation stays open until the request settles.\n */\nexport const useWebhookActions = (webhook: Webhook, onConflict: (error: unknown) => void) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const test = useTestWebhook();\n const update = useUpdateWebhook();\n const rotate = useRotateWebhookSecret();\n const remove = useDeleteWebhook();\n const [secret, setSecret] = useState<string | undefined>(undefined);\n return {\n secret,\n clearSecret: () => setSecret(undefined),\n testing: test.isPending,\n pending: update.isPending || rotate.isPending || remove.isPending,\n sendTest: () =>\n test.mutate(webhook.id, { onSuccess: () => toast.success(t('publishing.webhooks.testQueued')) }),\n toggleEnabled: () =>\n update.mutate(\n { id: webhook.id, input: { enabled: !webhook.enabled, expectedVersion: webhook.version } },\n {\n onSuccess: (saved) =>\n toast.success(\n saved.enabled ? t('publishing.webhooks.enabledToast') : t('publishing.webhooks.disabledToast'),\n ),\n onError: onConflict,\n },\n ),\n rotateSecret: () => rotate.mutateAsync(webhook.id, { onSuccess: (rotated) => setSecret(rotated.secret) }),\n remove: () =>\n remove.mutateAsync(webhook.id, {\n onSuccess: () => {\n toast.success(t('publishing.webhooks.deleted', { name: webhook.name }));\n void navigate({ to: '/publishing/webhooks' });\n },\n }),\n };\n};\n","type HeaderListProps = { headers: Record<string, string>; label: string };\n\n/** HTTP headers as name: value lines. */\nexport const HeaderList = ({ headers, label }: HeaderListProps) => (\n <dl aria-label={label} className=\"space-y-0.5 rounded-md border bg-muted p-2 font-mono text-xs break-all\">\n {Object.entries(headers).map(([name, value]) => (\n <div key={name}>\n <dt className=\"inline font-semibold\">{name}</dt>\n <dd className=\"inline before:content-[':_']\">{value}</dd>\n </div>\n ))}\n </dl>\n);\n","import { StatusChip, type StatusTone } from '@/components/StatusChip';\n\ntype ResponseCodeProps = { status: number; label?: string };\n\nconst SUCCESS_MIN = 200;\nconst REDIRECT_MIN = 300;\nconst CLIENT_ERROR_MIN = 400;\n\nconst toneOf = (status: number): StatusTone =>\n status >= SUCCESS_MIN && status < REDIRECT_MIN\n ? 'success'\n : status < CLIENT_ERROR_MIN\n ? 'warning'\n : 'danger';\n\n/** An HTTP response code as a chip: 2xx green, 3xx amber, 4xx and 5xx red. */\nexport const ResponseCode = ({ status, label }: ResponseCodeProps) => (\n <StatusChip tone={toneOf(status)} label={label ?? String(status)} size=\"sm\" className=\"font-mono\" />\n);\n","import type { WebhookAttempt } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { JsonBlock } from '../../../JsonBlock';\nimport { HeaderList } from '../HeaderList';\nimport { ResponseCode } from '../ResponseCode';\n\ntype AttemptProps = { attempt: WebhookAttempt };\n\n/** One delivery attempt: the request sent and the response (or why none arrived). */\nexport const Attempt = ({ attempt }: AttemptProps) => {\n const { t } = useTranslation();\n const { request, response } = attempt;\n return (\n <li className=\"space-y-3 rounded-lg border bg-card p-4\">\n <p className=\"text-sm font-medium\">\n {t('publishing.webhooks.attemptHeading', {\n attempt: attempt.attempt,\n at: formatDateTime(attempt.at),\n duration: attempt.durationMs,\n })}\n </p>\n <div className=\"grid gap-3 lg:grid-cols-2\">\n <section className=\"min-w-0 space-y-1\">\n <h4 className=\"text-xs font-semibold text-muted-foreground\">{t('publishing.webhooks.request')}</h4>\n <p className=\"font-mono text-xs break-all\">{`${request.method} ${request.url}`}</p>\n <HeaderList headers={request.headers} label={t('publishing.webhooks.requestHeaders')} />\n </section>\n <section className=\"min-w-0 space-y-1\">\n <h4 className=\"text-xs font-semibold text-muted-foreground\">{t('publishing.webhooks.response')}</h4>\n {response ? (\n <>\n <ResponseCode\n status={response.status}\n label={t('publishing.webhooks.httpStatus', { status: response.status })}\n />\n <JsonBlock\n value={response.body}\n label={t('publishing.webhooks.responseBody')}\n className=\"max-h-40\"\n />\n {response.truncated ? (\n <p className=\"text-xs text-muted-foreground\">{t('publishing.webhooks.bodyTruncated')}</p>\n ) : null}\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('publishing.webhooks.noResponse')}</p>\n )}\n {attempt.error ? <p className=\"text-sm text-destructive\">{attempt.error}</p> : null}\n </section>\n </div>\n </li>\n );\n};\n","import type { WebhookDelivery } from '@shapio/client';\nimport { ChevronDown, ChevronRight, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { TableCell, TableRow } from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { DELIVERY_STATUS_DISPLAY } from '../../../helpers/statusDisplay';\nimport { Attempt } from '../Attempt';\nimport { ResponseCode } from '../ResponseCode';\n\ntype DeliveryProps = {\n delivery: WebhookDelivery;\n expanded: boolean;\n onToggle: () => void;\n onRedeliver: () => void;\n redelivering: boolean;\n};\n\nconst DELIVERY_COLUMNS = 7;\n\n/** A delivery row and, when expanded, its attempt log. */\nexport const Delivery = ({ delivery, expanded, onToggle, onRedeliver, redelivering }: DeliveryProps) => {\n const { t } = useTranslation();\n const status = DELIVERY_STATUS_DISPLAY[delivery.status];\n const detailsId = `delivery-${delivery.id}`;\n return (\n <>\n <TableRow>\n <TableCell className=\"w-10\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-expanded={expanded}\n aria-controls={expanded ? detailsId : undefined}\n aria-label={t('publishing.webhooks.toggleAttempts', { event: delivery.eventType })}\n onClick={onToggle}\n >\n {expanded ? <ChevronDown aria-hidden=\"true\" /> : <ChevronRight aria-hidden=\"true\" />}\n </Button>\n </TableCell>\n <TableCell>\n <span className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs font-semibold\">{delivery.eventType}</span>\n {delivery.isTest ? <Badge variant=\"outline\">{t('publishing.webhooks.testBadge')}</Badge> : null}\n </span>\n </TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n </TableCell>\n <TableCell>\n {delivery.lastResponseStatus === null ? (\n <span className=\"text-muted-foreground\">{t('common.none')}</span>\n ) : (\n <ResponseCode status={delivery.lastResponseStatus} />\n )}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">{delivery.attempts}</TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(delivery.createdAt)}>\n {formatRelativeTime(delivery.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={redelivering}\n aria-label={t('publishing.webhooks.redeliverLabel', { event: delivery.eventType })}\n onClick={onRedeliver}\n >\n <RotateCcw aria-hidden=\"true\" />\n {t('publishing.webhooks.redeliver')}\n </Button>\n </TableCell>\n </TableRow>\n {expanded ? (\n <TableRow className=\"hover:bg-transparent\">\n <TableCell colSpan={DELIVERY_COLUMNS} className=\"bg-muted/40 whitespace-normal\">\n <div id={detailsId} className=\"space-y-3 py-2\">\n {delivery.lastError ? (\n <p className=\"text-meta text-destructive\">\n {t('publishing.webhooks.lastErrorValue', { error: delivery.lastError })}\n </p>\n ) : null}\n {delivery.attemptLog.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{t('publishing.webhooks.noAttempts')}</p>\n ) : (\n <ol className=\"space-y-3\">\n {delivery.attemptLog.map((attempt) => (\n <Attempt key={attempt.attempt} attempt={attempt} />\n ))}\n </ol>\n )}\n </div>\n </TableCell>\n </TableRow>\n ) : null}\n </>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport { Inbox } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useRedeliverWebhook, useWebhookDeliveries } from '@/api/webhooks';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Panel } from '@/components/Panel';\nimport { QueryView } from '@/components/QueryView';\nimport { Table, TableBody, TableHead, TableHeader, TableRow } from '@/components/ui/table';\nimport { useCursorPager } from '../../../hooks/useCursorPager';\nimport { Delivery } from '../Delivery';\n\ntype DeliveriesProps = { webhookId: string };\n\n/** The delivery log, newest first, polled while deliveries are still being attempted. */\nexport const Deliveries = ({ webhookId }: DeliveriesProps) => {\n const { t } = useTranslation();\n const { cursor } = useSearch({ from: '/app/publishing/webhooks/$webhookId' });\n const navigate = useNavigate({ from: '/publishing/webhooks/$webhookId' });\n const { pagerProps } = useCursorPager(cursor, (next) => void navigate({ search: { cursor: next } }));\n const deliveries = useWebhookDeliveries(webhookId, cursor);\n const redeliver = useRedeliverWebhook();\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(new Set());\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (!next.delete(id)) {\n next.add(id);\n }\n return next;\n });\n return (\n <Panel title={t('publishing.webhooks.deliveries')} flush>\n <QueryView\n query={deliveries}\n isEmpty={(data) => data.items.length === 0 && cursor === undefined}\n empty={<EmptyState icon={Inbox} size=\"panel\" title={t('publishing.webhooks.noDeliveries')} />}\n >\n {(data) => (\n <>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-12\">\n <span className=\"sr-only\">{t('publishing.webhooks.attemptLog')}</span>\n </TableHead>\n <TableHead>{t('publishing.webhooks.eventType')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n <TableHead>{t('publishing.webhooks.lastResponse')}</TableHead>\n <TableHead className=\"text-right\">{t('publishing.webhooks.attempts')}</TableHead>\n <TableHead>{t('publishing.fields.created')}</TableHead>\n <TableHead>\n <span className=\"sr-only\">{t('common.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.items.map((delivery) => (\n <Delivery\n key={delivery.id}\n delivery={delivery}\n expanded={expanded.has(delivery.id)}\n onToggle={() => toggle(delivery.id)}\n redelivering={redeliver.isPending}\n onRedeliver={() =>\n redeliver.mutate(\n { id: webhookId, deliveryId: delivery.id },\n { onSuccess: () => toast.success(t('publishing.webhooks.redelivered')) },\n )\n }\n />\n ))}\n </TableBody>\n </Table>\n <CursorPager {...pagerProps(data.nextCursor)} className=\"border-t px-4 py-2.5\" />\n </>\n )}\n </QueryView>\n </Panel>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { Webhook } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { isConflict } from '@/api/errors';\nimport { useUpdateWebhook } from '@/api/webhooks';\nimport { settle } from '@/helpers/settle';\nimport { toWebhookInput, toWebhookValues, webhookSchema, type WebhookFormValues } from '../helpers';\n\n/**\n * Edits one version of a webhook (the form is re-created when the version changes). Saves send the\n * version they started from; a 409 goes to `onConflict`.\n */\nexport const useEditWebhookForm = (\n webhook: Webhook,\n onSaved: () => void,\n onConflict: (error: unknown) => void,\n) => {\n const { t } = useTranslation();\n const update = useUpdateWebhook();\n const form = useForm<WebhookFormValues>({\n resolver: zodResolver(webhookSchema),\n defaultValues: toWebhookValues(webhook),\n });\n const onSubmit = form.handleSubmit(async (values) => {\n const saved = await settle(\n update.mutateAsync(\n { id: webhook.id, input: { ...toWebhookInput(values), expectedVersion: webhook.version } },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.webhooks.saved'));\n onSaved();\n }\n });\n return { form, onSubmit, update, error: isConflict(update.error) ? undefined : update.error };\n};\n","import type { Webhook } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { Fields } from '../../Fields';\nimport { useEditWebhookForm } from '../../hooks/useEditWebhookForm';\n\ntype EditFormProps = { webhook: Webhook; onSaved: () => void; onConflict: (error: unknown) => void };\n\nexport const EditForm = ({ webhook, onSaved, onConflict }: EditFormProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, update, error } = useEditWebhookForm(webhook, onSaved, onConflict);\n return (\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <UnsavedChangesGuard when={form.formState.isDirty && !update.isPending} />\n <FieldGroup>\n <Fields control={form.control} />\n <FormError error={error} />\n <div>\n <SubmitButton pending={update.isPending} pendingLabel={t('common.saving')}>\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { linkOptions } from '@tanstack/react-router';\nimport { KeyRound, Power, Send, Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { EnabledChip } from '../../../EnabledChip';\nimport { useConflictReload } from '../../../hooks/useConflictReload';\nimport { SignatureHelp } from '../../../SignatureHelp';\nimport { useWebhookActions } from '../../hooks/useWebhookActions';\nimport { SigningSecretReveal } from '../../SigningSecretReveal';\nimport { SiteBadge } from '../../SiteBadge';\nimport { Deliveries } from '../Deliveries';\nimport { EditForm } from '../EditForm';\n\ntype ViewProps = { webhook: Webhook };\n\n/** A loaded webhook: actions, the delivery log, its settings and how receivers verify requests. */\nexport const View = ({ webhook }: ViewProps) => {\n const { t } = useTranslation();\n const conflict = useConflictReload(queryKeys.publishing.webhooks.webhook(webhook.id));\n const actions = useWebhookActions(webhook, conflict.onSaveError);\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.webhooks'), link: linkOptions({ to: '/publishing/webhooks' }) },\n ]}\n title={webhook.name}\n badge={\n <span className=\"flex items-center gap-2\">\n <EnabledChip enabled={webhook.enabled} />\n <SiteBadge webhook={webhook} />\n </span>\n }\n meta={<span className=\"font-mono text-xs break-all\">{webhook.url}</span>}\n actions={\n <>\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.webhooks.deleteTitle', { name: webhook.name })}\n description={t('publishing.webhooks.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={actions.remove}\n trigger={\n <Button variant=\"destructive-ghost\" disabled={actions.pending}>\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </Button>\n }\n />\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.webhooks.rotateTitle')}\n description={t('publishing.webhooks.rotateDescription')}\n confirmLabel={t('publishing.webhooks.rotateSecret')}\n onConfirm={actions.rotateSecret}\n // The new secret's reveal takes focus (its Copy button); don't pull it back to this button.\n onCloseAutoFocus={(event) => {\n if (actions.secret) {\n event.preventDefault();\n }\n }}\n trigger={\n <Button variant=\"outline\" disabled={actions.pending}>\n <KeyRound aria-hidden=\"true\" />\n {t('publishing.webhooks.rotateSecret')}\n </Button>\n }\n />\n <Button variant=\"outline\" disabled={actions.pending} onClick={actions.toggleEnabled}>\n <Power aria-hidden=\"true\" />\n {webhook.enabled ? t('publishing.webhooks.disable') : t('publishing.webhooks.enable')}\n </Button>\n <Button disabled={actions.testing || !webhook.enabled} onClick={actions.sendTest}>\n <Send aria-hidden=\"true\" />\n {t('publishing.webhooks.sendTest')}\n </Button>\n </>\n }\n />\n {actions.secret ? (\n <SigningSecretReveal secret={actions.secret} onDismiss={actions.clearSecret} />\n ) : null}\n {conflict.conflicted ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{t('publishing.conflictReloaded')}</AlertDescription>\n </Alert>\n ) : null}\n <Deliveries webhookId={webhook.id} />\n <Panel title={t('publishing.webhooks.settings')}>\n <EditForm\n key={webhook.version}\n webhook={webhook}\n onSaved={conflict.clearConflict}\n onConflict={conflict.onSaveError}\n />\n </Panel>\n <Panel title={t('publishing.webhooks.signatureTitle')}>\n <SignatureHelp description={t('publishing.webhooks.signatureDescription')} />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useWebhook } from '@/api/webhooks';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One webhook: send a test, its delivery log, settings, secret rotation and deletion. */\nexport const Detail = () => {\n const { webhookId } = useParams({ from: '/app/publishing/webhooks/$webhookId' });\n const webhook = useWebhook(webhookId);\n return (\n <QueryView query={webhook} loadingRows={6}>\n {(data) => <View webhook={data} />}\n </QueryView>\n );\n};\n","import { createLazyRoute } from '@tanstack/react-router';\nimport { Publishing } from '@/features/Publishing';\nimport { Deployments } from '@/features/Publishing/Deployments';\nimport { Connection } from '@/features/Publishing/Deployments/Connection';\nimport { Run } from '@/features/Publishing/Deployments/Run';\nimport { Scheduled } from '@/features/Publishing/Scheduled';\nimport { Webhooks } from '@/features/Publishing/Webhooks';\nimport { Detail as WebhookDetail } from '@/features/Publishing/Webhooks/Detail';\n\n/** Every publishing screen, loaded together on the first visit to Publishing. */\nexport const publishingLazyRoutes = {\n publishing: createLazyRoute('/app/publishing')({ component: Publishing }),\n scheduled: createLazyRoute('/app/publishing/scheduled')({ component: Scheduled }),\n deployments: createLazyRoute('/app/publishing/deployments')({ component: Deployments }),\n connection: createLazyRoute('/app/publishing/deployments/$connectionId')({ component: Connection }),\n run: createLazyRoute('/app/publishing/deployments/runs/$runId')({ component: Run }),\n webhooks: createLazyRoute('/app/publishing/webhooks')({ component: Webhooks }),\n webhook: createLazyRoute('/app/publishing/webhooks/$webhookId')({ component: WebhookDetail }),\n};\n"],"ignoreList":[0,1,2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"publishing-DdmWXRaM.js","names":["__iconData","__iconData","useState","useEffectEvent","z.url","z.string","z.object","z.enum","z.array","z.boolean","useMemo","useState","_Fragment","_Fragment","zodResolver","CreateSheet","TableRoot","_Fragment","useState","CreateSheet","useState","zodResolver","EditForm","CheckCircle2","XCircle","View","_Fragment","Trash2","Loader2","EditForm","View","View","AlertCircle","View","z.string","z.enum","_Fragment","z.object","useMemo","zodResolver","CreateSheet","Table","TableRoot","useState","Table","CreateSheet","z.object","z.string","z.url","z.array","z.boolean","z.enum","_Fragment","zodResolver","TableRoot","useState","WebhookIcon","useState","_Fragment","_Fragment","useState","_Fragment","Table","zodResolver","_Fragment","Trash2","WebhookDetail","__toESM","require_jsx_runtime","queryKeys","LoaderCircle","useQueryClient","useNavigate","Link","isConflict","useMe","linkOptions","SubmitButton","Page","PageHeader","useParams","StatusChip","EmptyState","ErrorState","Badge","LoadingState","Outlet","useTranslation","createLucideIcon","formatRelativeTime","formatDateTime","useSearch","RowTitle","createLazyRoute","UnsavedChangesGuard","SCHEDULE_STATUSES","PUBLICATION_ACTIONS","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","FormCheckboxGroup","toast","Info","InfoHint","CalendarClock","Button","Input","ChevronRight","SelectValue","SelectTrigger","SelectContent","SelectItem","ChevronDown","Select","CursorPager","FormError","AlertTitle","Checkbox","CircleAlert","Alert","AlertDescription","InlineConfirm","CircleCheck","CircleX","Trash","FieldGroup","FieldSet","FieldLabel","FieldDescription","FieldLegend","Field","Inbox","KeyRound","Plus","useRetryDeploymentRun","useResetOnOpen","useUpdateDeploymentConnection","useDeploymentRuns","useTriggerDeployment","useCreateDeploymentConnection","useRotateWebhookSecret","useDeploymentConnections","useWebhook","useWebhooks","PROVIDER_LABELS","TRIGGER_POLICY_LABELS","TIMELINE_SOURCE_LABELS","useRedeliverWebhook","useWebhookDeliveries","RUN_TRIGGER_LABELS","useCreateWebhook","useTestWebhook","PUBLICATION_ACTION_LABELS","useDeleteWebhook","useUpdateWebhook","useCursorPager","useWebhookEvents","useDeleteDeploymentConnection","useTestDeploymentConnection","useDeploymentRun","useDeploymentConnection","RotateCcw","Send","permittedSections","Webhook","cn","useController","useWatch","FormTextField","requiredText","FormFieldError","u","useForm","describedBy","settle","TableHeader","url","boolean","object","TableHead","_enum","TableBody","TableRow","TableCell","TableCard","Table$2","array","string","HintedLabel","TextLink","canSeeNetwork","useDefinitions","QueryView","FormRadioGroup","useLocales","Panel","ACTIVE_RUN_STATUSES","useCreateSchedule","useSchedules","useCancelSchedule","dateTimeLocalToIso","defaultScheduleValue","dateTimeLocalField","ExternalLink","CopyButton","FormSwitchField","FormSheet","FormSelectField","useRoles","SecretReveal","LinkTabs","__iconData$2","CalendarPlus","__iconData$1","PlugZap","__iconData","Power","import_jsx_runtime","Publishing","import_react","require_react","usePublishingPermissions","permissions","Header","section","useSecretReveal","revealed","setRevealed","dismissedId","setDismissedId","afterDismiss","onDismissed","id","event","DetailList","className","items","item","EnabledChip","enabled","canDeployConnection","secretsUnreadable","useConnectionActions","navigate","test","trigger","remove","connection","run","SCHEDULE_STATUS_DISPLAY","DELIVERY_STATUS_DISPLAY","RUN_DISPLAY","runDisplay","RunStatus","display","t","SecretsUnreadableChip","unreadable","ConnectionCard","actions","canTriggerDeployments","Rocket","GITHUB_MODES","NO_DELIVERY_ROLE","SETTING_NAMES","SECRET_NAMES","OPTIONAL_SETTINGS","PROVIDER_FIELDS","providerSettingNames","provider","triggerOptionsFor","isWholeNumber","value","isHttpUrl","settingsShape","name","secretsShape","connectionSchema","fields","values","context","mode","secret","emptyRecord","names","EMPTY_CONNECTION","toConnectionValues","commonInput","secrets","toCreateConnectionInput","regenerableSecrets","requiredOnCreate","toUpdateConnectionInput","typed","rest","regenerable","useDeliveryRoleOptions","roles","role","SETTING_LABELS","SETTING_HINTS","SECRET_LABELS","SECRET_HINTS","PROVIDER_SECRET_HINTS","secretHintFor","GITHUB_MODE_LABELS","SecretField","replacing","setReplacing","hintId","errorId","fieldState","helperId","helper","fullHint","hint","stored","envVar","field","ProviderFields","storedSecrets","ConnectionForm","deliveryRoleOptions","createSchema","useCreateConnectionForm","createConnection","form","open","created","onCreated","CreateSheet$2","onSubmit","GeneratedSecretReveal","Runs","showConnection","runs","RunsList","cursor","onCursorChange","data","connectionId","pagerProps","Deployments","connections","creating","setCreating","openConnection","canManageDeployments","next","generated","generatedSecrets","useConflictReload","queryClient","conflicted","setConflicted","error","JsonBlock","label","SIGNATURE_HEADERS","SignatureHelp","description","header","CALLBACK_EXAMPLE","CallbackHelp","callbackUrl","editSchema","useEditConnectionForm","update","saved","onConflict","onSaved","EditForm$1","TestResult","result","check","stayOnPage","View$2","conflict","busy","snapshot","meta","Connection","safeExternalUrl","Timeline","index","View$1","retry","none","logUrl","siteUrl","active","details","Run","runId","ALL","StatusFilter","labelId","onChange","options","option","allLabel","DEFAULT_LOCALE","entryTargetShape","EMPTY_ENTRY_TARGET","toEntryTarget","entryId","locale","useEntryTargetOptions","models","locales","definition","action","EntryTargetFields","path","modelOptions","localeOptions","actionOptions","createScheduleSchema","useCreateScheduleForm","createSchedule","defaults","target","iso","runAt","CreateSheet$1","useScheduledSearch","search","go","previous","changes","resetPager","Table$1","schedules","status","schedule","onCancel","Scheduled","cancel","cancelSchedule","statusOptions","filters","setStatus","groupPattern","group","groupEvents","groups","events","type","types","toggleGroup","pattern","others","selected","checked","toggleEvent","EventsField","catalogue","groupSelected","groupId","MAX_ATTEMPTS_RANGE","DEFAULT_MAX_ATTEMPTS","webhookSchema","EMPTY_WEBHOOK","toWebhookValues","webhook","toWebhookInput","Fields","useCreateWebhookForm","createWebhook","CreateSheet","me","scopeOptions","SigningSecretReveal","SiteBadge","Table","webhooks","last","Webhooks","signingSecret","useWebhookActions","rotate","setSecret","rotated","HeaderList","headers","SUCCESS_MIN","REDIRECT_MIN","CLIENT_ERROR_MIN","toneOf","ResponseCode","Attempt","attempt","request","response","DELIVERY_COLUMNS","Delivery","delivery","detailsId","expanded","onToggle","redelivering","onRedeliver","Deliveries","deliveries","webhookId","redeliver","setExpanded","toggle","current","useEditWebhookForm","EditForm","View","publishingLazyRoutes"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/calendar-plus.mjs","../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/plug-zap.mjs","../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/power.mjs","../../src/features/Publishing/index.tsx","../../src/features/Publishing/hooks/usePublishingPermissions.ts","../../src/features/Publishing/Header/index.tsx","../../src/features/Publishing/hooks/useSecretReveal.ts","../../src/features/Publishing/DetailList/index.tsx","../../src/features/Publishing/EnabledChip/index.tsx","../../src/features/Publishing/Deployments/helpers/connectionState.ts","../../src/features/Publishing/Deployments/hooks/useConnectionActions.ts","../../src/features/Publishing/helpers/statusDisplay.ts","../../src/features/Publishing/Deployments/RunStatus/index.tsx","../../src/features/Publishing/Deployments/SecretsUnreadableChip/index.tsx","../../src/features/Publishing/Deployments/ConnectionCard/index.tsx","../../src/features/Publishing/Deployments/helpers/connectionForm.ts","../../src/features/Publishing/Deployments/hooks/useDeliveryRoleOptions.ts","../../src/features/Publishing/Deployments/helpers/labels.ts","../../src/features/Publishing/Deployments/SecretField/index.tsx","../../src/features/Publishing/Deployments/ProviderFields/index.tsx","../../src/features/Publishing/Deployments/ConnectionForm/index.tsx","../../src/features/Publishing/Deployments/hooks/useCreateConnectionForm.ts","../../src/features/Publishing/Deployments/CreateSheet/index.tsx","../../src/features/Publishing/Deployments/GeneratedSecretReveal/index.tsx","../../src/features/Publishing/Deployments/Runs/index.tsx","../../src/features/Publishing/Deployments/RunsList/index.tsx","../../src/features/Publishing/Deployments/index.tsx","../../src/features/Publishing/hooks/useConflictReload.ts","../../src/features/Publishing/JsonBlock/index.tsx","../../src/features/Publishing/SignatureHelp/index.tsx","../../src/features/Publishing/Deployments/CallbackHelp/index.tsx","../../src/features/Publishing/Deployments/hooks/useEditConnectionForm.ts","../../src/features/Publishing/Deployments/Connection/EditForm/index.tsx","../../src/features/Publishing/Deployments/Connection/TestResult/index.tsx","../../src/features/Publishing/Deployments/Connection/View/index.tsx","../../src/features/Publishing/Deployments/Connection/index.tsx","../../src/features/Publishing/helpers/safeExternalUrl.ts","../../src/features/Publishing/Deployments/Run/Timeline/index.tsx","../../src/features/Publishing/Deployments/Run/View/index.tsx","../../src/features/Publishing/Deployments/Run/index.tsx","../../src/features/Publishing/StatusFilter/index.tsx","../../src/features/Publishing/helpers/entryTarget.ts","../../src/features/Publishing/hooks/useEntryTargetOptions.ts","../../src/features/Publishing/EntryTargetFields/index.tsx","../../src/features/Publishing/Scheduled/hooks/useCreateScheduleForm.ts","../../src/features/Publishing/Scheduled/CreateSheet/index.tsx","../../src/features/Publishing/Scheduled/hooks/useScheduledSearch.ts","../../src/features/Publishing/Scheduled/Table/index.tsx","../../src/features/Publishing/Scheduled/index.tsx","../../src/features/Publishing/helpers/webhookEvents.ts","../../src/features/Publishing/Webhooks/EventsField/index.tsx","../../src/features/Publishing/Webhooks/helpers.ts","../../src/features/Publishing/Webhooks/Fields/index.tsx","../../src/features/Publishing/Webhooks/hooks/useCreateWebhookForm.ts","../../src/features/Publishing/Webhooks/CreateSheet/index.tsx","../../src/features/Publishing/Webhooks/SigningSecretReveal/index.tsx","../../src/features/Publishing/Webhooks/SiteBadge/index.tsx","../../src/features/Publishing/Webhooks/Table/index.tsx","../../src/features/Publishing/Webhooks/index.tsx","../../src/features/Publishing/Webhooks/hooks/useWebhookActions.ts","../../src/features/Publishing/Webhooks/Detail/HeaderList/index.tsx","../../src/features/Publishing/Webhooks/Detail/ResponseCode/index.tsx","../../src/features/Publishing/Webhooks/Detail/Attempt/index.tsx","../../src/features/Publishing/Webhooks/Detail/Delivery/index.tsx","../../src/features/Publishing/Webhooks/Detail/Deliveries/index.tsx","../../src/features/Publishing/Webhooks/hooks/useEditWebhookForm.ts","../../src/features/Publishing/Webhooks/Detail/EditForm/index.tsx","../../src/features/Publishing/Webhooks/Detail/View/index.tsx","../../src/features/Publishing/Webhooks/Detail/index.tsx","../../src/app/lazyRoutes/publishing.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"calendar-plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M16 18h6\", key: \"987eiv\" }],\n [\"path\", { d: \"M16 2v3\", key: \"otl347\" }],\n [\"path\", { d: \"M19 15v6\", key: \"10aioa\" }],\n [\"path\", { d: \"M21 11.5V5a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h8.3\", key: \"jgwkxf\" }],\n [\"path\", { d: \"M3 9h18\", key: \"1pudct\" }],\n [\"path\", { d: \"M8 2v3\", key: \"1ioesn\" }]\n ]\n};\n__iconData.node;\nconst CalendarPlus = createLucideIcon(__iconData);\n\nexport { __iconData, CalendarPlus as default };\n//# sourceMappingURL=calendar-plus.mjs.map\n","/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"plug-zap\",\n size: 24,\n node: [\n [\n \"path\",\n { d: \"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\", key: \"goz73y\" }\n ],\n [\"path\", { d: \"m2 22 3-3\", key: \"19mgm9\" }],\n [\"path\", { d: \"M7.5 13.5 10 11\", key: \"7xgeeb\" }],\n [\"path\", { d: \"M10.5 16.5 13 14\", key: \"10btkg\" }],\n [\"path\", { d: \"m18 3-4 4h6l-4 4\", key: \"16psg9\" }]\n ],\n aliases: [\"plug-zap-2\"]\n};\n__iconData.node;\nconst PlugZap = createLucideIcon(__iconData);\n\nexport { __iconData, PlugZap as default };\n//# sourceMappingURL=plug-zap.mjs.map\n","/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"power\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 2v10\", key: \"mnfbl\" }],\n [\"path\", { d: \"M18.4 6.6a9 9 0 1 1-12.77.04\", key: \"obofu9\" }]\n ]\n};\n__iconData.node;\nconst Power = createLucideIcon(__iconData);\n\nexport { __iconData, Power as default };\n//# sourceMappingURL=power.mjs.map\n","import { Outlet } from '@tanstack/react-router';\n\n/**\n * Scheduled publications, webhooks and deployments. Each tab renders its own\n * `Page` and header (the tabs live in the header, with the tab's actions).\n */\nexport const Publishing = () => <Outlet />;\n","import { useMe } from '@/api/auth';\n\n/** What the signed-in admin may change here. The UI hides what they can't; the server enforces it. */\nexport const usePublishingPermissions = () => {\n const permissions = useMe().data?.globalPermissions ?? [];\n return {\n permissions,\n canManageWebhooks: permissions.includes('webhooks.manage'),\n canManageDeployments: permissions.includes('deployments.manage'),\n canTriggerDeployments: permissions.includes('deployments.trigger'),\n canManagePublishing: permissions.includes('publishing.manage'),\n };\n};\n","import type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LinkTabs } from '@/components/LinkTabs';\nimport { PageHeader } from '@/components/PageHeader';\nimport { usePublishingPermissions } from '../hooks/usePublishingPermissions';\nimport { permittedSections } from '../sections';\n\ntype HeaderProps = {\n /** The current tab's actions (its \"New …\" button), primary last. */\n actions?: ReactNode;\n};\n\n/** The header of every Publishing list: \"Publishing\", the section tabs the admin may open, and actions. */\nexport const Header = ({ actions }: HeaderProps) => {\n const { t } = useTranslation();\n const { permissions } = usePublishingPermissions();\n return (\n <PageHeader\n title={t('nav.publishing')}\n actions={actions}\n tabs={\n <LinkTabs\n label={t('publishing.sections')}\n tabs={permittedSections(permissions).map((section) => ({\n to: section.to,\n label: t(section.labelKey),\n }))}\n />\n }\n />\n );\n};\n","import { useEffect, useEffectEvent, useState } from 'react';\n\ntype Revealed = { id: string; secret: string };\n\n/**\n * A secret created on this page (a webhook's or a connection's signing secret), shown once in a\n * `SecretReveal` at the top of the page, never through a URL. Dismissing it runs `onDismissed` with the\n * record's ID (to open it) only after the reveal, and its \"leave without saving the secret?\" guard, has\n * unmounted, so that navigation isn't stopped by the guard.\n */\nexport const useSecretReveal = (onDismissed: (id: string) => void) => {\n const [revealed, setRevealed] = useState<Revealed | undefined>(undefined);\n const [dismissedId, setDismissedId] = useState<string | undefined>(undefined);\n const afterDismiss = useEffectEvent((id: string) => onDismissed(id));\n useEffect(() => {\n if (dismissedId) {\n afterDismiss(dismissedId);\n }\n }, [dismissedId]);\n return {\n revealed,\n reveal: setRevealed,\n dismiss: () => {\n setDismissedId(revealed?.id);\n setRevealed(undefined);\n },\n /** For the create sheet's `onCloseAutoFocus`: focus stays on the reveal's copy button. */\n keepFocusOnReveal: (event: Event) => {\n if (revealed) {\n event.preventDefault();\n }\n },\n };\n};\n","import type { ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\n\nexport type DetailItem = { label: string; value: ReactNode };\n\ntype DetailListProps = { items: readonly DetailItem[]; className?: string };\n\n/** Label / value pairs (a description list), two columns on wide screens. */\nexport const DetailList = ({ items, className }: DetailListProps) => (\n <dl className={cn('grid gap-x-6 gap-y-3 text-sm sm:grid-cols-2', className)}>\n {items.map((item) => (\n <div key={item.label} className=\"min-w-0 space-y-0.5\">\n <dt className=\"text-xs font-medium text-muted-foreground\">{item.label}</dt>\n <dd className=\"break-words\">{item.value}</dd>\n </div>\n ))}\n </dl>\n);\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\n\ntype EnabledChipProps = { enabled: boolean };\n\n/** \"Enabled\" / \"Disabled\" for webhooks and deployment connections. */\nexport const EnabledChip = ({ enabled }: EnabledChipProps) => {\n const { t } = useTranslation();\n return enabled ? (\n <StatusChip tone=\"success\" label={t('publishing.enabled')} />\n ) : (\n <StatusChip tone=\"muted\" label={t('publishing.disabled')} />\n );\n};\n","import type { DeploymentConnection } from '@shapio/client';\n\n/** Deploy now needs an enabled connection whose stored secrets can be read (a run would fail otherwise). */\nexport const canDeployConnection = ({\n enabled,\n secretsUnreadable,\n}: Pick<DeploymentConnection, 'enabled' | 'secretsUnreadable'>) => enabled && !secretsUnreadable;\n","import type { DeploymentConnection } from '@shapio/client';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport {\n useDeleteDeploymentConnection,\n useTestDeploymentConnection,\n useTriggerDeployment,\n} from '@/api/deployments';\n\n/** Test the connection (result shown inline), trigger a manual run (opens it) and delete (a promise, for its confirmation). */\nexport const useConnectionActions = (connection: DeploymentConnection) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const test = useTestDeploymentConnection();\n const trigger = useTriggerDeployment();\n const remove = useDeleteDeploymentConnection();\n return {\n testResult: test.data,\n testing: test.isPending,\n triggering: trigger.isPending,\n deleting: remove.isPending,\n runTest: () => test.mutate(connection.id),\n triggerRun: () =>\n trigger.mutate(connection.id, {\n onSuccess: (run) => {\n toast.success(t('publishing.deployments.triggered'));\n void navigate({ to: '/publishing/deployments/runs/$runId', params: { runId: run.id } });\n },\n }),\n remove: () =>\n remove.mutateAsync(connection.id, {\n onSuccess: () => {\n toast.success(t('publishing.deployments.deleted', { name: connection.name }));\n void navigate({ to: '/publishing/deployments' });\n },\n }),\n };\n};\n","import type { DeploymentRun, ScheduleStatus, WebhookDeliveryStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\ntype Display = { labelKey: string; tone: StatusTone };\n\nexport const SCHEDULE_STATUS_DISPLAY = {\n scheduled: { labelKey: 'publishing.scheduled.statuses.scheduled', tone: 'scheduled' },\n done: { labelKey: 'publishing.scheduled.statuses.done', tone: 'success' },\n failed: { labelKey: 'publishing.scheduled.statuses.failed', tone: 'danger' },\n cancelled: { labelKey: 'publishing.scheduled.statuses.cancelled', tone: 'muted' },\n} as const satisfies Record<ScheduleStatus, Display>;\n\nexport const DELIVERY_STATUS_DISPLAY = {\n pending: { labelKey: 'publishing.webhooks.deliveryStatuses.pending', tone: 'progress' },\n retrying: { labelKey: 'publishing.webhooks.deliveryStatuses.retrying', tone: 'progress' },\n succeeded: { labelKey: 'publishing.webhooks.deliveryStatuses.succeeded', tone: 'success' },\n dead: { labelKey: 'publishing.webhooks.deliveryStatuses.dead', tone: 'danger' },\n} as const satisfies Record<WebhookDeliveryStatus, Display>;\n\nconst RUN_DISPLAY = {\n queued: { labelKey: 'publishing.deployments.statuses.queued', tone: 'neutral' },\n triggered: { labelKey: 'publishing.deployments.statuses.triggered', tone: 'progress' },\n triggeredUnknown: { labelKey: 'publishing.deployments.statuses.triggeredUnknown', tone: 'muted' },\n building: { labelKey: 'publishing.deployments.statuses.building', tone: 'progress' },\n deployed: { labelKey: 'publishing.deployments.statuses.deployed', tone: 'success' },\n committed: { labelKey: 'publishing.deployments.statuses.committed', tone: 'success' },\n failed: { labelKey: 'publishing.deployments.statuses.failed', tone: 'danger' },\n unknown: { labelKey: 'publishing.deployments.statuses.unknown', tone: 'muted' },\n} as const satisfies Record<string, Display>;\n\nexport type RunDisplay = (typeof RUN_DISPLAY)[keyof typeof RUN_DISPLAY];\n\n/**\n * A run's label, honest about what Shapio actually knows (brief §7: never show a success that didn't\n * happen). A trigger without a completion report reads \"Trigger sent · completion unknown\", not \"Deployed\";\n * GitHub \"deploys\" by committing, so its success reads \"Committed\".\n */\nexport const runDisplay = (\n run: Pick<DeploymentRun, 'status' | 'provider' | 'completionReported'>,\n): RunDisplay => {\n switch (run.status) {\n case 'triggered':\n return run.completionReported ? RUN_DISPLAY.triggered : RUN_DISPLAY.triggeredUnknown;\n case 'deployed':\n return run.provider === 'github' ? RUN_DISPLAY.committed : RUN_DISPLAY.deployed;\n default:\n return RUN_DISPLAY[run.status];\n }\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { runDisplay } from '../../helpers/statusDisplay';\n\ntype RunStatusProps = {\n run: Pick<DeploymentRun, 'status' | 'provider' | 'completionReported'>;\n /** False for a past state on the timeline. */\n live?: boolean;\n};\n\n/** A run's status, labelled honestly (see `runDisplay`). */\nexport const RunStatus = ({ run, live = true }: RunStatusProps) => {\n const { t } = useTranslation();\n const display = runDisplay(run);\n return <StatusChip tone={display.tone} label={t(display.labelKey)} live={live} />;\n};\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\n\ntype SecretsUnreadableChipProps = { unreadable: boolean };\n\n/** Warns that a connection's stored secret can't be decrypted (the server's key changed) until it is entered again. */\nexport const SecretsUnreadableChip = ({ unreadable }: SecretsUnreadableChipProps) => {\n const { t } = useTranslation();\n return unreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.deployments.secretsUnreadable')} />\n ) : null;\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { Rocket } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Panel } from '@/components/Panel';\nimport { Button } from '@/components/ui/button';\nimport { PROVIDER_LABELS } from '../../constants';\nimport { DetailList } from '../../DetailList';\nimport { EnabledChip } from '../../EnabledChip';\nimport { usePublishingPermissions } from '../../hooks/usePublishingPermissions';\nimport { canDeployConnection } from '../helpers/connectionState';\nimport { useConnectionActions } from '../hooks/useConnectionActions';\nimport { RunStatus } from '../RunStatus';\nimport { SecretsUnreadableChip } from '../SecretsUnreadableChip';\n\ntype ConnectionCardProps = { connection: DeploymentConnection };\n\n/**\n * One deployment connection: provider, state, latest run and live snapshot, with Open and Deploy now. A\n * connection whose secret can't be read says so and can't deploy until the secret is entered again.\n */\nexport const ConnectionCard = ({ connection }: ConnectionCardProps) => {\n const { t } = useTranslation();\n const { canTriggerDeployments } = usePublishingPermissions();\n const actions = useConnectionActions(connection);\n return (\n <Panel\n title={connection.name}\n titleAs=\"h3\"\n description={t(PROVIDER_LABELS[connection.provider])}\n actions={<EnabledChip enabled={connection.enabled} />}\n bodyClassName=\"space-y-4\"\n >\n <SecretsUnreadableChip unreadable={connection.secretsUnreadable} />\n <DetailList\n items={[\n {\n label: t('publishing.deployments.latestRun'),\n value: connection.latestRun ? <RunStatus run={connection.latestRun} /> : t('common.never'),\n },\n {\n label: t('publishing.deployments.currentSnapshot'),\n value:\n connection.currentRun?.snapshot != null\n ? t('publishing.snapshotNumber', { snapshot: connection.currentRun.snapshot })\n : t('common.none'),\n },\n ]}\n className=\"grid-cols-2\"\n />\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link to=\"/publishing/deployments/$connectionId\" params={{ connectionId: connection.id }}>\n {t('publishing.deployments.open')}\n </Link>\n </Button>\n {canTriggerDeployments ? (\n <Button\n size=\"sm\"\n disabled={actions.triggering || !canDeployConnection(connection)}\n onClick={actions.triggerRun}\n >\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </div>\n </Panel>\n );\n};\n","import {\n DEPLOYMENT_PROVIDERS,\n DEPLOYMENT_TRIGGERS,\n type CreateDeploymentConnectionInput,\n type DeploymentConnection,\n type DeploymentProvider,\n type UpdateDeploymentConnectionInput,\n} from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\nexport const GITHUB_MODES = ['commit', 'pull_request'] as const;\n\n/** Select value for \"previews show the public fields\" (Radix selects cannot use an empty value). */\nexport const NO_DELIVERY_ROLE = 'none';\n\nconst SETTING_NAMES = [\n 'url',\n 'accountId',\n 'projectName',\n 'projectId',\n 'teamId',\n 'siteId',\n 'owner',\n 'repo',\n 'branch',\n 'mode',\n 'directory',\n] as const;\nconst SECRET_NAMES = ['signingSecret', 'deployHookUrl', 'apiToken', 'token'] as const;\n\nexport type SettingName = (typeof SETTING_NAMES)[number];\nexport type SecretName = (typeof SECRET_NAMES)[number];\n\ntype SecretSpec = { name: SecretName; requiredOnCreate: boolean };\n\n/** Settings a provider shows but does not require (everything else listed in `settings` is required). */\nexport const OPTIONAL_SETTINGS: ReadonlySet<SettingName> = new Set(['teamId']);\n\n/** The settings (text inputs; GitHub's `mode` is a select) and write-only secrets of each provider. */\nexport const PROVIDER_FIELDS = {\n generic_webhook: {\n settings: ['url'],\n secrets: [{ name: 'signingSecret', requiredOnCreate: false }],\n },\n cloudflare_pages: {\n settings: ['accountId', 'projectName'],\n secrets: [\n { name: 'deployHookUrl', requiredOnCreate: true },\n { name: 'apiToken', requiredOnCreate: true },\n ],\n },\n vercel: {\n settings: ['projectId', 'teamId'],\n secrets: [\n { name: 'deployHookUrl', requiredOnCreate: true },\n { name: 'apiToken', requiredOnCreate: true },\n ],\n },\n netlify: {\n settings: ['siteId'],\n secrets: [{ name: 'apiToken', requiredOnCreate: true }],\n },\n github: {\n settings: ['owner', 'repo', 'branch', 'directory'],\n secrets: [{ name: 'token', requiredOnCreate: true }],\n },\n} as const satisfies Record<\n DeploymentProvider,\n { settings: readonly SettingName[]; secrets: readonly SecretSpec[] }\n>;\n\n/** Settings sent per provider (GitHub's `mode` included). */\nconst providerSettingNames = (provider: DeploymentProvider): readonly SettingName[] =>\n provider === 'github' ? [...PROVIDER_FIELDS.github.settings, 'mode'] : PROVIDER_FIELDS[provider].settings;\n\n/** \"Schema changes\" only applies to GitHub, which commits the schema files. */\nexport const triggerOptionsFor = (provider: DeploymentProvider) =>\n DEPLOYMENT_TRIGGERS.filter((trigger) => trigger !== 'schema' || provider === 'github');\n\nconst isWholeNumber = (value: string) => /^\\d+$/.test(value) && Number(value) <= 86_400;\n\nconst isHttpUrl = (value: string) => z.url({ protocol: /^https?$/ }).safeParse(value).success;\n\nexport type ConnectionFormMode = 'create' | 'edit';\n\nconst settingsShape = Object.fromEntries(SETTING_NAMES.map((name) => [name, z.string()])) as Record<\n SettingName,\n z.ZodString\n>;\nconst secretsShape = Object.fromEntries(SECRET_NAMES.map((name) => [name, z.string()])) as Record<\n SecretName,\n z.ZodString\n>;\n\n/** Required settings and secrets depend on the provider; secrets are only required when creating. */\nexport const connectionSchema = (mode: ConnectionFormMode) =>\n z\n .object({\n name: requiredText().max(200, 'validation.tooLong'),\n provider: z.enum(DEPLOYMENT_PROVIDERS),\n settings: z.object(settingsShape),\n secrets: z.object(secretsShape),\n previewUrlTemplate: z.string().trim().max(2000, 'validation.tooLong'),\n triggerPolicy: z.array(z.enum(DEPLOYMENT_TRIGGERS)),\n debounceSeconds: z.string().trim().refine(isWholeNumber, 'validation.debounceSeconds'),\n allowPrivateNetwork: z.boolean(),\n enabled: z.boolean(),\n /** A delivery role ID, or NO_DELIVERY_ROLE. */\n deliveryRoleId: z.string(),\n })\n .superRefine((values, context) => {\n const fields = PROVIDER_FIELDS[values.provider];\n for (const name of fields.settings) {\n if (!OPTIONAL_SETTINGS.has(name) && values.settings[name].trim() === '') {\n context.addIssue({ code: 'custom', path: ['settings', name], message: 'validation.required' });\n }\n }\n if (\n values.provider === 'generic_webhook' &&\n values.settings.url.trim() &&\n !isHttpUrl(values.settings.url.trim())\n ) {\n context.addIssue({ code: 'custom', path: ['settings', 'url'], message: 'validation.url' });\n }\n if (mode === 'create') {\n for (const secret of fields.secrets) {\n if (secret.requiredOnCreate && values.secrets[secret.name].trim() === '') {\n context.addIssue({\n code: 'custom',\n path: ['secrets', secret.name],\n message: 'validation.required',\n });\n }\n }\n }\n if (values.previewUrlTemplate && !isHttpUrl(values.previewUrlTemplate)) {\n context.addIssue({ code: 'custom', path: ['previewUrlTemplate'], message: 'validation.url' });\n }\n });\n\nexport type ConnectionFormValues = z.infer<ReturnType<typeof connectionSchema>>;\n\nconst emptyRecord = <TName extends string>(names: readonly TName[]) =>\n Object.fromEntries(names.map((name) => [name, ''])) as Record<TName, string>;\n\nexport const EMPTY_CONNECTION: ConnectionFormValues = {\n name: '',\n provider: 'generic_webhook',\n settings: { ...emptyRecord(SETTING_NAMES), branch: 'main', mode: 'commit', directory: 'schema' },\n secrets: emptyRecord(SECRET_NAMES),\n previewUrlTemplate: '',\n triggerPolicy: ['publish', 'change_set', 'manual'],\n debounceSeconds: '30',\n allowPrivateNetwork: false,\n enabled: true,\n deliveryRoleId: NO_DELIVERY_ROLE,\n};\n\nexport const toConnectionValues = (connection: DeploymentConnection): ConnectionFormValues => ({\n name: connection.name,\n provider: connection.provider,\n settings: {\n ...EMPTY_CONNECTION.settings,\n ...Object.fromEntries(\n SETTING_NAMES.flatMap((name) => (connection.settings[name] ? [[name, connection.settings[name]]] : [])),\n ),\n },\n // Secrets are write-only: never prefilled.\n secrets: emptyRecord(SECRET_NAMES),\n previewUrlTemplate: connection.previewUrlTemplate ?? '',\n triggerPolicy: connection.triggerPolicy,\n debounceSeconds: String(connection.debounceSeconds),\n allowPrivateNetwork: connection.allowPrivateNetwork,\n enabled: connection.enabled,\n deliveryRoleId: connection.deliveryRoleId ?? NO_DELIVERY_ROLE,\n});\n\nconst commonInput = (values: ConnectionFormValues) => {\n const secrets = Object.fromEntries(\n PROVIDER_FIELDS[values.provider].secrets.flatMap(({ name }) =>\n values.secrets[name].trim() ? [[name, values.secrets[name].trim()]] : [],\n ),\n );\n return {\n name: values.name.trim(),\n settings: Object.fromEntries(\n providerSettingNames(values.provider).map((name) => [name, values.settings[name].trim()]),\n ),\n secrets,\n previewUrlTemplate: values.previewUrlTemplate.trim() || null,\n triggerPolicy: values.triggerPolicy.filter((trigger) =>\n triggerOptionsFor(values.provider).includes(trigger),\n ),\n debounceSeconds: Number(values.debounceSeconds),\n allowPrivateNetwork: values.allowPrivateNetwork,\n enabled: values.enabled,\n deliveryRoleId: values.deliveryRoleId === NO_DELIVERY_ROLE ? null : values.deliveryRoleId,\n };\n};\n\nexport const toCreateConnectionInput = (values: ConnectionFormValues): CreateDeploymentConnectionInput => ({\n ...commonInput(values),\n provider: values.provider,\n});\n\n/**\n * Secrets Shapio generates when left empty (the generic signing secret) that the server can no longer read\n * and that don't come from the environment: saving one empty asks for a new one.\n */\nexport const regenerableSecrets = (\n connection: Pick<DeploymentConnection, 'provider' | 'secrets' | 'secretsUnreadable'>,\n): SecretName[] =>\n connection.secretsUnreadable\n ? PROVIDER_FIELDS[connection.provider].secrets\n .filter(({ name, requiredOnCreate }) => !requiredOnCreate && !connection.secrets[name]?.set)\n .map(({ name }) => name)\n : [];\n\n/**\n * Only secrets typed in are sent: an omitted secret keeps its stored value. A `regenerable` secret left\n * empty is sent as '' so the server generates a new one (and returns it once).\n */\nexport const toUpdateConnectionInput = (\n values: ConnectionFormValues,\n expectedVersion: number,\n regenerable: readonly SecretName[] = [],\n): UpdateDeploymentConnectionInput => {\n const { secrets: typed, ...rest } = commonInput(values);\n const secrets = {\n ...Object.fromEntries(regenerable.filter((name) => !(name in typed)).map((name) => [name, ''])),\n ...typed,\n };\n return { ...rest, ...(Object.keys(secrets).length > 0 ? { secrets } : {}), expectedVersion };\n};\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useRoles } from '@/api/roles';\nimport type { SelectOption } from '@/components/FormSelectField';\nimport { NO_DELIVERY_ROLE } from '../helpers/connectionForm';\n\n/** \"Public fields\" plus every delivery role: what a connection's previews read with. */\nexport const useDeliveryRoleOptions = (): SelectOption[] => {\n const { t } = useTranslation();\n const roles = useRoles().data;\n return useMemo(\n () => [\n { value: NO_DELIVERY_ROLE, label: t('publishing.deployments.deliveryRoleNone') },\n ...(roles ?? [])\n .filter((role) => role.kind === 'delivery')\n .map((role) => ({ value: role.id, label: role.name })),\n ],\n [roles, t],\n );\n};\n","import type { DeploymentProvider } from '@shapio/client';\nimport type { SecretName, SettingName } from './connectionForm';\n\nexport const SETTING_LABELS = {\n url: 'publishing.deployments.settingLabels.url',\n accountId: 'publishing.deployments.settingLabels.accountId',\n projectName: 'publishing.deployments.settingLabels.projectName',\n projectId: 'publishing.deployments.settingLabels.projectId',\n teamId: 'publishing.deployments.settingLabels.teamId',\n siteId: 'publishing.deployments.settingLabels.siteId',\n owner: 'publishing.deployments.settingLabels.owner',\n repo: 'publishing.deployments.settingLabels.repo',\n branch: 'publishing.deployments.settingLabels.branch',\n mode: 'publishing.deployments.settingLabels.mode',\n directory: 'publishing.deployments.settingLabels.directory',\n} as const satisfies Record<SettingName, string>;\n\nexport const SETTING_HINTS = {\n url: 'publishing.deployments.settingHints.url',\n directory: 'publishing.deployments.settingHints.directory',\n teamId: 'publishing.deployments.settingHints.teamId',\n} as const satisfies Partial<Record<SettingName, string>>;\n\nexport const SECRET_LABELS = {\n signingSecret: 'publishing.deployments.secretLabels.signingSecret',\n deployHookUrl: 'publishing.deployments.secretLabels.deployHookUrl',\n apiToken: 'publishing.deployments.secretLabels.apiToken',\n token: 'publishing.deployments.secretLabels.token',\n} as const satisfies Record<SecretName, string>;\n\nexport const SECRET_HINTS = {\n signingSecret: 'publishing.deployments.secretHints.signingSecret',\n deployHookUrl: 'publishing.deployments.secretHints.deployHookUrl',\n apiToken: 'publishing.deployments.secretHints.apiToken',\n token: 'publishing.deployments.secretHints.token',\n} as const satisfies Record<SecretName, string>;\n\ntype SecretHintKey =\n (typeof SECRET_HINTS)[SecretName] | 'publishing.deployments.providerSecretHints.netlify.apiToken';\n\n/** Where a secret means something different for one provider (Netlify's token also starts builds). */\nconst PROVIDER_SECRET_HINTS: Partial<Record<DeploymentProvider, Partial<Record<SecretName, SecretHintKey>>>> =\n {\n netlify: { apiToken: 'publishing.deployments.providerSecretHints.netlify.apiToken' },\n };\n\n/** The hint for a provider's secret: its provider-specific override, or the shared one. */\nexport const secretHintFor = (provider: DeploymentProvider, name: SecretName): SecretHintKey =>\n PROVIDER_SECRET_HINTS[provider]?.[name] ?? SECRET_HINTS[name];\n\nexport const GITHUB_MODE_LABELS = {\n commit: 'publishing.deployments.githubModes.commit',\n pull_request: 'publishing.deployments.githubModes.pull_request',\n} as const;\n","import { useState } from 'react';\nimport { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { HintedLabel } from '@/components/HintedLabel';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Button } from '@/components/ui/button';\nimport { Field, FieldDescription } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { describedBy } from '@/helpers/describedBy';\nimport type { ConnectionFormValues, SecretName } from '../helpers/connectionForm';\n\ntype SecretFieldProps = {\n control: Control<ConnectionFormValues>;\n name: SecretName;\n label: string;\n /** What the secret is; shown behind the label's info icon with how to keep it in the environment. */\n hint: string;\n /** A value is stored on the server: show \"Stored\" with a Replace action instead of an empty input. */\n stored: boolean;\n /** The secret is read from this server environment variable (`${ENV:NAME}`). */\n envVar: string | null;\n /** One visible line under the input when it changes what the person does (an unreadable secret). */\n helper?: string | undefined;\n};\n\n/** A write-only secret: never prefilled; an empty value keeps the stored one. */\nexport const SecretField = ({ control, name, label, hint, stored, envVar, helper }: SecretFieldProps) => {\n const { t } = useTranslation();\n const { field, fieldState } = useController({ control, name: `secrets.${name}` });\n const [replacing, setReplacing] = useState(false);\n const id = `field-secrets-${name}`;\n const hintId = `${id}-hint`;\n const errorId = fieldState.error ? `${id}-error` : undefined;\n const helperId = helper ? `${id}-helper` : undefined;\n const fullHint = `${hint} ${t('publishing.deployments.secretEnvHint')}`;\n if (stored && !replacing) {\n return (\n <Field>\n <HintedLabel htmlFor={`${id}-replace`} label={label} hint={fullHint} hintId={hintId} />\n <div className=\"flex flex-wrap items-center gap-2\">\n <StatusChip\n tone=\"success\"\n label={\n envVar\n ? t('publishing.deployments.secretFromEnv', { name: envVar })\n : t('publishing.deployments.secretStored')\n }\n />\n <Button\n id={`${id}-replace`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-describedby={hintId}\n onClick={() => setReplacing(true)}\n >\n {t('publishing.deployments.replaceSecret')}\n </Button>\n </div>\n </Field>\n );\n }\n return (\n <Field data-invalid={fieldState.invalid || undefined}>\n <HintedLabel htmlFor={id} label={label} hint={fullHint} hintId={hintId} />\n <div className=\"flex gap-2\">\n <Input\n {...field}\n id={id}\n type=\"password\"\n autoComplete=\"new-password\"\n spellCheck={false}\n autoFocus={replacing}\n aria-invalid={fieldState.invalid || undefined}\n aria-describedby={describedBy(hintId, helperId, errorId)}\n className=\"font-mono text-sm\"\n />\n {stored ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n field.onChange('');\n setReplacing(false);\n }}\n >\n {t('publishing.deployments.keepSecret')}\n </Button>\n ) : null}\n </div>\n {helper ? <FieldDescription id={helperId}>{helper}</FieldDescription> : null}\n <FormFieldError id={errorId} message={fieldState.error?.message} />\n </Field>\n );\n};\n","import type { DeploymentSecretState } from '@shapio/client';\nimport { useWatch, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { GITHUB_MODES, PROVIDER_FIELDS, type ConnectionFormValues } from '../helpers/connectionForm';\nimport {\n GITHUB_MODE_LABELS,\n secretHintFor,\n SECRET_LABELS,\n SETTING_HINTS,\n SETTING_LABELS,\n} from '../helpers/labels';\nimport { SecretField } from '../SecretField';\n\ntype ProviderFieldsProps = {\n control: Control<ConnectionFormValues>;\n /** Which secrets the server holds (edit); undefined when creating. */\n storedSecrets: DeploymentSecretState | undefined;\n /** The server can't read the stored secrets: a secret Shapio can generate says how to fill it. */\n secretsUnreadable?: boolean;\n};\n\n/** The chosen provider's settings and secrets. */\nexport const ProviderFields = ({\n control,\n storedSecrets,\n secretsUnreadable = false,\n}: ProviderFieldsProps) => {\n const { t } = useTranslation();\n const provider = useWatch({ control, name: 'provider' });\n const fields = PROVIDER_FIELDS[provider];\n return (\n <>\n {fields.settings.map((name) => (\n <FormTextField\n key={name}\n control={control}\n name={`settings.${name}`}\n label={t(SETTING_LABELS[name])}\n hint={name in SETTING_HINTS ? t(SETTING_HINTS[name as keyof typeof SETTING_HINTS]) : undefined}\n type={name === 'url' ? 'url' : 'text'}\n autoComplete=\"off\"\n spellCheck={false}\n />\n ))}\n {provider === 'github' ? (\n <FormSelectField\n control={control}\n name=\"settings.mode\"\n label={t(SETTING_LABELS.mode)}\n options={GITHUB_MODES.map((mode) => ({ value: mode, label: t(GITHUB_MODE_LABELS[mode]) }))}\n />\n ) : null}\n {fields.secrets.map((secret) => (\n <SecretField\n key={`${provider}-${secret.name}`}\n control={control}\n name={secret.name}\n label={t(SECRET_LABELS[secret.name])}\n hint={t(secretHintFor(provider, secret.name))}\n stored={storedSecrets?.[secret.name]?.set ?? false}\n envVar={storedSecrets?.[secret.name]?.envVar ?? null}\n helper={\n secretsUnreadable && !secret.requiredOnCreate\n ? t('publishing.deployments.secretUnreadableHelper')\n : undefined\n }\n />\n ))}\n </>\n );\n};\n","import { DEPLOYMENT_PROVIDERS, type DeploymentSecretState } from '@shapio/client';\nimport { useWatch, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormCheckboxGroup } from '@/components/FormCheckboxGroup';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { PROVIDER_LABELS, TRIGGER_POLICY_LABELS } from '../../constants';\nimport {\n triggerOptionsFor,\n type ConnectionFormMode,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\nimport { useDeliveryRoleOptions } from '../hooks/useDeliveryRoleOptions';\nimport { ProviderFields } from '../ProviderFields';\n\ntype ConnectionFormProps = {\n control: Control<ConnectionFormValues>;\n mode: ConnectionFormMode;\n storedSecrets?: DeploymentSecretState;\n /** The server can't read the stored secrets: they are entered again (or generated). */\n secretsUnreadable?: boolean;\n};\n\n/** A deployment connection's fields: provider (fixed once created), its settings and secrets, and policy. */\nexport const ConnectionForm = ({\n control,\n mode,\n storedSecrets,\n secretsUnreadable = false,\n}: ConnectionFormProps) => {\n const { t } = useTranslation();\n const provider = useWatch({ control, name: 'provider' });\n const deliveryRoleOptions = useDeliveryRoleOptions();\n return (\n <>\n <FormTextField\n control={control}\n name=\"name\"\n label={t('publishing.deployments.name')}\n autoComplete=\"off\"\n />\n {mode === 'create' ? (\n <FormSelectField\n control={control}\n name=\"provider\"\n label={t('publishing.deployments.provider')}\n options={DEPLOYMENT_PROVIDERS.map((value) => ({ value, label: t(PROVIDER_LABELS[value]) }))}\n />\n ) : null}\n <ProviderFields control={control} storedSecrets={storedSecrets} secretsUnreadable={secretsUnreadable} />\n <FormTextField\n control={control}\n name=\"previewUrlTemplate\"\n label={t('publishing.deployments.previewUrlTemplate')}\n hint={t('publishing.deployments.previewUrlTemplateHint')}\n placeholder={t('publishing.deployments.previewUrlTemplatePlaceholder')}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <FormSelectField\n control={control}\n name=\"deliveryRoleId\"\n label={t('publishing.deployments.deliveryRole')}\n hint={t('publishing.deployments.deliveryRoleHint')}\n options={deliveryRoleOptions}\n />\n <FormCheckboxGroup\n control={control}\n name=\"triggerPolicy\"\n legend={t('publishing.deployments.triggerPolicy')}\n options={triggerOptionsFor(provider).map((value) => ({\n value,\n label: t(TRIGGER_POLICY_LABELS[value]),\n }))}\n />\n <FormTextField\n control={control}\n name=\"debounceSeconds\"\n type=\"number\"\n inputMode=\"numeric\"\n min={0}\n label={t('publishing.deployments.debounceSeconds')}\n hint={t('publishing.deployments.debounceSecondsHint')}\n className=\"w-32\"\n />\n <FormSwitchField control={control} name=\"enabled\" label={t('publishing.deployments.enabled')} />\n <FormSwitchField\n control={control}\n name=\"allowPrivateNetwork\"\n label={t('publishing.fields.allowPrivateNetwork')}\n hint={t('publishing.fields.allowPrivateNetworkHint')}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DeploymentConnectionCreated } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useCreateDeploymentConnection } from '@/api/deployments';\nimport { settle } from '@/helpers/settle';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\nimport {\n connectionSchema,\n EMPTY_CONNECTION,\n toCreateConnectionInput,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\n\nconst createSchema = connectionSchema('create');\n\nexport const useCreateConnectionForm = (\n open: boolean,\n onCreated: (created: DeploymentConnectionCreated) => void,\n) => {\n const createConnection = useCreateDeploymentConnection();\n const form = useForm<ConnectionFormValues>({\n resolver: zodResolver(createSchema),\n defaultValues: EMPTY_CONNECTION,\n });\n useResetOnOpen(open, form.reset, EMPTY_CONNECTION, createConnection.reset);\n const onSubmit = form.handleSubmit(async (values) => {\n const created = await settle(createConnection.mutateAsync(toCreateConnectionInput(values)));\n if (created.ok) {\n form.reset(EMPTY_CONNECTION);\n onCreated(created.value);\n }\n });\n return { form, onSubmit, createConnection };\n};\n","import type { DeploymentConnectionCreated } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { FormSheet } from '@/components/FormSheet';\nimport { ConnectionForm } from '../ConnectionForm';\nimport { useCreateConnectionForm } from '../hooks/useCreateConnectionForm';\n\ntype CreateSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Lets the page keep focus on the secret it reveals when the sheet closes. */\n onCloseAutoFocus: (event: Event) => void;\n onCreated: (created: DeploymentConnectionCreated) => void;\n};\n\nexport const CreateSheet = ({ open, onOpenChange, onCloseAutoFocus, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createConnection } = useCreateConnectionForm(open, onCreated);\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n onCloseAutoFocus={onCloseAutoFocus}\n title={t('publishing.deployments.createTitle')}\n dirty={form.formState.isDirty}\n pending={createConnection.isPending}\n submitLabel={t('common.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <ConnectionForm control={form.control} mode=\"create\" />\n <FormError error={createConnection.error} />\n </FormSheet>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { SecretReveal } from '@/components/SecretReveal';\n\ntype GeneratedSecretRevealProps = { secret: string; onDismiss: () => void };\n\n/** A signing secret Shapio generated for a connection (on create, or replacing an unreadable one), shown once. */\nexport const GeneratedSecretReveal = ({ secret, onDismiss }: GeneratedSecretRevealProps) => {\n const { t } = useTranslation();\n return (\n <SecretReveal\n title={t('publishing.deployments.generatedSecretTitle')}\n description={t('publishing.deployments.generatedSecretDescription')}\n label={t('publishing.deployments.secretLabels.signingSecret')}\n secret={secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={onDismiss}\n />\n );\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { RUN_TRIGGER_LABELS } from '../../constants';\nimport { RunStatus } from '../RunStatus';\n\ntype RunsProps = { runs: DeploymentRun[]; showConnection: boolean };\n\n/** Deployment runs, newest first; each opens its detail page. */\nexport const Runs = ({ runs, showConnection }: RunsProps) => {\n const { t } = useTranslation();\n return (\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.deployments.run')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n {showConnection ? <TableHead>{t('publishing.deployments.connection')}</TableHead> : null}\n <TableHead>{t('publishing.deployments.trigger')}</TableHead>\n <TableHead>{t('publishing.fields.snapshot')}</TableHead>\n <TableHead>{t('publishing.deployments.finishedAt')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {runs.map((run) => (\n <TableRow key={run.id}>\n <TableCell className=\"whitespace-nowrap\">\n <RowTitle asChild>\n <Link\n to=\"/publishing/deployments/runs/$runId\"\n params={{ runId: run.id }}\n aria-label={t('publishing.deployments.openRun', {\n connection: run.connectionName,\n at: formatDateTime(run.createdAt),\n })}\n >\n {formatDateTime(run.createdAt)}\n </Link>\n </RowTitle>\n </TableCell>\n <TableCell>\n <RunStatus run={run} />\n </TableCell>\n {showConnection ? (\n <TableCell className=\"max-w-56 truncate\">{run.connectionName}</TableCell>\n ) : null}\n <TableCell>{t(RUN_TRIGGER_LABELS[run.trigger])}</TableCell>\n <TableCell className=\"tabular-nums\">\n {run.snapshot === null\n ? t('common.none')\n : t('publishing.snapshotNumber', { snapshot: run.snapshot })}\n </TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(run.finishedAt)}>\n {run.finishedAt ? formatRelativeTime(run.finishedAt) : t('common.none')}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </TableRoot>\n );\n};\n","import { Rocket } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDeploymentRuns } from '@/api/deployments';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { QueryView } from '@/components/QueryView';\nimport { PUBLISHING_PAGE_SIZE } from '@/constants/publishing';\nimport { useCursorPager } from '../../hooks/useCursorPager';\nimport { Runs } from '../Runs';\n\ntype RunsListProps = {\n /** Runs of one connection, or of every connection when undefined. */\n connectionId: string | undefined;\n cursor: string | undefined;\n onCursorChange: (cursor: string | undefined) => void;\n};\n\n/** A page of runs (polled while any is in progress) with paging, for the body of a flush `Panel`. */\nexport const RunsList = ({ connectionId, cursor, onCursorChange }: RunsListProps) => {\n const { t } = useTranslation();\n const { pagerProps } = useCursorPager(cursor, onCursorChange);\n const runs = useDeploymentRuns({ connectionId, cursor, limit: PUBLISHING_PAGE_SIZE });\n return (\n <QueryView\n query={runs}\n isEmpty={(data) => data.items.length === 0 && cursor === undefined}\n empty={<EmptyState icon={Rocket} size=\"panel\" title={t('publishing.deployments.noRuns')} />}\n >\n {(data) => (\n <>\n <Runs runs={data.items} showConnection={connectionId === undefined} />\n <CursorPager {...pagerProps(data.nextCursor)} className=\"border-t px-4 py-2.5\" />\n </>\n )}\n </QueryView>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport { Plus, Rocket } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useDeploymentConnections } from '@/api/deployments';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { Panel } from '@/components/Panel';\nimport { QueryView } from '@/components/QueryView';\nimport { Button } from '@/components/ui/button';\nimport { Header } from '../Header';\nimport { usePublishingPermissions } from '../hooks/usePublishingPermissions';\nimport { useSecretReveal } from '../hooks/useSecretReveal';\nimport { ConnectionCard } from './ConnectionCard';\nimport { CreateSheet } from './CreateSheet';\nimport { GeneratedSecretReveal } from './GeneratedSecretReveal';\nimport { RunsList } from './RunsList';\n\n/** Deployment connections as cards (managers) and the latest runs across all of them (everyone). */\nexport const Deployments = () => {\n const { t } = useTranslation();\n const navigate = useNavigate({ from: '/publishing/deployments' });\n const { cursor } = useSearch({ from: '/app/publishing/deployments' });\n const { canManageDeployments } = usePublishingPermissions();\n const connections = useDeploymentConnections();\n const [creating, setCreating] = useState(false);\n const openConnection = (connectionId: string) =>\n void navigate({ to: '/publishing/deployments/$connectionId', params: { connectionId } });\n // A generated signing secret is shown here, then the connection opens.\n const secret = useSecretReveal(openConnection);\n return (\n <Page>\n <Header\n actions={\n canManageDeployments ? (\n <Button onClick={() => setCreating(true)}>\n <Plus aria-hidden=\"true\" />\n {t('publishing.deployments.create')}\n </Button>\n ) : undefined\n }\n />\n {secret.revealed ? (\n <GeneratedSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n {canManageDeployments ? (\n <section aria-labelledby=\"deployment-connections\" className=\"space-y-3\">\n <h2 id=\"deployment-connections\" className=\"text-base font-semibold\">\n {t('publishing.deployments.connections')}\n </h2>\n <QueryView\n query={connections}\n isEmpty={(data) => data.length === 0}\n empty={<EmptyState icon={Rocket} title={t('publishing.deployments.empty')} />}\n >\n {(data) => (\n <ul className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {data.map((connection) => (\n <li key={connection.id} className=\"grid\">\n <ConnectionCard connection={connection} />\n </li>\n ))}\n </ul>\n )}\n </QueryView>\n </section>\n ) : null}\n <Panel title={t('publishing.deployments.recentRuns')} flush>\n <RunsList\n connectionId={undefined}\n cursor={cursor}\n onCursorChange={(next) => void navigate({ search: { cursor: next } })}\n />\n </Panel>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCloseAutoFocus={secret.keepFocusOnReveal}\n onCreated={({ connection, generatedSecrets }) => {\n setCreating(false);\n const generated = generatedSecrets.signingSecret;\n if (generated) {\n secret.reveal({ id: connection.id, secret: generated });\n } else {\n openConnection(connection.id);\n }\n }}\n />\n </Page>\n );\n};\n","import { useQueryClient, type QueryKey } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { isConflict } from '@/api/errors';\n\n/**\n * Optimistic concurrency on an edit page: when a save answers 409 (someone else saved first), the latest\n * version is reloaded and the page says so, instead of overwriting their change.\n */\nexport const useConflictReload = (queryKey: QueryKey) => {\n const queryClient = useQueryClient();\n const [conflicted, setConflicted] = useState(false);\n return {\n conflicted,\n clearConflict: () => setConflicted(false),\n /** Pass as a mutation's `onError`: other errors are left to the form. */\n onSaveError: (error: unknown) => {\n if (isConflict(error)) {\n setConflicted(true);\n void queryClient.invalidateQueries({ queryKey });\n }\n },\n };\n};\n","import { cn } from '@/helpers/cn';\n\ntype JsonBlockProps = { value: unknown; label: string; className?: string };\n\n/** Pretty-printed JSON (payloads, results), scrollable and focusable so keyboard users can scroll it. */\nexport const JsonBlock = ({ value, label, className }: JsonBlockProps) => (\n <pre\n tabIndex={0}\n aria-label={label}\n className={cn(\n 'max-h-72 overflow-auto rounded-md border bg-muted p-3 font-mono text-xs break-all whitespace-pre-wrap text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50',\n className,\n )}\n >\n {typeof value === 'string' ? value : JSON.stringify(value ?? null, null, 2)}\n </pre>\n);\n","import { useTranslation } from 'react-i18next';\n\n/** Header names are protocol, not prose: they are not translated. */\nconst SIGNATURE_HEADERS = [\n { name: 'X-Shapio-Signature', valueKey: 'publishing.webhooks.signatureFormat' },\n { name: 'X-Shapio-Timestamp', valueKey: 'publishing.webhooks.timestampFormat' },\n { name: 'X-Shapio-Event', valueKey: 'publishing.webhooks.eventFormat' },\n { name: 'X-Shapio-Delivery', valueKey: 'publishing.webhooks.deliveryFormat' },\n] as const;\n\ntype SignatureHelpProps = { description: string };\n\n/** How receivers verify a request: what the signature covers, and the headers Shapio sends. */\nexport const SignatureHelp = ({ description }: SignatureHelpProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"space-y-2\">\n <p className=\"text-meta text-muted-foreground\">{description}</p>\n <dl className=\"space-y-1 rounded-lg border bg-muted p-3 font-mono text-xs break-all\">\n {SIGNATURE_HEADERS.map((header) => (\n <div key={header.name}>\n <dt className=\"inline font-semibold\">{header.name}</dt>\n <dd className=\"inline before:content-[':_']\">{t(header.valueKey)}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { CopyButton } from '@/components/CopyButton';\nimport { Field, FieldLabel } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { JsonBlock } from '../../JsonBlock';\nimport { SignatureHelp } from '../../SignatureHelp';\n\ntype CallbackHelpProps = { callbackUrl: string };\n\n/** The body a build posts back; code, not prose, so it is not translated. */\nconst CALLBACK_EXAMPLE = {\n runId: '0b8f3c1e-…',\n status: 'deployed',\n logUrl: 'https://ci.example.com/builds/123',\n siteUrl: 'https://www.example.com',\n message: 'Build 123',\n};\n\n/** How a generic-webhook site reports build progress: where to post, what to send, how to sign it. */\nexport const CallbackHelp = ({ callbackUrl }: CallbackHelpProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"space-y-5\">\n <Field>\n <FieldLabel htmlFor=\"deployment-callback-url\">{t('publishing.deployments.callbackUrl')}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id=\"deployment-callback-url\"\n readOnly\n value={callbackUrl}\n className=\"font-mono text-xs\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <CopyButton value={callbackUrl} />\n </div>\n </Field>\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <div className=\"min-w-0 space-y-2\">\n <p className=\"text-sm font-semibold\">{t('publishing.deployments.callbackBody')}</p>\n <JsonBlock value={CALLBACK_EXAMPLE} label={t('publishing.deployments.callbackBody')} />\n <p className=\"text-meta text-muted-foreground\">{t('publishing.deployments.callbackFields')}</p>\n </div>\n <div className=\"min-w-0 space-y-2\">\n <p className=\"text-sm font-semibold\">{t('publishing.webhooks.signatureTitle')}</p>\n <SignatureHelp description={t('publishing.deployments.callbackSignature')} />\n </div>\n </div>\n </div>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DeploymentConnection } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useUpdateDeploymentConnection } from '@/api/deployments';\nimport { isConflict } from '@/api/errors';\nimport { settle } from '@/helpers/settle';\nimport {\n connectionSchema,\n regenerableSecrets,\n toConnectionValues,\n toUpdateConnectionInput,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\n\nconst editSchema = connectionSchema('edit');\n\n/**\n * Edits one version of a connection (the form is re-created when the version changes). Saves send the\n * version they started from; a 409 goes to `onConflict`. `onSaved` receives any secret the server generated\n * (replacing one it could no longer read), for the page to show once.\n */\nexport const useEditConnectionForm = (\n connection: DeploymentConnection,\n onSaved: (generatedSecrets: Record<string, string> | undefined) => void,\n onConflict: (error: unknown) => void,\n) => {\n const { t } = useTranslation();\n const update = useUpdateDeploymentConnection();\n const form = useForm<ConnectionFormValues>({\n resolver: zodResolver(editSchema),\n defaultValues: toConnectionValues(connection),\n });\n const onSubmit = form.handleSubmit(async (values) => {\n const saved = await settle(\n update.mutateAsync(\n {\n id: connection.id,\n input: toUpdateConnectionInput(values, connection.version, regenerableSecrets(connection)),\n },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.deployments.saved'));\n onSaved(saved.value.generatedSecrets);\n }\n });\n return { form, onSubmit, update, error: isConflict(update.error) ? undefined : update.error };\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { ConnectionForm } from '../../ConnectionForm';\nimport { useEditConnectionForm } from '../../hooks/useEditConnectionForm';\n\ntype EditFormProps = {\n connection: DeploymentConnection;\n /** Receives any secret the server generated on this save, to show once. */\n onSaved: (generatedSecrets: Record<string, string> | undefined) => void;\n onConflict: (error: unknown) => void;\n};\n\nexport const EditForm = ({ connection, onSaved, onConflict }: EditFormProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, update, error } = useEditConnectionForm(connection, onSaved, onConflict);\n return (\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <UnsavedChangesGuard when={form.formState.isDirty && !update.isPending} />\n <FieldGroup>\n <ConnectionForm\n control={form.control}\n mode=\"edit\"\n storedSecrets={connection.secrets}\n secretsUnreadable={connection.secretsUnreadable}\n />\n <FormError error={error} />\n <div>\n <SubmitButton pending={update.isPending} pendingLabel={t('common.saving')}>\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n );\n};\n","import type { ConnectionTestResult } from '@shapio/client';\nimport { CheckCircle2, XCircle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\n\ntype TestResultProps = { result: ConnectionTestResult };\n\n/** Each check of a connection test, passed or failed, with the provider's message. */\nexport const TestResult = ({ result }: TestResultProps) => {\n const { t } = useTranslation();\n return (\n <Alert variant={result.ok ? 'success' : 'destructive'}>\n {result.ok ? <CheckCircle2 aria-hidden=\"true\" /> : <XCircle aria-hidden=\"true\" />}\n <AlertTitle>\n {result.ok ? t('publishing.deployments.testPassed') : t('publishing.deployments.testFailed')}\n </AlertTitle>\n <AlertDescription>\n <ul className=\"space-y-1\">\n {result.checks.map((check) => (\n <li key={check.name}>\n <span className=\"font-medium\">\n {check.ok\n ? t('publishing.deployments.checkPassed', { name: check.name })\n : t('publishing.deployments.checkFailed', { name: check.name })}\n </span>\n {check.message ? <span className=\"block\">{check.message}</span> : null}\n </li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n );\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { linkOptions, useNavigate, useSearch } from '@tanstack/react-router';\nimport { Loader2, PlugZap, Rocket, Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { PROVIDER_LABELS } from '../../../constants';\nimport { EnabledChip } from '../../../EnabledChip';\nimport { useConflictReload } from '../../../hooks/useConflictReload';\nimport { usePublishingPermissions } from '../../../hooks/usePublishingPermissions';\nimport { useSecretReveal } from '../../../hooks/useSecretReveal';\nimport { CallbackHelp } from '../../CallbackHelp';\nimport { GeneratedSecretReveal } from '../../GeneratedSecretReveal';\nimport { canDeployConnection } from '../../helpers/connectionState';\nimport { useConnectionActions } from '../../hooks/useConnectionActions';\nimport { RunsList } from '../../RunsList';\nimport { SecretsUnreadableChip } from '../../SecretsUnreadableChip';\nimport { EditForm } from '../EditForm';\nimport { TestResult } from '../TestResult';\n\ntype ViewProps = { connection: DeploymentConnection };\n\n/** Nothing to open after the reveal: the connection is already on screen. */\nconst stayOnPage = () => undefined;\n\n/**\n * A loaded connection: test, trigger, its runs, the callback contract (generic) and its settings. A secret\n * the server can't read is flagged in the header (its field is empty, ready to fill); a secret the server\n * generated on save is shown once at the top.\n */\nexport const View = ({ connection }: ViewProps) => {\n const { t } = useTranslation();\n const { cursor } = useSearch({ from: '/app/publishing/deployments/$connectionId' });\n const navigate = useNavigate({ from: '/publishing/deployments/$connectionId' });\n const conflict = useConflictReload(queryKeys.publishing.deployments.connection(connection.id));\n const actions = useConnectionActions(connection);\n const { canTriggerDeployments } = usePublishingPermissions();\n const secret = useSecretReveal(stayOnPage);\n const onSaved = (generatedSecrets: Record<string, string> | undefined) => {\n conflict.clearConflict();\n const generated = generatedSecrets?.signingSecret;\n if (generated) {\n secret.reveal({ id: connection.id, secret: generated });\n }\n };\n const busy = actions.testing || actions.triggering || actions.deleting;\n const snapshot = connection.currentRun?.snapshot;\n const meta = [\n t(PROVIDER_LABELS[connection.provider]),\n snapshot != null\n ? t('publishing.deployments.liveSnapshot', { snapshot: t('publishing.snapshotNumber', { snapshot }) })\n : '',\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.deployments'), link: linkOptions({ to: '/publishing/deployments' }) },\n ]}\n title={connection.name}\n badge={\n <>\n <EnabledChip enabled={connection.enabled} />\n <SecretsUnreadableChip unreadable={connection.secretsUnreadable} />\n </>\n }\n meta={meta}\n actions={\n <>\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.deployments.deleteTitle', { name: connection.name })}\n description={t('publishing.deployments.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={actions.remove}\n trigger={\n <Button variant=\"destructive-ghost\" disabled={busy}>\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </Button>\n }\n />\n <Button variant=\"outline\" disabled={busy} onClick={actions.runTest}>\n {actions.testing ? (\n <Loader2 aria-hidden=\"true\" className=\"animate-spin motion-reduce:animate-none\" />\n ) : (\n <PlugZap aria-hidden=\"true\" />\n )}\n {t('publishing.deployments.test')}\n </Button>\n {canTriggerDeployments ? (\n <Button disabled={busy || !canDeployConnection(connection)} onClick={actions.triggerRun}>\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </>\n }\n />\n {secret.revealed ? (\n <GeneratedSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n {actions.testResult ? <TestResult result={actions.testResult} /> : null}\n <Panel title={t('publishing.deployments.runs')} flush>\n <RunsList\n connectionId={connection.id}\n cursor={cursor}\n onCursorChange={(next) => void navigate({ search: { cursor: next } })}\n />\n </Panel>\n {connection.provider === 'generic_webhook' ? (\n <Panel\n title={t('publishing.deployments.callbacks')}\n description={t('publishing.deployments.callbacksDescription')}\n >\n <CallbackHelp callbackUrl={connection.callbackUrl} />\n </Panel>\n ) : null}\n <Panel title={t('publishing.deployments.settings')} bodyClassName=\"space-y-4\">\n {conflict.conflicted ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{t('publishing.conflictReloaded')}</AlertDescription>\n </Alert>\n ) : null}\n <EditForm\n key={connection.version}\n connection={connection}\n onSaved={onSaved}\n onConflict={conflict.onSaveError}\n />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useDeploymentConnection } from '@/api/deployments';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One deployment connection. */\nexport const Connection = () => {\n const { connectionId } = useParams({ from: '/app/publishing/deployments/$connectionId' });\n const connection = useDeploymentConnection(connectionId);\n return (\n <QueryView query={connection} loadingRows={6}>\n {(data) => <View connection={data} />}\n </QueryView>\n );\n};\n","/**\n * Only http(s) links are rendered. Log and site URLs come from build callbacks and providers, so a\n * `javascript:` or `data:` URL must never become a clickable link in the admin.\n */\nexport const safeExternalUrl = (value: string | null | undefined): string | undefined => {\n if (!value) {\n return undefined;\n }\n try {\n const url = new URL(value);\n return url.protocol === 'https:' || url.protocol === 'http:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { TIMELINE_SOURCE_LABELS } from '../../../constants';\nimport { RunStatus } from '../../RunStatus';\n\ntype TimelineProps = { run: DeploymentRun };\n\n/** Every status the run went through, oldest first, with who reported it. */\nexport const Timeline = ({ run }: TimelineProps) => {\n const { t } = useTranslation();\n if (run.timeline.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">{t('publishing.deployments.timelineEmpty')}</p>;\n }\n return (\n <ol aria-label={t('publishing.deployments.timeline')} className=\"relative ml-1.5 space-y-4 border-l pl-6\">\n {run.timeline.map((event, index) => (\n <li key={`${event.at}-${index}`} className=\"relative\">\n <span\n aria-hidden=\"true\"\n className=\"absolute top-2 -left-7.5 size-2.5 rounded-full border-2 border-card bg-primary\"\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <RunStatus\n run={{\n status: event.status,\n provider: run.provider,\n completionReported: run.completionReported,\n }}\n live={false}\n />\n <time dateTime={event.at} className=\"text-sm\">\n {formatDateTime(event.at)}\n </time>\n <span className=\"text-meta text-muted-foreground\">\n {t('publishing.deployments.reportedBy', { source: t(TIMELINE_SOURCE_LABELS[event.source]) })}\n </span>\n </div>\n {event.message ? <p className=\"mt-1 text-sm break-words\">{event.message}</p> : null}\n </li>\n ))}\n </ol>\n );\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { linkOptions, useNavigate } from '@tanstack/react-router';\nimport { AlertCircle, Info, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useRetryDeploymentRun } from '@/api/deployments';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { TextLink } from '@/components/TextLink';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { ACTIVE_RUN_STATUSES } from '@/constants/publishing';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { PROVIDER_LABELS, RUN_TRIGGER_LABELS } from '../../../constants';\nimport { DetailList, type DetailItem } from '../../../DetailList';\nimport { ExternalLink } from '../../../ExternalLink';\nimport { safeExternalUrl } from '../../../helpers/safeExternalUrl';\nimport { usePublishingPermissions } from '../../../hooks/usePublishingPermissions';\nimport { RunStatus } from '../../RunStatus';\nimport { Timeline } from '../Timeline';\n\ntype ViewProps = { run: DeploymentRun };\n\n/** A loaded run: honest status, links, error, timeline and retry. */\nexport const View = ({ run }: ViewProps) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { canTriggerDeployments } = usePublishingPermissions();\n const retry = useRetryDeploymentRun();\n const none = t('common.none');\n const logUrl = safeExternalUrl(run.logUrl);\n const siteUrl = safeExternalUrl(run.siteUrl);\n const active = ACTIVE_RUN_STATUSES.has(run.status);\n const details: DetailItem[] = [\n { label: t('publishing.deployments.connection'), value: run.connectionName },\n { label: t('publishing.deployments.provider'), value: t(PROVIDER_LABELS[run.provider]) },\n { label: t('publishing.deployments.trigger'), value: t(RUN_TRIGGER_LABELS[run.trigger]) },\n {\n label: t('publishing.fields.snapshot'),\n value: run.snapshot === null ? none : t('publishing.snapshotNumber', { snapshot: run.snapshot }),\n },\n { label: t('publishing.deployments.schemaVersion'), value: run.schemaVersion ?? none },\n { label: t('publishing.deployments.providerRef'), value: run.providerRef ?? none },\n { label: t('publishing.deployments.triggeredAt'), value: formatDateTime(run.triggeredAt) || none },\n { label: t('publishing.deployments.finishedAt'), value: formatDateTime(run.finishedAt) || none },\n {\n label: t('publishing.deployments.logUrl'),\n value: logUrl ? <ExternalLink href={logUrl}>{logUrl}</ExternalLink> : none,\n },\n {\n label: t('publishing.deployments.siteUrl'),\n value: siteUrl ? <ExternalLink href={siteUrl}>{siteUrl}</ExternalLink> : none,\n },\n ];\n if (run.retryOf) {\n details.push({\n label: t('publishing.deployments.retryOf'),\n value: (\n <TextLink to=\"/publishing/deployments/runs/$runId\" params={{ runId: run.retryOf }}>\n {t('publishing.deployments.previousRun')}\n </TextLink>\n ),\n });\n }\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.deployments'), link: linkOptions({ to: '/publishing/deployments' }) },\n {\n label: run.connectionName,\n link: linkOptions({\n to: '/publishing/deployments/$connectionId',\n params: { connectionId: run.connectionId },\n }),\n },\n ]}\n title={t('publishing.deployments.runTitle', { connection: run.connectionName })}\n badge={\n <span aria-live=\"polite\">\n <RunStatus run={run} />\n </span>\n }\n meta={\n active\n ? `${formatDateTime(run.createdAt)} · ${t('publishing.deployments.watching')}`\n : formatDateTime(run.createdAt)\n }\n actions={\n canTriggerDeployments && !active ? (\n <Button\n variant=\"outline\"\n disabled={retry.isPending}\n onClick={() =>\n retry.mutate(run.id, {\n onSuccess: (next) => {\n toast.success(t('publishing.deployments.retried'));\n void navigate({ to: '/publishing/deployments/runs/$runId', params: { runId: next.id } });\n },\n })\n }\n >\n <RotateCcw aria-hidden=\"true\" />\n {t('publishing.deployments.retry')}\n </Button>\n ) : undefined\n }\n />\n {run.status === 'triggered' && !run.completionReported ? (\n <Alert variant=\"info\">\n <Info aria-hidden=\"true\" />\n <AlertDescription>{t('publishing.deployments.completionUnknown')}</AlertDescription>\n </Alert>\n ) : null}\n {run.error ? (\n <Alert variant=\"destructive\">\n <AlertCircle aria-hidden=\"true\" />\n <AlertDescription>{run.error}</AlertDescription>\n </Alert>\n ) : null}\n <Panel title={t('publishing.deployments.details')}>\n <DetailList items={details} />\n </Panel>\n <Panel title={t('publishing.deployments.timeline')}>\n <Timeline run={run} />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useDeploymentRun } from '@/api/deployments';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One deployment run, polled until it finishes. */\nexport const Run = () => {\n const { runId } = useParams({ from: '/app/publishing/deployments/runs/$runId' });\n const run = useDeploymentRun(runId);\n return (\n <QueryView query={run} loadingRows={6}>\n {(data) => <View run={data} />}\n </QueryView>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\n\ntype StatusFilterProps<TStatus extends string> = {\n id: string;\n label: string;\n value: TStatus | undefined;\n options: readonly { value: TStatus; label: string }[];\n onChange: (value: TStatus | undefined) => void;\n allLabel?: string;\n};\n\nconst ALL = '__all';\n\n/** A compact \"Status: All\" select for a table's toolbar; the label is part of the control and its name. */\nexport const StatusFilter = <TStatus extends string>({\n id,\n label,\n value,\n options,\n onChange,\n allLabel,\n}: StatusFilterProps<TStatus>) => {\n const { t } = useTranslation();\n const labelId = `${id}-label`;\n return (\n <Select\n value={value ?? ALL}\n onValueChange={(next) => onChange(options.find((option) => option.value === next)?.value)}\n >\n <SelectTrigger id={id} size=\"sm\" aria-labelledby={labelId} className=\"min-w-40\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span id={labelId} className=\"text-muted-foreground\">\n {label}\n </span>\n <SelectValue />\n </span>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>{allLabel ?? t('publishing.filters.all')}</SelectItem>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n};\n","import { PUBLICATION_ACTIONS, type PublicationAction } from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\n/** The locale select's \"no locale\" choice: non-localized models and the default locale. */\nexport const DEFAULT_LOCALE = '__default';\n\n/** Which entry (and locale) to publish or unpublish: scheduled publications. */\nexport const entryTargetShape = {\n modelKey: z.string().min(1, 'validation.selectModel'),\n entryId: requiredText(),\n locale: z.string(),\n action: z.enum(PUBLICATION_ACTIONS),\n};\n\nexport type EntryTargetValues = {\n modelKey: string;\n entryId: string;\n locale: string;\n action: PublicationAction;\n};\n\nexport const EMPTY_ENTRY_TARGET: EntryTargetValues = {\n modelKey: '',\n entryId: '',\n locale: DEFAULT_LOCALE,\n action: 'publish',\n};\n\nexport const toEntryTarget = ({ modelKey, entryId, locale, action }: EntryTargetValues) => ({\n modelKey,\n entryId: entryId.trim(),\n action,\n ...(locale === DEFAULT_LOCALE ? {} : { locale }),\n});\n","import { PUBLICATION_ACTIONS } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useLocales } from '@/api/locales';\nimport { useDefinitions } from '@/api/schema';\nimport { PUBLICATION_ACTION_LABELS } from '../constants';\nimport { DEFAULT_LOCALE } from '../helpers/entryTarget';\n\n/** Select options for the entry target fields: the models, the locales and the two actions. */\nexport const useEntryTargetOptions = () => {\n const { t } = useTranslation();\n const models = useDefinitions('model');\n const locales = useLocales();\n const modelOptions = (models.data ?? []).map(({ definition }) => ({\n value: definition.apiKey,\n label: `${definition.label} (${definition.apiKey})`,\n }));\n const localeOptions = [\n { value: DEFAULT_LOCALE, label: t('publishing.fields.defaultLocale') },\n ...(locales.data ?? []).map((locale) => ({\n value: locale.code,\n label: `${locale.label} (${locale.code})`,\n })),\n ];\n const actionOptions = PUBLICATION_ACTIONS.map((action) => ({\n value: action,\n label: t(PUBLICATION_ACTION_LABELS[action]),\n }));\n return { modelOptions, localeOptions, actionOptions };\n};\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormTextField } from '@/components/FormTextField';\nimport type { EntryTargetValues } from '../helpers/entryTarget';\nimport { useEntryTargetOptions } from '../hooks/useEntryTargetOptions';\n\ntype EntryTargetFieldsProps<TValues extends FieldValues & EntryTargetValues> = {\n control: Control<TValues>;\n};\n\n/** Model, entry ID, locale and action: the entry a scheduled publication acts on. */\nexport const EntryTargetFields = <TValues extends FieldValues & EntryTargetValues>({\n control,\n}: EntryTargetFieldsProps<TValues>) => {\n const { t } = useTranslation();\n const { modelOptions, localeOptions, actionOptions } = useEntryTargetOptions();\n const path = (name: keyof EntryTargetValues) => name as FieldPath<TValues>;\n return (\n <>\n <FormSelectField\n control={control}\n name={path('modelKey')}\n label={t('publishing.fields.model')}\n placeholder={t('publishing.fields.modelPlaceholder')}\n options={modelOptions}\n />\n <FormTextField\n control={control}\n name={path('entryId')}\n label={t('publishing.fields.entryId')}\n hint={t('publishing.fields.entryIdHint')}\n autoComplete=\"off\"\n className=\"font-mono text-sm\"\n />\n <FormSelectField\n control={control}\n name={path('locale')}\n label={t('publishing.fields.locale')}\n hint={t('publishing.fields.localeHint')}\n options={localeOptions}\n />\n <FormSelectField\n control={control}\n name={path('action')}\n label={t('publishing.fields.action')}\n options={actionOptions}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useCreateSchedule } from '@/api/schedules';\nimport { settle } from '@/helpers/settle';\nimport { dateTimeLocalField, dateTimeLocalToIso, defaultScheduleValue } from '../../helpers/dateTimeLocal';\nimport { EMPTY_ENTRY_TARGET, entryTargetShape, toEntryTarget } from '../../helpers/entryTarget';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\n\nconst createScheduleSchema = z.object({ ...entryTargetShape, runAt: dateTimeLocalField() });\n\ntype CreateScheduleValues = z.infer<typeof createScheduleSchema>;\n\nexport const useCreateScheduleForm = (open: boolean, onCreated: () => void) => {\n const createSchedule = useCreateSchedule();\n const defaults = useMemo<CreateScheduleValues>(\n () => ({ ...EMPTY_ENTRY_TARGET, runAt: open ? defaultScheduleValue() : '' }),\n [open],\n );\n const form = useForm<CreateScheduleValues>({\n resolver: zodResolver(createScheduleSchema),\n defaultValues: defaults,\n });\n useResetOnOpen(open, form.reset, defaults, createSchedule.reset);\n const onSubmit = form.handleSubmit(async ({ runAt, ...target }) => {\n const iso = dateTimeLocalToIso(runAt);\n if (!iso) {\n return;\n }\n const created = await settle(createSchedule.mutateAsync({ ...toEntryTarget(target), runAt: iso }));\n if (created.ok) {\n onCreated();\n }\n });\n return { form, onSubmit, createSchedule };\n};\n","import { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { FormSheet } from '@/components/FormSheet';\nimport { FormTextField } from '@/components/FormTextField';\nimport { EntryTargetFields } from '../../EntryTargetFields';\nimport { useCreateScheduleForm } from '../hooks/useCreateScheduleForm';\n\ntype CreateSheetProps = { open: boolean; onOpenChange: (open: boolean) => void; onCreated: () => void };\n\nexport const CreateSheet = ({ open, onOpenChange, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createSchedule } = useCreateScheduleForm(open, onCreated);\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n title={t('publishing.scheduled.createTitle')}\n dirty={form.formState.isDirty}\n pending={createSchedule.isPending}\n submitLabel={t('publishing.scheduled.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <EntryTargetFields control={form.control} />\n <FormTextField\n control={form.control}\n name=\"runAt\"\n type=\"datetime-local\"\n label={t('publishing.fields.runAt')}\n description={t('publishing.fields.localTimeHint', {\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n })}\n />\n <FormError error={createSchedule.error} />\n </FormSheet>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport type { SchedulesSearch } from '@/app/searchSchemas';\nimport { useCursorPager } from '../../hooks/useCursorPager';\n\n/** The status filter and page cursor live in the URL (bookmarkable, back-button friendly). */\nexport const useScheduledSearch = () => {\n const search = useSearch({ from: '/app/publishing/scheduled' });\n const navigate = useNavigate({ from: '/publishing/scheduled' });\n const go = (changes: Partial<SchedulesSearch>) =>\n void navigate({ search: (previous) => ({ ...previous, ...changes }) });\n const { pagerProps, resetPager } = useCursorPager(search.cursor, (cursor) => go({ cursor }));\n return {\n search,\n pagerProps,\n setStatus: (status: SchedulesSearch['status']) => {\n resetPager();\n go({ status, cursor: undefined });\n },\n };\n};\n","import type { ScheduledPublication } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Button } from '@/components/ui/button';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { PUBLICATION_ACTION_LABELS } from '../../constants';\nimport { SCHEDULE_STATUS_DISPLAY } from '../../helpers/statusDisplay';\n\ntype TableProps = {\n schedules: ScheduledPublication[];\n /** Cancels after an inline confirmation; the promise keeps it open until the request settles. */\n onCancel: (schedule: ScheduledPublication) => Promise<unknown>;\n};\n\nexport const Table = ({ schedules, onCancel }: TableProps) => {\n const { t } = useTranslation();\n return (\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.fields.entryId')}</TableHead>\n <TableHead>{t('publishing.fields.model')}</TableHead>\n <TableHead>{t('publishing.fields.locale')}</TableHead>\n <TableHead>{t('publishing.fields.action')}</TableHead>\n <TableHead>{t('publishing.fields.runAt')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n <TableHead>{t('publishing.fields.error')}</TableHead>\n <TableHead>\n <span className=\"sr-only\">{t('common.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {schedules.map((schedule) => {\n const status = SCHEDULE_STATUS_DISPLAY[schedule.status];\n return (\n <TableRow key={schedule.id}>\n <TableCell className=\"max-w-44\">\n <RowTitle className=\"block truncate font-mono text-xs\">\n <span title={schedule.entryId}>{schedule.entryId}</span>\n </RowTitle>\n </TableCell>\n <TableCell className=\"font-mono text-xs\">\n {schedule.modelKey ?? t('publishing.fields.deletedModel')}\n </TableCell>\n <TableCell className=\"font-mono text-xs\">{schedule.locale}</TableCell>\n <TableCell>{t(PUBLICATION_ACTION_LABELS[schedule.action])}</TableCell>\n <TableCell className=\"whitespace-nowrap\">{formatDateTime(schedule.runAt)}</TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n </TableCell>\n <TableCell className=\"max-w-64 whitespace-normal\">\n {schedule.error ? (\n <span className=\"text-destructive\">{schedule.error}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('common.none')}</span>\n )}\n </TableCell>\n <TableCell className=\"text-right\">\n {schedule.status === 'scheduled' ? (\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.scheduled.cancelTitle')}\n description={t('publishing.scheduled.cancelDescription', { entryId: schedule.entryId })}\n confirmLabel={t('publishing.scheduled.cancel')}\n cancelLabel={t('publishing.scheduled.keep')}\n onConfirm={() => onCancel(schedule)}\n trigger={\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={t('publishing.scheduled.cancelLabel', { entryId: schedule.entryId })}\n >\n {t('publishing.scheduled.cancel')}\n </Button>\n }\n />\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </TableRoot>\n );\n};\n","import { SCHEDULE_STATUSES, type ScheduledPublication } from '@shapio/client';\nimport { CalendarClock, CalendarPlus } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useCancelSchedule, useSchedules } from '@/api/schedules';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { QueryView } from '@/components/QueryView';\nimport { TableCard } from '@/components/TableCard';\nimport { Button } from '@/components/ui/button';\nimport { PUBLISHING_PAGE_SIZE } from '@/constants/publishing';\nimport { Header } from '../Header';\nimport { SCHEDULE_STATUS_DISPLAY } from '../helpers/statusDisplay';\nimport { StatusFilter } from '../StatusFilter';\nimport { CreateSheet } from './CreateSheet';\nimport { useScheduledSearch } from './hooks/useScheduledSearch';\nimport { Table } from './Table';\n\n/** Every scheduled publish and unpublish, with its outcome once it has run. */\nexport const Scheduled = () => {\n const { t } = useTranslation();\n const { search, pagerProps, setStatus } = useScheduledSearch();\n const schedules = useSchedules({\n status: search.status,\n cursor: search.cursor,\n limit: PUBLISHING_PAGE_SIZE,\n });\n const cancel = useCancelSchedule();\n const [creating, setCreating] = useState(false);\n const cancelSchedule = (schedule: ScheduledPublication) =>\n cancel.mutateAsync(schedule.id, {\n onSuccess: () => toast.success(t('publishing.scheduled.cancelled')),\n });\n const statusOptions = SCHEDULE_STATUSES.map((status) => ({\n value: status,\n label: t(SCHEDULE_STATUS_DISPLAY[status].labelKey),\n }));\n const filters = (\n <div role=\"search\" className=\"flex flex-wrap items-center gap-2\">\n <StatusFilter\n id=\"scheduled-status\"\n label={t('publishing.fields.status')}\n value={search.status}\n options={statusOptions}\n onChange={setStatus}\n />\n </div>\n );\n return (\n <Page>\n <Header\n actions={\n <Button onClick={() => setCreating(true)}>\n <CalendarPlus aria-hidden=\"true\" />\n {t('publishing.scheduled.create')}\n </Button>\n }\n />\n <QueryView\n query={schedules}\n loadingRows={6}\n isEmpty={(data) => data.items.length === 0 && search.cursor === undefined && !search.status}\n empty={<EmptyState icon={CalendarClock} title={t('publishing.scheduled.empty')} />}\n >\n {(data) => (\n <TableCard toolbar={filters} footer={<CursorPager {...pagerProps(data.nextCursor)} />}>\n {data.items.length === 0 ? (\n <EmptyState icon={CalendarClock} size=\"panel\" title={t('publishing.scheduled.noMatches')} />\n ) : (\n <Table schedules={data.items} onCancel={cancelSchedule} />\n )}\n </TableCard>\n )}\n </QueryView>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCreated={() => {\n setCreating(false);\n toast.success(t('publishing.scheduled.created'));\n }}\n />\n </Page>\n );\n};\n","import type { WebhookEventType } from '@shapio/client';\n\nexport type EventGroup = { group: string; types: string[] };\n\n/** `content.*`: every event of a group, including ones added in later Shapio versions. */\nexport const groupPattern = (group: string) => `${group}.*`;\n\n/** The catalogue grouped for display, in the server's order. */\nexport const groupEvents = (events: readonly WebhookEventType[]): EventGroup[] => {\n const groups = new Map<string, string[]>();\n for (const { type, group } of events) {\n groups.set(group, [...(groups.get(group) ?? []), type]);\n }\n return [...groups].map(([group, types]) => ({ group, types }));\n};\n\n/** Selecting a whole group replaces its individual types with the pattern (the server would match both). */\nexport const toggleGroup = (selected: readonly string[], { group, types }: EventGroup, checked: boolean) => {\n const pattern = groupPattern(group);\n const others = selected.filter((value) => value !== pattern && !types.includes(value));\n return checked ? [...others, pattern] : others;\n};\n\nexport const toggleEvent = (selected: readonly string[], type: string, checked: boolean) =>\n checked\n ? [...selected.filter((value) => value !== type), type]\n : selected.filter((value) => value !== type);\n","import { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useWebhookEvents } from '@/api/webhooks';\nimport { ErrorState } from '@/components/ErrorState';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { InfoHint } from '@/components/InfoHint';\nimport { LoadingState } from '@/components/LoadingState';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldLabel, FieldLegend, FieldSet } from '@/components/ui/field';\nimport { groupEvents, groupPattern, toggleEvent, toggleGroup } from '../../helpers/webhookEvents';\nimport type { WebhookFormValues } from '../helpers';\n\ntype EventsFieldProps = { control: Control<WebhookFormValues> };\n\n/** The events a webhook receives, grouped; \"all <group> events\" subscribes to future ones too. */\nexport const EventsField = ({ control }: EventsFieldProps) => {\n const { t } = useTranslation();\n const catalogue = useWebhookEvents();\n const { field, fieldState } = useController({ control, name: 'events' });\n const selected = field.value;\n if (catalogue.isPending) {\n return <LoadingState rows={2} />;\n }\n if (catalogue.isError) {\n return <ErrorState error={catalogue.error} onRetry={() => void catalogue.refetch()} />;\n }\n return (\n <FieldSet data-invalid={fieldState.invalid || undefined} aria-labelledby=\"webhook-events-title\">\n <FieldLegend variant=\"label\" className=\"flex items-center gap-1\">\n <span id=\"webhook-events-title\">{t('publishing.webhooks.events')}</span>\n <InfoHint about={t('publishing.webhooks.events')}>{t('publishing.webhooks.eventsHint')}</InfoHint>\n </FieldLegend>\n <div className=\"space-y-4\">\n {groupEvents(catalogue.data).map((group) => {\n const groupSelected = selected.includes(groupPattern(group.group));\n const groupId = `webhook-events-${group.group}`;\n return (\n <fieldset key={group.group} className=\"space-y-2 rounded-lg border p-3\">\n <legend className=\"px-1 font-mono text-xs font-semibold\">{group.group}</legend>\n <Field orientation=\"horizontal\">\n <Checkbox\n id={groupId}\n checked={groupSelected}\n onCheckedChange={(checked) =>\n field.onChange(toggleGroup(selected, group, checked === true))\n }\n onBlur={field.onBlur}\n />\n <FieldLabel htmlFor={groupId} className=\"font-medium\">\n {t('publishing.webhooks.allGroupEvents', { group: group.group })}\n </FieldLabel>\n </Field>\n <div className=\"grid gap-2 pl-6 sm:grid-cols-2\">\n {group.types.map((type) => {\n const id = `webhook-event-${type}`;\n return (\n <Field key={type} orientation=\"horizontal\">\n <Checkbox\n id={id}\n checked={groupSelected || selected.includes(type)}\n disabled={groupSelected}\n onCheckedChange={(checked) =>\n field.onChange(toggleEvent(selected, type, checked === true))\n }\n onBlur={field.onBlur}\n />\n <FieldLabel htmlFor={id} className=\"font-mono text-xs font-normal\">\n {type}\n </FieldLabel>\n </Field>\n );\n })}\n </div>\n </fieldset>\n );\n })}\n </div>\n <FormFieldError message={fieldState.error?.message} />\n </FieldSet>\n );\n};\n","import type { CreateWebhookInput, Webhook } from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\nexport const MAX_ATTEMPTS_RANGE = { min: 1, max: 20 } as const;\n\nconst DEFAULT_MAX_ATTEMPTS = 8;\n\nconst inRange = (value: string) =>\n /^\\d+$/.test(value) && Number(value) >= MAX_ATTEMPTS_RANGE.min && Number(value) <= MAX_ATTEMPTS_RANGE.max;\n\nexport const webhookSchema = z.object({\n name: requiredText().max(200, 'validation.tooLong'),\n url: z\n .string()\n .trim()\n .min(1, 'validation.required')\n .pipe(z.url({ protocol: /^https?$/, error: 'validation.url' })),\n events: z.array(z.string()).min(1, 'validation.selectEvents'),\n enabled: z.boolean(),\n allowPrivateNetwork: z.boolean(),\n maxAttempts: z.string().trim().refine(inRange, 'validation.maxAttempts'),\n /** Chosen on create only (fixed afterwards): `site` this site's events, `network` every site's. */\n scope: z.enum(['site', 'network']),\n});\n\nexport type WebhookFormValues = z.infer<typeof webhookSchema>;\n\nexport const EMPTY_WEBHOOK: WebhookFormValues = {\n name: '',\n url: '',\n events: [],\n enabled: true,\n allowPrivateNetwork: false,\n maxAttempts: String(DEFAULT_MAX_ATTEMPTS),\n scope: 'site',\n};\n\nexport const toWebhookValues = (webhook: Webhook): WebhookFormValues => ({\n name: webhook.name,\n url: webhook.url,\n events: webhook.events,\n enabled: webhook.enabled,\n allowPrivateNetwork: webhook.allowPrivateNetwork,\n maxAttempts: String(webhook.maxAttempts),\n scope: webhook.site === null ? 'network' : 'site',\n});\n\nexport const toWebhookInput = (values: WebhookFormValues): CreateWebhookInput => ({\n name: values.name.trim(),\n url: values.url.trim(),\n events: values.events,\n enabled: values.enabled,\n allowPrivateNetwork: values.allowPrivateNetwork,\n maxAttempts: Number(values.maxAttempts),\n});\n","import type { Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { EventsField } from '../EventsField';\nimport { MAX_ATTEMPTS_RANGE, type WebhookFormValues } from '../helpers';\n\ntype FieldsProps = { control: Control<WebhookFormValues> };\n\n/** A webhook's settings, shared by the create sheet and the edit form. */\nexport const Fields = ({ control }: FieldsProps) => {\n const { t } = useTranslation();\n return (\n <>\n <FormTextField control={control} name=\"name\" label={t('publishing.webhooks.name')} autoComplete=\"off\" />\n <FormTextField\n control={control}\n name=\"url\"\n type=\"url\"\n label={t('publishing.webhooks.url')}\n placeholder={t('publishing.webhooks.urlPlaceholder')}\n autoComplete=\"off\"\n />\n <EventsField control={control} />\n <FormTextField\n control={control}\n name=\"maxAttempts\"\n type=\"number\"\n inputMode=\"numeric\"\n min={MAX_ATTEMPTS_RANGE.min}\n max={MAX_ATTEMPTS_RANGE.max}\n label={t('publishing.webhooks.maxAttempts')}\n hint={t('publishing.webhooks.maxAttemptsHint')}\n className=\"w-32\"\n />\n <FormSwitchField control={control} name=\"enabled\" label={t('publishing.webhooks.enabled')} />\n <FormSwitchField\n control={control}\n name=\"allowPrivateNetwork\"\n label={t('publishing.fields.allowPrivateNetwork')}\n hint={t('publishing.fields.allowPrivateNetworkHint')}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { WebhookWithSecret } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useCreateWebhook } from '@/api/webhooks';\nimport { settle } from '@/helpers/settle';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\nimport { EMPTY_WEBHOOK, toWebhookInput, webhookSchema, type WebhookFormValues } from '../helpers';\n\nexport const useCreateWebhookForm = (open: boolean, onCreated: (created: WebhookWithSecret) => void) => {\n const createWebhook = useCreateWebhook();\n const form = useForm<WebhookFormValues>({\n resolver: zodResolver(webhookSchema),\n defaultValues: EMPTY_WEBHOOK,\n });\n useResetOnOpen(open, form.reset, EMPTY_WEBHOOK, createWebhook.reset);\n const onSubmit = form.handleSubmit(async (values) => {\n const created = await settle(\n createWebhook.mutateAsync({ ...toWebhookInput(values), network: values.scope === 'network' }),\n );\n if (created.ok) {\n form.reset(EMPTY_WEBHOOK);\n onCreated(created.value);\n }\n });\n return { form, onSubmit, createWebhook };\n};\n","import type { WebhookWithSecret } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useMe } from '@/api/auth';\nimport { FormError } from '@/components/FormError';\nimport { FormRadioGroup } from '@/components/FormRadioGroup';\nimport { FormSheet } from '@/components/FormSheet';\nimport { canSeeNetwork } from '@/helpers/sites';\nimport { Fields } from '../Fields';\nimport { useCreateWebhookForm } from '../hooks/useCreateWebhookForm';\n\ntype CreateSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Lets the page keep focus on the secret it reveals when the sheet closes. */\n onCloseAutoFocus: (event: Event) => void;\n onCreated: (created: WebhookWithSecret) => void;\n};\n\nexport const CreateSheet = ({ open, onOpenChange, onCloseAutoFocus, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createWebhook } = useCreateWebhookForm(open, onCreated);\n const { data: me } = useMe();\n // A network webhook needs `webhooks.manage` on every site; `me` can't say that exactly, so it is offered to\n // network admins and the server's answer (403) is shown if it refuses.\n const scopeOptions = [\n { value: 'site', label: t('publishing.webhooks.scopeSite', { name: me?.site.name ?? '' }) },\n { value: 'network', label: t('sites.everySite'), description: t('publishing.webhooks.scopeNetwork') },\n ];\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n onCloseAutoFocus={onCloseAutoFocus}\n title={t('publishing.webhooks.createTitle')}\n dirty={form.formState.isDirty}\n pending={createWebhook.isPending}\n submitLabel={t('common.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <Fields control={form.control} />\n {canSeeNetwork(me) ? (\n <FormRadioGroup\n control={form.control}\n name=\"scope\"\n legend={t('publishing.webhooks.scope')}\n options={scopeOptions}\n />\n ) : null}\n <FormError error={createWebhook.error} />\n </FormSheet>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { SecretReveal } from '@/components/SecretReveal';\nimport { SignatureHelp } from '../../SignatureHelp';\n\ntype SigningSecretRevealProps = { secret: string; onDismiss: () => void };\n\n/** A webhook's signing secret, shown once at the top of the page after creating it or rotating it. */\nexport const SigningSecretReveal = ({ secret, onDismiss }: SigningSecretRevealProps) => {\n const { t } = useTranslation();\n return (\n <SecretReveal\n title={t('publishing.webhooks.secretTitle')}\n description={t('publishing.webhooks.secretDescription')}\n label={t('publishing.webhooks.secretLabel')}\n secret={secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={onDismiss}\n hint={<SignatureHelp description={t('publishing.webhooks.signatureDescription')} />}\n />\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '@/components/ui/badge';\n\ntype SiteBadgeProps = { webhook: Pick<Webhook, 'site'> };\n\n/** \"Every site\" on a network webhook (it receives every site's events); nothing on this site's own. */\nexport const SiteBadge = ({ webhook }: SiteBadgeProps) => {\n const { t } = useTranslation();\n return webhook.site === null ? <Badge variant=\"secondary\">{t('sites.everySite')}</Badge> : null;\n};\n","import type { Webhook } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { TableCard } from '@/components/TableCard';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { EnabledChip } from '../../EnabledChip';\nimport { DELIVERY_STATUS_DISPLAY } from '../../helpers/statusDisplay';\nimport { SiteBadge } from '../SiteBadge';\n\ntype TableProps = { webhooks: Webhook[] };\n\nexport const Table = ({ webhooks }: TableProps) => {\n const { t } = useTranslation();\n return (\n <TableCard>\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.webhooks.name')}</TableHead>\n <TableHead>{t('publishing.webhooks.url')}</TableHead>\n <TableHead>{t('publishing.webhooks.state')}</TableHead>\n <TableHead>{t('publishing.webhooks.lastDelivery')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {webhooks.map((webhook) => {\n const last = webhook.lastDelivery\n ? DELIVERY_STATUS_DISPLAY[webhook.lastDelivery.status]\n : undefined;\n return (\n <TableRow key={webhook.id}>\n <TableCell className=\"max-w-64\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <RowTitle asChild className=\"block truncate\">\n <Link to=\"/publishing/webhooks/$webhookId\" params={{ webhookId: webhook.id }}>\n {webhook.name}\n </Link>\n </RowTitle>\n <SiteBadge webhook={webhook} />\n </span>\n </TableCell>\n <TableCell className=\"max-w-72\">\n <span\n className=\"block truncate font-mono text-xs text-muted-foreground\"\n title={webhook.url}\n >\n {webhook.url}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"flex flex-wrap items-center gap-2\">\n <EnabledChip enabled={webhook.enabled} />\n {webhook.secretsUnreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.webhooks.secretUnreadable')} />\n ) : null}\n </span>\n </TableCell>\n <TableCell>\n {webhook.lastDelivery && last ? (\n <span className=\"flex flex-wrap items-center gap-2\">\n <StatusChip tone={last.tone} label={t(last.labelKey)} />\n <span\n className=\"text-meta whitespace-nowrap text-muted-foreground\"\n title={formatDateTime(webhook.lastDelivery.at)}\n >\n {formatRelativeTime(webhook.lastDelivery.at)}\n </span>\n </span>\n ) : (\n <span className=\"text-muted-foreground\">{t('common.never')}</span>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </TableRoot>\n </TableCard>\n );\n};\n","import { useNavigate } from '@tanstack/react-router';\nimport { Plus, Webhook as WebhookIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useWebhooks } from '@/api/webhooks';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { QueryView } from '@/components/QueryView';\nimport { Button } from '@/components/ui/button';\nimport { Header } from '../Header';\nimport { useSecretReveal } from '../hooks/useSecretReveal';\nimport { CreateSheet } from './CreateSheet';\nimport { SigningSecretReveal } from './SigningSecretReveal';\nimport { Table } from './Table';\n\n/** Outgoing webhooks: signed HTTP notifications of content, change set and deployment events. */\nexport const Webhooks = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const webhooks = useWebhooks();\n const [creating, setCreating] = useState(false);\n // The new webhook's secret is shown here, then the webhook opens.\n const secret = useSecretReveal(\n (webhookId) => void navigate({ to: '/publishing/webhooks/$webhookId', params: { webhookId } }),\n );\n return (\n <Page>\n <Header\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus aria-hidden=\"true\" />\n {t('publishing.webhooks.create')}\n </Button>\n }\n />\n {secret.revealed ? (\n <SigningSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n <QueryView\n query={webhooks}\n isEmpty={(data) => data.length === 0}\n empty={<EmptyState icon={WebhookIcon} title={t('publishing.webhooks.empty')} />}\n >\n {(data) => <Table webhooks={data} />}\n </QueryView>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCloseAutoFocus={secret.keepFocusOnReveal}\n onCreated={({ webhook, secret: signingSecret }) => {\n setCreating(false);\n secret.reveal({ id: webhook.id, secret: signingSecret });\n }}\n />\n </Page>\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useDeleteWebhook, useRotateWebhookSecret, useTestWebhook, useUpdateWebhook } from '@/api/webhooks';\n\n/**\n * Send test, enable/disable, rotate the secret (shown once) and delete, each with its notification. Rotate\n * and delete return their promise, so their inline confirmation stays open until the request settles.\n */\nexport const useWebhookActions = (webhook: Webhook, onConflict: (error: unknown) => void) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const test = useTestWebhook();\n const update = useUpdateWebhook();\n const rotate = useRotateWebhookSecret();\n const remove = useDeleteWebhook();\n const [secret, setSecret] = useState<string | undefined>(undefined);\n return {\n secret,\n clearSecret: () => setSecret(undefined),\n testing: test.isPending,\n pending: update.isPending || rotate.isPending || remove.isPending,\n sendTest: () =>\n test.mutate(webhook.id, { onSuccess: () => toast.success(t('publishing.webhooks.testQueued')) }),\n toggleEnabled: () =>\n update.mutate(\n { id: webhook.id, input: { enabled: !webhook.enabled, expectedVersion: webhook.version } },\n {\n onSuccess: (saved) =>\n toast.success(\n saved.enabled ? t('publishing.webhooks.enabledToast') : t('publishing.webhooks.disabledToast'),\n ),\n onError: onConflict,\n },\n ),\n rotateSecret: () => rotate.mutateAsync(webhook.id, { onSuccess: (rotated) => setSecret(rotated.secret) }),\n remove: () =>\n remove.mutateAsync(webhook.id, {\n onSuccess: () => {\n toast.success(t('publishing.webhooks.deleted', { name: webhook.name }));\n void navigate({ to: '/publishing/webhooks' });\n },\n }),\n };\n};\n","type HeaderListProps = { headers: Record<string, string>; label: string };\n\n/** HTTP headers as name: value lines. */\nexport const HeaderList = ({ headers, label }: HeaderListProps) => (\n <dl aria-label={label} className=\"space-y-0.5 rounded-md border bg-muted p-2 font-mono text-xs break-all\">\n {Object.entries(headers).map(([name, value]) => (\n <div key={name}>\n <dt className=\"inline font-semibold\">{name}</dt>\n <dd className=\"inline before:content-[':_']\">{value}</dd>\n </div>\n ))}\n </dl>\n);\n","import { StatusChip, type StatusTone } from '@/components/StatusChip';\n\ntype ResponseCodeProps = { status: number; label?: string };\n\nconst SUCCESS_MIN = 200;\nconst REDIRECT_MIN = 300;\nconst CLIENT_ERROR_MIN = 400;\n\nconst toneOf = (status: number): StatusTone =>\n status >= SUCCESS_MIN && status < REDIRECT_MIN\n ? 'success'\n : status < CLIENT_ERROR_MIN\n ? 'warning'\n : 'danger';\n\n/** An HTTP response code as a chip: 2xx green, 3xx amber, 4xx and 5xx red. */\nexport const ResponseCode = ({ status, label }: ResponseCodeProps) => (\n <StatusChip tone={toneOf(status)} label={label ?? String(status)} size=\"sm\" className=\"font-mono\" />\n);\n","import type { WebhookAttempt } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { JsonBlock } from '../../../JsonBlock';\nimport { HeaderList } from '../HeaderList';\nimport { ResponseCode } from '../ResponseCode';\n\ntype AttemptProps = { attempt: WebhookAttempt };\n\n/** One delivery attempt: the request sent and the response (or why none arrived). */\nexport const Attempt = ({ attempt }: AttemptProps) => {\n const { t } = useTranslation();\n const { request, response } = attempt;\n return (\n <li className=\"space-y-3 rounded-lg border bg-card p-4\">\n <p className=\"text-sm font-medium\">\n {t('publishing.webhooks.attemptHeading', {\n attempt: attempt.attempt,\n at: formatDateTime(attempt.at),\n duration: attempt.durationMs,\n })}\n </p>\n <div className=\"grid gap-3 lg:grid-cols-2\">\n <section className=\"min-w-0 space-y-1\">\n <h4 className=\"text-xs font-semibold text-muted-foreground\">{t('publishing.webhooks.request')}</h4>\n <p className=\"font-mono text-xs break-all\">{`${request.method} ${request.url}`}</p>\n <HeaderList headers={request.headers} label={t('publishing.webhooks.requestHeaders')} />\n </section>\n <section className=\"min-w-0 space-y-1\">\n <h4 className=\"text-xs font-semibold text-muted-foreground\">{t('publishing.webhooks.response')}</h4>\n {response ? (\n <>\n <ResponseCode\n status={response.status}\n label={t('publishing.webhooks.httpStatus', { status: response.status })}\n />\n <JsonBlock\n value={response.body}\n label={t('publishing.webhooks.responseBody')}\n className=\"max-h-40\"\n />\n {response.truncated ? (\n <p className=\"text-xs text-muted-foreground\">{t('publishing.webhooks.bodyTruncated')}</p>\n ) : null}\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('publishing.webhooks.noResponse')}</p>\n )}\n {attempt.error ? <p className=\"text-sm text-destructive\">{attempt.error}</p> : null}\n </section>\n </div>\n </li>\n );\n};\n","import type { WebhookDelivery } from '@shapio/client';\nimport { ChevronDown, ChevronRight, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { TableCell, TableRow } from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { DELIVERY_STATUS_DISPLAY } from '../../../helpers/statusDisplay';\nimport { Attempt } from '../Attempt';\nimport { ResponseCode } from '../ResponseCode';\n\ntype DeliveryProps = {\n delivery: WebhookDelivery;\n expanded: boolean;\n onToggle: () => void;\n onRedeliver: () => void;\n redelivering: boolean;\n};\n\nconst DELIVERY_COLUMNS = 7;\n\n/** A delivery row and, when expanded, its attempt log. */\nexport const Delivery = ({ delivery, expanded, onToggle, onRedeliver, redelivering }: DeliveryProps) => {\n const { t } = useTranslation();\n const status = DELIVERY_STATUS_DISPLAY[delivery.status];\n const detailsId = `delivery-${delivery.id}`;\n return (\n <>\n <TableRow>\n <TableCell className=\"w-10\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-expanded={expanded}\n aria-controls={expanded ? detailsId : undefined}\n aria-label={t('publishing.webhooks.toggleAttempts', { event: delivery.eventType })}\n onClick={onToggle}\n >\n {expanded ? <ChevronDown aria-hidden=\"true\" /> : <ChevronRight aria-hidden=\"true\" />}\n </Button>\n </TableCell>\n <TableCell>\n <span className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs font-semibold\">{delivery.eventType}</span>\n {delivery.isTest ? <Badge variant=\"outline\">{t('publishing.webhooks.testBadge')}</Badge> : null}\n </span>\n </TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n </TableCell>\n <TableCell>\n {delivery.lastResponseStatus === null ? (\n <span className=\"text-muted-foreground\">{t('common.none')}</span>\n ) : (\n <ResponseCode status={delivery.lastResponseStatus} />\n )}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">{delivery.attempts}</TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(delivery.createdAt)}>\n {formatRelativeTime(delivery.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={redelivering}\n aria-label={t('publishing.webhooks.redeliverLabel', { event: delivery.eventType })}\n onClick={onRedeliver}\n >\n <RotateCcw aria-hidden=\"true\" />\n {t('publishing.webhooks.redeliver')}\n </Button>\n </TableCell>\n </TableRow>\n {expanded ? (\n <TableRow className=\"hover:bg-transparent\">\n <TableCell colSpan={DELIVERY_COLUMNS} className=\"bg-muted/40 whitespace-normal\">\n <div id={detailsId} className=\"space-y-3 py-2\">\n {delivery.lastError ? (\n <p className=\"text-meta text-destructive\">\n {t('publishing.webhooks.lastErrorValue', { error: delivery.lastError })}\n </p>\n ) : null}\n {delivery.attemptLog.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{t('publishing.webhooks.noAttempts')}</p>\n ) : (\n <ol className=\"space-y-3\">\n {delivery.attemptLog.map((attempt) => (\n <Attempt key={attempt.attempt} attempt={attempt} />\n ))}\n </ol>\n )}\n </div>\n </TableCell>\n </TableRow>\n ) : null}\n </>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport { Inbox } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useRedeliverWebhook, useWebhookDeliveries } from '@/api/webhooks';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Panel } from '@/components/Panel';\nimport { QueryView } from '@/components/QueryView';\nimport { Table, TableBody, TableHead, TableHeader, TableRow } from '@/components/ui/table';\nimport { useCursorPager } from '../../../hooks/useCursorPager';\nimport { Delivery } from '../Delivery';\n\ntype DeliveriesProps = { webhookId: string };\n\n/** The delivery log, newest first, polled while deliveries are still being attempted. */\nexport const Deliveries = ({ webhookId }: DeliveriesProps) => {\n const { t } = useTranslation();\n const { cursor } = useSearch({ from: '/app/publishing/webhooks/$webhookId' });\n const navigate = useNavigate({ from: '/publishing/webhooks/$webhookId' });\n const { pagerProps } = useCursorPager(cursor, (next) => void navigate({ search: { cursor: next } }));\n const deliveries = useWebhookDeliveries(webhookId, cursor);\n const redeliver = useRedeliverWebhook();\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(new Set());\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (!next.delete(id)) {\n next.add(id);\n }\n return next;\n });\n return (\n <Panel title={t('publishing.webhooks.deliveries')} flush>\n <QueryView\n query={deliveries}\n isEmpty={(data) => data.items.length === 0 && cursor === undefined}\n empty={<EmptyState icon={Inbox} size=\"panel\" title={t('publishing.webhooks.noDeliveries')} />}\n >\n {(data) => (\n <>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-12\">\n <span className=\"sr-only\">{t('publishing.webhooks.attemptLog')}</span>\n </TableHead>\n <TableHead>{t('publishing.webhooks.eventType')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n <TableHead>{t('publishing.webhooks.lastResponse')}</TableHead>\n <TableHead className=\"text-right\">{t('publishing.webhooks.attempts')}</TableHead>\n <TableHead>{t('publishing.fields.created')}</TableHead>\n <TableHead>\n <span className=\"sr-only\">{t('common.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.items.map((delivery) => (\n <Delivery\n key={delivery.id}\n delivery={delivery}\n expanded={expanded.has(delivery.id)}\n onToggle={() => toggle(delivery.id)}\n redelivering={redeliver.isPending}\n onRedeliver={() =>\n redeliver.mutate(\n { id: webhookId, deliveryId: delivery.id },\n { onSuccess: () => toast.success(t('publishing.webhooks.redelivered')) },\n )\n }\n />\n ))}\n </TableBody>\n </Table>\n <CursorPager {...pagerProps(data.nextCursor)} className=\"border-t px-4 py-2.5\" />\n </>\n )}\n </QueryView>\n </Panel>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { Webhook } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { isConflict } from '@/api/errors';\nimport { useUpdateWebhook } from '@/api/webhooks';\nimport { settle } from '@/helpers/settle';\nimport { toWebhookInput, toWebhookValues, webhookSchema, type WebhookFormValues } from '../helpers';\n\n/**\n * Edits one version of a webhook (the form is re-created when the version changes). Saves send the\n * version they started from; a 409 goes to `onConflict`.\n */\nexport const useEditWebhookForm = (\n webhook: Webhook,\n onSaved: () => void,\n onConflict: (error: unknown) => void,\n) => {\n const { t } = useTranslation();\n const update = useUpdateWebhook();\n const form = useForm<WebhookFormValues>({\n resolver: zodResolver(webhookSchema),\n defaultValues: toWebhookValues(webhook),\n });\n const onSubmit = form.handleSubmit(async (values) => {\n const saved = await settle(\n update.mutateAsync(\n { id: webhook.id, input: { ...toWebhookInput(values), expectedVersion: webhook.version } },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.webhooks.saved'));\n onSaved();\n }\n });\n return { form, onSubmit, update, error: isConflict(update.error) ? undefined : update.error };\n};\n","import type { Webhook } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { Fields } from '../../Fields';\nimport { useEditWebhookForm } from '../../hooks/useEditWebhookForm';\n\ntype EditFormProps = { webhook: Webhook; onSaved: () => void; onConflict: (error: unknown) => void };\n\nexport const EditForm = ({ webhook, onSaved, onConflict }: EditFormProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, update, error } = useEditWebhookForm(webhook, onSaved, onConflict);\n return (\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <UnsavedChangesGuard when={form.formState.isDirty && !update.isPending} />\n <FieldGroup>\n <Fields control={form.control} />\n <FormError error={error} />\n <div>\n <SubmitButton pending={update.isPending} pendingLabel={t('common.saving')}>\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { linkOptions } from '@tanstack/react-router';\nimport { KeyRound, Power, Send, Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { EnabledChip } from '../../../EnabledChip';\nimport { useConflictReload } from '../../../hooks/useConflictReload';\nimport { SignatureHelp } from '../../../SignatureHelp';\nimport { useWebhookActions } from '../../hooks/useWebhookActions';\nimport { SigningSecretReveal } from '../../SigningSecretReveal';\nimport { SiteBadge } from '../../SiteBadge';\nimport { Deliveries } from '../Deliveries';\nimport { EditForm } from '../EditForm';\n\ntype ViewProps = { webhook: Webhook };\n\n/** A loaded webhook: actions, the delivery log, its settings and how receivers verify requests. */\nexport const View = ({ webhook }: ViewProps) => {\n const { t } = useTranslation();\n const conflict = useConflictReload(queryKeys.publishing.webhooks.webhook(webhook.id));\n const actions = useWebhookActions(webhook, conflict.onSaveError);\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.webhooks'), link: linkOptions({ to: '/publishing/webhooks' }) },\n ]}\n title={webhook.name}\n badge={\n <span className=\"flex items-center gap-2\">\n <EnabledChip enabled={webhook.enabled} />\n {webhook.secretsUnreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.webhooks.secretUnreadable')} />\n ) : null}\n <SiteBadge webhook={webhook} />\n </span>\n }\n meta={<span className=\"font-mono text-xs break-all\">{webhook.url}</span>}\n actions={\n <>\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.webhooks.deleteTitle', { name: webhook.name })}\n description={t('publishing.webhooks.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={actions.remove}\n trigger={\n <Button variant=\"destructive-ghost\" disabled={actions.pending}>\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </Button>\n }\n />\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.webhooks.rotateTitle')}\n description={t('publishing.webhooks.rotateDescription')}\n confirmLabel={t('publishing.webhooks.rotateSecret')}\n onConfirm={actions.rotateSecret}\n // The new secret's reveal takes focus (its Copy button); don't pull it back to this button.\n onCloseAutoFocus={(event) => {\n if (actions.secret) {\n event.preventDefault();\n }\n }}\n trigger={\n // The repair for an unreadable secret, so it becomes the main action until then.\n <Button\n variant={webhook.secretsUnreadable ? 'default' : 'outline'}\n disabled={actions.pending}\n >\n <KeyRound aria-hidden=\"true\" />\n {t('publishing.webhooks.rotateSecret')}\n </Button>\n }\n />\n <Button variant=\"outline\" disabled={actions.pending} onClick={actions.toggleEnabled}>\n <Power aria-hidden=\"true\" />\n {webhook.enabled ? t('publishing.webhooks.disable') : t('publishing.webhooks.enable')}\n </Button>\n <Button\n variant={webhook.secretsUnreadable ? 'outline' : 'default'}\n disabled={actions.testing || !webhook.enabled || webhook.secretsUnreadable}\n onClick={actions.sendTest}\n >\n <Send aria-hidden=\"true\" />\n {t('publishing.webhooks.sendTest')}\n </Button>\n </>\n }\n />\n {actions.secret ? (\n <SigningSecretReveal secret={actions.secret} onDismiss={actions.clearSecret} />\n ) : null}\n {conflict.conflicted ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{t('publishing.conflictReloaded')}</AlertDescription>\n </Alert>\n ) : null}\n <Deliveries webhookId={webhook.id} />\n <Panel title={t('publishing.webhooks.settings')}>\n <EditForm\n key={webhook.version}\n webhook={webhook}\n onSaved={conflict.clearConflict}\n onConflict={conflict.onSaveError}\n />\n </Panel>\n <Panel title={t('publishing.webhooks.signatureTitle')}>\n <SignatureHelp description={t('publishing.webhooks.signatureDescription')} />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useWebhook } from '@/api/webhooks';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One webhook: send a test, its delivery log, settings, secret rotation and deletion. */\nexport const Detail = () => {\n const { webhookId } = useParams({ from: '/app/publishing/webhooks/$webhookId' });\n const webhook = useWebhook(webhookId);\n return (\n <QueryView query={webhook} loadingRows={6}>\n {(data) => <View webhook={data} />}\n </QueryView>\n );\n};\n","import { createLazyRoute } from '@tanstack/react-router';\nimport { Publishing } from '@/features/Publishing';\nimport { Deployments } from '@/features/Publishing/Deployments';\nimport { Connection } from '@/features/Publishing/Deployments/Connection';\nimport { Run } from '@/features/Publishing/Deployments/Run';\nimport { Scheduled } from '@/features/Publishing/Scheduled';\nimport { Webhooks } from '@/features/Publishing/Webhooks';\nimport { Detail as WebhookDetail } from '@/features/Publishing/Webhooks/Detail';\n\n/** Every publishing screen, loaded together on the first visit to Publishing. */\nexport const publishingLazyRoutes = {\n publishing: createLazyRoute('/app/publishing')({ component: Publishing }),\n scheduled: createLazyRoute('/app/publishing/scheduled')({ component: Scheduled }),\n deployments: createLazyRoute('/app/publishing/deployments')({ component: Deployments }),\n connection: createLazyRoute('/app/publishing/deployments/$connectionId')({ component: Connection }),\n run: createLazyRoute('/app/publishing/deployments/runs/$runId')({ component: Run }),\n webhooks: createLazyRoute('/app/publishing/webhooks')({ component: Webhooks }),\n webhook: createLazyRoute('/app/publishing/webhooks/$webhookId')({ component: WebhookDetail }),\n};\n"],"ignoreList":[0,1,2],"mappings":"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"}
|