@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.
- package/dist/admin/assets/{AssetTile-zOf0K0nN.js → AssetTile-B8ftUG4s.js} +2 -2
- package/dist/admin/assets/{AssetTile-zOf0K0nN.js.map → AssetTile-B8ftUG4s.js.map} +1 -1
- package/dist/admin/assets/{AssistError-D_vY2CO0.js → AssistError-BidlzaBY.js} +2 -2
- package/dist/admin/assets/{AssistError-D_vY2CO0.js.map → AssistError-BidlzaBY.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-BEnSpClj.js → BlockMenuItems-DfNBHqVM.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-BEnSpClj.js.map → BlockMenuItems-DfNBHqVM.js.map} +1 -1
- package/dist/admin/assets/{Body-B_IVN5wp.js → Body-C0oQSX6L.js} +2 -2
- package/dist/admin/assets/{Body-B_IVN5wp.js.map → Body-C0oQSX6L.js.map} +1 -1
- package/dist/admin/assets/{Builder-CnEtRudv.js → Builder-Z_hcyzNW.js} +2 -2
- package/dist/admin/assets/{Builder-CnEtRudv.js.map → Builder-Z_hcyzNW.js.map} +1 -1
- package/dist/admin/assets/{ConfirmDialog-BW-l3Whg.js → ConfirmDialog-DVN-n-tE.js} +2 -2
- package/dist/admin/assets/{ConfirmDialog-BW-l3Whg.js.map → ConfirmDialog-DVN-n-tE.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-CyoUMStc.js → CopyButton--tHegXQr.js} +2 -2
- package/dist/admin/assets/{CopyButton-CyoUMStc.js.map → CopyButton--tHegXQr.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-BW2Dl_hn.js → CursorPager-Cb94mITn.js} +2 -2
- package/dist/admin/assets/{CursorPager-BW2Dl_hn.js.map → CursorPager-Cb94mITn.js.map} +1 -1
- package/dist/admin/assets/{ExternalLink-BCI0q9ib.js → ExternalLink-M1cb1n2n.js} +2 -2
- package/dist/admin/assets/{ExternalLink-BCI0q9ib.js.map → ExternalLink-M1cb1n2n.js.map} +1 -1
- package/dist/admin/assets/{FocalPoint-CxicvlJO.js → FocalPoint-pTq17ngi.js} +2 -2
- package/dist/admin/assets/{FocalPoint-CxicvlJO.js.map → FocalPoint-pTq17ngi.js.map} +1 -1
- package/dist/admin/assets/{Form-DB03drS9.js → Form-4zah109J.js} +2 -2
- package/dist/admin/assets/{Form-DB03drS9.js.map → Form-4zah109J.js.map} +1 -1
- package/dist/admin/assets/FormCheckboxGroup-DAeuGKAU.js +2 -0
- package/dist/admin/assets/FormCheckboxGroup-DAeuGKAU.js.map +1 -0
- package/dist/admin/assets/{FormRadioGroup-BvSC8SRm.js → FormRadioGroup--xx08rw6.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-BvSC8SRm.js.map → FormRadioGroup--xx08rw6.js.map} +1 -1
- package/dist/admin/assets/{FormSelectField-BDIVhZh6.js → FormSelectField-DNOCQKqc.js} +2 -2
- package/dist/admin/assets/{FormSelectField-BDIVhZh6.js.map → FormSelectField-DNOCQKqc.js.map} +1 -1
- package/dist/admin/assets/{FormSwitchField-OM4F8ln4.js → FormSwitchField-BECl-pzH.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-OM4F8ln4.js.map → FormSwitchField-BECl-pzH.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-Bw7EkC4H.js → FormTextareaField-DmRuKDJ_.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-Bw7EkC4H.js.map → FormTextareaField-DmRuKDJ_.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-BGidukgy.js → HintedLabel-DIEBvftx.js} +2 -2
- package/dist/admin/assets/{HintedLabel-BGidukgy.js.map → HintedLabel-DIEBvftx.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-D3uwei-E.js → InfoHint-BdAadb9U.js} +2 -2
- package/dist/admin/assets/{InfoHint-D3uwei-E.js.map → InfoHint-BdAadb9U.js.map} +1 -1
- package/dist/admin/assets/{InsertMenuItem-DAihGvbw.js → InsertMenuItem-oh0NJrhB.js} +2 -2
- package/dist/admin/assets/{InsertMenuItem-DAihGvbw.js.map → InsertMenuItem-oh0NJrhB.js.map} +1 -1
- package/dist/admin/assets/{LinkTabs-DBXbfzME.js → LinkTabs-EBgHX4Uh.js} +2 -2
- package/dist/admin/assets/{LinkTabs-DBXbfzME.js.map → LinkTabs-EBgHX4Uh.js.map} +1 -1
- package/dist/admin/assets/{Match-CgfZTzqs.js → Match-CvpSNEfi.js} +2 -2
- package/dist/admin/assets/{Match-CgfZTzqs.js.map → Match-CvpSNEfi.js.map} +1 -1
- package/dist/admin/assets/{Panel-DDky5_x9.js → Panel-BV1BpNCn.js} +2 -2
- package/dist/admin/assets/{Panel-DDky5_x9.js.map → Panel-BV1BpNCn.js.map} +1 -1
- package/dist/admin/assets/{QueryView-C2d392ly.js → QueryView-Bbw1eiV2.js} +2 -2
- package/dist/admin/assets/{QueryView-C2d392ly.js.map → QueryView-Bbw1eiV2.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-CcP78eb_.js → RadioTile-CSYW-8gL.js} +2 -2
- package/dist/admin/assets/{RadioTile-CcP78eb_.js.map → RadioTile-CSYW-8gL.js.map} +1 -1
- package/dist/admin/assets/{RichTextField-CeztaFET.js → RichTextField-BDb67rCi.js} +2 -2
- package/dist/admin/assets/{RichTextField-CeztaFET.js.map → RichTextField-BDb67rCi.js.map} +1 -1
- package/dist/admin/assets/{RowTitle-mkKp4yfl.js → RowTitle-Cted2GP8.js} +2 -2
- package/dist/admin/assets/{RowTitle-mkKp4yfl.js.map → RowTitle-Cted2GP8.js.map} +1 -1
- package/dist/admin/assets/SecretReveal-Ccaul96d.js +2 -0
- package/dist/admin/assets/SecretReveal-Ccaul96d.js.map +1 -0
- package/dist/admin/assets/{SharedGlyph-CuDT7OUU.js → SharedGlyph-BrLi3Hug.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-CuDT7OUU.js.map → SharedGlyph-BrLi3Hug.js.map} +1 -1
- package/dist/admin/assets/{StepList-BDO0Q3Wc.js → StepList-BLvElvPV.js} +2 -2
- package/dist/admin/assets/{StepList-BDO0Q3Wc.js.map → StepList-BLvElvPV.js.map} +1 -1
- package/dist/admin/assets/Structure-CRNAuVY7.js +2 -0
- package/dist/admin/assets/{Structure-CL_0hVci.js.map → Structure-CRNAuVY7.js.map} +1 -1
- package/dist/admin/assets/{SubNavLink-C4eSybWd.js → SubNavLink-biGV5ozd.js} +2 -2
- package/dist/admin/assets/{SubNavLink-C4eSybWd.js.map → SubNavLink-biGV5ozd.js.map} +1 -1
- package/dist/admin/assets/{SuggestAltButton-CxYlhwyd.js → SuggestAltButton-CrFiRWGr.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CxYlhwyd.js.map → SuggestAltButton-CrFiRWGr.js.map} +1 -1
- package/dist/admin/assets/{TextLink-DzNaAft6.js → TextLink-BPLbXw2n.js} +2 -2
- package/dist/admin/assets/{TextLink-DzNaAft6.js.map → TextLink-BPLbXw2n.js.map} +1 -1
- package/dist/admin/assets/{Thumbnail-DSPArZ9h.js → Thumbnail-B_TWlgEz.js} +2 -2
- package/dist/admin/assets/{Thumbnail-DSPArZ9h.js.map → Thumbnail-B_TWlgEz.js.map} +1 -1
- package/dist/admin/assets/{UnsavedChangesGuard-BPOCBD5T.js → UnsavedChangesGuard-CrzR2boF.js} +2 -2
- package/dist/admin/assets/{UnsavedChangesGuard-BPOCBD5T.js.map → UnsavedChangesGuard-CrzR2boF.js.map} +1 -1
- package/dist/admin/assets/{UserAvatar-BHNWHDVb.js → UserAvatar-W-S3st7E.js} +2 -2
- package/dist/admin/assets/{UserAvatar-BHNWHDVb.js.map → UserAvatar-W-S3st7E.js.map} +1 -1
- package/dist/admin/assets/{auth-BzCgJtgr.js → auth-cXFFyABE.js} +2 -2
- package/dist/admin/assets/{auth-BzCgJtgr.js.map → auth-cXFFyABE.js.map} +1 -1
- package/dist/admin/assets/{badge-DBoaS0nQ.js → badge-DrPwivGk.js} +2 -2
- package/dist/admin/assets/{badge-DBoaS0nQ.js.map → badge-DrPwivGk.js.map} +1 -1
- package/dist/admin/assets/{boxes-DhN0ctLo.js → boxes-CKJ6P9VA.js} +2 -2
- package/dist/admin/assets/{boxes-DhN0ctLo.js.map → boxes-CKJ6P9VA.js.map} +1 -1
- package/dist/admin/assets/{calendar-clock-BEA3tG17.js → calendar-clock-DPyjti63.js} +2 -2
- package/dist/admin/assets/{calendar-clock-BEA3tG17.js.map → calendar-clock-DPyjti63.js.map} +1 -1
- package/dist/admin/assets/{changeSets-C54Ku-X9.js → changeSets-DYGm5j1A.js} +2 -2
- package/dist/admin/assets/{changeSets-C54Ku-X9.js.map → changeSets-DYGm5j1A.js.map} +1 -1
- package/dist/admin/assets/chevron-left-DIp5sJuv.js +2 -0
- package/dist/admin/assets/{chevron-left-BeJdUVAX.js.map → chevron-left-DIp5sJuv.js.map} +1 -1
- package/dist/admin/assets/{circle-check-ktACw37r.js → circle-check-VXPKg4cE.js} +2 -2
- package/dist/admin/assets/{circle-check-ktACw37r.js.map → circle-check-VXPKg4cE.js.map} +1 -1
- package/dist/admin/assets/{clock-BKNNASKp.js → clock-DNhupIko.js} +2 -2
- package/dist/admin/assets/{clock-BKNNASKp.js.map → clock-DNhupIko.js.map} +1 -1
- package/dist/admin/assets/cn-CEPUgFbZ.js +2 -0
- package/dist/admin/assets/cn-CEPUgFbZ.js.map +1 -0
- package/dist/admin/assets/coerce-BxuBjZdf.js +2 -0
- package/dist/admin/assets/{coerce-DDQ1vGLx.js.map → coerce-BxuBjZdf.js.map} +1 -1
- package/dist/admin/assets/{constants-DH7oqfO_.js → constants-B9cNrCXV.js} +2 -2
- package/dist/admin/assets/{constants-DH7oqfO_.js.map → constants-B9cNrCXV.js.map} +1 -1
- package/dist/admin/assets/{content-BptqQO8c.js → content-DjyCdi4c.js} +3 -3
- package/dist/admin/assets/{content-BptqQO8c.js.map → content-DjyCdi4c.js.map} +1 -1
- package/dist/admin/assets/{contentCounts-BpGlmyeZ.js → contentCounts-CX15iYcR.js} +2 -2
- package/dist/admin/assets/{contentCounts-BpGlmyeZ.js.map → contentCounts-CX15iYcR.js.map} +1 -1
- package/dist/admin/assets/{contentTypes-B_mAlIcH.js → contentTypes-FgyxLhlk.js} +2 -2
- package/dist/admin/assets/{contentTypes-B_mAlIcH.js.map → contentTypes-FgyxLhlk.js.map} +1 -1
- package/dist/admin/assets/{context-DyyMW7Md.js → context-FqJXjS5k.js} +2 -2
- package/dist/admin/assets/{context-DyyMW7Md.js.map → context-FqJXjS5k.js.map} +1 -1
- package/dist/admin/assets/{copy-DjzlFY9u.js → copy-CoHbtS-Y.js} +2 -2
- package/dist/admin/assets/{copy-DjzlFY9u.js.map → copy-CoHbtS-Y.js.map} +1 -1
- package/dist/admin/assets/{dateTimeLocal-DFXY779D.js → dateTimeLocal-BxmDLO_H.js} +2 -2
- package/dist/admin/assets/{dateTimeLocal-DFXY779D.js.map → dateTimeLocal-BxmDLO_H.js.map} +1 -1
- package/dist/admin/assets/{develop-DJap_z-1.js → develop-gx8WeWv4.js} +2 -2
- package/dist/admin/assets/{develop-DJap_z-1.js.map → develop-gx8WeWv4.js.map} +1 -1
- package/dist/admin/assets/{dropdown-menu-DGSMTf23.js → dropdown-menu-BG1rctRQ.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-DGSMTf23.js.map → dropdown-menu-BG1rctRQ.js.map} +1 -1
- package/dist/admin/assets/{ellipsis-BMP-j3yO.js → ellipsis-DHfP1Ah2.js} +2 -2
- package/dist/admin/assets/{ellipsis-BMP-j3yO.js.map → ellipsis-DHfP1Ah2.js.map} +1 -1
- package/dist/admin/assets/{external-link-DzOkt97S.js → external-link-itxcNtaX.js} +2 -2
- package/dist/admin/assets/{external-link-DzOkt97S.js.map → external-link-itxcNtaX.js.map} +1 -1
- package/dist/admin/assets/{fileRoute-CG0Dufvt.js → fileRoute-BZ0pGGsh.js} +2 -2
- package/dist/admin/assets/{fileRoute-CG0Dufvt.js.map → fileRoute-BZ0pGGsh.js.map} +1 -1
- package/dist/admin/assets/{folder-plus-C-LhI4a2.js → folder-plus-BgsfY_6i.js} +2 -2
- package/dist/admin/assets/{folder-plus-C-LhI4a2.js.map → folder-plus-BgsfY_6i.js.map} +1 -1
- package/dist/admin/assets/{followPlural-D-8kzFOe.js → followPlural-BqjqhHmz.js} +2 -2
- package/dist/admin/assets/{followPlural-D-8kzFOe.js.map → followPlural-BqjqhHmz.js.map} +1 -1
- package/dist/admin/assets/{globe-DOoGBy23.js → globe-RjXj4P-A.js} +2 -2
- package/dist/admin/assets/{globe-DOoGBy23.js.map → globe-RjXj4P-A.js.map} +1 -1
- package/dist/admin/assets/{image-D9p_gGE2.js → image-4itB4TLl.js} +2 -2
- package/dist/admin/assets/{image-D9p_gGE2.js.map → image-4itB4TLl.js.map} +1 -1
- package/dist/admin/assets/{image-off-G0M2Nh1I.js → image-off-CokIymyg.js} +2 -2
- package/dist/admin/assets/{image-off-G0M2Nh1I.js.map → image-off-CokIymyg.js.map} +1 -1
- package/dist/admin/assets/{inbox-XaM-nvsM.js → inbox-8AAyyM0T.js} +2 -2
- package/dist/admin/assets/{inbox-XaM-nvsM.js.map → inbox-8AAyyM0T.js.map} +1 -1
- package/dist/admin/assets/{inbox-CMzYVMZo.js → inbox-97pzmuus.js} +2 -2
- package/dist/admin/assets/{inbox-CMzYVMZo.js.map → inbox-97pzmuus.js.map} +1 -1
- package/dist/admin/assets/{index-DHmfMpqz.js → index-cpiZvLck.js} +4 -4
- package/dist/admin/assets/{index-DHmfMpqz.js.map → index-cpiZvLck.js.map} +1 -1
- package/dist/admin/assets/{key-round-HBvMrmMo.js → key-round-Dc4_SOi-.js} +2 -2
- package/dist/admin/assets/{key-round-HBvMrmMo.js.map → key-round-Dc4_SOi-.js.map} +1 -1
- package/dist/admin/assets/{languages-BOv0jYhe.js → languages-DR2K97A5.js} +2 -2
- package/dist/admin/assets/{languages-BOv0jYhe.js.map → languages-DR2K97A5.js.map} +1 -1
- package/dist/admin/assets/{layers-CkZyCaeb.js → layers-ZPmcbieN.js} +2 -2
- package/dist/admin/assets/{layers-CkZyCaeb.js.map → layers-ZPmcbieN.js.map} +1 -1
- package/dist/admin/assets/{link-2-off-UUkSmPIL.js → link-2-off-D_5_hkT7.js} +2 -2
- package/dist/admin/assets/{link-2-off-UUkSmPIL.js.map → link-2-off-D_5_hkT7.js.map} +1 -1
- package/dist/admin/assets/{link-Bvqcg7db.js → link-BnDFFyvi.js} +2 -2
- package/dist/admin/assets/{link-Bvqcg7db.js.map → link-BnDFFyvi.js.map} +1 -1
- package/dist/admin/assets/{locales-DbrcdhZi.js → locales-D-21t-l-.js} +2 -2
- package/dist/admin/assets/{locales-DbrcdhZi.js.map → locales-D-21t-l-.js.map} +1 -1
- package/dist/admin/assets/{media-ugEyLgwN.js → media-D7aimjyy.js} +2 -2
- package/dist/admin/assets/{media-ugEyLgwN.js.map → media-D7aimjyy.js.map} +1 -1
- package/dist/admin/assets/{media-CO0HSS3b.js → media-Db0cHYNY.js} +2 -2
- package/dist/admin/assets/{media-CO0HSS3b.js.map → media-Db0cHYNY.js.map} +1 -1
- package/dist/admin/assets/network-l_oLT5fa.js +2 -0
- package/dist/admin/assets/network-l_oLT5fa.js.map +1 -0
- package/dist/admin/assets/{pencil-BLNGNJmL.js → pencil-Cn8c_gtv.js} +2 -2
- package/dist/admin/assets/{pencil-BLNGNJmL.js.map → pencil-Cn8c_gtv.js.map} +1 -1
- package/dist/admin/assets/{plus-BXMBYPoB.js → plus-yxvf4aAT.js} +2 -2
- package/dist/admin/assets/{plus-BXMBYPoB.js.map → plus-yxvf4aAT.js.map} +1 -1
- package/dist/admin/assets/{preload-helper-DEbJbZwX.js → preload-helper-pwSesV5P.js} +2 -2
- package/dist/admin/assets/{preload-helper-DEbJbZwX.js.map → preload-helper-pwSesV5P.js.map} +1 -1
- package/dist/admin/assets/{publishing-DKrATBaj.js → publishing-PQLCOnvu.js} +2 -2
- package/dist/admin/assets/{publishing-DKrATBaj.js.map → publishing-PQLCOnvu.js.map} +1 -1
- package/dist/admin/assets/{radio-group-BIhT_uEK.js → radio-group-Fc2ENIMO.js} +2 -2
- package/dist/admin/assets/{radio-group-BIhT_uEK.js.map → radio-group-Fc2ENIMO.js.map} +1 -1
- package/dist/admin/assets/{rotate-ccw-DqbffhiC.js → rotate-ccw-BHa0BHug.js} +2 -2
- package/dist/admin/assets/{rotate-ccw-DqbffhiC.js.map → rotate-ccw-BHa0BHug.js.map} +1 -1
- package/dist/admin/assets/{schedules-CETl2eLe.js → schedules-B8y_GnqX.js} +2 -2
- package/dist/admin/assets/{schedules-CETl2eLe.js.map → schedules-B8y_GnqX.js.map} +1 -1
- package/dist/admin/assets/{schema-CWHuez0q.js → schema-BJHcYshf.js} +2 -2
- package/dist/admin/assets/{schema-CWHuez0q.js.map → schema-BJHcYshf.js.map} +1 -1
- package/dist/admin/assets/{scroll-text-DlcDEi2k.js → scroll-text-BHLmZpBB.js} +2 -2
- package/dist/admin/assets/{scroll-text-DlcDEi2k.js.map → scroll-text-BHLmZpBB.js.map} +1 -1
- package/dist/admin/assets/{search-Dy2dtwyR.js → search-D3GGSaSL.js} +2 -2
- package/dist/admin/assets/{search-Dy2dtwyR.js.map → search-D3GGSaSL.js.map} +1 -1
- package/dist/admin/assets/{searchSchemas-Cz4P1iku.js → searchSchemas-C4dnYI9a.js} +2 -2
- package/dist/admin/assets/{searchSchemas-Cz4P1iku.js.map → searchSchemas-C4dnYI9a.js.map} +1 -1
- package/dist/admin/assets/{sections-BfG6DTFr.js → sections-BWoTaw2B.js} +2 -2
- package/dist/admin/assets/{sections-BfG6DTFr.js.map → sections-BWoTaw2B.js.map} +1 -1
- package/dist/admin/assets/{sections-EgXyXN3-.js → sections-eeTU636D.js} +2 -2
- package/dist/admin/assets/{sections-EgXyXN3-.js.map → sections-eeTU636D.js.map} +1 -1
- package/dist/admin/assets/{select--mePTdz8.js → select-BMi4G1Ib.js} +2 -2
- package/dist/admin/assets/{select--mePTdz8.js.map → select-BMi4G1Ib.js.map} +1 -1
- package/dist/admin/assets/{send-DVgq5Iwg.js → send-Bqhmg9HP.js} +2 -2
- package/dist/admin/assets/{send-DVgq5Iwg.js.map → send-Bqhmg9HP.js.map} +1 -1
- package/dist/admin/assets/{seo-Zhb62Ojz.js → seo-BL9C7Yt3.js} +2 -2
- package/dist/admin/assets/{seo-Zhb62Ojz.js.map → seo-BL9C7Yt3.js.map} +1 -1
- package/dist/admin/assets/settings-D-nW3wQb.js +2 -0
- package/dist/admin/assets/settings-D-nW3wQb.js.map +1 -0
- package/dist/admin/assets/skeleton-BPLAzyDo.js +42 -0
- package/dist/admin/assets/skeleton-BPLAzyDo.js.map +1 -0
- package/dist/admin/assets/{snapshots-BpLhILlt.js → snapshots-COSUeZBP.js} +2 -2
- package/dist/admin/assets/{snapshots-BpLhILlt.js.map → snapshots-COSUeZBP.js.map} +1 -1
- package/dist/admin/assets/{sparkles-Dd6S_roX.js → sparkles-CykwtKTd.js} +2 -2
- package/dist/admin/assets/{sparkles-Dd6S_roX.js.map → sparkles-CykwtKTd.js.map} +1 -1
- package/dist/admin/assets/{stableId-DFVM13gJ.js → stableId-DfJkQUV3.js} +2 -2
- package/dist/admin/assets/{stableId-DFVM13gJ.js.map → stableId-DfJkQUV3.js.map} +1 -1
- package/dist/admin/assets/{store-BP-xStwU.js → store-GOGeP63I.js} +2 -2
- package/dist/admin/assets/{store-BP-xStwU.js.map → store-GOGeP63I.js.map} +1 -1
- package/dist/admin/assets/{switch-skVypg5O.js → switch-XRU_EOoM.js} +2 -2
- package/dist/admin/assets/{switch-skVypg5O.js.map → switch-XRU_EOoM.js.map} +1 -1
- package/dist/admin/assets/{table-BMbbRUK9.js → table-CLVW6uJB.js} +2 -2
- package/dist/admin/assets/{table-BMbbRUK9.js.map → table-CLVW6uJB.js.map} +1 -1
- package/dist/admin/assets/{tabs-C1lgOg1B.js → tabs-DB42Xljn.js} +3 -3
- package/dist/admin/assets/{tabs-C1lgOg1B.js.map → tabs-DB42Xljn.js.map} +1 -1
- package/dist/admin/assets/{textarea-CffBBxoQ.js → textarea-DcsLGCkq.js} +2 -2
- package/dist/admin/assets/{textarea-CffBBxoQ.js.map → textarea-DcsLGCkq.js.map} +1 -1
- package/dist/admin/assets/{theme-RHTVnR9j.js → theme-CnSar6tt.js} +2 -2
- package/dist/admin/assets/{theme-RHTVnR9j.js.map → theme-CnSar6tt.js.map} +1 -1
- package/dist/admin/assets/{titles-DWiPmNvn.js → titles-DluirfBO.js} +2 -2
- package/dist/admin/assets/{titles-DWiPmNvn.js.map → titles-DluirfBO.js.map} +1 -1
- package/dist/admin/assets/{tokens-BqyeN1D-.js → tokens-CQooB8Sf.js} +2 -2
- package/dist/admin/assets/{tokens-BqyeN1D-.js.map → tokens-CQooB8Sf.js.map} +1 -1
- package/dist/admin/assets/{tooltip-BfSF6EyR.js → tooltip-xfZn0Fla.js} +2 -2
- package/dist/admin/assets/{tooltip-BfSF6EyR.js.map → tooltip-xfZn0Fla.js.map} +1 -1
- package/dist/admin/assets/{undo-2-p4YlNhBp.js → undo-2-B_QjuGmR.js} +2 -2
- package/dist/admin/assets/{undo-2-p4YlNhBp.js.map → undo-2-B_QjuGmR.js.map} +1 -1
- package/dist/admin/assets/{useAuditLabels-DV5gcaaG.js → useAuditLabels-BZPAj3wG.js} +2 -2
- package/dist/admin/assets/{useAuditLabels-DV5gcaaG.js.map → useAuditLabels-BZPAj3wG.js.map} +1 -1
- package/dist/admin/assets/{useConfirmTarget-DCvnxNVg.js → useConfirmTarget-B7iLg66j.js} +2 -2
- package/dist/admin/assets/{useConfirmTarget-DCvnxNVg.js.map → useConfirmTarget-B7iLg66j.js.map} +1 -1
- package/dist/admin/assets/{useContentSchema-z6tNif86.js → useContentSchema-BTyBYURX.js} +2 -2
- package/dist/admin/assets/{useContentSchema-z6tNif86.js.map → useContentSchema-BTyBYURX.js.map} +1 -1
- package/dist/admin/assets/{useCursorPager-CQGX41_L.js → useCursorPager-CTGOzl69.js} +2 -2
- package/dist/admin/assets/{useCursorPager-CQGX41_L.js.map → useCursorPager-CTGOzl69.js.map} +1 -1
- package/dist/admin/assets/{useDiscardGuard-Dhbif7VL.js → useDiscardGuard-CSkPw8iq.js} +2 -2
- package/dist/admin/assets/{useDiscardGuard-Dhbif7VL.js.map → useDiscardGuard-CSkPw8iq.js.map} +1 -1
- package/dist/admin/assets/{useMediaPickerDialog-D-5uKsMG.js → useMediaPickerDialog-W0jhN-hi.js} +2 -2
- package/dist/admin/assets/{useMediaPickerDialog-D-5uKsMG.js.map → useMediaPickerDialog-W0jhN-hi.js.map} +1 -1
- package/dist/admin/assets/{useMediaUploader-BtLoimmQ.js → useMediaUploader-BC5zCkQt.js} +2 -2
- package/dist/admin/assets/{useMediaUploader-BtLoimmQ.js.map → useMediaUploader-BC5zCkQt.js.map} +1 -1
- package/dist/admin/assets/{usePaletteItems-D3PZsW0Q.js → usePaletteItems-CqcKndUT.js} +2 -2
- package/dist/admin/assets/{usePaletteItems-D3PZsW0Q.js.map → usePaletteItems-CqcKndUT.js.map} +1 -1
- package/dist/admin/assets/{usePlaces-Cj5PljTy.js → usePlaces-o4Os5Nbv.js} +2 -2
- package/dist/admin/assets/{usePlaces-Cj5PljTy.js.map → usePlaces-o4Os5Nbv.js.map} +1 -1
- package/dist/admin/assets/{useQueries-CeDzli4Z.js → useQueries-BTnSD0k5.js} +2 -2
- package/dist/admin/assets/{useQueries-CeDzli4Z.js.map → useQueries-BTnSD0k5.js.map} +1 -1
- package/dist/admin/assets/{useResolvedScheme-DHD-zisP.js → useResolvedScheme-SoI-2Faf.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-DHD-zisP.js.map → useResolvedScheme-SoI-2Faf.js.map} +1 -1
- package/dist/admin/assets/{useSchemaScopeAccess-BNeVslcv.js → useSchemaScopeAccess-B4-31q7m.js} +2 -2
- package/dist/admin/assets/{useSchemaScopeAccess-BNeVslcv.js.map → useSchemaScopeAccess-B4-31q7m.js.map} +1 -1
- package/dist/admin/assets/{users-BRefbzuS.js → users-BVuapb3u.js} +2 -2
- package/dist/admin/assets/{users-BRefbzuS.js.map → users-BVuapb3u.js.map} +1 -1
- package/dist/admin/assets/{users-CppI8ctO.js → users-Oj5V5za_.js} +2 -2
- package/dist/admin/assets/{users-CppI8ctO.js.map → users-Oj5V5za_.js.map} +1 -1
- package/dist/admin/assets/{zod-Dcwk-m8X.js → zod-cTJwCa4E.js} +2 -2
- package/dist/admin/assets/{zod-Dcwk-m8X.js.map → zod-cTJwCa4E.js.map} +1 -1
- package/dist/admin/index.html +55 -55
- package/dist/cli.js +90 -31
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{public-DYR4mtVQ.d.ts → public-C027OJX6.d.ts} +12 -2
- package/dist/{s3Adapter-C8AgFVYw.js → s3Adapter-CQ4iXRWp.js} +2 -2
- package/dist/{s3Adapter-C8AgFVYw.js.map → s3Adapter-CQ4iXRWp.js.map} +1 -1
- package/dist/{worker-jz_0yAmS.js → worker-W5eY5lSj.js} +174 -60
- package/dist/worker-W5eY5lSj.js.map +1 -0
- package/package.json +5 -5
- package/dist/admin/assets/FormCheckboxGroup-JP1xzReQ.js +0 -2
- package/dist/admin/assets/FormCheckboxGroup-JP1xzReQ.js.map +0 -1
- package/dist/admin/assets/SecretReveal-mYCzxF96.js +0 -2
- package/dist/admin/assets/SecretReveal-mYCzxF96.js.map +0 -1
- package/dist/admin/assets/Structure-CL_0hVci.js +0 -2
- package/dist/admin/assets/chevron-left-BeJdUVAX.js +0 -2
- package/dist/admin/assets/cn-h5ORT3LK.js +0 -2
- package/dist/admin/assets/cn-h5ORT3LK.js.map +0 -1
- package/dist/admin/assets/coerce-DDQ1vGLx.js +0 -2
- package/dist/admin/assets/network-BfDaUb7D.js +0 -2
- package/dist/admin/assets/network-BfDaUb7D.js.map +0 -1
- package/dist/admin/assets/settings-Mscp6tN5.js +0 -2
- package/dist/admin/assets/settings-Mscp6tN5.js.map +0 -1
- package/dist/admin/assets/skeleton-DJVukcn6.js +0 -42
- package/dist/admin/assets/skeleton-DJVukcn6.js.map +0 -1
- 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-
|
|
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-
|
|
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-
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
125
|
+
//# sourceMappingURL=s3Adapter-CQ4iXRWp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3Adapter-
|
|
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":";;;;;;AAkBA,MAAM,iBAAiB;AAEvB,MAAM,cAAc,UAClB,iBAAiB,uBAChB,MAAM,UAAU,mBAAmB,OAAO,MAAM,SAAS,cAAc,MAAM,SAAS;AAEzF,MAAa,kBAAkB,WAC7B,IAAI,SAAS;CACX,QAAQ,OAAO,UAAU;CACzB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;CACvD,gBAAgB,OAAO;CACvB,GAAI,OAAO,eAAe,OAAO,kBAC7B,EAAE,aAAa;EAAE,aAAa,OAAO;EAAa,iBAAiB,OAAO;CAAgB,EAAE,IAC5F,CAAC;CAGL,4BAA4B;CAC5B,4BAA4B;AAC9B,CAAC;;;;;;AAcH,MAAa,mBAAmB,EAAE,QAAQ,eAAe,aAA+C;CACtG,MAAM,KAAK,UAAU,eAAe,MAAM;CAC1C,MAAM,SAAS,OAAO;CACtB,MAAM,YAAY,QAAgB;EAChC,IAAI,CAAC,kBAAkB,GAAG,GACxB,MAAM,IAAI,uBAAuB,GAAG;EAEtC,OAAO;CACT;CAEA,MAAM,OAAO,OAAO,QAAgB;EAClC,IAAI;GACF,MAAM,SAAS,MAAM,GAAG,KAAK,IAAI,kBAAkB;IAAE;IAAQ,KAAK,SAAS,GAAG;GAAE,CAAC,CAAC;GAClF,OAAO;IAAE,MAAM,OAAO,iBAAiB;IAAG,aAAa,OAAO;GAAY;EAC5E,SAAS,OAAO;GACd,IAAI,WAAW,KAAK,GAClB;GAEF,MAAM;EACR;CACF;CAEA,OAAO;EACL,QAAQ;EACR,KAAK,OAAO,KAAK,MAAM,EAAE,aAAa,oBAAoB;GACxD,MAAM,GAAG,KACP,IAAI,iBAAiB;IACnB;IACA,KAAK,SAAS,GAAG;IACjB,MAAM;IACN,aAAa;IACb,eAAe,OAAO,SAAS,IAAI,IAAI,KAAK,SAAS;IACrD,oBAAoB,yBAAyB,WAAW;GAC1D,CAAC,CACH;EACF;EACA,WAAW,OAAO,KAAK,UAAU;GAC/B,IAAI;IACF,MAAM,SAAS,MAAM,GAAG,KACtB,IAAI,iBAAiB;KACnB;KACA,KAAK,SAAS,GAAG;KACjB,GAAI,QAAQ,EAAE,OAAO,SAAS,MAAM,MAAM,GAAG,MAAM,MAAM,IAAI,CAAC;IAChE,CAAC,CACH;IACA,IAAI,CAAC,OAAO,MACV,MAAM,IAAI,oBAAoB,GAAG;IAEnC,OAAO,OAAO;GAChB,SAAS,OAAO;IACd,MAAM,WAAW,KAAK,IAAI,IAAI,oBAAoB,KAAK,EAAE,OAAO,MAAM,CAAC,IAAI;GAC7E;EACF;EACA;EACA,QAAQ,OAAO,QAAS,MAAM,KAAK,GAAG,MAAO,KAAA;EAC7C,QAAQ,OAAO,QAAQ;GACrB,MAAM,GAAG,KAAK,IAAI,oBAAoB;IAAE;IAAQ,KAAK,SAAS,GAAG;GAAE,CAAC,CAAC;EACvE;EACA,cAAc,OAAO,KAAK,EAAE,kBAAkB,UAAU,kBACtD,aACE,IACA,IAAI,iBAAiB;GACnB;GACA,KAAK,SAAS,GAAG;GACjB,qBAAqB;GACrB,4BAA4B,mBAAmB,QAAQ;EACzD,CAAC,GACD,EAAE,WAAW,iBAAiB,CAChC;EACF,YAAY,QAAS,gBAAgB,GAAG,cAAc,GAAG,cAAc,SAAS,GAAG,CAAC,MAAM,KAAA;EAC1F,iBAAiB,OAAO,EAAE,KAAK,aAAa,cAAc,uBAAuB;GAC/E,MAAM,cAAc,yBAAyB,WAAW;GACxD,MAAM,EAAE,KAAK,WAAW,MAAM,oBAAoB,IAAI;IACpD;IACA,KAAK,SAAS,GAAG;IACjB,YAAY;KACV;MAAC;MAAwB;MAAG;KAAY;KACxC;MAAC;MAAM;MAAiB;KAAW;KACnC,GAAI,cAAc,CAAC;MAAC;MAAM;MAAwB;KAAW,CAA2B,IAAI,CAAC;IAC/F;IACA,QAAQ;KACN,gBAAgB;KAChB,GAAI,cAAc,EAAE,uBAAuB,YAAY,IAAI,CAAC;IAC9D;IACA,SAAS;GACX,CAAC;GACD,OAAO;IAAE;IAAK;GAAO;EACvB;CACF;AACF"}
|
|
@@ -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([
|
|
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
|
-
|
|
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:
|
|
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-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
20431
|
-
const
|
|
20432
|
-
|
|
20433
|
-
|
|
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
|
|
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
|
-
|
|
20494
|
-
|
|
20495
|
-
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
|
|
20539
|
-
|
|
20540
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
20710
|
-
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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 && !
|
|
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
|
|
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([
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
49627
|
+
//# sourceMappingURL=worker-W5eY5lSj.js.map
|