dineway 0.1.49 → 0.2.1
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-DUaz_w7p.mjs +79 -0
- package/dist/{activity-events-CwM7yxPW.mjs → activity-events-CJDvE2uc.mjs} +5 -113
- package/dist/actor-0QJ1Gbtf.mjs +37 -0
- package/dist/after-BfniwgIf.mjs +9 -0
- package/dist/{allowed-origins-CyGnbgBd.mjs → allowed-origins--OwHHiY8.mjs} +1 -1
- package/dist/api/route-utils.d.mts +9 -10
- package/dist/api/route-utils.mjs +16 -13
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +5 -4
- package/dist/{api-BMIxRIEN.mjs → api-B4PHIF4V.mjs} +93 -41
- package/dist/{api-tokens-DtvdtIkm.mjs → api-tokens-tbK_sORH.mjs} +6 -2
- package/dist/{apply-D_RlTYtC.mjs → apply-DjTqq6Ae.mjs} +117 -77
- package/dist/astro/image-endpoint.d.mts +7 -0
- package/dist/astro/image-endpoint.mjs +54 -0
- package/dist/astro/index.d.mts +34 -11
- package/dist/astro/index.mjs +163 -24
- package/dist/astro/integration/shims/use-sync-external-store-with-selector.js +71 -0
- package/dist/astro/integration/shims/use-sync-external-store.js +1 -0
- package/dist/astro/middleware/auth.d.mts +8 -18
- package/dist/astro/middleware/auth.mjs +42 -24
- package/dist/astro/middleware/redirect.mjs +13 -4
- package/dist/astro/middleware/request-context.mjs +8 -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.mjs +389 -206
- package/dist/astro/routes/admin.astro +6 -1
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +7 -6
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +7 -6
- package/dist/astro/routes/api/admin/api-tokens/_id_.mjs +4 -4
- package/dist/astro/routes/api/admin/api-tokens/index.mjs +6 -6
- package/dist/astro/routes/api/admin/briefing.mjs +21 -17
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +4 -4
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +9 -8
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +9 -8
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +9 -8
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +17 -14
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +17 -14
- package/dist/astro/routes/api/admin/bylines/index.mjs +17 -14
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +14 -12
- package/dist/astro/routes/api/admin/comments/_id_.mjs +6 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +11 -9
- package/dist/astro/routes/api/admin/comments/counts.mjs +6 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +11 -9
- package/dist/astro/routes/api/admin/context/_id_/history.mjs +27 -24
- package/dist/astro/routes/api/admin/context/_id_/index.mjs +27 -24
- package/dist/astro/routes/api/admin/context/_id_/review.mjs +32 -28
- package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +32 -28
- package/dist/astro/routes/api/admin/context/diff.mjs +31 -27
- package/dist/astro/routes/api/admin/context/index.mjs +32 -28
- package/dist/astro/routes/api/admin/context/stale.mjs +31 -27
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +27 -24
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +31 -27
- package/dist/astro/routes/api/admin/hitl-requests/index.mjs +31 -27
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +28 -25
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +3 -3
- package/dist/astro/routes/api/admin/oauth-clients/_id_.mjs +6 -6
- package/dist/astro/routes/api/admin/oauth-clients/index.mjs +6 -6
- package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +56 -51
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +56 -51
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +54 -49
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +53 -48
- package/dist/astro/routes/api/admin/plugins/index.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +46 -42
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +53 -48
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +46 -42
- package/dist/astro/routes/api/admin/plugins/updates.mjs +46 -42
- package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +32 -63
- package/dist/astro/routes/api/admin/review-requests/index.d.mts +2 -1
- package/dist/astro/routes/api/admin/review-requests/index.mjs +58 -10
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +46 -42
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +46 -42
- package/dist/astro/routes/api/admin/users/_id_/disable.mjs +3 -3
- package/dist/astro/routes/api/admin/users/_id_/enable.mjs +2 -2
- package/dist/astro/routes/api/admin/users/_id_/index.mjs +8 -7
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +4 -4
- package/dist/astro/routes/api/admin/users/index.mjs +7 -6
- package/dist/astro/routes/api/auth/dev-bypass.mjs +4 -4
- package/dist/astro/routes/api/auth/invite/accept.mjs +2 -2
- package/dist/astro/routes/api/auth/invite/complete.mjs +12 -11
- package/dist/astro/routes/api/auth/invite/index.mjs +9 -8
- package/dist/astro/routes/api/auth/invite/register-options.mjs +11 -10
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +11 -10
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +3 -3
- package/dist/astro/routes/api/auth/me.mjs +9 -8
- 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 +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +6 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +12 -11
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +10 -9
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +11 -10
- package/dist/astro/routes/api/auth/passkey/verify.mjs +11 -10
- package/dist/astro/routes/api/auth/setup-token/index.mjs +5 -5
- package/dist/astro/routes/api/auth/setup-token/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/signup/complete.mjs +12 -11
- package/dist/astro/routes/api/auth/signup/request.mjs +11 -10
- package/dist/astro/routes/api/auth/signup/verify.mjs +2 -2
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +15 -13
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.d.mts +8 -0
- package/dist/astro/routes/api/comments/_collection_/_contentId_/reactions.mjs +160 -0
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -10
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +49 -20
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +67 -32
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +16 -14
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +6 -5
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +11 -9
- package/dist/astro/routes/api/content/_collection_/authors.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/index.mjs +11 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs +7 -6
- package/dist/astro/routes/api/dashboard.mjs +9 -8
- 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 +22 -10
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +9 -6
- package/dist/astro/routes/api/import/wordpress/execute.d.mts +18 -1
- package/dist/astro/routes/api/import/wordpress/execute.mjs +85 -37
- package/dist/astro/routes/api/import/wordpress/media.d.mts +12 -1
- package/dist/astro/routes/api/import/wordpress/media.mjs +20 -14
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +36 -32
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.d.mts +17 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +121 -100
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +24 -12
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +55 -2
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +284 -55
- package/dist/astro/routes/api/manifest.mjs +14 -5
- package/dist/astro/routes/api/mcp.mjs +753 -170
- package/dist/astro/routes/api/media/_id_/confirm.mjs +38 -10
- package/dist/astro/routes/api/media/_id_.mjs +11 -7
- 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 +11 -10
- package/dist/astro/routes/api/media.mjs +28 -35
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +32 -28
- package/dist/astro/routes/api/menus/_name_/items.mjs +32 -28
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +32 -28
- package/dist/astro/routes/api/menus/_name_/translations.mjs +32 -28
- package/dist/astro/routes/api/menus/_name_.mjs +32 -28
- package/dist/astro/routes/api/menus/index.mjs +32 -28
- package/dist/astro/routes/api/oauth/authorize.mjs +7 -7
- package/dist/astro/routes/api/oauth/device/authorize.mjs +6 -6
- 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 +6 -6
- package/dist/astro/routes/api/oauth/token/revoke.mjs +6 -6
- package/dist/astro/routes/api/oauth/token.mjs +6 -6
- package/dist/astro/routes/api/openapi.json.mjs +4 -3
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +46 -31
- package/dist/astro/routes/api/redirects/404s/index.mjs +11 -10
- package/dist/astro/routes/api/redirects/404s/summary.mjs +11 -10
- package/dist/astro/routes/api/redirects/_id_.mjs +33 -29
- package/dist/astro/routes/api/redirects/index.mjs +33 -29
- 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 +48 -43
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +48 -43
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +48 -43
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +48 -43
- package/dist/astro/routes/api/schema/collections/index.mjs +48 -43
- package/dist/astro/routes/api/schema/index.mjs +14 -15
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +46 -42
- package/dist/astro/routes/api/schema/orphans/index.mjs +46 -42
- package/dist/astro/routes/api/search/enable.mjs +11 -10
- package/dist/astro/routes/api/search/index.mjs +10 -9
- package/dist/astro/routes/api/search/rebuild.mjs +11 -10
- package/dist/astro/routes/api/search/stats.mjs +6 -6
- package/dist/astro/routes/api/search/suggest.mjs +10 -9
- package/dist/astro/routes/api/sections/_slug_.mjs +32 -28
- package/dist/astro/routes/api/sections/index.mjs +32 -28
- package/dist/astro/routes/api/settings/email.mjs +4 -4
- package/dist/astro/routes/api/settings.mjs +32 -28
- package/dist/astro/routes/api/setup/admin-verify.mjs +14 -13
- package/dist/astro/routes/api/setup/admin.mjs +12 -11
- package/dist/astro/routes/api/setup/dev-bypass.mjs +31 -25
- package/dist/astro/routes/api/setup/dev-reset.mjs +2 -2
- package/dist/astro/routes/api/setup/index.mjs +29 -25
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +8 -7
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +35 -31
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +35 -31
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +35 -31
- package/dist/astro/routes/api/taxonomies/index.mjs +35 -31
- package/dist/astro/routes/api/themes/preview.mjs +5 -5
- 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 +31 -27
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +32 -28
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +32 -28
- package/dist/astro/routes/api/widget-areas/_name_.mjs +29 -26
- package/dist/astro/routes/api/widget-areas/index.mjs +32 -28
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +8 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +23 -14
- package/dist/astro/routes/sitemap.xml.mjs +9 -8
- package/dist/astro/session-driver.d.mts +1 -1
- package/dist/astro/session-driver.mjs +2 -2
- package/dist/astro/types.d.mts +22 -13
- package/dist/{audit-BeNsSyfU.mjs → audit-B2pRxZ20.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-Dr14I98m.mjs → auth-control-guard-D71jourk.mjs} +1 -1
- package/dist/{authorize-BLO0m7fW.mjs → authorize-ZXPGPwKn.mjs} +1 -1
- package/dist/{briefing-CkTee1ex.mjs → briefing-0rf-su3-.mjs} +90 -28
- package/dist/{briefing-DJX6irto.mjs → briefing-kRhegBoF.mjs} +2 -1
- package/dist/bundle-CEcdUa1s.mjs +602 -0
- package/dist/{byline-BVC1lV6G.mjs → byline-7xR185Ly.mjs} +30 -62
- package/dist/{byline-fields-Cj39WhXC.mjs → byline-fields-BKzA0fJU.mjs} +1 -1
- package/dist/{byline-fields-uJlygdzM.d.mts → byline-fields-Ckeqd1OY.d.mts} +88 -35
- package/dist/{byline-fields-cNrLJVRs.mjs → byline-fields-WN7RQT4q.mjs} +10 -4
- package/dist/{byline-registry-4v6tXMNX.mjs → byline-registry-Ba54M74c.mjs} +2 -2
- package/dist/{bylines-LN9XISRo.mjs → bylines-C-EL6dh3.mjs} +9 -3
- package/dist/{bylines-DwokOFj6.mjs → bylines-CmZFCMr0.mjs} +5 -5
- package/dist/{cache-Bac05gBd.mjs → cache-DkVCKGio.mjs} +2 -2
- package/dist/{chunks-CuUt7K50.mjs → chunks-ChGNDY8r.mjs} +1 -1
- package/dist/cli/index.d.mts +29 -1
- package/dist/cli/index.mjs +1466 -1763
- package/dist/cli/plugin-kit.d.mts +75 -0
- package/dist/cli/plugin-kit.mjs +4 -0
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +27 -52
- package/dist/client/index.mjs +34 -6
- package/dist/client-factory-BDD9azPJ.mjs +233 -0
- package/dist/{comment-Beue8-15.mjs → comment-DFALgsJD.mjs} +13 -3
- package/dist/comment-reaction-C37bf99u.mjs +58 -0
- package/dist/{comments-DcjFIfqX.mjs → comments-B3NwDBxl.mjs} +1 -1
- package/dist/{content-CBxYGWfL.mjs → content-DJcAYFhz.mjs} +51 -34
- package/dist/content-refresh-B4ZCmxgd.mjs +1576 -0
- package/dist/{context-Df1xVYyr.mjs → context-DnpXcp6Y.mjs} +2 -2
- package/dist/{context-CQVNZaR8.mjs → context-fSCYLL3c.mjs} +125 -53
- package/dist/{context-route-helpers-B9wj8Rmh.mjs → context-route-helpers-CI8XzcsK.mjs} +2 -1
- package/dist/{cron-DxCAU_Sn.mjs → cron-B1SL_lsb.mjs} +7 -3
- package/dist/{dashboard-B7ZUNuyF.mjs → dashboard-D0nj5oWg.mjs} +4 -4
- 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-BZVGftqi.mjs → device-flow-BJe6VEhP.mjs} +5 -5
- package/dist/{placeholder-d54Qr_7n.mjs → enrich-Ck9tfMqe.mjs} +36 -9
- package/dist/{error-DCSuUAZW.mjs → error-CSVaQNZy.mjs} +5 -0
- package/dist/{experimental-workflows-CSMffP6q.mjs → experimental-workflows-GVhUgzEs.mjs} +1 -1
- package/dist/field-defs-cache-DL-T2XVS.mjs +49 -0
- package/dist/forgeway-seo-client-G5ddhVHd.mjs +456 -0
- package/dist/{fts-manager-B5l_qwrA.mjs → fts-manager-ewTGohf4.mjs} +1 -1
- package/dist/{hitl-requests-7NlzVeUA.mjs → hitl-requests-DEFj8e6u.mjs} +2 -2
- package/dist/{hitl-route-helpers-k---_H3-.mjs → hitl-route-helpers-C23JHaWz.mjs} +5 -4
- package/dist/import-CXXL5pip.mjs +1354 -0
- package/dist/index-DcnOCD1e.d.mts +375 -0
- package/dist/index.d.mts +15 -16
- package/dist/index.mjs +85 -70
- package/dist/{jsonld-DZ67souc.d.mts → jsonld-DzKbhRZ4.d.mts} +8 -4
- package/dist/{load-D9OiGr2m.mjs → load-CFtJRT3c.mjs} +1 -1
- package/dist/{loader--GOYux8M.mjs → loader-aWkkc1_o.mjs} +117 -31
- package/dist/{manifest-schema-qh2P7RDX.mjs → manifest-schema-uA6pRFXi.mjs} +38 -1
- package/dist/mcp-reviewed-executor-Dn52L_yY.mjs +558 -0
- package/dist/media/image-endpoint.d.mts +32 -0
- package/dist/media/image-endpoint.mjs +111 -0
- package/dist/media/index.d.mts +27 -2
- package/dist/media/index.mjs +5 -3
- package/dist/media/local-runtime.d.mts +15 -11
- package/dist/media/local-runtime.mjs +9 -7
- package/dist/{media-CbKyYukG.mjs → media-CVMOoywq.mjs} +3 -1
- package/dist/{media-allowlist-BYxJIcTO.mjs → media-allowlist-zDNJmXCo.mjs} +1 -1
- package/dist/media-url-BdoLPvg8.mjs +20 -0
- package/dist/{menus-C7F0sCrC.mjs → menus-CCG2z5um.mjs} +80 -15
- package/dist/{menus-BZbXf-ej.mjs → menus-CmyIkRG5.mjs} +19 -5
- package/dist/{normalize-ByemhhfW.mjs → normalize-Cyt7JdF7.mjs} +8 -1
- package/dist/{oauth-authorization-DF-LCsIA.mjs → oauth-authorization-B9H7X85L.mjs} +5 -5
- package/dist/{oauth-clients-Du-V0fEm.mjs → oauth-clients-Dwl32-Uj.mjs} +2 -2
- package/dist/object-cache/memory.d.mts +14 -0
- package/dist/object-cache/memory.mjs +55 -0
- package/dist/object-cache-D51qOseS.mjs +419 -0
- package/dist/output-DhBe5_Pi.mjs +68 -0
- package/dist/page/index.d.mts +10 -3
- package/dist/page/index.mjs +2 -2
- package/dist/{parse-CneSgl7-.mjs → parse-i15EFSAE.mjs} +1 -1
- package/dist/{parser-DxfsARXL.mjs → parser-06LLLL4E.mjs} +151 -9
- package/dist/{placeholder-CXfoCtCd.d.mts → placeholder-DkWkXfDI.d.mts} +12 -4
- package/dist/plugin-utils.d.mts +8 -9
- package/dist/plugins/adapt-sandbox-entry.d.mts +8 -9
- package/dist/plugins/adapt-sandbox-entry.mjs +13 -2
- package/dist/{plugins-DzfqRREq.mjs → plugins-CPA2PtfY.mjs} +919 -66
- package/dist/{transport-LSdZVXHF.mjs → portable-text-BASHceim.mjs} +1 -134
- package/dist/portable-text-E79LyjGo.d.mts +45 -0
- package/dist/{preview-C-3YTX2U.mjs → preview-BjedZm8G.mjs} +4 -3
- package/dist/process-cache-CCDgti7j.mjs +106 -0
- package/dist/project-env-DKibmuP8.mjs +95 -0
- package/dist/{provider-loader-9it4vd6L.d.mts → provider-loader-DC2JdWeO.d.mts} +1 -1
- package/dist/{public-url-B4xV4rGa.d.mts → public-url-DQJCnYi9.d.mts} +1 -1
- package/dist/publication-authorization-RKiHXKtq.mjs +985 -0
- package/dist/{query-CZ3TH_Uu.mjs → query-C2U5u5_p.mjs} +11 -6
- package/dist/{query-Ds0EnMFX.mjs → query-DEv5x6yB.mjs} +281 -76
- package/dist/{rate-limit-i0G3IAOX.mjs → rate-limit-DglsAJSw.mjs} +2 -2
- package/dist/{redirect-CEACczxo.mjs → redirect-ubhEqQCQ.mjs} +2 -2
- package/dist/{redirects-ocRJmQHP.mjs → redirects-Bhpm8bRe.mjs} +35 -19
- package/dist/{redirects-DYj1yPxs.mjs → redirects-xs2yahLq.mjs} +47 -24
- package/dist/{registry-D7HACema.mjs → registry-BYYyb2tF.mjs} +148 -81
- package/dist/request-context.d.mts +2 -0
- package/dist/{request-meta-DAb6xaP9.mjs → request-meta-CFe1tW2M.mjs} +1 -1
- package/dist/review-payload-BysRWpxS.mjs +111 -0
- package/dist/{review-requests-BW2NxY-l.mjs → review-requests-CTWGnWUt.mjs} +1 -1
- package/dist/review-requests-D42VEP1l.mjs +142 -0
- package/dist/review-route-helpers-C31vO6SI.mjs +41 -0
- package/dist/runner-BgmttQmD.mjs +7444 -0
- package/dist/{runner-09sTqtv0.d.mts → runner-D6hzs8L9.d.mts} +1 -1
- package/dist/runtime.d.mts +9 -10
- package/dist/runtime.mjs +3 -3
- package/dist/schema-DUtnZxjZ.mjs +8 -0
- package/dist/{search-Gdrqj582.mjs → search-DUKgZUlm.mjs} +5 -3
- package/dist/{secrets-CeGpBFV2.mjs → secrets-ZV5rd8yV.mjs} +14 -11
- package/dist/{sections-BOjU13Y-.mjs → sections-DvFgsnda.mjs} +2 -2
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +21 -18
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.mjs +3 -12
- package/dist/{seo-5lJOtB5J.mjs → seo-BLszyJxd.mjs} +22 -4
- package/dist/{seo-CLj8lS7Q.mjs → seo-BU8MLCS9.mjs} +5 -2
- package/dist/{seo-contributions-CqVvReEj.mjs → seo-contributions-GnCuL1ML.mjs} +11 -3
- package/dist/{service-jGlhrICs.mjs → service-FL3fB0Rx.mjs} +2 -2
- package/dist/session-user-Ct6GBLvn.mjs +22 -0
- package/dist/{settings-CUXOxzsT.mjs → settings-BECcAIRH.mjs} +28 -55
- package/dist/{settings-DlBsT2VS.mjs → settings-EzADu-dd.mjs} +2 -2
- package/dist/{setup-complete-BRrdPYjZ.mjs → setup-complete-Da0axZEE.mjs} +1 -1
- package/dist/{site-activity-DONFrMBJ.mjs → site-activity-h8smOlYI.mjs} +1 -1
- package/dist/{site-context-C8Az_P_I.mjs → site-context-B8T1kpUP.mjs} +337 -530
- package/dist/{site-url-DIMD68go.mjs → site-url-DJEid0ml.mjs} +1 -1
- package/dist/stable-hash-DshcXvRE.mjs +19 -0
- package/dist/status-NqWOSFAD.mjs +21 -0
- 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 +1 -1
- package/dist/{taxonomies-D9Sw4wWM.mjs → taxonomies-BiM9NtgW.mjs} +36 -29
- package/dist/taxonomies-DSnY5nOa.mjs +443 -0
- package/dist/{taxonomy-B169Nm6B.mjs → taxonomy-0k_vRVsD.mjs} +44 -9
- package/dist/transport-C46KHLMP.mjs +134 -0
- package/dist/types-A8fPOJnl.mjs +69 -0
- package/dist/types-BLQCz46p.d.mts +118 -0
- package/dist/{types-CwawBUTa.d.mts → types-B_FlxIIl.d.mts} +4 -1
- package/dist/{types-CSgR9nQB.mjs → types-ChxYDRvx.mjs} +1 -1
- package/dist/{types-GaCtZ1k9.d.mts → types-Cw0PeCT_.d.mts} +18 -0
- package/dist/types-DuQn1G7-.d.mts +2973 -0
- package/dist/{runtime-C4-2lSFg.d.mts → types-DwoUifGE.d.mts} +5668 -3000
- package/dist/{types-DRIKLmJI.d.mts → types-opjX_kz6.d.mts} +17 -2
- package/dist/ui/server-runtime.d.mts +13 -15
- package/dist/ui/server-runtime.mjs +24 -20
- package/dist/url-guoXQQcV.mjs +33 -0
- package/dist/{user-DTLoZs16.mjs → user-BH-n01y3.mjs} +2 -2
- package/dist/{utils-B8hBJ9Oz.mjs → utils-D1SrKGtP.mjs} +129 -7
- package/dist/{validate-DzjCdy6v.d.mts → validate-CbVFoJgc.d.mts} +65 -8
- package/dist/{validate-DWmPO6oj.mjs → validate-D1HL-oLR.mjs} +11 -6
- package/dist/version-C3iVRuaF.mjs +6 -0
- package/dist/{widgets-BpJ8EpPd.mjs → widgets-BZrLrNgS.mjs} +46 -43
- package/dist/{wordpress-slugs-DHNR9LpG.mjs → wordpress-slugs-C3PWcowq.mjs} +1 -1
- package/dist/{zod-generator-K91-g665.mjs → zod-generator-C7AsLpSB.mjs} +42 -14
- package/package.json +38 -8
- package/src/components/Block.astro +50 -0
- package/src/components/Comments.astro +143 -1
- package/src/components/DinewayHead.astro +19 -2
- package/src/components/DinewayImage.astro +66 -33
- package/src/components/DinewayMedia.astro +1 -2
- package/src/components/Image.astro +85 -40
- package/src/components/InlinePortableTextEditor.tsx +12 -2
- package/src/components/JsonLdScript.astro +9 -0
- package/src/components/LiveSearch.astro +40 -4
- package/src/components/index.ts +4 -0
- package/src/components/live-search-routing.ts +30 -0
- package/src/components/portable-text-text-align.ts +15 -0
- package/src/ui.ts +2 -0
- package/dist/entity-aliases-4y93Yjuc.mjs +0 -51
- package/dist/import-4YBXbDkI.mjs +0 -684
- package/dist/index-CZiWCQDp.d.mts +0 -227
- package/dist/review-requests-Qum4713s.mjs +0 -79
- package/dist/runner-DzIpHGND.mjs +0 -2836
- package/dist/schema-Bsi-VpYv.mjs +0 -8
- package/dist/taxonomies-CZ-_DitR.mjs +0 -327
- package/dist/types-CuJOqHfM.d.mts +0 -758
- package/dist/types-DSPGWjxO.d.mts +0 -1247
- package/dist/types-nP9vGUFq.d.mts +0 -56
- package/dist/version-C4gfn0PJ.mjs +0 -6
- /package/dist/{adapters-OQCImOL7.d.mts → adapters-BiRymx02.d.mts} +0 -0
- /package/dist/{api-tokens-CYUoFGo7.mjs → api-tokens-Ypaly90d.mjs} +0 -0
- /package/dist/{challenge-store-DFxX0_15.mjs → challenge-store-D5pSY2S1.mjs} +0 -0
- /package/dist/{components--pg6zBvu.mjs → components-DImzlLhb.mjs} +0 -0
- /package/dist/{context-types-r8oFvyOq.mjs → context-types-eBuMDAg-.mjs} +0 -0
- /package/dist/{default-B6iaLvP7.mjs → default-D4Vygcy_.mjs} +0 -0
- /package/dist/{email-console-BOVqIYpB.mjs → email-console-Bp0r68iF.mjs} +0 -0
- /package/dist/{escape-BDgouFFY.mjs → escape-DN4Qmjsl.mjs} +0 -0
- /package/dist/{hash-BPmX6P8I.mjs → hash-mxxx2oPW.mjs} +0 -0
- /package/dist/{mime-CbKsKDCB.mjs → mime-C0vOHFm7.mjs} +0 -0
- /package/dist/{mode-CZqCF9dZ.mjs → mode-C8yZnIlR.mjs} +0 -0
- /package/dist/{oauth-state-store-qncPB_IU.mjs → oauth-state-store-CndT35iw.mjs} +0 -0
- /package/dist/{oauth-user-lookup-BFjWF8wK.mjs → oauth-user-lookup-CMehAaKs.mjs} +0 -0
- /package/dist/{options-LsPjZlqD.mjs → options-DQPTH5n0.mjs} +0 -0
- /package/dist/{passkey-config-DzHQK90v.mjs → passkey-config-NYukYGed.mjs} +0 -0
- /package/dist/{patterns-DKAX6oqN.mjs → patterns-CoqlXUvk.mjs} +0 -0
- /package/dist/{provider-loader-DzUxejk7.mjs → provider-loader-BtfrrzfD.mjs} +0 -0
- /package/dist/{public-url-B_m9IwdV.mjs → public-url-Cp6hyjVR.mjs} +0 -0
- /package/dist/{redirect-BjIBtDWY.mjs → redirect-DrbEmU9a.mjs} +0 -0
- /package/dist/{request-cache-ho99schz.mjs → request-cache-CBFjCwSt.mjs} +0 -0
- /package/dist/{resolve-DTuDyYKs.mjs → resolve-DE71WcL9.mjs} +0 -0
- /package/dist/{setup-nonce-pyGfc9hV.mjs → setup-nonce-BtkKnvxQ.mjs} +0 -0
- /package/dist/{sidecar-client-mJxwayYN.mjs → sidecar-client-Ctzfyyp-.mjs} +0 -0
- /package/dist/{slugify-BqebcqBg.mjs → slugify-KSsVD_D3.mjs} +0 -0
- /package/dist/{ssrf-DiKqWd3N.mjs → ssrf-FJqwQzj4.mjs} +0 -0
- /package/dist/{tokens-SLmgowfd.mjs → tokens-BDQU29Vd.mjs} +0 -0
- /package/dist/{transaction-CFLhEOuH.mjs → transaction-0LEAAy8R.mjs} +0 -0
- /package/dist/{transport-BnsNxh2l.d.mts → transport-D9pKAzFP.d.mts} +0 -0
- /package/dist/{trusted-proxy-BgIIcbsN.mjs → trusted-proxy-Dm7Mxvt6.mjs} +0 -0
- /package/dist/{types-CJ8DkL0q.mjs → types-B7TDDFMG.mjs} +0 -0
- /package/dist/{types-Dryvv7LH.d.mts → types-g0zMtraY.d.mts} +0 -0
- /package/dist/{types-Cg276-3z.mjs → types-mVVgRPaU.mjs} +0 -0
- /package/dist/{types-DZpT-PnG.d.mts → types-wFu80FrO.d.mts} +0 -0
- /package/dist/{url-w7Mp5qAD.mjs → url-EMAguGVk.mjs} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { a as __exportAll } from "./runner-
|
|
1
|
+
import { a as __exportAll } from "./runner-BgmttQmD.mjs";
|
|
2
|
+
import { d as invalidateTaxonomyObjectCache } from "./object-cache-D51qOseS.mjs";
|
|
2
3
|
import { ulid } from "ulidx";
|
|
3
4
|
|
|
4
5
|
//#region src/database/repositories/taxonomy.ts
|
|
@@ -25,7 +26,8 @@ var TaxonomyRepository = class {
|
|
|
25
26
|
*/
|
|
26
27
|
async create(input) {
|
|
27
28
|
const id = ulid();
|
|
28
|
-
const
|
|
29
|
+
const parentInput = input.parentId === void 0 || input.parentId === "" ? null : input.parentId;
|
|
30
|
+
const parentId = parentInput ? await this.resolveParentRef(parentInput) : null;
|
|
29
31
|
let translationGroup = id;
|
|
30
32
|
if (input.translationOf) {
|
|
31
33
|
const source = await this.findById(input.translationOf);
|
|
@@ -41,6 +43,7 @@ var TaxonomyRepository = class {
|
|
|
41
43
|
...input.locale !== void 0 ? { locale: input.locale } : {},
|
|
42
44
|
translation_group: translationGroup
|
|
43
45
|
}).execute();
|
|
46
|
+
invalidateTaxonomyObjectCache();
|
|
44
47
|
const taxonomy = await this.findById(id);
|
|
45
48
|
if (!taxonomy) throw new Error("Failed to create taxonomy");
|
|
46
49
|
return taxonomy;
|
|
@@ -74,8 +77,18 @@ var TaxonomyRepository = class {
|
|
|
74
77
|
else query = query.where("parent_id", "=", options.parentId);
|
|
75
78
|
return (await query.execute()).map((row) => this.rowToTaxonomy(row));
|
|
76
79
|
}
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Children of a term. Accepts a term id OR a translation_group and resolves
|
|
82
|
+
* to the group, since `parent_id` stores the parent's translation_group.
|
|
83
|
+
* Pass `locale` to scope to one locale's tree; omit it to find children in
|
|
84
|
+
* every locale, which is used to block deletes that would orphan a subtree.
|
|
85
|
+
*/
|
|
86
|
+
async findChildren(parentIdOrGroup, locale) {
|
|
87
|
+
const group = await this.resolveTranslationGroup(parentIdOrGroup);
|
|
88
|
+
if (!group) return [];
|
|
89
|
+
let query = this.db.selectFrom("taxonomies").selectAll().where("parent_id", "=", group).orderBy("label", "asc").orderBy("id", "asc");
|
|
90
|
+
if (locale !== void 0) query = query.where("locale", "=", locale);
|
|
91
|
+
return (await query.execute()).map((row) => this.rowToTaxonomy(row));
|
|
79
92
|
}
|
|
80
93
|
/**
|
|
81
94
|
* Every translation sibling of a term (including itself), identified by
|
|
@@ -89,9 +102,12 @@ var TaxonomyRepository = class {
|
|
|
89
102
|
const updates = {};
|
|
90
103
|
if (input.slug !== void 0) updates.slug = input.slug;
|
|
91
104
|
if (input.label !== void 0) updates.label = input.label;
|
|
92
|
-
if (input.parentId !== void 0) updates.parent_id = input.parentId === "" ? null : input.parentId;
|
|
105
|
+
if (input.parentId !== void 0) updates.parent_id = input.parentId === "" || input.parentId === null ? null : await this.resolveParentRef(input.parentId);
|
|
93
106
|
if (input.data !== void 0) updates.data = JSON.stringify(input.data);
|
|
94
|
-
if (Object.keys(updates).length > 0)
|
|
107
|
+
if (Object.keys(updates).length > 0) {
|
|
108
|
+
await this.db.updateTable("taxonomies").set(updates).where("id", "=", id).execute();
|
|
109
|
+
invalidateTaxonomyObjectCache();
|
|
110
|
+
}
|
|
95
111
|
return this.findById(id);
|
|
96
112
|
}
|
|
97
113
|
async delete(id) {
|
|
@@ -100,7 +116,9 @@ var TaxonomyRepository = class {
|
|
|
100
116
|
if (term.translationGroup) {
|
|
101
117
|
if ((await this.db.selectFrom("taxonomies").select("id").where("translation_group", "=", term.translationGroup).where("id", "!=", id).execute()).length === 0) await this.db.deleteFrom("content_taxonomies").where("taxonomy_id", "=", term.translationGroup).execute();
|
|
102
118
|
}
|
|
103
|
-
|
|
119
|
+
const deleted = ((await this.db.deleteFrom("taxonomies").where("id", "=", id).executeTakeFirst()).numDeletedRows ?? 0n) > 0n;
|
|
120
|
+
if (deleted) invalidateTaxonomyObjectCache();
|
|
121
|
+
return deleted;
|
|
104
122
|
}
|
|
105
123
|
async attachToEntry(collection, entryId, taxonomyId) {
|
|
106
124
|
const group = await this.resolveTranslationGroup(taxonomyId);
|
|
@@ -111,11 +129,13 @@ var TaxonomyRepository = class {
|
|
|
111
129
|
taxonomy_id: group
|
|
112
130
|
};
|
|
113
131
|
await this.db.insertInto("content_taxonomies").values(row).onConflict((oc) => oc.doNothing()).execute();
|
|
132
|
+
invalidateTaxonomyObjectCache();
|
|
114
133
|
}
|
|
115
134
|
async detachFromEntry(collection, entryId, taxonomyId) {
|
|
116
135
|
const group = await this.resolveTranslationGroup(taxonomyId);
|
|
117
136
|
if (!group) return;
|
|
118
137
|
await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).where("taxonomy_id", "=", group).execute();
|
|
138
|
+
invalidateTaxonomyObjectCache();
|
|
119
139
|
}
|
|
120
140
|
/**
|
|
121
141
|
* Taxonomy terms assigned to a content entry, resolved into a specific locale.
|
|
@@ -149,10 +169,13 @@ var TaxonomyRepository = class {
|
|
|
149
169
|
entry_id: entryId,
|
|
150
170
|
taxonomy_id
|
|
151
171
|
}))).onConflict((oc) => oc.doNothing()).execute();
|
|
172
|
+
if (toRemove.length > 0 || toAdd.length > 0) invalidateTaxonomyObjectCache();
|
|
152
173
|
}
|
|
153
174
|
async clearEntryTerms(collection, entryId) {
|
|
154
175
|
const result = await this.db.deleteFrom("content_taxonomies").where("collection", "=", collection).where("entry_id", "=", entryId).executeTakeFirst();
|
|
155
|
-
|
|
176
|
+
const removed = Number(result.numDeletedRows ?? 0);
|
|
177
|
+
if (removed > 0) invalidateTaxonomyObjectCache();
|
|
178
|
+
return removed;
|
|
156
179
|
}
|
|
157
180
|
/**
|
|
158
181
|
* Copy every term assignment from one content entry to another. Used when
|
|
@@ -167,6 +190,7 @@ var TaxonomyRepository = class {
|
|
|
167
190
|
entry_id: targetEntryId,
|
|
168
191
|
taxonomy_id: r.taxonomy_id
|
|
169
192
|
}))).onConflict((oc) => oc.doNothing()).execute();
|
|
193
|
+
invalidateTaxonomyObjectCache();
|
|
170
194
|
}
|
|
171
195
|
/**
|
|
172
196
|
* Count content entries that use any translation of this term. Accepts
|
|
@@ -178,6 +202,17 @@ var TaxonomyRepository = class {
|
|
|
178
202
|
const result = await this.db.selectFrom("content_taxonomies").select((eb) => eb.fn.count("entry_id").as("count")).where("taxonomy_id", "=", group).executeTakeFirst();
|
|
179
203
|
return Number(result?.count ?? 0);
|
|
180
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Resolve a parent reference to the value stored in `parent_id`: the parent's
|
|
207
|
+
* translation_group. A translation_group normally equals its anchor row's id,
|
|
208
|
+
* which satisfies the self-FK on parent_id. If the anchor row is missing,
|
|
209
|
+
* fall back to the input so we never write a dangling FK value.
|
|
210
|
+
*/
|
|
211
|
+
async resolveParentRef(idOrGroup) {
|
|
212
|
+
const group = await this.resolveTranslationGroup(idOrGroup);
|
|
213
|
+
if (!group) return idOrGroup;
|
|
214
|
+
return await this.db.selectFrom("taxonomies").select("id").where("id", "=", group).executeTakeFirst() ? group : idOrGroup;
|
|
215
|
+
}
|
|
181
216
|
async resolveTranslationGroup(idOrGroup) {
|
|
182
217
|
return (await this.db.selectFrom("taxonomies").select(["translation_group"]).where((eb) => eb.or([eb("id", "=", idOrGroup), eb("translation_group", "=", idOrGroup)])).executeTakeFirst())?.translation_group ?? null;
|
|
183
218
|
}
|
|
@@ -191,7 +226,7 @@ var TaxonomyRepository = class {
|
|
|
191
226
|
*/
|
|
192
227
|
async countEntriesForTerms(translationGroups) {
|
|
193
228
|
if (translationGroups.length === 0) return /* @__PURE__ */ new Map();
|
|
194
|
-
const { chunks, SQL_BATCH_SIZE } = await import("./chunks-
|
|
229
|
+
const { chunks, SQL_BATCH_SIZE } = await import("./chunks-ChGNDY8r.mjs").then((n) => n.r);
|
|
195
230
|
const counts = /* @__PURE__ */ new Map();
|
|
196
231
|
for (const chunk of chunks(translationGroups, SQL_BATCH_SIZE)) {
|
|
197
232
|
const rows = await this.db.selectFrom("content_taxonomies").select(["taxonomy_id", (eb) => eb.fn.count("entry_id").as("count")]).where("taxonomy_id", "in", chunk).groupBy("taxonomy_id").execute();
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
//#region src/client/transport.ts
|
|
2
|
+
/**
|
|
3
|
+
* Transport layer for the Dineway client.
|
|
4
|
+
*
|
|
5
|
+
* Implements a composable interceptor pipeline that modifies requests
|
|
6
|
+
* and responses. The client calls `transport.fetch(request)` — everything
|
|
7
|
+
* else (auth, CSRF, retry) is handled by interceptors.
|
|
8
|
+
*/
|
|
9
|
+
const COOKIE_NAME_VALUE_PATTERN = /^([^;]+)/;
|
|
10
|
+
function baseFetch(request) {
|
|
11
|
+
return globalThis.fetch(request);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates a fetch function that runs requests through an interceptor pipeline.
|
|
15
|
+
*/
|
|
16
|
+
function createTransport(options = {}) {
|
|
17
|
+
const interceptors = options.interceptors ?? [];
|
|
18
|
+
let chain = baseFetch;
|
|
19
|
+
for (let i = interceptors.length - 1; i >= 0; i--) {
|
|
20
|
+
const interceptor = interceptors[i];
|
|
21
|
+
const next = chain;
|
|
22
|
+
chain = (req) => interceptor(req, next);
|
|
23
|
+
}
|
|
24
|
+
return { fetch: chain };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Adds X-Dineway-Request: 1 and Origin headers to mutation requests
|
|
28
|
+
* (POST, PUT, DELETE). The custom header satisfies Dineway's CSRF check;
|
|
29
|
+
* the Origin header satisfies Astro's built-in origin verification which
|
|
30
|
+
* rejects server-side POST requests that lack a matching Origin.
|
|
31
|
+
*/
|
|
32
|
+
function csrfInterceptor() {
|
|
33
|
+
const MUTATION_METHODS = new Set([
|
|
34
|
+
"POST",
|
|
35
|
+
"PUT",
|
|
36
|
+
"DELETE",
|
|
37
|
+
"PATCH"
|
|
38
|
+
]);
|
|
39
|
+
return (request, next) => {
|
|
40
|
+
if (MUTATION_METHODS.has(request.method)) {
|
|
41
|
+
const headers = new Headers(request.headers);
|
|
42
|
+
headers.set("X-Dineway-Request", "1");
|
|
43
|
+
if (!headers.has("Origin")) {
|
|
44
|
+
const url = new URL(request.url);
|
|
45
|
+
headers.set("Origin", url.origin);
|
|
46
|
+
}
|
|
47
|
+
return next(new Request(request, { headers }));
|
|
48
|
+
}
|
|
49
|
+
return next(request);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Adds Authorization: Bearer header from a static token.
|
|
54
|
+
*/
|
|
55
|
+
function tokenInterceptor(token) {
|
|
56
|
+
return (request, next) => {
|
|
57
|
+
const headers = new Headers(request.headers);
|
|
58
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
59
|
+
return next(new Request(request, { headers }));
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Dev bypass interceptor. Calls the dev-bypass endpoint on first request
|
|
64
|
+
* to establish a session, then forwards the session cookie on subsequent
|
|
65
|
+
* requests.
|
|
66
|
+
*/
|
|
67
|
+
function devBypassInterceptor(baseUrl) {
|
|
68
|
+
let sessionCookie = null;
|
|
69
|
+
let initializing = null;
|
|
70
|
+
async function init() {
|
|
71
|
+
const bypassUrl = new URL("/_dineway/api/auth/dev-bypass", baseUrl);
|
|
72
|
+
const res = await globalThis.fetch(bypassUrl, { redirect: "manual" });
|
|
73
|
+
const setCookie = res.headers.get("set-cookie");
|
|
74
|
+
if (setCookie) {
|
|
75
|
+
const match = setCookie.match(COOKIE_NAME_VALUE_PATTERN);
|
|
76
|
+
if (match) sessionCookie = match[1];
|
|
77
|
+
}
|
|
78
|
+
if (res.body) await res.text().catch(() => {});
|
|
79
|
+
}
|
|
80
|
+
return async (request, next) => {
|
|
81
|
+
if (!sessionCookie) {
|
|
82
|
+
if (!initializing) initializing = init();
|
|
83
|
+
await initializing;
|
|
84
|
+
}
|
|
85
|
+
if (sessionCookie) {
|
|
86
|
+
const headers = new Headers(request.headers);
|
|
87
|
+
const existing = headers.get("cookie");
|
|
88
|
+
headers.set("cookie", existing ? `${existing}; ${sessionCookie}` : sessionCookie);
|
|
89
|
+
return next(new Request(request, { headers }));
|
|
90
|
+
}
|
|
91
|
+
return next(request);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Auto-refreshes expired OAuth tokens on 401 responses.
|
|
96
|
+
* Requires a refresh token and the token endpoint URL.
|
|
97
|
+
*/
|
|
98
|
+
function refreshInterceptor(options) {
|
|
99
|
+
let refreshing = null;
|
|
100
|
+
async function refresh() {
|
|
101
|
+
const res = await globalThis.fetch(options.tokenEndpoint, {
|
|
102
|
+
method: "POST",
|
|
103
|
+
headers: { "Content-Type": "application/json" },
|
|
104
|
+
body: JSON.stringify({
|
|
105
|
+
grant_type: "refresh_token",
|
|
106
|
+
refresh_token: options.refreshToken
|
|
107
|
+
})
|
|
108
|
+
});
|
|
109
|
+
if (!res.ok) return null;
|
|
110
|
+
const json = await res.json();
|
|
111
|
+
const tokenData = json.data && typeof json.data === "object" && "access_token" in json.data ? json.data : json;
|
|
112
|
+
const expiresAt = tokenData.expires_in ? new Date(Date.now() + tokenData.expires_in * 1e3).toISOString() : new Date(Date.now() + 36e5).toISOString();
|
|
113
|
+
if (options.onTokenRefreshed) options.onTokenRefreshed(tokenData.access_token, tokenData.refresh_token ?? options.refreshToken, expiresAt);
|
|
114
|
+
return tokenData.access_token;
|
|
115
|
+
}
|
|
116
|
+
return async (request, next) => {
|
|
117
|
+
const response = await next(request);
|
|
118
|
+
if (response.status === 401) {
|
|
119
|
+
if (!refreshing) refreshing = refresh().finally(() => {
|
|
120
|
+
refreshing = null;
|
|
121
|
+
});
|
|
122
|
+
const newToken = await refreshing;
|
|
123
|
+
if (newToken) {
|
|
124
|
+
const headers = new Headers(request.headers);
|
|
125
|
+
headers.set("Authorization", `Bearer ${newToken}`);
|
|
126
|
+
return next(new Request(request, { headers }));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return response;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
export { tokenInterceptor as a, refreshInterceptor as i, csrfInterceptor as n, devBypassInterceptor as r, createTransport as t };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//#region src/plugins/types.ts
|
|
2
|
+
function capabilitiesToDeclaredAccess(capabilities, allowedHosts) {
|
|
3
|
+
const caps = new Set(capabilities);
|
|
4
|
+
const out = {};
|
|
5
|
+
if (caps.has("content:read") || caps.has("content:write")) {
|
|
6
|
+
out.content = { read: {} };
|
|
7
|
+
if (caps.has("content:write")) out.content.write = {};
|
|
8
|
+
}
|
|
9
|
+
if (caps.has("media:read") || caps.has("media:write")) {
|
|
10
|
+
out.media = { read: {} };
|
|
11
|
+
if (caps.has("media:write")) out.media.write = {};
|
|
12
|
+
}
|
|
13
|
+
if (caps.has("network:request:unrestricted")) {
|
|
14
|
+
out.network = { request: {} };
|
|
15
|
+
if (caps.has("network:request:development-loopback")) out.network.request.developmentLoopback = true;
|
|
16
|
+
} else if (caps.has("network:request")) out.network = { request: { allowedHosts: [...allowedHosts] } };
|
|
17
|
+
if (caps.has("email:send")) (out.email ??= {}).send = {};
|
|
18
|
+
if (caps.has("hooks.email-events:register")) (out.email ??= {}).events = {};
|
|
19
|
+
if (caps.has("hooks.email-transport:register")) (out.email ??= {}).transport = {};
|
|
20
|
+
if (caps.has("hooks.page-fragments:register")) out.page = { fragments: {} };
|
|
21
|
+
if (caps.has("users:read")) out.users = { read: {} };
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
function declaredAccessToCapabilities(declaredAccess) {
|
|
25
|
+
const caps = /* @__PURE__ */ new Set();
|
|
26
|
+
let allowedHosts = [];
|
|
27
|
+
if (declaredAccess.content?.read) caps.add("content:read");
|
|
28
|
+
if (declaredAccess.content?.write) {
|
|
29
|
+
caps.add("content:write");
|
|
30
|
+
caps.add("content:read");
|
|
31
|
+
}
|
|
32
|
+
if (declaredAccess.media?.read) caps.add("media:read");
|
|
33
|
+
if (declaredAccess.media?.write) {
|
|
34
|
+
caps.add("media:write");
|
|
35
|
+
caps.add("media:read");
|
|
36
|
+
}
|
|
37
|
+
if (declaredAccess.network?.request) {
|
|
38
|
+
const hosts = declaredAccess.network.request.allowedHosts;
|
|
39
|
+
if (hosts === void 0) {
|
|
40
|
+
caps.add("network:request:unrestricted");
|
|
41
|
+
caps.add("network:request");
|
|
42
|
+
} else {
|
|
43
|
+
caps.add("network:request");
|
|
44
|
+
allowedHosts = [...hosts];
|
|
45
|
+
}
|
|
46
|
+
if (declaredAccess.network.request.developmentLoopback) caps.add("network:request:development-loopback");
|
|
47
|
+
}
|
|
48
|
+
if (declaredAccess.email?.send) caps.add("email:send");
|
|
49
|
+
if (declaredAccess.email?.events) caps.add("hooks.email-events:register");
|
|
50
|
+
if (declaredAccess.email?.transport) caps.add("hooks.email-transport:register");
|
|
51
|
+
if (declaredAccess.page?.fragments) caps.add("hooks.page-fragments:register");
|
|
52
|
+
if (declaredAccess.users?.read) caps.add("users:read");
|
|
53
|
+
return {
|
|
54
|
+
capabilities: [...caps],
|
|
55
|
+
allowedHosts
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a value is a StandardPluginDefinition (has hooks/routes but no id/version).
|
|
60
|
+
*/
|
|
61
|
+
function isStandardPluginDefinition(value) {
|
|
62
|
+
if (typeof value !== "object" || value === null) return false;
|
|
63
|
+
const hasPluginShape = "hooks" in value || "routes" in value;
|
|
64
|
+
const hasNativeShape = "id" in value && "version" in value;
|
|
65
|
+
return hasPluginShape && !hasNativeShape;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
//#endregion
|
|
69
|
+
export { declaredAccessToCapabilities as n, isStandardPluginDefinition as r, capabilitiesToDeclaredAccess as t };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
//#region src/object-cache/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Object cache types
|
|
4
|
+
*
|
|
5
|
+
* The object cache is an optional, distributed read-through cache that sits
|
|
6
|
+
* *beneath* the per-request cache (`requestCached`) and *above* the database.
|
|
7
|
+
* Query results (content entries, settings, menus, taxonomies) are stored in a
|
|
8
|
+
* fast key/value store (an in-process memory store on Node, or another
|
|
9
|
+
* compatible backend supplied by an extension package) so repeat reads across
|
|
10
|
+
* requests skip the database entirely.
|
|
11
|
+
*
|
|
12
|
+
* Backends only ever deal in strings — serialization (including `Date`
|
|
13
|
+
* preservation) is handled by the core read-through layer in `./codec.ts`, so
|
|
14
|
+
* every backend behaves identically.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* A pluggable object-cache backend.
|
|
18
|
+
*
|
|
19
|
+
* Implementations must be safe to call concurrently and should never throw on
|
|
20
|
+
* cache misses — `get` returns `null` for a miss. A backend that throws (e.g.
|
|
21
|
+
* a transient backend error) degrades gracefully: the read-through layer
|
|
22
|
+
* treats a thrown `get` as a miss and a thrown `set` as a no-op, so the
|
|
23
|
+
* database remains the source of truth.
|
|
24
|
+
*/
|
|
25
|
+
interface ObjectCacheBackend {
|
|
26
|
+
/** Return the stored string for `key`, or `null` on a miss. */
|
|
27
|
+
get(key: string): Promise<string | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Store `value` under `key`.
|
|
30
|
+
*
|
|
31
|
+
* @param ttlSeconds Optional time-to-live in seconds. Backends that don't
|
|
32
|
+
* support TTLs may ignore it, but shared backends should honor it so
|
|
33
|
+
* orphaned, epoch-busted keys are eventually reclaimed.
|
|
34
|
+
*/
|
|
35
|
+
set(key: string, value: string, ttlSeconds?: number): Promise<void>;
|
|
36
|
+
/** Remove `key`. Idempotent — deleting a missing key is not an error. */
|
|
37
|
+
delete(key: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Serializable descriptor for an object-cache backend.
|
|
41
|
+
*
|
|
42
|
+
* Mirrors {@link import("../storage/types.js").StorageDescriptor}: `entrypoint`
|
|
43
|
+
* is a module specifier resolved at build time that exports a
|
|
44
|
+
* {@link CreateObjectCacheBackendFn} named `createObjectCache`; `config` is the
|
|
45
|
+
* plain, serializable runtime config passed to it.
|
|
46
|
+
*/
|
|
47
|
+
interface ObjectCacheDescriptor {
|
|
48
|
+
/** Module path exporting a `createObjectCache` function. */
|
|
49
|
+
entrypoint: string;
|
|
50
|
+
/** Serializable config passed to `createObjectCache` at runtime. */
|
|
51
|
+
config: ObjectCacheRuntimeConfig;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Runtime config shared by every backend, plus backend-specific keys.
|
|
55
|
+
*
|
|
56
|
+
* The read-through layer reads `defaultTtl`, `revalidate`, and `keyPrefix`;
|
|
57
|
+
* individual backends read their own keys (e.g. the memory backend reads
|
|
58
|
+
* `maxEntries`).
|
|
59
|
+
*/
|
|
60
|
+
interface ObjectCacheRuntimeConfig {
|
|
61
|
+
/**
|
|
62
|
+
* Default time-to-live for cached entries, in seconds.
|
|
63
|
+
*
|
|
64
|
+
* Invalidation works by epoch comparison, not key deletion: a stale value
|
|
65
|
+
* is detected on read (its stored epoch no longer matches) and overwritten
|
|
66
|
+
* in place under the same key. The TTL is just a backstop that reclaims
|
|
67
|
+
* keys that are never read again.
|
|
68
|
+
*
|
|
69
|
+
* @default 3600 (1 hour)
|
|
70
|
+
*/
|
|
71
|
+
defaultTtl?: number;
|
|
72
|
+
/**
|
|
73
|
+
* How long (milliseconds) an isolate may reuse a cached namespace epoch
|
|
74
|
+
* before re-reading it from the backend.
|
|
75
|
+
*
|
|
76
|
+
* After a write bumps a namespace's epoch, an isolate keeps serving the
|
|
77
|
+
* previous epoch's keys until its cached epoch expires after this window.
|
|
78
|
+
* Shared backends may add their own propagation delay. Only anonymous
|
|
79
|
+
* visitors are affected — preview and edit requests bypass the cache.
|
|
80
|
+
*
|
|
81
|
+
* Set to `0` to re-read the epoch on every query (strongest freshness, more
|
|
82
|
+
* backend reads).
|
|
83
|
+
*
|
|
84
|
+
* @default 1000
|
|
85
|
+
*/
|
|
86
|
+
revalidate?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Prefix applied to every cache key. Lets multiple Dineway sites share one
|
|
89
|
+
* backend without colliding.
|
|
90
|
+
*
|
|
91
|
+
* @default "dineway"
|
|
92
|
+
*/
|
|
93
|
+
keyPrefix?: string;
|
|
94
|
+
/**
|
|
95
|
+
* Maximum time (milliseconds) to wait for a single backend read before
|
|
96
|
+
* treating it as a cache miss and falling back to the database.
|
|
97
|
+
*
|
|
98
|
+
* Guards against a backend operation that stalls without resolving or
|
|
99
|
+
* rejecting, which would otherwise hang the request. A timed-out read
|
|
100
|
+
* degrades to a miss; the database remains the source of truth.
|
|
101
|
+
*
|
|
102
|
+
* Set to `0` to disable the timeout.
|
|
103
|
+
*
|
|
104
|
+
* @default 2000
|
|
105
|
+
*/
|
|
106
|
+
timeout?: number;
|
|
107
|
+
/** Backend-specific keys. */
|
|
108
|
+
[key: string]: unknown;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Factory signature exported as `createObjectCache` from a backend entrypoint.
|
|
112
|
+
*
|
|
113
|
+
* Each backend accesses its own resources directly; the bundled memory backend
|
|
114
|
+
* uses an in-process map.
|
|
115
|
+
*/
|
|
116
|
+
type CreateObjectCacheBackendFn = (config: ObjectCacheRuntimeConfig) => ObjectCacheBackend;
|
|
117
|
+
//#endregion
|
|
118
|
+
export { ObjectCacheRuntimeConfig as i, ObjectCacheBackend as n, ObjectCacheDescriptor as r, CreateObjectCacheBackendFn as t };
|
|
@@ -163,10 +163,11 @@ interface CreateFieldInput {
|
|
|
163
163
|
*/
|
|
164
164
|
interface UpdateFieldInput {
|
|
165
165
|
label?: string;
|
|
166
|
+
type?: FieldType;
|
|
166
167
|
required?: boolean;
|
|
167
168
|
unique?: boolean;
|
|
168
169
|
defaultValue?: unknown;
|
|
169
|
-
validation?: FieldValidation;
|
|
170
|
+
validation?: FieldValidation | null;
|
|
170
171
|
widget?: string;
|
|
171
172
|
options?: FieldWidgetOptions;
|
|
172
173
|
sortOrder?: number;
|
|
@@ -180,6 +181,8 @@ interface UpdateFieldInput {
|
|
|
180
181
|
*/
|
|
181
182
|
interface CollectionWithFields extends Collection {
|
|
182
183
|
fields: Field[];
|
|
184
|
+
/** Stable hash of the complete native collection and field contract. */
|
|
185
|
+
schemaFingerprint: string;
|
|
183
186
|
}
|
|
184
187
|
/**
|
|
185
188
|
* Reserved field slugs that cannot be used
|
|
@@ -289,6 +289,24 @@ interface ImportResult {
|
|
|
289
289
|
error: string;
|
|
290
290
|
}>;
|
|
291
291
|
byCollection: Record<string, number>;
|
|
292
|
+
/** Number of taxonomy term assignments written during plugin import */
|
|
293
|
+
taxonomyAssignments?: number;
|
|
294
|
+
/** Source taxonomies skipped because no matching Dineway taxonomy def exists */
|
|
295
|
+
missingTaxonomies?: string[];
|
|
296
|
+
/** Custom taxonomy defs auto-created during plugin import */
|
|
297
|
+
taxonomiesCreated?: string[];
|
|
298
|
+
/** Navigation menu import summary */
|
|
299
|
+
menus?: {
|
|
300
|
+
created: number;
|
|
301
|
+
items: number;
|
|
302
|
+
};
|
|
303
|
+
/** Comment import summary */
|
|
304
|
+
comments?: {
|
|
305
|
+
imported: number;
|
|
306
|
+
skipped: number;
|
|
307
|
+
};
|
|
308
|
+
/** Site settings applied from the source */
|
|
309
|
+
siteSettings?: string[];
|
|
292
310
|
}
|
|
293
311
|
/**
|
|
294
312
|
* An import source provides content from an external system.
|