dineway 0.2.40 → 0.2.41
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/{activity-LXZdjKwI.mjs → activity-BuhkMdv8.mjs} +2 -2
- package/dist/{activity-events-DoqeOM8x.mjs → activity-events-DkHsy7Y0.mjs} +1 -1
- package/dist/{allowed-origins-B4zstd2d.mjs → allowed-origins-Clitkhiv.mjs} +1 -1
- package/dist/api/route-utils.d.mts +15 -12
- package/dist/api/route-utils.mjs +27 -20
- package/dist/api/schemas/index.d.mts +1 -1
- package/dist/api/schemas/index.mjs +10 -5
- package/dist/{api-CQishNjZ.mjs → api-CMbsIQ46.mjs} +41 -13
- package/dist/{api-tokens-CNHnKO57.mjs → api-tokens-ciHNTdN2.mjs} +1 -1
- package/dist/{apply-D4rZHDyg.mjs → apply-B5qoX19G.mjs} +62 -18
- package/dist/astro/index.d.mts +16 -13
- package/dist/astro/index.mjs +31 -5
- package/dist/astro/middleware/auth.d.mts +14 -11
- package/dist/astro/middleware/auth.mjs +8 -8
- package/dist/astro/middleware/redirect.mjs +10 -6
- package/dist/astro/middleware/request-context.mjs +5 -5
- package/dist/astro/middleware/seed.d.mts +1 -1
- package/dist/astro/middleware/seed.mjs +2 -2
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts +2 -2
- package/dist/astro/middleware.mjs +266 -176
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +12 -7
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +12 -7
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +7 -7
- package/dist/astro/routes/api/admin/briefing.mjs +41 -22
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +14 -10
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +14 -10
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +14 -10
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +25 -19
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +25 -19
- package/dist/astro/routes/api/admin/bylines/index.mjs +25 -19
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +20 -16
- package/dist/astro/routes/api/admin/comments/_id_.mjs +10 -7
- package/dist/astro/routes/api/admin/comments/bulk.mjs +18 -13
- package/dist/astro/routes/api/admin/comments/counts.mjs +10 -7
- package/dist/astro/routes/api/admin/comments/index.mjs +18 -13
- package/dist/astro/routes/api/admin/context/_id_/history.mjs +51 -39
- package/dist/astro/routes/api/admin/context/_id_/index.mjs +51 -39
- package/dist/astro/routes/api/admin/context/_id_/review.mjs +57 -44
- package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +57 -44
- package/dist/astro/routes/api/admin/context/diff.mjs +56 -43
- package/dist/astro/routes/api/admin/context/index.mjs +57 -44
- package/dist/astro/routes/api/admin/context/stale.mjs +56 -43
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +51 -39
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +56 -43
- package/dist/astro/routes/api/admin/hitl-requests/index.mjs +56 -43
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +52 -40
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +7 -7
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +7 -7
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +78 -68
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +78 -68
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +71 -60
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +78 -67
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +78 -67
- package/dist/astro/routes/api/admin/plugins/index.mjs +71 -60
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +71 -60
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +78 -67
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +71 -60
- package/dist/astro/routes/api/admin/plugins/updates.mjs +71 -60
- package/dist/astro/routes/api/admin/review-requests/_id_/image.mjs +38 -23
- package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +46 -36
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +63 -52
- package/dist/astro/routes/api/admin/review-requests/_id_/revoke.mjs +9 -9
- package/dist/astro/routes/api/admin/review-requests/index.mjs +61 -50
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +71 -60
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +71 -60
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +1 -1
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +11 -7
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +3 -3
- package/dist/astro/routes/api/admin/users/index.mjs +12 -7
- package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +17 -12
- package/dist/astro/routes/api/auth/invite/index.mjs +14 -9
- package/dist/astro/routes/api/auth/invite/register-options.mjs +16 -11
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +17 -12
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +14 -11
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +3 -3
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +3 -3
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +12 -7
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +19 -14
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +16 -11
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +17 -12
- package/dist/astro/routes/api/auth/passkey/verify.mjs +17 -12
- package/dist/astro/routes/api/auth/setup-token/index.mjs +6 -6
- package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/signup/complete.mjs +17 -12
- package/dist/astro/routes/api/auth/signup/request.mjs +17 -12
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.d.mts +14 -11
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +23 -19
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +23 -18
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +25 -20
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +41 -31
- package/dist/astro/routes/api/content/_collection_/_id_/release-readiness.mjs +14 -9
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +41 -31
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +30 -20
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +8 -8
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +25 -14
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +25 -14
- package/dist/astro/routes/api/content/_collection_/trash.mjs +13 -8
- package/dist/astro/routes/api/dashboard.mjs +21 -13
- package/dist/astro/routes/api/dev/emails.mjs +2 -2
- package/dist/astro/routes/api/health.mjs +1 -1
- package/dist/astro/routes/api/import/probe.d.mts +3 -3
- package/dist/astro/routes/api/import/probe.mjs +30 -23
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +13 -10
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +14 -11
- package/dist/astro/routes/api/import/wordpress/execute.mjs +58 -47
- package/dist/astro/routes/api/import/wordpress/media.d.mts +14 -11
- package/dist/astro/routes/api/import/wordpress/media.mjs +17 -14
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +61 -48
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +15 -12
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +58 -45
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +32 -26
- package/dist/astro/routes/api/import/wordpress-plugin/callback.mjs +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +14 -11
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +63 -52
- package/dist/astro/routes/api/integration/artifact.mjs +9 -9
- package/dist/astro/routes/api/integration/dispatch.mjs +14 -14
- package/dist/astro/routes/api/integrations/_provider_.mjs +9 -9
- package/dist/astro/routes/api/integrations/index.mjs +8 -8
- package/dist/astro/routes/api/manifest.mjs +5 -5
- package/dist/astro/routes/api/mcp.mjs +141 -93
- package/dist/astro/routes/api/media/_id_/confirm.mjs +15 -12
- package/dist/astro/routes/api/media/_id_.mjs +14 -9
- package/dist/astro/routes/api/media/file/_...key_.mjs +1 -1
- package/dist/astro/routes/api/media/providers/_providerId_/_itemId_.mjs +2 -2
- package/dist/astro/routes/api/media/providers/_providerId_/index.mjs +2 -2
- package/dist/astro/routes/api/media/providers/index.mjs +2 -2
- package/dist/astro/routes/api/media/upload-url.mjs +16 -13
- package/dist/astro/routes/api/media.mjs +19 -16
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +57 -44
- package/dist/astro/routes/api/menus/_name_/items.mjs +57 -44
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +57 -44
- package/dist/astro/routes/api/menus/_name_/translations.mjs +57 -44
- package/dist/astro/routes/api/menus/_name_.mjs +57 -44
- package/dist/astro/routes/api/menus/index.mjs +57 -44
- package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/authorize.mjs +5 -5
- package/dist/astro/routes/api/oauth/device/code.mjs +9 -9
- package/dist/astro/routes/api/oauth/device/token.mjs +8 -8
- package/dist/astro/routes/api/oauth/register.mjs +4 -4
- package/dist/astro/routes/api/oauth/token/refresh.mjs +5 -5
- package/dist/astro/routes/api/oauth/token/revoke.mjs +5 -5
- package/dist/astro/routes/api/oauth/token.mjs +6 -6
- package/dist/astro/routes/api/openapi.json.mjs +10 -5
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +4 -4
- package/dist/astro/routes/api/redirects/404s/index.mjs +15 -13
- package/dist/astro/routes/api/redirects/404s/summary.mjs +15 -13
- package/dist/astro/routes/api/redirects/_id_.mjs +57 -44
- package/dist/astro/routes/api/redirects/index.mjs +57 -44
- package/dist/astro/routes/api/revisions/_revisionId_/index.mjs +2 -2
- package/dist/astro/routes/api/revisions/_revisionId_/restore.mjs +2 -2
- package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +73 -62
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +73 -62
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +73 -62
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +73 -62
- package/dist/astro/routes/api/schema/collections/index.mjs +73 -62
- package/dist/astro/routes/api/schema/index.mjs +13 -10
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +71 -60
- package/dist/astro/routes/api/schema/orphans/index.mjs +71 -60
- package/dist/astro/routes/api/search/enable.mjs +20 -13
- package/dist/astro/routes/api/search/index.mjs +19 -12
- package/dist/astro/routes/api/search/rebuild.mjs +20 -13
- package/dist/astro/routes/api/search/stats.mjs +12 -7
- package/dist/astro/routes/api/search/suggest.mjs +19 -12
- package/dist/astro/routes/api/sections/_slug_.mjs +57 -44
- package/dist/astro/routes/api/sections/index.mjs +57 -44
- package/dist/astro/routes/api/settings/email.mjs +5 -5
- package/dist/astro/routes/api/settings/reviews.mjs +11 -11
- package/dist/astro/routes/api/settings.mjs +57 -44
- package/dist/astro/routes/api/setup/admin-verify.mjs +19 -14
- package/dist/astro/routes/api/setup/admin.mjs +17 -12
- package/dist/astro/routes/api/setup/dev-bypass.mjs +44 -32
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +47 -34
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +9 -9
- package/dist/astro/routes/api/system/heartbeat.mjs +2 -2
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +60 -47
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +60 -47
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +60 -47
- package/dist/astro/routes/api/taxonomies/index.mjs +60 -47
- package/dist/astro/routes/api/themes/preview.mjs +7 -7
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +3 -3
- package/dist/astro/routes/api/well-known/oauth-authorization-server.mjs +3 -3
- package/dist/astro/routes/api/well-known/oauth-protected-resource.mjs +3 -3
- package/dist/astro/routes/api/widget-areas/_name_/reorder.mjs +56 -43
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +57 -44
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +57 -44
- package/dist/astro/routes/api/widget-areas/_name_.mjs +53 -41
- package/dist/astro/routes/api/widget-areas/index.mjs +57 -44
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +14 -9
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +20 -16
- package/dist/astro/routes/sitemap.xml.mjs +19 -15
- package/dist/astro/session-driver.d.mts +1 -1
- package/dist/astro/session-driver.mjs +8 -3
- package/dist/astro/types.d.mts +21 -14
- package/dist/{atomic-authority-CnBQJ14T.mjs → atomic-authority-Bf5QZboB.mjs} +2 -2
- package/dist/{audit-Cl495Ze3.mjs → audit-hXJBTPY0.mjs} +1 -1
- package/dist/auth/providers/github.d.mts +1 -1
- package/dist/auth/providers/google.d.mts +1 -1
- package/dist/{auth-control-guard-DbjgJdlo.mjs → auth-control-guard-DpUP6Fs_.mjs} +1 -1
- package/dist/{authorize-DDmgmnW-.mjs → authorize-DWNOqMKq.mjs} +1 -1
- package/dist/{briefing-DsD-Ouwc.mjs → briefing-BzvBeIJh.mjs} +1 -1
- package/dist/{briefing-COw-WcYz.mjs → briefing-DYiV93rg.mjs} +995 -7
- package/dist/{bundle-bhiszAui.mjs → bundle-DWn5eFKz.mjs} +2 -2
- package/dist/{byline-TYk2kad6.mjs → byline-3qjp1-oa.mjs} +65 -14
- package/dist/{byline-fields-D-b9CWux.d.mts → byline-fields-Bne2v0ti.d.mts} +20 -16
- package/dist/{byline-fields-BKj5f3Ub.mjs → byline-fields-DRMCc0V_.mjs} +1 -1
- package/dist/{byline-fields-DZ46DF10.mjs → byline-fields-wWu2Cb3l.mjs} +3 -3
- package/dist/{byline-registry-CJihchD1.mjs → byline-registry-Caj0_gbU.mjs} +1 -1
- package/dist/{bylines-6T9iVC9j.mjs → bylines-BSn9O1Wx.mjs} +3 -3
- package/dist/{bylines-CvTSCAw9.mjs → bylines-CGuJi-zu.mjs} +5 -5
- package/dist/{patterns-Ay-4KImK.mjs → cache-DsEbwFVE.mjs} +51 -1
- package/dist/{chunks-C8vSD_5L.mjs → chunks-Bb56aCtB.mjs} +1 -1
- package/dist/cli/index.mjs +486 -48
- package/dist/cli/plugin-kit.d.mts +14 -11
- package/dist/cli/plugin-kit.mjs +2 -2
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +16 -13
- package/dist/client/index.mjs +2 -2
- package/dist/{client-factory-C1ZQCMog.mjs → client-factory-BLbm250o.mjs} +1 -1
- package/dist/{comment-DAQfUjqt.mjs → comment-BWDG1nQm.mjs} +2 -2
- package/dist/{comment-reaction-Dp3G7UZc.mjs → comment-reaction-B7pLTlQ7.mjs} +1 -1
- package/dist/{comments-BrvIaRAx.mjs → comments-xkten8nV.mjs} +1 -1
- package/dist/config-6R0bchVE.mjs +125 -0
- package/dist/{content-CIKsrvU9.mjs → content-BigS8BAv.mjs} +302 -45
- package/dist/content-Dr22fzA_.mjs +390 -0
- package/dist/{content-refresh-BilzqcLt.mjs → content-refresh-DJuFIqQ4.mjs} +14 -8
- package/dist/content-storage/index.d.mts +180 -0
- package/dist/content-storage/index.mjs +29 -0
- package/dist/content-storage/store.d.mts +3 -0
- package/dist/content-storage/store.mjs +5 -0
- package/dist/{review-payload-Bap86e75.mjs → content-write-DAZCNKWl.mjs} +838 -131
- package/dist/{context-DAs_MZjJ.mjs → context-0806nV9h.mjs} +292 -23
- package/dist/{context-DVTvucNb.mjs → context-CCsI5nTK.mjs} +2 -2
- package/dist/{context-route-helpers-BP-UJ4u8.mjs → context-route-helpers-TP3EqxRQ.mjs} +2 -2
- package/dist/{dashboard-BAjWCGCP.mjs → dashboard-CSrnhBO6.mjs} +4 -4
- package/dist/database/batch.d.mts +1 -1
- package/dist/database/batch.mjs +1 -1
- package/dist/database/d1/index.d.mts +14 -11
- package/dist/database/d1/index.mjs +4 -4
- package/dist/database/instrumentation.mjs +3 -2
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +1 -1
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/{device-flow-Dh0rNlh1.mjs → device-flow-SoZh-HvN.mjs} +3 -3
- package/dist/{discovery-V0e0Gg8j.mjs → discovery-49qXmdwv.mjs} +4 -4
- package/dist/{enrich-B7PIJ8Iy.mjs → enrich-CAMsD1aT.mjs} +1 -1
- package/dist/{error-B5a45Tfb.mjs → error-sL4aemcW.mjs} +2 -0
- package/dist/{evidence-Vnp_fQbC.mjs → evidence-B3O9_VKm.mjs} +7 -7
- package/dist/{field-defs-cache-aXUeXJdC.mjs → field-defs-cache-dn5Tw79A.mjs} +4 -4
- package/dist/{fts-manager-BrPpYtK0.mjs → fts-manager-Zu5ITic0.mjs} +1 -1
- package/dist/{hitl-requests-BxMMON3s.mjs → hitl-requests-B5vOPseK.mjs} +2 -2
- package/dist/{hitl-route-helpers-sdnjpx2k.mjs → hitl-route-helpers-C3icmGdj.mjs} +5 -5
- package/dist/hook-events-BQw73jc7.d.mts +32 -0
- package/dist/{import-C2-v4FCs.mjs → import-CKnKQj3f.mjs} +9 -9
- package/dist/{index-BVGe04wF.d.mts → index-CLj17kW9.d.mts} +12 -5
- package/dist/index.d.mts +19 -16
- package/dist/index.mjs +107 -98
- package/dist/{integration-credentials-DMEXZU2J.mjs → integration-credentials-DpuRw1kx.mjs} +2 -2
- package/dist/{jsonld-wRF85RXo.d.mts → jsonld-CN91qtDw.d.mts} +2 -2
- package/dist/{load-DvCVppOF.mjs → load-CiRTddkJ.mjs} +1 -1
- package/dist/{loader-Dp6zLmQm.mjs → loader-CCwWFQSh.mjs} +16 -5
- package/dist/{manifest-schema-CCvogfrP.mjs → manifest-schema-DaQpgyTB.mjs} +1 -1
- package/dist/{mcp-reviewed-executor-B8Gbin3T.mjs → mcp-reviewed-executor-DA6Q9sDc.mjs} +6 -6
- package/dist/media/image-endpoint.mjs +1 -1
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +2 -2
- package/dist/media/local-runtime.d.mts +16 -13
- package/dist/media/local-runtime.mjs +3 -3
- package/dist/{media-C5ba8fvI.mjs → media-BjH5OD-A.mjs} +1 -1
- package/dist/{media-allowlist-DQvscVkS.mjs → media-allowlist-C8HJ2O61.mjs} +1 -1
- package/dist/{menus-CyNpBQrX.mjs → menus-CbBi7Ad7.mjs} +2 -2
- package/dist/{menus-w5xwT-f5.mjs → menus-D0c8CeVg.mjs} +7 -7
- package/dist/migration-DJuj7ZwN.mjs +526 -0
- package/dist/{migrations-CLlX25HO.mjs → migrations-BAjF60cl.mjs} +1 -1
- package/dist/{oauth-authorization-CdqJZUMf.mjs → oauth-authorization-CSSRMOKn.mjs} +4 -4
- package/dist/{oauth-clients-CHNb9MAZ.mjs → oauth-clients-DX5HIJJv.mjs} +2 -2
- package/dist/object-cache/memory.d.mts +1 -1
- package/dist/{object-cache-mxCW-Rpt.mjs → object-cache-DyI1SOBK.mjs} +3 -1
- package/dist/owned-metadata-BPmUjZqI.mjs +69 -0
- package/dist/page/index.d.mts +15 -12
- package/dist/page/index.mjs +1 -1
- package/dist/{parse-THHCpJLB.mjs → parse-C6kCR1OT.mjs} +1 -1
- package/dist/plugin-utils.d.mts +14 -11
- package/dist/plugins/adapt-sandbox-entry.d.mts +14 -11
- package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
- package/dist/{plugins-pfraURNp.mjs → plugins-V0W65r3v.mjs} +16 -962
- package/dist/{policy-D2USlibj.mjs → policy-DbceGc4P.mjs} +2 -2
- package/dist/{preview-Bh7D7F27.mjs → preview-CWiIjMDi.mjs} +2 -2
- package/dist/{provider-loader-DT7vQ5FI.d.mts → provider-loader-oLKm1AU8.d.mts} +1 -1
- package/dist/{public-url-Ccv0Xmue.d.mts → public-url-CEC1vj02.d.mts} +2 -2
- package/dist/{public-url-CG5YbNqB.d.mts → public-url-CKrUov8D.d.mts} +1 -1
- package/dist/{publication-authorization-B_HJSnzR.mjs → publication-authorization-wMR-tEQ_.mjs} +43 -17
- package/dist/{query-xspvw7Ui.mjs → query-DDi367tF.mjs} +14 -14
- package/dist/{query-DLeahg3x.mjs → query-DLnnpEuf.mjs} +4 -4
- package/dist/{rate-limit-BsBr_U9g.mjs → rate-limit-DeVLLe4z.mjs} +2 -2
- package/dist/{redirect-BQFa1THe.mjs → redirect-CJ-FAbNK.mjs} +2 -2
- package/dist/{redirects-DJcsgz_X.mjs → redirects-BKi6mek4.mjs} +4 -5
- package/dist/{redirects-CVfxefrz.mjs → redirects-I78-ZYLV.mjs} +5 -386
- package/dist/{registry-Dclv9iHv.mjs → registry-zXXZezu-.mjs} +7 -7
- package/dist/{release-Da2UFygt.mjs → release-Cpi0-Bzq.mjs} +173 -22
- package/dist/request-context.d.mts +30 -0
- package/dist/{request-meta-CjORiJQ_.mjs → request-meta-DZYuLXx_.mjs} +1 -1
- package/dist/review-payload-Bhi52CbI.mjs +112 -0
- package/dist/{review-requests-CcSUTm_l.mjs → review-requests-C-ScxD9n.mjs} +2 -2
- package/dist/{review-requests-CUVn0RBl.mjs → review-requests-DZYM51yI.mjs} +2 -2
- package/dist/{review-route-helpers-CKBfGKCi.mjs → review-route-helpers-DXNDyx_q.mjs} +2 -2
- package/dist/{revision-W6FDfDqx.mjs → revision-B_HYO2AE.mjs} +42 -7
- package/dist/revisions-CQ7rMP5d.mjs +55 -0
- package/dist/{revocation-C_ZQvGRT.mjs → revocation-4we8kfBg.mjs} +2 -2
- package/dist/{runner-CRU7BXjr.mjs → runner-CuG8o1uW.mjs} +558 -487
- package/dist/{runner-SoP1rphP.d.mts → runner-DXQkyPeX.d.mts} +1 -1
- package/dist/{runs-BtaAiLTw.mjs → runs-BjgLfqCn.mjs} +5 -5
- package/dist/runtime-Bs2JMbb2.d.mts +45 -0
- package/dist/runtime-Ch5G-tnG.mjs +400 -0
- package/dist/runtime.d.mts +15 -12
- package/dist/runtime.mjs +9 -4
- package/dist/schema-BA05k0TN.mjs +8 -0
- package/dist/{search-BI9uKr7U.mjs → search-DMrzhfx_.mjs} +4 -98
- package/dist/{secrets-D_pergcD.mjs → secrets-CIYcw9T9.mjs} +4 -4
- package/dist/{sections-BqqYq9RW.mjs → sections-BTrSEhqB.mjs} +2 -2
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +38 -26
- package/dist/seo/index.d.mts +3 -3
- package/dist/seo/index.mjs +12 -9
- package/dist/{seo-Bs_DUxJf.mjs → seo-Cv7ud_m2.mjs} +44 -5
- package/dist/{seo-B-5PsaJO.mjs → seo-DkjtBh-y.mjs} +1 -1
- package/dist/{service-W2xuGLgw.mjs → service-BBJM08uD.mjs} +2 -2
- package/dist/{service-B65aJsN7.mjs → service-CkMuD5AE.mjs} +3 -3
- package/dist/{settings-DsBzKeUQ.mjs → settings-BUONaNnG.mjs} +7 -7
- package/dist/{settings-CyJ2-MKx.mjs → settings-CI-NtWEc.mjs} +2 -2
- package/dist/{setup-complete-t9yamqBb.mjs → setup-complete-DoVbVrHx.mjs} +1 -1
- package/dist/{site-activity-DU0UPDji.mjs → site-activity-hpfJkmxQ.mjs} +1 -1
- package/dist/{site-context-Dic2jHuw.mjs → site-context-BW3GRCJH.mjs} +15 -15
- package/dist/{site-url-Tw6CfBB2.mjs → site-url-CYatfe3q.mjs} +1 -1
- package/dist/{state-jx6Yiwsm.mjs → state-CKkqoA6i.mjs} +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +2 -2
- package/dist/{store-32e6dfD-.mjs → store-BzaAtszy.mjs} +3 -3
- package/dist/submission-DLgjQ_Ew.mjs +205 -0
- package/dist/{taxonomies-BFsUR7kc.mjs → taxonomies-C02-Vuh3.mjs} +3 -3
- package/dist/{taxonomies-lWGNLKgn.mjs → taxonomies-D5wO9zmB.mjs} +7 -7
- package/dist/{taxonomy-DN6i1upz.mjs → taxonomy-BK7JmHlo.mjs} +53 -3
- package/dist/terms-EskuqbKE.mjs +104 -0
- package/dist/text-extraction-CdqMGYQK.mjs +96 -0
- package/dist/{tokens-D-StaTAQ.mjs → tokens-D8HEH277.mjs} +1 -1
- package/dist/{trusted-proxy-hYufGFPK.mjs → trusted-proxy-Dg3U9Lrv.mjs} +1 -1
- package/dist/{types-RFzE_V1M.mjs → types-BI3ULB3A.mjs} +2 -2
- package/dist/{types-D5JfvPvx.d.mts → types-C3jUu4Bc.d.mts} +89 -33
- package/dist/{types-B--VyN3n.d.mts → types-Dpv_MvwZ.d.mts} +1 -1
- package/dist/{types-CgcOeaiQ.d.mts → types-ex-UrNlz.d.mts} +1 -1
- package/dist/types-qOEot0UQ.d.mts +83 -0
- package/dist/ui/server-runtime.d.mts +18 -15
- package/dist/ui/server-runtime.mjs +29 -25
- package/dist/{user-Btai9rl3.mjs → user-Bl2_8rhJ.mjs} +2 -2
- package/dist/{utils-CYxGuO_P.mjs → utils-CklSLz9F.mjs} +2 -2
- package/dist/{validate-C05z0m7M.mjs → validate-C-yk7mmX.mjs} +3 -3
- package/dist/{validate-kmN2lS8H.d.mts → validate-DUscf6VG.d.mts} +3 -3
- package/dist/version-BlE1LEPb.mjs +6 -0
- package/dist/version-store-BXv2D0de.mjs +208 -0
- package/dist/version-store-B_THJCc0.d.mts +98 -0
- package/dist/{widgets-BOrDZdQ3.mjs → widgets-9xHBhL_L.mjs} +3 -3
- package/dist/{wordpress-slugs-ROzITIBK.mjs → wordpress-slugs-yaeD7cxn.mjs} +1 -1
- package/dist/{worker-CKU70ODm.mjs → worker-CC_Rt1pB.mjs} +10 -10
- package/dist/write-intent-DuHVqks9.mjs +108 -0
- package/dist/{zod-generator-DkrWuID7.mjs → zod-generator-B5Pt8fv0.mjs} +2 -2
- package/package.json +16 -4
- package/dist/cache-B5NSHhxG.mjs +0 -52
- package/dist/cron-C7HCJPPl.mjs +0 -271
- package/dist/schema-CosVhHJt.mjs +0 -8
- package/dist/submission-DJmRejGR.mjs +0 -411
- package/dist/version-CISd4wX_.mjs +0 -6
- /package/dist/{actor-DxUAJgQX.mjs → actor-D0AW80ld.mjs} +0 -0
- /package/dist/{adapter-symbols-Bq3JsWGM.d.mts → adapter-symbols-B9mi-BUh.d.mts} +0 -0
- /package/dist/{adapters-C8nRpUuj.d.mts → adapters-lDnJjNDz.d.mts} +0 -0
- /package/dist/{api-tokens-0N3nafqZ.mjs → api-tokens-CdfsE9PL.mjs} +0 -0
- /package/dist/{base64-Cz-aU0X1.mjs → base64-qvSs0Gxy.mjs} +0 -0
- /package/dist/{challenge-store-DFGsDtCj.mjs → challenge-store-7IZ_NqWg.mjs} +0 -0
- /package/dist/{components-rFN8NH3N.mjs → components-JA6tFHmE.mjs} +0 -0
- /package/dist/{context-types-CPWAJRs5.mjs → context-types-DDIJhGLs.mjs} +0 -0
- /package/dist/{default-BS6VQRkB.mjs → default-C2azCFSB.mjs} +0 -0
- /package/dist/{email-console-GqK6hgMJ.mjs → email-console-BYQp_5Qr.mjs} +0 -0
- /package/dist/{escape-CE7xOWzJ.mjs → escape-4_NNa6GR.mjs} +0 -0
- /package/dist/{experimental-workflows-BbxpWwBy.mjs → experimental-workflows-CPNiI2EL.mjs} +0 -0
- /package/dist/{forgeway-account-DcTxh3Gw.mjs → forgeway-account-YzraapbX.mjs} +0 -0
- /package/dist/{hash-D2Rqd2J2.mjs → hash-qSYPMJ8w.mjs} +0 -0
- /package/dist/{media-url-D9kdpoLS.mjs → media-url-D5E1a47B.mjs} +0 -0
- /package/dist/{mime-BnVhH671.mjs → mime-FkfazULS.mjs} +0 -0
- /package/dist/{mode-BJwb_MgK.mjs → mode-C3RI5Z5t.mjs} +0 -0
- /package/dist/{normalize-aTwryvvi.mjs → normalize-DrmlLn40.mjs} +0 -0
- /package/dist/{oauth-authority-P5YMSk2z.mjs → oauth-authority-DVlLFhsZ.mjs} +0 -0
- /package/dist/{oauth-state-store-CMqLdo4I.mjs → oauth-state-store-nf-78RbK.mjs} +0 -0
- /package/dist/{options-JiLWB6Bt.mjs → options-yFkLUuTw.mjs} +0 -0
- /package/dist/{output-7HDrYTSQ.mjs → output-ljHaxIHX.mjs} +0 -0
- /package/dist/{parser-kettsjWc.mjs → parser-CTlxybRo.mjs} +0 -0
- /package/dist/{passkey-config-DVzQ3dv3.mjs → passkey-config-BLon3ct9.mjs} +0 -0
- /package/dist/{placeholder-DJLP_HY7.d.mts → placeholder-DdZV3I8x.d.mts} +0 -0
- /package/dist/{portable-text-tQhvPLf1.mjs → portable-text-CSbRjM-T.mjs} +0 -0
- /package/dist/{portable-text-BE7nszX6.d.mts → portable-text-HNmwL-7L.d.mts} +0 -0
- /package/dist/{process-cache-C19OA3am.mjs → process-cache-CMy5M80h.mjs} +0 -0
- /package/dist/{provider-loader-DERzBMUz.mjs → provider-loader-DlaT1usE.mjs} +0 -0
- /package/dist/{public-discovery-BGyhuD5U.mjs → public-discovery-BnqYofSK.mjs} +0 -0
- /package/dist/{public-url-DFXUU6Wp.mjs → public-url-BHjYWuaN.mjs} +0 -0
- /package/dist/{public-url-sR8SVmTt.mjs → public-url-GQygrYmg.mjs} +0 -0
- /package/dist/{redirect-BxacnBYL.mjs → redirect-CokmLN5o.mjs} +0 -0
- /package/dist/{request-cache-8_ifFzVw.mjs → request-cache-CizvDoxV.mjs} +0 -0
- /package/dist/{resolve-DEKC4qVa.mjs → resolve-BxFGSKYu.mjs} +0 -0
- /package/dist/{runtime-env-CPTzh0mZ.mjs → runtime-env-DpYGy4pT.mjs} +0 -0
- /package/dist/{scheduled-publish-BxdShRGs.d.mts → scheduled-publish-eCNGpvNm.d.mts} +0 -0
- /package/dist/{seo-contributions-LEFs1d7w.mjs → seo-contributions-ZKqrqsdT.mjs} +0 -0
- /package/dist/{service-kQ5ljRzX.mjs → service-DeX1PRNt.mjs} +0 -0
- /package/dist/{session-user-B8yYh0g5.mjs → session-user-D36BRaZY.mjs} +0 -0
- /package/dist/{setup-nonce-B6A5Y1ea.mjs → setup-nonce-B9IO7PbK.mjs} +0 -0
- /package/dist/{sidecar-client-BwPhhz-F.mjs → sidecar-client-2hx5G46s.mjs} +0 -0
- /package/dist/{slugify-kD31VIv2.mjs → slugify-DvoaEPtL.mjs} +0 -0
- /package/dist/{ssrf-C9dyjU8O.mjs → ssrf-DcD8vn3E.mjs} +0 -0
- /package/dist/{stable-hash-B9Tbb2f_.mjs → stable-hash-9RDJgfif.mjs} +0 -0
- /package/dist/{status-Bjf_uSrW.mjs → status-B2xUokyJ.mjs} +0 -0
- /package/dist/{transport-BrU1aDY5.mjs → transport-BHYE4pox.mjs} +0 -0
- /package/dist/{transport-CZbtxgKZ.d.mts → transport-CVU5rp7W.d.mts} +0 -0
- /package/dist/{types-DNBL-4Sn.mjs → types-B3Uq7Czg.mjs} +0 -0
- /package/dist/{types-DsJTXStN.d.mts → types-BJztoTbF.d.mts} +0 -0
- /package/dist/{types-COvyXIp7.mjs → types-BgUxCuwu.mjs} +0 -0
- /package/dist/{types-KFzuijKE.d.mts → types-C0heD9oI.d.mts} +0 -0
- /package/dist/{types-B03h5jt_.d.mts → types-DheoByey.d.mts} +0 -0
- /package/dist/{types-SlLXjRpg.d.mts → types-I5LHzk_M.d.mts} +0 -0
- /package/dist/{types-PLJ9hlhh.mjs → types-Nm0cMxEh.mjs} +0 -0
- /package/dist/{types-CtGSEKEJ.d.mts → types-PxxPTFSl.d.mts} +0 -0
- /package/dist/{url-DGG3hw_h.mjs → url-Coamqvs4.mjs} +0 -0
- /package/dist/{url-DUz3LbCs.mjs → url-dn4mFfCI.mjs} +0 -0
- /package/dist/{workers-build-BkmPhclj.mjs → workers-build-4926MPc0.mjs} +0 -0
|
@@ -1,15 +1,179 @@
|
|
|
1
|
-
import { c as __exportAll } from "./runner-
|
|
2
|
-
import { atomicBatch, isD1Database, rowUnchanged } from "./database/batch.mjs";
|
|
1
|
+
import { c as __exportAll } from "./runner-CuG8o1uW.mjs";
|
|
2
|
+
import { AtomicWriteConflict, atomicBatch, isD1Database, rowUnchanged } from "./database/batch.mjs";
|
|
3
3
|
import { t as validateIdentifier } from "./validate-Co3j6T_K.mjs";
|
|
4
4
|
import { o as isPostgres } from "./dialect-helpers-C6xtO-Ui.mjs";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
5
|
+
import { n as contentDigest, o as ContentStorageError, t as canonicalContentJson } from "./config-6R0bchVE.mjs";
|
|
6
|
+
import { a as hydrateContentRows, d as contentPartitionWritable, r as getContentStorage } from "./runtime-Ch5G-tnG.mjs";
|
|
7
|
+
import { i as encodeCursor, n as ScheduledNotDueError, r as decodeCursor, t as DinewayValidationError } from "./types-BI3ULB3A.mjs";
|
|
8
|
+
import { t as contentWriteChecks } from "./atomic-authority-Bf5QZboB.mjs";
|
|
9
|
+
import { o as invalidateCollectionCache } from "./object-cache-DyI1SOBK.mjs";
|
|
10
|
+
import { i as storedContentSeo, r as snapshotOwnedContentMetadata, t as contentEventBylines } from "./owned-metadata-BPmUjZqI.mjs";
|
|
11
|
+
import { n as slugify } from "./slugify-DvoaEPtL.mjs";
|
|
12
|
+
import { t as RevisionRepository } from "./revision-B_HYO2AE.mjs";
|
|
10
13
|
import { sql } from "kysely";
|
|
11
14
|
import { ulid } from "ulidx";
|
|
15
|
+
import { z } from "zod";
|
|
12
16
|
|
|
17
|
+
//#region src/content-storage/hook-events.ts
|
|
18
|
+
const contentStorageHookSchema = z.enum([
|
|
19
|
+
"content:afterSave",
|
|
20
|
+
"content:afterPublish",
|
|
21
|
+
"content:afterUnpublish",
|
|
22
|
+
"content:afterDelete",
|
|
23
|
+
"content:afterRestore",
|
|
24
|
+
"content:afterSchedule",
|
|
25
|
+
"content:afterUnschedule"
|
|
26
|
+
]);
|
|
27
|
+
const contentStorageHookSnapshotSchema = z.object({
|
|
28
|
+
collection: z.string(),
|
|
29
|
+
id: z.string(),
|
|
30
|
+
isNew: z.boolean(),
|
|
31
|
+
permanent: z.boolean(),
|
|
32
|
+
content: z.record(z.string(), z.json()),
|
|
33
|
+
previousContent: z.record(z.string(), z.json()).optional()
|
|
34
|
+
}).strict();
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/content-storage/outbox.ts
|
|
38
|
+
const eventIdentitySchema = z.object({
|
|
39
|
+
operationId: z.string().min(1).max(128),
|
|
40
|
+
routingVersion: z.string().min(1).max(128),
|
|
41
|
+
collection: z.string().regex(/^[a-z][a-z0-9_]{0,62}$/),
|
|
42
|
+
entryId: z.string().min(1).max(128)
|
|
43
|
+
});
|
|
44
|
+
const hookTargetSchema = z.object({
|
|
45
|
+
hook: contentStorageHookSchema,
|
|
46
|
+
pluginId: z.string().min(1).max(128),
|
|
47
|
+
timeoutMs: z.number().int().min(1).max(12e4)
|
|
48
|
+
});
|
|
49
|
+
/** Pending snapshots are temporary outbox data, removed only after every subscriber acknowledges. */
|
|
50
|
+
async function prepareContentHookEvents(db, command, snapshot, targets) {
|
|
51
|
+
if (!targets.length) return { statements: [] };
|
|
52
|
+
eventIdentitySchema.parse(command);
|
|
53
|
+
contentStorageHookSnapshotSchema.parse(snapshot);
|
|
54
|
+
if (snapshot.collection !== command.collection || snapshot.id !== command.entryId) throw new ContentStorageError("CONFLICT", "The content event snapshot does not match its commit.");
|
|
55
|
+
const subscribers = targets.map((target) => hookTargetSchema.parse(target));
|
|
56
|
+
if (new Set(subscribers.map((target) => `${target.hook}:${target.pluginId}`)).size !== targets.length) throw new ContentStorageError("INVALID_CONFIG", "Each content hook subscriber must be unique.");
|
|
57
|
+
const payload = canonicalContentJson(snapshot);
|
|
58
|
+
if (new TextEncoder().encode(payload).length > 8e6) throw new ContentStorageError("CONFLICT", "The content event exceeds the durable delivery limit; no snapshot was truncated.");
|
|
59
|
+
const parts = [];
|
|
60
|
+
for (let offset = 0; offset < payload.length;) {
|
|
61
|
+
let end = Math.min(payload.length, offset + 1e5);
|
|
62
|
+
const last = payload.charCodeAt(end - 1);
|
|
63
|
+
if (end < payload.length && last >= 55296 && last <= 56319) end--;
|
|
64
|
+
parts.push(payload.slice(offset, end));
|
|
65
|
+
offset = end;
|
|
66
|
+
}
|
|
67
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
68
|
+
const statements = [sql`INSERT INTO _dineway_content_commit_events (operation_id,collection,entry_id,command,created_at,payload_digest,part_count) VALUES (${command.operationId},${command.collection},${command.entryId},${canonicalContentJson(command)},${now},${await contentDigest(payload)},${parts.length})`.compile(db)];
|
|
69
|
+
for (const [part, data] of parts.entries()) statements.push(sql`INSERT INTO _dineway_content_event_payloads (operation_id,part,data) VALUES (${command.operationId},${part},${data})`.compile(db));
|
|
70
|
+
for (const [ordinal, target] of subscribers.entries()) {
|
|
71
|
+
const id = await contentDigest({
|
|
72
|
+
operationId: command.operationId,
|
|
73
|
+
hook: target.hook,
|
|
74
|
+
pluginId: target.pluginId
|
|
75
|
+
});
|
|
76
|
+
statements.push(sql`INSERT INTO _dineway_content_hook_deliveries (id,operation_id,hook,plugin_id,ordinal,timeout_ms,attempts,next_attempt_at,created_at) VALUES (${id},${command.operationId},${target.hook},${target.pluginId},${ordinal},${target.timeoutMs},0,${now},${now})`.compile(db));
|
|
77
|
+
}
|
|
78
|
+
return { statements };
|
|
79
|
+
}
|
|
80
|
+
/** Claims are per subscriber; receivers must use the stable key for idempotent side effects. */
|
|
81
|
+
async function drainContentHookEvents(db, deliver, options = {}) {
|
|
82
|
+
const now = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
83
|
+
const limit = z.number().int().min(1).max(20).parse(options.limit ?? 5);
|
|
84
|
+
let completed = 0;
|
|
85
|
+
let failed = 0;
|
|
86
|
+
for (let index = 0; index < limit; index++) {
|
|
87
|
+
const at = now().toISOString();
|
|
88
|
+
const row = (await sql`SELECT d.* FROM _dineway_content_hook_deliveries d JOIN _dineway_content_commit_events event ON event.operation_id=d.operation_id WHERE d.delivered_at IS NULL AND d.next_attempt_at<=${at} AND (d.lease_until IS NULL OR d.lease_until<${at}) AND NOT EXISTS (SELECT 1 FROM _dineway_content_hook_deliveries prior WHERE prior.operation_id=d.operation_id AND prior.ordinal<d.ordinal AND prior.delivered_at IS NULL) AND NOT EXISTS (SELECT 1 FROM _dineway_content_commit_events earlier WHERE earlier.collection=event.collection AND earlier.entry_id=event.entry_id AND earlier.sequence<event.sequence AND earlier.part_count>0 AND earlier.delivered_at IS NULL) ORDER BY d.next_attempt_at,event.sequence,d.ordinal LIMIT 1`.execute(db)).rows[0];
|
|
89
|
+
if (!row) break;
|
|
90
|
+
const owner = ulid();
|
|
91
|
+
try {
|
|
92
|
+
await atomicBatch(db, {
|
|
93
|
+
checks: [rowUnchanged("_dineway_content_hook_deliveries", { ...row })],
|
|
94
|
+
statements: [sql`UPDATE _dineway_content_hook_deliveries SET lease_owner=${owner},lease_until=${new Date(now().getTime() + Math.max(3e4, row.timeout_ms) + 15e3).toISOString()},attempts=attempts+1 WHERE id=${row.id}`.compile(db)]
|
|
95
|
+
});
|
|
96
|
+
} catch (error) {
|
|
97
|
+
if (error instanceof AtomicWriteConflict) continue;
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const header = (await sql`SELECT command,payload_digest,part_count FROM _dineway_content_commit_events WHERE operation_id=${row.operation_id}`.execute(db)).rows[0];
|
|
102
|
+
if (!header) throw new ContentStorageError("CONFLICT", "The durable content event is missing.");
|
|
103
|
+
const command = eventIdentitySchema.parse(JSON.parse(header.command));
|
|
104
|
+
const installed = (await sql`SELECT version FROM _dineway_content_storage_config WHERE id='active'`.execute(db)).rows[0];
|
|
105
|
+
if (command.routingVersion !== installed?.version) throw new ContentStorageError("ROUTE_CHANGED", "A pending content event targets a different routing version.");
|
|
106
|
+
const parts = (await sql`SELECT part,data FROM _dineway_content_event_payloads WHERE operation_id=${row.operation_id} ORDER BY part`.execute(db)).rows;
|
|
107
|
+
const payload = parts.map((part) => part.data).join("");
|
|
108
|
+
if (parts.length !== header.part_count || parts.some((part, ordinal) => part.part !== ordinal) || await contentDigest(payload) !== header.payload_digest) throw new ContentStorageError("UNAVAILABLE", "The durable content event snapshot could not be verified.");
|
|
109
|
+
const snapshot = contentStorageHookSnapshotSchema.parse(JSON.parse(payload));
|
|
110
|
+
if (command.operationId !== row.operation_id || snapshot.id !== command.entryId || snapshot.collection !== command.collection) throw new ContentStorageError("CONFLICT", "The content event snapshot does not match its commit.");
|
|
111
|
+
await deliver({
|
|
112
|
+
hook: contentStorageHookSchema.parse(row.hook),
|
|
113
|
+
pluginId: row.plugin_id,
|
|
114
|
+
timeoutMs: row.timeout_ms
|
|
115
|
+
}, {
|
|
116
|
+
...snapshot,
|
|
117
|
+
idempotencyKey: row.id
|
|
118
|
+
});
|
|
119
|
+
await atomicBatch(db, {
|
|
120
|
+
checks: [sql`EXISTS (SELECT 1 FROM _dineway_content_hook_deliveries WHERE id=${row.id} AND lease_owner=${owner})`],
|
|
121
|
+
statements: [
|
|
122
|
+
sql`UPDATE _dineway_content_hook_deliveries SET delivered_at=${now().toISOString()},lease_owner=NULL,lease_until=NULL,last_error=NULL WHERE id=${row.id}`.compile(db),
|
|
123
|
+
sql`UPDATE _dineway_content_commit_events SET delivered_at=${now().toISOString()} WHERE operation_id=${row.operation_id} AND NOT EXISTS (SELECT 1 FROM _dineway_content_hook_deliveries WHERE operation_id=${row.operation_id} AND delivered_at IS NULL)`.compile(db),
|
|
124
|
+
sql`DELETE FROM _dineway_content_event_payloads WHERE operation_id=${row.operation_id} AND EXISTS (SELECT 1 FROM _dineway_content_commit_events WHERE operation_id=${row.operation_id} AND delivered_at IS NOT NULL)`.compile(db)
|
|
125
|
+
]
|
|
126
|
+
});
|
|
127
|
+
completed++;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
await sql`UPDATE _dineway_content_hook_deliveries SET lease_owner=NULL,lease_until=NULL,next_attempt_at=${new Date(now().getTime() + Math.min(36e5, 1e3 * 2 ** Math.min(row.attempts, 12))).toISOString()},last_error=${error instanceof ContentStorageError ? error.code : "DELIVERY_FAILED"} WHERE id=${row.id} AND lease_owner=${owner}`.execute(db);
|
|
130
|
+
failed++;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
completed,
|
|
135
|
+
failed
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
//#endregion
|
|
140
|
+
//#region src/content-storage/lifecycle-events.ts
|
|
141
|
+
/** Visibility-only changes stay on primary and commit their exact event snapshot atomically. */
|
|
142
|
+
async function prepareContentLifecycleEvents(db, previous, hook, current, permanent = false) {
|
|
143
|
+
const storage = getContentStorage(db, previous.type);
|
|
144
|
+
if (!storage) return { statements: [] };
|
|
145
|
+
const targets = storage.runtime.hookTargets?.([hook]) ?? [];
|
|
146
|
+
const metadata = targets.length ? await snapshotOwnedContentMetadata(db, previous.type, previous.id) : void 0;
|
|
147
|
+
const enrich = async (item) => ({
|
|
148
|
+
...item,
|
|
149
|
+
...metadata ? {
|
|
150
|
+
seo: storedContentSeo(metadata.owned.seo),
|
|
151
|
+
...await contentEventBylines(db, item, metadata.owned.bylines)
|
|
152
|
+
} : {}
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
...await prepareContentHookEvents(db, {
|
|
156
|
+
operationId: ulid(),
|
|
157
|
+
routingVersion: storage.runtime.config.version,
|
|
158
|
+
collection: previous.type,
|
|
159
|
+
entryId: previous.id
|
|
160
|
+
}, contentStorageHookSnapshotSchema.parse(JSON.parse(JSON.stringify({
|
|
161
|
+
collection: previous.type,
|
|
162
|
+
id: previous.id,
|
|
163
|
+
isNew: false,
|
|
164
|
+
permanent,
|
|
165
|
+
content: current ? await enrich(current) : {},
|
|
166
|
+
previousContent: await enrich(previous)
|
|
167
|
+
}))), targets),
|
|
168
|
+
checks: [
|
|
169
|
+
...metadata?.checks ?? [],
|
|
170
|
+
contentPartitionWritable(previous.type, previous.id),
|
|
171
|
+
sql`EXISTS (SELECT 1 FROM _dineway_content_storage_config WHERE id='active' AND version=${storage.runtime.config.version})`
|
|
172
|
+
]
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
//#endregion
|
|
13
177
|
//#region src/database/repositories/content.ts
|
|
14
178
|
var content_exports = /* @__PURE__ */ __exportAll({ ContentRepository: () => ContentRepository });
|
|
15
179
|
const ULID_PATTERN = /^[0-9A-Z]{26}$/;
|
|
@@ -99,9 +263,16 @@ function escapeRegExp(s) {
|
|
|
99
263
|
* Content is stored in per-collection tables (ec_posts, ec_pages, etc.)
|
|
100
264
|
* Each field becomes a real column in the table.
|
|
101
265
|
*/
|
|
102
|
-
var ContentRepository = class {
|
|
103
|
-
constructor(db) {
|
|
266
|
+
var ContentRepository = class ContentRepository {
|
|
267
|
+
constructor(db, options = {}) {
|
|
104
268
|
this.db = db;
|
|
269
|
+
this.options = options;
|
|
270
|
+
}
|
|
271
|
+
assertIndexWrite(type) {
|
|
272
|
+
if (!this.options.prepareIndexWrites && getContentStorage(this.db, type)) throw new DinewayValidationError("Use Dineway content commands or prepareContentWrite for partitioned content writes.");
|
|
273
|
+
}
|
|
274
|
+
writeChecks(type, id, action) {
|
|
275
|
+
return [...contentWriteChecks(type, id, action), ...getContentStorage(this.db, type) ? [contentPartitionWritable(type, id)] : []];
|
|
105
276
|
}
|
|
106
277
|
async normalizePreparedData(type, data) {
|
|
107
278
|
if (isPostgres(this.db)) return data;
|
|
@@ -115,8 +286,9 @@ var ContentRepository = class {
|
|
|
115
286
|
* Create a new content item
|
|
116
287
|
*/
|
|
117
288
|
async prepareCreate(input, options = {}) {
|
|
118
|
-
|
|
119
|
-
const
|
|
289
|
+
this.assertIndexWrite(input.type);
|
|
290
|
+
const id = options.id ?? ulid();
|
|
291
|
+
const now = options.now ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
120
292
|
const { type, slug, data, status = "draft", authorId, primaryBylineId, locale, translationOf, publishedAt, createdAt } = input;
|
|
121
293
|
if (!type) throw new DinewayValidationError("Content type is required");
|
|
122
294
|
const tableName = getTableName(type);
|
|
@@ -203,6 +375,7 @@ var ContentRepository = class {
|
|
|
203
375
|
}
|
|
204
376
|
/** Capture database defaults and JSON values from the saved row inside the write batch. */
|
|
205
377
|
async prepareDraftSnapshot(type, id, authorId) {
|
|
378
|
+
this.assertIndexWrite(type);
|
|
206
379
|
const tableName = getTableName(type);
|
|
207
380
|
const checks = [];
|
|
208
381
|
let snapshot;
|
|
@@ -291,6 +464,7 @@ var ContentRepository = class {
|
|
|
291
464
|
* A slug is auto-generated from the new title by the handler layer.
|
|
292
465
|
*/
|
|
293
466
|
async prepareDuplicate(type, id, authorId) {
|
|
467
|
+
this.assertIndexWrite(type);
|
|
294
468
|
const snapshot = await this.snapshot(type, id);
|
|
295
469
|
if (!snapshot) throw new DinewayValidationError("Content item not found");
|
|
296
470
|
const original = snapshot.item;
|
|
@@ -312,7 +486,7 @@ var ContentRepository = class {
|
|
|
312
486
|
batch: {
|
|
313
487
|
checks: [
|
|
314
488
|
snapshot.check,
|
|
315
|
-
...
|
|
489
|
+
...this.writeChecks(type, id, "edit"),
|
|
316
490
|
...prepared.batch.checks ?? []
|
|
317
491
|
],
|
|
318
492
|
statements: prepared.batch.statements
|
|
@@ -338,6 +512,7 @@ var ContentRepository = class {
|
|
|
338
512
|
AND deleted_at IS NULL
|
|
339
513
|
`.execute(this.db)).rows[0];
|
|
340
514
|
if (!row) return null;
|
|
515
|
+
await hydrateContentRows(this.db, type, [row]);
|
|
341
516
|
return this.mapRow(type, row);
|
|
342
517
|
}
|
|
343
518
|
/**
|
|
@@ -351,6 +526,7 @@ var ContentRepository = class {
|
|
|
351
526
|
WHERE id = ${id}
|
|
352
527
|
`.execute(this.db)).rows[0];
|
|
353
528
|
if (!row) return null;
|
|
529
|
+
await hydrateContentRows(this.db, type, [row]);
|
|
354
530
|
return this.mapRow(type, row);
|
|
355
531
|
}
|
|
356
532
|
/**
|
|
@@ -398,6 +574,7 @@ var ContentRepository = class {
|
|
|
398
574
|
LIMIT 1
|
|
399
575
|
`.execute(this.db)).rows[0];
|
|
400
576
|
if (!row) return null;
|
|
577
|
+
await hydrateContentRows(this.db, type, [row]);
|
|
401
578
|
return this.mapRow(type, row);
|
|
402
579
|
}
|
|
403
580
|
/**
|
|
@@ -417,6 +594,7 @@ var ContentRepository = class {
|
|
|
417
594
|
LIMIT 1
|
|
418
595
|
`.execute(this.db)).rows[0];
|
|
419
596
|
if (!row) return null;
|
|
597
|
+
await hydrateContentRows(this.db, type, [row]);
|
|
420
598
|
return this.mapRow(type, row);
|
|
421
599
|
}
|
|
422
600
|
/**
|
|
@@ -447,6 +625,7 @@ var ContentRepository = class {
|
|
|
447
625
|
const [rows, total] = await Promise.all([query.execute(), this.count(type, options.where)]);
|
|
448
626
|
const hasMore = rows.length > limit;
|
|
449
627
|
const items = rows.slice(0, limit);
|
|
628
|
+
await hydrateContentRows(this.db, type, items);
|
|
450
629
|
const mappedResult = {
|
|
451
630
|
items: items.map((row) => this.mapRow(type, row)),
|
|
452
631
|
total
|
|
@@ -462,6 +641,7 @@ var ContentRepository = class {
|
|
|
462
641
|
* Update content
|
|
463
642
|
*/
|
|
464
643
|
prepareUpdate(type, id, input, now = (/* @__PURE__ */ new Date()).toISOString()) {
|
|
644
|
+
this.assertIndexWrite(type);
|
|
465
645
|
const tableName = getTableName(type);
|
|
466
646
|
const updates = {
|
|
467
647
|
updated_at: now,
|
|
@@ -483,15 +663,18 @@ var ContentRepository = class {
|
|
|
483
663
|
}
|
|
484
664
|
async snapshot(type, id, includeTrashed = false) {
|
|
485
665
|
const row = (await sql`SELECT * FROM ${sql.table(getTableName(type))} WHERE id = ${id} AND ${includeTrashed ? sql`true` : sql`deleted_at IS NULL`}`.execute(this.db)).rows[0];
|
|
486
|
-
|
|
666
|
+
if (!row) return null;
|
|
667
|
+
const check = rowUnchanged(getTableName(type), row);
|
|
668
|
+
await hydrateContentRows(this.db, type, [row]);
|
|
669
|
+
return {
|
|
487
670
|
item: this.mapRow(type, row),
|
|
488
671
|
deleted: row.deleted_at !== null,
|
|
489
|
-
check
|
|
490
|
-
}
|
|
672
|
+
check
|
|
673
|
+
};
|
|
491
674
|
}
|
|
492
675
|
async update(type, id, input) {
|
|
493
676
|
await atomicBatch(this.db, {
|
|
494
|
-
checks:
|
|
677
|
+
checks: this.writeChecks(type, id, "edit"),
|
|
495
678
|
statements: [this.prepareUpdate(type, id, input)]
|
|
496
679
|
});
|
|
497
680
|
invalidateCollectionCache(type);
|
|
@@ -503,10 +686,11 @@ var ContentRepository = class {
|
|
|
503
686
|
* Delete content (soft delete - moves to trash)
|
|
504
687
|
*/
|
|
505
688
|
prepareDelete(type, id) {
|
|
689
|
+
this.assertIndexWrite(type);
|
|
506
690
|
const tableName = getTableName(type);
|
|
507
691
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
508
692
|
return {
|
|
509
|
-
checks:
|
|
693
|
+
checks: this.writeChecks(type, id, "delete"),
|
|
510
694
|
statements: [sql`
|
|
511
695
|
UPDATE ${sql.ref(tableName)}
|
|
512
696
|
SET deleted_at = ${now}
|
|
@@ -516,47 +700,90 @@ var ContentRepository = class {
|
|
|
516
700
|
};
|
|
517
701
|
}
|
|
518
702
|
async delete(type, id) {
|
|
519
|
-
const [result] = await atomicBatch(this.db, this.
|
|
703
|
+
const [result] = await atomicBatch(this.db, await this.prepareSoftDelete(type, id));
|
|
520
704
|
const changed = (result?.numAffectedRows ?? 0n) > 0n;
|
|
521
705
|
if (changed) invalidateCollectionCache(type);
|
|
522
706
|
return changed;
|
|
523
707
|
}
|
|
708
|
+
/** Compose a routed soft delete with primary business writes without dropping its event. */
|
|
709
|
+
async prepareSoftDelete(type, id) {
|
|
710
|
+
if (!getContentStorage(this.db, type)) return this.prepareDelete(type, id);
|
|
711
|
+
const snapshot = await this.snapshot(type, id);
|
|
712
|
+
if (!snapshot) return { statements: [] };
|
|
713
|
+
const effects = await prepareContentLifecycleEvents(this.db, snapshot.item, "content:afterDelete", null);
|
|
714
|
+
const write = new ContentRepository(this.db, { prepareIndexWrites: true }).prepareDelete(type, id);
|
|
715
|
+
return {
|
|
716
|
+
checks: [
|
|
717
|
+
snapshot.check,
|
|
718
|
+
...write.checks ?? [],
|
|
719
|
+
...effects.checks ?? []
|
|
720
|
+
],
|
|
721
|
+
statements: [...write.statements, ...effects.statements]
|
|
722
|
+
};
|
|
723
|
+
}
|
|
524
724
|
/**
|
|
525
725
|
* Restore content from trash
|
|
526
726
|
*/
|
|
527
727
|
async restore(type, id) {
|
|
528
728
|
const tableName = getTableName(type);
|
|
729
|
+
const snapshot = getContentStorage(this.db, type) ? await this.snapshot(type, id, true) : null;
|
|
730
|
+
if (getContentStorage(this.db, type) && !snapshot?.deleted) return null;
|
|
731
|
+
const effects = snapshot ? await prepareContentLifecycleEvents(this.db, snapshot.item, "content:afterRestore", snapshot.item) : {
|
|
732
|
+
checks: [],
|
|
733
|
+
statements: []
|
|
734
|
+
};
|
|
529
735
|
const [result] = await atomicBatch(this.db, {
|
|
530
|
-
checks:
|
|
736
|
+
checks: [
|
|
737
|
+
...this.writeChecks(type, id, "edit"),
|
|
738
|
+
...effects.checks ?? [],
|
|
739
|
+
...snapshot ? [snapshot.check] : []
|
|
740
|
+
],
|
|
531
741
|
statements: [sql`
|
|
532
742
|
UPDATE ${sql.ref(tableName)}
|
|
533
743
|
SET deleted_at = NULL
|
|
534
744
|
WHERE id = ${id}
|
|
535
745
|
AND deleted_at IS NOT NULL
|
|
536
746
|
RETURNING *
|
|
537
|
-
`.compile(this.db)]
|
|
747
|
+
`.compile(this.db), ...effects.statements]
|
|
538
748
|
});
|
|
539
749
|
const restored = result?.rows[0];
|
|
540
750
|
if (!restored) return null;
|
|
541
751
|
invalidateCollectionCache(type);
|
|
752
|
+
await hydrateContentRows(this.db, type, [restored]);
|
|
542
753
|
return this.mapRow(type, restored);
|
|
543
754
|
}
|
|
544
755
|
/**
|
|
545
756
|
* Permanently delete a soft-deleted content row.
|
|
546
757
|
*/
|
|
547
758
|
async permanentDelete(type, id) {
|
|
759
|
+
const batch = await this.preparePermanentDelete(type, id);
|
|
760
|
+
if (!batch) return false;
|
|
761
|
+
await atomicBatch(this.db, batch);
|
|
762
|
+
invalidateCollectionCache(type);
|
|
763
|
+
return true;
|
|
764
|
+
}
|
|
765
|
+
async preparePermanentDelete(type, id) {
|
|
548
766
|
const tableName = getTableName(type);
|
|
549
|
-
const
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
767
|
+
const snapshot = await this.snapshot(type, id, true);
|
|
768
|
+
if (!snapshot?.deleted) return null;
|
|
769
|
+
const effects = await prepareContentLifecycleEvents(this.db, snapshot.item, "content:afterDelete", null, true);
|
|
770
|
+
return {
|
|
771
|
+
checks: [
|
|
772
|
+
...this.writeChecks(type, id, "permanent"),
|
|
773
|
+
snapshot.check,
|
|
774
|
+
...effects.checks ?? []
|
|
775
|
+
],
|
|
776
|
+
statements: [
|
|
777
|
+
sql`DELETE FROM ${sql.table(tableName)} WHERE id=${id} AND deleted_at IS NOT NULL`.compile(this.db),
|
|
778
|
+
this.db.deleteFrom("_dineway_seo").where("collection", "=", type).where("content_id", "=", id).compile(),
|
|
779
|
+
this.db.deleteFrom("content_taxonomies").where("collection", "=", type).where("entry_id", "=", id).compile(),
|
|
780
|
+
this.db.deleteFrom("_dineway_comments").where("collection", "=", type).where("content_id", "=", id).compile(),
|
|
781
|
+
this.db.deleteFrom("revisions").where("collection", "=", type).where("entry_id", "=", id).compile(),
|
|
782
|
+
this.db.deleteFrom("_dineway_content_bylines").where("collection_slug", "=", type).where("content_id", "=", id).compile(),
|
|
783
|
+
...getContentStorage(this.db, type) ? [sql`DELETE FROM _dineway_content_locations WHERE collection=${type} AND entry_id=${id}`.compile(this.db)] : [],
|
|
784
|
+
...effects.statements
|
|
785
|
+
]
|
|
786
|
+
};
|
|
560
787
|
}
|
|
561
788
|
/**
|
|
562
789
|
* Find trashed content items
|
|
@@ -581,6 +808,7 @@ var ContentRepository = class {
|
|
|
581
808
|
const rows = await query.execute();
|
|
582
809
|
const hasMore = rows.length > limit;
|
|
583
810
|
const items = rows.slice(0, limit);
|
|
811
|
+
await hydrateContentRows(this.db, type, items);
|
|
584
812
|
const mappedResult = { items: items.map((row) => {
|
|
585
813
|
const record = row;
|
|
586
814
|
return {
|
|
@@ -677,9 +905,20 @@ var ContentRepository = class {
|
|
|
677
905
|
if (scheduledDate <= /* @__PURE__ */ new Date()) throw new DinewayValidationError("Scheduled date must be in the future");
|
|
678
906
|
const snapshot = await this.snapshot(type, id);
|
|
679
907
|
if (!snapshot) throw new DinewayValidationError("Content item not found");
|
|
680
|
-
const
|
|
908
|
+
const existing = snapshot.item;
|
|
909
|
+
const newStatus = existing.status === "published" ? "published" : "scheduled";
|
|
910
|
+
const effects = await prepareContentLifecycleEvents(this.db, existing, "content:afterSchedule", {
|
|
911
|
+
...existing,
|
|
912
|
+
status: newStatus,
|
|
913
|
+
scheduledAt,
|
|
914
|
+
updatedAt: now
|
|
915
|
+
});
|
|
681
916
|
await atomicBatch(this.db, {
|
|
682
|
-
checks: [
|
|
917
|
+
checks: [
|
|
918
|
+
snapshot.check,
|
|
919
|
+
...this.writeChecks(type, id, "publish"),
|
|
920
|
+
...effects.checks ?? []
|
|
921
|
+
],
|
|
683
922
|
statements: [sql`
|
|
684
923
|
UPDATE ${sql.ref(tableName)}
|
|
685
924
|
SET status = ${newStatus},
|
|
@@ -687,7 +926,7 @@ var ContentRepository = class {
|
|
|
687
926
|
updated_at = ${now}
|
|
688
927
|
WHERE id = ${id}
|
|
689
928
|
AND deleted_at IS NULL
|
|
690
|
-
`.compile(this.db)]
|
|
929
|
+
`.compile(this.db), ...effects.statements]
|
|
691
930
|
});
|
|
692
931
|
invalidateCollectionCache(type);
|
|
693
932
|
const updated = await this.findById(type, id);
|
|
@@ -705,9 +944,21 @@ var ContentRepository = class {
|
|
|
705
944
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
706
945
|
const snapshot = await this.snapshot(type, id);
|
|
707
946
|
if (!snapshot) throw new DinewayValidationError("Content item not found");
|
|
708
|
-
const
|
|
947
|
+
const existing = snapshot.item;
|
|
948
|
+
const newStatus = existing.status === "published" ? "published" : "draft";
|
|
949
|
+
if (getContentStorage(this.db, type) && existing.scheduledAt === null) return existing;
|
|
950
|
+
const effects = await prepareContentLifecycleEvents(this.db, existing, "content:afterUnschedule", {
|
|
951
|
+
...existing,
|
|
952
|
+
status: newStatus,
|
|
953
|
+
scheduledAt: null,
|
|
954
|
+
updatedAt: now
|
|
955
|
+
});
|
|
709
956
|
await atomicBatch(this.db, {
|
|
710
|
-
checks: [
|
|
957
|
+
checks: [
|
|
958
|
+
snapshot.check,
|
|
959
|
+
...this.writeChecks(type, id, "publish"),
|
|
960
|
+
...effects.checks ?? []
|
|
961
|
+
],
|
|
711
962
|
statements: [sql`
|
|
712
963
|
UPDATE ${sql.ref(tableName)}
|
|
713
964
|
SET status = ${newStatus},
|
|
@@ -716,7 +967,7 @@ var ContentRepository = class {
|
|
|
716
967
|
WHERE id = ${id}
|
|
717
968
|
AND scheduled_at IS NOT NULL
|
|
718
969
|
AND deleted_at IS NULL
|
|
719
|
-
`.compile(this.db)]
|
|
970
|
+
`.compile(this.db), ...effects.statements]
|
|
720
971
|
});
|
|
721
972
|
invalidateCollectionCache(type);
|
|
722
973
|
const updated = await this.findById(type, id);
|
|
@@ -734,26 +985,30 @@ var ContentRepository = class {
|
|
|
734
985
|
const tableName = getTableName(type);
|
|
735
986
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
736
987
|
const limitClause = typeof limit === "number" && Number.isInteger(limit) && limit > 0 ? sql`LIMIT ${limit}` : sql``;
|
|
737
|
-
|
|
988
|
+
const result = await sql`
|
|
738
989
|
SELECT * FROM ${sql.ref(tableName)}
|
|
739
990
|
WHERE scheduled_at IS NOT NULL
|
|
740
991
|
AND scheduled_at <= ${now}
|
|
741
992
|
AND deleted_at IS NULL
|
|
742
993
|
ORDER BY scheduled_at ASC
|
|
743
994
|
${limitClause}
|
|
744
|
-
`.execute(this.db)
|
|
995
|
+
`.execute(this.db);
|
|
996
|
+
await hydrateContentRows(this.db, type, result.rows);
|
|
997
|
+
return result.rows.map((row) => this.mapRow(type, row));
|
|
745
998
|
}
|
|
746
999
|
/**
|
|
747
1000
|
* Find all translations in a translation group
|
|
748
1001
|
*/
|
|
749
1002
|
async findTranslations(type, translationGroup) {
|
|
750
1003
|
const tableName = getTableName(type);
|
|
751
|
-
|
|
1004
|
+
const result = await sql`
|
|
752
1005
|
SELECT * FROM ${sql.ref(tableName)}
|
|
753
1006
|
WHERE translation_group = ${translationGroup}
|
|
754
1007
|
AND deleted_at IS NULL
|
|
755
1008
|
ORDER BY locale ASC
|
|
756
|
-
`.execute(this.db)
|
|
1009
|
+
`.execute(this.db);
|
|
1010
|
+
await hydrateContentRows(this.db, type, result.rows);
|
|
1011
|
+
return result.rows.map((row) => this.mapRow(type, row));
|
|
757
1012
|
}
|
|
758
1013
|
/**
|
|
759
1014
|
* Publish the current draft
|
|
@@ -767,6 +1022,7 @@ var ContentRepository = class {
|
|
|
767
1022
|
* `published_at` is preserved and first publish falls back to the current time.
|
|
768
1023
|
*/
|
|
769
1024
|
async preparePublish(type, id, publishedAt, requireScheduledDue = false) {
|
|
1025
|
+
this.assertIndexWrite(type);
|
|
770
1026
|
const tableName = getTableName(type);
|
|
771
1027
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
772
1028
|
const snapshot = await this.snapshot(type, id);
|
|
@@ -833,7 +1089,7 @@ var ContentRepository = class {
|
|
|
833
1089
|
checks: [
|
|
834
1090
|
snapshot.check,
|
|
835
1091
|
rowUnchanged("revisions", revision),
|
|
836
|
-
...
|
|
1092
|
+
...this.writeChecks(type, id, "edit")
|
|
837
1093
|
],
|
|
838
1094
|
statements: [sql`UPDATE ${sql.table(tableName)} SET draft_revision_id = ${revisionId}, updated_at = ${(/* @__PURE__ */ new Date()).toISOString()} WHERE id = ${id} AND deleted_at IS NULL`.compile(this.db)]
|
|
839
1095
|
});
|
|
@@ -850,7 +1106,7 @@ var ContentRepository = class {
|
|
|
850
1106
|
const snapshot = await this.snapshot(type, id);
|
|
851
1107
|
if (!snapshot) throw new DinewayValidationError("Content item not found");
|
|
852
1108
|
const existing = snapshot.item;
|
|
853
|
-
const checks = [snapshot.check, ...
|
|
1109
|
+
const checks = [snapshot.check, ...this.writeChecks(type, id, "publish")];
|
|
854
1110
|
const statements = [];
|
|
855
1111
|
let draftId = existing.draftRevisionId;
|
|
856
1112
|
if (!draftId && existing.liveRevisionId) {
|
|
@@ -891,7 +1147,7 @@ var ContentRepository = class {
|
|
|
891
1147
|
const existing = snapshot.item;
|
|
892
1148
|
if (!existing.draftRevisionId) return existing;
|
|
893
1149
|
await atomicBatch(this.db, {
|
|
894
|
-
checks: [snapshot.check, ...
|
|
1150
|
+
checks: [snapshot.check, ...this.writeChecks(type, id, "edit")],
|
|
895
1151
|
statements: [sql`
|
|
896
1152
|
UPDATE ${sql.ref(tableName)}
|
|
897
1153
|
SET draft_revision_id = NULL,
|
|
@@ -911,6 +1167,7 @@ var ContentRepository = class {
|
|
|
911
1167
|
* Keys starting with _ are revision metadata (e.g. _slug) and are skipped.
|
|
912
1168
|
*/
|
|
913
1169
|
prepareSyncDataColumns(type, id, data) {
|
|
1170
|
+
this.assertIndexWrite(type);
|
|
914
1171
|
const tableName = getTableName(type);
|
|
915
1172
|
const updates = {};
|
|
916
1173
|
for (const [key, value] of Object.entries(data)) {
|
|
@@ -986,4 +1243,4 @@ var ContentRepository = class {
|
|
|
986
1243
|
};
|
|
987
1244
|
|
|
988
1245
|
//#endregion
|
|
989
|
-
export { content_exports as n, ContentRepository as t };
|
|
1246
|
+
export { prepareContentHookEvents as a, drainContentHookEvents as i, content_exports as n, contentStorageHookSchema as o, prepareContentLifecycleEvents as r, contentStorageHookSnapshotSchema as s, ContentRepository as t };
|