@shapio/cms 0.5.0 → 0.5.2

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 (270) hide show
  1. package/dist/admin/assets/{AssetTile-zOf0K0nN.js → AssetTile-B8ftUG4s.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-zOf0K0nN.js.map → AssetTile-B8ftUG4s.js.map} +1 -1
  3. package/dist/admin/assets/{AssistError-D_vY2CO0.js → AssistError-BidlzaBY.js} +2 -2
  4. package/dist/admin/assets/{AssistError-D_vY2CO0.js.map → AssistError-BidlzaBY.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-BEnSpClj.js → BlockMenuItems-DfNBHqVM.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-BEnSpClj.js.map → BlockMenuItems-DfNBHqVM.js.map} +1 -1
  7. package/dist/admin/assets/{Body-B_IVN5wp.js → Body-C0oQSX6L.js} +2 -2
  8. package/dist/admin/assets/{Body-B_IVN5wp.js.map → Body-C0oQSX6L.js.map} +1 -1
  9. package/dist/admin/assets/{Builder-CnEtRudv.js → Builder-Z_hcyzNW.js} +2 -2
  10. package/dist/admin/assets/{Builder-CnEtRudv.js.map → Builder-Z_hcyzNW.js.map} +1 -1
  11. package/dist/admin/assets/{ConfirmDialog-BW-l3Whg.js → ConfirmDialog-DVN-n-tE.js} +2 -2
  12. package/dist/admin/assets/{ConfirmDialog-BW-l3Whg.js.map → ConfirmDialog-DVN-n-tE.js.map} +1 -1
  13. package/dist/admin/assets/{CopyButton-CyoUMStc.js → CopyButton--tHegXQr.js} +2 -2
  14. package/dist/admin/assets/{CopyButton-CyoUMStc.js.map → CopyButton--tHegXQr.js.map} +1 -1
  15. package/dist/admin/assets/{CursorPager-BW2Dl_hn.js → CursorPager-Cb94mITn.js} +2 -2
  16. package/dist/admin/assets/{CursorPager-BW2Dl_hn.js.map → CursorPager-Cb94mITn.js.map} +1 -1
  17. package/dist/admin/assets/{ExternalLink-BCI0q9ib.js → ExternalLink-M1cb1n2n.js} +2 -2
  18. package/dist/admin/assets/{ExternalLink-BCI0q9ib.js.map → ExternalLink-M1cb1n2n.js.map} +1 -1
  19. package/dist/admin/assets/{FocalPoint-CxicvlJO.js → FocalPoint-pTq17ngi.js} +2 -2
  20. package/dist/admin/assets/{FocalPoint-CxicvlJO.js.map → FocalPoint-pTq17ngi.js.map} +1 -1
  21. package/dist/admin/assets/{Form-DB03drS9.js → Form-4zah109J.js} +2 -2
  22. package/dist/admin/assets/{Form-DB03drS9.js.map → Form-4zah109J.js.map} +1 -1
  23. package/dist/admin/assets/FormCheckboxGroup-DAeuGKAU.js +2 -0
  24. package/dist/admin/assets/FormCheckboxGroup-DAeuGKAU.js.map +1 -0
  25. package/dist/admin/assets/{FormRadioGroup-BvSC8SRm.js → FormRadioGroup--xx08rw6.js} +2 -2
  26. package/dist/admin/assets/{FormRadioGroup-BvSC8SRm.js.map → FormRadioGroup--xx08rw6.js.map} +1 -1
  27. package/dist/admin/assets/{FormSelectField-BDIVhZh6.js → FormSelectField-DNOCQKqc.js} +2 -2
  28. package/dist/admin/assets/{FormSelectField-BDIVhZh6.js.map → FormSelectField-DNOCQKqc.js.map} +1 -1
  29. package/dist/admin/assets/{FormSwitchField-OM4F8ln4.js → FormSwitchField-BECl-pzH.js} +2 -2
  30. package/dist/admin/assets/{FormSwitchField-OM4F8ln4.js.map → FormSwitchField-BECl-pzH.js.map} +1 -1
  31. package/dist/admin/assets/{FormTextareaField-Bw7EkC4H.js → FormTextareaField-DmRuKDJ_.js} +2 -2
  32. package/dist/admin/assets/{FormTextareaField-Bw7EkC4H.js.map → FormTextareaField-DmRuKDJ_.js.map} +1 -1
  33. package/dist/admin/assets/{HintedLabel-BGidukgy.js → HintedLabel-DIEBvftx.js} +2 -2
  34. package/dist/admin/assets/{HintedLabel-BGidukgy.js.map → HintedLabel-DIEBvftx.js.map} +1 -1
  35. package/dist/admin/assets/{InfoHint-D3uwei-E.js → InfoHint-BdAadb9U.js} +2 -2
  36. package/dist/admin/assets/{InfoHint-D3uwei-E.js.map → InfoHint-BdAadb9U.js.map} +1 -1
  37. package/dist/admin/assets/{InsertMenuItem-DAihGvbw.js → InsertMenuItem-oh0NJrhB.js} +2 -2
  38. package/dist/admin/assets/{InsertMenuItem-DAihGvbw.js.map → InsertMenuItem-oh0NJrhB.js.map} +1 -1
  39. package/dist/admin/assets/{LinkTabs-DBXbfzME.js → LinkTabs-EBgHX4Uh.js} +2 -2
  40. package/dist/admin/assets/{LinkTabs-DBXbfzME.js.map → LinkTabs-EBgHX4Uh.js.map} +1 -1
  41. package/dist/admin/assets/{Match-CgfZTzqs.js → Match-CvpSNEfi.js} +2 -2
  42. package/dist/admin/assets/{Match-CgfZTzqs.js.map → Match-CvpSNEfi.js.map} +1 -1
  43. package/dist/admin/assets/{Panel-DDky5_x9.js → Panel-BV1BpNCn.js} +2 -2
  44. package/dist/admin/assets/{Panel-DDky5_x9.js.map → Panel-BV1BpNCn.js.map} +1 -1
  45. package/dist/admin/assets/{QueryView-C2d392ly.js → QueryView-Bbw1eiV2.js} +2 -2
  46. package/dist/admin/assets/{QueryView-C2d392ly.js.map → QueryView-Bbw1eiV2.js.map} +1 -1
  47. package/dist/admin/assets/{RadioTile-CcP78eb_.js → RadioTile-CSYW-8gL.js} +2 -2
  48. package/dist/admin/assets/{RadioTile-CcP78eb_.js.map → RadioTile-CSYW-8gL.js.map} +1 -1
  49. package/dist/admin/assets/{RichTextField-CeztaFET.js → RichTextField-BDb67rCi.js} +2 -2
  50. package/dist/admin/assets/{RichTextField-CeztaFET.js.map → RichTextField-BDb67rCi.js.map} +1 -1
  51. package/dist/admin/assets/{RowTitle-mkKp4yfl.js → RowTitle-Cted2GP8.js} +2 -2
  52. package/dist/admin/assets/{RowTitle-mkKp4yfl.js.map → RowTitle-Cted2GP8.js.map} +1 -1
  53. package/dist/admin/assets/SecretReveal-Ccaul96d.js +2 -0
  54. package/dist/admin/assets/SecretReveal-Ccaul96d.js.map +1 -0
  55. package/dist/admin/assets/{SharedGlyph-CuDT7OUU.js → SharedGlyph-BrLi3Hug.js} +2 -2
  56. package/dist/admin/assets/{SharedGlyph-CuDT7OUU.js.map → SharedGlyph-BrLi3Hug.js.map} +1 -1
  57. package/dist/admin/assets/{StepList-BDO0Q3Wc.js → StepList-BLvElvPV.js} +2 -2
  58. package/dist/admin/assets/{StepList-BDO0Q3Wc.js.map → StepList-BLvElvPV.js.map} +1 -1
  59. package/dist/admin/assets/Structure-CRNAuVY7.js +2 -0
  60. package/dist/admin/assets/{Structure-CL_0hVci.js.map → Structure-CRNAuVY7.js.map} +1 -1
  61. package/dist/admin/assets/{SubNavLink-C4eSybWd.js → SubNavLink-biGV5ozd.js} +2 -2
  62. package/dist/admin/assets/{SubNavLink-C4eSybWd.js.map → SubNavLink-biGV5ozd.js.map} +1 -1
  63. package/dist/admin/assets/{SuggestAltButton-CxYlhwyd.js → SuggestAltButton-CrFiRWGr.js} +2 -2
  64. package/dist/admin/assets/{SuggestAltButton-CxYlhwyd.js.map → SuggestAltButton-CrFiRWGr.js.map} +1 -1
  65. package/dist/admin/assets/{TextLink-DzNaAft6.js → TextLink-BPLbXw2n.js} +2 -2
  66. package/dist/admin/assets/{TextLink-DzNaAft6.js.map → TextLink-BPLbXw2n.js.map} +1 -1
  67. package/dist/admin/assets/{Thumbnail-DSPArZ9h.js → Thumbnail-B_TWlgEz.js} +2 -2
  68. package/dist/admin/assets/{Thumbnail-DSPArZ9h.js.map → Thumbnail-B_TWlgEz.js.map} +1 -1
  69. package/dist/admin/assets/{UnsavedChangesGuard-BPOCBD5T.js → UnsavedChangesGuard-CrzR2boF.js} +2 -2
  70. package/dist/admin/assets/{UnsavedChangesGuard-BPOCBD5T.js.map → UnsavedChangesGuard-CrzR2boF.js.map} +1 -1
  71. package/dist/admin/assets/{UserAvatar-BHNWHDVb.js → UserAvatar-W-S3st7E.js} +2 -2
  72. package/dist/admin/assets/{UserAvatar-BHNWHDVb.js.map → UserAvatar-W-S3st7E.js.map} +1 -1
  73. package/dist/admin/assets/{auth-BzCgJtgr.js → auth-cXFFyABE.js} +2 -2
  74. package/dist/admin/assets/{auth-BzCgJtgr.js.map → auth-cXFFyABE.js.map} +1 -1
  75. package/dist/admin/assets/{badge-DBoaS0nQ.js → badge-DrPwivGk.js} +2 -2
  76. package/dist/admin/assets/{badge-DBoaS0nQ.js.map → badge-DrPwivGk.js.map} +1 -1
  77. package/dist/admin/assets/{boxes-DhN0ctLo.js → boxes-CKJ6P9VA.js} +2 -2
  78. package/dist/admin/assets/{boxes-DhN0ctLo.js.map → boxes-CKJ6P9VA.js.map} +1 -1
  79. package/dist/admin/assets/{calendar-clock-BEA3tG17.js → calendar-clock-DPyjti63.js} +2 -2
  80. package/dist/admin/assets/{calendar-clock-BEA3tG17.js.map → calendar-clock-DPyjti63.js.map} +1 -1
  81. package/dist/admin/assets/{changeSets-C54Ku-X9.js → changeSets-DYGm5j1A.js} +2 -2
  82. package/dist/admin/assets/{changeSets-C54Ku-X9.js.map → changeSets-DYGm5j1A.js.map} +1 -1
  83. package/dist/admin/assets/chevron-left-DIp5sJuv.js +2 -0
  84. package/dist/admin/assets/{chevron-left-BeJdUVAX.js.map → chevron-left-DIp5sJuv.js.map} +1 -1
  85. package/dist/admin/assets/{circle-check-ktACw37r.js → circle-check-VXPKg4cE.js} +2 -2
  86. package/dist/admin/assets/{circle-check-ktACw37r.js.map → circle-check-VXPKg4cE.js.map} +1 -1
  87. package/dist/admin/assets/{clock-BKNNASKp.js → clock-DNhupIko.js} +2 -2
  88. package/dist/admin/assets/{clock-BKNNASKp.js.map → clock-DNhupIko.js.map} +1 -1
  89. package/dist/admin/assets/cn-CEPUgFbZ.js +2 -0
  90. package/dist/admin/assets/cn-CEPUgFbZ.js.map +1 -0
  91. package/dist/admin/assets/coerce-BxuBjZdf.js +2 -0
  92. package/dist/admin/assets/{coerce-DDQ1vGLx.js.map → coerce-BxuBjZdf.js.map} +1 -1
  93. package/dist/admin/assets/{constants-DH7oqfO_.js → constants-B9cNrCXV.js} +2 -2
  94. package/dist/admin/assets/{constants-DH7oqfO_.js.map → constants-B9cNrCXV.js.map} +1 -1
  95. package/dist/admin/assets/{content-BptqQO8c.js → content-DjyCdi4c.js} +3 -3
  96. package/dist/admin/assets/{content-BptqQO8c.js.map → content-DjyCdi4c.js.map} +1 -1
  97. package/dist/admin/assets/{contentCounts-BpGlmyeZ.js → contentCounts-CX15iYcR.js} +2 -2
  98. package/dist/admin/assets/{contentCounts-BpGlmyeZ.js.map → contentCounts-CX15iYcR.js.map} +1 -1
  99. package/dist/admin/assets/{contentTypes-B_mAlIcH.js → contentTypes-FgyxLhlk.js} +2 -2
  100. package/dist/admin/assets/{contentTypes-B_mAlIcH.js.map → contentTypes-FgyxLhlk.js.map} +1 -1
  101. package/dist/admin/assets/{context-DyyMW7Md.js → context-FqJXjS5k.js} +2 -2
  102. package/dist/admin/assets/{context-DyyMW7Md.js.map → context-FqJXjS5k.js.map} +1 -1
  103. package/dist/admin/assets/{copy-DjzlFY9u.js → copy-CoHbtS-Y.js} +2 -2
  104. package/dist/admin/assets/{copy-DjzlFY9u.js.map → copy-CoHbtS-Y.js.map} +1 -1
  105. package/dist/admin/assets/{dateTimeLocal-DFXY779D.js → dateTimeLocal-BxmDLO_H.js} +2 -2
  106. package/dist/admin/assets/{dateTimeLocal-DFXY779D.js.map → dateTimeLocal-BxmDLO_H.js.map} +1 -1
  107. package/dist/admin/assets/{develop-DJap_z-1.js → develop-gx8WeWv4.js} +2 -2
  108. package/dist/admin/assets/{develop-DJap_z-1.js.map → develop-gx8WeWv4.js.map} +1 -1
  109. package/dist/admin/assets/{dropdown-menu-DGSMTf23.js → dropdown-menu-BG1rctRQ.js} +2 -2
  110. package/dist/admin/assets/{dropdown-menu-DGSMTf23.js.map → dropdown-menu-BG1rctRQ.js.map} +1 -1
  111. package/dist/admin/assets/{ellipsis-BMP-j3yO.js → ellipsis-DHfP1Ah2.js} +2 -2
  112. package/dist/admin/assets/{ellipsis-BMP-j3yO.js.map → ellipsis-DHfP1Ah2.js.map} +1 -1
  113. package/dist/admin/assets/{external-link-DzOkt97S.js → external-link-itxcNtaX.js} +2 -2
  114. package/dist/admin/assets/{external-link-DzOkt97S.js.map → external-link-itxcNtaX.js.map} +1 -1
  115. package/dist/admin/assets/{fileRoute-CG0Dufvt.js → fileRoute-BZ0pGGsh.js} +2 -2
  116. package/dist/admin/assets/{fileRoute-CG0Dufvt.js.map → fileRoute-BZ0pGGsh.js.map} +1 -1
  117. package/dist/admin/assets/{folder-plus-C-LhI4a2.js → folder-plus-BgsfY_6i.js} +2 -2
  118. package/dist/admin/assets/{folder-plus-C-LhI4a2.js.map → folder-plus-BgsfY_6i.js.map} +1 -1
  119. package/dist/admin/assets/{followPlural-D-8kzFOe.js → followPlural-BqjqhHmz.js} +2 -2
  120. package/dist/admin/assets/{followPlural-D-8kzFOe.js.map → followPlural-BqjqhHmz.js.map} +1 -1
  121. package/dist/admin/assets/{globe-DOoGBy23.js → globe-RjXj4P-A.js} +2 -2
  122. package/dist/admin/assets/{globe-DOoGBy23.js.map → globe-RjXj4P-A.js.map} +1 -1
  123. package/dist/admin/assets/{image-D9p_gGE2.js → image-4itB4TLl.js} +2 -2
  124. package/dist/admin/assets/{image-D9p_gGE2.js.map → image-4itB4TLl.js.map} +1 -1
  125. package/dist/admin/assets/{image-off-G0M2Nh1I.js → image-off-CokIymyg.js} +2 -2
  126. package/dist/admin/assets/{image-off-G0M2Nh1I.js.map → image-off-CokIymyg.js.map} +1 -1
  127. package/dist/admin/assets/{inbox-XaM-nvsM.js → inbox-8AAyyM0T.js} +2 -2
  128. package/dist/admin/assets/{inbox-XaM-nvsM.js.map → inbox-8AAyyM0T.js.map} +1 -1
  129. package/dist/admin/assets/{inbox-CMzYVMZo.js → inbox-97pzmuus.js} +2 -2
  130. package/dist/admin/assets/{inbox-CMzYVMZo.js.map → inbox-97pzmuus.js.map} +1 -1
  131. package/dist/admin/assets/{index-DHmfMpqz.js → index-cpiZvLck.js} +4 -4
  132. package/dist/admin/assets/{index-DHmfMpqz.js.map → index-cpiZvLck.js.map} +1 -1
  133. package/dist/admin/assets/{key-round-HBvMrmMo.js → key-round-Dc4_SOi-.js} +2 -2
  134. package/dist/admin/assets/{key-round-HBvMrmMo.js.map → key-round-Dc4_SOi-.js.map} +1 -1
  135. package/dist/admin/assets/{languages-BOv0jYhe.js → languages-DR2K97A5.js} +2 -2
  136. package/dist/admin/assets/{languages-BOv0jYhe.js.map → languages-DR2K97A5.js.map} +1 -1
  137. package/dist/admin/assets/{layers-CkZyCaeb.js → layers-ZPmcbieN.js} +2 -2
  138. package/dist/admin/assets/{layers-CkZyCaeb.js.map → layers-ZPmcbieN.js.map} +1 -1
  139. package/dist/admin/assets/{link-2-off-UUkSmPIL.js → link-2-off-D_5_hkT7.js} +2 -2
  140. package/dist/admin/assets/{link-2-off-UUkSmPIL.js.map → link-2-off-D_5_hkT7.js.map} +1 -1
  141. package/dist/admin/assets/{link-Bvqcg7db.js → link-BnDFFyvi.js} +2 -2
  142. package/dist/admin/assets/{link-Bvqcg7db.js.map → link-BnDFFyvi.js.map} +1 -1
  143. package/dist/admin/assets/{locales-DbrcdhZi.js → locales-D-21t-l-.js} +2 -2
  144. package/dist/admin/assets/{locales-DbrcdhZi.js.map → locales-D-21t-l-.js.map} +1 -1
  145. package/dist/admin/assets/{media-ugEyLgwN.js → media-D7aimjyy.js} +2 -2
  146. package/dist/admin/assets/{media-ugEyLgwN.js.map → media-D7aimjyy.js.map} +1 -1
  147. package/dist/admin/assets/{media-CO0HSS3b.js → media-Db0cHYNY.js} +2 -2
  148. package/dist/admin/assets/{media-CO0HSS3b.js.map → media-Db0cHYNY.js.map} +1 -1
  149. package/dist/admin/assets/network-l_oLT5fa.js +2 -0
  150. package/dist/admin/assets/network-l_oLT5fa.js.map +1 -0
  151. package/dist/admin/assets/{pencil-BLNGNJmL.js → pencil-Cn8c_gtv.js} +2 -2
  152. package/dist/admin/assets/{pencil-BLNGNJmL.js.map → pencil-Cn8c_gtv.js.map} +1 -1
  153. package/dist/admin/assets/{plus-BXMBYPoB.js → plus-yxvf4aAT.js} +2 -2
  154. package/dist/admin/assets/{plus-BXMBYPoB.js.map → plus-yxvf4aAT.js.map} +1 -1
  155. package/dist/admin/assets/{preload-helper-DEbJbZwX.js → preload-helper-pwSesV5P.js} +2 -2
  156. package/dist/admin/assets/{preload-helper-DEbJbZwX.js.map → preload-helper-pwSesV5P.js.map} +1 -1
  157. package/dist/admin/assets/{publishing-DKrATBaj.js → publishing-PQLCOnvu.js} +2 -2
  158. package/dist/admin/assets/{publishing-DKrATBaj.js.map → publishing-PQLCOnvu.js.map} +1 -1
  159. package/dist/admin/assets/{radio-group-BIhT_uEK.js → radio-group-Fc2ENIMO.js} +2 -2
  160. package/dist/admin/assets/{radio-group-BIhT_uEK.js.map → radio-group-Fc2ENIMO.js.map} +1 -1
  161. package/dist/admin/assets/{rotate-ccw-DqbffhiC.js → rotate-ccw-BHa0BHug.js} +2 -2
  162. package/dist/admin/assets/{rotate-ccw-DqbffhiC.js.map → rotate-ccw-BHa0BHug.js.map} +1 -1
  163. package/dist/admin/assets/{schedules-CETl2eLe.js → schedules-B8y_GnqX.js} +2 -2
  164. package/dist/admin/assets/{schedules-CETl2eLe.js.map → schedules-B8y_GnqX.js.map} +1 -1
  165. package/dist/admin/assets/{schema-CWHuez0q.js → schema-BJHcYshf.js} +2 -2
  166. package/dist/admin/assets/{schema-CWHuez0q.js.map → schema-BJHcYshf.js.map} +1 -1
  167. package/dist/admin/assets/{scroll-text-DlcDEi2k.js → scroll-text-BHLmZpBB.js} +2 -2
  168. package/dist/admin/assets/{scroll-text-DlcDEi2k.js.map → scroll-text-BHLmZpBB.js.map} +1 -1
  169. package/dist/admin/assets/{search-Dy2dtwyR.js → search-D3GGSaSL.js} +2 -2
  170. package/dist/admin/assets/{search-Dy2dtwyR.js.map → search-D3GGSaSL.js.map} +1 -1
  171. package/dist/admin/assets/{searchSchemas-Cz4P1iku.js → searchSchemas-C4dnYI9a.js} +2 -2
  172. package/dist/admin/assets/{searchSchemas-Cz4P1iku.js.map → searchSchemas-C4dnYI9a.js.map} +1 -1
  173. package/dist/admin/assets/{sections-BfG6DTFr.js → sections-BWoTaw2B.js} +2 -2
  174. package/dist/admin/assets/{sections-BfG6DTFr.js.map → sections-BWoTaw2B.js.map} +1 -1
  175. package/dist/admin/assets/{sections-EgXyXN3-.js → sections-eeTU636D.js} +2 -2
  176. package/dist/admin/assets/{sections-EgXyXN3-.js.map → sections-eeTU636D.js.map} +1 -1
  177. package/dist/admin/assets/{select--mePTdz8.js → select-BMi4G1Ib.js} +2 -2
  178. package/dist/admin/assets/{select--mePTdz8.js.map → select-BMi4G1Ib.js.map} +1 -1
  179. package/dist/admin/assets/{send-DVgq5Iwg.js → send-Bqhmg9HP.js} +2 -2
  180. package/dist/admin/assets/{send-DVgq5Iwg.js.map → send-Bqhmg9HP.js.map} +1 -1
  181. package/dist/admin/assets/{seo-Zhb62Ojz.js → seo-BL9C7Yt3.js} +2 -2
  182. package/dist/admin/assets/{seo-Zhb62Ojz.js.map → seo-BL9C7Yt3.js.map} +1 -1
  183. package/dist/admin/assets/settings-D-nW3wQb.js +2 -0
  184. package/dist/admin/assets/settings-D-nW3wQb.js.map +1 -0
  185. package/dist/admin/assets/skeleton-BPLAzyDo.js +42 -0
  186. package/dist/admin/assets/skeleton-BPLAzyDo.js.map +1 -0
  187. package/dist/admin/assets/{snapshots-BpLhILlt.js → snapshots-COSUeZBP.js} +2 -2
  188. package/dist/admin/assets/{snapshots-BpLhILlt.js.map → snapshots-COSUeZBP.js.map} +1 -1
  189. package/dist/admin/assets/{sparkles-Dd6S_roX.js → sparkles-CykwtKTd.js} +2 -2
  190. package/dist/admin/assets/{sparkles-Dd6S_roX.js.map → sparkles-CykwtKTd.js.map} +1 -1
  191. package/dist/admin/assets/{stableId-DFVM13gJ.js → stableId-DfJkQUV3.js} +2 -2
  192. package/dist/admin/assets/{stableId-DFVM13gJ.js.map → stableId-DfJkQUV3.js.map} +1 -1
  193. package/dist/admin/assets/{store-BP-xStwU.js → store-GOGeP63I.js} +2 -2
  194. package/dist/admin/assets/{store-BP-xStwU.js.map → store-GOGeP63I.js.map} +1 -1
  195. package/dist/admin/assets/{switch-skVypg5O.js → switch-XRU_EOoM.js} +2 -2
  196. package/dist/admin/assets/{switch-skVypg5O.js.map → switch-XRU_EOoM.js.map} +1 -1
  197. package/dist/admin/assets/{table-BMbbRUK9.js → table-CLVW6uJB.js} +2 -2
  198. package/dist/admin/assets/{table-BMbbRUK9.js.map → table-CLVW6uJB.js.map} +1 -1
  199. package/dist/admin/assets/{tabs-C1lgOg1B.js → tabs-DB42Xljn.js} +3 -3
  200. package/dist/admin/assets/{tabs-C1lgOg1B.js.map → tabs-DB42Xljn.js.map} +1 -1
  201. package/dist/admin/assets/{textarea-CffBBxoQ.js → textarea-DcsLGCkq.js} +2 -2
  202. package/dist/admin/assets/{textarea-CffBBxoQ.js.map → textarea-DcsLGCkq.js.map} +1 -1
  203. package/dist/admin/assets/{theme-RHTVnR9j.js → theme-CnSar6tt.js} +2 -2
  204. package/dist/admin/assets/{theme-RHTVnR9j.js.map → theme-CnSar6tt.js.map} +1 -1
  205. package/dist/admin/assets/{titles-DWiPmNvn.js → titles-DluirfBO.js} +2 -2
  206. package/dist/admin/assets/{titles-DWiPmNvn.js.map → titles-DluirfBO.js.map} +1 -1
  207. package/dist/admin/assets/{tokens-BqyeN1D-.js → tokens-CQooB8Sf.js} +2 -2
  208. package/dist/admin/assets/{tokens-BqyeN1D-.js.map → tokens-CQooB8Sf.js.map} +1 -1
  209. package/dist/admin/assets/{tooltip-BfSF6EyR.js → tooltip-xfZn0Fla.js} +2 -2
  210. package/dist/admin/assets/{tooltip-BfSF6EyR.js.map → tooltip-xfZn0Fla.js.map} +1 -1
  211. package/dist/admin/assets/{undo-2-p4YlNhBp.js → undo-2-B_QjuGmR.js} +2 -2
  212. package/dist/admin/assets/{undo-2-p4YlNhBp.js.map → undo-2-B_QjuGmR.js.map} +1 -1
  213. package/dist/admin/assets/{useAuditLabels-DV5gcaaG.js → useAuditLabels-BZPAj3wG.js} +2 -2
  214. package/dist/admin/assets/{useAuditLabels-DV5gcaaG.js.map → useAuditLabels-BZPAj3wG.js.map} +1 -1
  215. package/dist/admin/assets/{useConfirmTarget-DCvnxNVg.js → useConfirmTarget-B7iLg66j.js} +2 -2
  216. package/dist/admin/assets/{useConfirmTarget-DCvnxNVg.js.map → useConfirmTarget-B7iLg66j.js.map} +1 -1
  217. package/dist/admin/assets/{useContentSchema-z6tNif86.js → useContentSchema-BTyBYURX.js} +2 -2
  218. package/dist/admin/assets/{useContentSchema-z6tNif86.js.map → useContentSchema-BTyBYURX.js.map} +1 -1
  219. package/dist/admin/assets/{useCursorPager-CQGX41_L.js → useCursorPager-CTGOzl69.js} +2 -2
  220. package/dist/admin/assets/{useCursorPager-CQGX41_L.js.map → useCursorPager-CTGOzl69.js.map} +1 -1
  221. package/dist/admin/assets/{useDiscardGuard-Dhbif7VL.js → useDiscardGuard-CSkPw8iq.js} +2 -2
  222. package/dist/admin/assets/{useDiscardGuard-Dhbif7VL.js.map → useDiscardGuard-CSkPw8iq.js.map} +1 -1
  223. package/dist/admin/assets/{useMediaPickerDialog-D-5uKsMG.js → useMediaPickerDialog-W0jhN-hi.js} +2 -2
  224. package/dist/admin/assets/{useMediaPickerDialog-D-5uKsMG.js.map → useMediaPickerDialog-W0jhN-hi.js.map} +1 -1
  225. package/dist/admin/assets/{useMediaUploader-BtLoimmQ.js → useMediaUploader-BC5zCkQt.js} +2 -2
  226. package/dist/admin/assets/{useMediaUploader-BtLoimmQ.js.map → useMediaUploader-BC5zCkQt.js.map} +1 -1
  227. package/dist/admin/assets/{usePaletteItems-D3PZsW0Q.js → usePaletteItems-CqcKndUT.js} +2 -2
  228. package/dist/admin/assets/{usePaletteItems-D3PZsW0Q.js.map → usePaletteItems-CqcKndUT.js.map} +1 -1
  229. package/dist/admin/assets/{usePlaces-Cj5PljTy.js → usePlaces-o4Os5Nbv.js} +2 -2
  230. package/dist/admin/assets/{usePlaces-Cj5PljTy.js.map → usePlaces-o4Os5Nbv.js.map} +1 -1
  231. package/dist/admin/assets/{useQueries-CeDzli4Z.js → useQueries-BTnSD0k5.js} +2 -2
  232. package/dist/admin/assets/{useQueries-CeDzli4Z.js.map → useQueries-BTnSD0k5.js.map} +1 -1
  233. package/dist/admin/assets/{useResolvedScheme-DHD-zisP.js → useResolvedScheme-SoI-2Faf.js} +2 -2
  234. package/dist/admin/assets/{useResolvedScheme-DHD-zisP.js.map → useResolvedScheme-SoI-2Faf.js.map} +1 -1
  235. package/dist/admin/assets/{useSchemaScopeAccess-BNeVslcv.js → useSchemaScopeAccess-B4-31q7m.js} +2 -2
  236. package/dist/admin/assets/{useSchemaScopeAccess-BNeVslcv.js.map → useSchemaScopeAccess-B4-31q7m.js.map} +1 -1
  237. package/dist/admin/assets/{users-BRefbzuS.js → users-BVuapb3u.js} +2 -2
  238. package/dist/admin/assets/{users-BRefbzuS.js.map → users-BVuapb3u.js.map} +1 -1
  239. package/dist/admin/assets/{users-CppI8ctO.js → users-Oj5V5za_.js} +2 -2
  240. package/dist/admin/assets/{users-CppI8ctO.js.map → users-Oj5V5za_.js.map} +1 -1
  241. package/dist/admin/assets/{zod-Dcwk-m8X.js → zod-cTJwCa4E.js} +2 -2
  242. package/dist/admin/assets/{zod-Dcwk-m8X.js.map → zod-cTJwCa4E.js.map} +1 -1
  243. package/dist/admin/index.html +55 -55
  244. package/dist/cli.js +90 -31
  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-DYR4mtVQ.d.ts → public-C027OJX6.d.ts} +12 -2
  250. package/dist/{s3Adapter-C8AgFVYw.js → s3Adapter-CQ4iXRWp.js} +2 -2
  251. package/dist/{s3Adapter-C8AgFVYw.js.map → s3Adapter-CQ4iXRWp.js.map} +1 -1
  252. package/dist/{worker-jz_0yAmS.js → worker-W5eY5lSj.js} +174 -60
  253. package/dist/worker-W5eY5lSj.js.map +1 -0
  254. package/package.json +5 -5
  255. package/dist/admin/assets/FormCheckboxGroup-JP1xzReQ.js +0 -2
  256. package/dist/admin/assets/FormCheckboxGroup-JP1xzReQ.js.map +0 -1
  257. package/dist/admin/assets/SecretReveal-mYCzxF96.js +0 -2
  258. package/dist/admin/assets/SecretReveal-mYCzxF96.js.map +0 -1
  259. package/dist/admin/assets/Structure-CL_0hVci.js +0 -2
  260. package/dist/admin/assets/chevron-left-BeJdUVAX.js +0 -2
  261. package/dist/admin/assets/cn-h5ORT3LK.js +0 -2
  262. package/dist/admin/assets/cn-h5ORT3LK.js.map +0 -1
  263. package/dist/admin/assets/coerce-DDQ1vGLx.js +0 -2
  264. package/dist/admin/assets/network-BfDaUb7D.js +0 -2
  265. package/dist/admin/assets/network-BfDaUb7D.js.map +0 -1
  266. package/dist/admin/assets/settings-Mscp6tN5.js +0 -2
  267. package/dist/admin/assets/settings-Mscp6tN5.js.map +0 -1
  268. package/dist/admin/assets/skeleton-DJVukcn6.js +0 -42
  269. package/dist/admin/assets/skeleton-DJVukcn6.js.map +0 -1
  270. package/dist/worker-jz_0yAmS.js.map +0 -1
package/dist/config.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as ServiceFactoryContext, C as HookEvent, D as MediaUsage, E as MediaReferenceService, F as defineConfig, I as isHookError, M as ShapioServices, N as ThemeDefinition, O as ModelHooks, P as ThemeTokens, S as HookError, T as JobHandlerContext, _ as ExtensionRoute, a as BeforeHookContext, b as ExtensionSite, c as ContentReadOptions, d as EXTENSION_CONTRACT_VERSION, f as EnqueueOptions, g as ExtensionJobService, h as ExtensionJobHandler, i as BeforeHook, j as ShapioConfig, k as ServiceFactory, l as ContentReadService, m as ExtensionHostConfig, n as AfterHookContext, o as BeforeHookEvent, p as EntryData, r as AfterHookEvent, s as ContentReadEntry, t as AfterHook, u as CustomServices, v as ExtensionRouteOptions, w as HookModel, x as HookEntry, y as ExtensionServices } from "./public-DYR4mtVQ.js";
1
+ import { A as ServiceFactoryContext, C as HookEvent, D as MediaUsage, E as MediaReferenceService, F as defineConfig, I as isHookError, M as ShapioServices, N as ThemeDefinition, O as ModelHooks, P as ThemeTokens, S as HookError, T as JobHandlerContext, _ as ExtensionRoute, a as BeforeHookContext, b as ExtensionSite, c as ContentReadOptions, d as EXTENSION_CONTRACT_VERSION, f as EnqueueOptions, g as ExtensionJobService, h as ExtensionJobHandler, i as BeforeHook, j as ShapioConfig, k as ServiceFactory, l as ContentReadService, m as ExtensionHostConfig, n as AfterHookContext, o as BeforeHookEvent, p as EntryData, r as AfterHookEvent, s as ContentReadEntry, t as AfterHook, u as CustomServices, v as ExtensionRouteOptions, w as HookModel, x as HookEntry, y as ExtensionServices } from "./public-C027OJX6.js";
2
2
  export { AfterHook, AfterHookContext, AfterHookEvent, BeforeHook, BeforeHookContext, BeforeHookEvent, ContentReadEntry, ContentReadOptions, ContentReadService, CustomServices, EXTENSION_CONTRACT_VERSION, EnqueueOptions, EntryData, ExtensionHostConfig, ExtensionJobHandler, ExtensionJobService, ExtensionRoute, ExtensionRouteOptions, ExtensionServices, ExtensionSite, HookEntry, HookError, HookEvent, HookModel, JobHandlerContext, MediaReferenceService, MediaUsage, ModelHooks, ServiceFactory, ServiceFactoryContext, ShapioConfig, ShapioServices, ThemeDefinition, ThemeTokens, defineConfig, isHookError };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as ServiceFactoryContext, B as Principal, C as HookEvent, D as MediaUsage, E as MediaReferenceService, F as defineConfig, G as ComponentDefinition, H as DB, I as isHookError, J as ModelDefinition, K as DataType, L as KnownVersions, M as ShapioServices, N as ThemeDefinition, O as ModelHooks, P as ThemeTokens, R as PermissionEvaluator, S as HookError, T as JobHandlerContext, U as OutboxEvents, V as Database, W as ContentData, Y as SchemaChange, _ as ExtensionRoute, a as BeforeHookContext, b as ExtensionSite, c as ContentReadOptions, d as EXTENSION_CONTRACT_VERSION, f as EnqueueOptions, g as ExtensionJobService, h as ExtensionJobHandler, i as BeforeHook, j as ShapioConfig, k as ServiceFactory, l as ContentReadService, m as ExtensionHostConfig, n as AfterHookContext, o as BeforeHookEvent, p as EntryData, q as JsonValue, r as AfterHookEvent, s as ContentReadEntry, t as AfterHook, u as CustomServices, v as ExtensionRouteOptions, w as HookModel, x as HookEntry, y as ExtensionServices, z as PermissionExecutor } from "./public-DYR4mtVQ.js";
1
+ import { A as ServiceFactoryContext, B as Principal, C as HookEvent, D as MediaUsage, E as MediaReferenceService, F as defineConfig, G as ComponentDefinition, H as DB, I as isHookError, J as ModelDefinition, K as DataType, L as KnownVersions, M as ShapioServices, N as ThemeDefinition, O as ModelHooks, P as ThemeTokens, R as PermissionEvaluator, S as HookError, T as JobHandlerContext, U as OutboxEvents, V as Database, W as ContentData, Y as SchemaChange, _ as ExtensionRoute, a as BeforeHookContext, b as ExtensionSite, c as ContentReadOptions, d as EXTENSION_CONTRACT_VERSION, f as EnqueueOptions, g as ExtensionJobService, h as ExtensionJobHandler, i as BeforeHook, j as ShapioConfig, k as ServiceFactory, l as ContentReadService, m as ExtensionHostConfig, n as AfterHookContext, o as BeforeHookEvent, p as EntryData, q as JsonValue, r as AfterHookEvent, s as ContentReadEntry, t as AfterHook, u as CustomServices, v as ExtensionRouteOptions, w as HookModel, x as HookEntry, y as ExtensionServices, z as PermissionExecutor } from "./public-C027OJX6.js";
2
2
  import { FastifyBaseLogger, FastifyInstance } from "fastify";
3
3
  import { Kysely, Selectable, Transaction } from "kysely";
4
4
  import { Static, Type } from "typebox";
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as loadConfig, f as SHAPIO_VERSION, n as startServer, s as buildApp, t as startDedicatedWorker } from "./worker-jz_0yAmS.js";
1
+ import { a as loadConfig, f as SHAPIO_VERSION, n as startServer, s as buildApp, t as startDedicatedWorker } from "./worker-W5eY5lSj.js";
2
2
  import { EXTENSION_CONTRACT_VERSION, HookError, defineConfig, isHookError } from "./config.js";
3
3
  export { EXTENSION_CONTRACT_VERSION, HookError, SHAPIO_VERSION, buildApp, defineConfig, isHookError, loadConfig, startDedicatedWorker, startServer };
@@ -1092,6 +1092,16 @@ type SystemPrincipal = {
1092
1092
  type Principal = AdminPrincipal | AppUserPrincipal | TokenPrincipal | AnonymousPrincipal | SystemPrincipal;
1093
1093
  declare const CONTENT_ACTIONS: readonly ["read", "create", "update", "delete", "publish", "schemaManage"];
1094
1094
  type ContentAction = (typeof CONTENT_ACTIONS)[number];
1095
+ /**
1096
+ * What a delivery role may grant (plan drafts-mode §1): `read`, and `readDrafts`, which lets a delivery token
1097
+ * read draft heads (`?publicationState=draft`, GraphQL `publicationState: DRAFT`) on top of `read`. A
1098
+ * `readDrafts` grant always covers every model (no model, condition or field list), so one check per request
1099
+ * covers relation targets too. Admin and app roles never hold it; admin principals read drafts without it.
1100
+ */
1101
+ declare const DELIVERY_ACTIONS: readonly ["read", "readDrafts"];
1102
+ type DeliveryAction = (typeof DELIVERY_ACTIONS)[number];
1103
+ /** Any action evaluated per model: content actions, and `readDrafts`. */
1104
+ type ModelAction = ContentAction | DeliveryAction;
1095
1105
  declare const GLOBAL_ACTIONS: readonly ["schema.create", "users.manage", "roles.manage", "audit.read", "sites.manage", "tokens.manage", "media.read", "media.write", "media.manage", "publishing.manage", "webhooks.manage", "deployments.manage", "deployments.trigger", "changes.manage", "changes.ship", "site.settings"];
1096
1106
  type GlobalAction = (typeof GLOBAL_ACTIONS)[number];
1097
1107
  /** Field visibility by stable field ID. `all` means every field the schema exposes to this principal kind. */
@@ -1120,7 +1130,7 @@ type Policy = {
1120
1130
  writeMask: FieldMask;
1121
1131
  };
1122
1132
  type PolicyRequest = {
1123
- action: ContentAction;
1133
+ action: ModelAction;
1124
1134
  modelId: string;
1125
1135
  };
1126
1136
  /**
@@ -1446,4 +1456,4 @@ declare class HookError extends Error {
1446
1456
  declare const isHookError: (error: unknown) => error is HookError;
1447
1457
  //#endregion
1448
1458
  export { ServiceFactoryContext as A, Principal as B, HookEvent as C, MediaUsage as D, MediaReferenceService as E, defineConfig as F, ComponentDefinition as G, DB as H, isHookError as I, ModelDefinition as J, DataType as K, KnownVersions as L, ShapioServices as M, ThemeDefinition as N, ModelHooks as O, ThemeTokens as P, PermissionEvaluator as R, HookError as S, JobHandlerContext as T, OutboxEvents as U, Database as V, ContentData as W, SchemaChange as Y, ExtensionRoute as _, BeforeHookContext as a, ExtensionSite as b, ContentReadOptions as c, EXTENSION_CONTRACT_VERSION as d, EnqueueOptions as f, ExtensionJobService as g, ExtensionJobHandler as h, BeforeHook as i, ShapioConfig as j, ServiceFactory as k, ContentReadService as l, ExtensionHostConfig as m, AfterHookContext as n, BeforeHookEvent as o, EntryData as p, JsonValue$1 as q, AfterHookEvent as r, ContentReadEntry as s, AfterHook as t, CustomServices as u, ExtensionRouteOptions as v, HookModel as w, HookEntry as x, ExtensionServices as y, PermissionExecutor as z };
1449
- //# sourceMappingURL=public-DYR4mtVQ.d.ts.map
1459
+ //# sourceMappingURL=public-C027OJX6.d.ts.map
@@ -1,4 +1,4 @@
1
- import { M as isValidStorageKey, c as bucketContentDisposition, h as ObjectNotFoundError, j as encodeKeyPath, l as contentDisposition, m as InvalidStorageKeyError } from "./worker-jz_0yAmS.js";
1
+ import { M as isValidStorageKey, c as bucketContentDisposition, h as ObjectNotFoundError, j as encodeKeyPath, l as contentDisposition, m as InvalidStorageKeyError } from "./worker-W5eY5lSj.js";
2
2
  import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
3
3
  import { createPresignedPost } from "@aws-sdk/s3-presigned-post";
4
4
  import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
@@ -122,4 +122,4 @@ const createS3Adapter = ({ config, publicBaseUrl, client }) => {
122
122
  //#endregion
123
123
  export { createS3Adapter };
124
124
 
125
- //# sourceMappingURL=s3Adapter-C8AgFVYw.js.map
125
+ //# sourceMappingURL=s3Adapter-CQ4iXRWp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"s3Adapter-C8AgFVYw.js","names":[],"sources":["../src/media/s3Adapter.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n PutObjectCommand,\n S3Client,\n S3ServiceException,\n} from '@aws-sdk/client-s3';\nimport { createPresignedPost } from '@aws-sdk/s3-presigned-post';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { S3StorageConfig } from '../config/index.js';\nimport { bucketContentDisposition, contentDisposition } from './contentDisposition.js';\nimport { InvalidStorageKeyError, ObjectNotFoundError } from './errors.js';\nimport { encodeKeyPath, isValidStorageKey } from './keys.js';\nimport type { StorageAdapter } from './types.js';\n\n/** R2 accepts any region name (\"auto\" by convention); AWS needs the bucket's real region. */\nconst DEFAULT_REGION = 'us-east-1';\n\nconst isNotFound = (error: unknown): boolean =>\n error instanceof S3ServiceException &&\n (error.$metadata.httpStatusCode === 404 || error.name === 'NotFound' || error.name === 'NoSuchKey');\n\nexport const createS3Client = (config: S3StorageConfig): S3Client =>\n new S3Client({\n region: config.region ?? DEFAULT_REGION,\n ...(config.endpoint ? { endpoint: config.endpoint } : {}),\n forcePathStyle: config.forcePathStyle,\n ...(config.accessKeyId && config.secretAccessKey\n ? { credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey } }\n : {}),\n // Only send/validate checksums when an operation requires them: several S3-compatible services\n // (R2, B2 and other gateways) reject the SDK's default streaming CRC32 trailers.\n requestChecksumCalculation: 'WHEN_REQUIRED',\n responseChecksumValidation: 'WHEN_REQUIRED',\n });\n\nexport type S3AdapterOptions = {\n config: S3StorageConfig;\n publicBaseUrl: string | undefined;\n /** Injected in tests; created from `config` otherwise. */\n client?: S3Client;\n};\n\n/**\n * Any S3-compatible service (AWS S3, Cloudflare R2, B2, Spaces, Wasabi, versitygw). Private objects are read\n * through presigned GET URLs; browsers upload straight to the bucket with a presigned POST whose policy\n * limits size and content type, so Shapio never streams upload bytes.\n */\nexport const createS3Adapter = ({ config, publicBaseUrl, client }: S3AdapterOptions): StorageAdapter => {\n const s3 = client ?? createS3Client(config);\n const Bucket = config.bucket;\n const checkKey = (key: string) => {\n if (!isValidStorageKey(key)) {\n throw new InvalidStorageKeyError(key);\n }\n return key;\n };\n\n const head = async (key: string) => {\n try {\n const result = await s3.send(new HeadObjectCommand({ Bucket, Key: checkKey(key) }));\n return { size: result.ContentLength ?? 0, contentType: result.ContentType };\n } catch (error) {\n if (isNotFound(error)) {\n return undefined;\n }\n throw error;\n }\n };\n\n return {\n driver: 's3',\n put: async (key, body, { contentType, contentLength }) => {\n await s3.send(\n new PutObjectCommand({\n Bucket,\n Key: checkKey(key),\n Body: body,\n ContentType: contentType,\n ContentLength: Buffer.isBuffer(body) ? body.length : contentLength,\n ContentDisposition: bucketContentDisposition(contentType),\n }),\n );\n },\n getStream: async (key, range) => {\n try {\n const result = await s3.send(\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ...(range ? { Range: `bytes=${range.start}-${range.end}` } : {}),\n }),\n );\n if (!result.Body) {\n throw new ObjectNotFoundError(key);\n }\n return result.Body as Readable;\n } catch (error) {\n throw isNotFound(error) ? new ObjectNotFoundError(key, { cause: error }) : error;\n }\n },\n head,\n exists: async (key) => (await head(key)) !== undefined,\n delete: async (key) => {\n await s3.send(new DeleteObjectCommand({ Bucket, Key: checkKey(key) }));\n },\n signedGetUrl: async (key, { expiresInSeconds, filename, contentType }) =>\n getSignedUrl(\n s3,\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ResponseContentType: contentType,\n ResponseContentDisposition: contentDisposition(filename),\n }),\n { expiresIn: expiresInSeconds },\n ),\n publicUrl: (key) => (publicBaseUrl ? `${publicBaseUrl}/${encodeKeyPath(checkKey(key))}` : undefined),\n presignedUpload: async ({ key, contentType, maxSizeBytes, expiresInSeconds }) => {\n const disposition = bucketContentDisposition(contentType);\n const { url, fields } = await createPresignedPost(s3, {\n Bucket,\n Key: checkKey(key),\n Conditions: [\n ['content-length-range', 1, maxSizeBytes],\n ['eq', '$Content-Type', contentType],\n ...(disposition ? [['eq', '$Content-Disposition', disposition] as ['eq', string, string]] : []),\n ],\n Fields: {\n 'Content-Type': contentType,\n ...(disposition ? { 'Content-Disposition': disposition } : {}),\n },\n Expires: expiresInSeconds,\n });\n return { url, fields };\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"s3Adapter-CQ4iXRWp.js","names":[],"sources":["../src/media/s3Adapter.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n PutObjectCommand,\n S3Client,\n S3ServiceException,\n} from '@aws-sdk/client-s3';\nimport { createPresignedPost } from '@aws-sdk/s3-presigned-post';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { S3StorageConfig } from '../config/index.js';\nimport { bucketContentDisposition, contentDisposition } from './contentDisposition.js';\nimport { InvalidStorageKeyError, ObjectNotFoundError } from './errors.js';\nimport { encodeKeyPath, isValidStorageKey } from './keys.js';\nimport type { StorageAdapter } from './types.js';\n\n/** R2 accepts any region name (\"auto\" by convention); AWS needs the bucket's real region. */\nconst DEFAULT_REGION = 'us-east-1';\n\nconst isNotFound = (error: unknown): boolean =>\n error instanceof S3ServiceException &&\n (error.$metadata.httpStatusCode === 404 || error.name === 'NotFound' || error.name === 'NoSuchKey');\n\nexport const createS3Client = (config: S3StorageConfig): S3Client =>\n new S3Client({\n region: config.region ?? DEFAULT_REGION,\n ...(config.endpoint ? { endpoint: config.endpoint } : {}),\n forcePathStyle: config.forcePathStyle,\n ...(config.accessKeyId && config.secretAccessKey\n ? { credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey } }\n : {}),\n // Only send/validate checksums when an operation requires them: several S3-compatible services\n // (R2, B2 and other gateways) reject the SDK's default streaming CRC32 trailers.\n requestChecksumCalculation: 'WHEN_REQUIRED',\n responseChecksumValidation: 'WHEN_REQUIRED',\n });\n\nexport type S3AdapterOptions = {\n config: S3StorageConfig;\n publicBaseUrl: string | undefined;\n /** Injected in tests; created from `config` otherwise. */\n client?: S3Client;\n};\n\n/**\n * Any S3-compatible service (AWS S3, Cloudflare R2, B2, Spaces, Wasabi, versitygw). Private objects are read\n * through presigned GET URLs; browsers upload straight to the bucket with a presigned POST whose policy\n * limits size and content type, so Shapio never streams upload bytes.\n */\nexport const createS3Adapter = ({ config, publicBaseUrl, client }: S3AdapterOptions): StorageAdapter => {\n const s3 = client ?? createS3Client(config);\n const Bucket = config.bucket;\n const checkKey = (key: string) => {\n if (!isValidStorageKey(key)) {\n throw new InvalidStorageKeyError(key);\n }\n return key;\n };\n\n const head = async (key: string) => {\n try {\n const result = await s3.send(new HeadObjectCommand({ Bucket, Key: checkKey(key) }));\n return { size: result.ContentLength ?? 0, contentType: result.ContentType };\n } catch (error) {\n if (isNotFound(error)) {\n return undefined;\n }\n throw error;\n }\n };\n\n return {\n driver: 's3',\n put: async (key, body, { contentType, contentLength }) => {\n await s3.send(\n new PutObjectCommand({\n Bucket,\n Key: checkKey(key),\n Body: body,\n ContentType: contentType,\n ContentLength: Buffer.isBuffer(body) ? body.length : contentLength,\n ContentDisposition: bucketContentDisposition(contentType),\n }),\n );\n },\n getStream: async (key, range) => {\n try {\n const result = await s3.send(\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ...(range ? { Range: `bytes=${range.start}-${range.end}` } : {}),\n }),\n );\n if (!result.Body) {\n throw new ObjectNotFoundError(key);\n }\n return result.Body as Readable;\n } catch (error) {\n throw isNotFound(error) ? new ObjectNotFoundError(key, { cause: error }) : error;\n }\n },\n head,\n exists: async (key) => (await head(key)) !== undefined,\n delete: async (key) => {\n await s3.send(new DeleteObjectCommand({ Bucket, Key: checkKey(key) }));\n },\n signedGetUrl: async (key, { expiresInSeconds, filename, contentType }) =>\n getSignedUrl(\n s3,\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ResponseContentType: contentType,\n ResponseContentDisposition: contentDisposition(filename),\n }),\n { expiresIn: expiresInSeconds },\n ),\n publicUrl: (key) => (publicBaseUrl ? `${publicBaseUrl}/${encodeKeyPath(checkKey(key))}` : undefined),\n presignedUpload: async ({ key, contentType, maxSizeBytes, expiresInSeconds }) => {\n const disposition = bucketContentDisposition(contentType);\n const { url, fields } = await createPresignedPost(s3, {\n Bucket,\n Key: checkKey(key),\n Conditions: [\n ['content-length-range', 1, maxSizeBytes],\n ['eq', '$Content-Type', contentType],\n ...(disposition ? [['eq', '$Content-Disposition', disposition] as ['eq', string, string]] : []),\n ],\n Fields: {\n 'Content-Type': contentType,\n ...(disposition ? { 'Content-Disposition': disposition } : {}),\n },\n Expires: expiresInSeconds,\n });\n return { url, fields };\n },\n };\n};\n"],"mappings":"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"}
@@ -10434,6 +10434,14 @@ const CONTENT_ACTIONS = [
10434
10434
  "schemaManage"
10435
10435
  ];
10436
10436
  /**
10437
+ * What a delivery role may grant (plan drafts-mode §1): `read`, and `readDrafts`, which lets a delivery token
10438
+ * read draft heads (`?publicationState=draft`, GraphQL `publicationState: DRAFT`) on top of `read`. A
10439
+ * `readDrafts` grant always covers every model (no model, condition or field list), so one check per request
10440
+ * covers relation targets too. Admin and app roles never hold it; admin principals read drafts without it.
10441
+ */
10442
+ const DELIVERY_ACTIONS = ["read", "readDrafts"];
10443
+ const READ_DRAFTS_ACTION = "readDrafts";
10444
+ /**
10437
10445
  * Content actions about the schema rather than one site's entries: network roles only for a shared
10438
10446
  * definition; for a site's own definition, the roles that apply on that site (when the principal acts there).
10439
10447
  */
@@ -12153,7 +12161,11 @@ const groupBindings = (rows) => {
12153
12161
  }
12154
12162
  return bindings;
12155
12163
  };
12156
- const KNOWN_ACTIONS = /* @__PURE__ */ new Set([...CONTENT_ACTIONS, ...GLOBAL_ACTIONS]);
12164
+ const KNOWN_ACTIONS = /* @__PURE__ */ new Set([
12165
+ ...CONTENT_ACTIONS,
12166
+ ...DELIVERY_ACTIONS,
12167
+ ...GLOBAL_ACTIONS
12168
+ ]);
12157
12169
  const KNOWN_CONDITIONS = /* @__PURE__ */ new Set(["ownedByPrincipal"]);
12158
12170
  /**
12159
12171
  * A stored grant as this build understands it. Rows written by a newer Shapio may name an action or a row
@@ -12299,7 +12311,9 @@ const allowsGlobalAction = (grants, action) => grants.some((grant) => grant.acti
12299
12311
  //#endregion
12300
12312
  //#region src/permissions/evaluator.ts
12301
12313
  const NETWORK_ACTION_SET = new Set(NETWORK_ACTIONS);
12302
- const READ_ONLY$1 = /* @__PURE__ */ new Set(["read"]);
12314
+ /** Delivery tokens read, and read drafts where their role grants `readDrafts`. */
12315
+ const DELIVERY_TOKEN_ACTIONS = new Set(DELIVERY_ACTIONS);
12316
+ /** App users and anonymous callers: never `readDrafts`, whatever a role says. */
12303
12317
  const APP_ACTIONS = new Set(APP_CONTENT_ACTIONS);
12304
12318
  /**
12305
12319
  * Which roles a principal holds and how its masks are computed. App users hold the custom app roles assigned
@@ -12326,7 +12340,7 @@ const rolesOf = async (principal, grants, executor, versions) => {
12326
12340
  roleIds: [principal.roleId],
12327
12341
  networkRoleIds: [],
12328
12342
  audience: "delivery",
12329
- actions: READ_ONLY$1
12343
+ actions: DELIVERY_TOKEN_ACTIONS
12330
12344
  };
12331
12345
  case "appUser": return {
12332
12346
  roleIds: [...await grants.getSiteAppRoleIds(principal.siteId, "authenticated", executor, versions), ...principal.roleIds],
@@ -13429,6 +13443,8 @@ const SITE_QUERY_PARAMETER = "site";
13429
13443
  * and the header that selects the site. CDNs that key on the URL only need `?site=` instead of the header.
13430
13444
  */
13431
13445
  const DELIVERY_VARY = "Authorization, Cookie, Shapio-Site";
13446
+ /** `Cache-Control` of delivery responses carrying drafts (REST and GraphQL; plan drafts-mode): never stored. */
13447
+ const DRAFTS_CACHE_CONTROL = "private, no-store";
13432
13448
  //#endregion
13433
13449
  //#region src/services/contentContext.ts
13434
13450
  /**
@@ -13623,6 +13639,8 @@ const RICH_TEXT_MODES = [
13623
13639
  /** What a delivery read returns for rich text when the request does not say (`?richText=`). */
13624
13640
  const DEFAULT_RICH_TEXT_MODE = "json";
13625
13641
  /** `?seo=`: SEO fields as stored, or merged with the site's SEO defaults (plan seo-fields). */
13642
+ /** Which heads a delivery read serves (`?publicationState=`, GraphQL's `publicationState`). */
13643
+ const PUBLICATION_STATES = ["published", "draft"];
13626
13644
  const SEO_MODES = ["raw", "resolved"];
13627
13645
  const ENTRY_LIST_STATUSES = [
13628
13646
  "draft",
@@ -14090,6 +14108,7 @@ const TOP_LEVEL_KEYS = /* @__PURE__ */ new Set([
14090
14108
  "snapshot",
14091
14109
  "richText",
14092
14110
  "seo",
14111
+ "publicationState",
14093
14112
  "q",
14094
14113
  "status",
14095
14114
  "author"
@@ -14269,6 +14288,18 @@ const parseSeo = (tree, context) => {
14269
14288
  if (value === "resolved" && !context.model.fields.some((field) => !field.deprecated && isSeoField(field) && context.isReadable(field))) throw queryInvalid(`"${context.model.apiKey}" has no SEO field to resolve`);
14270
14289
  return { seo: value };
14271
14290
  };
14291
+ const PUBLICATION_STATE_SET = new Set(PUBLICATION_STATES);
14292
+ /**
14293
+ * `?publicationState=published|draft` on delivery reads; whether the caller may read drafts is the service's
14294
+ * check.
14295
+ */
14296
+ const parsePublicationState = (tree, context) => {
14297
+ const value = single(tree.publicationState, "publicationState");
14298
+ if (value === void 0) return {};
14299
+ if (!context.allowPublicationState) throw queryInvalid("publicationState is only available on the delivery API");
14300
+ if (!PUBLICATION_STATE_SET.has(value)) throw queryInvalid(`"publicationState" must be one of ${PUBLICATION_STATES.join(", ")}`);
14301
+ return { publicationState: value };
14302
+ };
14272
14303
  const parseContentQuery = (tree, context) => {
14273
14304
  for (const key of Object.keys(tree)) if (!TOP_LEVEL_KEYS.has(key)) throw queryInvalid(`Unknown query parameter "${key}"`);
14274
14305
  const filters = tree.filters;
@@ -14292,6 +14323,7 @@ const parseContentQuery = (tree, context) => {
14292
14323
  snapshot,
14293
14324
  ...parseRichText(tree, context),
14294
14325
  ...parseSeo(tree, context),
14326
+ ...parsePublicationState(tree, context),
14295
14327
  ...parseAdminFilters(tree, context)
14296
14328
  };
14297
14329
  };
@@ -14911,6 +14943,7 @@ const parseQueryFor = (context, model, policy, rawQuery, options) => parseConten
14911
14943
  allowAdminFilters: options.allowAdminFilters ?? false,
14912
14944
  allowRichText: options.allowRichText ?? false,
14913
14945
  allowSeo: options.allowSeo ?? false,
14946
+ allowPublicationState: options.allowPublicationState ?? false,
14914
14947
  resolveModel: (modelId) => resolveModelById(context.snapshot, modelId)?.definition
14915
14948
  });
14916
14949
  /** The admin content list: drafts, filtered/sorted/paginated by the same compiler as delivery. */
@@ -15320,7 +15353,7 @@ const resolveMediaOrigins = async (storage) => {
15320
15353
  const base = originOf(storage.publicBaseUrl);
15321
15354
  if (base) origins.add(base);
15322
15355
  if (storage.s3) {
15323
- const { createS3Adapter } = await import("./s3Adapter-C8AgFVYw.js");
15356
+ const { createS3Adapter } = await import("./s3Adapter-CQ4iXRWp.js");
15324
15357
  const adapter = createS3Adapter({
15325
15358
  config: storage.s3,
15326
15359
  publicBaseUrl: void 0
@@ -18014,10 +18047,11 @@ const csrfForGet = (app) => (request, reply, done) => {
18014
18047
  /**
18015
18048
  * Responses vary by credentials. GET queries get REST's validators (a strong ETag over the body, 304 on a
18016
18049
  * match) and its caching policy (public for anonymous callers, private otherwise); everything else is
18017
- * never stored.
18050
+ * never stored. An operation that read drafts (the controller set `DRAFTS_CACHE_CONTROL`) keeps it.
18018
18051
  */
18019
18052
  const cacheHeaders = async (request, reply, payload) => {
18020
18053
  appendVary(reply, DELIVERY_VARY);
18054
+ if (reply.getHeader("cache-control") === "private, no-store") return payload;
18021
18055
  if (request.method !== "GET" || reply.statusCode !== 200 || typeof payload !== "string") {
18022
18056
  reply.header("cache-control", "no-store");
18023
18057
  return payload;
@@ -18910,8 +18944,9 @@ const createLoaders = (siteId, content) => {
18910
18944
  * The context every resolver of one operation receives, with its own DataLoaders. Carries no HTTP objects, so
18911
18945
  * an operation can run outside a request.
18912
18946
  */
18913
- const createGraphqlContext = ({ site, permissions, isAdmin, content }) => {
18947
+ const createGraphqlContext = ({ site, permissions, content }) => {
18914
18948
  let base;
18949
+ let drafts = false;
18915
18950
  const contentAt = async (snapshot) => {
18916
18951
  base ??= content(snapshot);
18917
18952
  return {
@@ -18922,7 +18957,10 @@ const createGraphqlContext = ({ site, permissions, isAdmin, content }) => {
18922
18957
  };
18923
18958
  return {
18924
18959
  permissions,
18925
- isAdmin,
18960
+ markDrafts: () => {
18961
+ drafts = true;
18962
+ },
18963
+ readDrafts: () => drafts,
18926
18964
  site,
18927
18965
  loaders: createLoaders(() => site.id, contentAt),
18928
18966
  content: contentAt
@@ -18976,13 +19014,10 @@ const rawQueryOf = (request) => {
18976
19014
  };
18977
19015
  //#endregion
18978
19016
  //#region src/controllers/graphqlContext.ts
18979
- /** Admin users and admin-scope API tokens: may read drafts. */
18980
- const isAdminPrincipal = (principal) => principal.kind === "admin" || principal.kind === "token" && principal.scope === "admin";
18981
19017
  /** The context every resolver of one `/api/graphql` request receives (built after site resolution). */
18982
19018
  const createGraphqlRequestContext = (request) => createGraphqlContext({
18983
19019
  site: getRequestSite(request),
18984
19020
  permissions: getRequestPermissions(request),
18985
- isAdmin: isAdminPrincipal(request.principal),
18986
19021
  content: () => contentContextFor(request)
18987
19022
  });
18988
19023
  //#endregion
@@ -19018,8 +19053,10 @@ const runGraphql = async (request, reply, input) => {
19018
19053
  }
19019
19054
  if (prepared.selectsIntrospection && !mayIntrospect) throw introspectionDisabled();
19020
19055
  const usage = collectUsage(request, schema, prepared.document, prepared.operation, input.variables ?? void 0);
19021
- const result = await executeOperation(schema, prepared, input, createGraphqlRequestContext(request));
19056
+ const context = createGraphqlRequestContext(request);
19057
+ const result = await executeOperation(schema, prepared, input, context);
19022
19058
  recordUsage$1(request, usage, result.data !== null && result.data !== void 0);
19059
+ if (context.readDrafts()) reply.header("cache-control", DRAFTS_CACHE_CONTROL);
19023
19060
  return send$1(reply, formatGraphqlResult(result, { log: request.log }));
19024
19061
  };
19025
19062
  const postGraphql = async (request, reply) => runGraphql(request, reply, request.body);
@@ -19433,7 +19470,7 @@ const createFixedTypes = () => {
19433
19470
  entry: createEntry$2(),
19434
19471
  publicationState: new GraphQLEnumType({
19435
19472
  name: "PublicationState",
19436
- description: "DRAFT is for admin principals only (previews).",
19473
+ description: "DRAFT is for admin principals and delivery tokens granted Read drafts (development servers).",
19437
19474
  values: {
19438
19475
  PUBLISHED: { value: "published" },
19439
19476
  DRAFT: { value: "draft" }
@@ -20414,6 +20451,26 @@ const restFieldReads = async ({ snapshot, model, policy, query, policyFor }) =>
20414
20451
  return reads;
20415
20452
  };
20416
20453
  //#endregion
20454
+ //#region src/services/draftAccess.ts
20455
+ /**
20456
+ * Who may read draft heads through the delivery API (plan drafts-mode §1). Admin users, admin-scope tokens
20457
+ * and Shapio itself always could (GraphQL previews). A delivery token may when its role grants `readDrafts`,
20458
+ * which always covers every model, so this one check per request also covers relation targets. App users and
20459
+ * anonymous callers never may, whatever a role says (the evaluator denies them too). The caller has already
20460
+ * checked `read` on the model.
20461
+ */
20462
+ const isAdminPrincipal = (principal) => principal.kind === "system" || principal.kind === "admin" || principal.kind === "token" && principal.scope === "admin";
20463
+ const draftsForbidden = (message) => new AppError(403, "DRAFTS_FORBIDDEN", message);
20464
+ const assertMayReadDrafts = async (context, modelId, modelKey) => {
20465
+ const { actor } = context;
20466
+ if (isAdminPrincipal(actor)) return;
20467
+ if (actor.kind !== "token") throw draftsForbidden("Drafts need an admin user or a delivery token granted Read drafts");
20468
+ if (!(await context.permissions.evaluate(actor, {
20469
+ action: "readDrafts",
20470
+ modelId
20471
+ })).allowed) throw draftsForbidden(`This token may not read drafts of "${modelKey}"; grant Read drafts on its delivery role`);
20472
+ };
20473
+ //#endregion
20417
20474
  //#region src/services/contentDelivery.ts
20418
20475
  const readableModel = async (context, modelKey) => {
20419
20476
  const model = resolveModel(context.snapshot, modelKey);
@@ -20427,10 +20484,19 @@ const readableModel = async (context, modelKey) => {
20427
20484
  policy
20428
20485
  };
20429
20486
  };
20430
- /** The heads a read serves: drafts (GraphQL previews), a pinned snapshot, or the published heads. */
20431
- const sourceOf = (query, options) => {
20432
- if (query.snapshot !== void 0 && options.drafts) throw queryInvalid("snapshot reads published content; it cannot be combined with drafts");
20433
- return options.drafts ? {
20487
+ /** Whether a read asks for drafts: GraphQL's option, or `?publicationState=draft`. */
20488
+ const readsDrafts = (query, options) => options.drafts === true || query.publicationState === "draft";
20489
+ /**
20490
+ * A draft read must be allowed: `read` was checked already; `readDrafts` (or an admin principal) is checked
20491
+ * here.
20492
+ */
20493
+ const authorizeDrafts$1 = async (context, model, modelKey, drafts) => {
20494
+ if (drafts) await assertMayReadDrafts(context, model.definition.id, modelKey);
20495
+ };
20496
+ /** The heads a read serves: drafts, a pinned snapshot, or the published heads. */
20497
+ const sourceOf = (query, drafts) => {
20498
+ if (query.snapshot !== void 0 && drafts) throw queryInvalid("snapshot reads published content; it cannot be combined with drafts");
20499
+ return drafts ? {
20434
20500
  kind: "heads",
20435
20501
  state: "draft"
20436
20502
  } : query.snapshot !== void 0 ? {
@@ -20451,7 +20517,7 @@ const snapshotCheck = (query) => (current) => {
20451
20517
  */
20452
20518
  const recordUsage = async (context, options, model, policy, query) => {
20453
20519
  const principalKey = usagePrincipalKey(context.actor);
20454
- if (!options.usage || options.drafts || principalKey === null) return;
20520
+ if (!options.usage || readsDrafts(query, options) || principalKey === null) return;
20455
20521
  const reads = await restFieldReads({
20456
20522
  snapshot: context.snapshot,
20457
20523
  model,
@@ -20479,8 +20545,24 @@ const ITEM_PARAMETERS$1 = /* @__PURE__ */ new Set([
20479
20545
  "locale",
20480
20546
  "snapshot",
20481
20547
  "richText",
20482
- "seo"
20548
+ "seo",
20549
+ "publicationState"
20483
20550
  ]);
20551
+ const DELIVERY_PARSE = {
20552
+ allowSnapshot: true,
20553
+ allowRichText: true,
20554
+ allowSeo: true,
20555
+ allowPublicationState: true
20556
+ };
20557
+ /** Meta every delivery response carries; draft reads add `publicationState` (published ones are unchanged). */
20558
+ const metaOf$1 = (locale, snapshot, drafts) => drafts ? {
20559
+ locale,
20560
+ snapshot,
20561
+ publicationState: "draft"
20562
+ } : {
20563
+ locale,
20564
+ snapshot
20565
+ };
20484
20566
  /** Reading one entry takes only these query parameters; anything else is refused, not ignored. */
20485
20567
  const assertItemParameters = (rawQuery, allowed) => {
20486
20568
  const unsupported = [...new URLSearchParams(rawQuery).keys()].find((key) => !allowed.has(key.split("[")[0] ?? key));
@@ -20489,16 +20571,15 @@ const assertItemParameters = (rawQuery, allowed) => {
20489
20571
  /** `GET /api/content/:modelKey`: a page of a collection, or a singleton's one entry. */
20490
20572
  const listDelivery$1 = async (context, modelKey, rawQuery, options = {}) => {
20491
20573
  const { model, policy } = await readableModel(context, modelKey);
20492
- const query = parseQueryFor(context, model, policy, rawQuery, {
20493
- allowSnapshot: true,
20494
- allowRichText: true,
20495
- allowSeo: true
20496
- });
20574
+ const query = parseQueryFor(context, model, policy, rawQuery, DELIVERY_PARSE);
20575
+ const drafts = readsDrafts(query, options);
20576
+ const source = sourceOf(query, drafts);
20577
+ await authorizeDrafts$1(context, model, modelKey, drafts);
20497
20578
  const locale = query.locale ?? context.snapshot.defaultLocale;
20498
20579
  const singleton = model.definition.kind === "singleton";
20499
20580
  const { entries, limit, total, seq } = await readEntryPage({
20500
20581
  context,
20501
- source: sourceOf(query, options),
20582
+ source,
20502
20583
  model,
20503
20584
  policy,
20504
20585
  query,
@@ -20514,34 +20595,32 @@ const listDelivery$1 = async (context, modelKey, rawQuery, options = {}) => {
20514
20595
  if (!entry) throw entryNotFound(modelKey);
20515
20596
  result = {
20516
20597
  data: entry,
20517
- meta: {
20518
- locale,
20519
- snapshot
20520
- }
20598
+ meta: metaOf$1(locale, snapshot, drafts)
20521
20599
  };
20522
20600
  } else result = {
20523
20601
  data: entries,
20524
20602
  meta: {
20525
- locale,
20526
- snapshot,
20603
+ ...metaOf$1(locale, snapshot, drafts),
20527
20604
  pagination: paginationMeta(query.page, limit, total)
20528
20605
  }
20529
20606
  };
20530
20607
  await afterRead(options, () => recordUsage(context, options, model, policy, query));
20531
20608
  return result;
20532
20609
  };
20533
- /** `GET /api/content/:modelKey/:id`: one published entry (404 for drafts, unknown or unreadable entries). */
20610
+ /**
20611
+ * `GET /api/content/:modelKey/:id`: one published entry (404 for unpublished, unknown or unreadable entries);
20612
+ * with drafts, the entry's draft.
20613
+ */
20534
20614
  const getDelivery$1 = async (context, modelKey, id, rawQuery, options = {}) => {
20535
20615
  assertItemParameters(rawQuery, ITEM_PARAMETERS$1);
20536
20616
  const { model, policy } = await readableModel(context, modelKey);
20537
- const query = parseQueryFor(context, model, policy, rawQuery, {
20538
- allowSnapshot: true,
20539
- allowRichText: true,
20540
- allowSeo: true
20541
- });
20617
+ const query = parseQueryFor(context, model, policy, rawQuery, DELIVERY_PARSE);
20618
+ const drafts = readsDrafts(query, options);
20619
+ const source = sourceOf(query, drafts);
20620
+ await authorizeDrafts$1(context, model, modelKey, drafts);
20542
20621
  const { entry, seq } = await readOneEntry({
20543
20622
  context,
20544
- source: sourceOf(query, options),
20623
+ source,
20545
20624
  model,
20546
20625
  policy,
20547
20626
  query,
@@ -20551,10 +20630,7 @@ const getDelivery$1 = async (context, modelKey, id, rawQuery, options = {}) => {
20551
20630
  await afterRead(options, () => recordUsage(context, options, model, policy, query));
20552
20631
  return {
20553
20632
  data: entry,
20554
- meta: {
20555
- locale: query.locale ?? context.snapshot.defaultLocale,
20556
- snapshot: query.snapshot ?? seq
20557
- }
20633
+ meta: metaOf$1(query.locale ?? context.snapshot.defaultLocale, query.snapshot ?? seq, drafts)
20558
20634
  };
20559
20635
  };
20560
20636
  //#endregion
@@ -20699,18 +20775,21 @@ const readArgs = (build) => ({
20699
20775
  publicationState: {
20700
20776
  type: build.fixed.publicationState,
20701
20777
  defaultValue: "published",
20702
- description: "DRAFT needs an admin user or an admin API token"
20778
+ description: "DRAFT needs an admin user, an admin API token or a delivery token granted Read drafts"
20703
20779
  },
20704
20780
  snapshot: {
20705
20781
  type: GraphQLInt,
20706
20782
  description: "Read published content as of this publication sequence"
20707
20783
  }
20708
20784
  });
20709
- const draftsForbidden = () => new AppError(403, "FORBIDDEN", "publicationState DRAFT needs an admin user or an admin API token");
20710
- /** The read scope of a root read; drafts only for admin principals (never delivery principals). */
20785
+ /**
20786
+ * The read scope of a root read. Drafts: the delivery service checks the caller may read them (admin
20787
+ * principals, delivery tokens granted Read drafts; plan drafts-mode) before reading any head, and the
20788
+ * response is marked never to be stored.
20789
+ */
20711
20790
  const scopeOf = (args, context) => {
20712
20791
  const drafts = args.publicationState === "draft";
20713
- if (drafts && !context.isAdmin) throw draftsForbidden();
20792
+ if (drafts) context.markDrafts();
20714
20793
  return {
20715
20794
  locale: args.locale ?? void 0,
20716
20795
  fallback: args.fallback ?? true,
@@ -21633,7 +21712,7 @@ const createMediaStorage = async (config, deps) => {
21633
21712
  publicBaseUrl: config.publicBaseUrl
21634
21713
  }));
21635
21714
  if (config.s3) {
21636
- const { createS3Adapter } = await import("./s3Adapter-C8AgFVYw.js");
21715
+ const { createS3Adapter } = await import("./s3Adapter-CQ4iXRWp.js");
21637
21716
  adapters.set("s3", createS3Adapter({
21638
21717
  config: config.s3,
21639
21718
  publicBaseUrl: config.publicBaseUrl
@@ -22452,7 +22531,8 @@ const outboundPolicy = (runtime, allowPrivateNetwork) => ({
22452
22531
  });
22453
22532
  //#endregion
22454
22533
  //#region src/services/roles.ts
22455
- const CONTENT_ACTION_SET = new Set(CONTENT_ACTIONS);
22534
+ const MODEL_ACTION_SET = /* @__PURE__ */ new Set([...CONTENT_ACTIONS, ...DELIVERY_ACTIONS]);
22535
+ const DELIVERY_ACTION_SET = new Set(DELIVERY_ACTIONS);
22456
22536
  const GLOBAL_ACTION_SET = new Set(GLOBAL_ACTIONS);
22457
22537
  const FIELD_SCOPED_ACTIONS = /* @__PURE__ */ new Set([
22458
22538
  "read",
@@ -22479,9 +22559,17 @@ const toRoleView = (role, grants) => ({
22479
22559
  });
22480
22560
  const invalidPermissions = (message, details) => new AppError(400, "INVALID_PERMISSIONS", message, details);
22481
22561
  /**
22562
+ * `readDrafts` (plan drafts-mode §1): delivery roles only, and always on every model with no condition or
22563
+ * field list, so one check per request covers every model a draft read reaches (relation targets too).
22564
+ */
22565
+ const validateReadDrafts = (kind, permission, at) => {
22566
+ if (kind !== "delivery") throw invalidPermissions("Read drafts is for delivery roles only", at);
22567
+ if (permission.modelId !== null || permission.condition !== null || permission.fieldIds !== null) throw invalidPermissions("Read drafts applies to every model, with no condition or field list", at);
22568
+ };
22569
+ /**
22482
22570
  * The server-side rules for grants (never only the UI): known actions, global actions only without a
22483
- * model, conditions and field lists only where they mean something, delivery roles read-only, no
22484
- * duplicate (action, model) pairs.
22571
+ * model, conditions and field lists only where they mean something, delivery roles read-only (`read`, and
22572
+ * `readDrafts` on every model), no duplicate (action, model) pairs.
22485
22573
  */
22486
22574
  const validatePermissions = (kind, permissions) => {
22487
22575
  const seen = /* @__PURE__ */ new Set();
@@ -22491,9 +22579,10 @@ const validatePermissions = (kind, permissions) => {
22491
22579
  action: permission.action
22492
22580
  };
22493
22581
  const isGlobal = GLOBAL_ACTION_SET.has(permission.action);
22494
- if (!isGlobal && !CONTENT_ACTION_SET.has(permission.action)) throw invalidPermissions("Unknown action", at);
22582
+ if (!isGlobal && !MODEL_ACTION_SET.has(permission.action)) throw invalidPermissions("Unknown action", at);
22495
22583
  if (isGlobal && (permission.modelId !== null || permission.condition !== null || permission.fieldIds !== null)) throw invalidPermissions("Global actions take no model, condition or field list", at);
22496
- if (kind === "delivery" && permission.action !== "read") throw invalidPermissions("Delivery roles can only read", at);
22584
+ if (kind === "delivery" && !DELIVERY_ACTION_SET.has(permission.action)) throw invalidPermissions("Delivery roles can only read", at);
22585
+ if (permission.action === "readDrafts") validateReadDrafts(kind, permission, at);
22497
22586
  if (permission.fieldIds !== null && !FIELD_SCOPED_ACTIONS.has(permission.action)) throw invalidPermissions("Field lists apply to read, create and update only", at);
22498
22587
  const key = `${permission.action}\u0000${permission.modelId ?? "*"}`;
22499
22588
  if (seen.has(key)) throw invalidPermissions("Each action may be granted once per model", at);
@@ -22845,7 +22934,11 @@ Type.Enum(SITE_ACTIONS);
22845
22934
  /** What `me.sitePermissions` lists: site actions, and network actions a role on the site grants there. */
22846
22935
  const SitePermissionSchema = Type.Enum([...SITE_ACTIONS, ...SITE_GRANTABLE_ACTION_LIST]);
22847
22936
  const PermissionSchema$1 = Type.Object({
22848
- action: Type.Enum([...CONTENT_ACTIONS, ...GLOBAL_ACTIONS]),
22937
+ action: Type.Enum([
22938
+ ...CONTENT_ACTIONS,
22939
+ READ_DRAFTS_ACTION,
22940
+ ...GLOBAL_ACTIONS
22941
+ ]),
22849
22942
  modelId: Type.Union([Type.String({
22850
22943
  minLength: 1,
22851
22944
  maxLength: 100
@@ -38959,7 +39052,7 @@ const openStoredBundle = (storage, stored) => storage.get(stored.driver).getStre
38959
39052
  const removeStoredBundle = (storage, stored) => storage.get(stored.driver).delete(stored.key);
38960
39053
  //#endregion
38961
39054
  //#region src/constants/version.ts
38962
- const SHAPIO_VERSION = "0.5.0";
39055
+ const SHAPIO_VERSION = "0.5.2";
38963
39056
  //#endregion
38964
39057
  //#region src/repositories/transferExport.ts
38965
39058
  /**
@@ -41109,18 +41202,22 @@ const appAuthRoutes = async (app) => {
41109
41202
  };
41110
41203
  //#endregion
41111
41204
  //#region src/controllers/delivery.ts
41205
+ const cacheControlOf = (request, noStore) => {
41206
+ if (noStore) return DRAFTS_CACHE_CONTROL;
41207
+ return request.principal.kind === "anonymous" ? "public, max-age=0, must-revalidate" : "private, max-age=0, must-revalidate";
41208
+ };
41112
41209
  /**
41113
41210
  * Delivery responses are cacheable by validators: a strong ETag over the exact body (so it changes whenever
41114
41211
  * a head version, a populated target or the projection changes), `Vary` on the credentials that select the
41115
41212
  * principal and on the `Shapio-Site` header that selects the site (`?site=` is part of the URL), and `private`
41116
- * caching whenever a principal is authenticated (build plan §4.E6).
41213
+ * caching whenever a principal is authenticated (build plan §4.E6). `noStore`: draft reads, never stored.
41117
41214
  */
41118
- const sendCacheable = (request, reply, payload) => {
41215
+ const sendCacheable = (request, reply, payload, { noStore = false } = {}) => {
41119
41216
  const body = JSON.stringify(payload);
41120
41217
  const etag = `"${createHash("sha256").update(body).digest("base64url").slice(0, 32)}"`;
41121
41218
  reply.header("etag", etag);
41122
41219
  appendVary(reply, DELIVERY_VARY);
41123
- reply.header("cache-control", request.principal.kind === "anonymous" ? "public, max-age=0, must-revalidate" : "private, max-age=0, must-revalidate");
41220
+ reply.header("cache-control", cacheControlOf(request, noStore));
41124
41221
  const match = request.headers["if-none-match"];
41125
41222
  if (typeof match === "string" && match.split(",").some((candidate) => candidate.trim() === etag)) return reply.code(304).send();
41126
41223
  return reply.type("application/json; charset=utf-8").send(body);
@@ -41130,15 +41227,17 @@ const usageOptions = (request) => ({
41130
41227
  usage: request.server.usage,
41131
41228
  defer: (task) => request.server.recordUsageAfterResponse(request.log, task)
41132
41229
  });
41230
+ /** A delivery response, never stored by a cache when it carries drafts. */
41231
+ const sendDelivery = (request, reply, result) => sendCacheable(request, reply, result, { noStore: result.meta.publicationState === "draft" });
41133
41232
  const listDelivery = async (request, reply) => {
41134
41233
  const context = await contentContextFor(request);
41135
41234
  const apiKey = apiKeyOfRoute(context.snapshot, request.params.modelKey);
41136
- return sendCacheable(request, reply, await listDelivery$1(context, apiKey, rawQueryOf(request), usageOptions(request)));
41235
+ return sendDelivery(request, reply, await listDelivery$1(context, apiKey, rawQueryOf(request), usageOptions(request)));
41137
41236
  };
41138
41237
  const getDelivery = async (request, reply) => {
41139
41238
  const context = await contentContextFor(request);
41140
41239
  const apiKey = apiKeyOfRoute(context.snapshot, request.params.modelKey);
41141
- return sendCacheable(request, reply, await getDelivery$1(context, apiKey, request.params.id, rawQueryOf(request), usageOptions(request)));
41240
+ return sendDelivery(request, reply, await getDelivery$1(context, apiKey, request.params.id, rawQueryOf(request), usageOptions(request)));
41142
41241
  };
41143
41242
  //#endregion
41144
41243
  //#region src/controllers/deliveryWrites.ts
@@ -41806,6 +41905,16 @@ const itemParameters = (model, delivery) => [
41806
41905
  },
41807
41906
  description: "Rich-text shape: the JSON document, sanitized HTML rendered from it, or both"
41808
41907
  },
41908
+ {
41909
+ name: "publicationState",
41910
+ in: "query",
41911
+ schema: {
41912
+ type: "string",
41913
+ enum: [...PUBLICATION_STATES],
41914
+ default: "published"
41915
+ },
41916
+ description: "Drafts mode: `draft` reads saved drafts instead of published content. Needs a delivery token whose role grants Read drafts (or an admin user); responses are never cached. Cannot be combined with `snapshot`."
41917
+ },
41809
41918
  ...seoParameters(model)
41810
41919
  ] : []
41811
41920
  ];
@@ -41831,7 +41940,12 @@ const modelPaths = (model) => {
41831
41940
  type: "object",
41832
41941
  properties: {
41833
41942
  locale: { type: "string" },
41834
- snapshot: { type: "integer" }
41943
+ snapshot: { type: "integer" },
41944
+ publicationState: {
41945
+ type: "string",
41946
+ enum: ["draft"],
41947
+ description: "Present on draft reads only"
41948
+ }
41835
41949
  }
41836
41950
  };
41837
41951
  const listMeta = { allOf: [meta, {
@@ -49510,4 +49624,4 @@ const startDedicatedWorker = async (config) => {
49510
49624
  //#endregion
49511
49625
  export { parseLockFile as $, buildEditorManifest as A, RESERVED_DEFINITION_API_KEYS as B, loopbackUrl as C, BEFORE_EVENTS as D, AFTER_EVENTS as E, lockById$5 as F, THEME_VARIANTS as G, RESERVED_TYPE_NAMES as H, update$8 as I, hashDefinition as J, checkThemeContrast as K, STORAGE_DRIVERS$1 as L, isValidStorageKey as M, listForAssets as N, EXTENSION_JOB_PREFIX as O, listLiveByDriver as P, parseDefinition as Q, describeError as R, createUrlBuilder as S, loadProjectConfig as T, SCHEMA_KIND_DIRECTORIES as U, RESERVED_FIELD_API_KEYS as V, SITES_DIRECTORY as W, lockEntriesForSite as X, lockCoversSite as Y, mergePulledLock as Z, listAllSites as _, loadConfig as a, toTypeName as at, generateToken as b, bucketContentDisposition as c, withSiteCovered as ct, migrateToLatest as d, createStableId as dt, schemaFilePath as et, SHAPIO_VERSION as f, validateRichText as ft, createSite$1 as g, ObjectNotFoundError as h, assertDatabaseReachable as i, suggestPlural as it, encodeKeyPath as j, EXTENSION_ROUTE_ROOT as k, contentDisposition as l, RICHTEXT_FORMAT as lt, InvalidStorageKeyError as m, sqliteDriverOf as mt, startServer as n, serializeDefinition as nt, loadEnvFileIfPresent as o, upgradeLockFile as ot, createMediaStorage as p, createDb as pt, foldApiKey as q, copyObjectVerified as r, serializeLockFile as rt, buildApp as s, validateSchema as st, startDedicatedWorker as t, scopeDirectory as tt, getPendingMigrations as u, SAFE_LINK_PATTERN as ut, createAdminDirect as v, SITE_KEY_PATTERN as w, createLogger as x, SYSTEM_CLI_ACTOR as y, LOCK_FILE_PATH as z };
49512
49626
 
49513
- //# sourceMappingURL=worker-jz_0yAmS.js.map
49627
+ //# sourceMappingURL=worker-W5eY5lSj.js.map