@shapio/cms 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/admin/assets/{AssetTile-CoNClUYS.js → AssetTile-zOf0K0nN.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-CoNClUYS.js.map → AssetTile-zOf0K0nN.js.map} +1 -1
  3. package/dist/admin/assets/{AssistError-BoejyShH.js → AssistError-D_vY2CO0.js} +2 -2
  4. package/dist/admin/assets/{AssistError-BoejyShH.js.map → AssistError-D_vY2CO0.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-B2Jugisa.js → BlockMenuItems-BEnSpClj.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-B2Jugisa.js.map → BlockMenuItems-BEnSpClj.js.map} +1 -1
  7. package/dist/admin/assets/{Body-D3GwLGaB.js → Body-B_IVN5wp.js} +2 -2
  8. package/dist/admin/assets/{Body-D3GwLGaB.js.map → Body-B_IVN5wp.js.map} +1 -1
  9. package/dist/admin/assets/{Builder-CmT5-8hI.js → Builder-CnEtRudv.js} +2 -2
  10. package/dist/admin/assets/{Builder-CmT5-8hI.js.map → Builder-CnEtRudv.js.map} +1 -1
  11. package/dist/admin/assets/{ConfirmDialog-HS8Gc2t3.js → ConfirmDialog-BW-l3Whg.js} +2 -2
  12. package/dist/admin/assets/{ConfirmDialog-HS8Gc2t3.js.map → ConfirmDialog-BW-l3Whg.js.map} +1 -1
  13. package/dist/admin/assets/{CopyButton-DS-bAA23.js → CopyButton-CyoUMStc.js} +2 -2
  14. package/dist/admin/assets/{CopyButton-DS-bAA23.js.map → CopyButton-CyoUMStc.js.map} +1 -1
  15. package/dist/admin/assets/{CursorPager-C6PyD3wE.js → CursorPager-BW2Dl_hn.js} +2 -2
  16. package/dist/admin/assets/{CursorPager-C6PyD3wE.js.map → CursorPager-BW2Dl_hn.js.map} +1 -1
  17. package/dist/admin/assets/{ExternalLink-KdO72pTj.js → ExternalLink-BCI0q9ib.js} +2 -2
  18. package/dist/admin/assets/{ExternalLink-KdO72pTj.js.map → ExternalLink-BCI0q9ib.js.map} +1 -1
  19. package/dist/admin/assets/{FocalPoint-C62fRhmM.js → FocalPoint-CxicvlJO.js} +2 -2
  20. package/dist/admin/assets/{FocalPoint-C62fRhmM.js.map → FocalPoint-CxicvlJO.js.map} +1 -1
  21. package/dist/admin/assets/{Form-CLEr5Csd.js → Form-DB03drS9.js} +2 -2
  22. package/dist/admin/assets/{Form-CLEr5Csd.js.map → Form-DB03drS9.js.map} +1 -1
  23. package/dist/admin/assets/{FormCheckboxGroup-BrXY6qBg.js → FormCheckboxGroup-JP1xzReQ.js} +2 -2
  24. package/dist/admin/assets/{FormCheckboxGroup-BrXY6qBg.js.map → FormCheckboxGroup-JP1xzReQ.js.map} +1 -1
  25. package/dist/admin/assets/{FormRadioGroup-BjE1Jhar.js → FormRadioGroup-BvSC8SRm.js} +2 -2
  26. package/dist/admin/assets/{FormRadioGroup-BjE1Jhar.js.map → FormRadioGroup-BvSC8SRm.js.map} +1 -1
  27. package/dist/admin/assets/{FormSelectField-g4zrUlhv.js → FormSelectField-BDIVhZh6.js} +2 -2
  28. package/dist/admin/assets/{FormSelectField-g4zrUlhv.js.map → FormSelectField-BDIVhZh6.js.map} +1 -1
  29. package/dist/admin/assets/{FormSwitchField-gciThNGV.js → FormSwitchField-OM4F8ln4.js} +2 -2
  30. package/dist/admin/assets/{FormSwitchField-gciThNGV.js.map → FormSwitchField-OM4F8ln4.js.map} +1 -1
  31. package/dist/admin/assets/{FormTextareaField-tsS-UXym.js → FormTextareaField-Bw7EkC4H.js} +2 -2
  32. package/dist/admin/assets/{FormTextareaField-tsS-UXym.js.map → FormTextareaField-Bw7EkC4H.js.map} +1 -1
  33. package/dist/admin/assets/{HintedLabel-CVe-PIyv.js → HintedLabel-BGidukgy.js} +2 -2
  34. package/dist/admin/assets/{HintedLabel-CVe-PIyv.js.map → HintedLabel-BGidukgy.js.map} +1 -1
  35. package/dist/admin/assets/{InfoHint-DtaHU1Cg.js → InfoHint-D3uwei-E.js} +2 -2
  36. package/dist/admin/assets/{InfoHint-DtaHU1Cg.js.map → InfoHint-D3uwei-E.js.map} +1 -1
  37. package/dist/admin/assets/{InsertMenuItem-DlzaD9zr.js → InsertMenuItem-DAihGvbw.js} +2 -2
  38. package/dist/admin/assets/{InsertMenuItem-DlzaD9zr.js.map → InsertMenuItem-DAihGvbw.js.map} +1 -1
  39. package/dist/admin/assets/{LinkTabs-stM3j4aH.js → LinkTabs-DBXbfzME.js} +2 -2
  40. package/dist/admin/assets/{LinkTabs-stM3j4aH.js.map → LinkTabs-DBXbfzME.js.map} +1 -1
  41. package/dist/admin/assets/{Match-ErAxnNAY.js → Match-CgfZTzqs.js} +2 -2
  42. package/dist/admin/assets/{Match-ErAxnNAY.js.map → Match-CgfZTzqs.js.map} +1 -1
  43. package/dist/admin/assets/{Panel-ClY9b33D.js → Panel-DDky5_x9.js} +2 -2
  44. package/dist/admin/assets/{Panel-ClY9b33D.js.map → Panel-DDky5_x9.js.map} +1 -1
  45. package/dist/admin/assets/{QueryView-C630REML.js → QueryView-C2d392ly.js} +2 -2
  46. package/dist/admin/assets/{QueryView-C630REML.js.map → QueryView-C2d392ly.js.map} +1 -1
  47. package/dist/admin/assets/{RadioTile-CD4mel7U.js → RadioTile-CcP78eb_.js} +2 -2
  48. package/dist/admin/assets/{RadioTile-CD4mel7U.js.map → RadioTile-CcP78eb_.js.map} +1 -1
  49. package/dist/admin/assets/{RichTextField-CxeVX6C-.js → RichTextField-CeztaFET.js} +2 -2
  50. package/dist/admin/assets/{RichTextField-CxeVX6C-.js.map → RichTextField-CeztaFET.js.map} +1 -1
  51. package/dist/admin/assets/{RowTitle-B-7RptyN.js → RowTitle-mkKp4yfl.js} +2 -2
  52. package/dist/admin/assets/{RowTitle-B-7RptyN.js.map → RowTitle-mkKp4yfl.js.map} +1 -1
  53. package/dist/admin/assets/{SecretReveal-Dhw_dYxe.js → SecretReveal-mYCzxF96.js} +2 -2
  54. package/dist/admin/assets/{SecretReveal-Dhw_dYxe.js.map → SecretReveal-mYCzxF96.js.map} +1 -1
  55. package/dist/admin/assets/{SharedGlyph-97RaO6Bh.js → SharedGlyph-CuDT7OUU.js} +2 -2
  56. package/dist/admin/assets/{SharedGlyph-97RaO6Bh.js.map → SharedGlyph-CuDT7OUU.js.map} +1 -1
  57. package/dist/admin/assets/{StepList--0Fiqsq-.js → StepList-BDO0Q3Wc.js} +2 -2
  58. package/dist/admin/assets/{StepList--0Fiqsq-.js.map → StepList-BDO0Q3Wc.js.map} +1 -1
  59. package/dist/admin/assets/Structure-CL_0hVci.js +2 -0
  60. package/dist/admin/assets/{Structure-CoO3iah3.js.map → Structure-CL_0hVci.js.map} +1 -1
  61. package/dist/admin/assets/{SubNavLink-YjjaDN40.js → SubNavLink-C4eSybWd.js} +2 -2
  62. package/dist/admin/assets/{SubNavLink-YjjaDN40.js.map → SubNavLink-C4eSybWd.js.map} +1 -1
  63. package/dist/admin/assets/{SuggestAltButton-Dlyxoypu.js → SuggestAltButton-CxYlhwyd.js} +2 -2
  64. package/dist/admin/assets/{SuggestAltButton-Dlyxoypu.js.map → SuggestAltButton-CxYlhwyd.js.map} +1 -1
  65. package/dist/admin/assets/{TextLink-DIqr5zkJ.js → TextLink-DzNaAft6.js} +2 -2
  66. package/dist/admin/assets/{TextLink-DIqr5zkJ.js.map → TextLink-DzNaAft6.js.map} +1 -1
  67. package/dist/admin/assets/{Thumbnail-BUYOr4XJ.js → Thumbnail-DSPArZ9h.js} +2 -2
  68. package/dist/admin/assets/{Thumbnail-BUYOr4XJ.js.map → Thumbnail-DSPArZ9h.js.map} +1 -1
  69. package/dist/admin/assets/{UnsavedChangesGuard-BfzHgUkF.js → UnsavedChangesGuard-BPOCBD5T.js} +2 -2
  70. package/dist/admin/assets/{UnsavedChangesGuard-BfzHgUkF.js.map → UnsavedChangesGuard-BPOCBD5T.js.map} +1 -1
  71. package/dist/admin/assets/{UserAvatar-DNOWhSWS.js → UserAvatar-BHNWHDVb.js} +2 -2
  72. package/dist/admin/assets/{UserAvatar-DNOWhSWS.js.map → UserAvatar-BHNWHDVb.js.map} +1 -1
  73. package/dist/admin/assets/{auth-YVfK3SxF.js → auth-BzCgJtgr.js} +2 -2
  74. package/dist/admin/assets/{auth-YVfK3SxF.js.map → auth-BzCgJtgr.js.map} +1 -1
  75. package/dist/admin/assets/{badge-lJ4Ih_Zn.js → badge-DBoaS0nQ.js} +2 -2
  76. package/dist/admin/assets/{badge-lJ4Ih_Zn.js.map → badge-DBoaS0nQ.js.map} +1 -1
  77. package/dist/admin/assets/{boxes-DRvd25_u.js → boxes-DhN0ctLo.js} +2 -2
  78. package/dist/admin/assets/{boxes-DRvd25_u.js.map → boxes-DhN0ctLo.js.map} +1 -1
  79. package/dist/admin/assets/{calendar-clock-VENf4s1R.js → calendar-clock-BEA3tG17.js} +2 -2
  80. package/dist/admin/assets/{calendar-clock-VENf4s1R.js.map → calendar-clock-BEA3tG17.js.map} +1 -1
  81. package/dist/admin/assets/{changeSets-JmSyu3tu.js → changeSets-C54Ku-X9.js} +2 -2
  82. package/dist/admin/assets/{changeSets-JmSyu3tu.js.map → changeSets-C54Ku-X9.js.map} +1 -1
  83. package/dist/admin/assets/chevron-left-BeJdUVAX.js +2 -0
  84. package/dist/admin/assets/{chevron-left-D2DnQyeV.js.map → chevron-left-BeJdUVAX.js.map} +1 -1
  85. package/dist/admin/assets/{circle-check-jmRQz1Jq.js → circle-check-ktACw37r.js} +2 -2
  86. package/dist/admin/assets/{circle-check-jmRQz1Jq.js.map → circle-check-ktACw37r.js.map} +1 -1
  87. package/dist/admin/assets/{clock-DrSTMGjp.js → clock-BKNNASKp.js} +2 -2
  88. package/dist/admin/assets/{clock-DrSTMGjp.js.map → clock-BKNNASKp.js.map} +1 -1
  89. package/dist/admin/assets/cn-h5ORT3LK.js +2 -0
  90. package/dist/admin/assets/cn-h5ORT3LK.js.map +1 -0
  91. package/dist/admin/assets/coerce-DDQ1vGLx.js +2 -0
  92. package/dist/admin/assets/{coerce-B4MJTGg1.js.map → coerce-DDQ1vGLx.js.map} +1 -1
  93. package/dist/admin/assets/{constants-ahk0YSYl.js → constants-DH7oqfO_.js} +2 -2
  94. package/dist/admin/assets/{constants-ahk0YSYl.js.map → constants-DH7oqfO_.js.map} +1 -1
  95. package/dist/admin/assets/{content-DcvNzKGe.js → content-BptqQO8c.js} +3 -3
  96. package/dist/admin/assets/{content-DcvNzKGe.js.map → content-BptqQO8c.js.map} +1 -1
  97. package/dist/admin/assets/{contentCounts-DzIvdeXR.js → contentCounts-BpGlmyeZ.js} +2 -2
  98. package/dist/admin/assets/{contentCounts-DzIvdeXR.js.map → contentCounts-BpGlmyeZ.js.map} +1 -1
  99. package/dist/admin/assets/{contentTypes-YAd-AzOF.js → contentTypes-B_mAlIcH.js} +2 -2
  100. package/dist/admin/assets/{contentTypes-YAd-AzOF.js.map → contentTypes-B_mAlIcH.js.map} +1 -1
  101. package/dist/admin/assets/{context-4Jl20mYc.js → context-DyyMW7Md.js} +2 -2
  102. package/dist/admin/assets/{context-4Jl20mYc.js.map → context-DyyMW7Md.js.map} +1 -1
  103. package/dist/admin/assets/{copy-t6kAFw-O.js → copy-DjzlFY9u.js} +2 -2
  104. package/dist/admin/assets/{copy-t6kAFw-O.js.map → copy-DjzlFY9u.js.map} +1 -1
  105. package/dist/admin/assets/{dateTimeLocal-IDUOKulz.js → dateTimeLocal-DFXY779D.js} +2 -2
  106. package/dist/admin/assets/{dateTimeLocal-IDUOKulz.js.map → dateTimeLocal-DFXY779D.js.map} +1 -1
  107. package/dist/admin/assets/{develop-DYwiTd6R.js → develop-DJap_z-1.js} +2 -2
  108. package/dist/admin/assets/{develop-DYwiTd6R.js.map → develop-DJap_z-1.js.map} +1 -1
  109. package/dist/admin/assets/{dropdown-menu-DiYSm-g3.js → dropdown-menu-DGSMTf23.js} +2 -2
  110. package/dist/admin/assets/{dropdown-menu-DiYSm-g3.js.map → dropdown-menu-DGSMTf23.js.map} +1 -1
  111. package/dist/admin/assets/{ellipsis-DEHUaCkn.js → ellipsis-BMP-j3yO.js} +2 -2
  112. package/dist/admin/assets/{ellipsis-DEHUaCkn.js.map → ellipsis-BMP-j3yO.js.map} +1 -1
  113. package/dist/admin/assets/{external-link-B8UFREQ_.js → external-link-DzOkt97S.js} +2 -2
  114. package/dist/admin/assets/{external-link-B8UFREQ_.js.map → external-link-DzOkt97S.js.map} +1 -1
  115. package/dist/admin/assets/{fileRoute-CVQpW8cj.js → fileRoute-CG0Dufvt.js} +2 -2
  116. package/dist/admin/assets/{fileRoute-CVQpW8cj.js.map → fileRoute-CG0Dufvt.js.map} +1 -1
  117. package/dist/admin/assets/{folder-plus-iDg1hhew.js → folder-plus-C-LhI4a2.js} +2 -2
  118. package/dist/admin/assets/{folder-plus-iDg1hhew.js.map → folder-plus-C-LhI4a2.js.map} +1 -1
  119. package/dist/admin/assets/{followPlural-BdqfEe48.js → followPlural-D-8kzFOe.js} +2 -2
  120. package/dist/admin/assets/{followPlural-BdqfEe48.js.map → followPlural-D-8kzFOe.js.map} +1 -1
  121. package/dist/admin/assets/{globe-TooNSp9V.js → globe-DOoGBy23.js} +2 -2
  122. package/dist/admin/assets/{globe-TooNSp9V.js.map → globe-DOoGBy23.js.map} +1 -1
  123. package/dist/admin/assets/{image-CXZXXH58.js → image-D9p_gGE2.js} +2 -2
  124. package/dist/admin/assets/{image-CXZXXH58.js.map → image-D9p_gGE2.js.map} +1 -1
  125. package/dist/admin/assets/{image-off-cxva5G-Y.js → image-off-G0M2Nh1I.js} +2 -2
  126. package/dist/admin/assets/{image-off-cxva5G-Y.js.map → image-off-G0M2Nh1I.js.map} +1 -1
  127. package/dist/admin/assets/{inbox-B8c9Kj_z.js → inbox-CMzYVMZo.js} +2 -2
  128. package/dist/admin/assets/{inbox-B8c9Kj_z.js.map → inbox-CMzYVMZo.js.map} +1 -1
  129. package/dist/admin/assets/{inbox-CnzNfqt9.js → inbox-XaM-nvsM.js} +2 -2
  130. package/dist/admin/assets/{inbox-CnzNfqt9.js.map → inbox-XaM-nvsM.js.map} +1 -1
  131. package/dist/admin/assets/{index-D9KL7arJ.js → index-DHmfMpqz.js} +4 -4
  132. package/dist/admin/assets/{index-D9KL7arJ.js.map → index-DHmfMpqz.js.map} +1 -1
  133. package/dist/admin/assets/{key-round-CFJ61iCd.js → key-round-HBvMrmMo.js} +2 -2
  134. package/dist/admin/assets/{key-round-CFJ61iCd.js.map → key-round-HBvMrmMo.js.map} +1 -1
  135. package/dist/admin/assets/{languages-eh7U4anI.js → languages-BOv0jYhe.js} +2 -2
  136. package/dist/admin/assets/{languages-eh7U4anI.js.map → languages-BOv0jYhe.js.map} +1 -1
  137. package/dist/admin/assets/{layers-mGfmMsKE.js → layers-CkZyCaeb.js} +2 -2
  138. package/dist/admin/assets/{layers-mGfmMsKE.js.map → layers-CkZyCaeb.js.map} +1 -1
  139. package/dist/admin/assets/{link-2-off-DbZzRN_w.js → link-2-off-UUkSmPIL.js} +2 -2
  140. package/dist/admin/assets/{link-2-off-DbZzRN_w.js.map → link-2-off-UUkSmPIL.js.map} +1 -1
  141. package/dist/admin/assets/{link-b2pFaN-A.js → link-Bvqcg7db.js} +2 -2
  142. package/dist/admin/assets/{link-b2pFaN-A.js.map → link-Bvqcg7db.js.map} +1 -1
  143. package/dist/admin/assets/{locales-oBD0q1pN.js → locales-DbrcdhZi.js} +2 -2
  144. package/dist/admin/assets/{locales-oBD0q1pN.js.map → locales-DbrcdhZi.js.map} +1 -1
  145. package/dist/admin/assets/{media-Cs9LCQcz.js → media-CO0HSS3b.js} +2 -2
  146. package/dist/admin/assets/{media-Cs9LCQcz.js.map → media-CO0HSS3b.js.map} +1 -1
  147. package/dist/admin/assets/{media-5ks_0Rre.js → media-ugEyLgwN.js} +2 -2
  148. package/dist/admin/assets/{media-5ks_0Rre.js.map → media-ugEyLgwN.js.map} +1 -1
  149. package/dist/admin/assets/{network-DS8MW3AZ.js → network-BfDaUb7D.js} +2 -2
  150. package/dist/admin/assets/{network-DS8MW3AZ.js.map → network-BfDaUb7D.js.map} +1 -1
  151. package/dist/admin/assets/{pencil-C7eD5mlZ.js → pencil-BLNGNJmL.js} +2 -2
  152. package/dist/admin/assets/{pencil-C7eD5mlZ.js.map → pencil-BLNGNJmL.js.map} +1 -1
  153. package/dist/admin/assets/{plus-BDZHQBlU.js → plus-BXMBYPoB.js} +2 -2
  154. package/dist/admin/assets/{plus-BDZHQBlU.js.map → plus-BXMBYPoB.js.map} +1 -1
  155. package/dist/admin/assets/{preload-helper-CJNJ4S3k.js → preload-helper-DEbJbZwX.js} +2 -2
  156. package/dist/admin/assets/{preload-helper-CJNJ4S3k.js.map → preload-helper-DEbJbZwX.js.map} +1 -1
  157. package/dist/admin/assets/{publishing-C4YQ4XKt.js → publishing-DKrATBaj.js} +2 -2
  158. package/dist/admin/assets/{publishing-C4YQ4XKt.js.map → publishing-DKrATBaj.js.map} +1 -1
  159. package/dist/admin/assets/{radio-group-zOsGAYRP.js → radio-group-BIhT_uEK.js} +2 -2
  160. package/dist/admin/assets/{radio-group-zOsGAYRP.js.map → radio-group-BIhT_uEK.js.map} +1 -1
  161. package/dist/admin/assets/{rotate-ccw-DCWwb4Ga.js → rotate-ccw-DqbffhiC.js} +2 -2
  162. package/dist/admin/assets/{rotate-ccw-DCWwb4Ga.js.map → rotate-ccw-DqbffhiC.js.map} +1 -1
  163. package/dist/admin/assets/{schedules-DXrBSypK.js → schedules-CETl2eLe.js} +2 -2
  164. package/dist/admin/assets/{schedules-DXrBSypK.js.map → schedules-CETl2eLe.js.map} +1 -1
  165. package/dist/admin/assets/{schema-B7L9OJrX.js → schema-CWHuez0q.js} +2 -2
  166. package/dist/admin/assets/{schema-B7L9OJrX.js.map → schema-CWHuez0q.js.map} +1 -1
  167. package/dist/admin/assets/{scroll-text-BLThe4Ki.js → scroll-text-DlcDEi2k.js} +2 -2
  168. package/dist/admin/assets/{scroll-text-BLThe4Ki.js.map → scroll-text-DlcDEi2k.js.map} +1 -1
  169. package/dist/admin/assets/{search-CcJQqtRw.js → search-Dy2dtwyR.js} +2 -2
  170. package/dist/admin/assets/{search-CcJQqtRw.js.map → search-Dy2dtwyR.js.map} +1 -1
  171. package/dist/admin/assets/{searchSchemas-BCRZ1jyL.js → searchSchemas-Cz4P1iku.js} +2 -2
  172. package/dist/admin/assets/{searchSchemas-BCRZ1jyL.js.map → searchSchemas-Cz4P1iku.js.map} +1 -1
  173. package/dist/admin/assets/{sections-v5Flaor9.js → sections-BfG6DTFr.js} +2 -2
  174. package/dist/admin/assets/{sections-v5Flaor9.js.map → sections-BfG6DTFr.js.map} +1 -1
  175. package/dist/admin/assets/{sections-TIN_Nl1b.js → sections-EgXyXN3-.js} +2 -2
  176. package/dist/admin/assets/{sections-TIN_Nl1b.js.map → sections-EgXyXN3-.js.map} +1 -1
  177. package/dist/admin/assets/{select-CpHp3YOH.js → select--mePTdz8.js} +2 -2
  178. package/dist/admin/assets/{select-CpHp3YOH.js.map → select--mePTdz8.js.map} +1 -1
  179. package/dist/admin/assets/{send-CbP0Rc9_.js → send-DVgq5Iwg.js} +2 -2
  180. package/dist/admin/assets/{send-CbP0Rc9_.js.map → send-DVgq5Iwg.js.map} +1 -1
  181. package/dist/admin/assets/{seo-1n9s7YuX.js → seo-Zhb62Ojz.js} +2 -2
  182. package/dist/admin/assets/{seo-1n9s7YuX.js.map → seo-Zhb62Ojz.js.map} +1 -1
  183. package/dist/admin/assets/{settings-CuEO5l07.js → settings-Mscp6tN5.js} +2 -2
  184. package/dist/admin/assets/{settings-CuEO5l07.js.map → settings-Mscp6tN5.js.map} +1 -1
  185. package/dist/admin/assets/{skeleton-DElTumgk.js → skeleton-DJVukcn6.js} +2 -2
  186. package/dist/admin/assets/{skeleton-DElTumgk.js.map → skeleton-DJVukcn6.js.map} +1 -1
  187. package/dist/admin/assets/{snapshots-DkyyrWX3.js → snapshots-BpLhILlt.js} +2 -2
  188. package/dist/admin/assets/{snapshots-DkyyrWX3.js.map → snapshots-BpLhILlt.js.map} +1 -1
  189. package/dist/admin/assets/{sparkles-D88gf3vX.js → sparkles-Dd6S_roX.js} +2 -2
  190. package/dist/admin/assets/{sparkles-D88gf3vX.js.map → sparkles-Dd6S_roX.js.map} +1 -1
  191. package/dist/admin/assets/{stableId-DlNKh3HM.js → stableId-DFVM13gJ.js} +2 -2
  192. package/dist/admin/assets/{stableId-DlNKh3HM.js.map → stableId-DFVM13gJ.js.map} +1 -1
  193. package/dist/admin/assets/{store-jUWyOXDG.js → store-BP-xStwU.js} +2 -2
  194. package/dist/admin/assets/{store-jUWyOXDG.js.map → store-BP-xStwU.js.map} +1 -1
  195. package/dist/admin/assets/{switch-CijNGYkG.js → switch-skVypg5O.js} +2 -2
  196. package/dist/admin/assets/{switch-CijNGYkG.js.map → switch-skVypg5O.js.map} +1 -1
  197. package/dist/admin/assets/{table-DQ5ILlSh.js → table-BMbbRUK9.js} +2 -2
  198. package/dist/admin/assets/{table-DQ5ILlSh.js.map → table-BMbbRUK9.js.map} +1 -1
  199. package/dist/admin/assets/{tabs-CSqGW9Du.js → tabs-C1lgOg1B.js} +3 -3
  200. package/dist/admin/assets/{tabs-CSqGW9Du.js.map → tabs-C1lgOg1B.js.map} +1 -1
  201. package/dist/admin/assets/{textarea-FwSvwmyT.js → textarea-CffBBxoQ.js} +2 -2
  202. package/dist/admin/assets/{textarea-FwSvwmyT.js.map → textarea-CffBBxoQ.js.map} +1 -1
  203. package/dist/admin/assets/{theme-CHHVK8Ps.js → theme-RHTVnR9j.js} +2 -2
  204. package/dist/admin/assets/{theme-CHHVK8Ps.js.map → theme-RHTVnR9j.js.map} +1 -1
  205. package/dist/admin/assets/{titles-CQYc9nDQ.js → titles-DWiPmNvn.js} +2 -2
  206. package/dist/admin/assets/{titles-CQYc9nDQ.js.map → titles-DWiPmNvn.js.map} +1 -1
  207. package/dist/admin/assets/{tokens-C-20gLAT.js → tokens-BqyeN1D-.js} +2 -2
  208. package/dist/admin/assets/{tokens-C-20gLAT.js.map → tokens-BqyeN1D-.js.map} +1 -1
  209. package/dist/admin/assets/{tooltip-BXqFQv9N.js → tooltip-BfSF6EyR.js} +2 -2
  210. package/dist/admin/assets/{tooltip-BXqFQv9N.js.map → tooltip-BfSF6EyR.js.map} +1 -1
  211. package/dist/admin/assets/{undo-2-CLy2zklL.js → undo-2-p4YlNhBp.js} +2 -2
  212. package/dist/admin/assets/{undo-2-CLy2zklL.js.map → undo-2-p4YlNhBp.js.map} +1 -1
  213. package/dist/admin/assets/{useAuditLabels-BJF7M5RY.js → useAuditLabels-DV5gcaaG.js} +2 -2
  214. package/dist/admin/assets/{useAuditLabels-BJF7M5RY.js.map → useAuditLabels-DV5gcaaG.js.map} +1 -1
  215. package/dist/admin/assets/{useConfirmTarget-BUvlrGSW.js → useConfirmTarget-DCvnxNVg.js} +2 -2
  216. package/dist/admin/assets/{useConfirmTarget-BUvlrGSW.js.map → useConfirmTarget-DCvnxNVg.js.map} +1 -1
  217. package/dist/admin/assets/{useContentSchema-Cvtes34f.js → useContentSchema-z6tNif86.js} +2 -2
  218. package/dist/admin/assets/{useContentSchema-Cvtes34f.js.map → useContentSchema-z6tNif86.js.map} +1 -1
  219. package/dist/admin/assets/{useCursorPager-CzB6NDOB.js → useCursorPager-CQGX41_L.js} +2 -2
  220. package/dist/admin/assets/{useCursorPager-CzB6NDOB.js.map → useCursorPager-CQGX41_L.js.map} +1 -1
  221. package/dist/admin/assets/{useDiscardGuard-BAEGkGK9.js → useDiscardGuard-Dhbif7VL.js} +2 -2
  222. package/dist/admin/assets/{useDiscardGuard-BAEGkGK9.js.map → useDiscardGuard-Dhbif7VL.js.map} +1 -1
  223. package/dist/admin/assets/{useMediaPickerDialog-CiN_pias.js → useMediaPickerDialog-D-5uKsMG.js} +2 -2
  224. package/dist/admin/assets/{useMediaPickerDialog-CiN_pias.js.map → useMediaPickerDialog-D-5uKsMG.js.map} +1 -1
  225. package/dist/admin/assets/{useMediaUploader-CapEHBIt.js → useMediaUploader-BtLoimmQ.js} +2 -2
  226. package/dist/admin/assets/{useMediaUploader-CapEHBIt.js.map → useMediaUploader-BtLoimmQ.js.map} +1 -1
  227. package/dist/admin/assets/{usePaletteItems-wpn3ms6o.js → usePaletteItems-D3PZsW0Q.js} +2 -2
  228. package/dist/admin/assets/{usePaletteItems-wpn3ms6o.js.map → usePaletteItems-D3PZsW0Q.js.map} +1 -1
  229. package/dist/admin/assets/{usePlaces-6iTN15Xy.js → usePlaces-Cj5PljTy.js} +2 -2
  230. package/dist/admin/assets/{usePlaces-6iTN15Xy.js.map → usePlaces-Cj5PljTy.js.map} +1 -1
  231. package/dist/admin/assets/{useQueries-CYfcxI0Q.js → useQueries-CeDzli4Z.js} +2 -2
  232. package/dist/admin/assets/{useQueries-CYfcxI0Q.js.map → useQueries-CeDzli4Z.js.map} +1 -1
  233. package/dist/admin/assets/{useResolvedScheme-i1EwGHuF.js → useResolvedScheme-DHD-zisP.js} +2 -2
  234. package/dist/admin/assets/{useResolvedScheme-i1EwGHuF.js.map → useResolvedScheme-DHD-zisP.js.map} +1 -1
  235. package/dist/admin/assets/{useSchemaScopeAccess-WQKmj8_3.js → useSchemaScopeAccess-BNeVslcv.js} +2 -2
  236. package/dist/admin/assets/{useSchemaScopeAccess-WQKmj8_3.js.map → useSchemaScopeAccess-BNeVslcv.js.map} +1 -1
  237. package/dist/admin/assets/{users-BgTNDPXx.js → users-BRefbzuS.js} +2 -2
  238. package/dist/admin/assets/{users-BgTNDPXx.js.map → users-BRefbzuS.js.map} +1 -1
  239. package/dist/admin/assets/{users-B01EH47o.js → users-CppI8ctO.js} +2 -2
  240. package/dist/admin/assets/{users-B01EH47o.js.map → users-CppI8ctO.js.map} +1 -1
  241. package/dist/admin/assets/{zod-79xzBIrW.js → zod-Dcwk-m8X.js} +2 -2
  242. package/dist/admin/assets/{zod-79xzBIrW.js.map → zod-Dcwk-m8X.js.map} +1 -1
  243. package/dist/admin/index.html +55 -55
  244. package/dist/cli.js +110 -18
  245. package/dist/cli.js.map +1 -1
  246. package/dist/config.d.ts +1 -1
  247. package/dist/index.d.ts +1 -1
  248. package/dist/index.js +1 -1
  249. package/dist/{public-CTK82y3t.d.ts → public-DYR4mtVQ.d.ts} +2 -1
  250. package/dist/s3Adapter-C8AgFVYw.js +125 -0
  251. package/dist/s3Adapter-C8AgFVYw.js.map +1 -0
  252. package/dist/{worker-BDYDbaea.js → worker-jz_0yAmS.js} +388 -358
  253. package/dist/worker-jz_0yAmS.js.map +1 -0
  254. package/package.json +8 -5
  255. package/dist/admin/assets/Structure-CoO3iah3.js +0 -2
  256. package/dist/admin/assets/chevron-left-D2DnQyeV.js +0 -2
  257. package/dist/admin/assets/cn-CL1YHRrS.js +0 -2
  258. package/dist/admin/assets/cn-CL1YHRrS.js.map +0 -1
  259. package/dist/admin/assets/coerce-B4MJTGg1.js +0 -2
  260. package/dist/worker-BDYDbaea.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"publishing-C4YQ4XKt.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","createLucideIcon","useTranslation","LoaderCircle","cn","linkOptions","useNavigate","isConflict","useMe","Link","SubmitButton","Page","PageHeader","useParams","StatusChip","EmptyState","ErrorState","Badge","LoadingState","Outlet","formatRelativeTime","formatDateTime","useSearch","RowTitle","createLazyRoute","UnsavedChangesGuard","SCHEDULE_STATUSES","PUBLICATION_ACTIONS","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","FormCheckboxGroup","Info","toast","Trash","FieldLabel","FieldLegend","Field","FieldSet","InfoHint","FieldGroup","ChevronRight","Button","Input","CalendarClock","SelectValue","SelectTrigger","SelectContent","SelectItem","ChevronDown","Select","CursorPager","Alert","CircleAlert","FormError","Checkbox","AlertDescription","InlineConfirm","AlertTitle","CircleCheck","CircleX","Inbox","KeyRound","Plus","useRetryDeploymentRun","useResetOnOpen","useUpdateDeploymentConnection","Rocket","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","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","useConnectionActions","navigate","test","trigger","remove","connection","run","SCHEDULE_STATUS_DISPLAY","DELIVERY_STATUS_DISPLAY","RUN_DISPLAY","runDisplay","RunStatus","display","t","ConnectionCard","actions","canTriggerDeployments","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","toUpdateConnectionInput","rest","useDeliveryRoleOptions","roles","role","SETTING_LABELS","SETTING_HINTS","SECRET_LABELS","SECRET_HINTS","PROVIDER_SECRET_HINTS","secretHintFor","GITHUB_MODE_LABELS","SecretField","replacing","setReplacing","hintId","errorId","fieldState","fullHint","hint","stored","envVar","field","ProviderFields","storedSecrets","ConnectionForm","deliveryRoleOptions","createSchema","useCreateConnectionForm","createConnection","form","open","created","onCreated","CreateSheet$2","onSubmit","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","onConflict","onSaved","EditForm$1","TestResult","result","check","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","saved","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/hooks/useConnectionActions.ts","../../src/features/Publishing/helpers/statusDisplay.ts","../../src/features/Publishing/Deployments/RunStatus/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/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';\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 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 { useConnectionActions } from '../hooks/useConnectionActions';\nimport { RunStatus } from '../RunStatus';\n\ntype ConnectionCardProps = { connection: DeploymentConnection };\n\n/** One deployment connection: provider, state, latest run and live snapshot, with Open and Deploy now. */\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 <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 size=\"sm\" disabled={actions.triggering || !connection.enabled} onClick={actions.triggerRun}>\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/** Only secrets typed in are sent: an omitted secret keeps its stored value. */\nexport const toUpdateConnectionInput = (\n values: ConnectionFormValues,\n expectedVersion: number,\n): UpdateDeploymentConnectionInput => {\n const { secrets, ...rest } = commonInput(values);\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 } 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};\n\n/** A write-only secret: never prefilled; an empty value keeps the stored one. */\nexport const SecretField = ({ control, name, label, hint, stored, envVar }: 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 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, 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 <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};\n\n/** The chosen provider's settings and secrets. */\nexport const ProviderFields = ({ control, storedSecrets }: 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 />\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};\n\n/** A deployment connection's fields: provider (fixed once created), its settings and secrets, and policy. */\nexport const ConnectionForm = ({ control, mode, storedSecrets }: 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} />\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 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 { SecretReveal } from '@/components/SecretReveal';\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 { 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 <SecretReveal\n title={t('publishing.deployments.generatedSecretTitle')}\n description={t('publishing.deployments.generatedSecretDescription')}\n label={t('publishing.deployments.secretLabels.signingSecret')}\n secret={secret.revealed.secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={secret.dismiss}\n />\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 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`.\n */\nexport const useEditConnectionForm = (\n connection: DeploymentConnection,\n onSaved: () => 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 { id: connection.id, input: toUpdateConnectionInput(values, connection.version) },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.deployments.saved'));\n onSaved();\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 onSaved: () => 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 control={form.control} mode=\"edit\" storedSecrets={connection.secrets} />\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 { CallbackHelp } from '../../CallbackHelp';\nimport { useConnectionActions } from '../../hooks/useConnectionActions';\nimport { RunsList } from '../../RunsList';\nimport { EditForm } from '../EditForm';\nimport { TestResult } from '../TestResult';\n\ntype ViewProps = { connection: DeploymentConnection };\n\n/** A loaded connection: test, trigger, its runs, the callback contract (generic) and its settings. */\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 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={<EnabledChip enabled={connection.enabled} />}\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 || !connection.enabled} onClick={actions.triggerRun}>\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </>\n }\n />\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={conflict.clearConflict}\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-DKrATBaj.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","createLucideIcon","useTranslation","LoaderCircle","cn","linkOptions","useNavigate","isConflict","useMe","Link","SubmitButton","Page","PageHeader","useParams","StatusChip","EmptyState","ErrorState","Badge","LoadingState","Outlet","formatRelativeTime","formatDateTime","useSearch","RowTitle","createLazyRoute","UnsavedChangesGuard","SCHEDULE_STATUSES","PUBLICATION_ACTIONS","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","FormCheckboxGroup","Info","toast","Trash","FieldLabel","FieldLegend","Field","FieldSet","InfoHint","FieldGroup","ChevronRight","Button","Input","CalendarClock","SelectValue","SelectTrigger","SelectContent","SelectItem","ChevronDown","Select","CursorPager","Alert","CircleAlert","FormError","Checkbox","AlertDescription","InlineConfirm","AlertTitle","CircleCheck","CircleX","Inbox","KeyRound","Plus","useRetryDeploymentRun","useResetOnOpen","useUpdateDeploymentConnection","Rocket","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","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","useConnectionActions","navigate","test","trigger","remove","connection","run","SCHEDULE_STATUS_DISPLAY","DELIVERY_STATUS_DISPLAY","RUN_DISPLAY","runDisplay","RunStatus","display","t","ConnectionCard","actions","canTriggerDeployments","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","toUpdateConnectionInput","rest","useDeliveryRoleOptions","roles","role","SETTING_LABELS","SETTING_HINTS","SECRET_LABELS","SECRET_HINTS","PROVIDER_SECRET_HINTS","secretHintFor","GITHUB_MODE_LABELS","SecretField","replacing","setReplacing","hintId","errorId","fieldState","fullHint","hint","stored","envVar","field","ProviderFields","storedSecrets","ConnectionForm","deliveryRoleOptions","createSchema","useCreateConnectionForm","createConnection","form","open","created","onCreated","CreateSheet$2","onSubmit","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","onConflict","onSaved","EditForm$1","TestResult","result","check","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","saved","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/hooks/useConnectionActions.ts","../../src/features/Publishing/helpers/statusDisplay.ts","../../src/features/Publishing/Deployments/RunStatus/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/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';\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 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 { useConnectionActions } from '../hooks/useConnectionActions';\nimport { RunStatus } from '../RunStatus';\n\ntype ConnectionCardProps = { connection: DeploymentConnection };\n\n/** One deployment connection: provider, state, latest run and live snapshot, with Open and Deploy now. */\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 <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 size=\"sm\" disabled={actions.triggering || !connection.enabled} onClick={actions.triggerRun}>\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/** Only secrets typed in are sent: an omitted secret keeps its stored value. */\nexport const toUpdateConnectionInput = (\n values: ConnectionFormValues,\n expectedVersion: number,\n): UpdateDeploymentConnectionInput => {\n const { secrets, ...rest } = commonInput(values);\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 } 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};\n\n/** A write-only secret: never prefilled; an empty value keeps the stored one. */\nexport const SecretField = ({ control, name, label, hint, stored, envVar }: 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 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, 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 <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};\n\n/** The chosen provider's settings and secrets. */\nexport const ProviderFields = ({ control, storedSecrets }: 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 />\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};\n\n/** A deployment connection's fields: provider (fixed once created), its settings and secrets, and policy. */\nexport const ConnectionForm = ({ control, mode, storedSecrets }: 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} />\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 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 { SecretReveal } from '@/components/SecretReveal';\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 { 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 <SecretReveal\n title={t('publishing.deployments.generatedSecretTitle')}\n description={t('publishing.deployments.generatedSecretDescription')}\n label={t('publishing.deployments.secretLabels.signingSecret')}\n secret={secret.revealed.secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={secret.dismiss}\n />\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 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`.\n */\nexport const useEditConnectionForm = (\n connection: DeploymentConnection,\n onSaved: () => 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 { id: connection.id, input: toUpdateConnectionInput(values, connection.version) },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.deployments.saved'));\n onSaved();\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 onSaved: () => 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 control={form.control} mode=\"edit\" storedSecrets={connection.secrets} />\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 { CallbackHelp } from '../../CallbackHelp';\nimport { useConnectionActions } from '../../hooks/useConnectionActions';\nimport { RunsList } from '../../RunsList';\nimport { EditForm } from '../EditForm';\nimport { TestResult } from '../TestResult';\n\ntype ViewProps = { connection: DeploymentConnection };\n\n/** A loaded connection: test, trigger, its runs, the callback contract (generic) and its settings. */\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 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={<EnabledChip enabled={connection.enabled} />}\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 || !connection.enabled} onClick={actions.triggerRun}>\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </>\n }\n />\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={conflict.clearConflict}\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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"}