dineway 0.1.44 → 0.1.46
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-events-CpcTzKpF.mjs → activity-events-CNk3clTT.mjs} +1 -1
- package/dist/{allowed-origins-3RuuoFjC.mjs → allowed-origins-DhipQNLb.mjs} +1 -1
- package/dist/api/route-utils.d.mts +9 -10
- package/dist/api/route-utils.mjs +13 -13
- package/dist/api/schemas/index.d.mts +2 -2
- package/dist/api/schemas/index.mjs +4 -4
- package/dist/{api-x5yKhnAw.mjs → api-Bmfii2mH.mjs} +101 -56
- package/dist/{api-tokens-BFg7tiOQ.mjs → api-tokens-DtvdtIkm.mjs} +1 -1
- package/dist/{apply-TIoQ00aH.mjs → apply-BpRBCqUt.mjs} +76 -31
- package/dist/astro/index.d.mts +10 -11
- package/dist/astro/index.mjs +23 -3
- package/dist/astro/middleware/auth.d.mts +9 -10
- package/dist/astro/middleware/auth.mjs +5 -5
- package/dist/astro/middleware/redirect.mjs +13 -7
- package/dist/astro/middleware/request-context.mjs +3 -3
- 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 +120 -82
- package/dist/astro/routes/api/admin/allowed-domains/_domain_.mjs +5 -5
- package/dist/astro/routes/api/admin/allowed-domains/index.mjs +5 -5
- 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 +17 -17
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.d.mts +7 -0
- package/dist/astro/routes/api/admin/byline-fields/_slug_/usage.mjs +17 -0
- package/dist/astro/routes/api/admin/byline-fields/_slug_.d.mts +9 -0
- package/dist/astro/routes/api/admin/byline-fields/_slug_.mjs +38 -0
- package/dist/astro/routes/api/admin/byline-fields/index.d.mts +8 -0
- package/dist/astro/routes/api/admin/byline-fields/index.mjs +31 -0
- package/dist/astro/routes/api/admin/byline-fields/reorder.d.mts +7 -0
- package/dist/astro/routes/api/admin/byline-fields/reorder.mjs +24 -0
- package/dist/astro/routes/api/admin/bylines/_id_/index.mjs +27 -27
- package/dist/astro/routes/api/admin/bylines/_id_/translations.d.mts +8 -0
- package/dist/astro/routes/api/admin/bylines/_id_/translations.mjs +57 -0
- package/dist/astro/routes/api/admin/bylines/index.mjs +30 -26
- package/dist/astro/routes/api/admin/comments/_id_/status.mjs +11 -11
- package/dist/astro/routes/api/admin/comments/_id_.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/bulk.mjs +9 -9
- package/dist/astro/routes/api/admin/comments/counts.mjs +5 -5
- package/dist/astro/routes/api/admin/comments/index.mjs +9 -9
- package/dist/astro/routes/api/admin/context/_id_/history.mjs +23 -23
- package/dist/astro/routes/api/admin/context/_id_/index.mjs +23 -23
- package/dist/astro/routes/api/admin/context/_id_/review.mjs +27 -27
- package/dist/astro/routes/api/admin/context/_id_/supersede.mjs +27 -27
- package/dist/astro/routes/api/admin/context/diff.mjs +26 -26
- package/dist/astro/routes/api/admin/context/index.mjs +27 -27
- package/dist/astro/routes/api/admin/context/stale.mjs +26 -26
- package/dist/astro/routes/api/admin/hitl-requests/_id_/index.mjs +23 -23
- package/dist/astro/routes/api/admin/hitl-requests/_id_/resolve.mjs +26 -26
- package/dist/astro/routes/api/admin/hitl-requests/index.mjs +26 -26
- package/dist/astro/routes/api/admin/hooks/exclusive/_hookName_.mjs +24 -24
- package/dist/astro/routes/api/admin/hooks/exclusive/index.mjs +2 -2
- 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 +48 -44
- package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +48 -44
- package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +42 -38
- package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/index.mjs +42 -38
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/icon.mjs +2 -2
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +42 -38
- package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +47 -43
- package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +42 -38
- package/dist/astro/routes/api/admin/plugins/updates.mjs +42 -38
- package/dist/astro/routes/api/admin/review-requests/_id_/index.mjs +5 -5
- package/dist/astro/routes/api/admin/review-requests/_id_/resolve.mjs +26 -26
- package/dist/astro/routes/api/admin/review-requests/index.mjs +9 -9
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +42 -38
- package/dist/astro/routes/api/admin/themes/marketplace/_id_/thumbnail.mjs +2 -2
- package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +42 -38
- 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 +5 -5
- package/dist/astro/routes/api/admin/users/_id_/send-recovery.mjs +2 -2
- package/dist/astro/routes/api/admin/users/index.mjs +5 -5
- package/dist/astro/routes/api/auth/dev-bypass.mjs +5 -5
- package/dist/astro/routes/api/auth/invite/accept.mjs +1 -1
- package/dist/astro/routes/api/auth/invite/complete.mjs +9 -9
- package/dist/astro/routes/api/auth/invite/index.mjs +6 -6
- package/dist/astro/routes/api/auth/invite/register-options.mjs +8 -8
- package/dist/astro/routes/api/auth/logout.mjs +2 -2
- package/dist/astro/routes/api/auth/magic-link/send.mjs +8 -8
- package/dist/astro/routes/api/auth/magic-link/verify.mjs +2 -2
- package/dist/astro/routes/api/auth/me.mjs +20 -11
- package/dist/astro/routes/api/auth/mode.mjs +1 -1
- package/dist/astro/routes/api/auth/oauth/_provider_/callback.mjs +2 -2
- package/dist/astro/routes/api/auth/oauth/_provider_.mjs +2 -2
- package/dist/astro/routes/api/auth/passkey/_id_.mjs +5 -5
- package/dist/astro/routes/api/auth/passkey/index.mjs +1 -1
- package/dist/astro/routes/api/auth/passkey/options.mjs +10 -10
- package/dist/astro/routes/api/auth/passkey/register/options.mjs +8 -8
- package/dist/astro/routes/api/auth/passkey/register/verify.mjs +9 -9
- package/dist/astro/routes/api/auth/passkey/verify.mjs +9 -9
- 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 +9 -9
- package/dist/astro/routes/api/auth/signup/request.mjs +8 -8
- package/dist/astro/routes/api/auth/signup/verify.mjs +1 -1
- package/dist/astro/routes/api/comments/_collection_/_contentId_/index.mjs +12 -12
- package/dist/astro/routes/api/content/_collection_/_id_/compare.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/discard-draft.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/duplicate.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/permanent.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/preview-url.mjs +11 -11
- package/dist/astro/routes/api/content/_collection_/_id_/publish.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/restore.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_/revisions.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/schedule.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/_id_/terms/_taxonomy_.mjs +20 -14
- package/dist/astro/routes/api/content/_collection_/_id_/translations.mjs +2 -2
- package/dist/astro/routes/api/content/_collection_/_id_/unpublish.mjs +5 -5
- package/dist/astro/routes/api/content/_collection_/_id_.mjs +12 -10
- package/dist/astro/routes/api/content/_collection_/index.mjs +9 -9
- package/dist/astro/routes/api/content/_collection_/trash.mjs +6 -6
- package/dist/astro/routes/api/dashboard.mjs +8 -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 +10 -10
- package/dist/astro/routes/api/import/wordpress/analyze.mjs +7 -7
- package/dist/astro/routes/api/import/wordpress/execute.mjs +29 -28
- package/dist/astro/routes/api/import/wordpress/media.mjs +10 -10
- package/dist/astro/routes/api/import/wordpress/prepare.mjs +31 -31
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.d.mts +5 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-url-helpers.mjs +16 -1
- package/dist/astro/routes/api/import/wordpress/rewrite-urls.mjs +30 -30
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/analyze.mjs +13 -13
- package/dist/astro/routes/api/import/wordpress-plugin/execute.d.mts +1 -1
- package/dist/astro/routes/api/import/wordpress-plugin/execute.mjs +31 -30
- package/dist/astro/routes/api/manifest.mjs +4 -4
- package/dist/astro/routes/api/mcp.mjs +75 -50
- package/dist/astro/routes/api/media/_id_/confirm.mjs +8 -8
- package/dist/astro/routes/api/media/_id_.mjs +6 -6
- 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 +10 -10
- package/dist/astro/routes/api/media.mjs +14 -13
- package/dist/astro/routes/api/menus/_name_/items/_id_.mjs +27 -27
- package/dist/astro/routes/api/menus/_name_/items.mjs +27 -27
- package/dist/astro/routes/api/menus/_name_/reorder.mjs +27 -27
- package/dist/astro/routes/api/menus/_name_/translations.mjs +27 -27
- package/dist/astro/routes/api/menus/_name_.mjs +27 -27
- package/dist/astro/routes/api/menus/index.mjs +27 -27
- 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 +10 -7
- package/dist/astro/routes/api/plugins/_pluginId_/_...path_.mjs +3 -3
- package/dist/astro/routes/api/redirects/404s/index.mjs +10 -10
- package/dist/astro/routes/api/redirects/404s/summary.mjs +10 -10
- package/dist/astro/routes/api/redirects/_id_.mjs +28 -28
- package/dist/astro/routes/api/redirects/index.mjs +28 -28
- 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 +43 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +43 -39
- package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +43 -39
- package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +43 -39
- package/dist/astro/routes/api/schema/collections/index.mjs +43 -39
- package/dist/astro/routes/api/schema/index.mjs +7 -7
- package/dist/astro/routes/api/schema/orphans/_slug_.mjs +42 -38
- package/dist/astro/routes/api/schema/orphans/index.mjs +42 -38
- package/dist/astro/routes/api/search/enable.mjs +11 -11
- package/dist/astro/routes/api/search/index.mjs +10 -10
- package/dist/astro/routes/api/search/rebuild.mjs +11 -11
- package/dist/astro/routes/api/search/stats.mjs +7 -7
- package/dist/astro/routes/api/search/suggest.mjs +10 -10
- package/dist/astro/routes/api/sections/_slug_.mjs +27 -27
- package/dist/astro/routes/api/sections/index.mjs +27 -27
- package/dist/astro/routes/api/settings/email.mjs +3 -3
- package/dist/astro/routes/api/settings.mjs +27 -27
- package/dist/astro/routes/api/setup/admin-verify.mjs +11 -11
- package/dist/astro/routes/api/setup/admin.mjs +9 -9
- package/dist/astro/routes/api/setup/dev-bypass.mjs +24 -23
- package/dist/astro/routes/api/setup/dev-reset.mjs +1 -1
- package/dist/astro/routes/api/setup/index.mjs +25 -24
- package/dist/astro/routes/api/setup/status.mjs +3 -3
- package/dist/astro/routes/api/snapshot.mjs +7 -6
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_/translations.mjs +30 -29
- package/dist/astro/routes/api/taxonomies/_name_/terms/_slug_.mjs +30 -29
- package/dist/astro/routes/api/taxonomies/_name_/terms/index.mjs +30 -29
- package/dist/astro/routes/api/taxonomies/index.mjs +30 -29
- package/dist/astro/routes/api/themes/preview.mjs +4 -4
- package/dist/astro/routes/api/typegen.mjs +4 -4
- package/dist/astro/routes/api/well-known/auth.mjs +2 -2
- 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 +26 -26
- package/dist/astro/routes/api/widget-areas/_name_/widgets/_id_.mjs +27 -27
- package/dist/astro/routes/api/widget-areas/_name_/widgets.mjs +27 -27
- package/dist/astro/routes/api/widget-areas/_name_.mjs +25 -25
- package/dist/astro/routes/api/widget-areas/index.mjs +27 -27
- package/dist/astro/routes/api/widget-components.mjs +2 -2
- package/dist/astro/routes/robots.txt.mjs +7 -7
- package/dist/astro/routes/sitemap-_collection_.xml.mjs +59 -15
- package/dist/astro/routes/sitemap.xml.mjs +8 -8
- package/dist/astro/session-driver.d.mts +1 -1
- package/dist/astro/session-driver.mjs +3 -3
- package/dist/astro/types.d.mts +16 -14
- package/dist/{audit-NgiRzqP9.mjs → audit-DuRbTm8L.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-1FHtkDP6.mjs → auth-control-guard-Dr14I98m.mjs} +1 -1
- package/dist/{authorize-BbIhZi3a.mjs → authorize-BLO0m7fW.mjs} +1 -1
- package/dist/{briefing-Jsxs587i.mjs → briefing-BFEWeJtR.mjs} +6 -6
- package/dist/{briefing-DD82WaEy.mjs → briefing-C4fJSVYW.mjs} +1 -1
- package/dist/byline-CXQcMsBu.mjs +628 -0
- package/dist/{bylines-DaXfz8wy.d.mts → byline-fields-CaF_xfpj.d.mts} +159 -28
- package/dist/{import-Br7aP9yh.mjs → byline-fields-D7TJ_oHF.mjs} +57 -3
- package/dist/byline-fields-Dc7L6Yry.mjs +113 -0
- package/dist/byline-registry-CL8BxPPp.mjs +287 -0
- package/dist/bylines-BgriNlW7.mjs +165 -0
- package/dist/bylines-D2vqm1aZ.mjs +163 -0
- package/dist/{cache-DQyZ-QaB.mjs → cache-GRK71jOU.mjs} +2 -2
- package/dist/{chunks-D8KL0nCY.mjs → chunks-DgEw12Bc.mjs} +1 -1
- package/dist/cli/index.mjs +958 -89
- package/dist/client/external-auth-headers.d.mts +1 -1
- package/dist/client/index.d.mts +2 -1
- package/dist/client/index.mjs +5 -2
- package/dist/{comment-BmJXz3lc.mjs → comment-ogMaF1gk.mjs} +1 -1
- package/dist/{comments-yTbeIYc2.mjs → comments-CTSOKrZq.mjs} +1 -1
- package/dist/{connection-BCNICDWN.mjs → connection-CiJWiWya.mjs} +44 -13
- package/dist/{content-DvpMad_N.mjs → content-BfyjOiMi.mjs} +24 -4
- package/dist/content-index-names-Bbu1FY1r.mjs +26 -0
- package/dist/{context-cudavuns.mjs → context-DRhmPCiE.mjs} +2 -2
- package/dist/{context-Ufrm1lOv.mjs → context-ZMHhwzkG.mjs} +8 -8
- package/dist/{context-route-helpers--PJWR-5R.mjs → context-route-helpers-YLWx2N1j.mjs} +1 -1
- package/dist/{dashboard-BC9bgPOH.mjs → dashboard-D0gWuzNp.mjs} +4 -4
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/libsql.mjs +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.mjs +1 -1
- package/dist/{device-flow-CTS91g4A.mjs → device-flow-BL5ZRlc1.mjs} +4 -4
- package/dist/{dialect-helpers-TkdbkFad.mjs → dialect-helpers-fk43GbDb.mjs} +13 -3
- package/dist/{fts-manager-DnfOsF4s.mjs → fts-manager-EHY2Kes9.mjs} +2 -2
- package/dist/{hitl-requests-Us2A4Vj5.mjs → hitl-requests-B4Hkt0TO.mjs} +2 -2
- package/dist/{hitl-route-helpers-DcPySbZ3.mjs → hitl-route-helpers-CHjdfQ0s.mjs} +4 -4
- package/dist/{import-DSXK3aQF.mjs → import-CvHY6sf5.mjs} +3 -3
- package/dist/{index-BwOO3vu2.d.mts → index-DJVaYiUV.d.mts} +2 -2
- package/dist/index.d.mts +16 -17
- package/dist/index.mjs +69 -65
- package/dist/{jsonld-CLbYsYYH.d.mts → jsonld-AcPnCEGD.d.mts} +2 -2
- package/dist/{load-BCCcmoW9.mjs → load-BdbvtoDb.mjs} +1 -1
- package/dist/{loader-p2imNN98.mjs → loader-Y0QvC_QO.mjs} +167 -61
- package/dist/media/index.d.mts +1 -2
- package/dist/media/index.mjs +2 -2
- package/dist/media/local-runtime.d.mts +11 -12
- package/dist/media/local-runtime.mjs +2 -2
- package/dist/{media-Cg4zc9fq.mjs → media-DhBwiCYR.mjs} +6 -1
- package/dist/{media-allowlist-D8gsm8_t.mjs → media-allowlist-BsXkT9RK.mjs} +1 -1
- package/dist/{menus-DOaL6NaF.mjs → menus-BzGQpw9d.mjs} +2 -2
- package/dist/{menus-DzG3-9tQ.mjs → menus-fqqzXyHd.mjs} +5 -5
- package/dist/{oauth-authorization-DyOFXQWq.mjs → oauth-authorization-Dk3_LOfj.mjs} +4 -4
- package/dist/{oauth-clients-BMs_bmoz.mjs → oauth-clients-CzeMGyUU.mjs} +2 -2
- package/dist/page/index.d.mts +2 -2
- package/dist/page/index.mjs +1 -1
- package/dist/{parse-D7Tu6ku4.mjs → parse-CneSgl7-.mjs} +1 -1
- package/dist/{types-cn-fvYQ1.d.mts → placeholder-CXfoCtCd.d.mts} +38 -1
- package/dist/plugin-utils.d.mts +22 -10
- package/dist/plugin-utils.mjs +8 -10
- package/dist/plugins/adapt-sandbox-entry.d.mts +9 -10
- package/dist/plugins/adapt-sandbox-entry.mjs +1 -1
- package/dist/{plugins-DCDVDF4B.mjs → plugins-BQ5Joz6v.mjs} +36 -6
- package/dist/{preview-BhgxNRWI.mjs → preview-D5rvDhRt.mjs} +7 -7
- package/dist/{provider-loader-B19YyyBp.d.mts → provider-loader-B5PMjpN7.d.mts} +1 -1
- package/dist/{query-BnRpB09I.mjs → query-BJuUydtD.mjs} +3 -3
- package/dist/{query-DHvNhBhi.mjs → query-CSx0EdSW.mjs} +30 -18
- package/dist/{rate-limit-BWP_kKiZ.mjs → rate-limit-i0G3IAOX.mjs} +2 -2
- package/dist/{redirect-BaVvo2te.mjs → redirect-BqFMj67n.mjs} +20 -6
- package/dist/{redirects-Ba-lJA5j.mjs → redirects-CJwHl_YG.mjs} +3 -3
- package/dist/{redirects-x5ol_Qj9.mjs → redirects-q_cToaHv.mjs} +29 -8
- package/dist/{registry-i__XP2WV.mjs → registry-Cq3QRBW2.mjs} +14 -5
- package/dist/{request-cache-BpwuE2ix.mjs → request-cache-w5cj5itT.mjs} +9 -1
- package/dist/{request-meta-DUGfAeXy.mjs → request-meta-DAb6xaP9.mjs} +1 -1
- package/dist/resolve-DTuDyYKs.mjs +100 -0
- package/dist/{review-requests-DuIxM4YM.mjs → review-requests-GYqjl2jO.mjs} +1 -1
- package/dist/{review-requests-CTUU_RJm.mjs → review-requests-tPw8_pAO.mjs} +1 -1
- package/dist/{runner-FhUNNaqA.d.mts → runner-Cnz4dl0f.d.mts} +1 -1
- package/dist/{runner-DF2DgD_B.mjs → runner-DTfG5v0G.mjs} +574 -196
- package/dist/{runtime-C4ZgKk6r.d.mts → runtime-Cd-kjPfN.d.mts} +1156 -274
- package/dist/runtime.d.mts +10 -11
- package/dist/runtime.mjs +4 -4
- package/dist/schema-DmHMWnSA.mjs +8 -0
- package/dist/{search-Cl9preJT.mjs → search-BAiFLz81.mjs} +3 -3
- package/dist/{sections-Zx-2q9IH.mjs → sections-DsuIrFDC.mjs} +2 -2
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +18 -17
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.mjs +1 -0
- package/dist/{seo-CJBiMDkj.mjs → seo-5lJOtB5J.mjs} +4 -2
- package/dist/{seo-BPb_reaG.mjs → seo-uMFBaR8G.mjs} +1 -1
- package/dist/{service-wPGgmbUa.mjs → service-CifrxCru.mjs} +2 -2
- package/dist/{settings-nr15a8uv.mjs → settings-BYGdocdj.mjs} +2 -2
- package/dist/{settings-DORe02PC.mjs → settings-DNRQuX3d.mjs} +3 -3
- package/dist/{site-activity-KFZprBZM.mjs → site-activity-6x1JccoR.mjs} +1 -1
- package/dist/{site-context-DuBQk6Mp.mjs → site-context-sN12ehZF.mjs} +13 -13
- 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-DGaw_-aU.mjs → taxonomies-CQFmkP5u.mjs} +3 -3
- package/dist/{taxonomies-BVBKoXRf.mjs → taxonomies-faQVeMgj.mjs} +7 -32
- package/dist/{taxonomy-BvXRL85P.mjs → taxonomy-BnH-6VsX.mjs} +2 -2
- package/dist/{types-DvwHUku7.d.mts → types-B7_vSiPD.d.mts} +16 -0
- package/dist/{types-D1DjBFA9.mjs → types-Ck7-WoUD.mjs} +1 -1
- package/dist/{types-t7_nCCA9.d.mts → types-DEAQG87T.d.mts} +2 -56
- package/dist/{types-C-CMfzSl.d.mts → types-DYKtk8f1.d.mts} +31 -0
- package/dist/{types-C3Em8xpG.mjs → types-DbZhHtqS.mjs} +23 -1
- package/dist/{types-BIM7jwxr.d.mts → types-UGmU5sWx.d.mts} +1 -1
- package/dist/types-nP9vGUFq.d.mts +56 -0
- package/dist/ui/server-runtime.d.mts +13 -7
- package/dist/ui/server-runtime.mjs +18 -17
- package/dist/{user-2aI21yV1.mjs → user-CqZwN21P.mjs} +1 -1
- package/dist/{validate-CvQ6cvHH.d.mts → validate-BJuG-ISL.d.mts} +21 -3
- package/dist/{validate-JE-WfUQ5.mjs → validate-CK4a1sIF.mjs} +22 -2
- package/dist/version-Cg6ur4zS.mjs +6 -0
- package/dist/{widgets-Cj6ULpED.mjs → widgets-CdDvF4fV.mjs} +2 -2
- package/dist/{wordpress-slugs-hqItqJrQ.mjs → wordpress-slugs-B6Gw9q3Q.mjs} +1 -1
- package/dist/{zod-generator-C4BgFBZV.mjs → zod-generator-D1ROBNuC.mjs} +2 -2
- package/package.json +7 -8
- package/src/components/InlinePortableTextEditor.tsx +66 -0
- package/src/components/code-block-languages.ts +76 -0
- package/src/components/inline-code-block.tsx +241 -0
- package/dist/byline-DpNNSjET.mjs +0 -219
- package/dist/bylines-75_STR73.mjs +0 -114
- package/dist/chunk-ClPoSABd.mjs +0 -21
- package/dist/db-errors-DHJCB_gY.mjs +0 -23
- package/dist/index-Ct0pjZwW.d.mts +0 -835
- package/dist/placeholder-BZpCpid_.d.mts +0 -40
- package/dist/schema-U-SeFWwn.mjs +0 -8
- package/dist/version-PioVgJAl.mjs +0 -6
- /package/dist/{adapters-kZjS7plb.d.mts → adapters-OQCImOL7.d.mts} +0 -0
- /package/dist/{api-tokens-L0o9Bd7v.mjs → api-tokens-CYUoFGo7.mjs} +0 -0
- /package/dist/{challenge-store-cJam-E5R.mjs → challenge-store-CRSz-Xim.mjs} +0 -0
- /package/dist/{components-BJfa-F6n.mjs → components--pg6zBvu.mjs} +0 -0
- /package/dist/{config-XW5tMrH8.mjs → config-CVssduLe.mjs} +0 -0
- /package/dist/{context-types-BrSQNye5.mjs → context-types-DQh_XKkn.mjs} +0 -0
- /package/dist/{cron-D7FDsRu-.mjs → cron-DxCAU_Sn.mjs} +0 -0
- /package/dist/{default-5A3XVR7L.mjs → default-BHauvIdG.mjs} +0 -0
- /package/dist/{email-console-Bs1qKx59.mjs → email-console-BOVqIYpB.mjs} +0 -0
- /package/dist/{error-DLkgOP5m.mjs → error-DCSuUAZW.mjs} +0 -0
- /package/dist/{escape-r8_GbEU2.mjs → escape-BDgouFFY.mjs} +0 -0
- /package/dist/{experimental-workflows-BbZbIEZp.mjs → experimental-workflows-Dh4DUoD_.mjs} +0 -0
- /package/dist/{hash-DFFrkivP.mjs → hash-BPmX6P8I.mjs} +0 -0
- /package/dist/{manifest-schema-C6fzQoWn.mjs → manifest-schema-qh2P7RDX.mjs} +0 -0
- /package/dist/{mime-DYP4V5Ks.mjs → mime-8pAB8-77.mjs} +0 -0
- /package/dist/{mode-Bd55iLcP.mjs → mode-CpyEz8pe.mjs} +0 -0
- /package/dist/{normalize-BY_EJnd9.mjs → normalize-O-hi3a27.mjs} +0 -0
- /package/dist/{oauth-state-store-BRSUEkmx.mjs → oauth-state-store-qncPB_IU.mjs} +0 -0
- /package/dist/{oauth-user-lookup-DdcI8ZVL.mjs → oauth-user-lookup-BFjWF8wK.mjs} +0 -0
- /package/dist/{parser-egIGEco-.mjs → parser-DxfsARXL.mjs} +0 -0
- /package/dist/{passkey-config-AX4sjpQ4.mjs → passkey-config-DzHQK90v.mjs} +0 -0
- /package/dist/{patterns-CiyXeDgr.mjs → patterns-D9iDO3j8.mjs} +0 -0
- /package/dist/{placeholder-b0Ufu0La.mjs → placeholder-BDo81Is5.mjs} +0 -0
- /package/dist/{provider-loader-BdRV01gr.mjs → provider-loader-DzUxejk7.mjs} +0 -0
- /package/dist/{public-url-BL2r8dmQ.mjs → public-url-DLUM5OOv.mjs} +0 -0
- /package/dist/{redirect-Ce_6Yb6z.mjs → redirect-BjIBtDWY.mjs} +0 -0
- /package/dist/{secrets-DfeNNoLa.mjs → secrets-CN6FCpcB.mjs} +0 -0
- /package/dist/{seo-contributions-C0LXoWw3.mjs → seo-contributions-CqVvReEj.mjs} +0 -0
- /package/dist/{setup-complete-C2ztsNhJ.mjs → setup-complete-BytMc6HO.mjs} +0 -0
- /package/dist/{setup-nonce-BTKq7uBi.mjs → setup-nonce-pyGfc9hV.mjs} +0 -0
- /package/dist/{sidecar-client-lrf7ErYJ.mjs → sidecar-client-mJxwayYN.mjs} +0 -0
- /package/dist/{site-url-C18yBhtv.mjs → site-url-C-cu8Ff2.mjs} +0 -0
- /package/dist/{ssrf-KAIQS48_.mjs → ssrf-DiKqWd3N.mjs} +0 -0
- /package/dist/{tokens-CsP8Se8S.mjs → tokens-CjSgb0AC.mjs} +0 -0
- /package/dist/{transport-nNEGdHkI.d.mts → transport-DidKKxvW.d.mts} +0 -0
- /package/dist/{transport-B7kO-4ee.mjs → transport-LSdZVXHF.mjs} +0 -0
- /package/dist/{trusted-proxy-Bbm6PLR6.mjs → trusted-proxy-BgIIcbsN.mjs} +0 -0
- /package/dist/{types-CNNQ8l0v.mjs → types-Cg276-3z.mjs} +0 -0
- /package/dist/{types-BYjPylrZ.d.mts → types-DZpT-PnG.d.mts} +0 -0
- /package/dist/{types-BgE6gMFI.d.mts → types-Dryvv7LH.d.mts} +0 -0
- /package/dist/{types-BBETcziA.d.mts → types-GaCtZ1k9.d.mts} +0 -0
- /package/dist/{url-BzhfYtRn.mjs → url-w7Mp5qAD.mjs} +0 -0
- /package/dist/{utils-FEbQMgB5.mjs → utils-wv-zvC-Y.mjs} +0 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
import { t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
|
|
2
|
+
import { l as listTablesLike } from "./dialect-helpers-fk43GbDb.mjs";
|
|
3
|
+
import { n as decodeCursor, r as encodeCursor, t as DinewayValidationError } from "./types-Ck7-WoUD.mjs";
|
|
4
|
+
import { t as withTransaction } from "./transaction-D0FOsb3X.mjs";
|
|
5
|
+
import { getRequestContext } from "./request-context.mjs";
|
|
6
|
+
import { i as setRequestCacheEntry, n as peekRequestCache, r as requestCached, t as clearRequestCacheEntry } from "./request-cache-w5cj5itT.mjs";
|
|
7
|
+
import { n as BylineSchemaRegistry } from "./byline-registry-CL8BxPPp.mjs";
|
|
8
|
+
import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-DgEw12Bc.mjs";
|
|
9
|
+
import { sql } from "kysely";
|
|
10
|
+
import { ulid } from "ulidx";
|
|
11
|
+
|
|
12
|
+
//#region src/bylines/field-defs-cache.ts
|
|
13
|
+
const HOLDER_KEY = Symbol.for("dineway:byline-field-defs");
|
|
14
|
+
const REQUEST_CACHE_KEY_VERSION = "byline-fields-version";
|
|
15
|
+
const REQUEST_CACHE_KEY_DEFS_PREFIX = "byline-field-defs:";
|
|
16
|
+
function getHolder() {
|
|
17
|
+
const existing = Reflect.get(globalThis, HOLDER_KEY);
|
|
18
|
+
if (isFieldDefsHolder(existing)) return existing;
|
|
19
|
+
const holder = {
|
|
20
|
+
cached: null,
|
|
21
|
+
cachedVersion: -1
|
|
22
|
+
};
|
|
23
|
+
Reflect.set(globalThis, HOLDER_KEY, holder);
|
|
24
|
+
return holder;
|
|
25
|
+
}
|
|
26
|
+
function isFieldDefsHolder(value) {
|
|
27
|
+
if (value && typeof value === "object" && "cached" in value && "cachedVersion" in value) return (value.cached === null || value.cached instanceof Promise) && typeof value.cachedVersion === "number";
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const holder = getHolder();
|
|
31
|
+
async function getBylineFieldsVersion(db) {
|
|
32
|
+
return requestCached(REQUEST_CACHE_KEY_VERSION, () => new BylineSchemaRegistry(db).getVersion());
|
|
33
|
+
}
|
|
34
|
+
async function getBylineFieldDefs(db) {
|
|
35
|
+
const hasDbOverride = !!getRequestContext()?.db;
|
|
36
|
+
const version = await getBylineFieldsVersion(db);
|
|
37
|
+
const dirty = version % 2 !== 0;
|
|
38
|
+
return requestCached(`${REQUEST_CACHE_KEY_DEFS_PREFIX}${version}`, async () => {
|
|
39
|
+
if (hasDbOverride || dirty) return new BylineSchemaRegistry(db).listFields();
|
|
40
|
+
if (!dirty && holder.cached !== null && holder.cachedVersion === version) return holder.cached;
|
|
41
|
+
const defs = new BylineSchemaRegistry(db).listFields();
|
|
42
|
+
if (!dirty) {
|
|
43
|
+
holder.cached = defs;
|
|
44
|
+
holder.cachedVersion = version;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return await defs;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (holder.cached === defs) {
|
|
50
|
+
holder.cached = null;
|
|
51
|
+
holder.cachedVersion = -1;
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/database/repositories/byline.ts
|
|
60
|
+
function rowToByline(row) {
|
|
61
|
+
return {
|
|
62
|
+
id: row.id,
|
|
63
|
+
slug: row.slug,
|
|
64
|
+
displayName: row.display_name,
|
|
65
|
+
bio: row.bio,
|
|
66
|
+
avatarMediaId: row.avatar_media_id,
|
|
67
|
+
avatarStorageKey: row.avatar_storage_key ?? null,
|
|
68
|
+
avatarAlt: row.avatar_alt ?? null,
|
|
69
|
+
websiteUrl: row.website_url,
|
|
70
|
+
userId: row.user_id,
|
|
71
|
+
isGuest: row.is_guest === 1,
|
|
72
|
+
createdAt: row.created_at,
|
|
73
|
+
updatedAt: row.updated_at,
|
|
74
|
+
locale: row.locale,
|
|
75
|
+
translationGroup: row.translation_group,
|
|
76
|
+
customFields: {}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function assignCustomFieldValue(summary, field, stored) {
|
|
80
|
+
const target = summary.customFields ?? {};
|
|
81
|
+
if (stored === null) target[field.slug] = null;
|
|
82
|
+
else {
|
|
83
|
+
let parsed;
|
|
84
|
+
try {
|
|
85
|
+
parsed = JSON.parse(stored);
|
|
86
|
+
} catch {
|
|
87
|
+
console.warn(`[BylineRepository] dropping malformed JSON for byline=${summary.id} field=${field.slug}`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (!isCustomFieldValue(parsed)) {
|
|
91
|
+
console.warn(`[BylineRepository] dropping invalid JSON value for byline=${summary.id} field=${field.slug}`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
target[field.slug] = parsed;
|
|
95
|
+
}
|
|
96
|
+
summary.customFields = target;
|
|
97
|
+
}
|
|
98
|
+
function isCustomFieldValue(value) {
|
|
99
|
+
return value === null || typeof value === "string" || typeof value === "boolean";
|
|
100
|
+
}
|
|
101
|
+
function coerceFieldValue(field, raw) {
|
|
102
|
+
if (raw === null) return null;
|
|
103
|
+
switch (field.type) {
|
|
104
|
+
case "string":
|
|
105
|
+
case "text":
|
|
106
|
+
if (typeof raw !== "string") throw new DinewayValidationError(`Byline field "${field.slug}" expects a string value`, {
|
|
107
|
+
slug: field.slug,
|
|
108
|
+
type: field.type,
|
|
109
|
+
received: typeof raw
|
|
110
|
+
});
|
|
111
|
+
return raw;
|
|
112
|
+
case "url": {
|
|
113
|
+
if (typeof raw !== "string") throw new DinewayValidationError(`Byline field "${field.slug}" expects a string value`, {
|
|
114
|
+
slug: field.slug,
|
|
115
|
+
type: field.type,
|
|
116
|
+
received: typeof raw
|
|
117
|
+
});
|
|
118
|
+
if (raw === "") return null;
|
|
119
|
+
let parsed;
|
|
120
|
+
try {
|
|
121
|
+
parsed = new URL(raw);
|
|
122
|
+
} catch {
|
|
123
|
+
throw new DinewayValidationError(`Byline field "${field.slug}" expects a valid URL`, {
|
|
124
|
+
slug: field.slug,
|
|
125
|
+
type: field.type,
|
|
126
|
+
received: raw
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new DinewayValidationError(`Byline field "${field.slug}" must use http or https scheme`, {
|
|
130
|
+
slug: field.slug,
|
|
131
|
+
type: field.type,
|
|
132
|
+
received: raw,
|
|
133
|
+
protocol: parsed.protocol
|
|
134
|
+
});
|
|
135
|
+
return raw;
|
|
136
|
+
}
|
|
137
|
+
case "boolean":
|
|
138
|
+
if (typeof raw !== "boolean") throw new DinewayValidationError(`Byline field "${field.slug}" expects a boolean value`, {
|
|
139
|
+
slug: field.slug,
|
|
140
|
+
type: field.type,
|
|
141
|
+
received: typeof raw
|
|
142
|
+
});
|
|
143
|
+
return raw;
|
|
144
|
+
case "select": {
|
|
145
|
+
if (typeof raw !== "string") throw new DinewayValidationError(`Byline field "${field.slug}" expects a string value`, {
|
|
146
|
+
slug: field.slug,
|
|
147
|
+
type: field.type,
|
|
148
|
+
received: typeof raw
|
|
149
|
+
});
|
|
150
|
+
const options = field.validation?.options ?? [];
|
|
151
|
+
if (!options.includes(raw)) throw new DinewayValidationError(`Byline field "${field.slug}" value "${raw}" is not one of the registered choices`, {
|
|
152
|
+
slug: field.slug,
|
|
153
|
+
value: raw,
|
|
154
|
+
options
|
|
155
|
+
});
|
|
156
|
+
return raw;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
var BylineRepository = class {
|
|
161
|
+
constructor(db) {
|
|
162
|
+
this.db = db;
|
|
163
|
+
}
|
|
164
|
+
async withCustomFields(rows) {
|
|
165
|
+
const summaries = rows.map(rowToByline);
|
|
166
|
+
await this.hydrateBylineCustomFields(summaries);
|
|
167
|
+
return summaries;
|
|
168
|
+
}
|
|
169
|
+
async hydrateBylineCustomFields(summaries) {
|
|
170
|
+
for (const summary of summaries) summary.customFields = {};
|
|
171
|
+
await this.applyCustomFieldsTo(summaries);
|
|
172
|
+
}
|
|
173
|
+
async applyCustomFieldsTo(summaries) {
|
|
174
|
+
if (summaries.length === 0) return;
|
|
175
|
+
const defs = await getBylineFieldDefs(this.db);
|
|
176
|
+
if (defs.length === 0) return;
|
|
177
|
+
const fieldById = new Map(defs.map((field) => [field.id, field]));
|
|
178
|
+
const translatableByByline = /* @__PURE__ */ new Map();
|
|
179
|
+
const bylineIds = [...new Set(summaries.map((summary) => summary.id))];
|
|
180
|
+
for (const chunk of chunks(bylineIds, SQL_BATCH_SIZE)) {
|
|
181
|
+
const rows = await this.db.selectFrom("_dineway_byline_field_values").select([
|
|
182
|
+
"byline_id",
|
|
183
|
+
"field_id",
|
|
184
|
+
"value"
|
|
185
|
+
]).where("byline_id", "in", chunk).execute();
|
|
186
|
+
for (const row of rows) {
|
|
187
|
+
let fieldMap = translatableByByline.get(row.byline_id);
|
|
188
|
+
if (!fieldMap) {
|
|
189
|
+
fieldMap = /* @__PURE__ */ new Map();
|
|
190
|
+
translatableByByline.set(row.byline_id, fieldMap);
|
|
191
|
+
}
|
|
192
|
+
fieldMap.set(row.field_id, row.value);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const groups = [...new Set(summaries.map((summary) => summary.translationGroup).filter((group) => typeof group === "string" && group.length > 0))];
|
|
196
|
+
const groupByGroup = await this.loadGroupValuesByIds(groups);
|
|
197
|
+
for (const summary of summaries) {
|
|
198
|
+
const translatableValues = translatableByByline.get(summary.id);
|
|
199
|
+
if (translatableValues) for (const [fieldId, value] of translatableValues) {
|
|
200
|
+
const field = fieldById.get(fieldId);
|
|
201
|
+
if (!field || !field.translatable) continue;
|
|
202
|
+
assignCustomFieldValue(summary, field, value);
|
|
203
|
+
}
|
|
204
|
+
if (!summary.translationGroup) continue;
|
|
205
|
+
const groupValues = groupByGroup.get(summary.translationGroup);
|
|
206
|
+
if (!groupValues) continue;
|
|
207
|
+
for (const [fieldId, value] of groupValues) {
|
|
208
|
+
const field = fieldById.get(fieldId);
|
|
209
|
+
if (!field || field.translatable) continue;
|
|
210
|
+
assignCustomFieldValue(summary, field, value);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async loadGroupValuesByIds(groups) {
|
|
215
|
+
const result = /* @__PURE__ */ new Map();
|
|
216
|
+
if (groups.length === 0) return result;
|
|
217
|
+
const missing = [];
|
|
218
|
+
for (const group of groups) {
|
|
219
|
+
const cached = peekRequestCache(`byline-field-group-values:${group}`);
|
|
220
|
+
if (cached) result.set(group, await cached);
|
|
221
|
+
else missing.push(group);
|
|
222
|
+
}
|
|
223
|
+
if (missing.length === 0) return result;
|
|
224
|
+
const fetched = /* @__PURE__ */ new Map();
|
|
225
|
+
for (const group of missing) fetched.set(group, /* @__PURE__ */ new Map());
|
|
226
|
+
for (const chunk of chunks(missing, SQL_BATCH_SIZE)) {
|
|
227
|
+
const rows = await this.db.selectFrom("_dineway_byline_field_group_values").select([
|
|
228
|
+
"translation_group",
|
|
229
|
+
"field_id",
|
|
230
|
+
"value"
|
|
231
|
+
]).where("translation_group", "in", chunk).execute();
|
|
232
|
+
for (const row of rows) fetched.get(row.translation_group)?.set(row.field_id, row.value);
|
|
233
|
+
}
|
|
234
|
+
for (const group of missing) {
|
|
235
|
+
const values = fetched.get(group);
|
|
236
|
+
if (!values) continue;
|
|
237
|
+
setRequestCacheEntry(`byline-field-group-values:${group}`, values);
|
|
238
|
+
result.set(group, values);
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
async resolveCustomFieldWrites(customFields) {
|
|
243
|
+
if (!customFields || Object.keys(customFields).length === 0) return [];
|
|
244
|
+
const defs = await getBylineFieldDefs(this.db);
|
|
245
|
+
const bySlug = new Map(defs.map((field) => [field.slug, field]));
|
|
246
|
+
const writes = [];
|
|
247
|
+
for (const [slug, raw] of Object.entries(customFields)) {
|
|
248
|
+
const field = bySlug.get(slug);
|
|
249
|
+
if (!field) throw new DinewayValidationError(`Unknown byline custom field "${slug}"`, {
|
|
250
|
+
slug,
|
|
251
|
+
registered: defs.map((item) => item.slug)
|
|
252
|
+
});
|
|
253
|
+
writes.push({
|
|
254
|
+
field,
|
|
255
|
+
value: coerceFieldValue(field, raw)
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
return writes;
|
|
259
|
+
}
|
|
260
|
+
async writeCustomFields(trx, bylineId, translationGroup, writes, now) {
|
|
261
|
+
let touchedGroupShared = false;
|
|
262
|
+
for (const { field, value } of writes) {
|
|
263
|
+
if (!field.translatable) touchedGroupShared = true;
|
|
264
|
+
if (field.translatable) {
|
|
265
|
+
if (value === null) {
|
|
266
|
+
await trx.deleteFrom("_dineway_byline_field_values").where("byline_id", "=", bylineId).where("field_id", "=", field.id).execute();
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const encoded = JSON.stringify(value);
|
|
270
|
+
await trx.insertInto("_dineway_byline_field_values").values({
|
|
271
|
+
byline_id: bylineId,
|
|
272
|
+
field_id: field.id,
|
|
273
|
+
value: encoded,
|
|
274
|
+
created_at: now,
|
|
275
|
+
updated_at: now
|
|
276
|
+
}).onConflict((oc) => oc.columns(["byline_id", "field_id"]).doUpdateSet({
|
|
277
|
+
value: encoded,
|
|
278
|
+
updated_at: now
|
|
279
|
+
})).execute();
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (value === null) {
|
|
283
|
+
await trx.deleteFrom("_dineway_byline_field_group_values").where("translation_group", "=", translationGroup).where("field_id", "=", field.id).execute();
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const encoded = JSON.stringify(value);
|
|
287
|
+
await trx.insertInto("_dineway_byline_field_group_values").values({
|
|
288
|
+
translation_group: translationGroup,
|
|
289
|
+
field_id: field.id,
|
|
290
|
+
value: encoded,
|
|
291
|
+
created_at: now,
|
|
292
|
+
updated_at: now
|
|
293
|
+
}).onConflict((oc) => oc.columns(["translation_group", "field_id"]).doUpdateSet({
|
|
294
|
+
value: encoded,
|
|
295
|
+
updated_at: now
|
|
296
|
+
})).execute();
|
|
297
|
+
}
|
|
298
|
+
return touchedGroupShared;
|
|
299
|
+
}
|
|
300
|
+
async findById(id) {
|
|
301
|
+
const row = await this.db.selectFrom("_dineway_bylines").selectAll().where("id", "=", id).executeTakeFirst();
|
|
302
|
+
if (!row) return null;
|
|
303
|
+
return (await this.withCustomFields([row]))[0] ?? null;
|
|
304
|
+
}
|
|
305
|
+
async findBySlug(slug, options) {
|
|
306
|
+
let query = this.db.selectFrom("_dineway_bylines").selectAll().where("slug", "=", slug);
|
|
307
|
+
if (options?.locale !== void 0) query = query.where("locale", "=", options.locale);
|
|
308
|
+
const row = await query.orderBy("locale", "asc").executeTakeFirst();
|
|
309
|
+
if (!row) return null;
|
|
310
|
+
return (await this.withCustomFields([row]))[0] ?? null;
|
|
311
|
+
}
|
|
312
|
+
async findByUserId(userId, options) {
|
|
313
|
+
let query = this.db.selectFrom("_dineway_bylines").selectAll().where("user_id", "=", userId);
|
|
314
|
+
if (options?.locale !== void 0) query = query.where("locale", "=", options.locale);
|
|
315
|
+
const row = await query.orderBy("locale", "asc").executeTakeFirst();
|
|
316
|
+
if (!row) return null;
|
|
317
|
+
return (await this.withCustomFields([row]))[0] ?? null;
|
|
318
|
+
}
|
|
319
|
+
async findMany(options) {
|
|
320
|
+
const limit = Math.min(Math.max(options?.limit ?? 50, 1), 100);
|
|
321
|
+
let query = this.db.selectFrom("_dineway_bylines").selectAll().orderBy("created_at", "desc").orderBy("id", "desc").limit(limit + 1);
|
|
322
|
+
if (options?.search) {
|
|
323
|
+
const term = `%${options.search.replaceAll("\\", "\\\\").replaceAll("%", "\\%").replaceAll("_", "\\_")}%`;
|
|
324
|
+
query = query.where((eb) => eb.or([eb("display_name", "like", term), eb("slug", "like", term)]));
|
|
325
|
+
}
|
|
326
|
+
if (options?.isGuest !== void 0) query = query.where("is_guest", "=", options.isGuest ? 1 : 0);
|
|
327
|
+
if (options?.userId !== void 0) query = query.where("user_id", "=", options.userId);
|
|
328
|
+
if (options?.locale !== void 0) query = query.where("locale", "=", options.locale);
|
|
329
|
+
if (options?.cursor) {
|
|
330
|
+
const decoded = decodeCursor(options.cursor);
|
|
331
|
+
if (decoded) query = query.where((eb) => eb.or([eb("created_at", "<", decoded.orderValue), eb.and([eb("created_at", "=", decoded.orderValue), eb("id", "<", decoded.id)])]));
|
|
332
|
+
}
|
|
333
|
+
const rows = await query.execute();
|
|
334
|
+
const items = await this.withCustomFields(rows.slice(0, limit));
|
|
335
|
+
const result = { items };
|
|
336
|
+
if (rows.length > limit) {
|
|
337
|
+
const last = items.at(-1);
|
|
338
|
+
if (last) result.nextCursor = encodeCursor(last.createdAt, last.id);
|
|
339
|
+
}
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
async listTranslations(id) {
|
|
343
|
+
const anchor = await this.findById(id);
|
|
344
|
+
if (!anchor) return [];
|
|
345
|
+
const group = anchor.translationGroup ?? anchor.id;
|
|
346
|
+
return this.findByTranslationGroup(group);
|
|
347
|
+
}
|
|
348
|
+
async findByTranslationGroup(translationGroup) {
|
|
349
|
+
const rows = await this.db.selectFrom("_dineway_bylines").selectAll().where("translation_group", "=", translationGroup).orderBy("locale", "asc").execute();
|
|
350
|
+
return this.withCustomFields(rows);
|
|
351
|
+
}
|
|
352
|
+
async create(input) {
|
|
353
|
+
const id = ulid();
|
|
354
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
355
|
+
const customFieldWrites = await this.resolveCustomFieldWrites(input.customFields);
|
|
356
|
+
let translationGroup = id;
|
|
357
|
+
if (input.translationOf) {
|
|
358
|
+
const source = await this.findById(input.translationOf);
|
|
359
|
+
if (!source) throw new Error("Source byline for translation not found");
|
|
360
|
+
translationGroup = source.translationGroup ?? source.id;
|
|
361
|
+
}
|
|
362
|
+
let touchedGroupShared = false;
|
|
363
|
+
await withTransaction(this.db, async (trx) => {
|
|
364
|
+
await trx.insertInto("_dineway_bylines").values({
|
|
365
|
+
id,
|
|
366
|
+
slug: input.slug,
|
|
367
|
+
display_name: input.displayName,
|
|
368
|
+
bio: input.bio ?? null,
|
|
369
|
+
avatar_media_id: input.avatarMediaId ?? null,
|
|
370
|
+
website_url: input.websiteUrl ?? null,
|
|
371
|
+
user_id: input.userId ?? null,
|
|
372
|
+
is_guest: input.isGuest ? 1 : 0,
|
|
373
|
+
created_at: now,
|
|
374
|
+
updated_at: now,
|
|
375
|
+
...input.locale !== void 0 ? { locale: input.locale } : {},
|
|
376
|
+
translation_group: translationGroup
|
|
377
|
+
}).execute();
|
|
378
|
+
touchedGroupShared = await this.writeCustomFields(trx, id, translationGroup, customFieldWrites, now);
|
|
379
|
+
});
|
|
380
|
+
if (touchedGroupShared) clearRequestCacheEntry(`byline-field-group-values:${translationGroup}`);
|
|
381
|
+
const byline = await this.findById(id);
|
|
382
|
+
if (!byline) throw new Error("Failed to create byline");
|
|
383
|
+
return byline;
|
|
384
|
+
}
|
|
385
|
+
async update(id, input) {
|
|
386
|
+
const existing = await this.findById(id);
|
|
387
|
+
if (!existing) return null;
|
|
388
|
+
const customFieldWrites = await this.resolveCustomFieldWrites(input.customFields);
|
|
389
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
390
|
+
const updates = { updated_at: now };
|
|
391
|
+
if (input.slug !== void 0) updates.slug = input.slug;
|
|
392
|
+
if (input.displayName !== void 0) updates.display_name = input.displayName;
|
|
393
|
+
if (input.bio !== void 0) updates.bio = input.bio;
|
|
394
|
+
if (input.avatarMediaId !== void 0) updates.avatar_media_id = input.avatarMediaId;
|
|
395
|
+
if (input.websiteUrl !== void 0) updates.website_url = input.websiteUrl;
|
|
396
|
+
if (input.userId !== void 0) updates.user_id = input.userId;
|
|
397
|
+
if (input.isGuest !== void 0) updates.is_guest = input.isGuest ? 1 : 0;
|
|
398
|
+
const group = existing.translationGroup ?? existing.id;
|
|
399
|
+
let touchedGroupShared = false;
|
|
400
|
+
await withTransaction(this.db, async (trx) => {
|
|
401
|
+
await trx.updateTable("_dineway_bylines").set(updates).where("id", "=", id).execute();
|
|
402
|
+
touchedGroupShared = await this.writeCustomFields(trx, id, group, customFieldWrites, now);
|
|
403
|
+
});
|
|
404
|
+
if (touchedGroupShared) clearRequestCacheEntry(`byline-field-group-values:${group}`);
|
|
405
|
+
return await this.findById(id);
|
|
406
|
+
}
|
|
407
|
+
async delete(id) {
|
|
408
|
+
const existing = await this.findById(id);
|
|
409
|
+
if (!existing) return false;
|
|
410
|
+
const group = existing.translationGroup ?? existing.id;
|
|
411
|
+
await withTransaction(this.db, async (trx) => {
|
|
412
|
+
await trx.deleteFrom("_dineway_byline_field_values").where("byline_id", "=", id).execute();
|
|
413
|
+
await trx.deleteFrom("_dineway_bylines").where("id", "=", id).execute();
|
|
414
|
+
const remaining = await trx.selectFrom("_dineway_bylines").select(({ fn }) => [fn.count("id").as("count")]).where("translation_group", "=", group).executeTakeFirst();
|
|
415
|
+
if (Number(remaining?.count ?? 0) > 0) return;
|
|
416
|
+
await trx.deleteFrom("_dineway_content_bylines").where("byline_id", "=", group).execute();
|
|
417
|
+
await trx.deleteFrom("_dineway_byline_field_group_values").where("translation_group", "=", group).execute();
|
|
418
|
+
const tableNames = await listTablesLike(trx, "ec_%");
|
|
419
|
+
for (const tableName of tableNames) {
|
|
420
|
+
validateIdentifier(tableName, "content table");
|
|
421
|
+
await sql`
|
|
422
|
+
UPDATE ${sql.ref(tableName)}
|
|
423
|
+
SET primary_byline_id = NULL
|
|
424
|
+
WHERE primary_byline_id = ${group}
|
|
425
|
+
`.execute(trx);
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
clearRequestCacheEntry(`byline-field-group-values:${group}`);
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
async getContentBylines(collectionSlug, contentId, options) {
|
|
432
|
+
let query = this.db.selectFrom("_dineway_content_bylines as cb").innerJoin("_dineway_bylines as b", "b.translation_group", "cb.byline_id").leftJoin("media as m", "m.id", "b.avatar_media_id").select([
|
|
433
|
+
"cb.sort_order as sort_order",
|
|
434
|
+
"cb.role_label as role_label",
|
|
435
|
+
"b.id as id",
|
|
436
|
+
"b.slug as slug",
|
|
437
|
+
"b.display_name as display_name",
|
|
438
|
+
"b.bio as bio",
|
|
439
|
+
"b.avatar_media_id as avatar_media_id",
|
|
440
|
+
"m.storage_key as avatar_storage_key",
|
|
441
|
+
"m.alt as avatar_alt",
|
|
442
|
+
"b.website_url as website_url",
|
|
443
|
+
"b.user_id as user_id",
|
|
444
|
+
"b.is_guest as is_guest",
|
|
445
|
+
"b.created_at as created_at",
|
|
446
|
+
"b.updated_at as updated_at",
|
|
447
|
+
"b.locale as locale",
|
|
448
|
+
"b.translation_group as translation_group"
|
|
449
|
+
]).where("cb.collection_slug", "=", collectionSlug).where("cb.content_id", "=", contentId).orderBy("cb.sort_order", "asc");
|
|
450
|
+
if (options?.locale !== void 0) query = query.where("b.locale", "=", options.locale);
|
|
451
|
+
const rows = await query.execute();
|
|
452
|
+
const bylines = await this.withCustomFields(rows);
|
|
453
|
+
return rows.map((row, index) => ({
|
|
454
|
+
byline: bylines[index] ?? rowToByline(row),
|
|
455
|
+
sortOrder: row.sort_order,
|
|
456
|
+
roleLabel: row.role_label
|
|
457
|
+
}));
|
|
458
|
+
}
|
|
459
|
+
async hasContentBylines(collectionSlug, contentId) {
|
|
460
|
+
return await this.db.selectFrom("_dineway_content_bylines").select("id").where("collection_slug", "=", collectionSlug).where("content_id", "=", contentId).limit(1).executeTakeFirst() !== void 0;
|
|
461
|
+
}
|
|
462
|
+
async hasContentBylinesMany(collectionSlug, contentIds) {
|
|
463
|
+
const result = /* @__PURE__ */ new Set();
|
|
464
|
+
if (contentIds.length === 0) return result;
|
|
465
|
+
const uniqueContentIds = [...new Set(contentIds)];
|
|
466
|
+
for (const chunk of chunks(uniqueContentIds, SQL_BATCH_SIZE)) {
|
|
467
|
+
const rows = await this.db.selectFrom("_dineway_content_bylines").select("content_id").distinct().where("collection_slug", "=", collectionSlug).where("content_id", "in", chunk).execute();
|
|
468
|
+
for (const row of rows) result.add(row.content_id);
|
|
469
|
+
}
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Batch-fetch byline credits for multiple content items in a single query.
|
|
474
|
+
* Returns a Map keyed by contentId.
|
|
475
|
+
*/
|
|
476
|
+
async getContentBylinesMany(collectionSlug, contentIds, options) {
|
|
477
|
+
const result = /* @__PURE__ */ new Map();
|
|
478
|
+
if (contentIds.length === 0) return result;
|
|
479
|
+
const uniqueContentIds = [...new Set(contentIds)];
|
|
480
|
+
for (const chunk of chunks(uniqueContentIds, SQL_BATCH_SIZE)) {
|
|
481
|
+
let query = this.db.selectFrom("_dineway_content_bylines as cb").innerJoin("_dineway_bylines as b", "b.translation_group", "cb.byline_id").leftJoin("media as m", "m.id", "b.avatar_media_id").select([
|
|
482
|
+
"cb.content_id as content_id",
|
|
483
|
+
"cb.sort_order as sort_order",
|
|
484
|
+
"cb.role_label as role_label",
|
|
485
|
+
"b.id as id",
|
|
486
|
+
"b.slug as slug",
|
|
487
|
+
"b.display_name as display_name",
|
|
488
|
+
"b.bio as bio",
|
|
489
|
+
"b.avatar_media_id as avatar_media_id",
|
|
490
|
+
"m.storage_key as avatar_storage_key",
|
|
491
|
+
"m.alt as avatar_alt",
|
|
492
|
+
"b.website_url as website_url",
|
|
493
|
+
"b.user_id as user_id",
|
|
494
|
+
"b.is_guest as is_guest",
|
|
495
|
+
"b.created_at as created_at",
|
|
496
|
+
"b.updated_at as updated_at",
|
|
497
|
+
"b.locale as locale",
|
|
498
|
+
"b.translation_group as translation_group"
|
|
499
|
+
]).where("cb.collection_slug", "=", collectionSlug).where("cb.content_id", "in", chunk).orderBy("cb.sort_order", "asc");
|
|
500
|
+
if (options?.locale !== void 0) query = query.where("b.locale", "=", options.locale);
|
|
501
|
+
const rows = await query.execute();
|
|
502
|
+
const bylines = options?.skipHydration ? rows.map(rowToByline) : await this.withCustomFields(rows);
|
|
503
|
+
for (let index = 0; index < rows.length; index++) {
|
|
504
|
+
const row = rows[index];
|
|
505
|
+
if (!row) continue;
|
|
506
|
+
const contentId = row.content_id;
|
|
507
|
+
const credit = {
|
|
508
|
+
byline: bylines[index] ?? rowToByline(row),
|
|
509
|
+
sortOrder: row.sort_order,
|
|
510
|
+
roleLabel: row.role_label
|
|
511
|
+
};
|
|
512
|
+
const existing = result.get(contentId);
|
|
513
|
+
if (existing) existing.push(credit);
|
|
514
|
+
else result.set(contentId, [credit]);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return result;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Batch-fetch byline profiles linked to user IDs in a single query.
|
|
521
|
+
* Returns a Map keyed by userId.
|
|
522
|
+
*/
|
|
523
|
+
async findByUserIds(userIds, options) {
|
|
524
|
+
const result = /* @__PURE__ */ new Map();
|
|
525
|
+
if (userIds.length === 0) return result;
|
|
526
|
+
for (const chunk of chunks(userIds, SQL_BATCH_SIZE)) {
|
|
527
|
+
let query = this.db.selectFrom("_dineway_bylines as b").leftJoin("media as m", "m.id", "b.avatar_media_id").select([
|
|
528
|
+
"b.id as id",
|
|
529
|
+
"b.slug as slug",
|
|
530
|
+
"b.display_name as display_name",
|
|
531
|
+
"b.bio as bio",
|
|
532
|
+
"b.avatar_media_id as avatar_media_id",
|
|
533
|
+
"m.storage_key as avatar_storage_key",
|
|
534
|
+
"m.alt as avatar_alt",
|
|
535
|
+
"b.website_url as website_url",
|
|
536
|
+
"b.user_id as user_id",
|
|
537
|
+
"b.is_guest as is_guest",
|
|
538
|
+
"b.created_at as created_at",
|
|
539
|
+
"b.updated_at as updated_at",
|
|
540
|
+
"b.locale as locale",
|
|
541
|
+
"b.translation_group as translation_group"
|
|
542
|
+
]).where("b.user_id", "in", chunk);
|
|
543
|
+
if (options?.locale !== void 0) query = query.where("b.locale", "=", options.locale);
|
|
544
|
+
const rows = await query.orderBy("b.locale", "asc").execute();
|
|
545
|
+
const bylines = options?.skipHydration ? rows.map(rowToByline) : await this.withCustomFields(rows);
|
|
546
|
+
for (let index = 0; index < rows.length; index++) {
|
|
547
|
+
const row = rows[index];
|
|
548
|
+
if (!row) continue;
|
|
549
|
+
if (row.user_id) result.set(row.user_id, bylines[index] ?? rowToByline(row));
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return result;
|
|
553
|
+
}
|
|
554
|
+
async copyContentBylines(collectionSlug, sourceContentId, targetContentId) {
|
|
555
|
+
validateIdentifier(collectionSlug, "collection slug");
|
|
556
|
+
const tableName = `ec_${collectionSlug}`;
|
|
557
|
+
validateIdentifier(tableName, "content table");
|
|
558
|
+
if (await this.db.selectFrom("_dineway_content_bylines").select("id").where("collection_slug", "=", collectionSlug).where("content_id", "=", targetContentId).executeTakeFirst()) return;
|
|
559
|
+
const sourceRows = await this.db.selectFrom("_dineway_content_bylines").select([
|
|
560
|
+
"byline_id",
|
|
561
|
+
"sort_order",
|
|
562
|
+
"role_label"
|
|
563
|
+
]).where("collection_slug", "=", collectionSlug).where("content_id", "=", sourceContentId).orderBy("sort_order", "asc").execute();
|
|
564
|
+
if (sourceRows.length === 0) return;
|
|
565
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
566
|
+
await this.db.insertInto("_dineway_content_bylines").values(sourceRows.map((row) => ({
|
|
567
|
+
id: ulid(),
|
|
568
|
+
collection_slug: collectionSlug,
|
|
569
|
+
content_id: targetContentId,
|
|
570
|
+
byline_id: row.byline_id,
|
|
571
|
+
sort_order: row.sort_order,
|
|
572
|
+
role_label: row.role_label,
|
|
573
|
+
created_at: now
|
|
574
|
+
}))).execute();
|
|
575
|
+
await sql`
|
|
576
|
+
UPDATE ${sql.ref(tableName)}
|
|
577
|
+
SET primary_byline_id = ${sourceRows[0]?.byline_id ?? null}
|
|
578
|
+
WHERE id = ${targetContentId}
|
|
579
|
+
`.execute(this.db);
|
|
580
|
+
}
|
|
581
|
+
async setContentBylines(collectionSlug, contentId, inputBylines) {
|
|
582
|
+
validateIdentifier(collectionSlug, "collection slug");
|
|
583
|
+
const tableName = `ec_${collectionSlug}`;
|
|
584
|
+
validateIdentifier(tableName, "content table");
|
|
585
|
+
const idToGroup = /* @__PURE__ */ new Map();
|
|
586
|
+
if (inputBylines.length > 0) {
|
|
587
|
+
const ids = [...new Set(inputBylines.map((item) => item.bylineId))];
|
|
588
|
+
const rows = await this.db.selectFrom("_dineway_bylines").select(["id", "translation_group"]).where("id", "in", ids).execute();
|
|
589
|
+
if (rows.length !== ids.length) throw new Error("One or more byline IDs do not exist");
|
|
590
|
+
for (const row of rows) idToGroup.set(row.id, row.translation_group ?? row.id);
|
|
591
|
+
}
|
|
592
|
+
const seenGroups = /* @__PURE__ */ new Set();
|
|
593
|
+
const bylines = [];
|
|
594
|
+
for (const item of inputBylines) {
|
|
595
|
+
const group = idToGroup.get(item.bylineId);
|
|
596
|
+
if (!group) throw new Error(`Missing translation group for byline ${item.bylineId}`);
|
|
597
|
+
if (seenGroups.has(group)) continue;
|
|
598
|
+
seenGroups.add(group);
|
|
599
|
+
bylines.push({
|
|
600
|
+
...item,
|
|
601
|
+
group
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
await this.db.deleteFrom("_dineway_content_bylines").where("collection_slug", "=", collectionSlug).where("content_id", "=", contentId).execute();
|
|
605
|
+
for (let i = 0; i < bylines.length; i++) {
|
|
606
|
+
const item = bylines[i];
|
|
607
|
+
if (!item) continue;
|
|
608
|
+
await this.db.insertInto("_dineway_content_bylines").values({
|
|
609
|
+
id: ulid(),
|
|
610
|
+
collection_slug: collectionSlug,
|
|
611
|
+
content_id: contentId,
|
|
612
|
+
byline_id: item.group,
|
|
613
|
+
sort_order: i,
|
|
614
|
+
role_label: item.roleLabel ?? null,
|
|
615
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
616
|
+
}).execute();
|
|
617
|
+
}
|
|
618
|
+
await sql`
|
|
619
|
+
UPDATE ${sql.ref(tableName)}
|
|
620
|
+
SET primary_byline_id = ${bylines[0]?.group ?? null}
|
|
621
|
+
WHERE id = ${contentId}
|
|
622
|
+
`.execute(this.db);
|
|
623
|
+
return await this.getContentBylines(collectionSlug, contentId);
|
|
624
|
+
}
|
|
625
|
+
};
|
|
626
|
+
|
|
627
|
+
//#endregion
|
|
628
|
+
export { BylineRepository as t };
|